표시 가능한 표면 이전에는 일반적으로 동일한 속성을 가진 버퍼의 스왑 체인을 생성한 다음 순서대로 반복적으로 순환(플립)하여 화면에 표시하는 방식으로 제공되었습니다. 표시할 버퍼의 속성을 변경하려면 해당 스왑 체인을 폐기하고 모든 버퍼가 동일한 새 속성으로 업데이트된 새 체인을 만들어야 했습니다.
표시 가능한 표면 기능은 이러한 제한을 제거하는 새로운 운영 체제(OS) 동작을 추가합니다(단, 올바르게 작동하기 위해서는 드라이버 지원 필요). 특히 이 기능은 표시되는 버퍼가 다양한 속성을 가질 수 있으며, 어떤 순서로든 표시할 수 있음을 의미합니다.
표시 가능한 표면(및 유연한 표시) 기능 및 해당 API는 Windows 11(빌드 10.0.22000.194)에 도입되었습니다. 이 기능은 WDDM 3.0 드라이버부터 지원되는 드라이버에서 활성화되어 Direct3D 11의 표시 시나리오를 개선할 수 있습니다.
지원 확인 및 표시 가능한 표면 사용
시스템에서 표시 가능한 표면 기능을 사용할 수 있는지 여부를 확인하려면 ID3D11Device::CheckFeatureSupport를 호출합니다. D3D11_FEATURE::D3D11_FEATURE_DISPLAYABLE을 전달하고, D3D11_FEATURE_DATA_DISPLAYABLE 구조를 수신합니다.
ID3D11Device::CreateTexture2D API는 D3D11_RESOURCE_MISC_FLAG::D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE을 지원하며, pDesc 매개 변수의 CreateTexture2D에 전달하는 구조의 D3D11_TEXTURE2D_DESC::MiscFlags 멤버에 사용할 수 있습니다.
D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE 텍스처는 배열 크기가 1이고 밉 레벨이 1로 제한됩니다.
텍스처에 D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE 플래그를 사용하면 모든 활성 출력에 텍스처를 표시할 수 있습니다(동시에 여러 출력 포함). 시나리오에 따라 텍스처는 작성기(DWM)에 의해 사용되거나 스캔아웃되거나 파이프라인의 여러 부분에 바인딩될 수 있으며, 동시에 모두 사용될 수도 있습니다. 예를 들어, 카메라의 캡처 텍스처를 두 개의 디스플레이에 표시하고 세 번째 디스플레이에 썸네일을 표시할 수 있으며, 모두 동시에 추가 복사본 없이 동일한 할당량으로 표시할 수 있습니다. 여러 디스플레이에서 표시 가능한 표면을 검사해야 하는 경우 OS는 관련 출력에서 대칭 이동 완료 컬렉션을 조정한 후 애플리케이션에 표면이 다시 릴리스됨을 알리므로, 드라이버에서 대칭 이동 완료를 조정할 필요가 없습니다.
화면에 표시 가능한 질감을 표시하려면 컴퍼지션 스왑 체인 API를 사용할 수 있습니다. 시스템은 일반 표면이 아닌 표시 가능한 표면을 사용하여 일부 상황에서 프레젠테이션을 최적화하여 시스템 작성기를 우회하고 표면을 직접 스캔하여 GPU/CPU 오버헤드와 전체 대기 시간을 줄일 수 있습니다. 이는 "대칭 이동" 프레젠테이션 모드에서 DXGI 스왑 체인을 사용하는 것과 유사합니다. 최상의 성능을 보려면 DXGI 대칭 이동 모델을 사용하여 자세한 내용을 확인하세요.
위에서 설명한 것과 같은 텍스처는 유연한 표시를 사용하기 위해 표시할 수 있어야 합니다. 이러한 텍스처는 속성이 동일한 필요가 없습니다. 예를 들어, 형식과 크기가 다를 수 있으며 이러한 텍스처는 임의의 순서("순서를 벗어난 표시")로 표시할 수 있어야 합니다. 표시는 기존 호출 패턴과 함께 기존 Present1 DDI를 사용하여 수행됩니다. 예를 들어, 720p(A, B, C) 3개와 4K(D, E, F) 3개로 구성된 6개의 버퍼 풀이 있다고 가정할 때 유효한 표시 순서는 A->E->C->B->F->E->D->C일 수 있습니다.
형식
D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE 플래그는 Direct3D 11에서 다음 형식에 대해 지원됩니다.
- DXGI_FORMAT::DXGI_FORMAT_B8G8R8A8_UNORM
- DXGI_FORMAT_R8G8B8A8_UNORM
- DXGI_FORMAT_R16G16B16A16_FLOAT
- DXGI_FORMAT_R10G10B10A2_UNORM
- DXGI_FORMAT_NV12
- DXGI_FORMAT_YUY2
필요에 따라 드라이버는 다음 형식을 지원할 수도 있습니다.
- DXGI_FORMAT_P010
다음 코드 예시를 사용하여 위의 선택적 형식에 대한 표시 가능한 표면 지원 여부를 확인할 수 있습니다. 이 예시에서는 ID3D11Device::CheckFeatureSupport를 호출하고 D3D11_FEATURE_FORMAT_SUPPORT2를 확인합니다.
D3D11_FEATURE_DATA_FORMAT_SUPPORT2 FormatSupport2;
FormatSupport2.InFormat = DXGI_FORMAT_P010;
if (SUCCEEDED (hr = GetDevice()->CheckFeatureSupport(D3D11_FEATURE_FORMAT_SUPPORT2, &FormatSupport2, sizeof(FormatSupport2))))
{
if (FormatSupport2.OutFormatSupport2 & D3D11_FORMAT_SUPPORT2_DISPLAYABLE)
{
// optional displayable format is supported
}
}
플래그
공유 가능한 포맷은 이미 일반적으로 D3D11_BIND_FLAG::D3D11_BIND_SHADER_RESOURCE, D3D11_BIND_UNORDERED_ACCESS, D3D11_BIND_RENDER_TARGET 및 D3D11_BIND_DECODER 바인드 플래그를 지원합니다.
기존에 지원되던 공유 리소스 사용법에 D3D11_BIND_VIDEO_ENCODER 플래그가 추가되어 D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE 플래그도 지원하도록 확장되었습니다. D3D11_BIND_VIDEO_ENCODER의 공유 리소스 사용과 관련된 기존 제한 사항은 그대로 유지됩니다.
이전에는 특정 다른 바인드 플래그와 결합하는 경우를 제외하고 D3D11_BIND_VIDEO_ENCODER 및 D3D11_BIND_SHADER_RESOURCE는 상호 배타적이었습니다. 예외가 확장되어 D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE을 사용할 때 D3D11_BIND_VIDEO_ENCODER 및 D3D11_BIND_SHADER_RESOURCE를 함께 사용할 수 있습니다.
D3D11_RESOURCE_MISC_HW_PROTECTED 플래그는 D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE 플래그와 함께 지원됩니다.