다음을 통해 공유


스레딩, 명령 목록 및 3D 파이프라인 지원

이 섹션은 Windows 7 이상 및 Windows Server 2008 R2 이상 버전의 Windows 운영 체제에만 적용됩니다.

사용자 모드 표시 드라이버는 Direct3D 버전 11 런타임이 드라이버의 GetCaps(D3D10_2) 함수를 호출할 때 지원하는 새로운 Direct3D 버전 11 기능(예: 스레딩, 명령 목록 및 3차원 파이프라인)을 나타냅니다. GetCaps(D3D10_2)는 드라이버가 D3D10DDIARG_OPENADAPTER 구조체의 pAdapterFuncs_2 멤버가 가리키는 D3D10_2DDI_ADAPTERFUNCS 구조체에서 제공하는 드라이버의 어댑터 관련 함수 중 하나입니다. 드라이버 초기화 중에 어댑터 관련 함수를 제공하는 방법에 대한 자세한 내용은 Direct3D 버전 11 DDI와의 통신 초기화를 참조하세요. GetCaps(D3D10_2) 함수가 호출되면 사용자 모드 표시 드라이버는 요청 유형(GetCaps(D3D10_2) 함수의 pData 매개 변수가 가리키는 D3D10_2DDIARG_GETCAPS 구조의 Type 멤버에 지정됨)에 따라 새로운 Direct3D 버전 11 기능을 제공합니다.

스레딩 및 명령 목록

Direct3D 버전 11 API에는 한 번에 하나의 스레드만 DDI에서 실행되도록 애플리케이션 스레드를 동기화할 수 있는 작업 모드가 필요합니다. Direct3D 버전 11 API에는 명령 목록의 소프트웨어 에뮬레이션을 사용하는 작업 모드도 필요합니다. 이러한 작업 모드는 이전 버전 DDI(예: Direct3D 버전 10 DDI)에서 필요하고 활용됩니다. 따라서 드라이버 작성기에 대한 개발 지원으로 이러한 동일한 작업 모드가 Direct3D 버전 11 DDI에 존재하도록 확장됩니다. 드라이버 작성기는 드라이버가 Direct3D 버전 11 DDI를 지원할 작업 모드를 결정할 수 있습니다.

모든 드라이버는 결국 모든 유형의 스레딩 작업을 완전히 지원해야 합니다(즉, 모든 드라이버는 결국 D3D11DDI_THREADING_CAPS 구조의 모든 스레딩 기능을 지원해야 합니다). 그러나 드라이버는 API 에뮬레이트 명령 목록을 요구하거나 드라이버에 대한 단일 스레드 작업 모드를 적용해야 할 수 있습니다. API는 API 디바이스를 만드는 동안 DDI 디바이스를 만들기 전에 드라이버의 스레딩 기능을 알고 있어야 합니다. 따라서 런타임은 드라이버의 GetCaps(D3D10_2) 어댑터 관련 함수를 호출할 때 D3D10_2DDIARG_GETCAPS Type 멤버가 D3D11DDICAPS_THREADING 설정된 드라이버의 스레딩 기능을 결정합니다. 드라이버는 드라이버의 스레딩 기능을 식별하는 D3D10_2DDIARG_GETCAPSpData 멤버의 D3D11DDI_THREADING_CAPS 구조체에 대한 포인터를 반환합니다. 명령 목록이 자유 스레드 모드에서 빌드되므로 드라이버가 명령 목록(D3D11DDICAPS_COMMANDLISTS_BUILD_2)도 지원하는 경우 드라이버는 자유 스레드 모드(D3D11DDICAPS_FREETHREADED)를 지원해야 합니다. 드라이버는 자유 스레드 모드 및 명령 목록을 지원하도록 옵트인해야 합니다. 애플리케이션은 애플리케이션 수준 CheckFeatureSupport 함수 및 D3D11_FEATURE_THREADING 상수를 사용하여 드라이버가 표시한 지원을 확인할 수 있습니다. 그러나 일부 애플리케이션은 API가 제공하는 지원으로 인해 신경 쓰지 않을 수 있습니다.

3D 파이프라인 수준

Direct3D 버전 11 DDI를 지원하는 드라이버는 Direct3D 버전 11 DDI의 모든 하드웨어 기능을 지원할 필요가 없습니다. 드라이버는 Direct3D 버전 10 DDI만 지원하는 하드웨어를 기반으로 Direct3D 버전 11 DDI의 새 스레딩 모델을 지원할 수 있습니다. Direct3D 버전 11 런타임은 런타임이 D3D11DDICAPS_3DPIPELINESUPPORT 설정된 D3D10_2DDIARG_GETCAPS 형식 멤버를 사용하여 드라이버의 GetCaps(D3D10_2) 함수를 호출할 때 드라이버의 최대 하드웨어 지원 수준을 결정합니다. 드라이버는 최대 하드웨어 지원 수준을 식별하는 D3D10_2DDIARG_GETCAPSpData 멤버의 D3D11DDI_3DPIPELINESUPPORT_CAPS 구조체에 대한 포인터를 반환합니다.

API는 DDI 버전만 API 기능 수준 지원의 기본 지표로 사용하지 않습니다. API를 사용하면 드라이버가 이 프로세스에 다시 공급할 수 있습니다. 런타임은 D3D11DDI_3DPIPELINELEVEL 값을 선택하고 D3D10DDIARG_CREATEDEVICE 구조체Flags 멤버의 일부로 드라이버의 CreateDevice(D3D10) 함수를 호출하여 디바이스를 만드는 동안 드라이버에 값을 다시 공급합니다.

드라이버가 Direct3D 버전 11 DDI에서 Direct3D 버전 11보다 작은 하드웨어 수준을 지원하는 경우 드라이버 작업에 약간의 파급 효과가 있습니다. 첫 번째는 Direct3D 버전 11 런타임이 새 Direct3D 버전 11 DDI 함수를 전혀 호출하지 않을 수 있다는 것입니다. 예를 들어 드라이버가 Direct3D 버전 11보다 작은 하드웨어 기능 수준을 지원하는 경우 Direct3D 버전 11 런타임은 새 셰이더 단계 DDI 함수(예: DsSetShader)를 호출하지 않습니다. 다른 DDI 함수는 기능 수준의 규칙을 따르고 Direct3D 버전 11 DDI가 더 높은 기능과 연결될 수 있다는 사실을 무시합니다. 예를 들어 Direct3D 버전 11 API에 대한 IAVertexInputSlots가 32이지만 Direct3D 버전 10 기능 수준은 16만 허용하므로 드라이버에서 예상해야 합니다.

사용되지 않거나 변환된 기능은 또 다른 흥미로운 측면을 제공합니다. 사용 중단은 이전 버전의 DDI 함수를 표현하는 기능을 지원해야 하므로 Direct3D 버전 11 DDI 수준에서는 사용 중단이 불가능합니다. 예를 들어 PIPELINESTATS의 Direct3D 11 API 버전은 항상 일정합니다. 그러나 Direct3D 10 기능 수준과 Direct3D 11 기능 수준의 D3D11_DDI_QUERY_DATA_PIPELINE_STATISTICS 다른 D3D10_DDI_QUERY_DATA_PIPELINE_STATISTICS 요청합니다. API가 텍스트 필터 크기를 더 이상 사용하지 않더라도 드라이버가 다른 항목에 대해 함수 테이블 항목을 다시 사용하는 것보다 DDI 함수 테이블 항목 전체를 더 쉽게 사용 중단하는 것이 더 쉽습니다.

Direct3D 버전 11 DDI를 지원하는 드라이버가 전체 Direct3D 버전 11 기능 수준을 지원하지 않더라도 확장 형식 인식 지원에 설명된 대로 드라이버는 "확장 형식 인식"을 옵트아웃할 수 없습니다. 드라이버는 Direct3D 버전 11 DDI를 지원하므로 드라이버는 다음 작업을 처리해야 합니다.

  • BGR 형식 지원

  • CheckFormatSupport 함수에 대한 호출에 올바르게 응답하여 XR_BIAS 지원을 위해 검사. 드라이버는 지원을 요청하거나 지원을 거부해야 합니다.

  • 완전히 형식화된 백 버퍼의 캐스팅 허용

또한 Direct3D 버전 11 API는 애플리케이션이 D3D11DDI_CREATEDEVICE_FLAG_SINGLETHREADED 플래그를 통해 여러 스레드를 사용하는지 여부를 드라이버에 알릴 수 있습니다. 드라이버의 CreateDevice(D3D10) 함수를 호출하여 디스플레이 디바이스를 만들 때 이 플래그가 D3D10DDIARG_CREATEDEVICE 구조의 Flags 멤버에 있는 경우 드라이버는 지연된 컨텍스트가 생성되지 않고 동시 생성이 발생하지 않으므로 드라이버가 동기화할 필요가 없음을 확인할 수 있습니다.