PFND3DDDI_RENDERCB 콜백 함수(d3dumddi.h)
pfnRenderCb 함수는 디스플레이 미니포트 드라이버에 렌더링하기 위한 현재 명령 버퍼를 제출합니다.
구문
PFND3DDDI_RENDERCB Pfnd3dddiRendercb;
HRESULT Pfnd3dddiRendercb(
HANDLE hDevice,
D3DDDICB_RENDER *unnamedParam2
)
{...}
매개 변수
hDevice
디스플레이 디바이스(그래픽 컨텍스트)에 대한 핸들입니다.
unnamedParam2
pData [in, out]
렌더링할 현재 명령 버퍼를 설명하는 D3DDDICB_RENDER 구조체에 대한 포인터입니다.
반환 값
pfnRenderCb 는 다음 값 중 하나를 반환합니다.
반환 코드 | 설명 |
---|---|
S_OK | 명령 버퍼가 성공적으로 렌더링되었습니다. |
D3DDDIERR_PRIVILEGEDINSTRUCTION | 표시 미니포트 드라이버가 명령 버퍼에서 권한 있는 명령을 감지했습니다. 권한 있는 지침은 명령 버퍼에 있을 수 없습니다. |
D3DDDIERR_ILLEGALINSTRUCTION | 디스플레이 미니포트 드라이버에서 그래픽 하드웨어에서 지원할 수 없는 지침을 감지했습니다. |
D3DDDIERR_INVALIDHANDLE | 표시 미니포트 드라이버가 명령 버퍼에서 잘못된 핸들을 감지했습니다. |
D3DDDIERR_CANTRENDERLOCKEDALLOCATION | 비디오 메모리 관리자가 할당 목록에서 잠긴 할당에 대한 참조를 검색했습니다. 비디오 메모리 관리자는 할당 위치를 AGP 또는 시스템 메모리 세그먼트로 변경할 수 없는 경우에만 이 오류를 반환합니다. |
D3DDDIERR_INVALIDUSERBUFFER | 디스플레이 미니포트 드라이버가 데이터 또는 명령의 언더런 또는 오버런을 감지했습니다. 즉, 드라이버가 예상보다 적은 수의 명령 또는 데이터를 수신했습니다. |
E_OUTOFMEMORY | pfnRenderCb는 메모리 부족으로 인해 완료할 수 없습니다. |
E_INVALIDARG | 매개 변수의 유효성이 검사되었고 잘못된 것으로 확인되었습니다. |
이 함수는 다른 HRESULT 값을 반환할 수도 있습니다.
설명
사용자 모드 표시 드라이버가 디스플레이 미니포트 드라이버에 렌더링하기 위해 현재 명령 버퍼를 제출해야 하는 경우(예: 사용자 모드 디스플레이 드라이버의 Flush 또는 Flush(D3D10) 함수를 호출하는 동안) 사용자 모드 표시 드라이버는 pfnRenderCb 함수를 호출해야 합니다. 사용자 모드 표시 드라이버는 hDevice 매개 변수를 CreateDevice 또는 CreateDevice(D3D10) 호출 중에 제공한 Microsoft Direct3D 런타임 값으로 설정해야 합니다. pData 매개 변수가 가리키는 D3DDDICB_RENDER 구조에서 사용자 모드 표시 드라이버도 다음을 설정해야 합니다.
- CommandLength 멤버는 오프셋 0에서 시작하는 명령 버퍼의 명령 바이트 수입니다.
- 사용자 모드 표시 드라이버가 명령 버퍼의 첫 번째 하드웨어 명령에 대한 오프셋을 지정해야 하는 경우 CommandOffset 멤버는 0이 아닌 멤버입니다.
- 할당 목록의 요소 수에 대한 NumAllocations 멤버입니다.
- 패치 위치 목록의 요소 수에 대한 NumPatchLocations 멤버입니다.
사용자 모드 표시 드라이버에서 명령 버퍼 플러시 대부분이 명령 버퍼, 할당 목록 또는 패치 위치 목록의 공간이 부족하여 명령 버퍼 플러시를 감지하는 경우 드라이버가 크기 조정을 요청할 수 있습니다. 명령 버퍼의 크기를 조정하기 위해 드라이버는 D3DDDICB_RENDER Flags 멤버에 ResizeCommandBuffer 비트 필드 플래그를 설정하고 요청된 크기를 D3DDDICB_RENDERNewCommandBufferSize 멤버에 넣습니다. 마찬가지로 할당 목록의 크기를 조정하기 위해 드라이버는 D3DDDICB_RENDER Flags 멤버에서 ResizeAllocationList 비트 필드 플래그를 설정하고 요청된 요소 수를 D3DDDICB_RENDER NewAllocationListSize 멤버에 배치합니다. 패치 위치 목록의 크기를 조정하기 위해 드라이버는 D3DDDICB_RENDER Flags 멤버에서 ResizePatchLocationList 비트 필드 플래그를 설정하고 요청된 요소 수를 D3DDDICB_RENDER NewPatchLocationListSize 멤버에 배치합니다.
예제
다음 코드 예제에서는 디스플레이 미니포트 드라이버에 렌더링하기 위해 현재 명령 버퍼를 제출하는 방법을 보여 줍니다. 이 코드 예제에서는 명령 버퍼 및 패치 목록이 생성된 후 할당 목록을 생성합니다. 명령 버퍼가 필요 이상으로 구문 분석되므로 성능에 적합하지 않습니다. 그러나 이 구현은 더 쉽게 표시할 수 있습니다. 프로덕션 드라이버에서 할당 및 패치 목록과 동시에 명령 버퍼를 생성하는 것이 더 효율적입니다.
VOID CD3DContext::SubmitDXVABuffer(DWORD Size) {
D3DDDICB_RENDER renderCBData = {0};
DWORD dwAllocationListUsed;
HRESULT hr;
if (GenerateAllocationListFromCmdBuf(R200UpdateQSParamsForDXVASubmit(m_pR200Ctx, Size), m_sContexts[MULTI_ENGINE_NODE_VIDEO].pHwCmdBufAllocList, m_dwHwCmdBufAllocListSize, &dwAllocationListUsed) == FALSE)
{
DBG_BREAK;
return;
}
// 3-D and video packets must be in sync. If the last packet that was sent went to
// the 3-D engine, that packet must finish before the new packet runs on the hardware.
renderCBData.CommandOffset = 0;
renderCBData.CommandLength = Size + sizeof(UMD_CMDBUF_INFO);
renderCBData.NumAllocations = dwAllocationListUsed;
renderCBData.hContext = m_sContexts[MULTI_ENGINE_NODE_VIDEO].hContext;
// Copy command-buffer data from the internal buffer to the buffer that was created by dxgkrnl
memcpy(m_sContexts[MULTI_ENGINE_NODE_VIDEO].pHwCmdBuf, m_pHwCmdBuf + GetCmdBufPreambleSize(m_pR200Ctx), renderCBData.CommandLength);
m_d3dCallbacks.pfnRenderCb(m_hD3D, &renderCBData);
// Makes video the last engine that work was submitted to
m_LastEngineSubmit = MULTI_ENGINE_NODE_VIDEO;
}
요구 사항
요구 사항 | 값 |
---|---|
지원되는 최소 클라이언트 | Windows Vista 이상 버전의 Windows 운영 체제에서 사용할 수 있습니다. |
대상 플랫폼 | 데스크톱 |
머리글 | d3dumddi.h(D3dumddi.h 포함) |