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 멤버에서 런타임으로 다시 전달한 것과 동일한 핸들입니다. 따라서 드라이버 작성기는 이 핸들의 형식을 신중하게 정의해야 합니다. 또한 드라이버는 DDI 구현이 CreateDevice(D3D10) 에 대한 호출을 처리한 것을 기반으로 PresentDXGI 함수의 다양한 구현을 제공할 수 있습니다. 런타임은 DDI 구현에서 드라이버 핸들을 혼합하지 않습니다. 마찬가지로, DXGI_DDI_ARG_PRESENT hSurfaceToPresent 및 hDstResource 멤버는 드라이버의 CreateResource(D3D10) 함수에 대한 이전 호출에서 드라이버가 런타임으로 반환한 드라이버 정의 리소스 핸들이기도 합니다.
DXGI_DDI_ARG_PRESENT pDXGIContext 멤버는 불투명한 통신 메커니즘입니다. 런타임은 이 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 런타임은 다중 샘플링된 리소스를 확인하고, 색 형식 변환을 수행하고, 한 번에 확장 또는 축소를 수행하는 비트 블록 전송(bitblt) 작업을 수행하기 위해 BltDXGI 함수를 요구하는 방식으로 pBltData 매개 변수가 가리키는 DXGI_DDI_ARG_BLT 구조의 Flags 멤버를 설정할 수 있습니다. 그러나 Direct3D 런타임은 DXGI_DDI_ARG_BLT 회전 멤버에 설정된 DXGI_DDI_MODE_ROTATION_IDENTITY 값(즉, 회전 없음을 나타내기 위해)과 함께 DXGI_DDI_ARG_BLT Flags 멤버를 0(즉, 플래그가 설정되지 않음)으로 설정하지 않습니다. 대신, 두 리소스가 모두 다중 샘플링되지 않는 한 Direct3D 런타임은 드라이버의 ResourceCopy 또는 ResourceCopyRegion 함수를 호출하여 직선 메모리 복사 작업을 수행합니다.
사용자 모드 디스플레이 드라이버가 수행하는 스트레치 또는 축소의 품질은 쌍선형 필터가 수행하는 스트레치 또는 축소만큼 양수여야 합니다.
Direct3D 런타임은 드라이버의 BltDXGI 함수를 자주 호출하지 않습니다. 즉, 런타임은 주로 BltDXGI를 사용하여 프레젠테이션을 지원하기 때문에 런타임에서 프레임당 두 번 이상 BltDXGI 를 호출하지 않아야 합니다.
런타임에서 프레젠테이션에 대해 BltDXGI를 호출하면 런타임은 DXGI_DDI_ARG_BLT Flags 멤버에서 현재 비트 필드 플래그를 설정합니다. 런타임은 비트블렛에 대한 추가 요구 사항이 있고 추가 동기화가 필요할 수 있음을 드라이버에 알리기 위해 현재 비트 필드 플래그를 설정합니다(예: 런타임은 각각 디스플레이의 개별 부분을 처리하는 두 개의 그래픽 어댑터를 포함하는 컴퓨터 구성에서 추가 동기화를 수행해야 할 수 있음). 현재 비트 필드 플래그가 설정되면 드라이버는 애플리케이션의 백 버퍼에서 DWM의 공유 화면으로 복사 작업을 수행해야 합니다. 이러한 유형의 복사 작업에 대한 동기화가 부정확하므로 아티팩트 분리는 사용자가 경험하는 최악의 아티팩트 유형이어야 합니다. 이러한 유형의 복사 작업의 경우 가능한 아티팩트가 훨씬 더 나빠질 수 있으므로 드라이버에서 먼저 대상 화면으로 확인한 다음 결과를 바로 색으로 변환하여 다중 패스 접근 방식을 사용하면 안 됩니다.
드라이버가 기본 표면을 만드는 동안 DXGI_DDI_ERR_UNSUPPORTED 반환하도록 지원하는 경우(즉, D3D10DDIARG_CREATERESOURCE BindFlags 멤버에 설정된 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_BLT Rotate 멤버에 전달하지 않습니다. 따라서 이 경우 드라이버의 BltDXGI 함수는 회전을 지원할 필요가 없습니다.
런타임은 드라이버가 콘텐츠를 대상에 복사하기 전에 소스의 내용을 시계 반대 방향으로 회전할 각도 수를 나타내도록 DXGI_DDI_ARG_BLT Rotate 멤버의 값을 설정합니다. 회전은 90도 단위로 지정됩니다.
참고
드라이버의 BltDXGI 함수가 원본 화면에서 sRGB가 아닌 대상 화면으로 sRGB 형식의 콘텐츠를 복사하는 경우 드라이버는 sRGB 콘텐츠를 변경하지 않고 복사해야 합니다(즉, 드라이버가 sRGB를 선형 변환으로 수행하면 안 됨).
원본 제한 사항
BltDXGI 함수는 항상 전체 원본 하위 리소스(일부 하위 사각형 영역과 비교)를 사용하여 비트블렛 작업을 수행합니다. 또한 원본은 D3D10DDIRESOURCE_TEXTURE2D 표현입니다(사용자 모드 표시 드라이버의 CreateResource(D3D10) 함수를 호출하여 원본을 만들 때 D3D10DDIARG_CREATERESOURCE ResourceDimension 멤버에 지정됨). 런타임이 DXGI_DDI_ARG_BLT Flags 멤버에서 Resolve 비트 필드를 설정하는 경우 원본은 다중 샘플링된 리소스입니다. 원본 리소스는 D3D10DDIARG_CREATERESOURCE BindFlags 멤버에서 D3D10_DDI_BIND_PRESENT 플래그가 설정된 리소스로 제한됩니다 . 원본의 형식(D3D10DDIARG_CREATERESOURCE Format 멤버에 지정됨)은 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_CREATERESOURCE BindFlags 멤버에 설정된 D3D10_DDI_BIND_RENDER_TARGET).
스테레오 백 버퍼 만들기
Windows 8 드라이버가 스테레오 백 버퍼를 만들어야 하는 경우 다음과 같이 CreateResource(D3D10) 또는 CreateResource(D3D11) 함수의 pCreateResource 매개 변수가 가리키는 D3D10DDIARG_CREATERESOURCE 또는 D3D11DDIARG_CREATERESOURCE 구조체의 멤버를 각각 설정해야 합니다.
- ArraySize 멤버를 2 값으로 설정합니다.
- BindFlags 멤버에서 D3D10_DDI_BIND_PRESENT 플래그 값을 설정합니다.
또한 스테레오 프레젠테이션을 지원하기 위해 BltDXGI 함수는 원본 및 대상 리소스 범위 내에 있는 DXGI_DDI_ARG_BLT 구조체의 DstSubresource 및 SrcSubresource 멤버에 대한 모든 값을 허용해야 합니다.
pBltData
[in] 비트 블록 전송(bitblt)의 매개 변수를 설명하는 DXGI_DDI_ARG_BLT 구조체에 대한 포인터입니다.
요구 사항
| 지원되는 최소 클라이언트 | Windows Vista |
| 헤더 | dxgiddi.h(D3d10umddi.h 포함) |
참고 항목
피드백
다음에 대한 사용자 의견 제출 및 보기