스트림 출력 카운터

스트림 출력은 꼭짓점을 버퍼에 쓰는 GPU 기능입니다. 스트림 출력 카운터는 진행 상태를 모니터링합니다.

Direct3D 11부터 Direct3D 12까지 스트림 카운터의 차이점

스트림 출력 프로세스의 일부로 GPU는 쓰고 있는 버퍼의 현재 위치를 알아야 합니다. Direct3D 11에서 이 위치를 저장할 메모리는 드라이버에 의해 할당되며 애플리케이션이 이 값을 조작하려면 SOSetTargets 메서드를 사용해야 합니다. Direct3D 12에서 앱은 이 현재 위치를 저장할 메모리를 할당합니다. 이 값을 조작할 수 있는 특별한 방법은 없으며, 앱은 CPU 또는 GPU를 통해 자유롭게 값을 읽고 쓸 수 있습니다.

BufferFilledSize

애플리케이션은 BufferFilledSize라는 32비트 수량에 대한 스토리지를 할당해야 합니다. 여기에는 스트림 출력 버퍼에 있는 데이터의 바이트 수가 포함됩니다. 이 스토리지는 스트림 출력 데이터를 포함하는 리소스와 동일하거나 다른 리소스에 배치할 수 있습니다. 스트림 출력 스테이지에서 GPU가 이 값에 액세스하여 버퍼에 새 꼭짓점 데이터를 추가할 위치를 확인합니다. GPU는 이 값에 액세스하여 오버플로가 발생한 시점도 확인합니다.

구조 D3D12_STREAM_OUTPUT_DESC 참조하세요.

디버그 계층은 ID3D12GraphicsCommandList::SOSetTargets에서 다음의 유효성을 검사합니다.

  • Null이 아닌 리소스를 지정하면 BufferFilledSize는 {OffsetInBytes, SizeInBytes}를 통해 암시된 범위에 포함됩니다.
  • BufferFilledSizeOffsetInBytes는 4의 배수입니다.
  • BufferFilledSizeOffsetInBytes는 포함하는 리소스의 범위 내에 있습니다.
  • 지정된 리소스는 버퍼입니다.

모든 힙 형식에서 스트림 출력이 지원되므로 런타임은 스트림 출력 버퍼와 연결된 힙 형식의 유효성을 검사하지 않습니다.

루트 서명은 D3D12_ROOT_SIGNATURE_FLAGS 플래그를 사용하여 스트림 출력을 사용할지 지정해야 합니다.

D3D12_ROOT_SIGNATURE_FLAG_ALLOW_STREAM_OUTPUT 다른 플래그를 지정하는 방법과 유사한 방식으로 HLSL로 작성된 루트 서명에 대해 지정할 수 있습니다.

기하 도형 셰이더에 스트림 출력이 포함되어 있지만 루트 서명에 D3D12_ROOT_SIGNATURE_FLAG_ALLOW_STREAM_OUTPUT 플래그가 설정되어 있지 않으면 CreateGraphicsPipelineState가 실패합니다.

리소스가 스트림 출력 대상으로 사용되는 경우 사용된 리소스는 D3D12_RESOURCE_STATE_STREAM_OUT 상태여야 합니다. 이 내용은 꼭짓점 데이터 및 BufferFilledSize(동일한 리소스 또는 개별 리소스에 있을 수 있음)에 둘 다 적용됩니다.

애플리케이션이 직접 CPU 또는 GPU를 사용하여 BufferFilledSize에 쓸 수 있으므로 스트림 출력 버퍼 오프셋을 설정할 수 있는 특별한 API는 없습니다.

카운터 및 쿼리