Resumo de Recursos (Direct3D 9 para Windows Vista)
Esta documentação refere-se especificamente às extensões do Windows Vista para elementos gráficos DirectX. Para desenvolver o poder do DirectX para Windows Vista, você deve instalar o SDK do Windows Vista, bem como o SDK do DirectX. Os aplicativos que usam o DirectX para Windows Vista devem estar usando hardware que usa o driver WDDM (Modelo de Driver de Dispositivo do Windows) em vez do XPDM (Modelo de Driver XP); os drivers que não implementam o WDDM não podem criar uma instância das interfaces gráficas do Windows Vista DirectX.
Descubra os novos recursos gráficos do DirectX no Windows Vista em uma destas seções:
- alterações de comportamento do dispositivo
- Desabilitar o processamento de vértice de software multi-threaded
- Superfícies de um bit
- Buffers de profundidade de leitura/estêncil
- Compartilhamento de Recursos
- Conversão de sRGB antes da mesclagem
- Melhorias do StretchRect
- Criação de Textura na memória do sistema
Alterações de comportamento do dispositivo
Agora, os dispositivos só são perdidos em duas circunstâncias: quando o hardware é reiniciado porque está suspenso e quando o driver do dispositivo é interrompido. Quando o hardware trava, o dispositivo pode ser redefinido chamando ResetEx. Se o hardware travar, a memória de textura será perdida.
Depois que um driver é interrompido, o objeto IDirect9Ex deve ser recriado para retomar a renderização.
Quando a área de apresentação é obscurecida por outra janela no modo janela, ou quando um aplicativo de tela inteira é minimizado, PresentEx retornará S_D3DPRESENTATIONOCCLUDED. Os aplicativos de tela inteira podem retomar a renderização quando recebem uma mensagem de retorno de chamada WM_ACTIVATEAPP.
Nas versões anteriores do DirectX, quando um aplicativo experimentava uma alteração de modo, a única maneira de recuperar era redefinir o dispositivo e recriar todos os recursos de memória de vídeo e as cadeias de troca. Agora, com o DirectX para Windows Vista, chamar Reset após uma alteração de modo não faz com que superfícies de textura, texturas e informações de estado sejam perdidas e esses recursos não precisam ser recriados.
Desabilitar o processamento de vértice de software multi-threaded
Um novo caps bit (D3DCREATE_DISABLE_PSGP_THREADING) foi adicionado para desabilitar o multithreading para o processamento de vértices de software (swvp). Use essa macro para gerar um sinalizador de comportamento para IDirect3D9::CreateDevice.
#define D3DCREATE_DISABLE_PSGP_THREADING
Superfícies de um bit
Há um novo tipo de formato de superfície de um bit que pode ser especialmente útil para processar glifos de texto. O novo formato é chamado D3DFMT_A1. Uma superfície de um bit foi projetada para ser usada como uma textura por pixel ou como saída de destino de renderização gerada por ComposeRects ou ColorFill. Não há limites separados para a largura e a altura da superfície; uma implementação deve dar suporte a uma superfície de tamanho único de 2K texels x 8K texels.
Uma superfície de um bit possui um bit por texel; portanto, o valor um significaria que todos os componentes (r,g,b,a) de um pixel são 1, e zero significaria que todos os componentes são iguais a 0. Você pode usar superfícies de um bit com as seguintes APIs: ColorFill, UpdateSurface e UpdateTexture.
Quando uma superfície de um bit é lida, o tempo de execução pode realizar a amostragem pontual ou a filtragem de convolução. O filtro de convolução é ajustável (consulte SetConvolutionMonoKernel).
Há algumas restrições para superfícies de um bit:
- Não há suporte para mapeamento de Mip
- Os dados sRGB não podem ser lidos ou gravados em uma superfície de um bit.
- Uma superfície de um bit não pode ser usada como textura de vértice ou para amostragem múltipla.
Buffers de profundidade de leitura/estêncil
Use IDirect3DDevice9::UpdateSurface para ler ou gravar dados de profundidade/estêncil de superfícies obtidas de IDirect3DDevice9::CreateDepthStencilSurface ou IDirect3DDevice9::GetDepthStencilSurface.
Primeiro, crie uma superfície bloqueável, somente de profundidade ou somente de estêncil, usando IDirect3DDevice9::CreateOffscreenPlainSurface. Use um dos seguintes formatos:
- D3DFMT_D16_LOCKABLE
- D3DFMT_D32F_LOCKABLE
- D3DFMT_D32_LOCKABLE
- D3DFMT_S8_LOCKABLE
Em segundo lugar, transfira dados entre o buffer de profundidade/estêncil e a profundidade bloqueável recém-criada ou a superfície do estêncil. A transferência é executada usando IDirect3DDevice9::UpdateSurface.
UpdateSurface falhará quando ambas as superfícies estiverem em um formato bloqueável ou ambas não estiverem em formatos bloqueáveis.
A transferência de dados inexistentes resultará em um erro (por exemplo, a transferência de uma superfície somente de profundidade não bloqueável para uma superfície D3DFMT_S8_LOCKABLE).
O restante das restrições para IDirect3DDevice9::UpdateSurface ainda se aplicam.
Compartilhamento de recursos
Agora, os recursos do Direct3D podem ser compartilhados entre dispositivos ou processos. Isso se aplica a qualquer recurso do Direct3D, incluindo texturas, buffers de vértices, buffers de índice ou superfícies (como destinos de renderização, buffers de estêncil de profundidade ou superfícies planas fora da tela). Para ser compartilhado, você precisa designar um recurso para compartilhamento no momento da criação e localizar o recurso no pool padrão (D3DPOOL_DEFAULT). Depois que um recurso é criado para compartilhamento, ele pode ser compartilhado entre dispositivos em um processo ou compartilhado entre processos.
Para habilitar recursos compartilhados, as APIs de criação de recursos têm um parâmetro de identificador adicional. Esse é um HANDLE que aponta para o recurso compartilhado. Em revisões anteriores do DirectX, esse argumento fazia parte da assinatura da API, mas não foi utilizado e deve ser definido como NULL. A partir do Windows Vista, use pSharedHandle das seguintes maneiras:
- Defina o ponteiro (pSharedHandle) para NULL para não compartilhar um recurso. Isso é exatamente como o comportamento do DirectX antes do Windows Vista.
- Para criar um recurso compartilhado, chame qualquer API de criação de recursos (veja abaixo) com um identificador não inicializado (o ponteiro em si não é
NULL (pSharedHandle != NULL), mas o ponteiro aponta para um valor de NULL (*pSharedHandle == NULL )). A API gerará um recurso compartilhado e retornará um identificador válido. - Para abrir e acessar um recurso compartilhado criado anteriormente usando um identificador de recurso compartilhado nãoNULL, defina pSharedHandle como o endereço desse identificador. Depois de abrir o recurso compartilhado criado anteriormente dessa maneira, você pode usar a interface retornada na API Direct3D 9 ou Direct3D 9Ex como se a interface fosse um recurso típico desse tipo.
As APIs de criação de recursos incluem: CreateTexture, CreateVolumeTexture, CreateCubeTexture, CreateRenderTarget, CreateVertexBuffer, CreateIndexBuffer, CreateDepthStencilSurface, CreateOffscreenPlainSurface, CreateDepthStencilSurfaceEx, CreateOffscreenPlainSurfaceEx, and CreateRenderTargetEx.
Há algumas restrições para usar recursos compartilhados. Estes incluem:
- A API que você usa para abrir um recurso compartilhado deve corresponder à API que você usou para criar o recurso compartilhado. Por exemplo, se você usou CreateTexture para criar um recurso compartilhado, deverá usar CreateTexture para abrir esse recurso compartilhado; se você usou CreateRenderTarget para criar um recurso compartilhado, deverá usar CreateRenderTarget para abrir esse recurso compartilhado; e assim por diante.
- Ao abrir um recurso compartilhado, você deve especificar D3DPOOL_DEFAULT.
- Os recursos bloqueáveis (texturas com D3DUSAGE_DYNAMIC, buffers de vértice e buffers de índice, por exemplo) podem apresentar baixa performance quando compartilhados. Os alvos de renderização bloqueáveis não serão compartilhados em alguns tipos de hardware.
- As referências a um recurso compartilhado entre processos devem ter as mesmas dimensões que o recurso original. Ao passar um identificador entre processos, inclua as informações de dimensão para que a referência possa ser criada de forma idêntica.
- As superfícies de processo cruzado compartilhadas não fornecem nenhum mecanismo de sincronização. As alterações de leitura/gravação em uma superfície compartilhada podem não refletir a exibição da superfície de um processo de referência como esperado. Para fornecer sincronização, use consultas de evento ou bloqueie a textura.
- Somente o processo que inicialmente cria um recurso compartilhado pode bloqueá-lo (qualquer processo que abra uma referência a esse recurso compartilhado não pode bloqueá-lo).
- Se um recurso compartilhado estiver bloqueado, não haverá validação para que outros processos saibam se o recurso está disponível.
Conversão sRGB antes da mesclagem
Agora você pode verificar se o dispositivo pode converter os dados do pipeline em sRGB antes da combinação do buffer de quadros. Isso implica que o dispositivo converte os valores de destino de renderização de sRGB. Para ver se há suporte para a conversão pelo hardware, verifique este limite:
D3DPMISCCAPS_POSTBLENDSRGBCONVERT
Esse limite identifica o hardware que dá suporte à conversão em sRGB antes da mesclagem. Esse recurso é importante para a renderização de alta qualidade dos buffers de quadros fp16 no gerenciador de janelas da área de trabalho (DWM).
Melhorias de StretchRect
Nas versões anteriores do DirectX, o StretchRect tem muitas restrições para acomodar drivers diferentes (consulte IDirect3DDevice9::StretchRect). O Windows Vista é criado com base no WDDM (Modelo de Driver de Dispositivo do Windows). Esse novo modelo de driver é muito mais robusto e permite que os drivers lidem com casos especiais no hardware.
Em geral, a única restrição restante é que o destino de renderização deve ter sido criado com o uso de destino de renderização (D3DUSAGE_RENDERTARGET). Essa restrição será levantada se você estiver fazendo uma cópia simples (em que a origem e o dest têm o mesmo formato, o mesmo tamanho e não há sub-retângulos).
Criação de textura na memória do sistema
Aplicativos que precisam de mais flexibilidade sobre o uso, alocação e exclusão da memória do sistema agora podem criar texturas de um ponteiro de memória do sistema. Por exemplo, um aplicativo pode criar uma textura Direct3D a partir de um ponteiro de bitmap da memória do sistema GDI.
Você precisa fazer duas coisas para criar essa textura:
- Aloque memória suficiente do sistema para manter a superfície de textura. O número mínimo de bytes é largura x altura x bytes por pixel.
- Passe o endereço de um ponteiro para a superfície de memória do sistema para o parâmetro HANDLE* para IDirect3DDevice9::CreateTexture.
Aqui está o protótipo de função para IDirect3DDevice9::CreateTexture:
STDMETHOD(CreateTexture)(THIS_ UINT Width, UINT Height, UINT Levels,
DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DTexture9** ppTexture,
HANDLE* pSharedHandle)
Uma textura de memória do sistema tem as seguintes restrições:
- O pitch da textura deve ser igual à largura da textura vezes o número de bytes por pixel.
- Ao usar formatos compactados (formatos DXT), o aplicativo é responsável por alocar o tamanho correto.
- Há suporte apenas para texturas com um único nível de mipmap.
- O valor passado para CreateTexture para o argumento pool deve ser D3DPOOL_SYSTEMMEM.
- Essa API encapsula a memória fornecida em uma textura. Não desaloque essa memória até que você tenha terminado de usá-la.