Compartilhar via


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.
Após uma chamada para pfnRenderCb, o driver de exibição do modo de usuário deve determinar o endereço base e o tamanho do buffer de comando que ele deve usar para seu próximo envio dos valores retornados nos membros pNewCommandBuffer e NewCommandBufferSize de D3DDDICB_RENDER. Da mesma forma, o driver deve determinar o endereço base e o número de elementos da próxima lista de alocação e da lista de locais de patch dos valores retornados nos membros pNewAllocationList e NewAllocationListSize e membros pNewPatchLocationList e NewPatchLocationListSize , respectivamente.

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.

Nota Embora o driver possa solicitar que o buffer de comando e as listas de alocação e localização de patch sejam redimensionados, o gerenciador de memória de vídeo pode não ser capaz de cumprir. Portanto, independentemente de a chamada para pfnRenderCb ser bem-sucedida, o driver deve verificar os valores retornados nos membros NewCommandBufferSize, NewAllocationListSize e NewPatchLocationListSize de D3DDDICB_RENDER.
 
Se o driver de exibição do modo de usuário definir o membro hContext da estrutura D3DDDICB_RENDER apontada pelo parâmetro pData como NULL, o runtime do Microsoft Direct3D enviará a operação de renderização para o contexto padrão do dispositivo. Se o driver de exibição do modo de usuário definir hContext como um identificador válido que a função pfnCreateContextCb retornou anteriormente e que representa um contexto de dispositivo, o runtime do Direct3D enviará a operação de renderização para esse contexto. Observação do Direct3D versão 11: Para obter mais informações sobre como o driver chama pfnRenderCb, consulte Alterações do Direct3D 10.

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)

Confira também

Createdevice

D3DDDICB_RENDER

D3DDDI_DEVICECALLBACKS

Liberar

pfnCreateContextCb