Estruturas de dados para renderização baseada em bloco (adiada)


18

A renderização lado a lado é usada nas arquiteturas modernas de GPU móvel para aumentar a coerência do acesso à memória, subdividindo o espaço da imagem em uma grade regular de blocos pequenos (por exemplo, 32x32 pixels). As informações são escassas sobre os tipos de estruturas de dados usadas para rastrear as primitivas associadas a cada bloco, considerando que arbitrariamente muitas primitivas podem se sobrepor a qualquer bloco.

Da perspectiva de um desenvolvedor de drivers, quais estruturas de dados são comumente usadas para representar os conjuntos primitivos que pertencem a um bloco e essas estruturas são alocadas / redimensionadas dinamicamente de acordo com a geometria que se sobrepõe a um bloco específico?


3
Pergunta realmente interessante, e embora eu suspeite que a maioria dos detalhes seja um segredo, esse pode ser um bom ponto de partida para quem deseja fazer a pesquisa e escrever um resumo: blog.imgtec.com/powervr/…
John Calsbeek

Respostas:


11

A publicação no blog que John menciona é um bom começo (se é que eu digo!), Mas há alguns detalhes extras que podem ser úteis.

Para a arquitetura PowerVR, a estrutura de dados intermediária - chamada de lista primitiva ou buffer de parâmetros (PB) - que armazena os dados por bloco, depois que todo o sombreamento de vértice e o processo de mosaico são concluídos, é realmente gerada e gerenciada principalmente por o hardware, em vez do driver.

As estruturas em memória do PB são fisicamente divididas em duas. Primeiro, blocos de dados de vértice transformados, incluindo atributos de vértice. Os blocos são compactados e, como você pode imaginar, são apenas dados de ponto flutuante compactados e compactados em sua maior parte. A segunda estrutura na memória são os dados lado a lado, que são efetivamente uma lista de listas.

A lista de nível superior nessa estrutura de dados é chamada de região e pode codificar um conjunto de blocos em vez de um bloco por vez, para um determinado bloco primitivo. Uma região é, portanto, um conjunto de locais de blocos de tela, estados de bloco e, em seguida, uma lista dos blocos compactados que mantêm a geometria nessa região. As regiões são nas quais o rasterizador funciona, e você pode imaginar que os blocos vazios são ignorados automaticamente, embora em alguns casos haja uma boa razão para o rasterizador visitar regiões vazias.

A memória que a GPU usa para o PB é alocada dinamicamente em todas as implementações modernas do PowerVR. Um ponteiro para essa memória é fornecido pelo driver, e o driver, com a ajuda da GPU, o dimensionará conforme necessário. Esse mecanismo é uma troca entre ter que realocar com freqüência e minimizar a quantidade de espaço do PB alocado.

As GPUs modernas se esforçam muito para minimizar a indireção de memória, mas caminhar pelo PB para alimentar o estágio de rasterização é um daqueles casos em que é realmente difícil e não há outra opção. Felizmente, o ponteiro perseguindo envolve grandes blocos que armazenam bem em cache e são transmitidos para o núcleo.

Outras arquiteturas não funcionam exatamente da mesma forma que o PowerVR, porque parte do motivo pelo qual o PB é o que é em nossa arquitetura é ajudar o conceito de sombreamento de pixel totalmente diferido que implementamos, mas o conceito geral se aplica a todos os outros tilers no espaço móvel que eu conheço.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.