Compartir a través de


Cambios de código de bytes en SM5.1

SM5.1 cambia cómo se declaran y hacen referencia a los registros de recursos en instrucciones.

SM5.1 se mueve hacia la declaración de una "variable" de registro, similar a la forma en que se realiza para los registros de memoria compartida de grupo, que se ilustra en el ejemplo siguiente:

Texture2D<float4> tex0          : register(t5,  space0);
Texture2D<float4> tex1[][5][3]  : register(t10, space0);
Texture2D<float4> tex2[8]       : register(t0,  space1);
SamplerState samp0              : register(s5, space0);

float4 main(float4 coord : COORD) : SV_TARGET
{
    float4 r = coord;
    r += tex0.Sample(samp0, r.xy);
    r += tex2[r.x].Sample(samp0, r.xy);
    r += tex1[r.x][r.y][r.z].Sample(samp0, r.xy);
    return r;
}

A continuación se muestra el desensamblaje de este ejemplo:

// Resource Bindings:
//
// Name                                 Type  Format         Dim Space Slot  Elements
// ------------------------------ ---------- ------- ----------- ----- ---- ---------
// samp0                             sampler      NA          NA     0    5         1
// tex0                              texture  float4          2d     0    5         1
// tex1[0][5][3]                     texture  float4          2d     0   10 unbounded
// tex2[8]                           texture  float4          2d     1    0         8
//
//
//
// Input signature:
//
// Name                 Index   Mask Register SysValue  Format   Used
// -------------------- ----- ------ -------- -------- ------- ------
// COORD                    0   xyzw        0     NONE   float   xyzw
//
//
// Output signature:
//
// Name                 Index   Mask Register SysValue  Format   Used
// -------------------- ----- ------ -------- -------- ------- ------
// SV_TARGET                0   xyzw        0   TARGET   float   xyzw
//
ps_5_1
dcl_globalFlags refactoringAllowed
dcl_sampler s0[5:5], mode_default, space=0
dcl_resource_texture2d (float,float,float,float) t0[5:5], space=0
dcl_resource_texture2d (float,float,float,float) t1[10:*], space=0
dcl_resource_texture2d (float,float,float,float) t2[0:7], space=1
dcl_input_ps linear v0.xyzw
dcl_output o0.xyzw
dcl_temps 2
sample r0.xyzw, v0.xyxx, t0[0].xyzw, s0[5]
add r0.xyzw, r0.xyzw, v0.xyzw
ftou r1.x, r0.x
sample r1.xyzw, r0.xyxx, t2[r1.x + 0].xyzw, s0[5]
add r0.xyzw, r0.xyzw, r1.xyzw
ftou r1.xyz, r0.zyxz
imul null, r1.yz, r1.zzyz, l(0, 15, 3, 0)
iadd r1.y, r1.z, r1.y
iadd r1.x, r1.x, r1.y
sample r1.xyzw, r0.xyxx, t1[r1.x + 10].xyzw, s0[5]
add o0.xyzw, r0.xyzw, r1.xyzw
ret
// Approximately 12 instruction slots used

Cada intervalo de recursos del sombreador ahora tiene un identificador (un nombre) en el código de bytes del sombreador. Por ejemplo, la matriz de texturas tex1 se convierte en "t1" en el código de bytes del sombreador. Proporcionar identificadores únicos a cada intervalo de recursos permite dos cosas:

  • Identifique de forma inequívoca qué intervalo de recursos (consulte dcl_resource_texture2d) se está indexando en una instrucción (consulte la instrucción de ejemplo).
  • Adjunte el conjunto de atributos a la declaración, por ejemplo, tipo de elemento, tamaño de intervalo, modo de operación de trama, etc.

Tenga en cuenta que el identificador del intervalo no está relacionado con la declaración de límite inferior HLSL.

El orden de los enlaces de recursos de reflexión y las instrucciones de declaración del sombreador es el mismo para ayudar a identificar la correspondencia entre variables HLSL e identificadores de código de bytes.

Cada instrucción de declaración de SM5.1 usa un operando 3D para definir: identificador de intervalo, límites inferiores y superiores. Se emite un token adicional para especificar el espacio de registro. También se pueden emitir otros tokens para transmitir propiedades adicionales del intervalo, por ejemplo, instrucciones de declaración de búfer cbuffer o búfer estructurado emite el tamaño del cbuffer o la estructura. Los detalles exactos de la codificación se pueden encontrar en d3d12TokenizedProgramFormat.h y D3D10ShaderBinary::CShaderCodeParser.

Las instrucciones de SM5.1 no emitirán información adicional del operando de recursos como parte de la instrucción (como en SM5.0). Esta información ahora se mueve a las instrucciones de declaración. En SM5.0, las instrucciones para indexar los recursos requieren atributos de recursos que se describen en tokens de código de operación extendidos, ya que la indexación ofuscó la asociación a la declaración. En SM5.1, cada identificador (como "t1") está asociado de forma inequívoca a una única declaración que describe la información de recursos necesaria. Por lo tanto, los tokens de código de operación extendidos que se usan en instrucciones para describir la información de recursos ya no se emiten.

En instrucciones que no son de declaración, un operando de recursos para samplers, SRV y UAV es un operando 2D. El primer índice es una constante literal que especifica el identificador de intervalo. El segundo índice representa el valor linealizado del índice. El valor se calcula con respecto al principio del espacio de registro correspondiente (no relativo al principio del intervalo lógico) para correlacionar mejor con la firma raíz y reducir la carga del compilador del controlador para ajustar el índice.

Un operando de recursos para CBV es un operando 3D: identificador literal del intervalo, índice del cbuffer, desplazamiento en la instancia concreta de cbuffer.

Características del sombreador HLSL 5.1 para Direct3D 12

Modelo de sombreador 5.1