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