绘制几何体
绘制几何体:让shader资源声明、descriptor与pipeline layout逐项一致;区分静态管线、动态状态与dynamic rendering兼容条件;按线程所有权录制command buffer并构造可复用提交,以章专属交互与可重放证据独立重写。
学习目标
- 能说明“绘制几何体”中的让shader资源声明、descriptor与pipeline layout逐项一致;区分静态管线、动态状态与dynamic rendering兼容条件;按线程所有权录制command buffer并构造可复用提交,并给出对应对象、状态或概率边界
- 能用正常基线与“descriptor类型或数组长度与shader不符,或push constant范围越界;漏设已声明动态的viewport/scissor,或pipeline附件格式与begin rendering不符;多个线程并发重置同一command pool,或执行仍处pending状态的buffer”反例定位SPIR-V反射、set/binding、layout、写入资源、动态偏移和VUID、pipeline create info、动态状态、附件格式、命令顺序和VUID、pool线程归属、buffer状态、submit批次、等待/信号值和fence中的首个差异
- 能操作三个章专属实验,让shader、descriptor set、descriptor set layout、pipeline layout、push constant、sampler、graphics pipeline、pipeline state、dynamic state、dynamic rendering、vkcmdbeginrendering、pipeline cache、command pool、command buffer、record、vkqueuesubmit、secondary command buffer、thread具备解释、视觉和练习证据
- 能修改最小实现、固定输入重放,并判断“绘制几何体的输入、状态、输出与恢复结果可用同一证据包重放”是否恢复
从一个可推翻的运行假设开始
“绘制几何体”先固定一个问题:如何证明让shader资源声明、descriptor与pipeline layout逐项一致;区分静态管线、动态状态与dynamic rendering兼容条件;按线程所有权录制command buffer并构造可复用提交?先写下预期对象、状态或像素,再运行正常基线;若SPIR-V反射、set/binding、layout、写入资源、动态偏移和VUID、pipeline create info、动态状态、附件格式、命令顺序和VUID、pool线程归属、buffer状态、submit批次、等待/信号值和fence不能指出第一个分叉,最终画面看起来正确也不能通过。
本页不变量是:绘制几何体的输入、状态、输出与恢复结果可用同一证据包重放。故障模式“descriptor类型或数组长度与shader不符,或push constant范围越界;漏设已声明动态的viewport/scissor,或pipeline附件格式与begin rendering不符;多个线程并发重置同一command pool,或执行仍处pending状态的buffer”每次只改变一个条件,正常、故障、恢复三次运行必须共享输入与版本。
来源、版本与课程边界
“绘制几何体”以Khronos Vulkan Guide latest这套持续更新的官方完整指南为主,并由Vulkan规范和官方Samples核对VUID、对象合同与可运行路径。课程的16页是教学聚合,不宣称它们是官方固定章节。
六个检查词
在“绘制几何体”的六词核对中,↡shader在“绘制几何体”的“Shaders, Descriptors, Push Constants, and Resource Mapping”检查中用于让shader资源声明、descriptor与pipeline layout逐项一致;应由SPIR-V反射、set/binding、layout、写入资源、动态偏移和VUID确认。、↡descriptor set在“绘制几何体”的“Shaders, Descriptors, Push Constants, and Resource Mapping”检查中用于让shader资源声明、descriptor与pipeline layout逐项一致;应由SPIR-V反射、set/binding、layout、写入资源、动态偏移和VUID确认。、↡descriptor set layout在“绘制几何体”的“Shaders, Descriptors, Push Constants, and Resource Mapping”检查中用于让shader资源声明、descriptor与pipeline layout逐项一致;应由SPIR-V反射、set/binding、layout、写入资源、动态偏移和VUID确认。、↡pipeline layout在“绘制几何体”的“Shaders, Descriptors, Push Constants, and Resource Mapping”检查中用于让shader资源声明、descriptor与pipeline layout逐项一致;应由SPIR-V反射、set/binding、layout、写入资源、动态偏移和VUID确认。、↡push constant在“绘制几何体”的“Shaders, Descriptors, Push Constants, and Resource Mapping”检查中用于让shader资源声明、descriptor与pipeline layout逐项一致;应由SPIR-V反射、set/binding、layout、写入资源、动态偏移和VUID确认。、↡sampler在“绘制几何体”的“Shaders, Descriptors, Push Constants, and Resource Mapping”检查中用于让shader资源声明、descriptor与pipeline layout逐项一致;应由SPIR-V反射、set/binding、layout、写入资源、动态偏移和VUID确认。。术语只有进入公式、交互状态、代码和可重放输出,才算真正覆盖。
正式单元与机制解释
Shaders, Descriptors, Push Constants, and Resource Mapping
在“绘制几何体”的“Shaders, Descriptors, Push Constants, and Resource Mapping”检查中,descriptor set layout定义每个binding的类型、数量和stage可见性,pipeline layout组合set layout与push constant范围。在“绘制几何体”的“Shaders, Descriptors, Push Constants, and Resource Mapping”检查中,写descriptor只更新资源引用,绑定时还要满足动态偏移、数组索引和图像layout合同。
在“绘制几何体”本页,正式坐标是shader、descriptor set、descriptor set layout、pipeline layout、push constant、sampler。在“绘制几何体”的反例核对中,反事实为“descriptor类型或数组长度与shader不符,或push constant范围越界”;应从SPIR-V反射、set/binding、layout、写入资源、动态偏移和VUID找到第一个分叉。
Graphics Pipeline, Dynamic State, and Dynamic Rendering
在“绘制几何体”的“Graphics Pipeline, Dynamic State, and Dynamic Rendering”检查中,graphics pipeline把shader、顶点输入、光栅化和逐片元状态组合为可绑定对象;明确声明的dynamic state在录制时设置。在“绘制几何体”的“Graphics Pipeline, Dynamic State, and Dynamic Rendering”检查中,dynamic rendering省去预建render pass对象,但pipeline rendering info与实际附件格式仍必须兼容。
在“绘制几何体”本页,正式坐标是graphics pipeline、pipeline state、dynamic state、dynamic rendering、vkcmdbeginrendering、pipeline cache。在“绘制几何体”的反例核对中,反事实为“漏设已声明动态的viewport/scissor,或pipeline附件格式与begin rendering不符”;应从pipeline create info、动态状态、附件格式、命令顺序和VUID找到第一个分叉。
Command Pools, Command Buffers, Queue Submission, and Threading
在“绘制几何体”的“Command Pools, Command Buffers, Queue Submission, and Threading”检查中,command pool管理同一queue family的command buffer分配与重置;外部同步要求同一pool不能被多个线程无保护并发访问。在“绘制几何体”的“Command Pools, Command Buffers, Queue Submission, and Threading”检查中,record只编码命令,queue submission才建立执行批次,secondary buffer适合明确继承边界的并行录制。
在“绘制几何体”本页,正式坐标是command pool、command buffer、record、vkqueuesubmit、secondary command buffer、thread。在“绘制几何体”的反例核对中,反事实为“多个线程并发重置同一command pool,或执行仍处pending状态的buffer”;应从pool线程归属、buffer状态、submit批次、等待/信号值和fence找到第一个分叉。
先预测,再操作三个章专属实验
1. 对象与执行路径
选择任一正式坐标,沿真实对象、状态、队列或像素路径查看因果关系。
Vulkan 提交与执行时间线
绘制几何体
把“让shader资源声明、descriptor与pipeline layout逐项一致;区分静态管线、动态状态与dynamic rendering兼容条件;按线程所有权录制command buffer并构造可复用提交”放到host、command buffer、queue与resource时间线上。
正式坐标
Shaders, Descriptors, Push Constants, and Resource Mapping
descriptor set layout定义每个binding的类型、数量和stage可见性,pipeline layout组合set layout与push constant范围。写descriptor只更新资源引用,绑定时还要满足动态偏移、数组索引和图像layout合同。
提交合同
ShaderInterface=PipelineLayout=BoundSets ; Draw=Pipeline_{static}+State_{dynamic}+Attachments ; Submit=Waits+CommandBuffers+Signals探针:SPIR-V反射、set/binding、layout、写入资源、动态偏移和VUID
最小可重现实验
vkCmdBindPipeline(cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
vkCmdBindDescriptorSets(cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, layout, 0, 1, &set, 0, nullptr);
vkCmdBindVertexBuffers(cmd, 0, 1, &vertexBuffer, offsets);
vkCmdDraw(cmd, vertexCount, 1, 0, 0);运行“绘制几何体”时记录API/规范版本、设备或浏览器能力、固定输入、关键中间状态与输出摘要。不得用一次漂亮截图替代对象合同、验证消息、时间戳或像素差异。
练习与答案
练习
问题 1:公式边界。 在“绘制几何体”中,如何用一个可手算样本验证 ,并标明每个量属于哪一对象、stage、空间或时间点?
问题 2:正式坐标。 在“绘制几何体”中,shader、descriptor set、descriptor set layout、pipeline layout、push constant、sampler、graphics pipeline、pipeline state、dynamic state、dynamic rendering、vkcmdbeginrendering、pipeline cache、command pool、command buffer、record、vkqueuesubmit、secondary command buffer、thread如何进入可操作验证?
问题 3:恢复证据。 怎样证明“descriptor类型或数组长度与shader不符,或push constant范围越界;漏设已声明动态的viewport/scissor,或pipeline附件格式与begin rendering不符;多个线程并发重置同一command pool,或执行仍处pending状态的buffer”已真正修复?
本章回顾
掌握“绘制几何体”意味着能把“让shader资源声明、descriptor与pipeline layout逐项一致;区分静态管线、动态状态与dynamic rendering兼容条件;按线程所有权录制command buffer并构造可复用提交”落到具体对象、状态与输出,能制造“descriptor类型或数组长度与shader不符,或push constant范围越界;漏设已声明动态的viewport/scissor,或pipeline附件格式与begin rendering不符;多个线程并发重置同一command pool,或执行仍处pending状态的buffer”,还能凭SPIR-V反射、set/binding、layout、写入资源、动态偏移和VUID、pipeline create info、动态状态、附件格式、命令顺序和VUID、pool线程归属、buffer状态、submit批次、等待/信号值和fence恢复同输入结果。
名词解释
本章出现的专业名词,用大白话再讲一遍。
- shader
shader在“绘制几何体”的“Shaders, Descriptors, Push Constants, and Resource Mapping”检查中用于让shader资源声明、descriptor与pipeline layout逐项一致;应由SPIR-V反射、set/binding、layout、写入资源、动态偏移和VUID确认。
- descriptor set
descriptor set在“绘制几何体”的“Shaders, Descriptors, Push Constants, and Resource Mapping”检查中用于让shader资源声明、descriptor与pipeline layout逐项一致;应由SPIR-V反射、set/binding、layout、写入资源、动态偏移和VUID确认。
- descriptor set layout
descriptor set layout在“绘制几何体”的“Shaders, Descriptors, Push Constants, and Resource Mapping”检查中用于让shader资源声明、descriptor与pipeline layout逐项一致;应由SPIR-V反射、set/binding、layout、写入资源、动态偏移和VUID确认。
- pipeline layout
pipeline layout在“绘制几何体”的“Shaders, Descriptors, Push Constants, and Resource Mapping”检查中用于让shader资源声明、descriptor与pipeline layout逐项一致;应由SPIR-V反射、set/binding、layout、写入资源、动态偏移和VUID确认。
- push constant
push constant在“绘制几何体”的“Shaders, Descriptors, Push Constants, and Resource Mapping”检查中用于让shader资源声明、descriptor与pipeline layout逐项一致;应由SPIR-V反射、set/binding、layout、写入资源、动态偏移和VUID确认。
- sampler
sampler在“绘制几何体”的“Shaders, Descriptors, Push Constants, and Resource Mapping”检查中用于让shader资源声明、descriptor与pipeline layout逐项一致;应由SPIR-V反射、set/binding、layout、写入资源、动态偏移和VUID确认。