DXGI_DDI_BASE_FUNCTIONS 구조체(dxgiddi.h)

DXGI_DDI_BASE_FUNCTIONS 구조에는 렌더링된 프레임을 출력에 표시하고, 감마를 제어하고, 전체 화면 전환을 관리하는 등의 하위 수준 작업을 수행하기 위해 사용자 모드 표시 드라이버가 구현할 수 있는 함수가 포함되어 있습니다.

구문

typedef struct DXGI_DDI_BASE_FUNCTIONS {
  HRESULT()(DXGI_DDI_ARG_PRESENT *) * pfnPresent;
  HRESULT()(DXGI_DDI_ARG_GET_GAMMA_CONTROL_CAPS *) * pfnGetGammaCaps;
  HRESULT()(DXGI_DDI_ARG_SETDISPLAYMODE *) * pfnSetDisplayMode;
  HRESULT()(DXGI_DDI_ARG_SETRESOURCEPRIORITY *) * pfnSetResourcePriority;
  HRESULT()(DXGI_DDI_ARG_QUERYRESOURCERESIDENCY *) * pfnQueryResourceResidency;
  HRESULT()(DXGI_DDI_ARG_ROTATE_RESOURCE_IDENTITIES *) * pfnRotateResourceIdentities;
  HRESULT()(DXGI_DDI_ARG_BLT *) * pfnBlt;
} DXGI_DDI_BASE_FUNCTIONS;

멤버

pfnPresent

애플리케이션 렌더링을 완료하고 드라이버가 대상 화면에 표시하도록 요청하는 사용자 모드 표시 드라이버에 알립니다. PresentDXGI 함수에 대한 포인터입니다.

pPresentData 매개 변수가 가리키는 DXGI_DDI_ARG_PRESENT 구조체의 hDevice 멤버는 드라이버의 CreateDevice(D3D10) 함수가 D3D10DDIARG_CREATEDEVICE 구조체의 hDrvDevice 멤버에서 런타임에 다시 전달한 것과 동일한 핸들입니다. 따라서 드라이버 작성기는 이 핸들의 형식을 신중하게 정의해야 합니다. 또한 드라이버는 CreateDevice(D3D10)에 대한 호출을 처리한 DDI 구현에 따라 PresentDXGI 함수의 다양한 구현을 제공할 수 있습니다. 런타임은 DDI 구현에서 드라이버 핸들을 혼합하지 않습니다. 마찬가지로, DXGI_DDI_ARG_PRESENThSurfaceToPresenthDstResource 멤버는 드라이버의 CreateResource(D3D10) 함수에 대한 이전 호출에서 드라이버가 런타임으로 반환한 드라이버 정의 리소스 핸들이기도 합니다.

DXGI_DDI_ARG_PRESENTpDXGIContext 멤버는 불투명한 통신 메커니즘입니다. 런타임은 이 DXGI 컨텍스트를 드라이버에 전달합니다. 드라이버는 드라이버가 pfnPresentCbDXGI 함수를 호출할 때 이 DXGI 컨텍스트를 DXGIDDICB_PRESENT 구조체의 pDXGIContext 멤버에 변경되지 않고 복사해야 합니다.

드라이버는 pfnRenderCb 함수를 사용하여 부분적으로 빌드된 모든 렌더링 데이터(명령 버퍼)를 제출해야 합니다. 그 후 드라이버는 리소스 핸들 매개 변수를 커널 핸들로 변환하고 pfnPresentCbDXGI 호출에서 해당 커널 핸들을 사용해야 합니다.

참고

드라이버의 PresentDXGI 함수가 원본 표면에서 sRGB가 아닌 대상 화면으로 sRGB 형식의 콘텐츠를 복사하는 경우 드라이버는 sRGB 콘텐츠를 변경하지 않고 복사해야 합니다(즉, 드라이버가 sRGB를 선형 변환으로 수행해서는 안 됨).

pPresentData

[in] 대상 화면에 표시하는 방법을 설명하는 DXGI_DDI_ARG_PRESENT 구조체에 대한 포인터입니다.

pfnGetGammaCaps

GetGammaCapsDXGI 함수는 감마 기능을 검색합니다.

pGammaData

[in] 감마 기능이 포함된 DXGI_DDI_ARG_GET_GAMMA_CONTROL_CAPS 구조체에 대한 포인터입니다.

pfnSetDisplayMode

드라이버의 SetDisplayModeDXGI 함수에 대한 포인터입니다.

pfnSetResourcePriority

SetResourcePriorityDXGI 함수는 리소스에 대한 메모리에서 제거 우선 순위를 설정합니다.

Microsoft Direct3D 런타임은 SetResourcePriorityDXGI 를 호출하여 리소스의 우선 순위 수준을 설정합니다. 사용자 모드 표시 드라이버는 pPriorityData가 가리키는 DXGI_DDI_ARG_SETRESOURCEPRIORITY 구조체의 hResource 멤버에 제공된 리소스 핸들을 할당 핸들로 변환해야 합니다. 드라이버가 이 변환을 수행한 후 드라이버는 pfnSetPriorityCb 함수에 대한 호출에서 결과 핸들을 전달해야 합니다.

pPriorityData

[in] 리소스를 설정할 우선 순위 수준을 설명하는 DXGI_DDI_ARG_SETRESOURCEPRIORITY 구조체에 대한 포인터입니다.

pfnQueryResourceResidency

이 함수는 지정된 리소스 목록의 상주 여부를 결정합니다.

Microsoft Direct3D 런타임은 애플리케이션에 대해 사용자 모드 디스플레이 드라이버의 QueryResourceResidencyDXGI 함수를 호출하여 시스템이 리소스 GPU에 액세스할 수 있도록 해야 하는 경우 운영 체제가 그리기 시간에 상당한 중단이 발생하는지 여부를 확인합니다. QueryResourceResidencyDXGI에서 반환되는 정보는 애플리케이션이 리소스를 사용하기 전에 리소스가 강등될 수 있으므로 리소스 상주에 대한 근사치입니다.

QueryResourceResidencyDXGI는 pfnQueryResidencyCb 함수를 호출해야 합니다. pfnQueryResidencyCb는 D3DDDICB_QUERYRESIDENCY 구조체의 pResidencyStatus 멤버로 지정된 배열 요소에 있는 리소스의 상주 상태 반환합니다. pfnQueryResidencyCb가 쿼리에 대한 D3DDDI_RESIDENCYSTATUS_NOTRESIDENT 반환하는 경우 QueryResourceResidencyDXGI는 S_NOT_RESIDENT 반환해야 합니다. pfnQueryResidencyCb가 쿼리에 대한 D3DDDI_RESIDENCYSTATUS_RESIDENTINSHAREDMEMORY 반환하고 쿼리에 대한 D3DDDI_RESIDENCYSTATUS_NOTRESIDENT 반환하지 않는 경우 QueryResourceResidencyDXGI는 S_RESIDENT_IN_SHARED_MEMORY 반환해야 합니다. QueryResourceResidencyDXGI 는 모든 쿼리에 대한 pfnQueryResidencyCb 에 대한 모든 호출이 D3DDDI_RESIDENCYSTATUS_RESIDENTINGPUMEMORY 반환하는 경우에만 S_OK 반환해야 합니다.

런타임이 QueryResourceResidencyDXGI 호출을 통해 쿼리하는 각 리소스에 대해 사용자 모드 표시 드라이버는 pfnQueryResidencyCb 호출을 통해 쿼리할 리소스에 속하는 할당을 결정해야 합니다. 단일 할당을 소유하는 리소스의 경우 결정은 간단합니다. 드라이버는 해당 할당을 쿼리합니다. 그러나 리소스가 여러 할당을 소유하는 경우 결정하기가 더 어렵습니다. 드라이버는 애플리케이션이 렌더링에 사용할 할당을 결정해야 하며 드라이버는 해당 할당만 쿼리해야 합니다. 예를 들어 리소스가 렌더링에 사용되는 할당과 잠금 작업을 처리하는 스크래치 할당을 소유하는 경우 애플리케이션이 렌더링에 두 번째 할당을 사용하지 않을 가능성이 높기 때문에 드라이버는 첫 번째 할당의 상주에 대해서만 쿼리해야 합니다.

참고

런타임은 시스템 메모리 리소스의 상주 쿼리를 지원하지 않으므로 런타임은 항상 시스템 메모리 리소스의 상주 상태 대한 애플리케이션의 요청을 실패하고 이러한 시스템 메모리 리소스에 대한 사용자 모드 표시 드라이버의 QueryResourceResidencyDXGI 함수를 호출하지 않습니다.

pResidencyData

[in] 상주가 확인된 리소스 목록을 설명하는 DXGI_DDI_ARG_QUERYRESOURCERESIDENCY 구조체에 대한 포인터입니다.

pfnRotateResourceIdentities

리소스 목록을 회전합니다.

RotateResourceIdentitiesDXGI 함수는 pRotateData 매개 변수가 가리키는 DXGI_DDI_ARG_ROTATE_RESOURCE_IDENTITIES 구조체의 pResources 멤버에 전달되는 리소스 배열의 ID를 교환해야 합니다. 예를 들어 리소스 배열이 X, Y 및 Z 리소스를 참조하는 경우 배열 인덱스 순서를 늘리면 RotateResourceIdentitiesDXGI 는 배열 인덱스 순서를 늘리면서 Y, Z 및 X를 참조하도록 해당 핸들을 회전해야 합니다. 특히 사용자 모드 표시 드라이버는 해당 리소스의 커널 핸들을 교환해야 합니다. 그러나 드라이버는 해당 RT(런타임) 핸들을 교환해서는 안 됩니다. 런타임은 RotateResourceIdentitiesDXGI 를 호출하여 프레젠테이션 중에 버퍼를 다시 회전합니다. 따라서 RotateResourceIdentitiesDXGI 에 대한 호출은 드물게 발생합니다. 런타임은 런타임이 드라이버의 CreateResource(D3D10) 함수를 호출하여 리소스가 회전 작업에 참여할 수 있음을 나타낼 때 D3D10DDIARG_CREATERESOURCE 구조의 BindFlags 멤버에서 D3D10_DDI_BIND_PRESENT 플래그를 지정할 수 있습니다.

사용자 모드 표시 드라이버는 ID 교환의 다른 측면도 처리해야 합니다. 예를 들어 Direct3D 버전 10에서 뷰는 리소스를 참조할 수 있습니다. 이러한 보기에는 리소스 주소가 포함될 수 있습니다. 따라서 드라이버는 이러한 뷰를 다시 만들어야 합니다. 또한 드라이버가 현재 바인딩된 뷰를 다시 적용해야 할 수도 있습니다.

Windows 8 드라이버는 스테레오 백 버퍼의 회전을 지원해야 합니다.

pRotateData

[in] 회전할 리소스 목록을 설명하는 DXGI_DDI_ARG_ROTATE_RESOURCE_IDENTITIES 구조체에 대한 포인터입니다.

pfnBlt

원본 표면의 내용을 대상 표면에 복사하고 내용을 회전할 수 있습니다.

Direct3D 런타임은 다중 샘플링된 리소스를 확인하고, 색 형식 변환을 수행하고, 한 번에 늘이거나 축소하는 비트 블록 전송(비트블렛) 작업을 수행하기 위해 BltDXGI 함수를 요구하는 방식으로 pBltData 매개 변수가 가리키는 DXGI_DDI_ARG_BLT 구조의Flags 멤버를 설정할 수 있습니다. 그러나 Direct3D 런타임은 직선 메모리 복사 작업을 수행하기 위해 DXGI_DDI_ARG_BLT회전 멤버(즉, 회전 없음)에 설정된 DXGI_DDI_MODE_ROTATION_IDENTITY 값과 함께 DXGI_DDI_ARG_BLTFlags 멤버를 0(즉, 플래그가 설정되지 않음)으로 설정하지 않습니다. 대신, 두 리소스가 모두 다중 샘플링되지 않는 한 Direct3D 런타임은 드라이버의 ResourceCopy 또는 ResourceCopyRegion 함수를 호출하여 직선 메모리 복사 작업을 수행합니다.

사용자 모드 디스플레이 드라이버가 수행하는 스트레치 또는 축소의 품질은 쌍선형 필터가 수행하는 스트레치 또는 축소만큼 양수여야 합니다.

Direct3D 런타임은 드라이버의 BltDXGI 함수를 자주 호출합니다. 즉, 런타임은 주로 BltDXGI를 사용하여 프레젠테이션을 지원하므로 런타임은 프레임당 두 번 이상 BltDXGI 를 호출하지 않아야 합니다.

런타임이 프레젠테이션에 대해 BltDXGI를 호출하면 런타임은 DXGI_DDI_ARG_BLTFlags 멤버에 Present 비트 필드 플래그를 설정합니다. 런타임은 Bitblt 에 대한 추가 요구 사항이 있고 추가 동기화가 필요할 수 있음을 드라이버에 알리기 위해 Present 비트 필드 플래그를 설정합니다(예: 런타임은 각각 디스플레이의 개별 부분을 처리하는 두 개의 그래픽 어댑터가 포함된 컴퓨터 구성에서 추가 동기화를 수행해야 할 수 있음). Present 비트 필드 플래그가 설정되면 드라이버는 애플리케이션의 백 버퍼에서 DWM의 공유 화면으로 복사 작업을 수행해야 합니다. 이러한 유형의 복사 작업에 대한 동기화가 만료되지 않으므로 아티팩트 분리는 사용자가 경험하는 최악의 아티팩트 유형이어야 합니다. 이 유형의 복사 작업의 경우 가능한 아티팩트가 훨씬 더 나빠질 수 있으므로 먼저 대상 표면으로 확인한 다음 결과를 색으로 변환하여 다중 패스 접근 방식을 사용하면 안 됩니다.

드라이버가 기본 표면을 만드는 동안 DXGI_DDI_ERR_UNSUPPORTED 반환을 지원하는 경우(즉, D3D10DDIARG_CREATERESOURCEBindFlags 멤버에 설정된 D3D10_DDI_BIND_PRESENT 플래그를 사용하여 CreateResource(D3D10) 함수에 대한 호출에서 DXGI_DDI_ERR_UNSUPPORTED 반환하고 pPrimaryDesc 멤버와 함께 D3D10DDIARG_CREATERESOURCE NULL이 아닌 값으로 설정됨) 드라이버는 복사 작업 중에도 회전을 지원해야 합니다. 드라이버가 CreateResource(D3D10) 함수 호출에서 DXGI_DDI_ERR_UNSUPPORTED 반환하지 않으면 런타임은 DXGI_DDI_MODE_ROTATION_ROTATE90, DXGI_DDI_MODE_ROTATION_ROTATE180 또는 DXGI_DDI_MODE_ROTATION_ROTATE270 값을 DXGI_DDI_ARG_BLTRotate 멤버에 전달하지 않습니다. 따라서 이 경우 회전을 지원하기 위해 드라이버의 BltDXGI 함수가 필요하지 않습니다.

런타임은 드라이버가 대상에 콘텐츠를 복사하기 전에 원본의 내용을 시계 반대 방향으로 회전할 각도 수를 나타내도록 DXGI_DDI_ARG_BLTRotate 멤버의 값을 설정합니다. 회전은 90도 단위로 지정됩니다.

참고

드라이버의 BltDXGI 함수가 원본 표면에서 sRGB가 아닌 대상 화면으로 sRGB 형식의 콘텐츠를 복사하는 경우 드라이버는 sRGB 콘텐츠를 변경하지 않고 복사해야 합니다(즉, 드라이버가 sRGB를 선형 변환으로 수행하면 안 됨).

원본 제한 사항

BltDXGI 함수는 항상 전체 원본 하위 리소스(일부 하위 사각형 영역과 비교)를 사용하여 비트blt 작업을 수행합니다. 또한 원본은 D3D10DDIRESOURCE_TEXTURE2D 표현입니다(사용자 모드 표시 드라이버의 CreateResource(D3D10) 함수를 호출하여 원본을 만들 때 D3D10DDIARG_CREATERESOURCEResourceDimension 멤버에 지정됨). 런타임이 DXGI_DDI_ARG_BLTFlags 멤버에서 Resolve 비트필드를 설정하는 경우 원본은 다중 샘플링된 리소스입니다. 원본 리소스는 D3D10DDIARG_CREATERESOURCE BindFlags 멤버에서 D3D10_DDI_BIND_PRESENT 플래그가 설정된 리소스로 제한됩니다. 원본의 형식(D3D10DDIARG_CREATERESOURCEFormat 멤버에 지정됨)은 DXGI_FORMAT 열거형의 다음 값으로 지정된 표시 모드 형식으로 제한됩니다.

  • DXGI_FORMAT_B5G6R5_UNORM
  • DXGI_FORMAT_B5G5R5A1_UNORM
  • DXGI_FORMAT_B8G8R8A8_UNORM (아래 참고 참조)
  • DXGI_FORMAT_B8G8R8X8_UNORM
  • DXGI_FORMAT_R16G16B16A16_FLOAT
  • DXGI_FORMAT_R10G10B10A2_UNORM
  • DXGI_FORMAT_R8G8B8A8_UNORM
  • DXGI_FORMAT_R8G8B8A8_UNORM_SRGB

참고

드라이버가 소스 형식 DXGI_FORMAT_B8G8R8A8_UNORM 지원하는 경우 다음 제한이 적용됩니다.

  • 드라이버가 부동 소수점 형식에서 정수 형식(예: BGRA8888)으로 비트블렛 작업을 수행하는 경우 감마를 결과에 암시적으로 인코딩해야 합니다.
  • 반대로 드라이버가 정수 형식에서 부동 소수점 형식으로 비트블렛 작업을 수행하는 경우 결과에서 감마 인코딩을 암시적으로 제거해야 합니다.

대상 제한 사항

대상은 D3D10DDIRESOURCE_TEXTURE2D 표현이기도 합니다. 대상의 형식도 표시 모드 형식으로 제한됩니다. 대상 리소스는 렌더링 대상으로 바인딩된 리소스로 제한됩니다(D3D10DDIARG_CREATERESOURCE 또는 D3D11DDIARG_CREATERESOURCEBindFlags 멤버에 설정된 D3D10_DDI_BIND_RENDER_TARGET).

스테레오 백 버퍼 만들기

Windows 8 드라이버가 스테레오 백 버퍼를 만들어야 하는 경우 다음과 같이 CreateResource(D3D10) 또는 CreateResource(D3D11) 함수의 pCreateResource 매개 변수가 가리키는 D3D10DDIARG_CREATERESOURCE 또는 D3D11DDIARG_CREATERESOURCE구조체의 멤버를 각각 설정해야 합니다.

  1. ArraySize 멤버를 2 값으로 설정합니다.
  2. BindFlags 멤버에서 D3D10_DDI_BIND_PRESENT 플래그 값을 설정합니다.

또한 스테레오 프레젠테이션을 지원하기 위해 BltDXGI 함수는 원본 및 대상 리소스 범위 내에 있는 DXGI_DDI_ARG_BLT 구조체의 DstSubresourceSrcSubresource 멤버에 대한 모든 값을 허용해야 합니다.

pBltData

[in] 비트 블록 전송(bitblt)의 매개 변수를 설명하는 DXGI_DDI_ARG_BLT 구조체에 대한 포인터입니다.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows Vista
머리글 dxgiddi.h(D3d10umddi.h 포함)

추가 정보

BltDXGI

CreateDevice(D3D10)

D3D10DDIARG_CREATEDEVICE

DXGI_DDI_BASE_ARGS

GetGammaCapsDXGI

PresentDXGI

QueryResourceResidencyDXGI

RotateResourceIdentitiesDXGI

SetDisplayModeDXGI

SetResourcePriorityDXGI