비동기 쿼리 처리

드라이버는 다음 시퀀스에서 설명한 대로 D3dDrawPrimitives2 함수의 명령 스트림에서 수신되는 비동기 쿼리 작업을 처리합니다.

  1. 드라이버는 명령 스트림의 D3DHAL_DP2CREATEQUERY 구조와 함께 D3DDP2OP_CREATEQUERY 작업 코드를 받은 후 쿼리에 대한 리소스를 만듭니다.

  2. 드라이버는 명령 스트림의 D3DHAL_DP2ISSUEQUERY 구조와 함께 D3DDP2OP_ISSUEQUERY 작업 코드를 받은 후 쿼리를 처리하기 시작합니다.

  3. 이전에 D3DDP2OP_ISSUEQUERY 작업을 사용하여 쿼리를 제출한 경우 드라이버는 D3DHAL_DRAWPRIMITIVES2DATA 구조체dwErrorOffset 멤버에 있는 응답 버퍼의 크기를 설정하고 D3DHAL_DRAWPRIMITIVES2DATA ddrval 멤버를 성공적으로 완료하기 위해 D3D_OK 설정합니다. 드라이버는 나가는 스트림의 응답 버퍼를 사용하여 들어오는 명령 스트림의 명령 버퍼를 덮어씁니다. 드라이버는 D3DHAL_DP2RESPONSE 구조체의 bCommand 멤버를 D3DDP2OP_RESPONSEQUERY 설정하여 이전에 실행한 쿼리에 대한 응답을 응답 버퍼에서 사용할 수 있음을 나타냅니다. 응답 버퍼의 각 D3DHAL_DP2RESPONSEQUERY 쿼리와 관련된 다음 데이터가 뒤따릅니다.

    • D3DQUERYTYPE_EVENT 대한 BOOL입니다. 이벤트에 대한 D3DDP2OP_RESPONSEQUERY 응답하기 전에 드라이버는 GPU(그래픽 처리 장치)가 이벤트와 관련된 모든 D3DHAL_DP2OPERATION 작업 처리를 완료하는지 확인해야 합니다. 즉, 드라이버는 이벤트의 ISSUE_END 상태가 발생한 후에만 응답합니다. 드라이버가 이벤트를 신호 상태( TRUE로 설정)로 설정하기 전에 GPU는 픽셀 래스터화가 완료되고 Blt가 완료되고 리소스가 더 이상 사용되지 않도록 플러시를 수행해야 할 수 있습니다. 드라이버는 응답할 때 항상 이벤트의 BOOL 값을 TRUE 로 설정해야 합니다.
    • DWORD for D3DQUERYTYPE_OCCLUSION. 드라이버는 이 DWORD를 쿼리의 시작과 끝 사이의 모든 기본 형식에 대해 z-test가 통과한 픽셀 수로 설정합니다. 깊이 버퍼가 다중 샘플링된 경우 드라이버는 샘플 수에서 픽셀 수를 결정합니다. 그러나 디스플레이 디바이스가 다중 샘플링 z 테스트 정확도를 사용할 수 있는 경우 일반적으로 픽셀 수로 변환해야 합니다. 그런 다음 애플리케이션은 폐색 결과를 0에 대해 확인하여 효과적으로 "완전히 폐색됨"을 의미할 수 있습니다. 다중 샘플링된 수량을 픽셀 수량으로 변환하는 드라이버는 렌더링 대상 다중 샘플링 변경 내용을 검색하고 쿼리 결과를 적절하게 계속 계산해야 합니다.
    • D3DQUERYTYPE_VCACHE 대한 D3DDEVINFO_VCACHE 구조체입니다.

    제공된 명령 버퍼가 드라이버가 모든 응답을 작성하기에 너무 작으면 드라이버가 나가는 스트림에 D3DDP2OP_RESPONSECONTINUE 보냅니다.

  4. 런타임에서 드라이버의 D3dDrawPrimitives2 함수가 성공한 것으로 확인되면(D3DHAL_DRAWPRIMITIVES2DATA ddrval 멤버가 D3D_OK 설정) 런타임은 D3DHAL_DRAWPRIMITIVES2DATA dwErrorOffset 멤버를 검사하여 드라이버에서 응답을 사용할 수 있는지 확인합니다. 이 dwErrorOffset 멤버는 응답이 없는 경우 0입니다. 그렇지 않으면 dwErrorOffset 은 응답 버퍼의 크기(바이트)입니다. 따라서 D3dDrawPrimitives2 (ddrval 이 D3D_OK 설정)의 성공 시 드라이버는 응답을 사용할 수 있는 경우에만 dwErrorOffset 을 0이 아닌 값으로 설정해야 합니다.

  5. 런타임은 반환된 응답 버퍼를 구문 분석하고 내부 데이터 구조를 업데이트합니다.

  6. 드라이버가 D3DDP2OP_RESPONSECONTINUE 보낸 경우 런타임은 들어오는 명령 스트림 에 빈 명령 버퍼를 제출하여 드라이버가 계속해서 더 많은 응답을 작성할 수 있도록 합니다. 드라이버는 빈 명령 버퍼를 처리할 수 있는지 확인해야 합니다.