Share via


Solicitar y usar memoria surface

El controlador de pantalla en modo de usuario recibe llamadas a su función CreateResource cuando el tiempo de ejecución de Microsoft Direct3D requiere la creación de una lista de superficies. El tiempo de ejecución de Direct3D especifica un identificador de recursos para la lista de superficies que usa el controlador de visualización en modo de usuario para volver a llamar al tiempo de ejecución. El controlador de visualización en modo de usuario crea un objeto de recurso para representar la lista de superficies, genera un identificador único para este objeto y devuelve el identificador al tiempo de ejecución de Direct3D. El tiempo de ejecución usa este identificador único en las llamadas posteriores de controladores para identificar la lista de superficies. El tiempo de ejecución identifica una superficie determinada especificando el índice de la superficie de la matriz contenida en el miembro pSurfList de la estructura D3DDDIARG_CREATERESOURCE .

Dado que el controlador de pantalla en modo de usuario recibe el identificador de recursos definido por el controlador en las llamadas que hacen referencia al recurso, el controlador no es necesario para realizar una búsqueda de identificador costosa para localizar el objeto de recurso definido por el controlador. Del mismo modo, para que el tiempo de ejecución tampoco sea necesario para realizar una búsqueda de identificadores, el controlador de pantalla en modo de usuario usa el identificador de recursos definido por el tiempo de ejecución de Direct3D cuando el controlador de pantalla en modo de usuario llama de nuevo al tiempo de ejecución.

El controlador de pantalla en modo de usuario llama a la función pfnAllocateCb para asignar memoria para las superficies. En la llamada pfnAllocateCb , el controlador de pantalla en modo de usuario puede pasar datos privados para la lista de superficies y para cada superficie individual de los miembros pPrivateDriverData de las estructuras D3DDDICB_ALLOCATE y D3DDDI_ALLOCATIONINFO , respectivamente. Sin embargo, el controlador de pantalla en modo de usuario no puede recibir datos privados de los miembros pPrivateDriverData . El controlador de pantalla en modo de usuario puede asignar memoria para estos datos privados y puede liberar la memoria después de que se devuelva la llamada pfnAllocateCb o puede usar la memoria de pila para pasar estos datos privados. La función pfnAllocateCb vuelve al controlador de pantalla en modo de usuario un identificador para cada asignación de cada superficie asignada.

Nota El controlador de pantalla en modo de usuario debe llamar a la función pfnAllocateCb una vez para cada superficie compartida para cada dispositivo. Por ejemplo, si el dispositivo 1 crea una superficie compartida que también usan los dispositivos 2, 3 y 4, los dispositivos 2, 3 y 4 también deben llamar a pfnAllocateCb una vez para la superficie compartida para recuperar el identificador de asignación.

El controlador de pantalla en modo de usuario debe realizar un seguimiento de cada superficie a cada controlador de asignación, normalmente, manteniendo una tabla de identificadores de superficie a asignación. El controlador de visualización en modo de usuario debe almacenar cada identificador de asignación dentro del objeto de recurso definido por el controlador.

Cuando el tiempo de ejecución de Direct3D realiza una operación en una superficie asignada previamente (por ejemplo, en una llamada a la función Blt del controlador de visualización en modo de usuario), el controlador de pantalla en modo de usuario recibe el identificador del recurso, posiblemente con un índice de superficie. El controlador de visualización en modo de usuario usa este identificador de recursos para recuperar el objeto de recurso definido por el controlador. El controlador obtiene los identificadores de asignación almacenados en el objeto de recurso y los ensambla en el búfer de comandos. El controlador de pantalla en modo de usuario usa los identificadores de asignación que corresponden a las superficies al llamar a la función pfnRenderCb para enviar un búfer de comandos al controlador de miniporte de pantalla. El controlador de minipuerto de pantalla puede llamar a la función DxgkCbGetHandleData para determinar a qué asignaciones de superficie hace referencia el controlador de pantalla en modo de usuario.