다음을 통해 공유


LPD3DHAL_DRAWPRIMITIVES2CB 콜백 함수(d3dhal.h)

D3dDrawPrimitives2 함수는 기본 형식을 렌더링하고 업데이트된 렌더링 상태를 반환합니다.

구문

LPD3DHAL_DRAWPRIMITIVES2CB Lpd3dhalDrawprimitives2cb;

DWORD Lpd3dhalDrawprimitives2cb(
  LPD3DHAL_DRAWPRIMITIVES2DATA unnamedParam1
)
{...}

매개 변수

unnamedParam1

pdp [in]

드라이버가 하나 이상의 기본 형식을 렌더링하는 데 필요한 정보를 포함하는 D3DHAL_DRAWPRIMITIVES2DATA 구조를 가리킵니다.

반환 값

D3dDrawPrimitives2 는 다음 콜백 코드 중 하나를 반환합니다.

설명

D3dDrawPrimitives2 는 Microsoft Direct3D 드라이버에서 구현해야 합니다.

드라이버는 다음을 수행해야 합니다.

  • pdp에서 D3DHAL_DRAWPRIMITIVES2DATA 구조체의 dwhContext 멤버가 지정한 컨텍스트 핸들이 유효한지 확인합니다.
  • 컨텍스트와 연결된 그리기 화면으로의 대칭 이동이 진행 중이 아닌지 확인합니다. 드로잉 표면이 대칭 이동과 관련된 경우 드라이버는 D3DHAL_DRAWPRIMITIVES2DATA ddrval 멤버를 DDERR_WASSTILLDRAWING 설정하고 DDHAL_DRIVER_HANDLED 반환해야 합니다.
  • D3DHAL_DRAWPRIMITIVES2DATA lpDDCommands 멤버가 가리키는 명령 버퍼에 D3DHAL_DRAWPRIMITIVES2DATAdwCommandOffset 멤버의 바이트 수를 추가하여 첫 번째 D3DHAL_DP2COMMAND 구조체의 위치를 결정합니다.
  • 꼭짓점 버퍼에서 첫 번째 꼭짓점의 위치를 결정합니다. 꼭짓점 버퍼에 데이터가 있는 경우에만 이 작업을 수행해야 합니다. 즉, D3DDP2OP_Xxx 명령 토큰이 수신되는 경우입니다(토큰이 D3DDP2OP_LINELIST_IMM 또는 D3DDP2OP_TRIANGLEFAN_IMM 경우 제외). 이러한 두 opcode는 꼭짓점 데이터가 꼭짓점 버퍼가 아닌 명령 스트림에서 즉시 전달됨을 나타냅니다. 따라서 꼭짓점 버퍼에 데이터가 있다고 가정하고 꼭짓점 버퍼가 사용자 메모리에 있는 경우 첫 번째 꼭짓점은 lpVertices가 가리키는 버퍼에 대한 dwVertexOffset 바이트입니다. 그렇지 않으면 드라이버가 lpDDVertex가 가리키는 DD_SURFACE_LOCAL 구조체와 연결된 메모리에 dwVertexOffset을 적용해야 합니다. dwVertexOffset, lpVerticeslpDDVertex 는 D3DHAL_DRAWPRIMITIVES2DATA 멤버입니다.
  • 드라이버가 요청된 FVF를 지원하는지 확인하려면 D3DHAL_DRAWPRIMITIVES2DATA dwVertexType 멤버를 확인합니다. 다음 조건 중 하나라도 있는 경우 드라이버는 호출에 실패해야 합니다.
    • 꼭짓점 좌표는 지정되지 않았습니다. 즉, D3DFVF_XYZRHW 설정되지 않은 경우 입니다.
    • Normals가 지정됩니다. 즉, D3DFVF_NORMAL 설정된 경우 입니다.
    • 예약된 D3DFVF_RESERVED x 비트가 모두 설정됩니다.
  • 명령 버퍼의 모든 명령을 순차적으로 처리합니다. 각 D3DHAL_DP2COMMAND 구조에 대해 드라이버는 다음을 수행해야 합니다.
    • 명령이 D3DDP2OP_RENDERSTATE 경우 명령 버퍼에서 이어지는 wStateCount D3DHAL_DP2RENDERSTATE 구조를 처리하여 각 렌더링 상태 구조에 대한 드라이버 상태를 업데이트합니다. D3DHALDP2_EXECUTEBUFFER 플래그가 설정되면 드라이버는 lpdwRStates 가 가리키는 배열의 상태 변경 내용도 반영해야 합니다. wStateCount lpdwRStates 는 D3DHAL_DRAWPRIMITIVES2DATA 멤버입니다.
    • 명령이 D3DDP2OP_TEXTURESTAGESTATE 경우 명령 버퍼에 따라 wStateCount D3DHAL_DP2TEXTURESTAGESTATE 구조를 처리하여 각 텍스처 상태 구조에 대해 지정된 텍스처 스테이지와 연결된 드라이버의 텍스처 상태를 업데이트합니다.
    • 명령이 D3DDP2OP_VIEWPORTINFO 경우 명령 버퍼에서 이어지는 D3DHAL_DP2VIEWPORTINFO 구조를 처리하여 드라이버의 내부 렌더링 컨텍스트에 저장된 뷰포트 정보를 업데이트합니다.
    • 명령이 D3DDP2OP_WINFO 경우 명령 버퍼에서 이어지는 D3DHAL_DP2WINFO 구조를 처리하여 드라이버의 내부 렌더링 컨텍스트에 저장된 w 버퍼링 정보를 업데이트합니다.
    • 그렇지 않으면 명령 버퍼의 D3DDP2OP_Xxx 기본 렌더링 명령 뒤에 있는 D3DHAL_DP2 Xxx 기본 구조체를 처리합니다.
    • 명령을 알 수 없는 경우 런타임의 D3dParseUnknownCommand 콜백을 호출합니다. 런타임은 GUID_D3DParseUnknownCommandCallback GUID를 사용하여 드라이버의 DdGetDriverInfo 콜백에 이 콜백을 제공합니다.
드라이버는 명령 및 꼭짓점 버퍼가 저장된 메모리의 가독성을 검색할 필요가 없습니다. 그러나 드라이버는 D3DHAL_DRAWPRIMITIVES2DATA dwCommandLengthdwVertexLength 멤버가 지정한 범위 내에 있어야 합니다.

드라이버가 D3dDrawPrimitives2에 실패해야 하는 경우 처리되지 않은 첫 번째 D3DHAL_DP2COMMAND 찾을 수 있는 명령 버퍼에 오프셋을 사용하여 D3DHAL_DRAWPRIMITIVES2DATA dwErrorOffset 멤버를 채워야 합니다.

참고 다음 주석은 Microsoft DirectX 7.0 인터페이스를 사용하여 작성되었으며 DirectX 8.0 및 DirectX 8.1 런타임을 통해 드라이버와 통신하는 애플리케이션에만 유효합니다.

이러한 애플리케이션은 더 이상 현재 꼭짓점 버퍼의 개념을 사용하지 않기 때문에 DirectX 8.0 이상 인터페이스를 사용하여 작성된 애플리케이션에는 다음 주석이 유효하지 않습니다(즉, 꼭짓점 데이터는 더 이상 D3DHAL_DRAWPRIMITIVES2DATA lpDDVertex 멤버를 통해 전달되지 않음). 따라서 이러한 애플리케이션에서 드라이버의 D3dDrawPrimitives2 함수는 버퍼가 암시적이거나 명시적이고 미해결 잠금이 있어도 꼭짓점 버퍼에서 렌더링이 중단되지 않아야 합니다.

 
드라이버가 DirectX 8.1 이상 런타임과 함께 사용되는 경우 드라이버의 D3dDrawPrimitives2 함수는 버퍼가 암시적일 경우 현재 꼭짓점 버퍼( lpDDVertex를 통해 전달됨)에서 렌더링이 중단되지 않아야 합니다. 버퍼가 명시적이고 미해결 잠금이 있는 경우 버퍼의 이름을 바꾸지 않으면 드라이버가 D3dDrawPrimitives2 함수의 끝에서 중단되어야 합니다(D3DHALDP2_SWAPVERTEXBUFFER 설정되지 않음). 드라이버가 버퍼의 이름을 바꾸면 드라이버가 중단되지 않습니다. DirectX 8.1 이상 런타임은 드라이버의 D3dDrawPrimitives2 함수를 호출하여 필요한 경우에만 잠긴 명시적 꼭짓점 버퍼에서 렌더링하므로 성능에 거의 영향을 미치지 않습니다. 암시적 꼭짓점 버퍼는 DDSCAPS_EXECUTEBUFFER 플래그 집합만 사용하여 드라이버의 CreateD3DBuffer 콜백에 의해 만들어집니다. 명시적 꼭짓점 버퍼는 DDSCAPS_EXECUTEBUFFER 및 DDSCAPS2_VERTEXBUFFER 플래그가 설정된 드라이버의 CreateD3DBuffer 콜백에 의해 만들어집니다. 명시적 꼭짓점 버퍼는 드라이버의 LockD3DBuffer 콜백에 의해 잠깁니다.

드라이버가 DirectX 8.0 런타임과 함께 사용되는 경우 동기화 문제 및 결과 손상을 방지하기 위해 암시적 현재 꼭짓점 버퍼에서 렌더링할 때 드라이버가 중단되는 경우가 있습니다. 또한 DirectX 8.0 런타임은 드라이버의 D3dDrawPrimitives2 함수를 호출하여 잠긴 명시적 현재 꼭짓점 버퍼에서 렌더링하는 경우가 더 자주 발생하므로 성능이 저하됩니다. 다음은 DirectX 8.0 런타임과 함께 사용되는 드라이버에 대한 해결 방법을 중단하는 것입니다.

  • 드라이버가 사용자 메모리 기본 형식 렌더링(D3DHALDP2_USERMEMVERTICES 식별)과 암시적 현재 꼭짓점 버퍼에서 렌더링 간에 전환할 때 버퍼의 이름이 바뀌지 않는 경우에만(D3DHALDP2_SWAPVERTEXBUFFER 설정되지 않음) 드라이버가 중단되어야 합니다.

    다음 예제에서는 D3dDrawPrimitives2 가 암시적 현재 꼭짓점 버퍼에서 중단되어야 하는 경우를 보여줍니다.

    DrawPrimitives2(p*, D3DHALDP2_USERMEMVERTICES); // Do not stall
    DrawPrimitives2(Implicit VB, 0); // Stall 
    

    다음 예제에서는 D3dDrawPrimitives2 가 암시적 현재 꼭짓점 버퍼에서 중단되지 않아야 하는 경우를 보여줍니다.

    DrawPrimitives2(p*, D3DHALDP2_USERMEMVERTICES); // Do not stall
    DrawPrimitives2(Explicit VB, 0); // Do not stall if not locked
    DrawPrimitives2(Explicit VB, D3DHALDP2_SWAPVERTEXBUFFER); // Do not stall whether locked
    DrawPrimitives2(Implicit VB, 0); // Do not stall whether locked
    DrawPrimitives2(Implicit VB, 0); // Do not stall whether locked
    DrawPrimitives2(p*, D3DHALDP2_USERMEMVERTICES); // Do not stall
    DrawPrimitives2(Implicit VB, D3DHALDP2_SWAPVERTEXBUFFER); // Do not stall because D3DHALDP2_SWAPVERTEXBUFFER is set
    

    런타임이 D3DHALDP2_REQCOMMANDBUFSIZE 플래그를 설정하는 경우 드라이버가 중단되지 않아도 됩니다. 우연의 일치로 DirectX 8.0 런타임은 잠긴 명시적 현재 꼭짓점 버퍼에서 가장 일반적으로 렌더링되는 경우 D3DHALDP2_REQCOMMANDBUFSIZE 설정합니다. 따라서 드라이버는 잠긴 명시적 현재 꼭짓점 버퍼에서 렌더링하는 동안 D3DHALDP2_REQCOMMANDBUFSIZE 감지할 때 중단되지 않음으로써 성능을 향상시킬 수 있습니다.

    다음 예제에서는 명시적 현재 꼭짓점 버퍼에서 D3dDrawPrimitives2 가 중단되어야 하는 경우를 보여 있습니다.

    DrawPrimitives2(Explicit VB, 0); // Stall when locked (happens rarely)
    

    다음 예제에서는 D3dDrawPrimitives2 가 명시적 현재 꼭짓점 버퍼에서 중단되지 않아야 하는 경우를 보여 있습니다.

    DrawPrimitives2(Explicit VB, D3DHALDP2_REQCOMMANDBUFSIZE); // Do not stall whether locked
    DrawPrimitives2(Explicit VB, D3DHALDP2_SWAPVERTEXBUFFER); // Do not stall whether locked
    DrawPrimitives2(Explicit VB, D3DHALDP2_SWAPVERTEXBUFFER | D3DHALDP2_REQCOMMANDBUFSIZE); // Do not stall
    

    요구 사항

    요구 사항
    대상 플랫폼 데스크톱
    머리글 d3dhal.h(D3dhal.h 포함)

    추가 정보

    D3DHAL_DP2INDEXEDLINELIST

    D3DHAL_DP2INDEXEDLINESTRIP

    D3DHAL_DP2INDEXEDTRIANGLEFAN

    D3DHAL_DP2INDEXEDTRIANGLELIST

    D3DHAL_DP2INDEXEDTRIANGLESTRIP

    D3DHAL_DP2LINELIST

    D3DHAL_DP2LINESTRIP

    D3DHAL_DP2POINTS

    D3DHAL_DP2TRIANGLEFAN

    D3DHAL_DP2TRIANGLELIST

    D3DHAL_DP2TRIANGLESTRIP

    FVF