Función D3DKMTRender (d3dkmthk.h)
La función D3DKMTRender envía el búfer de comandos actual al subsistema del kernel de gráficos de Microsoft DirectX (Dxgkrnl.sys).
Sintaxis
NTSTATUS D3DKMTRender(
D3DKMT_RENDER *unnamedParam1
);
Parámetros
unnamedParam1
pData [in, out]
Puntero a una estructura de D3DKMT_RENDER que describe los parámetros para enviar el búfer de comandos actual al subsistema del kernel gráfico.
Valor devuelto
D3DKMTRender devuelve uno de los siguientes valores:
código de retorno | descripción |
---|---|
STATUS_SUCCESS | El búfer de comandos se envió correctamente. |
STATUS_DEVICE_REMOVED | El adaptador de gráficos se detuvo o se restableció el contexto de visualización. |
STATUS_INVALID_PARAMETER | Los parámetros se validaron y determinaron que son incorrectos. |
STATUS_NO_MEMORY | D3DKMTRender no se pudo completar debido a una memoria insuficiente. |
STATUS_INVALID_HANDLE | OpenGL ICD detectó un identificador no válido en el búfer de comandos. |
STATUS_PRIVILEGED_INSTRUCTION | D3DKMTRender detectó instrucciones noprivilegadas (es decir, instrucciones que acceden a la memoria más allá del privilegio del proceso de CPU actual). |
Esta función también puede devolver otros valores de NTSTATUS.
Observaciones
Normalmente, un búfer de comandos contiene muchos comandos gráficos.
Si D3DKMTRender devuelve STATUS_GRAPHICS_ALLOCATION_INVALID, openGL ICD debe volver a abrir o volver a crear el identificador principal, reemplace todas las referencias del búfer de comandos al identificador anterior por el nuevo identificador y, a continuación, llame a D3DKMTRender volver a enviar el búfer.
Después de una llamada a D3DKMTRender, openGL ICD debe determinar la dirección base y el tamaño del búfer de comandos que debe usar para su próximo envío a partir de los valores devueltos en el pCommandBuffer y CommandBufferSize miembros de la estructura D3DKMT_RENDER que apunta el parámetro pData.
Para un dispositivo que usa el modo de contrato de búfer DMA garantizado (para obtener más información sobre este modo, vea Using the Guaranteed Contract DMA Buffer Model), el tamaño del búfer DMA que está disponible para el controlador de miniporte para mostrar para traducir el búfer de comandos en el siguiente envío es el mismo que el tamaño del propio búfer de comandos. Para este tipo de dispositivo, openGL ICD también debe determinar el tamaño de la lista de asignación que estará disponible para el controlador de miniporte de pantalla durante la traducción del búfer de comandos en el siguiente envío del valor que se devuelve en el AllocationListSize miembro de D3DKMT_RENDER.
Para los dispositivos que no usan el contrato de búfer DMA garantizado, openGL ICD puede usar la información que se devuelve en el CommandBufferSize y AllocationListSize miembros para determinar el tamaño del siguiente búfer DMA y la lista de asignación que estarán disponibles para la traducción. Sin embargo, en condiciones de memoria baja, el búfer DMA real y la lista de asignación que se proporciona al controlador de miniporte de pantalla podría ser menor de lo necesario.
Si openGL ICD detecta que la mayor parte del vaciado del búfer de comandos se debe a que el controlador se queda sin espacio en el búfer de comandos o en la lista de asignación, el controlador puede solicitar que se cambie el tamaño. Para cambiar el tamaño del búfer de comandos, el controlador establece el ResizeCommandBuffer marca de campo de bits en el miembro Flags de D3DKMT_RENDER y coloca el tamaño solicitado en el miembro CommandBufferSize de D3DKMT_RENDER. Del mismo modo, para cambiar el tamaño de la lista de asignación, el controlador establece el ResizeAllocationList marca de campo de bits en el miembro Flags de D3DKMT_RENDER y coloca el número solicitado de elementos en el miembro AllocationListSize de D3DKMT_RENDER.
Nota
Aunque el controlador puede solicitar el cambio de tamaño del búfer de comandos y la lista de asignación, es posible que el administrador de memoria de vídeo no pueda cumplir. Por lo tanto, si la llamada a D3DKMTRender se realiza correctamente, el controlador debe comprobar los valores que se devuelven en el pCommandBuffer , CommandBufferSizey miembros AllocationListSize.
Sin embargo, si se produce un error en la llamada a D3DKMTRender, el controlador determina que el búfer de comandos, la lista de asignación o ambos no se cambiaron de tamaño. Por lo tanto, el controlador no debe procesar los valores devueltos en el pCommandBuffer, CommandBufferSizey AllocationListSize miembros porque no son válidos.
Ejemplos
En el ejemplo de código siguiente se muestra cómo un ICD de OpenGL puede usar D3DKMTRender para representar primitivos 3D.
HRESULT Render(D3DKMT_HANDLE hDevice, UINT CommandOffset, UINT CommandLength)
{
D3DKMT_RENDER RenderData;
memset(&RenderData, 0, sizeof(RenderData));
RenderData.hDevice = hDevice;
RenderData.CommandOffset = CommandOffset;
RenderData.CommandLength = CommandLength;
if (NT_SUCCESS((*pfnKTRender)(&RenderData))) {
return S_OK;
}
return E_FAIL;
}
Requisitos
Requisito | Valor |
---|---|
cliente mínimo admitido | Windows Vista |
de la plataforma de destino de | Universal |
encabezado de | d3dkmthk.h (incluya D3dkmthk.h) |
biblioteca de | Gdi32.lib |
DLL de | Gdi32.dll |