D3DHAL_DP2TEXBLT 구조체(d3dhal.h)

D3DHAL_DP2TEXBLT 구조체는 D3dDrawPrimitives2 가 D3DDP2OP_TEXBLT 명령 토큰에 응답할 때 텍스처 Blt에 사용됩니다.

구문

typedef struct _D3DHAL_DP2TEXBLT {
  DWORD dwDDDestSurface;
  DWORD dwDDSrcSurface;
  POINT pDest;
  RECTL rSrc;
  DWORD dwFlags;
} D3DHAL_DP2TEXBLT;

멤버

dwDDDestSurface

대상 텍스처에 대한 핸들을 지정합니다.

dwDDSrcSurface

원본 텍스처에 대한 핸들을 지정합니다.

pDest

Blt가 수행되어야 하는 대상 지점, 즉 Blt를 시작할 대상 표면의 점(dwDDDestSurface)을 지정합니다. POINT 구조체의 이러한 xy 멤버는 화면 좌표로 지정됩니다.

rSrc

원본 텍스처에서 blitted할 직사각형, 즉 원본 표면의 원본 사각형(dwDDSrcSurface)을 Blt로 지정합니다.

dwFlags

시스템에서 사용하도록 예약되었습니다.

설명

D3dCreateSurfaceEx 콜백은 텍스처 Blt의 원본 및 대상 텍스처로 사용할 수 있는 작은 정수 핸들을 텍스처에 만듭니다.

D3DHAL_DP2TEXBLT 구조는 D3DDP2OP_TEXBLT 명령 스트림 토큰과 함께 사용되어 드라이버가 원본 텍스처에서 대상 텍스처로 Blt 작업을 수행하도록 알릴 수 있습니다. 텍스처는 입방 환경 맵일 수도 있습니다. 드라이버는 원본 텍스처의 rSrc 로 지정된 사각형을 대상 텍스처의 pDest 로 지정된 위치에 복사해야 합니다. 대상 및 원본 텍스처는 텍스처를 만드는 동안 드라이버에 알림을 받은 핸들로 식별됩니다. 드라이버가 텍스처를 관리할 수 있는 경우 대상 핸들이 0일 수 있습니다. 이는 드라이버에 텍스처를 비디오 메모리(또는 하드웨어가 효율적으로 텍스처를 제공하는 곳)에 미리 로드해야 했음을 나타냅니다. 이 경우 드라이버는 rSrcpDest를 무시할 수 있습니다.

MIP 매핑된 텍스처의 경우 D3dDrawPrimitives2 명령 스트림에 하나의 D3DDP2OP_TEXBLT 명령만 삽입됩니다. 이 경우 드라이버는 텍스처에 있는 모든 MIP 맵 수준을 blt해야 합니다. MIP 맵에 복사할 영역은 각 수준에서 rSrcpDest 를 2로 나누어 얻을 수 있습니다.

원본 및 대상 텍스처에 다양한 수의 MIP 맵 수준이 포함될 수 있습니다. 이 경우 드라이버는 공통 수준을 blt해야 합니다. 예를 들어 256x256 원본 텍스처에 8MIP 맵 수준이 있고 대상이 6개 수준이 있는 64x64 텍스처인 경우 드라이버는 원본에서 해당 수준 6을 blt해야 합니다. 드라이버는 대상 텍스처의 최상위 MIP 수준의 크기가 항상 원본 텍스처의 최상위 MIP 수준 차원보다 작거나 같을 것으로 예상할 수 있습니다.

원본 및 대상 핸들은 항상 최상위 표면을 참조하며 MIP 맵 하위 수준도 참조하지 않습니다. 애플리케이션의 오류로 인해 대상 텍스처에 추가 MIP 맵 수준이 포함될 수 있습니다. 예를 들어 원본 256x256 텍스처에는 5개의 수준이 포함될 수 있지만 대상 256x256 텍스처에는 8개가 포함될 수 있습니다. 드라이버는 이 사례를 안전하게 처리해야 하지만 올바른 결과를 생성하지는 않을 것으로 예상됩니다. 레거시 애플리케이션 호환성 문제로 인해 Direct3D는 이러한 원본/대상 텍스처 쌍이 드라이버에 전달되는 것을 방지하지 않습니다.

드라이버는 원본 및 대상 텍스처의 픽셀 형식이 동일할 것으로 예상할 수 있으며 일반적으로 지정된 Blt을 안전하게 수행할 수 있습니다. 위에서 언급한 단일 사례 이외에는 드라이버가 Blt을 수행할 수 없는 상황을 예상해서는 안 됩니다.

드라이버가 시스템 메모리에서 비디오 메모리로 비동기 Blt을 수행하려는 경우 DirectDraw HAL 호출 GetSysmemBltStatus를 구현해야 합니다. 그렇지 않으면 불일치가 발생할 수 있습니다.

TexBlt에서는 렌더링 명령과 함께 TexBlts가 항상 적절한 순서로 실행되므로 드라이버가 동기화를 수행할 필요가 없습니다. 그 전에는 DirectDraw Blt이 Direct3D 컨텍스트에서 명령을 렌더링하여 참조된 텍스처를 수정했을 때 드라이버가 사례를 올바르게 처리해야 했습니다. 여러 컨텍스트가 있는 경우 Direct3D는 TexBlts를 실행하지 않습니다. 즉, 드라이버 작성기는 TexBlt 코드 경로에서 동기화 코드를 생략할 수 있지만 여전히 Blt에 대한 동기화가 필요합니다.

샘플

다음 의사 코드는 MIP 수준 i에서 MIP 수준 i + 1로 이동하려면 연속 MIP 수준에 대해 하위 사각형을 계산하는 방법을 보여 줍니다.

rect.left >>= 1; 
rect.top >>= 1; 
DWORD right = (rect.right + 1) >> 1; 
DWORD bottom = (rect.bottom + 1) >> 1; 
rect.right = ((right - rect.left) < 1) ? 
    (rect.left + 1) : (right); 
rect.bottom = ((bottom - rect.top ) < 1) ? 
    (rect.top + 1) : (bottom);

요구 사항

요구 사항
헤더 d3dhal.h(D3dhal.h 포함)

추가 정보

D3DDP2OP_TEXBLT

D3dCreateSurfaceEx

D3dDrawPrimitives2