다음을 통해 공유


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 멤버입니다.
pfnRenderCb를 호출한 후 사용자 모드 표시 드라이버는 D3DDDICB_RENDER pNewCommandBufferNewCommandBufferSize 멤버에 반환되는 값에서 다음 제출에 사용해야 하는 명령 버퍼의 기본 주소와 크기를 결정해야 합니다. 마찬가지로 드라이버는 pNewAllocationList 및 NewAllocationListSize 멤버 및 pNewPatchLocationListNewPatchLocationListSize 멤버에 각각 반환 되는 값에서 다음 할당 목록 및 패치 위치 목록의 기본 주소와 요소 수를 결정해야 합니다.

사용자 모드 표시 드라이버에서 명령 버퍼 플러시 대부분이 명령 버퍼, 할당 목록 또는 패치 위치 목록의 공간이 부족하여 명령 버퍼 플러시를 감지하는 경우 드라이버가 크기 조정을 요청할 수 있습니다. 명령 버퍼의 크기를 조정하기 위해 드라이버는 D3DDDICB_RENDER Flags 멤버에 ResizeCommandBuffer 비트 필드 플래그를 설정하고 요청된 크기를 D3DDDICB_RENDERNewCommandBufferSize 멤버에 넣습니다. 마찬가지로 할당 목록의 크기를 조정하기 위해 드라이버는 D3DDDICB_RENDER Flags 멤버에서 ResizeAllocationList 비트 필드 플래그를 설정하고 요청된 요소 수를 D3DDDICB_RENDER NewAllocationListSize 멤버에 배치합니다. 패치 위치 목록의 크기를 조정하기 위해 드라이버는 D3DDDICB_RENDER Flags 멤버에서 ResizePatchLocationList 비트 필드 플래그를 설정하고 요청된 요소 수를 D3DDDICB_RENDER NewPatchLocationListSize 멤버에 배치합니다.

참고 드라이버가 명령 버퍼 및 할당 및 패치 위치 목록의 크기를 조정하도록 요청할 수 있지만 비디오 메모리 관리자가 이를 준수하지 못할 수 있습니다. 따라서 pfnRenderCb 호출이 성공했는지 여부에 관계없이 드라이버는 D3DDDICB_RENDER NewCommandBufferSize,NewAllocationListSizeNewPatchLocationListSize 멤버에 반환되는 값을 확인해야 합니다.
 
사용자 모드 표시 드라이버가 pData 매개 변수가 가리키는 D3DDDICB_RENDER 구조체의 hContext 멤버를 NULL로 설정하는 경우 Microsoft Direct3D 런타임은 렌더링 작업을 디바이스의 기본 컨텍스트로 보냅니다. 사용자 모드 표시 드라이버가 hContextpfnCreateContextCb 함수가 이전에 반환하고 디바이스 컨텍스트를 나타내는 유효한 핸들로 설정하는 경우 Direct3D 런타임은 렌더링 작업을 해당 컨텍스트로 보냅니다. Direct3D 버전 11 참고: 드라이버가 pfnRenderCb를 호출하는 방법에 대한 자세한 내용은 Direct3D 10의 변경 내용을 참조하세요.

예제

다음 코드 예제에서는 디스플레이 미니포트 드라이버에 렌더링하기 위해 현재 명령 버퍼를 제출하는 방법을 보여 줍니다. 이 코드 예제에서는 명령 버퍼 및 패치 목록이 생성된 후 할당 목록을 생성합니다. 명령 버퍼가 필요 이상으로 구문 분석되므로 성능에 적합하지 않습니다. 그러나 이 구현은 더 쉽게 표시할 수 있습니다. 프로덕션 드라이버에서 할당 및 패치 목록과 동시에 명령 버퍼를 생성하는 것이 더 효율적입니다.

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 포함)

추가 정보

CreateDevice

D3DDDICB_RENDER

D3DDDI_DEVICECALLBACKS

플러시

pfnCreateContextCb