Compartir a través de


Contadores de salida de flujo

La salida del flujo es la capacidad de la GPU de escribir vértices en un búfer. Los contadores de salida de flujo supervisan el progreso.

Diferencias en los contadores de flujo de Direct3D 11 a Direct3D 12

Como parte del proceso de salida del flujo, la GPU debe conocer la ubicación actual en el búfer en el que está escribiendo. En Direct3D 11, el controlador asigna la memoria para almacenar esta ubicación y la única manera de que las aplicaciones manipulen este valor es a través del método SOSetTargets . En Direct3D 12, las aplicaciones asignan memoria para almacenar esta ubicación actual. No hay ninguna manera especial de manipular este valor y las aplicaciones pueden leer y escribir el valor con la CPU o gpu.

BufferFilledSize

La aplicación es responsable de asignar almacenamiento para una cantidad de 32 bits denominada BufferFilledSize. Contiene el número de bytes de datos en el búfer de salida de flujo. Este almacenamiento se puede colocar en el mismo recurso, o en otro, que el que contiene los datos de salida de flujo. La GPU tiene acceso a este valor en la fase de salida de flujo para determinar dónde anexar nuevos datos de vértices en el búfer. Además, la GPU tiene acceso a este valor para determinar cuándo se ha producido el desbordamiento.

Consulte la estructura D3D12_STREAM_OUTPUT_DESC.

La capa de depuración validará lo siguiente en ID3D12GraphicsCommandList::SOSetTargets:

  • BufferFilledSize se encuentra en el intervalo implícito por {OffsetInBytes, SizeInBytes}, si se especifica un recurso que no es NULL.
  • BufferFilledSizeOffsetInBytes es un múltiplo de 4.
  • BufferFilledSizeOffsetInBytes está dentro del intervalo del recurso contenedor.
  • El recurso especificado es un búfer.

El tiempo de ejecución no validará el tipo de montón asociado al búfer de salida de flujo, ya que la salida del flujo se admite en todos los tipos de montón.

Las firmas raíz deben especificar si se usará la salida del flujo mediante las marcas D3D12_ROOT_SIGNATURE_FLAGS .

D3D12_ROOT_SIGNATURE_FLAG_ALLOW_STREAM_OUTPUT se pueden especificar para las firmas raíz creadas en HLSL, de forma similar a cómo se especifican las otras marcas.

CreateGraphicsPipelineState producirá un error si el sombreador de geometría contiene la salida de la secuencia, pero la firma raíz no tiene establecida la marca D3D12_ROOT_SIGNATURE_FLAG_ALLOW_STREAM_OUTPUT.

Cuando se usa un recurso como destino de salida de flujo, los recursos usados deben estar en estado D3D12_RESOURCE_STATE_STREAM_OUT. Esto se aplica tanto a los datos de vértices como a BufferFilledSize (que pueden estar en los mismos recursos o independientes).

No hay API especiales para establecer desplazamientos del búfer de salida de flujo porque las aplicaciones pueden escribir en BufferFilledSize con la CPU o GPU directamente.

Contadores y consultas