ID3D12Device1::CreatePipelineLibrary 메서드(d3d12.h)
캐시된 파이프라인 라이브러리를 만듭니다. 데이터를 함께 공유해야 하는 PSO(파이프라인 상태 개체)의 경우 데이터를 직렬화하기 전에 라이브러리로 그룹화하면 메타데이터로 인한 오버헤드가 줄어들고 중복되거나 중복된 데이터가 디스크에 기록되지 않도록 방지할 수 있습니다.
D3D12_FEATURE_SHADER_CACHE 및 D3D12_FEATURE_DATA_SHADER_CACHEID3D12Device::CheckFeatureSupport사용하여 ID3D12PipelineLibrary 지원을 쿼리할 수 있습니다. D3D12_FEATURE_DATA_SHADER_CACHEFlags 멤버에 플래그 D3D12_SHADER_CACHE_SUPPORT_LIBRARY포함된 경우 ID3D12PipelineLibrary 인터페이스가 지원됩니다. 그렇지 않은 경우 이 함수가 호출될 때 DXGI_ERROR_NOT_SUPPORTED 항상 반환됩니다.
통사론
HRESULT CreatePipelineLibrary(
const void *pLibraryBlob,
SIZE_T BlobLength,
REFIID riid,
void **ppPipelineLibrary
);
매개 변수
pLibraryBlob
형식: [in] const void*
입력 라이브러리 Blob이 비어 있으면 라이브러리의 초기 콘텐츠가 비어 있습니다. 입력 라이브러리 Blob이 비어 있지 않으면 무결성에 대한 유효성이 검사되고 구문 분석되며 포인터가 저장됩니다. 이 메서드에 대한 입력으로 제공된 포인터는 반환된 개체의 수명 동안 유효한 상태를 유지해야 합니다. 효율성상의 이유로 데이터가 복사되지 않습니다.
BlobLength
형식: SIZE_T
pLibraryBlob
riid
형식: REFIID
ID3D12PipelineLibrary 개체에 대한 고유한 REFIID를 지정합니다. 일반적으로 매크로 IID_PPV_ARGS(&Library)
사용하여 이 매개 변수와 다음 매개 변수를 설정합니다. 여기서 Library 개체의 이름입니다.
ppPipelineLibrary
형식: [out] void**
만든 라이브러리에 대한 포인터를 반환합니다.
반환 값
형식: HRESULT
함수가 성공하면 S_OK반환합니다. 그렇지 않으면 blob이 손상되었거나 인식할 수 없는 경우 E_INVALIDARG, 제공된 데이터가 이전 드라이버 또는 런타임에서 제공된 경우 D3D12_ERROR_DRIVER_VERSION_MISMATCH, 데이터가 다른 하드웨어에서 온 경우 D3D12_ERROR_ADAPTER_NOT_FOUND 등 HRESULT오류 코드반환합니다.
pPipelineLibrary 대한 nullptr
전달하면 런타임은 여전히 Blob의 유효성 검사를 수행하지만 실제 라이브러리를 만들지 않고 라이브러리가 만들어졌으면 S_FALSE 반환합니다.
또한 이 기능에는 업데이트된 드라이버가 필요하며 이전 드라이버에서 사용하려고 하면 DXGI_ERROR_UNSUPPORTED 반환됩니다.
발언
파이프라인 라이브러리를 사용하면 다음 작업을 수행할 수 있습니다.
- 기존 라이브러리 개체에 PSO(파이프라인 상태 개체) 추가(StorePipeline참조).
- PSO 라이브러리를 디스크 스토리지의 연속 메모리 블록으로 직렬화합니다(직렬화
참조). - 영구 스토리지에서 PSO 라이브러리를 직렬화 해제합니다(CreatePipelineLibrary처리됨).
- 라이브러리에서 개별 PSO를 검색합니다(LoadComputePipeline 및
LoadGraphicsPipeline 참조).
파이프라인 라이브러리의 수명 주기에는 동일한 하위 구성 요소가 있는 PSO 간에 중복이 없습니다.
반환된 인터페이스를 다시 계산하기만 하면서 제공된 포인터의 수명을 관리하는 데 권장되는 솔루션은 ID3D12Object::SetPrivateDataInterface활용하고, IUnknown구현하고 ref-count가 0에 도달하면 메모리를 해제하는 개체를 사용하는 것입니다.
스레드 안전성
파이프라인 라이브러리는 스레드로부터 안전하게 사용할 수 있습니다. 및 필요에 따라 내부적으로 동기화됩니다. 한 가지 예외를 제외하고, 동일한 PSO를 로드하는 여러 스레드(LoadComputePipeline통해, LoadGraphicsPipeline또는 LoadPipeline)는 자체적으로 동기화되어야 합니다. 이 작업은 라이브러리 내에서 해당 파이프라인의 상태를 스레드로부터 안전하지 않은 방식으로 수정할 수 있기 때문에 동기화해야 합니다.
예제
Direct3D 12 파이프라인 상태 캐시 샘플참조하세요.
요구 사항
요구 | 값 |
---|---|
대상 플랫폼 | Windows |
헤더 | d3d12.h |
라이브러리 | D3d12.lib |
DLL | D3d12.dll |