问题描述
所以一个 VkSampler 是用一个 VkSamplerCreateInfo 创建的,它只有一堆配置设置,据我所知,它只是定义了一些输入图像的纯函数。
它们被描述为:
VkSampler 对象表示图像采样器的状态,实现使用它来 读取图像数据并为着色器应用过滤和其他转换。
VkSampler 的一个用途(可能只是用途)是将它们写入描述符(例如 VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER),以便在绑定到管道/着色器的描述符集中使用。
我的问题是:你能把同一个 VkSampler 写到多个不同的描述符上吗?来自相同或多个不同的描述符池?即使当前描述符之一正在某些当前正在执行的渲染通道中使用?
是否可以同时使用来自多个不同渲染通道/子通道/管道的同一个 VkSampler?
换句话说,VkSampler 是无状态的吗?还是它们代表设备上的一些有状态内存,因此您不应同时使用相同的内存?
解决方法
VkSampler
对象肯定有与之关联的数据,因此称它们为“无状态”是错误的。它们是不可变的。像VkRenderPass
、VkPipeline
等类似的对象,一旦创建,其内容就无法更改。
访问之间的同步(通常)仅在访问之一是修改操作的情况下才需要。由于 VkSampler
是不可变的,因此没有 修改操作。因此,对于从不同线程、命令或其他内容访问 VkSampler
的情况,不需要同步。
唯一的例外是明显的例外:vkDestroySampler
,它要求使用采样器的提交命令在调用函数之前已经完成。