Resumo dos recursos (Direct3D 9 para Windows Vista)
Esta documentação refere-se especificamente às extensões do Windows Vista para 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 DirectX para Windows Vista devem estar usando hardware que usa o driver WDDM (Modelo de Driver de Dispositivo do Windows) em oposição ao XPDM (Modelo de Driver XP); drivers que não implementam o WDDM não podem instanciar interfaces gráficas DirectX do Windows Vista.
Descubra os novos recursos gráficos DirectX no Windows Vista em uma destas seções:
- alterações de comportamento do dispositivo
- Desativação do Processamento de Vértices por Software Multithreaded
- One Bit Superfícies
- Profundidade de leitura/buffers de estêncil
- Partilha de Recursos
- conversão sRGB antes de misturar
- Melhorias no StretchRect
- Criação de textura na memória do sistema
Alterações no comportamento do dispositivo
Os dispositivos agora só são perdidos em duas circunstâncias: quando o hardware é reiniciado porque está bloqueado, e quando o driver de dispositivo é interrompido. Quando o hardware trava, o dispositivo pode ser reposto 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 uma aplicação de ecrã total é minimizada, PresentEx retornará S_D3DPRESENTATIONOCCLUDED. As aplicações em ecrã inteiro podem retomar a renderização quando recebem uma mensagem de callback WM_ACTIVATEAPP.
Nas versões anteriores do DirectX, quando um aplicativo sofria uma mudança de modo, a única maneira de recuperar era redefinir o dispositivo e recriar todos os recursos de memória de vídeo e cadeias de permuta. Agora, com o DirectX para Windows Vista, chamar "Reset" após uma alteração de modo não provoca a perda de superfícies de memória de texturas, texturas e informações de estado, e esses recursos não precisam ser recriados.
Desativação do processamento de vértices por software multithreaded
Um novo bit de caps (D3DCREATE_DISABLE_PSGP_THREADING) foi adicionado que irá desativar o multithreading para o processamento de vértice de software (swvp). Use esta 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 chama-se D3DFMT_A1. Uma superfície de um bit foi projetada para ser usada como uma textura por pixel ou como a saída de destino de renderização gerada por ComposeRects ou ColorFill. Não existem tampas separadas para a largura e altura da superfície; uma implementação deve suportar uma superfície de tamanho único que seja 2K texels x 8K texels.
Uma superfície de um bit tem um bit por texel; Portanto, 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 executar a amostra pontual ou a filtragem de convolução. O filtro de convolução é ajustável (consulte SetConvolutionMonoKernel).
Existem algumas restrições para superfícies de um bit:
- O mapeamento Mip não é suportado
- 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.
Profundidade de leitura/buffers de 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, apenas de profundidade ou apenas 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 ou superfície de estêncil recém-criada. A transferência é realizada usando IDirect3DDevice9::UpdateSurface.
UpdateSurface falhará quando ambas as superfícies forem um formato LOCKABLE ou ambas não forem bloqueáveis.
A transferência de dados inexistentes resultará em um erro (por exemplo, a transferência de uma superfície não bloqueável apenas com profundidade para uma superfície D3DFMT_S8_LOCKABLE).
O restante das restrições para IDirect3DDevice9::UpdateSurface ainda se aplicam.
Partilha de Recursos
Os recursos do Direct3D agora podem ser compartilhados entre dispositivos ou processos. Isso se aplica a qualquer recurso Direct3D, incluindo texturas, buffers de vértice, buffers de índice ou superfícies (como destinos de renderização, buffers de estêncil de profundidade ou superfícies simples 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 dentro de um processo ou compartilhado entre processos.
Para habilitar recursos compartilhados, as APIs de criação de recursos têm um parâmetro handle adicional. Este é um HANDLE que aponta para o recurso compartilhado. Em revisões anteriores do DirectX, esse argumento fez parte da assinatura da API, mas não foi usado e deve ser definido como NULL. A partir do Windows Vista, use pSharedHandle das seguintes maneiras:
- Defina o ponteiro (pSharedHandle) como NULL para não compartilhar um recurso. Isso é exatamente como o comportamento do DirectX antes do Windows Vista.
- Para criar um recurso partilhado, chame qualquer API de criação de recurso (veja abaixo) com um handle não inicializado (o próprio ponteiro 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ão NULL, 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 do 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, CreateOffscreenPlainSurfaceExe CreateRenderTargetEx.
Existem algumas restrições para a utilização de recursos partilhados. 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.
- Recursos bloqueáveis (texturas com D3DUSAGE_DYNAMIC, buffers de vértice e buffers de índice, por exemplo) podem apresentar um desempenho deficiente quando compartilhados. Os rendertargets bloqueáveis não poderão ser compartilhados em algum 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 da 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 numa superfície partilhada podem não refletir a perspetiva da superfície de um processo de referência como esperado. Para fornecer sincronização, use consultas de eventos 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 mistura
Agora podes verificar se o dispositivo consegue converter dados de pipeline para sRGB antes da fusão de frame buffer. Isso implica que o dispositivo converte os valores de alvo de renderização de sRGB. Para ver se a conversão é suportada pelo hardware, verifique este limite:
D3DPMISCCAPS_POSTBLENDSRGBCONVERT
Este limite identifica o hardware que suporta a conversão para sRGB antes da mistura. Esta funcionalidade é importante para a renderização de alta qualidade de buffers de imagem fp16 no gestor de janelas do ambiente de trabalho (DWM).
Melhorias no StretchRect
Em versões anteriores do DirectX, o StretchRect tem muitas restrições para acomodar drivers diferentes (consulte IDirect3DDevice9::StretchRect). O Windows Vista é baseado no WDDM (Windows Device Driver Model). Este 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 alvo de renderização deve ter sido criado com a utilização de alvo de renderização (D3DUSAGE_RENDERTARGET). Esta restrição é levantada se estiver a fazer uma cópia simples (onde a fonte e o dest são do mesmo formato, do mesmo tamanho e não existem sub-retângulos).
Criação de textura na memória do sistema
Os aplicativos que precisam de mais flexibilidade sobre o uso, alocação e exclusão da memória do sistema agora podem criar texturas a partir de um ponteiro de memória do sistema. Por exemplo, uma aplicação pode criar uma textura Direct3D utilizando um ponteiro de bitmap de memória do sistema GDI.
Você precisa fazer duas coisas para criar essa textura:
- Aloque memória de sistema suficiente para manter a superfície de textura. O número mínimo de bytes é largura x altura x bytes por pixel.
- Forneça o endereço de um ponteiro para a superfície de memória do sistema como parâmetro HANDLE* para IDirect3DDevice9::CreateTexture.
Aqui está o protótipo da 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:
- A inclinação da textura deve ser igual à largura da textura multiplicada pelo número de bytes por pixel.
- Ao usar formatos compactados (formatos DXT), o aplicativo é responsável por alocar o tamanho correto.
- Apenas texturas com um único nível de mipmap são suportadas.
- O valor passado para CreateTexture para o argumento Pool deve ser D3DPOOL_SYSTEMMEM.
- Esta API envolve a memória fornecida em uma textura. Não desaloques esta memória até terminares de a usar.