다음을 통해 공유


Windows 2000 드라이버 초기화

Windows 2000 이상에서는 애플리케이션에서 요청한 경우에만 드라이버 정보가 검색됩니다. 즉, DirectDraw 개체의 instance 만들라는 Microsoft DirectDraw 애플리케이션의 요청에 대한 응답으로 그래픽 엔진은 드라이버 함수를 호출하여 DirectDraw 드라이버를 초기화합니다.

Windows 2000부터 이 시퀀스는 부팅 시와 각 모드 변경 후에 수행됩니다. 이것은 부작용이 있습니다. Windows 98/Me에서 드라이버에는 일반적으로 GDI 모드와 DirectDraw 모드라는 두 가지 작업 모드가 있습니다. DirectDraw가 실행 중인 경우 GDI 캐시 비트맵을 허용하지 않고 모든 메모리를 DirectDraw에 제공합니다(GDI 모드에서는 그 반대의 경우도 마찬가지임). 이 동작으로 인해 창이 있는 애플리케이션(예: DirectX를 사용하는 웹 페이지)이 중단되었습니다. 따라서 Windows 2000 이상에서는 GDI 및 DirectDraw가 메모리 사용 방법에 대해 협력해야 합니다. DDK(Windows 드라이버 개발 키트)와 함께 제공되는 Permedia3 샘플 드라이버에는 이 작업을 수행하는 방법에 대한 예제가 있습니다. (DDK는 Windows 드라이버 키트 [WDK]보다 앞섰습니다.)

드라이버 초기화 시퀀스는 다음 함수를 호출하여 수행됩니다.

  • DrvGetDirectDrawInfo 를 사용하여 하드웨어의 기능에 대한 정보를 검색합니다. GDI는 이 함수를 두 번 호출합니다.

    • 첫 번째 호출은 디스플레이 메모리 힙의 크기와 드라이버가 지원하는 FOURC 수를 결정합니다. GDI는 pvmListpdwFourCC 매개 변수 모두에 대해 NULL을 전달합니다. 드라이버는 pdwNumHeapspdwNumFourCC 매개 변수만 초기화하고 반환해야 합니다.
    • 두 번째 호출은 GDI가 pdwNumHeaps 및 pdwNumFourCC 매개 변수의 첫 번째 호출에서 반환된 값을 기반으로 디스플레이 메모리 및 FOURCC 메모리를 할당한 후에 이루어집니다. 두 번째 호출에서 드라이버는 pdwNumHeaps, pvmList, pdwNumFourCCpdwFourCC 매개 변수를 초기화하고 반환해야 합니다.

    GDI는 pHalInfo가 가리키는 DD_HALINFO 구조를 할당하고 0으로 초기화합니다. DrvGetDirectDrawInfo 함수는 DD_HALINFO 구조체의 관련 멤버를 드라이버 관련 정보로 채워야 합니다.

    • 드라이버는 디스플레이 메모리의 일반적인 형식을 설명하기 위해 VIDEOMEMORYINFO 구조체의 적절한 멤버를 초기화해야 합니다. 메모리 표시를 참조하세요.
    • 드라이버는 DirectDraw에 대한 드라이버의 핵심 기능을 설명하기 위해 DDCORECAPS 구조의 적절한 멤버를 초기화해야 합니다.
    • 드라이버가 드라이버의 DdGetDriverInfo 콜백에 GUID를 전송하여 쿼리되는 DirectX 기능을 지원하는 경우 드라이버는 드라이버의 DdGetDriverInfo 콜백을 가리키고 dwFlags에서 DDHALINFO_GETDRIVERINFOSET 비트를 설정하도록 GetDriverInfo 멤버를 초기화해야 합니다.
    • 드라이버는 dwSizeDD_HALINFO 구조체의 크기(바이트)로 설정해야 합니다.
  • DrvEnableDirectDraw 는 런타임에서 DirectDraw 하드웨어를 사용하도록 설정하고 드라이버의 콜백 지원 중 일부를 결정하는 데 사용됩니다. GDI는 DD_CALLBACKS, DD_SURFACECALLBACKSDD_PALETTECALLBACKS 매개 변수 구조를 할당하고 0으로 초기화합니다. 드라이버는 구현하는 각 콜백에 대해 다음을 수행해야 합니다.

    • 콜백을 가리키도록 적절한 구조체의 해당 멤버를 설정합니다.
    • 해당 구조체의 dwFlags 멤버에 해당하는 DDHAL_XXX_XXX 비트를 설정합니다.

    드라이버는 DrvEnableDirectDraw 함수를 구현하여 DrvEnableDirectDraw를 사용하여 DirectDraw 콜백 지원에 나열된 콜백 함수를 지원함을 나타낼 수 있습니다.

    드라이버의 DrvEnableDirectDraw 구현은 DirectDraw에서만 사용할 디스플레이 메모리와 같은 하드웨어 리소스를 전용으로 사용할 수도 있습니다.

  • DdGetDriverInfo - 드라이버가 지원하는 다른 콜백 함수 및 기능을 검색합니다.

    NULL이 아닌 경우 GetDriverInfo 콜백은 드라이버의 DrvGetDirectDrawInfo에 의해 DD_HALINFO 구조로 반환됩니다. GDI는 DD_GETDRIVERINFODATA 구조를 할당하고 초기화하고 DD_GETDRIVERINFODATA참조 섹션에 설명된 각 GUID에 대해 DdGetDriverInfo를 호출합니다. 모든 GUID는 ddrawint.h에 정의됩니다.

    드라이버는 DdGetDriverInfo 함수를 구현하여 DdGetDriverInfo를 사용하여 DirectDraw 및 Direct3D 콜백 지원에 지정된 콜백 함수를 지원함을 나타낼 수 있습니다.

표면 메모리를 잠그면(표면의 전체 또는 일부) 애플리케이션과 하드웨어가 동시에 표면 메모리에 액세스할 수 없게 됩니다. 이렇게 하면 애플리케이션이 Surface 메모리에 쓰는 동안 오류가 발생하지 않습니다. 또한 표면 메모리가 잠금 해제될 때까지 애플리케이션은 페이지 대칭 이동이 불가능합니다.