그래픽 Low-Level 클라이언트 지원
[이러한 함수는 각 운영 체제 수정 버전에 따라 변경될 수 있습니다. 대신 Microsoft DirectDraw 및 Microsoft Direct3DAPIs를 사용합니다. 이러한 API는 이러한 운영 체제 변경으로부터 애플리케이션을 격리하고 디스플레이 드라이버와 직접 상호 작용하는 데 관련된 다른 많은 어려움을 숨깁니다. 자세한 내용은 표시 소개를 참조하세요.]
DirectDraw 및 Direct3D는 일부 커널 모드 루틴을 사용하여 운영 체제 및 디스플레이 드라이버와 통신합니다.
운영 체제 커널은 사용자 모드 구성 요소의 관점에서 DirectDraw/Direct3D 디스플레이 드라이버로 나타납니다. 그러나 커널과 디스플레이 드라이버 간에는 몇 가지 차이점이 있습니다. 커널 모드 구성 요소는 장치 및 표면과 같은 DirectDraw/Direct3D 개체를 나타내는 구조체의 복사본을 유지합니다. DirectDraw/Direct3D의 사용자 모드 구성 요소는 커널 모드에서 반환된 핸들로 참조되는 해당 구조체의 생성을 요청합니다. 따라서 차이점은 주로 루틴에 전달되는 인수에 있습니다. 커널은 핸들을 허용하는 반면 드라이버는 일반적으로 포인터를 허용합니다.
커널 모드 진입점의 진화
DirectDraw는 여러 진입점을 사용하여 Gdi32.dll 통해 커널 모드에 대한 모든 연결을 만듭니다. 이러한 진입점은 일반적으로 매개 변수만 마샬링합니다. 디바이스 만들기의 일환으로 Gdi32.dll DirectDraw 및 Direct3D 7.0에서 사용되는 자체 내 루틴에 대한 포인터를 반환합니다.
Direct3D 8.x Gdi32.dll완전히 벗어나 커널 모드 진입점을 직접 호출합니다.
커널 호출
이러한 진입점은 유사하며, 대부분의 경우 디스플레이 드라이버 자체의 진입점과 동일하므로 DirectDraw 및 Direct3D에 대한 DDK(드라이버 개발 키트) 재질에 대한 이해는 이러한 함수를 사용하기 위한 필수 필수 구성 요소입니다.
이러한 함수를 호출하는 것은 운영 체제마다 다릅니다. Windows 2000에서 W2KUMODE. LIB 라이브러리에는 호출 스레드가 커널 모드로 전환할 수 있도록 하는 루틴이 포함되어 있습니다. 이러한 루틴은 매개 변수 마샬링을 수행하지 않으며 Windows 2000에서 이상적인 호출 메커니즘입니다. 커널 모드로 전환하는 메커니즘은 테이블의 순서에 따라 달라집니다. 이 순서는 운영 체제 수정 버전에서 변경됩니다. 따라서 W2KUMODE 사용하는 애플리케이션을 빌드하는 것은 바람직하지 않습니다. Windows 2000용 LIB이며 Windows XP에서 수정되지 않은 상태로 실행될 것으로 예상합니다. 운영 체제 이식성을 만들기 위한 메커니즘은 다음 섹션에 설명되어 있습니다.
Windows XP에서 D3D8THK.DLL 커널 모드 함수를 모두 내보내지만 약간 데코레이팅된 이름으로 내보냅니다. 다음 예제에서는 애플리케이션이 전처리기를 사용하여 하위 수준 클라이언트 함수의 별칭을 지정하는 방법을 보여 줍니다. 이 작업을 수행하기 전에 동적으로 D3D8THK.DLL 연결합니다.
#define NtGdiDdUnlock OsThunkDdUnlock
#include "ntgdi.h" // Brings in the definition of "NtGdiDdUnlock",
. // which is now seen as OsThunkDdUnlock.
.
.
OsThunkDdUnlock(hSurface, puUnlockData);
이식 가능한 애플리케이션 작성
운영 체제에서 애플리케이션을 이식할 수 있도록 몇 가지 기술을 사용할 수 있습니다. 가장 강력한 방법은 사용자 고유의 애플리케이션 설치 프로세스의 일부로 Windows 2000에 Microsoft DirectX 8.x 재배포 가능 패키지를 설치하는 것입니다. 이렇게 하면 위의 Windows XP에 대해 설명한 것과 동일한 기술을 사용할 수 있으므로 windows 2000 시스템에서 D3D8THK.DLL 사용할 수 있으며 애플리케이션에서 단일 코드 경로를 허용합니다.
또한 애플리케이션은 자체 절연 DLL을 빌드하고 위에 표시된 기술을 사용하여 Windows 2000용과 D3D8THK.DLL 사용하는 Windows XP용 DLL의 두 가지 버전을 구현할 수 있습니다.
디바이스 만들기
DirectDraw 및 Direct3D는 먼저 커널의 드라이버 개체 추상화 인스턴스를 만들어야 합니다. Gdi32.dll 및 Ddraw.dllDdCreateDirectDrawObject, DdQueryDirectDrawObject, DdReenableDirectDrawObject호출하여 이 작업을 수행합니다. Direct3D 8에서 xNtGdiDdCreateDirectDrawObject , NtGdiDdQueryDirectDrawObjectNtGdiDdReenableDirectDrawObject호출하여 이 작업을 수행합니다. GdiEntry* 진입점은 커널 모드 진입점에 대한 마샬러일 뿐입니다.
이러한 함수를 호출한 후 커널 개체의 DirectDraw 디바이스 추상화를 나타내는 핸들이 반환됩니다. 이 커널 개체는 표시 드라이버가 소유한 드라이버 인스턴스를 나타냅니다. 이 핸들은 DdCreateSurfaceObject(또는 Direct3D 8의 NtGdiDdCreateSurfaceObject.x)와 같은 후속 호출에서 사용하여 추가 개체를 빌드할 수 있습니다.
커널 개체
몇 가지 진입점은 특정 개체의 커널 모드 표현을 관리하는 데 사용됩니다. DdCreateSurfaceObject(또는 Direct3D 8의 NtGdiDdCreateSurfaceObject.x)이 좋은 예입니다. 이 진입점은 시스템 메모리의 일부를 나타내는 커널 모드 개체를 만듭니다. 진입점은 핸들을 반환하며 이 핸들은 후속 그리기 호출에서 사용할 수 있습니다. 커널은 이러한 핸들에서 자체 구조에 대한 포인터를 파생시키고 해당 포인터를 표시 드라이버에 전달한 다음 작업을 수행합니다.
함수
이 표에는 커널 모드 진입점을 나타내는 함수와 이러한 진입점을 래핑하는 Gdi32.dll 사용자 모드 도우미 루틴이 나열되어 있습니다.
주제 | 목차 |
---|---|
DdAttachSurface |
DdAttachSurface 함수는 두 개의 커널 모드 표면 표현을 연결합니다. |
DdCreateDIBSection | 해당 색 테이블을 디바이스와 공유하는 DIBSECTION 구조를 만듭니다. GdiEntry9는 이 함수의 별칭으로 #defined. |
DdCreateDirectDrawObject |
NtGdiDdCreateDirectDrawObject 함수에 대한 래퍼이며 DirectDraw 개체의 커널 쪽 표현을 만듭니다. 이 표현에 대한 핸들은 pDirectDrawGlobal>hDD에 저장됩니다. GdiEntry1 이 함수의 별칭으로 정의됩니다. |
DdCreateSurfaceObject |
NtGdiDdCreateSurfaceObject 함수에 대한 래퍼이며 커널 모드 표면 개체를 만듭니다. GdiEntry4 이 함수의 별칭으로 정의됩니다. |
DdDeleteDirectDrawObject |
NtGdiDeleteDirectDrawObject 함수에 대한 래퍼와 DdCreateDirectDrawObject사용하여 이전에 만든 커널 모드 DirectDraw 개체를 삭제합니다. GdiEntry3 이 함수의 별칭으로 정의됩니다. |
DdDeleteSurfaceObject |
NtGdiDdDeleteSurfaceObject 함수에 대한 래퍼이며NtGdiDdCreateSurfaceObject에서 이전에 만든 커널 모드 표면 개체를 삭제합니다. GdiEntry5 이 함수의 별칭으로 정의됩니다. |
DdGetDC |
NtGdiDdGetDC 함수에 대한 래퍼이며 표시된 DirectDraw 표면을 나타내는 GDI(Windows Graphics Device Interface) DC(디바이스 컨텍스트)를 반환합니다. GdiEntry7 이 함수의 별칭으로 정의됩니다. |
DdGetDxHandle |
DdGetDxHandle DirectX API 메커니즘을 제어하는 커널 모드 진입점에 대한 후속 호출에 사용할 커널 모드 Microsoft DirectX API 핸들을 반환합니다. |
DdQueryDirectDrawObject |
NtGdiDdQueryDirectDrawObject 함수에 대한 래퍼이며 이전에 만든 커널 모드 표현에서 기능을 쿼리합니다. GdiEntry2 이 함수의 별칭으로 정의됩니다. |
DdQueryDisplaySettingsUniqueness | 데스크톱 스위치, 빠른 사용자 스위치 또는 전체 화면 Microsoft MS-DOS 상자가 있는 경우와 같이 모드 전환이 발생할 때마다 증가되는 정수의 현재 값을 반환합니다. 애플리케이션은 이 함수를 반복적으로 호출하고 반환 값의 이전 값과 새 값을 비교하여 표시 설정이 변경되었는지 여부를 확인할 수 있습니다. GdiEntry13 이 함수의 별칭으로 정의됩니다. |
DdReenableDirectDrawObject |
NtGdiDdReenableDirectDrawObject 함수에 대한 래퍼입니다. 실제 모드 스위치, 전체 화면 MS-DOS 상자의 모양 또는 디스플레이 드라이버 변경과 같은 모드 스위치 스타일 이벤트 후에 DirectDraw 드라이버 인스턴스를 다시 사용하도록 설정합니다. GdiEntry10 이 함수의 별칭으로 정의됩니다. |
DdReleaseDC |
NtGdiDdReleaseDC 함수에 대한 래퍼이며 DdGetDC 또는 GdiEntry7통해 이전에 가져온 DC를 해제합니다. GdiEntry8 이 함수의 별칭으로 정의됩니다. |
DdResetVisrgn |
NtGdiDdResetVisrgn 함수에 대한 래퍼이며 바탕 화면의 창에 대한 클리핑 영역에서 적시에 사용자 모드 정보를 사용하도록 설정합니다. GdiEntry6 이 함수의 별칭으로 정의됩니다. |
DdSetGammaRamp |
DdSetGammaRamp 함수는 디바이스의 감마 램프를 설정합니다. |
DdSwapTextureHandles | Microsoft DirectDraw 7.0 이전의 DDI(디바이스 드라이버 인터페이스)용으로 개발되었으며 Microsoft Windows NT 시스템에서는 아무 작업도 수행하지 않습니다. 모든 매개 변수는 무시됩니다. GdiEntry16 이 함수의 별칭으로 정의됩니다. |
DdUnattachSurface |
DdUnattachSurface 함수는 두 커널 모드 표면 개체 사이에 DdAttachSurface사용하여 만든 첨부 파일을 제거합니다. |
NtGdiD3DContextCreate | 컨텍스트를 만듭니다. |
NtGdiD3DContextDestroy | 지정된 컨텍스트를 삭제합니다. |
NtGdiD3DContextDestroyAll | 드라이버 관리 메모리 힙의 사용 가능한 메모리 양을 쿼리합니다. |
NtGdiD3DDrawPrimitives2 | 기본 형식을 렌더링하고 업데이트된 렌더링 상태를 반환합니다. |
NtGdiD3DGetDriverState | DirectDraw 및 Direct3D 런타임 모두 드라이버에서 현재 상태에 대한 정보를 가져오는 데 사용됩니다. |
NtGdiD3DValidateTextureStageState | 하드웨어가 현재 상태에 지정된 혼합 작업을 수행할 수 있는 패스 수를 반환합니다. |
NtGdiDdAddAlphaBlt | 구현되지 않았습니다. |
NtGdiDdAddAttachedSurface | 표면을 다른 표면에 연결합니다. |
NtGdiDdAttachSurface | 두 커널 모드 표면 표현을 연결합니다. |
NtGdiDdBeginMoCompFrame | 새 프레임 디코딩을 시작합니다. |
NtGdiDdBlt | 비트 블록 전송을 수행합니다. |
NtGdiDdCanCreateD3DBuffer | 드라이버가 지정된 설명의 드라이버 수준 명령 또는 꼭짓점 버퍼를 만들 수 있는지 여부를 결정합니다. |
NtGdiDdCanCreateSurface | 드라이버가 지정된 표면 설명의 표면을 만들 수 있는지 여부를 나타냅니다. |
NtGdiDdColorControl | 오버레이 표면의 광도 및 밝기 컨트롤을 제어합니다. |
NtGdiDdCreateD3DBuffer | 지정된 설명의 드라이버 수준 명령 또는 꼭짓점 버퍼를 만드는 데 사용됩니다. |
NtGdiDdCreateDirectDrawObject | DirectDraw 개체의 커널 쪽 표현을 만듭니다. |
NtGdiDdCreateMoComp | 지정된 GUID를 사용하여 소프트웨어 디코더가 동작 보정을 사용하기 시작한다는 것을 드라이버에 알깁니다. |
NtGdiDdCreateSurface | 표면을 다른 표면에 연결합니다. |
NtGdiDdCreateSurfaceEx | DirectDraw 표면에서 Direct3D 표면을 만들고 요청된 핸들 값을 연결합니다. |
NtGdiDdCreateSurfaceObject |
puSurfaceLocal참조하는 사용자 모드 표면 개체를 나타내는 커널 모드 표면 개체를 만듭니다. |
NtGdiDdDeleteDirectDrawObject | 이전에 만든 커널 모드 DirectDraw 디바이스 개체를 제거합니다. |
NtGdiDdDeleteSurfaceObject |
NtGdiDdDeleteSurfaceObject 이전에 만든 커널 모드 표면 개체를 삭제합니다. |
NtGdiDdDestroyD3DBuffer | DDSCAPS_EXECUTEBUFFER 설정된 DDSCAPS 구조체의 dwCaps 멤버로 만든 이전에 할당된 커널 모드 DirectDraw 표면 개체를 삭제합니다. |
NtGdiDdDestroyMoComp | 이 동작 보정 개체가 더 이상 사용되지 않음을 드라이버에 알깁니다. 이제 드라이버는 필요한 정리를 수행해야 합니다. |
NtGdiDdDestroySurface | 이전에 할당된 커널 모드 DirectDraw 표면 개체를 제거합니다. |
NtGdiDdEndMoCompFrame | 디코딩된 프레임을 완료합니다. |
NtGdiDdFlip | 대상 및 현재 표면과 연결된 표면 메모리를 교환합니다. |
NtGdiDdFlipToGDISurface | DirectDraw가 GDI 표면에서 대칭 이동 중일 때 드라이버에 알립니다. |
NtGdiDdGetAvailDriverMemory | 모든 비디오 메모리 힙에서 사용 가능한 메모리 양을 쿼리합니다. |
NtGdiDdGetBltStatus | 지정된 표면의 블릿 상태를 쿼리합니다. |
NtGdiDdGetDC | 지정된 표면에 대한 DC를 만듭니다. |
NtGdiDdGetDriverInfo | 드라이버에서 지원하는 추가 DirectDraw 및 Direct3D 기능을 드라이버에 쿼리합니다. |
NtGdiDdGetDxHandle | DirectX API 메커니즘을 제어하는 커널 모드 진입점에 대한 후속 호출에 사용할 커널 모드 DirectX API 핸들을 반환합니다. |
NtGdiDdGetFlipStatus | 표면에서 가장 최근에 요청한 대칭 이동이 발생했는지 여부를 확인합니다. |
NtGdiDdGetInternalMoCompInfo | 드라이버가 동작 보정을 수행하기 위해 디스플레이 메모리를 내부적으로 할당한다고 보고할 수 있습니다. |
NtGdiDdGetMoCompBuffInfo | 드라이버는 지정된 GUID를 지원하는 데 필요한 중간 표면 수와 이러한 각 표면의 크기, 위치 및 형식을 지정할 수 있습니다. |
NtGdiDdGetMoCompFormats | 하드웨어에서 데이터를 디코딩할 수 있는 압축되지 않은 형식을 나타냅니다. |
NtGdiDdGetMoCompGuids | 드라이버에서 지원하는 GUID 수를 검색합니다. |
NtGdiDdGetScanLine | 현재 실제 검사 줄의 수를 반환합니다. |
NtGdiDdLock | 지정된 표면 메모리 영역을 잠그고 표면과 연결된 메모리 블록에 대한 유효한 포인터를 제공합니다. |
NtGdiDdLockD3D | 버퍼 메모리의 지정된 영역을 잠그고 버퍼와 연결된 메모리 블록에 유효한 포인터를 제공하는 데 사용됩니다. |
NtGdiDdQueryDirectDrawObject | 이전에 만든 DirectDraw 개체의 커널 모드 표현을 쿼리하여 해당 기능을 확인합니다. |
NtGdiDdQueryMoCompStatus | 가장 최근 렌더링 작업의 상태를 지정된 표면에 쿼리합니다. |
NtGdiDdReenableDirectDrawObject | 모드 전환 후 DirectDraw 커널 모드 디바이스 개체를 다시 사용하도록 설정합니다. |
NtGdiDdReleaseDC | 표시된 커널 모드 DirectDraw 표면 개체에 대해 이전에 만든 DC를 해제합니다. |
NtGdiDdRenderMoComp | 매크로 블록이 포함된 표면, 매크로 블록이 있는 각 표면의 오프셋 및 렌더링할 macroblock 데이터의 크기를 지정하여 드라이버에 렌더링할 매크로 블록의 크기를 알려줍니다. |
NtGdiDdResetVisrgn | 사용자 모드를 사용하도록 설정하여 바탕 화면의 창에 대한 클리핑 영역을 정확하게 이해하는 데 사용됩니다. 이 클리핑은 사용자 모드 스레드의 관점에서 비동기적으로 변경됩니다. |
NtGdiDdSetColorKey | 지정된 표면의 색 키 값을 설정합니다. |
NtGdiDdSetExclusiveMode | DirectDraw 애플리케이션이 배타 모드로 전환될 때 드라이버에 알합니다. |
NtGdiDdSetGammaRamp | 디바이스의 감마 램프를 설정합니다. |
NtGdiDdSetOverlayPosition | 오버레이의 위치를 설정합니다. |
NtGdiDdUnattachSurface | 두 커널 모드 표면 개체 사이에 NtGdiDdAttachSurface사용하여 만든 첨부 파일을 제거합니다. |
NtGdiDdUnlock | 지정된 표면에 보관된 잠금을 해제합니다. |
NtGdiDdUnlockD3D | 지정된 버퍼 메모리 영역에 보관된 잠금을 해제하는 데 사용됩니다. |
NtGdiDdUpdateOverlay | 오버레이 표면의 시각적 특성 위치를 변경하거나 수정합니다. |
NtGdiDdWaitForVerticalBlank | 디바이스의 세로 빈 상태를 반환합니다. |
관련 항목
-
표시 소개