我想做这样的事情:
// NOTE: This doesn't compile
struct A { v: u32 }
async fn foo<
C: for<'a> FnOnce(&'a A) -> Pin<Box<dyn Future<Output = ()> + 'a>>
>(c: C) {
c(&A {
v: 8,
}).await
}
#[tokio::main]
async fn main() {
let t = 9;
foo(|a| async {
println!("{} {}", t, a.v);
}.boxed_local()).await;
}
Run Code Online (Sandbox Code Playgroud)
函数foo采用“异步闭包”,为其提供引用,并且“异步闭包”也允许通过引用捕获事物。上面的编译状态t的生命周期需要是“静态的”,这对我来说很有意义。
但我不确定我是否理解为什么当我将通用生命周期放在传递给它编译的“异步闭包”的引用类型上时:
struct A<'a> { v: u32, _phantom: std::marker::PhantomData<&'a ()> }
async fn foo<
'b,
C: for<'a> FnOnce(&'a A<'b>) -> …Run Code Online (Sandbox Code Playgroud) Iterator::chain()我正在尝试为 GATified 借贷迭代器实现类似操作:
#![feature(generic_associated_types)]
pub trait LendingIterator {
type Item<'a> where Self: 'a;
fn next(&mut self) -> Option<Self::Item<'_>>;
}
Run Code Online (Sandbox Code Playgroud)
为此,与普通 Iterator::chain() 类似,我需要一个Chain包含两个链式迭代器和 impl 的结构LendingIterator。
我遇到的问题是我需要指定迭代器类型A并B具有匹配的Item泛型关联类型,所以我尝试了以下方法:
pub struct Chain<A, B> {
a: Option<A>,
b: Option<B>,
}
impl<A, B> LendingIterator for Chain<A, B>
where
A: LendingIterator,
B: for<'a> LendingIterator<Item<'a>=A::Item<'a>>
{
type Item<'a> where Self: 'a = A::Item<'a>;
fn next(&mut self) -> Option<Self::Item<'_>> {
todo!()
}
}
Run Code Online (Sandbox Code Playgroud)
但我得到:
error[E0311]: the parameter type …Run Code Online (Sandbox Code Playgroud) 在规范中,它讨论了附件的 loadOp 和 storeOp 出现在哪个管道阶段(这里 - 项目符号后的第 2 和第 3 段),以及它们使用的访问类型(这里):
具有深度/模板格式的附件的加载操作在 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT 管道阶段执行。
带有颜色格式的附件的加载操作在 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT 管道阶段执行。
VK_ATTACHMENT_LOAD_OP_LOAD 指定将保留渲染区域内图像的先前内容。对于具有深度/模板格式的附件,这使用访问类型 VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT。对于带有颜色格式的附件,这使用访问类型 VK_ACCESS_COLOR_ATTACHMENT_READ_BIT。
其他 loadOps 和 storeOps 也是如此。
它还提到了 subpass 中发生的 loadOp、storeOp 和 resolve ops 如何包含在 subpass 依赖项的同步范围中(这里 - 项目符号后的第 2 段和第 3 段):
第一组命令包括作为 srcSubpass 标识的 subpass 实例的一部分提交的所有命令以及 srcSubpass 中使用的附件上的任何加载、存储或多样本解析操作
规范的上述部分暗示在某些情况下需要此信息,以便您可以确保这些加载和存储操作与其他访问(在其他子通道中或在该渲染通道之外)正确同步,就像您需要确保解析操作与对同一附件的其他访问同步。
我的问题是在将子通道与其他子通道同步时是否需要考虑加载和存储操作,以及在渲染通道实例之外进行访问的子通道?在什么情况下需要同步?
我相信我一定是误解了某些东西,因为我在任何 vulkan 书籍或任何讨论它的人中都找不到对此的引用。
我认识到,在大多数情况下,不需要考虑这一点,因为附件的 loadOp 或 storeOp 的管道阶段和访问类型与那些 loadOps 的 subpass 实例中记录的命令中使用的管道阶段和访问类型相同或 storeOps 会发生。但是,有些情况下它们是不一样的。
具有一个子通道 RP1 的渲染通道 RP。
该子通道使用图像视图 …
在通过以下cmake生成的生成系统(Visual Studio 2017 Generator)中,'test.asm'源文件未使用预处理程序定义MY_MASM_DEFINITION进行编译:
cmake_minimum_required(VERSION 3.14)
project("test")
enable_language(CXX)
enable_language(ASM_MASM)
add_library(Problem STATIC "test.asm")
target_compile_definitions(Problem PUBLIC "MY_MASM_DEFINITION")
Run Code Online (Sandbox Code Playgroud)
如果我设置CMAKE_ASM_MASM_FLAGS或使用,也是如此set_target_properties。
如果使用set_source_files_properties,它确实可以工作,但是在每个源文件上设置它在我们的构建系统中将无法正常工作。
难道我做错了什么?
除了使用以外,还有其他解决方法set_source_files_properties吗?
提前致谢。