PFND3DDDI_CREATERESOURCE 콜백 함수(d3dumddi.h)

CreateResource 함수는 리소스를 만듭니다.

구문

PFND3DDDI_CREATERESOURCE Pfnd3dddiCreateresource;

HRESULT Pfnd3dddiCreateresource(
  HANDLE hDevice,
  D3DDDIARG_CREATERESOURCE *unnamedParam2
)
{...}

매개 변수

hDevice

리소스를 만드는 데 사용되는 디스플레이 디바이스(그래픽 컨텍스트)에 대한 핸들입니다.

unnamedParam2

pResource [in, out]

생성된 리소스를 설명하는 D3DDDIARG_CREATERESOURCE 구조체에 대한 포인터입니다.

반환 값

CreateResource는 다음 값 중 하나를 반환합니다.

반환 코드 설명
S_OK 리소스가 성공적으로 생성되었습니다.
E_OUTOFMEMORY CreateResource가 완료하는 데 필요한 메모리를 할당할 수 없습니다.
D3DERR_NOTAVAILABLE CreateResource 는 메모리를 할당할 수 없는 것 이외의 이유로 리소스를 만들 수 없습니다. CreateResourcecan은 꼭짓점 또는 인덱스 버퍼를 만들 때만 이 오류를 반환합니다.

설명

CreateResource 호출에는 표면 목록이 포함될 수 있습니다. pResource 매개 변수로 지정된 D3DDDIARG_CREATERESOURCE 구조체의 SurfCount 멤버는 만들 MIP 맵 수준을 포함한 표면 수를 지정합니다. 예를 들어 256x256x9 텍스처 MIP 맵 리소스에는 SurfCount 멤버와 MIP 맵 수준 수가 모두 9로 설정된 9개의 표면 목록이 포함됩니다. 9개의 MIP 맵 수준을 포함하는 큐브 맵에는 MIP 맵 수준 수가 9로 설정되고 SurfCount 가 54로 설정되어야 합니다. 3면 스왑 체인은 SurfCount 를 3으로 설정하고 MIP 맵 수준 수를 0으로 설정해야 합니다. MIP 맵 수준의 수는 항상 SurfCount의 값보다 작거나 같습니다.

CreateResource 호출에 대한 응답으로 사용자 모드 표시 드라이버는 pfnAllocateCb 함수를 호출하여 하나 이상의 메모리 할당을 만들 수 있습니다. 사용자 모드 디스플레이 드라이버는 표면당 여러 할당, 모든 표면에 대해 하나의 할당 또는 표면당 하나의 할당을 만들어야 하는지 여부를 결정해야 합니다. 할당에 대한 자세한 내용은 비디오 메모리 관리 및 GPU 예약을 참조하세요.

참고 드라이버의 CreateResource 함수는 반환하기 전에 pfnAllocateCb 를 호출할 필요가 없습니다. 대신 드라이버는 할당 생성을 연기할 수 있습니다.
 
참고 리소스에 대한 모든 할당이 pfnAllocateCb에 대한 단일 호출에서 원자적으로 수행되는 경우에만 리소스를 공유할 수 있습니다.
 
D3DDDIARG_CREATERESOURCE 구조의 hResource 멤버는 리소스를 식별하는 데 사용되는 핸들입니다. 사용자 모드 표시 드라이버는 CreateResource 호출에 전달된 hResource 값을 저장하고 CreateResource 호출이 반환될 때 Microsoft Direct3D 런타임에서 사용할 수 있는 다른 값으로 값을 덮어써야 합니다. 즉, 런타임 호출에서 사용자 모드 표시 드라이버는 CreateResource에 전달된 hResource 값을 사용합니다. 사용자 모드 표시 드라이버(예: SetTexture 또는 SetStreamSource 함수 호출)에 대한 호출에서 런타임은 CreateResource에서 반환된 hResource 값을 사용합니다. 각 표면에는 명시적 핸들이 없습니다. 표면을 개별적으로 참조해야 하는 경우(예: Blt 함수 호출에서) 핸들 및 인덱스로 참조됩니다. 인덱스는 리소스 내의 표면을 식별합니다. 인덱스는 D3DDDIARG_CREATERESOURCE pSurfList 멤버에 포함된 배열의 표면 인덱스와 동일합니다.

리소스는 여러 디바이스(hDevice) 및 프로세스에서 공유할 수 있습니다. 런타임은 D3DDDIARG_CREATERESOURCEFlags 멤버에서 SharedResource 비트 필드 플래그를 설정하여 리소스가 공유되도록 지정합니다. 이 비트 필드 플래그가 설정된 경우 사용자 모드 표시 드라이버는 공유 리소스에 대한 다음 제한을 준수해야 합니다.

  • 사용자 모드 표시 드라이버는 pfnAllocateCbpfnDeallocateCb 함수를 각각 한 번만 호출할 수 있습니다.
  • 사용자 모드 표시 드라이버는 리소스를 처음 만든 후 리소스에 대한 추가 할당을 만들 수 없으며, 마찬가지로 리소스 자체가 제거될 때만 리소스 할당을 삭제할 수 있습니다.
  • 드라이버의 CreateResource 또는 OpenResource 함수를 호출하여 만들거나 연 공유 리소스에 대해 사용자 모드 표시 드라이버의 DestroyResource 함수가 호출되면 드라이버는 pfnDeallocateCb 함수를 호출할 때 D3DDDICB_DEALLOCATE 구조체의 hResource 멤버를 비 NULL로 설정하고 D3DDDICB_DEALLOCATE NumAllocations 멤버를 0으로 설정해야 리소스를 삭제하거나 닫습니다. 즉, 공유 리소스와 연결된 할당은 개별적으로 제거하거나 닫을 수 없습니다. 리소스는 pfnDeallocateCb에 대한 한 번의 호출에서 원자적으로 제거되거나 닫혀야 합니다.
  • 할당 수는 리소스 종류에 대해 일관되어야 합니다(즉, 동일한 리소스 종류를 만드는 다른 프로세스는 동일한 수와 할당 유형을 생성해야 합니다). 또한 이러한 리소스에는 이름 바꾸기가 허용되지 않습니다.
D3DDDI_RESOURCEFLAGS 구조체에 지정된 비트 필드 플래그는 D3DDDIARG_CREATERESOURCEFlags 멤버에 전달됩니다.
참고 플래그를 지정하지 않고 리소스를 만들 수 있습니다. 이러한 리소스와 연결된 표면은 잠재적으로 잠글 수 있으며 비트 블록 전송(bitblt) 작업에서 원본 또는 대상이 될 수 있습니다. 그러나 이러한 표면은 다른 용도로 사용할 수 없습니다.
 
참고 일반 표면은 텍스처 또는 기본 비트 필드 플래그가 없을 때 텍스처 또는 독립 실행형 렌더링 대상과 구별됩니다. 예를 들어 기본 비트 필드 플래그가 있으면 독립 실행형 렌더링 대상이 표시되고 이 플래그가 없으므로 백 버퍼인 렌더링 대상이 표시됩니다.
 
참고 런타임을 변경해도 기존 드라이버가 중단되지 않도록 하기 위해 드라이버는 CreateResource 함수를 호출할 때 D3DDDIARG_CREATERESOURCE 구조체의 다음 예약 멤버를 사용하여 드라이버의 동작에 영향을 미치지 않아야 합니다.
  • Flags 멤버의 정의되지 않은 비트가 예약되어 있습니다.
  • 기본 비트 필드 플래그가 Flags에 설정되지 않은 경우 RefreshRate출력 멤버가 예약됩니다.
  • Flags에서 RenderTarget, DecodeRenderTarget 또는 VideoProcessRenderTarget 비트 필드 플래그가 설정되지 않은 경우 MultisampleTypeMultisampleQuality 멤버가 예약됩니다.
  • VertexBuffer 비트 필드 플래그가 Flags에 설정되지 않은 경우 Fvf 멤버가 예약됩니다.
  • Texture, CubeMapVolume 비트 필드 플래그가 Flags에 설정되지 않은 경우 MipLevels 멤버가 예약됩니다.
 
리소스를 만들고 삭제하는 방법에 대한 자세한 내용은 리소스 만들기 및 소멸 처리를 참조하세요.

CreateResource DDI는 다음과 같은 방법으로 Microsoft Windows 2000 디스플레이 드라이버 모델의DdCreateSurface DDI와 다릅니다.

  • CreateResource DDI에서 표면은 명시적으로 연결되지 않습니다. 모든 첨부 파일은 원자성 생성에 의해 암시됩니다.
  • CreateResource DDI에서는 큐브 맵의 일부를 만들 수 없습니다.
시스템 메모리 리소스의 경우 GPU(그래픽 처리 장치)의 직접 액세스를 위해 시스템 메모리가 제대로 정렬된 경우 디스플레이 미니포트 드라이버가 시스템 메모리 주위에 할당을 래핑하도록 선택할 수 있습니다. 디스플레이 미니포트 드라이버는 DxgkDdiCreateAllocation 함수를 사용하여 할당을 만들 때 DXGK_ALLOCATIONINFO 구조의 Flags 멤버에서 ExistingSysMem 플래그를 설정하여 시스템 메모리 주위에 할당을 래핑합니다. 디스플레이 미니포트 드라이버가 시스템 메모리 주위에 할당을 래핑할 수 없거나 래핑이 실패하는 경우 드라이버는 리소스 생성에 성공하고 CPU를 사용하여 리소스에 액세스해야 합니다.

런타임이 꼭짓점 또는 인덱스 버퍼를 만들도록 요청하고 사용자 모드 표시 드라이버가 메모리 부족(예: 하드웨어 지원 부족) 이외의 이유로 버퍼를 만들 수 없는 경우 드라이버는 D3DERR_NOTAVAILABLE 함께 실패해야 합니다.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows Vista 이상 버전의 Windows 운영 체제에서 사용할 수 있습니다.
대상 플랫폼 데스크톱
머리글 d3dumddi.h(D3dumddi.h 포함)

추가 정보

샌드위치

D3DDDIARG_CREATERESOURCE

D3DDDI_DEVICEFUNCS

D3DDDI_RESOURCEFLAGS

SetStreamSource

SetTexture

pfnAllocateCb

pfnDeallocateCb