PFND3DDDI_RENDERCB função de retorno de chamada (d3dumddi.h)
A função pfnRenderCb envia o buffer de comando atual para renderização para o driver de miniporto de exibição.
Sintaxe
PFND3DDDI_RENDERCB Pfnd3dddiRendercb;
HRESULT Pfnd3dddiRendercb(
HANDLE hDevice,
D3DDDICB_RENDER *unnamedParam2
)
{...}
Parâmetros
hDevice
Um identificador para o dispositivo de exibição (contexto gráfico).
unnamedParam2
pData [in, out]
Um ponteiro para uma estrutura D3DDDICB_RENDER que descreve o buffer de comando atual a ser renderizado.
Retornar valor
pfnRenderCb retorna um dos seguintes valores:
Código de retorno | Descrição |
---|---|
S_OK | O buffer de comando foi renderizado com êxito. |
D3DDDIERR_PRIVILEGEDINSTRUCTION | O driver de miniporto de exibição detectou uma instrução privilegiada no buffer de comando; instruções privilegiadas não podem estar presentes em um buffer de comando. |
D3DDDIERR_ILLEGALINSTRUCTION | O driver de miniporto de exibição detectou instruções que o hardware gráfico não pode dar suporte. |
D3DDDIERR_INVALIDHANDLE | O driver de miniporto de exibição detectou um identificador inválido no buffer de comando. |
D3DDDIERR_CANTRENDERLOCKEDALLOCATION | O gerenciador de memória de vídeo detectou referências a uma alocação bloqueada na lista de alocação. Observe que o gerenciador de memória de vídeo retornará esse erro somente se não puder reposicionar a alocação para um segmento de memória do sistema ou AGP. |
D3DDDIERR_INVALIDUSERBUFFER | O driver de miniporto de exibição detectou uma subexibição ou estouro de dados ou instruções. Ou seja, o driver recebeu menos ou mais instruções ou dados do que o esperado. |
E_OUTOFMEMORY | pfnRenderCb não pôde ser concluído devido à memória insuficiente. |
E_INVALIDARG | Os parâmetros foram validados e determinados como incorretos. |
Essa função também pode retornar outros valores HRESULT.
Comentários
Quando o driver de exibição do modo de usuário deve enviar o buffer de comando atual para renderização para o driver de miniporto de exibição (por exemplo, durante uma chamada para a função Flush ou Flush(D3D10) do driver de exibição do modo de usuário), o driver de exibição do modo de usuário deve chamar a função pfnRenderCb . O driver de exibição do modo de usuário deve definir o parâmetro hDevice como o valor que o runtime do Microsoft Direct3D forneceu durante a chamada CreateDevice ou CreateDevice(D3D10). Na estrutura D3DDDICB_RENDER apontada pelo parâmetro pData , o driver de exibição do modo de usuário também deve definir:
- O membro CommandLength para o número de bytes de comandos no buffer de comando que começam do deslocamento zero.
- O membro CommandOffset para diferente de zero se o driver de exibição do modo de usuário precisar especificar um deslocamento para o primeiro comando de hardware no buffer de comando.
- O membro NumAllocations para o número de elementos na lista de alocação.
- O membro NumPatchLocations para o número de elementos na lista de locais de patch.
Se o driver de exibição do modo de usuário detectar que a maioria das liberações de buffer de comando é porque o driver fica sem espaço na lista de buffers de comando, lista de alocação ou local de patch, o driver pode solicitar que eles sejam redimensionados. Para redimensionar o buffer de comando, o driver define o sinalizador de campo de bits ResizeCommandBuffer no membro Flags do D3DDDICB_RENDER e coloca o tamanho solicitado no membro NewCommandBufferSize do D3DDDICB_RENDER. Da mesma forma, para redimensionar a lista de alocação, o driver define o sinalizador de campo de bits ResizeAllocationList no membro Flags do D3DDDICB_RENDER e coloca o número solicitado de elementos no membro NewAllocationListSize do D3DDDICB_RENDER. Para redimensionar a lista de locais de patch, o driver define o sinalizador de campo de bits ResizePatchLocationList no membro Flags do D3DDDICB_RENDER e coloca o número solicitado de elementos no membro NewPatchLocationListSize do D3DDDICB_RENDER.
Exemplos
O exemplo de código a seguir mostra como enviar o buffer de comando atual para renderização para o driver de miniporto de exibição. Este exemplo de código gera a lista de alocação depois que o buffer de comando e a lista de patch são gerados. Isso não é ideal para o desempenho porque o buffer de comando é analisado mais do que o necessário. No entanto, essa implementação é mais fácil de mostrar. Em um driver de produção, gerar o buffer de comando ao mesmo tempo que as listas de alocação e patch é mais eficiente.
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;
}
Requisitos
Requisito | Valor |
---|---|
Cliente mínimo com suporte | Disponível no Windows Vista e versões posteriores dos sistemas operacionais Windows. |
Plataforma de Destino | Área de Trabalho |
Cabeçalho | d3dumddi.h (inclua D3dumddi.h) |