Share via


표시 가능한 표면

표시 가능한 표면 이전에는 일반적으로 동일한 속성을 가진 버퍼의 스왑 체인을 생성한 다음 순서대로 반복적으로 순환(플립)하여 화면에 표시하는 방식으로 제공되었습니다. 표시할 버퍼의 속성을 변경하려면 해당 스왑 체인을 폐기하고 모든 버퍼가 동일한 새 속성으로 업데이트된 새 체인을 만들어야 했습니다.

표시 가능한 표면 기능은 이러한 제한을 제거하는 새로운 운영 체제(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는 관련 출력에서 대칭 이동 완료 컬렉션을 조정한 후 애플리케이션에 표면이 다시 릴리스됨을 알리므로, 드라이버에서 대칭 이동 완료를 조정할 필요가 없습니다.

위에서 설명한 것과 같은 텍스처는 유연한 표시를 사용하기 위해 표시할 수 있어야 합니다. 이러한 텍스처는 속성이 동일한 필요가 없습니다. 예를 들어, 형식과 크기가 다를 수 있으며 이러한 텍스처는 임의의 순서("순서를 벗어난 표시")로 표시할 수 있어야 합니다. 표시는 기존 호출 패턴과 함께 기존 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_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_TARGETD3D11_BIND_DECODER 바인드 플래그를 지원합니다.

기존에 지원되던 공유 리소스 사용법에 D3D11_BIND_VIDEO_ENCODER 플래그가 추가되어 D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE 플래그도 지원하도록 확장되었습니다. D3D11_BIND_VIDEO_ENCODER의 공유 리소스 사용과 관련된 기존 제한 사항은 그대로 유지됩니다.

이전에는 특정 다른 바인드 플래그와 결합하는 경우를 제외하고 D3D11_BIND_VIDEO_ENCODERD3D11_BIND_SHADER_RESOURCE는 상호 배타적이었습니다. 예외가 확장되어 D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE을 사용할 때 D3D11_BIND_VIDEO_ENCODERD3D11_BIND_SHADER_RESOURCE를 함께 사용할 수 있습니다.

D3D11_RESOURCE_MISC_HW_PROTECTED 플래그는 D3D11_RESOURCE_MISC_SHARED_DISPLAYABLE 플래그와 함께 지원됩니다.