长春cms建站,江苏省住房和城乡建设厅网站,织梦可以做婚纱影楼网站吗,百度框架户开户渠道向量内存#xff08;VMEM#xff09;指令将每个工作项的数据分别读取或写入VGPR中。这与标量内存指令形成对比#xff0c;标量内存指令移动的是波前中所有线程共享的单个数据块。所有向量内存#xff08;VM#xff09;操作都由纹理缓存系统#xff08;一级和二级缓存VMEM指令将每个工作项的数据分别读取或写入VGPR中。这与标量内存指令形成对比标量内存指令移动的是波前中所有线程共享的单个数据块。所有向量内存VM操作都由纹理缓存系统一级和二级缓存处理。软件通过以下三种类型的VMEM指令之一通过纹理缓存启动加载、存储或原子操作MTBUF内存类型化缓冲区操作MUBUF内存非类型化缓冲区操作MIMG内存图像操作指令定义了哪些VGPR为操作提供地址哪些VGPR从操作接收或提供数据以及一系列包含内存缓冲区描述符V#或T#的SGPR。此外MIMG操作从四个SGPR系列提供纹理采样器该采样器定义了对从图像读取的数据执行的纹素过滤操作。8.1 向量内存缓冲区指令向量内存VM操作通过纹理缓存TC在VGPR和内存中的缓冲区对象之间传输数据。向量意味着为波前中的每个线程唯一传输一个或多个数据块这与标量内存读取形成对比标量内存读取仅传输波前中所有线程共享的一个值。缓冲区读取可以选择将数据返回到VGPR或直接返回到LDS。缓冲区对象的示例包括顶点缓冲区、原始缓冲区、流输出缓冲区和结构化缓冲区。缓冲区对象支持同质和异质数据但不支持读取数据的过滤无采样器。缓冲区指令分为两组MUBUF非类型化缓冲区对象数据格式在资源常量中指定加载、存储、原子操作带或不带数据格式转换MTBUF类型化缓冲区对象数据格式在指令中指定唯一操作是加载和存储两者都带数据格式转换原子操作从VGPR获取数据并与内存中已有的数据进行算术组合。可选地操作发生前内存中的值可以返回到着色器。所有VM操作都使用缓冲区资源常量V#它是SGPR中的128位值。执行指令时此常量被发送到纹理缓存。此常量定义了内存中缓冲区的地址和特性。通常这些常量在执行VM指令之前使用标量内存读取从内存获取但这些常量也可以在着色器内生成。8.1.1 简化缓冲区寻址下面的方程显示了硬件如何计算缓冲区访问的内存地址。8.1.2 缓冲区指令缓冲区指令MTBUF和MUBUF允许着色器程序读取和写入内存中的线性缓冲区。这些操作可以对小至一个字节大到每个工作项四个双字的数据进行操作。提供了原子算术操作可以对内存中的数据值进行操作并可选择返回执行算术操作前内存中的值。D16指令变体将结果转换为打包的16位值。例如BUFFER_LOAD_FORMAT_D16_XYZW将写入两个VGPR。表25. 缓冲区指令指令描述MTBUF指令TBUFFER_LOAD_FORMAT_{x,xy,xyz,xyzw}TBUFFER_STORE_FORMAT_{x,xy,xyz,xyzw}从类型化缓冲区对象读取或写入。也用于顶点获取。MUBUF指令BUFFER_LOAD_FORMAT_{x,xy,xyz,xyzw}BUFFER_STORE_FORMAT_{x,xy,xyz,xyzw}BUFFER_LOAD_sizeBUFFER_STORE_sizesize byte, ubyte, short, ushort, Dword, Dwordx2, Dwordx3, Dwordx4BUFFER_ATOMIC_opBUFFER_ATOMIC_op_x2从非类型化缓冲区对象读取或写入。表26. 微码格式字段位大小描述OP4/7MTBUF类型化缓冲区指令的操作码。MUBUF非类型化缓冲区指令的操作码。VADDR8提供地址第一个组件的VGPR地址偏移量或索引。当同时使用索引和偏移量时索引在第一个VGPR中偏移量在第二个VGPR中。VDATA8提供写入数据第一个组件或接收读取数据第一个组件的VGPR地址。SOFFSET8提供无符号字节偏移量的SGPR。必须是SGPR、M0或内联常量。SRSRC5指定哪个SGPR在四个或八个连续SGPR中提供T#资源常量。此字段缺少SGPR地址的最低两位因为该地址必须对齐到四个SGPR的倍数。DFMT4内存缓冲区中数据的格式0无效1 82 163 8_84 325 16_166 10_11_117 11_11_108 10_10_10_29 2_10_10_1010 8_8_8_811 32_3212 16_16_16_1613 32_32_3214 32_32_32_3215保留NFMT3内存中数据的数值格式0 unorm1 snorm2 uscaled3 sscaled4 uint5 sint6保留7 floatOFFSET12无符号字节偏移量。OFFEN11 从VGPRVADDR提供偏移量。0 不提供偏移量0。IDXEN11 从VGPRVADDR提供索引。0 不提供索引0。GLC1全局一致性。控制L1纹理缓存如何处理读取和写入。读取GLC0读取可以命中L1并在波前之间保持。GLC1读取错过L1并强制获取到L2。波之间没有L1持久性。写入GLC0写入错过L1写入到L2并在波前之间在L1中保持。GLC1写入错过L1写入到L2。波前之间没有持久性。原子操作GLC0不返回先前数据值。波前之间没有L1持久性。GLC1返回先前数据值。波前之间没有L1持久性。注意对于原子操作GLC表示返回操作前值。SLC1系统级一致性。设置时访问强制在二级纹理缓存中错过并与系统内存一致。TFE1PRT部分驻留纹理的纹素失败启用。设置为1时获取可以返回NACK导致VGPR写入到DST1所有获取目标GPR之后的第一个GPR。LDS1仅限MUBUF0 将读取数据返回到VGPR。1 将读取数据返回到LDS而不是VGPR。8.1.3 VGPR使用VGPR提供地址和写入数据此外它们可以是返回数据的目标另一个选项是LDS。地址根据指令字中的偏移启用OFFEN和索引启用IDXEN使用零个、一个或两个VGPR如下表所示表27. 地址VGPRIDXENOFFENVGPRnVGPRn100无01uint偏移量10uint索引11uint索引uint偏移量写入数据从VDATA开始的N个连续VGPR。指令字中指定的数据格式MTBUF的NFMT、DFMT或MUBUF操作码字段中编码的决定了要写入多少双字。读取数据与写入相同。数据返回到连续的GPR。读取数据格式读取数据为32位基于指令或资源中的数据格式。浮点或规范化数据作为浮点数返回整数格式作为整数返回有符号或无符号与内存存储格式类型相同。内存中32或64位数据的读取不进行任何格式转换。带返回的原子操作数据从VDATA开始的VGPR中读取提供给原子操作。如果原子操作返回值到VGPR则该数据返回到从VDATA开始的相同VGPR。8.1.4 缓冲区数据读取或写入的数据量和类型由以下控制数据格式dfmt、数值格式nfmt、目标组件选择dst_sel和操作码。Dfmt和nfmt可以来自资源、指令字段或操作码本身。Dst_sel来自资源但对于许多操作被忽略。表28. 缓冲区指令指令数据格式数值格式DST_SELTBUFFER_LOAD_FORMAT_*指令指令identityTBUFFER_STORE_FORMAT_*指令指令identityBUFFER_LOAD_type派生派生identityBUFFER_STORE_type派生派生identityBUFFER_LOAD_FORMAT_*资源资源资源BUFFER_STORE_FORMAT_*资源资源资源BUFFER_ATOMIC_*派生派生identity指令使用指令的dfmt和nfmt字段而不是资源的字段。数据格式派生数据格式从操作码派生忽略资源定义。例如buffer_load_ubyte将数据格式设置为8数值格式设置为uint。资源的数据格式不能为INVALID该格式具有特定含义未绑定资源对于这种情况数据格式不会被指令的隐含数据格式替换。DST_SEL identity根据数据格式中的组件数量这是X000、XY00、XYZ0或XYZW。MTBUF从指令派生数据格式。MUBUFBUFFER_LOAD_FORMAT和BUFFER_STORE_FORMAT指令使用资源中的dst_sel其他MUBUF指令从指令本身派生数据格式。D16指令加载格式和存储格式指令也有d16变体。对于存储每个32位VGPR保存两个16位数据元素传递给纹理单元。纹理单元在写入内存之前将它们转换为纹理格式。对于加载从纹理单元返回的数据转换为16位一对数据存储在每个32位VGPR中先LSB然后MSB。int与float的控制由NFMT控制。8.1.5 缓冲区寻址缓冲区是内存中的数据结构使用索引和偏移量进行寻址。索引指向大小为stride字节的特定记录偏移量是记录内的字节偏移量。stride来自资源索引来自VGPR或零偏移量来自SGPR或VGPR以及指令本身。表29. 用于寻址的BUFFER指令字段字段大小描述inst_offset12指令的字面字节偏移量。inst_idxen1布尔值为true时从VGPR获取索引为false时无索引。inst_offen1布尔值为true时从VGPR获取偏移量为false时无偏移量。注意无论此位如何inst_offset都存在。缓冲区指令的元素大小是指令传输的数据量。对于MTBUF指令由DFMT字段确定对于MUBUF指令从操作码确定。可以是1、2、4、8或16字节。表30. 用于寻址的V#缓冲区资源常量字段字段大小描述const_base48缓冲区资源的基地址字节。const_stride14或18记录的跨度字节0到16,383字节或0到262,143字节。通常为14位但当以下情况时扩展到18位const_add_tid_enable true与非格式类型或缓存无效/WB的MUBUF指令一起使用。此扩展旨在用于暂存私有缓冲区。如果(const_add_tid_enable MUBUF-non-format instr.)则const_stride[17:0] { V#.DFMT[3:0], V#.const_stride[13:0] }const_stride为14位{4b0, V#.const_stride[13:0]}const_num_records32缓冲区中的记录数。对于原始缓冲区单位为字节对于结构化缓冲区单位为跨度对于私有暂存缓冲区忽略。单位为(inst_idxen 1) ? 字节 : 跨度const_add_tid_enable1布尔值。为true时将波前内的thread_ID添加到索引中。const_swizzle_enable1布尔值。为true时表示表面被重排。const_element_size2仅当const_swizzle_en true时使用。给定索引的记录的连续字节数2、4、8或16字节。必须结构中的最大元素大小。const_stride必须是const_element_size的整数倍。const_index_stride2仅当const_swizzle_en true时使用。在切换到下一个元素之前单个元素大小为const_element_size的连续索引数。有8、16、32或64个索引。表31. 来自GPR的地址组件字段大小描述SGPR_offset32地址的无符号字节偏移量。来自SGPR或M0。VGPR_offset32可选的每线程无符号字节偏移量。来自VGPR。VGPR_index32可选的每线程索引值。来自VGPR。最终的缓冲区内存地址由三部分组成来自缓冲区资源V#的基地址来自SGPR的偏移量根据缓冲区是线性寻址简单的结构数组计算还是重排以不同方式计算的缓冲区偏移量图4. 线性缓冲区的地址计算范围检查可以检查地址是否在范围内。当地址超出范围时读取将返回零写入和原子操作将被丢弃。地址范围检查算法取决于缓冲区类型。私有暂存缓冲区使用条件AddTID1 IdxEn0对于此缓冲区没有范围检查。原始缓冲区使用条件AddTID0 SWizzleEn0 IdxEn0超出范围条件(InstOffset (OffEN ? vgpr_offset : 0)) NumRecords结构化缓冲区使用条件AddTID0 Stride!0 IdxEn1超出范围条件Index(vgpr) NumRecords注意超出范围的读取返回零V#.dst_sel SEL_1的组件返回1除外超出范围的写入不写入任何内容加载/存储格式*指令和原子操作进行全有或全无范围检查-要么完全在范围内要么完全在范围外加载/存储双字-x{2,3,4}按组件进行范围检查重排缓冲区寻址重排寻址重新排列缓冲区中的数据可以帮助提高结构数组的缓存局部性。重排寻址还需要双字对齐的访问。单个获取指令不能尝试获取大于const-element-size的单位。缓冲区的STRIDE必须是element_size的倍数。重排缓冲区地址计算Index (inst_idxen ? vgpr_index : 0) (const_add_tid_enable ? thread_id[5:0] : 0) Offset (inst_offen ? vgpr_offset : 0) inst_offset index_msb index / const_index_stride index_lsb index % const_index_stride offset_msb offset / const_element_size offset_lsb offset % const_element_size buffer_offset (index_msb * const_stride offset_msb * const_element_size) * const_index_stride index_lsb * const_element_size offset_lsb Final Address const_base sgpr_offset buffer_offset请记住sgpr_offset不是上述方程中offset项的一部分。图5. 缓冲区重排示例重排寻址的拟议用例以下是重排寻址在常见图形缓冲区中的一些拟议用途。表32. 重排缓冲区用例DX11原始UAVOpenCL缓冲区对象Dx11结构化字面偏移Dx11结构化GPR偏移暂存环/流输出常量缓冲区inst_vgpr_offset_enTFTTTTinst_vgpr_index_enFTTFFFconst_stridenaapiapiscratchSizenanaconst_add_tid_enableFFFTTFconst_buffer_swizzleFTTTFFconst_elem_sizena444或16na4const_index_stridena1616648.1.6 16位内存操作D16缓冲区指令允许内核在每个工作项的VGPR和内存之间仅加载或存储16位数据。这些指令有两个变体D16将数据加载到VGPR的低16位或从VGPR的低16位存储数据D16_HI将数据加载到VGPR的高16位或从VGPR的高16位存储数据例如BUFFER_LOAD_UBYTE_D16从内存为每个工作项读取一个字节将其转换为16位整数然后将其加载到数据VGPR的低16位中。8.1.7 对齐对于双字或更大尺寸的读写操作字节地址的最低两位LSB被忽略从而强制进行双字对齐。8.1.8 缓冲区资源缓冲区资源描述了缓冲区在内存中的位置以及缓冲区中数据的格式。它在四个连续的SGPR四个对齐的SGPR中指定并在每个缓冲区指令执行时发送到纹理缓存。下表详细说明了构成缓冲区资源描述符的字段表33. 缓冲区资源描述符位范围大小名称描述47:048基地址字节地址61:4814跨度字节0到16383621缓存重排缓冲区访问。可选地重排纹理缓存TC L1缓存bank631重排启用根据跨度、索引跨度和元素大小重排AOS否则为线性跨度 × 索引 偏移量95:6432记录数以跨度或字节为单位98:963目标选择_x目标通道选择00, 11, 4R, 5G, 6B, 7A101:993目标选择_y104:1023目标选择_z107:1053目标选择_w110:1083数值格式数值数据类型浮点、整型等。参见指令编码的值114:1114数据格式字段数和每个字段的大小。参见指令编码的值。对于ADD_TID_EN1的MUBUF指令此字段保存跨度[17:14]1151用户VM启用资源通过平铺池/堆映射1161用户VM模式未映射行为0空返回0/丢弃写入1无效导致错误118:1172索引跨度8、16、32或64。用于重排缓冲区寻址1191添加线程ID启用将线程ID添加到索引中以计算地址122:1203RSVD保留。必须设置为零1231NV非易失性0易失性125:1242RSVD保留。必须设置为零127:1262类型值0表示缓冲区。与128位T#资源中的四位类型字段的高两位重叠全部设置为零的资源充当未绑定的纹理或缓冲区返回0,0,0,0。8.1.9 内存缓冲区加载到LDSMUBUF指令格式允许从内存缓冲区直接读取数据到LDS而不经过VGPR。这支持以下MUBUF指令子集BUFFER_LOAD_{ubyte, sbyte, ushort, sshort, dword, format_x}对于加载到LDS设置指令的TFE位是非法的地址计算LDS_offset 来自M0[15:0]的16位无符号字节偏移量Mem_offset 来自SGPRSOFFSET SGPR的32位无符号字节偏移量idx_vgpr 来自VGPR的索引值位于VADDR如果idxen0则为零off_vgpr 来自VGPR的偏移量值位于VADDR或VADDR1如果offen0则为零下图显示了LDS和内存地址计算的组件仅当资源T#的ADD_TID_ENABLE字段设置为1时才会添加TIDinWave而LDS会添加它。MEM_ADDR M#在VDATA字段中它指定M0。钳位规则内存地址钳位遵循与任何其他缓冲区获取相同的规则。LDS地址钳位返回的数据不能写入分配给此wave的LDS空间之外。设置活动掩码以限制缓冲区读取仅允许那些将数据返回到合法LDS位置的线程LDSbase分配以32个双字为单位LDSsize也是如此M0[15:0]以字节为单位8.1.10 GLC位解释GLC位对于加载、存储和原子操作具有不同的含义。GLC对于加载的含义当GLC0时加载可以从GPU L1读取数据通常所有加载除了加载获取使用GLC0当GLC1时加载故意错过GPU L1并从L2读取。如果GPU L1中有匹配的行它将被无效L2被重新读取注意对于单个加载指令不会为同一wavefront中的每个工作项重新读取L2。例如buav[Ntid]// 假设这是一个字节读取glc1且N对齐到64B。在上述操作中wavefront的第一个Tid从L2或更远处引入行其他63个Tid从L1中的相同64B缓存行读取GLC对于存储的含义当GLC0时这会导致跨wavefront存储操作的工作项进行写合并脏行会自动写入L2如果存储操作弄脏了64B行的所有字节它在L1中保持干净和有效允许后续访问命中此缓存行否则不留写合并行在L1中当GLC1时与GLC0相同只是写合并行不留在线中即使所有字节都被弄脏原子操作当GLC0时不返回数据这是只写原子操作当GLC1时返回操作前内存中的值8.2 向量内存VM图像指令向量内存VM操作通过纹理缓存TC在VGPR和内存之间传输数据。向量意味着为wavefront中的每个工作项唯一传输一个或多个数据块。这与标量内存读取形成对比标量内存读取仅传输wavefront中所有工作项共享的一个值。图像对象的示例包括纹理贴图和类型化表面。图像对象使用一到四维地址访问它们由一到四个元素的同质数据组成。这些图像对象使用IMAGE_*或SAMPLE_*指令读取或写入所有这些指令都使用MIMG指令格式。IMAGE_LOAD指令直接从图像缓冲区读取元素到VGPR而SAMPLE指令使用采样器常量S#并在读取数据后应用过滤。IMAGE_ATOMIC指令将VGPR中的数据与内存中已有的数据组合并可选择返回操作前内存中的值。所有VM操作都使用图像资源常量T#它是SGPR中的256位值。执行指令时此常量被发送到纹理缓存。此常量定义了内存中表面的地址、数据格式和特性。一些图像指令还使用采样器常量它是SGPR中的128位常量。通常这些常量在执行VM指令之前使用标量内存读取从内存获取但这些常量也可以在着色器内生成。纹理获取指令有一个数据掩码DMASK字段。DMASK指定接收多少个数据组件。如果DMASK小于纹理中的组件数纹理单元只发送DMASK组件从R开始然后是G、B和A。如果DMASK指定的组件多于纹理格式指定的着色器接收缺失组件的零。8.2.1 图像指令本节描述图像指令集以及这些指令可用的微码字段。表34. 图像指令MIMG描述SAMPLE_*从图像对象读取和过滤数据IMAGE_LOAD_op从图像对象读取数据使用以下之一image_load、image_load_mip、image_load_{pck, pck_sgn, mip_pck, mip_pck_sgn}IMAGE_STOREIMAGE_STORE_MIP将数据存储到图像对象。存储数据到特定的mipmap级别IMAGE_ATOMIC_op图像原子操作包括以下之一swap、cmpswap、add、sub、rsub、{u,s}{min,max}、and、or、xor、inc、dec、fcmpswap、fmin、fmax表35. 指令字段字段位大小描述OP7操作码VADDR8提供地址第一个组件的VGPR地址VDATA8提供写入数据第一个组件或接收读取数据第一个组件的VGPR地址SSAMP5在四个连续SGPR中提供S#采样器常量的SGPR。缺少SGPR地址的最低两位因为必须对齐到四个SGPR的倍数SRSRC5在四个或八个连续SGPR中提供T#资源常量的SGPR。缺少SGPR地址的最低两位因为必须对齐到四个SGPR的倍数UNRM1强制地址为非规范化无论T#如何。对于图像存储和原子操作必须设置为1DA1着色器声明要与此获取一起使用的数组资源。当为1时着色器提供带指令的数组索引。当为0时不提供数组索引DMASK4数据VGPR启用掩码一到四个连续VGPR。读取定义返回哪些组件。0红1绿2蓝3阿尔法。写入定义哪些组件用VGPR的数据写入缺失组件得到0。启用的组件来自连续VGPR。例如DMASK1001红在VGPRn中阿尔法在VGPRn1中。对于D16写入DMASK仅用作字数计数每个位代表要写入的16位数据从VADDR的LSB开始然后是MSB、VADDR1等。忽略位位置GLC1全局一致性。控制L1纹理缓存如何处理读取和写入。读取GLC0读取可以命中L1并在wave间持久。GLC1读取错过L1并强制获取到L2。wave间没有L1持久性。写入GLC0写入错过L1写入到L2并在wavefront间在L1中持久。GLC1写入错过L1写入到L2。wavefront间没有持久性。原子操作GLC0不返回先前数据值。wavefront间没有L1持久性。GLC1返回先前数据值。wavefront间没有L1持久性SLC1系统级一致性。设置时访问强制在二级纹理缓存中错过并与系统内存一致TFE1PRT部分驻留纹理的纹素失败启用。设置时获取可以返回NACK导致VGPR写入到DST1所有获取目标GPR之后的第一个GPRLWE1LOD警告启用。设置为1时纹理获取可能返回LOD_CLAMPED 1A161地址组件为16位而不是通常的32位。设置时所有地址组件为16位每双字打包两个除了纹素偏移三个6位无符号整数打包到一个双字中。PCF参考对于_C指令。地址组件对于无采样器的图像操作为16位无符号整数有采样器时为16位浮点数D161VGPR数据16位。在加载时将内存中的数据转换为16位格式然后存储到VGPR中。对于存储将VGPR中的16位数据转换为32位然后写入内存。数据被视为浮点还是整数由NFMT决定。仅允许以下操作码使用IMAGE_SAMPLE*、IMAGE_GATHER4*但不包括GATHER4H_PCK、IMAGE_LOAD、IMAGE_LOAD_MIP、IMAGE_STORE、IMAGE_STORE_MIP8.3 无采样器的图像操作码对于无采样器的图像操作码所有VGPR地址值都视为无符号整数。对于立方体贴图face_id slice * 6 face。下表显示了各种图像操作码的地址VGPR内容表36. 无采样器的图像操作码图像操作码无采样器的资源Acnt维度VGPRnVGPRn1VGPRn2VGPRn3get_resinfo0任意mipidload / store / atomics01Dx11D数组xslice12Dxy22D MSAAxyfragid22D数组xyslice32D数组MSAAxyslicefragid23Dxyz2立方体xyface_idload_mip / store_mip11Dxmipid21D数组xslicemipid22Dxymipid32D数组xyslicemipid33Dxyzmipid3立方体xyface_idmipid8.4 有采样器的图像操作码对于有采样器的图像操作码所有VGPR地址值都视为浮点数。对于立方体贴图face_id slice * 8 face。某些采样和聚集操作码需要VGPR中显示的之外的额外值。这些值是偏移、偏置、z比较和梯度。表37. 有采样器的图像操作码图像操作码有采样器Acnt维度VGPRnVGPRn1VGPRn2VGPRn3sample01Dx11D数组xslice12Dxy22D隔行扫描xyfield22D数组xyslice23Dxyz2立方体xyface_idsample_l11Dxlod21D数组xslicelod22Dxylod32D隔行扫描xyfieldlod32D数组xyslicelod33Dxyzlod3立方体xyface_idlodsample_cl11Dxclamp21D数组xsliceclamp22Dxyclamp32D隔行扫描xyfieldclamp32D数组xysliceclamp33Dxyzclamp3立方体xyface_idclampgather412Dxy22D隔行扫描xyfield22D数组xyslice2立方体xyface_idgather4_l22Dxylod32D隔行扫描xyfieldlod32D数组xyslicelod3立方体xyface_idlodgather4_cl22Dxyclamp32D隔行扫描xyfieldclamp32D数组xysliceclamp3立方体xyface_idclamp注意Sample包括sample、sample_d、sample_b、sample_lz、sample_c、sample_c_d、sample_c_b、sample_c_lz和getlodSample_l包括sample_l和sample_c_lSample_cl包括sample_cl、sample_d_cl、sample_b_cl、sample_c_cl、sample_c_d_cl和sample_c_b_clGather4包括gather4、gather4_lz、gather4_c和gather4_c_lz下表列出并简要描述了图像指令的合法后缀表38. 采样指令后缀键8.4.1 VGPR使用地址地址由最多四个部分组成{ offset } { bias } { z-compare } { derivative } { body }这些都打包到连续的VGPR中。偏移SAMPLE*O*、GATHER*O*一个双字的offset_xyz。偏移是六位有符号整数X[5:0]、Y[13:8]、Z[21:16]偏置SAMPLE*B*、GATHER*B*。一个双字浮点数z比较SAMPLE*C*、GATHER*C*。一个双字导数sample_d、sample_cd2、4或6个双字每个导数打包为一个双字如下图像维度VGPR NN1N2N3N4N51DDX/DHDX/DV----2DDX/DHDY/DHDX/DVDY/DV--3DDX/DHDY/DHDZ/DHDX/DVDY/DVDZ/DV主体一到四个双字如表中定义[带采样器的图像操作码]。地址组件为X、Y、Z、WX在VGPR_M中Y在VGPR_M1中依此类推。主体中的组件数是表中ACNT字段的值加一数据从一到四个连续VGPR写入或返回到。读取或写入的数据量由指令的DMASK字段确定读取DMASK指定资源的哪些元素返回到连续VGPR。纹理系统从内存读取数据根据数据格式将其扩展为规范RGBA形式为缺失组件填充零或一。然后应用DMASK只有选定的组件返回到着色器写入写入图像对象时只能写入整个元素所有组件而不仅仅是单个组件。组件来自连续VGPR纹理系统为图像数据格式的任何缺失组件填充零值忽略不属于存储数据格式的任何值。例如如果DMASK1001着色器发送红从VGPR_N阿尔法从VGPR_N1到纹理单元。如果图像对象是RGB纹素被VGPR_N的红覆盖绿和蓝设置为零着色器的阿尔法被忽略原子操作图像原子操作仅在32位和64位每像素表面上支持。表面数据格式在资源常量中指定。原子操作将元素视为32位或64位的单个组件。对于原子操作DMASK设置为发送到纹理单元的VGPR双字数。图像原子操作的DMASK合法值不允许其他DMASK值0x1 32位原子操作除了cmpswap0x3 32位原子cmpswap0x3 64位原子操作除了cmpswap0xf 64位原子cmpswap带返回的原子操作数据从VDATA开始的VGPR中读取提供给原子操作。如果原子返回值到VGPR则该数据返回到从VDATA开始的相同VGPRD16指令加载格式和存储格式指令也有d16变体。对于存储每个32位VGPR保存两个16位数据元素传递给纹理单元。纹理单元在写入内存之前将它们转换为纹理格式。对于加载从纹理单元返回的数据转换为16位一对数据存储在每个32位VGPR中先LSB然后MSB。DMASK位代表单个16位元素因此当DMASK0011用于图像加载时两个16位组件加载到单个32位VGPR中8.4.2 图像资源图像资源也称为T#定义图像缓冲区在内存中的位置、其维度、平铺方式和数据格式。这些资源存储在四个或八个连续SGPR中并由MIMG指令读取。表39. 图像资源定义位范围大小名称注释128位资源1D纹理、2D纹理、2D MSAA多重采样抗锯齿39:040基地址256字节对齐。也用于fmask指针51:4012最小LOD4.8格式四位无符号整数位八位小数位57:526数据格式组件数和每个组件的位数61:584数值格式数值格式621NV非易失性0易失性77:6414宽度mip0的宽度-1以纹素为单位91:7814高度mip0的高度-1以纹素为单位94:923性能调制缩放采样器的perf_z、perf_mip、aniso_bias、lod_bias_sec98:963目标选择_x00, 11, 4R, 5G, 6B, 7A101:993目标选择_y104:1023目标选择_z107:1053目标选择_w111:1084基础级别资源视图中的最大mip级别。对于MSAA设置为零115:1124最后级别对于MSAA保存样本数120:1165平铺索引查找表32×16 bank_width[2]、bank_height[2]、num_banks[2]、tile_split[2]、macro_tile_aspect[2]、micro_tile_mode[2]、array_mode[4]127:1244类型0buf, 81d, 92d, 103d, 11cube, 121d-array, 132d-array, 142d-msaa, 152d-msaa-array。1-7保留256位资源1D数组、2D数组、3D、立方体贴图、MSAA140:12813深度3D贴图的mip0深度-1156:14116间距以纹素为单位159:1573边框颜色重排指定边框颜色的通道排序独立于T# dst_sel字段。0xyzw, 1xwyz, 2wqyx, 3wxyz, 4zyxw, 5yxwz176:1734数组间距被子的数组间距编码为trunc(log2(array_pitch))1184:1778元数据地址位[47:40]1851元数据线性强制元数据表面为线性1861元数据管道对齐在元数据寻址中保持管道对齐1871元数据RB对齐在元数据寻址中保持RB对齐191:1884最大MIP资源mipLevel-1。描述资源与描述资源视图的base_level和last_level相反。对于MSAA保存log2(样本数)203:19212最小LOD警告LOD的反馈触发器U4.8格式211:2048计数器bank IDPRT计数器ID2121LOD硬件计数启用PRT硬件计数器启用2131压缩启用启用增量颜色压缩2141阿尔法在MSB上如果表面的组件交换未反转则设置为1DCC2151颜色变换自动0无1DCC255:21640元数据地址元数据地址的高位DCC[47:8]所有图像资源视图描述符T#都由驱动程序写为256位。MIMG格式指令有一个DeclareArrayDA位反映着色器期望绑定的是数组纹理还是简单纹理。当DA为零时硬件不向纹理缓存发送数组索引。如果纹理贴图被索引硬件提供零索引值。为非索引纹理贴图发送的索引被忽略。8.4.3 图像采样器采样器资源也称为S#定义对采样指令读取的纹理贴图数据执行的操作。这些主要是地址钳位和过滤选项。采样器资源在四个连续SGPR中定义并在每个采样指令执行时提供给纹理缓存。表40. 图像采样器定义位范围大小名称描述2:03钳位x钳位/环绕模式5:33钳位y8:63钳位z11:93最大各向异性比率14:123深度比较函数151强制非规范化强制地址坐标为非规范化18:163各向异性阈值191mc坐标截断201强制去伽马26:216各向异性偏置u1.5格式271截断坐标281禁用立方体贴图环绕30:292过滤模式正常线性插值、最小或最大过滤311兼容模式1新模式0传统模式43:3212最小LODu4.8格式55:4412最大LODu4.8格式59:564性能MIP63:604性能Z77:6414LOD偏置s5.8格式83:786LOD偏置秒s1.4格式85:842xy放大过滤放大过滤87:862xy缩小过滤缩小过滤89:882z过滤91:902MIP过滤921MIP点预钳位当MIP过滤器点时钳位前添加0.5931禁用LSB上取整禁用过滤器中的上取整逻辑向上舍入941过滤器精度修复951各向异性覆盖如果base_level last_level禁用各向异性过滤107:9612边框颜色指针125:10818未使用127:1262边框颜色类型不透明黑色、透明黑色、白色、使用边框颜色指针8.4.4 数据格式数据格式0-15可用于缓冲区资源所有格式可用于图像格式。下表详细说明了图像和缓冲区资源可以使用的所有数据格式。8.4.5 向量内存指令数据依赖性当发出VM指令时地址立即从VGPR中读取并发送到纹理缓存。任何纹理或缓冲区资源和采样器也立即发送。然而写入数据不会立即发送到纹理缓存。着色器开发人员负责避免与VMEM指令相关的数据危害包括在读取从纹理缓存获取的数据之前等待VMEM读取指令完成VMCNT。这在数据依赖性解析部分中解释。