Método ID3D10Device::UpdateSubresource (d3d10.h)

La CPU copia los datos de la memoria en un subrecurso creado en memoria no asignable. Vea Notas.

Sintaxis

void UpdateSubresource(
  [in] ID3D10Resource  *pDstResource,
  [in] UINT            DstSubresource,
  [in] const D3D10_BOX *pDstBox,
  [in] const void      *pSrcData,
  [in] UINT            SrcRowPitch,
  [in] UINT            SrcDepthPitch
);

Parámetros

[in] pDstResource

Tipo: ID3D10Resource*

Puntero al recurso de destino (vea ID3D10Resource Interface).

[in] DstSubresource

Tipo: UINT

Índice de base cero, que identifica el subrecurso de destino. Consulte D3D10CalcSubresource para obtener más detalles.

[in] pDstBox

Tipo: const D3D10_BOX*

Cuadro en el que se define la parte del subrecurso de destino en el que se copiarán los datos del recurso. Las coordenadas están en bytes para los búferes y en elementos de textura para texturas. Si es NULL, los datos se escriben en el subrecurso de destino sin desplazamiento. Las dimensiones del origen deben ajustarse al destino (consulte D3D10_BOX).

Un cuadro vacío da como resultado una operación sin operación. Un cuadro está vacío si el valor superior es mayor o igual que el valor inferior, o el valor izquierdo es mayor o igual que el valor derecho, o el valor frontal es mayor o igual que el valor posterior. Cuando el cuadro está vacío, UpdateSubresource no realiza una operación de actualización.

[in] pSrcData

Tipo: const void*

Puntero a los datos de origen en la memoria.

[in] SrcRowPitch

Tipo: UINT

Tamaño de una fila de los datos de origen.

[in] SrcDepthPitch

Tipo: UINT

Tamaño de un segmento de profundidad de los datos de origen.

Valor devuelto

None

Observaciones

Para un búfer de constantes de sombreador; establezca pDstBox en NULL. No es posible usar este método para actualizar parcialmente un búfer de constantes de sombreador.

Un recurso no se puede usar como destino si:

Cuando Se devuelve UpdateSubresource, la aplicación puede cambiar o incluso liberar los datos señalados por pSrcData porque el método ya ha copiado o quitado el contenido original.

El rendimiento de UpdateSubresource depende de si hay o no contención para el recurso de destino. Por ejemplo, la contención de un recurso de búfer de vértices se produce cuando la aplicación ejecuta una llamada a Draw y, posteriormente, llama a UpdateSubresource en el mismo búfer de vértices antes de que la GPU ejecute realmente la llamada a Draw.

  • Cuando haya contención para el recurso, UpdateSubresource realizará dos copias de los datos de origen. En primer lugar, la CPU copia los datos en un espacio de almacenamiento temporal accesible por el búfer de comandos. Esta copia se produce antes de que el método devuelva. A continuación, la GPU realiza una segunda copia para copiar los datos de origen en memoria no asignable. Esta segunda copia se produce de forma asincrónica porque se ejecuta mediante GPU cuando se vacía el búfer de comandos.
  • Cuando no hay ninguna contención de recursos, el comportamiento de UpdateSubresource depende del cual sea más rápido (desde la perspectiva de la CPU): copiar los datos en el búfer de comandos y, a continuación, hacer que se ejecute una segunda copia cuando se vacía el búfer de comandos o que la CPU copie los datos en la ubicación final del recurso. Esto depende de la arquitectura del sistema subyacente.
Para comprender mejor los parámetros de inclinación de fila de origen y de profundidad de origen, considere la siguiente ilustración de una textura de volumen 3D. Ilustración de una textura de volumen 3D

Cada bloque de este objeto visual representa un elemento de datos y el tamaño de cada elemento depende del formato del recurso. Por ejemplo, si el formato del recurso es DXGI_FORMAT_R32G32B32A32_FLOAT, el tamaño de cada elemento sería de 128 bits o 16 bytes. Esta textura de volumen 3D tiene un ancho de dos, un alto de tres y una profundidad de cuatro.

Para calcular el tono de fila de origen y el tono de profundidad de origen de un recurso determinado, use las siguientes fórmulas:

  • Tono de fila de origen = [tamaño de un elemento en bytes] * [número de elementos de una fila]
  • Tono de profundidad de origen = [Tono de fila de origen] * [número de filas (alto)]
En el caso de esta textura de volumen 3D de ejemplo donde el tamaño de cada elemento es de 16 bytes, las fórmulas son las siguientes:
  • Tono de fila de origen = 16 * 2 = 32
  • Inclinación de profundidad de origen = 16 * 2 * 3 = 96
En la ilustración siguiente se muestra el recurso tal y como se dispone en la memoria. Ilustración de una textura de volumen 3D en memoria

Por ejemplo, el siguiente fragmento de código muestra cómo especificar una región de destino en una textura 2D. Supongamos que la textura de destino es 512x512 y que la operación copiará los datos a los que apunta pData en [(120,100).". (200,220)] en la textura de destino. Suponga también que rowPitch se ha inicializado con el valor adecuado (como se explicó anteriormente). La parte delantera y posterior se establecen en 0 y 1, respectivamente, porque al tener delante igual a atrás, la caja está técnicamente vacía.


D3D10_BOX destRegion;
destRegion.left = 120;
destRegion.right = 200;
destRegion.top = 100;
destRegion.bottom = 220;
destRegion.front = 0;
destRegion.back = 1;

pd3dDevice->UpdateSubresource( pDestTexture, 0, &destRegion, pData, rowPitch, 0 );

El caso 1D es similar. En el fragmento de código siguiente se muestra cómo especificar una región de destino en una textura 1D. Use las mismas suposiciones que anteriormente, salvo que la textura tiene una longitud de 512.


D3D10_BOX destRegion;
destRegion.left = 120;
destRegion.right = 200;
destRegion.top = 0;
destRegion.bottom = 1;
destRegion.front = 0;
destRegion.back = 1;

pd3dDevice->UpdateSubresource( pDestTexture, 0, &destRegion, pData, rowPitch, 0 );

Diferencias entre Direct3D 10 y Direct3D 10.1:

Direct3D 10.1 permite usar recursos de galería de símbolos de profundidad como origen o destino.

Requisitos

   
Plataforma de destino Windows
Encabezado d3d10.h
Library D3D10.lib

Consulte también

ID3D10Dispositivo

Id3D10Resource (interfaz)