Requisitos de hardware para sobreposição de múltiplos planos

Os drivers de ecrã e o hardware não são necessários para suportar sobreposições de várias camadas. No entanto, para fornecer suporte a sobreposição de vários planos, o hardware deve atender aos seguintes requisitos.

  • O hardware deve suportar planos não sobrepostos.
    • Um plano pode cobrir uma parte da tela, enquanto outro plano pode cobrir uma parte diferente, mutuamente exclusiva, da tela.
    • Se qualquer parte da tela não estiver coberta por um plano, o hardware deve exibir preto nessa área. O hardware pode assumir que há um plano virtual na ordem z mais inferior que está preenchido com preto.
    • O hardware deve suportar planos sobrepostos:
    • O hardware deve ser capaz de ativar ou desativar a mistura alfa por plano. (A mistura alfa é uma técnica em que a cor em um bitmap de origem é combinada com a cor em um bitmap de destino para produzir um novo bitmap de destino.)
    • Deve ser suportada a mistura entre os planos utilizando alfa pré-multiplicado.
  • Quando apenas um alvo de saída está ativo, a saída ativa deve suportar sobrecamadas multiplanares. No modo de clone, onde várias saídas estão simultaneamente ativas, o hardware não deve relatar que suporta sobreposições de vários planos, a menos que todas as saídas ativas suportem sobreposições de vários planos.
  • A cadeia de permuta do Desktop Window Manager (DWM) (plano 0) deve ser capaz de interagir com os outros planos de sobreposição.
  • Todos os aviões devem poder ser ativados e desativados, incluindo o plano 0 (a cadeia de permuta do DWM).
  • Todos os planos devem suportar clipping de origem e destino, incluindo o plano 0 (swapchain do DWM).
  • Pelo menos um plano deve suportar encolhimento e estiramento, independente de outros planos que possam ser ativados.
  • Os planos que suportam dimensionamento devem suportar filtragem bilinear e uma qualidade de filtragem superior à bilinear.
  • Pelo menos um plano deve suportar esses formatos YUV (para obter mais informações, consulte Intervalos de formatos YUV no Windows 8.1):
    • Conversão de matriz ITU BT.601 e BT.709 YUV para RGB para formatos YUV.
    • Luminância YUV de alcance normal (ou estúdio) (16 - 235) e luminância YUV de alcance estendido (0 - 255).
  • O hardware deve lidar com estes cenários de travamento de registro:
    • Todos os atributos por plano (endereço do buffer, recorte, dimensionamento e assim por diante) devem ser postados atomicamente durante o período de retrace vertical. Quando o hardware atualiza um bloco de registros, todos esses registros devem ser postados atomicamente. Por exemplo, se o VSync ocorrer depois de escrever 10 de 20 registos relacionados ao plano de sobreposição, nenhum deles será enviado até o próximo VSync porque não podem ser enviados todos no VSync atual.
    • Cada plano pode ser atualizado independentemente dos restantes planos. Por exemplo, suponha que os registros do plano 0 foram atualizados antes do VSync e que os registros do plano 1 sejam atualizados posteriormente, quando o VSync ocorrer. Nesse cenário, as atualizações do plano 1 podem esperar até o próximo VSync, mas as atualizações do plano 0 devem ocorrer a tempo.
    • Quando vários planos são atualizados durante uma única chamada presente, as atualizações devem ocorrer atomicamente. Por exemplo, se uma única chamada presente estiver atualizando o plano 0 e habilitando o plano 1, os registros do plano 0 não deverão ser lançados no VSync, a menos que os registros do plano 1 também sejam lançados no mesmo VSync.
  • A transformação, o dimensionamento e a mistura devem ocorrer nesta ordem:
    1. A alocação de fonte é recortada de acordo com o retângulo de origem especificado. É garantido que o retângulo de origem seja definido dentro dos limites da alocação de origem.

    2. Aplique uma inversão de imagem horizontal e, em seguida, uma inversão de imagem vertical, se solicitado.

    3. Aplique o redimensionamento de acordo com o retângulo de destino, aplique o corte de acordo com o retângulo do clipe e aplique a filtragem apropriada ao redimensionar.

    4. Misture com alocações em outras camadas. A mistura deve ser realizada de cima para baixo (ou até que uma camada opaca seja atingida) na ordem z. Se a mistura alfa for solicitada, o hardware deverá respeitar o alfa por pixel, e o valor da cor será pré-multiplicado por alfa. O pseudocódigo a seguir executa uma operação de origem sobre destino repetidamente de cima para baixo, (((Layer[0] over Layer[1]) over Layer[2]) over ¦ Layer[n]). Fora do retângulo de destino, cada camada deve ser tratada como transparente (0,0,0,0).

      Color = Color[0]; // Layer 0 is topmost.
      Alpha = Color[0].Alpha;
      for (i = 1; Alpha < 1 && i < LayersToBlend; i++)
      {
          Color += ((1 - Alpha) * Color[i]);
          Alpha += ((1 - Alpha) * Color[i].Alpha);
      }
      Output Color;
      

      O hardware pode ser misturado de baixo para cima, desde que o resultado de saída seja o mesmo. Neste caso, deve ser utilizado o seguinte algoritmo de mistura:

      Color = Color[LayersToBlend-1];  // Bottom-most layer
      Alpha = Color[LayersToBlend-1].Alpha;
      if (LayersToBlend > 1)
      {
          for (i = LayersToBlend - 2; Alpha < 1 && i >= 0; i--)
          {
              Color = Color[i] + ((1 - Color[i].Alpha) * Color;
              Alpha = Color[i].Alpha + (1 - Color[i].Alpha) * Alpha;
          }
      }
      Output Color;
      
    5. A cor preta deve ser exibida na área onde não está coberta por nenhum dos retângulos de destino de quaisquer camadas. O hardware pode assumir que há uma camada preta mais inferior virtual conceitual que é do tamanho da tela.