dcl_interface_dynamicindexed (sm5 - asm)

Declarar punteros de tabla de función (interfaces).

dcl_interface_dynamicindexed fp#[arraySize][numCallSites] = {ft#, ft#, ...}
Elemento Descripción
Fp #
[in] Punteros de tabla de función.

Comentarios

Cada interfaz debe enlazarse desde la API antes de que se pueda usar el sombreador. El enlace proporciona una referencia a una de las tablas de funciones para que se puedan rellenar las ranuras de método. El compilador no generará punteros para objetos sin referencia.

Un puntero de tabla de funciones tiene un conjunto completo de ranuras de método para evitar el nivel adicional de direccionamiento indirecto que requeriría una representación de puntero a puntero a vtable de C++. Esto también requeriría que estos punteros sean de 5 tuplas. En el modelo de inserción virtual HLSL, siempre se sabe qué variable o entrada global se usa para una llamada para que podamos configurar tablas por objeto raíz.

Las declaraciones de puntero de función indican qué tablas de funciones son legales para usarlas. Esto también permite la derivación de la información de correlación del método.

El primer [] de una declaración de interfaz es el tamaño de la matriz. Si se usa la indexación dinámica, la declaración indicará que se muestra. Una matriz de punteros de interfaz también se puede indexar estáticamente, no es necesario que las matrices de punteros de interfaz significan la indexación dinámica.

La numeración de punteros de interfaz comienza en 0 para la primera declaración y, posteriormente, tiene en cuenta el tamaño de matriz, por lo que el primer puntero después de una matriz de cuatro entradas fp0[4][1] sería fp4[][].

El segundo [] de una declaración de interfaz es el número de sitios de llamada, que deben coincidir con el número de cuerpos de cada tabla a la que se hace referencia en la declaración.

No hay límites para cuántas opciones de tabla de funciones (ft#) se pueden enumerar en una declaración de interfaz.

Una tabla de funciones determinada (ft#) puede aparecer más de una vez en una o varias declaraciones de interfaz.

Restricciones

  • El número de sitios de objeto de un sombreador, que es la suma de todas las declaraciones fp# de sus declaraciones [arraySize], no debe ser superior a 253. Este número corresponde al número de punteros que pueden estar presentes. El tiempo de ejecución aplica este límite de 253 para mantener un límite en el tamaño de la DDI para comunicar estos datos de puntero.

  • El número de sitios de llamada de un sombreador, que es la suma de todas las instrucciones fcall del número de destinos de rama potencial, no debe ser superior a 4096.

    Por ejemplo, una llamada fcall que usa un índice estático para la primera dimensión fp[][] cuenta como una:

    fcall fp0[0][0] // +1

    Una llamada fcall que usa un índice dinámico cuenta como el número de elementos de la matriz (primero [] de dcl_interface):

    dcl_interface_dynamicindexed fp1[2][1] = {ft2, ft3, ft4} ...

    fcall fp1[r0.z + 0][1] // +2

    Este límite ayuda a algunas implementaciones a ajustar fácilmente tablas de selecciones de cuerpo de función en el almacenamiento similar al búfer de constantes.

Esta instrucción se aplica a las siguientes fases del sombreador:

Vértice Casco Domain Geometría Píxel Compute
x x x x x x

Modelo de sombreador mínimo

Esta instrucción se admite en los siguientes modelos de sombreador:

Modelo de sombreador Compatible
Modelo de sombreador 5
Modelo de sombreador 4.1 no
Modelo de sombreador 4 no
Modelo de sombreador 3 (DirectX HLSL) no
Modelo de sombreador 2 (DirectX HLSL) no
Modelo de sombreador 1 (DirectX HLSL) no

cs_4_0 y cs_4_1 admiten esta instrucción para UAV y SRV.

Ensamblado del modelo de sombreador 5 (DirectX HLSL)