Manipulando a criação e a destruição de recursos
Para permitir que o subsistema de kernel de elementos gráficos do Microsoft DirectX acompanhe corretamente o tempo de vida do recurso e evite vazamentos de memória no sistema operacional, o driver de exibição do modo de usuário deve criar e destruir recursos corretamente.
O runtime do Microsoft Direct3D chama as seguintes funções de driver de exibição no modo de usuário para criar recursos do modo de usuário.
CreateResource cria um novo recurso compartilhado ou não compartilhado.
OpenResource abre uma exibição para um recurso compartilhado existente.
Em ambas as chamadas, o runtime do Direct3D passa um identificador de recurso de runtime exclusivo do modo de usuário que o driver de exibição do modo de usuário usa para chamar de volta para o runtime. Quando CreateResource ou OpenResource retorna com êxito , o driver de exibição do modo de usuário retorna um identificador exclusivo do modo de usuário que representa o recurso. Esse identificador é o identificador de recurso do driver do modo de usuário. O runtime usa o identificador de recurso do driver no modo de usuário em chamadas de driver subsequentes.
Existe uma correspondência um-para-um entre o identificador de recurso de runtime do modo de usuário e o identificador de recurso do driver do modo de usuário. O runtime do Direct3D e o driver de exibição do modo de usuário trocam o runtime do modo de usuário e o recurso de driver manipula por meio dos membros hResource das estruturas de D3DDDIARG_CREATERESOURCE e D3DDDIARG_OPENRESOURCE .
Quando o driver de exibição do modo de usuário chama a função pfnAllocateCb do runtime do Direct3D para criar alocações para um recurso de modo de usuário, o driver deve especificar o identificador de recurso de runtime do modo de usuário no membro hResource da estrutura D3DDDICB_ALLOCATE para a qual o parâmetro pData aponta. O runtime do Direct3D gera um identificador exclusivo do modo kernel para o recurso e o passa de volta para o driver de exibição do modo de usuário no membro hKMResource do D3DDDICB_ALLOCATE. O driver de exibição do modo de usuário pode inserir o identificador de recurso do modo kernel no fluxo de comandos para o driver de miniporto de exibição a ser usado posteriormente.
Nota Embora os identificadores de recursos do modo de usuário sejam sempre exclusivos para cada criação de recursos no modo de usuário, os identificadores de recursos do modo kernel nem sempre são exclusivos. Quando o runtime do Direct3D chama a função OpenResource do driver de exibição do modo de usuário para abrir uma exibição para um recurso compartilhado existente, o runtime passa o identificador do modo kernel do recurso no membro hKMResource da estrutura D3DDDIARG_OPENRESOURCE para a qual o parâmetro pResource aponta. O runtime criou anteriormente esse identificador do modo kernel após o runtime chamado função CreateResource do driver de exibição do modo de usuário.
Para destruir um recurso de modo de usuário criado por CreateResource ou OpenResource , o runtime do Direct3D passa o identificador de recurso do driver do modo de usuário no parâmetro hResource em uma chamada para a função DestroyResource do driver de exibição no modo de usuário. Para liberar o identificador de recurso do modo kernel e todas as alocações associadas ao recurso de modo de usuário, o driver de exibição do modo de usuário passa o identificador de recurso de runtime do modo de usuário no membro hResource da estrutura D3DDDICB_DEALLOCATE para a qual o parâmetro pData aponta em uma chamada para a função pfnDeallocateCb .
Considere os seguintes itens quando um driver de exibição no modo de usuário criar e destruir recursos:
Para alocações que o driver de exibição do modo de usuário cria em resposta a recursos compartilhados (ou seja, em resposta a chamadas CreateResource com o sinalizador de campo de bit SharedResource definido no membro Flags de D3DDDIARG_CREATERESOURCE), o driver deve atribuir um valor não NULL ao membro hResource de D3DDDICB_ALLOCATE.
Para alocações que o driver de exibição do modo de usuário cria em resposta a recursos não compartilhados, o driver não é necessário para atribuir um valor não NULL ao membro hResource de D3DDDICB_ALLOCATE. Se o driver atribuir NULL a hResource, as alocações serão associadas ao dispositivo e não a um recurso específico (e ao identificador de recursos do modo kernel). No entanto, se as alocações estiverem realmente relacionadas a um recurso, o driver deverá associar as alocações a esse recurso. Nota Um identificador de recurso do modo kernel será criado somente se o driver de exibição do modo de usuário definir o membro hResource de D3DDDICB_ALLOCATE para o identificador de recurso de runtime do modo de usuário que o driver recebeu do membro hResource da estrutura D3DDDIARG_CREATERESOURCE em uma chamada para CreateResource.
Quando DestroyResource é chamado para destruir um recurso de modo de usuário não compartilhado, o driver de exibição do modo de usuário pode chamar pfnDeallocateCb com o membro hResource de D3DDDICB_DEALLOCATE definido como NULL somente se o driver nunca associou nenhuma alocação ao recurso. Se o driver de exibição do modo de usuário associar alocações ao recurso, o driver deverá chamar pfnDeallocateCb com o membro hResource de D3DDDICB_DEALLOCATE definido como um valor não NULL ; caso contrário, ocorrerá um vazamento de memória.