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); Drivers que não implementam o WDDM não podem instanciar 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

Os dispositivos agora só são perdidos em duas circunstâncias; quando o hardware é redefinido porque está deslocado 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 de 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 cadeias de troca. Agora, com o DirectX para Windows Vista, chamar Redefinir após uma alteração de modo não faz com que superfícies de memória de textura, texturas e informações de estado sejam perdidas e esses recursos não precisem ser recriados.

Desabilitando o processamento de vértice de software multithread

Um novo caps bit (D3DCREATE_DISABLE_PSGP_THREADING) foi adicionado que desabilitará o multithreading para processamento de vértice 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 a 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 que seja texels de 2K x texels de 8K.

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 runtime pode executar a filtragem de amostra de ponto ou 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 uma textura de vértice ou para várias amostras.

Ler buffers de profundidade/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 estêncil, somente de profundidade ou bloqueável usando IDirect3DDevice9::CreateOffscreenPlainSurface. Use um destes 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 superfície de estêncil ou profundidade bloqueável recém-criada. A transferência é executada usando IDirect3DDevice9::UpdateSurface.

UpdateSurface falhará quando ambas as superfícies forem um formato LOCKABLE ou ambas forem não 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.

Compartilhando 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 de identificador adicional. Esse é um HANDLE que aponta para o recurso compartilhado. Em revisões anteriores do DirectX, esse argumento faz 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 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 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 NULO, 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 e CreateRenderTargetEx.

Há algumas restrições para usar recursos compartilhados. Estão incluídos:

  • 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, deve usar CreateTexture para abrir esse recurso compartilhado; se você usou CreateRenderTarget para criar um recurso compartilhado, deve 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 baixo desempenho quando compartilhados. Os rendertargets bloqueáveis não serão 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 pelo processo, 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 quando esperado. Para fornecer sincronização, use consultas de evento ou bloqueie a textura.
  • Somente o processo que cria inicialmente 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 marcar para ver se o dispositivo pode converter dados de pipeline em sRGB antes da mesclagem de buffer de quadros. Isso implica que o dispositivo converte os valores de destino de renderização de sRGB. Para ver se a conversão é compatível com o hardware, marcar para este limite:

D3DPMISCCAPS_POSTBLENDSRGBCONVERT

Esse limite identifica o hardware que dá suporte à conversão em sRGB antes da mesclagem. Essa funcionalidade é importante para a renderização de alta qualidade de buffers de quadro fp16 no DWM (gerenciador de janelas da área de trabalho).

Aprimoramentos do 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á subtâ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 de um ponteiro de bitmap de 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 é width x height 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 tom de 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é terminar de usá-la.