Direct3D 명령 버퍼
다음 그림에서는 샘플 논리 명령 버퍼의 일부를 보여 줍니다. 드라이버의 D3dDrawPrimitives2 콜백은 D3DHAL_DRAWPRIMITIVES2DATA 구조체의 lpDDCommands 멤버에 있는 명령 버퍼에 대한 포인터를 받습니다. 명령 버퍼는 항상 순차적으로 처리됩니다.

앞의 그림과 같이 명령 버퍼에는 각 구조체의 bCommand 멤버가 명령을 식별하는 D3DHAL_DP2COMMAND 구조체가 포함됩니다. 다음은 가능한 명령을 나열합니다.
D3DDP2OP_RENDERSTATE 명령 버퍼 뒤에 wStateCountD3DHAL_DP2RENDERSTATE 구조체가 있음을 나타냅니다. 드라이버는 이러한 각 구조에서 상태를 구문 분석하고 그에 따라 프라이빗 드라이버 상태를 업데이트해야 합니다. 또한 드라이버는 lpdwRStates 가 가리키는 배열의 적절한 상태를 업데이트해야 합니다. 드라이버가 명령 버퍼에서 요청된 상태를 지원하지 않는 경우 드라이버는 요청된 값을 지원하는 값으로 재정의해야 합니다.
D3DDP2OP_TEXTURESTAGESTATE 명령 버퍼 뒤에 wStateCountD3DHAL_DP2TEXTURESTAGESTATE 구조체가 있음을 나타냅니다. 드라이버는 이러한 각 구조에서 상태를 구문 분석하고 지정된 텍스처 스테이지와 연결된 드라이버의 텍스처 상태를 적절하게 업데이트해야 합니다. 드라이버는 Direct3D 런타임에 텍스처 스테이지 상태를 다시 보고하지 않습니다.
실제로 사용하는 좌표 집합 수에 관계없이 최대 8개의 텍스처 좌표 집합을 제대로 구문 분석하려면 드라이버가 필요합니다.
D3DDP2OP_VIEWPORTINFO 명령 버퍼에 뒤에 D3DHAL_DP2VIEWPORTINFO 구조 가 하나 있음을 나타냅니다. 드라이버는 이 구조를 구문 분석하고 드라이버의 내부 렌더링 컨텍스트에 저장된 뷰포트 정보를 업데이트해야 합니다.
D3DDP2OP_WINFO 명령 버퍼에 뒤에 하나의 D3DHAL_DP2WINFO 구조가 있음을 나타냅니다. 드라이버는 이 구조를 구문 분석하고 드라이버의 내부 렌더링 컨텍스트에 저장된 w 버퍼 정보를 업데이트해야 합니다.
나머지 D3DDP2OP_Xxx 명령은 명령 버퍼에 wPrimitiveCount ( D3DHAL_DP2COMMAND 구조체의 멤버) 기본 형식을 렌더링하기에 충분한 데이터가 있음을 나타냅니다. 기본 명령에 따라 드라이버는 명령 버퍼의 D3DHAL_DP2 Xxx 구조와 꼭짓점 버퍼와 명령 버퍼 둘 다에서 꼭짓점 관련 데이터를 구문 분석해야 합니다. 드라이버는 유효한 모든 D3DDP2OP_Xxx 명령을 처리해야 합니다. 즉, 드라이버는 정의된 특정 기본 형식을 무시하도록 선택할 수 없습니다. 자세한 내용은 개별 D3DHAL_DP2 Xxx 구조 참조 페이지를 참조하세요.
현재 명령에 따라 다음 추가 정보가 명령 버퍼에 저장됩니다.
모든 D3DDP2OP_INDEXED Xxx 기본 명령에 대한 인덱스 정보입니다.
D3DDP2OP_TRIANGLEFAN_IMM 및 D3DDP2OP_LINELIST_IMM 기본 명령에 대한 꼭짓점 데이터입니다.
추가 작업은 D3DHAL_DP2OPERATION 구조에서 D3DDP2OP_Xxx opcode로 정의됩니다. 이러한 명령은 이름이 같은 D3DDP2OP_Xxx 명령과 동일합니다.
명령 버퍼에는 경우에 따라 Direct3D에서만 인식되는 명령이 포함됩니다. 드라이버의 D3dDrawPrimitives2 콜백이 명령을 인식하지 못하는 경우 드라이버는 Direct3D의 D3dParseUnknownCommand 콜백을 호출하여 구문 분석을 시도해야 합니다. D3dParseUnknownCommand가 성공적으로 반환되면 드라이버는 명령 버퍼를 계속 구문 분석하고 처리해야 합니다. D3DERR_COMMAND_UNPARSED 반환하여 D3dParseUnknownCommand 가 실패하는 경우 D3dDrawPrimitives2 는 D3DHAL_DRAWPRIMITIVES2DATA 구조체의 다음 멤버를 설정하고 반환해야 합니다.
dwErrorOffset에서 lpDDCommands가 가리키는 버퍼의 일부인 처리되지 않은 첫 번째 D3DHAL_DP2COMMAND 구조체의 오프셋을 작성합니다.
ddrval을 D3DERR_COMMAND_UNPARSED 설정합니다.
D3dParseUnknownCommand 콜백을 초기화하는 방법에 대한 자세한 내용은 Direct3D 드라이버 초기화를 참조하세요.
D3dDrawPrimitives2의 구현을 간소화하기 위해 드라이버 작성기는 Perm3 샘플 코드에서 구문 분석 코드를 복사하고 드라이버별 렌더링 및 상태 업데이트 코드만 작성할 수 있습니다.
참고 Microsoft Windows 드라이버 키트(WDK)에는 3Dlabs Permedia3 샘플 디스플레이 드라이버(Perm3.h)가 포함되어 있지 않습니다. WDHC 웹 사이트의 DDK - Windows 드라이버 개발 키트 페이지에서 다운로드할 수 있는 Windows Server 2003 SP1 DDK(드라이버 개발 키트)에서 이 샘플 드라이버를 가져올 수 있습니다.
Direct3D는 항상 현재 렌더링 상태를 알 수 없습니다. 예를 들어 실행 버퍼는 드라이버에 도달하기 전에 런타임에서 검사하지 않습니다. 드라이버는 D3DHAL_DRAWPRIMITIVES2DATA 구조체의 lpdwRStates 멤버를 사용하여 렌더링 상태 배열을 추적할 수 있습니다. 이는 상태 변경이 발생할 때 드라이버가 최신 상태로 유지하는 내부 렌더링 상태 배열에 대한 포인터입니다.