Compartir a través de


Contadores de UAV

Puede usar contadores unordered-access-view (UAV) para asociar un contador atómico de 32 bits con una vista de acceso desordenado (UAV).

Diferencias en los contadores UAV de Direct3D 11 a Direct3D 12

Las aplicaciones de Direct3D 12 y las aplicaciones de Direct3D 11 usan las mismas funciones de sombreador de lenguaje de sombreador de alto nivel (HLSL) para acceder a los contadores UAV.

  • IncrementCounter
  • DecrementCounter
  • Append
  • Consumo

Direct3D 12

En Direct3D 12, la aplicación asigna los valores de 32 bits, por lo que los valores de 32 bits se pueden leer y escribir mediante la CPU o la GPU, al igual que cualquier otro recurso de Direct3D 12.

Direct3D 11

Fuera de los sombreadores, con Direct3D 11 debe llamar a métodos de API para acceder a los contadores (por ejemplo, ID3D11DeviceContext::CopyStructureCount).

Uso de contadores UAV

La aplicación es responsable de asignar 32 bits de almacenamiento para contadores UAV. Este almacenamiento se puede asignar en un recurso diferente, ya que el que contiene datos accesibles a través del UAV.

Consulte CreateUnorderedAccessView, D3D12_BUFFER_UAV_FLAGS y D3D12_BUFFER_UAV.

Si se especifica pCounterResource en la llamada a CreateUnorderedAccessView, hay un contador asociado al UAV. En este caso:

  • StructureByteStride debe ser mayor que cero
  • El formato debe ser DXGI_FORMAT_UNKNOWN
  • No se debe establecer la marca RAW.
  • Ambos recursos deben ser búferes
  • CounterOffsetInBytes debe ser un múltiplo de 4 bytes
  • CounterOffsetInBytes debe estar dentro del intervalo del recurso de contador.
  • pDesc no puede ser NULL
  • pResource no puede ser NULL

Y tenga en cuenta los siguientes casos de uso:

  • Si no se especifica pCounterResource , CounterOffsetInBytes debe ser 0.
  • Si se establece la marca RAW, el formato debe ser DXGI_FORMAT_R32_TYPELESS y el recurso UAV debe ser un búfer.
  • Si no se establece pCounterResource , CounterOffsetInBytes debe ser 0.
  • Si la marca RAW no está establecida y StructureByteStride = 0, el formato debe ser un formato UAV válido.

Direct3D 12 quita la distinción entre UMV de anexión y contador (aunque la distinción sigue existiendo en el código de bytes HLSL).

El entorno de ejecución principal validará estas restricciones dentro de CreateUnorderedAccessView.

Durante Draw/Dispatch, el recurso de contador debe estar en el estado D3D12_RESOURCE_STATE_UNORDERED_ACCESS. Además, dentro de una sola llamada draw/Dispatch, no es válida para que una aplicación acceda a la misma ubicación de memoria de 32 bits a través de dos contadores UAV independientes. La capa de depuración emitirá errores si se detecta alguna de estas.

No hay métodos "SetUnorderedAccessViewCounterValue" o "CopyStructureCount" porque las aplicaciones simplemente pueden copiar datos en el valor del contador y desde ellos directamente.

Se admite la indexación dinámica de UAV con contadores.

Si un sombreador intenta acceder al contador de un UAV que no tiene un contador asociado, la capa de depuración emitirá una advertencia y se producirá un error de página de GPU que hará que se quite el dispositivo de las aplicaciones.

Los contadores UAV se admiten en todos los tipos de montón (valor predeterminado, carga, lectura diferida).