CASO(교차 어댑터 리소스 스캔 아웃) 지원
CASO 이전 성능(2개 복사 경로)
Windows 8.1(WDDM 1.3)부터 D3D9 및 DXGI 애플리케이션은 하이브리드 시스템과 같은 다중 어댑터 구성에서 어댑터 간 프레젠테이션 지원을 사용할 수 있었습니다. 이 지원을 통해 렌더링은 렌더링 어댑터(일반적으로 불연속 GPU)에서 수행된 다음, 디스플레이 어댑터(일반적으로 통합 GPU)에 콘텐츠를 가져와 디스플레이로 스캔하기 위해 두 개의 복사본을 수행합니다.
- 복사 1은 렌더링 어댑터 리소스에서 어댑터 간 리소스로 입니다.
- 복사 2는 어댑터 간 리소스에서 디스플레이 어댑터 리소스로 입니다.
이러한 복사본은 특히 짧은 대기 시간에 최적화된 앱의 경우 앱의 성능을 제한할 수 있습니다.
CASO를 사용하여 대칭 이동 프레젠테이션 모델 최적화(한 번의 복사 경로)
Windows Server 2022(WDDM 2.9) 이상 드라이버는 적절한 어댑터 간 리소스 계층에 대한 지원을 선언할 수 있으므로 시스템의 프레젠테이션 스택이 어댑터 간 프레젠테이션을 최적화할 수 있습니다. 드라이버는 디바이스 구성에 관계없이 자체 어댑터 기능을 기반으로 이 기능에 대한 지원을 선언해야 합니다. 따라서 기능 값이 적용 가능한 모든 하드웨어 구성에서 크기가 조정됩니다. 이 크기 조정에는 다른 외부 GPU의 동적 연결이 있는 단일 GPU 디바이스가 포함되지만 이에 국한되지는 않습니다.
디스플레이 어댑터가 CASO를 지원하는 경우 시스템은 렌더링 어댑터 표면에서 크로스 어댑터 표면으로의 첫 번째 복사본만 수행한 다음, 교차 어댑터 표면에서 직접 스캔합니다. 이 기능을 사용하면 처리, 대역폭, 전원 및 대기 시간이 줄어듭니다.
CASO 기능은 대칭 이동 프레젠테이션 모델의 DXGI 런타임에 대해 구현됩니다.
CASO에 대한 DDI 변경 및 추가
어댑터 간 리소스에 대한 계층 지원 표시
DXGI는 어댑터 간 리소스에 대한 세 가지 지원 계층을 구현합니다.
- 크로스 어댑터 리소스 간 복사(최하위 계층)
- 어댑터 간 리소스에서 텍스트 변환
- 어댑터 간 리소스 검색(가장 높은 계층)
각 상위 지원 계층은 아래 계층의 지원을 보장해야 합니다. 예를 들어 어댑터 간 리소스의 검색에 대한 지원을 요청하려면 드라이버에서 텍스처링 및 복사도 지원해야 합니다.
드라이버는 DXGK_DRIVERCAPS 다음 DXGK_VIDMMCAPS 비트 필드 값을 설정하여 각 계층에 대한 지원을 선언합니다. MemoryManagementCaps:
서비스 계층 | 계층 의미 | DXGK_VIDMMCAPS 값 |
---|---|---|
계층 1 | 지원 복사: 어댑터 간 리소스에 복사 | CrossAdapterResource(D3DKMT_WDDM_1_3_CAPSSupportCrossAdapterResource 비트를 통해 그래픽 커널에 의해 사용자 모드에 노출됨 |
계층 2 | 텍스처 지원: 어댑터 간 리소스의 텍스처) | CrossAdapterResourceTexture (셰이더 리소스 뷰, 순서가 지정되지 않은 액세스 뷰 및 렌더링 대상에 대한 지원 포함) |
계층 3 | CASO 지원: 어댑터 간 리소스에서 검사 | CrossAdapterResourceScanout |
그래픽 커널은 세 계층에 대한 슈퍼 세트 방식으로 지원을 나타내지 않으면 어댑터 시작에 실패합니다. 예를 들어 CrossAdapterResourceTexture가 설정된 경우 CrossAdapterResource를 설정해야 합니다.
계층 1 지원 요구 사항
어댑터 간 리소스는 WDDM 1.3 계층 1 복사 지원에 사용되는 것과 동일하게 정의됩니다.
계층 2 지원 요구 사항
요구 사항은 D3D12 사용자 모드 드라이버 CrossAdapterRowMajorTextureSupported 기능(cap)과 유사합니다. 즉, 디바이스는 셰이더 리소스 뷰, 순서가 지정되지 않은 액세스 보기 및 어댑터 간 행 주 텍스처의 렌더링 대상 뷰를 지원합니다. 그러나 D3D12의 CrossAdapterRowMajorTextureSupported는 모든 관련 텍스처 형식을 지원해야 하지만 이 계층 2 상한은 최소한 계층 3 지원 요구 사항에 나열된 DisplayScanOut 형식에 대한 지원만 필요합니다.
D3D12의 상한은 이 계층 2 상한의 상위 집합이므로 D3D12CreateDevice는 CrossAdapterRowMajorTextureSupported 상한이 설정된 경우 커널 드라이버의 CrossAdapterResourceTexture 상한이 설정되었는지 확인하고, 그렇지 않은 경우 디바이스 생성에 실패합니다.
계층 3 지원 요구 사항
시스템은 다음 최소 사양의 어댑터 간 리소스에 대해 DXGK_FLIPCAPS 드라이버에서 선언한 대로 지원되는 대칭 이동 기능을 수행할 수 있어야 합니다.
- 1920 x 1080 이하의 교차 어댑터 기본 버퍼 크기
- 지원되는 DisplayScanOut 형식의 버퍼 픽셀 형식입니다. Windows 10 버전 20H1을 기준으로 이러한 형식은 다음과 같습니다.
- DXGI_FORMAT_R16G16B16A16_FLOAT
- DXGI_FORMAT_R10G10B10A2_UNORM
- DXGI_FORMAT_R8G8B8A8_UNORM
- DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
- DXGI_FORMAT_B8G8R8A8_UNORM
- DXGI_FORMAT_B8G8R8A8_UNORM_SRGB
드라이버가 더 많은 텍스처 형식의 어댑터 간 리소스 검사를 지원하는 경우 계층 지원 요구 사항에 따라 해당 형식의 텍스처링도 지원해야 합니다.
참고
DXGI 런타임은 드라이버에 CrossAdapterResourceScanout 지원을 쿼리합니다. 지원되는 경우 프레젠테이션 스택은 한 번의 복사 경로로 내려갑니다. 따라서 CrossAdapterResourceScanout 에 대한 지원을 선언하는 드라이버는 DXGKDDI_CHECKMULTIPLANEOVERLAYSUPPORT3 DDI를 지원해야 합니다. 또한 위의 최소 사양의 교차 어댑터 기본에 대한 모든 관련 프레젠테이션 관련 DDI도 지원해야 합니다. 몇 가지 예는 pfnCreateResource, pfnCheckMultiplaneOverlaySupport 및 pfnPresentMultiplaneOverlay/pfnPresent1입니다. 자세한 내용은 다중 평면 오버레이 지원을 참조하세요. CASO에서 벗어나는 방법에 대한 자세한 내용은 프레젠테이션 최적화를 위한 드라이버 DDI를 참조하세요.
이러한 두 계층 모두 확인을 위한 HLK 테스트가 함께 제공됩니다 .
DXGKDDI_CHECKMULTIPLANEOVERLAYSUPPORT3 StaticCheck 플래그 지원
StaticCheck 플래그가 WDDM 3.0의 DXGK_MULTIPLANE_OVERLAY_FLAGS 추가되었습니다. 이 플래그는 CASO 지원에 DXGKDDI_CHECKMULTIPLANEOVERLAYSUPPORT3 DDI의 사용을 확장합니다. 이 플래그를 사용하면 DXGKDDI_CHECKMULTIPLANEOVERLAYSUPPORT3 드라이버를 쿼리하여 StaticCheck 플래그로 표시된 평면이 스캔 아웃할 수 있는지 여부를 확인할 수 있습니다. 이 호출은 일회성 호출이며 실제 프레젠테이션 동작에 영향을 주지 않아야 합니다. 따라서 DXGKDDI_CHECKMULTIPLANEOVERLAYSUPPORT3 현재 정보의 캐싱을 수행하는 드라이버는 StaticCheck 평면을 사용하여 DDI 호출의 정보를 포함하면 안 됩니다. 독립 실행형 또는 정적 방식으로 지원 결정을 수행해야 합니다.
StaticCheck 플래그가 설정된 DXGKDDI_CHECKMULTIPLANEOVERLAYSUPPORT3 다음으로 보장됩니다.
- 정확히 하나의 평면이 플래그로 표시되어 있습니다.
- PostComposition 평면 정보를 포함하지 않음
StaticCheck 플래그가 설정된 DXGKDDI_CHECKMULTIPLANEOVERLAYSUPPORT3 대한 호출은 현재 하드웨어 구성에 대해 CASO가 지원되는지 여부를 확인하기 위해 스왑 체인을 만드는 동안 또는 ResizeBuffers와 같이 버퍼를 만드는 동안 DXGI의 앱 프로세스에서 사용됩니다.
HybridIntegrated 특수 사례
HybridIntegrated 드라이버는 계층 3 검색을 지원하도록 설계되었습니다. WDDM 3.0부터 HybridIntegrated 드라이버는 CrossAdapterResourceScanout에 대한 지원을 선언해야 합니다. HLK 테스트는 이 요구 사항을 확인합니다.
기존 하이브리드 한도는 향후 사용 중단으로 간주될 수 있습니다. 따라서 앞으로 이 공간에서 더 큰 유연성을 발전할 수 있도록 CrossAdapterResourceScanout 상한이 분리되는 것이 중요합니다. 따라서 HybridIntegrated 가 아닌 드라이버도 어댑터 간 지원 계층을 적절하게 설정할 수 있습니다.
그래픽 커널 변경 내용
WDDM 2.9부터 어댑터 간 리소스 지원을 위해 다음과 같은 추가/변경이 수행되었습니다.
KMTQAITYPE_CROSSADAPTERRESOURCE_SUPPORT 값이 기존 KMTQUERYADAPTERINFOTYPE 열거형에 추가되었습니다.
D3DKMT_CROSSADAPTERRESOURCE_SUPPORT 구조체 및 D3DKMT_CROSSADAPTERRESOURCE_SUPPORT_TIER 열거형이 추가되었습니다.
사용법 예제:
D3DKMT_CROSSADAPTERRESOURCE_SUPPORT KernelSupport = {};
D3DKMT_QUERYADAPTERINFO QueryAdapterInfo;
QueryAdapterInfo.hAdapter = m_hAdapter;
QueryAdapterInfo.Type = KMTQAITYPE_CROSSADAPTERRESOURCE_SUPPORT;
QueryAdapterInfo.pPrivateDriverData = &KernelSupport;
QueryAdapterInfo.PrivateDriverDataSize = sizeof( KernelSupport );
VERIFY_SUCCEEDED(D3DKMTQueryAdapterInfo(&QueryAdapterInfo));
// Use KernelSupport.SupportTier as appropriate
프레젠테이션 최적화를 위한 드라이버 DDI
드라이버는 다음 DPI를 사용하여 어댑터 간 스캔 아웃이 지원되는지 여부를 나타냅니다.
DXGK_VIDMMCAPS::CrossAdapterResourceScanout 상한
시스템은 이 한도를 일찍 쿼리하여 드라이버가 CASO 기능을 지원하는지 확인합니다.
드라이버가 CASO를 지원하는 경우 DXGI는 한 번의 복사 CASO 경로를 계속 사용합니다. 그렇지 않으면 DXGI는 두 개의 복사 경로로 돌아갑니다.
-
한 번의 복사 CASO 경로에서 DXGI는 pfnCreateResource를 통해 디스플레이 어댑터에 크로스 어댑터 리소스를 기본으로 만듭니다. 드라이버는 해당 리소스에서 검색할 수 있는지 여부를 리소스 속성에 따라 평가해야 합니다.
드라이버가 리소스 속성에 따라 검색을 지원하는 경우 DXGI는 한 번의 복사본 CASO 경로를 계속 사용합니다. 그렇지 않으면 드라이버는 DXGI_DDI_PRIMARY_DRIVER_FLAG_NO_SCANOUT 반환하여 검색을 옵트아웃해야 합니다. 이 경우 DXGI는 두 개의 복사 경로로 돌아갑니다. 이 대체는 리소스 속성이 계층 3 지원 요구 사항에 나열된 최소 요구 사항을 초과하는 경우에만 발생합니다.
pfnCheckMultiplaneOverlaySupport Ddi
현재 동작에 따라 DWM(데스크톱 Windows 관리자)은 디스플레이 드라이버의 pfnCheckMultiplaneOverlaySupport DDI를 호출하여 기본 표면을 검사할 수 있는지 여부를 정확하게 확인합니다. 드라이버에서 지원되는 경우 검색이 발생합니다. 그렇지 않으면 DWM이 DWM 컴퍼지션 모드로 돌아갑니다.
DWM으로 구성된 선물은 2개 복사 경로를 통해 iFlip(Independent Flip )보다 덜 바람직할 수 있습니다. 또는 1부 CASO 경로를 통한 iFlip입니다. 따라서 회전 또는 여러 디스플레이와 같이 프레젠테이션 대역폭이 제한된 일반적인 디스플레이 시나리오가 있을 수 있습니다. 드라이버가 DWM에서 pfnCheckMultiplaneOverlaySupport 지원에 지속적으로 실패할 수 있으므로 두 복사 경로보다 환경이 좋지 않을 수 있습니다.
부정적인 대체 환경을 완화하기 위해 DXGI는 버퍼를 만드는 동안 pfnCheckMultiplaneOverlaySupport를 StaticCheck 플래그로 표시된 평면으로 사용하여 버퍼를 만드는 동안 pfnCheckMultiplaneOverlaySupport를 호출하여 기존의 알려진 대역폭 특성을 고려할 때 드라이버가 스캔 아웃을 수행할 수 있는지 높은 정확도로 확인합니다. 지원되는 경우 DXGI는 한 번의 복사 CASO 경로를 계속 사용합니다. 그렇지 않으면 두 개의 복사 경로로 돌아갑니다.
HLK 테스트
해당 HLK 테스트를 사용하는 WDDM 3.0 HLK 요구 사항 및 기능이 추가되었습니다. 이 요구 사항은 드라이버가 선언할 수 있는 DXGK_VIDMMCAPS 지원과 관련이 있습니다. 특히 CrossAdapterResourceTexture 및 CrossAdapterResourceScanout입니다.
CrossAdapterResourceTexture
교차 어댑터 리소스에 대한 SRV(셰이더 리소스 뷰) 작업을 확인하기 위해 HLK 테스트가 추가되었습니다.
D3D12의 경우 Device.Graphics.AdapterRender.D3D12Core.CoreRequirement 테스트에 대한 기존 HLK "D3D12 - 교차 어댑터 리소스 DX12"가 에 추가되었습니다. 특히 CrossAdapterResource::CrossAdapterTextureSRV 테스트 사례입니다.
이 HLK 테스트 사례에 추가된 것은 CrossAdapterResourceTexture KMD 캡과 D3D12 UMD CrossAdapterRowMajorTextureSupported 상한 간의 상위 집합 관계를 확인하는 것입니다. 마찬가지로 D3D12CreateDevice 에 논리가 추가되어 UMD 상한이 설정된 경우 커널 계층 2 드라이버 상한도 설정해야 하며, 그렇지 않은 경우 디바이스 만들기에 실패합니다.
D3D11의 경우 위의 테스트 사례가 Device.Graphics.WDDM30.Render.CrossAdapterScanOut에 대한 HLK 테스트에 추가되었습니다. 특히 D3DConf_11_CrossAdapterResource::CrossAdapterResourceSRV입니다.
어댑터 간 리소스 검사
다음 HLK 테스트가 추가되었습니다.
Device.Graphics.WDDM30.Render.CrossAdapterScanOut
- 드라이버가 DXGI_DDI_PRIMARY_DRIVER_FLAG_NO_SCANOUT 플래그를 통해 검사 아웃 동작을 옵트아웃하지 않고도 어댑터 간 기본 리소스를 성공적으로 만들 수 있는지 확인하는 HLK 테스트입니다.
- 이러한 드라이버가 DXGKDDI_CHECKMULTIPLANEOVERLAYSUPPORT3 DDI를 지원하는지 확인하기 위한 HLK 테스트입니다.
- 테스터가 다음을 수동으로 확인하기 위한 수동 HLK 테스트:
- 스캔된 교차 어댑터 표면에는 시각적 손상/아티팩트 또는 예기치 않은 손상이 없습니다.
- 교차 어댑터 표면은 사전 내부 변환 또는 복사본 없이 직접 스캔됩니다.
또한 이러한 엔드 투 엔드 테스트는 어댑터 간 리소스에 대해 CheckMultiplaneOverlaySupport 및 Present DDI가 지원되는지 자연스럽게 확인합니다. 수동 테스트 앱에는 고해상도 및 높은 새로 고침 속도 모니터와 같은 몇 가지 특정 하드웨어 요구 사항이 있습니다. 자세한 내용은 테스트와 함께 제공되는 참조 문서를 참조하세요.
Device.Graphics.WDDM30.Render.CoreRequirement
- HybridIntegrated 상한을 선언하는 드라이버가 CrossAdapterResourceScanout 상한도 선언하는지 확인하기 위한 HLK 테스트입니다.
System.Fundamentals.Graphics.HybridGraphics.MultiGPU
- OEM이 엔드 투 엔드 시스템 유효성 검사의 일환으로 DXGI의 원카피 경로를 실행할 수 있는 하이브리드 디바이스에서 이러한 테스트를 실행할 수 있도록 하는 시스템 기반 HLK 테스트입니다.