Como a GPU lida com textura e VRAM?

18

Na verdade, é um monte de perguntas inter-relacionadas:

  1. As texturas compactadas (dxt5 / dxt1 etc.) são descompactadas completamente durante o processo de renderização?

  2. Se a resposta para a primeira pergunta for verdadeira, como a memória é gerenciada para várias texturas grandes não compactadas?

  3. O framebuffer é diferente do VRAM na GPU moderna?

Allahjane
fonte

Respostas:

29

Formatos de textura compactada por GPU, como DXT / BC / ETC, são projetados especificamente para serem lidos diretamente de sua forma compactada. Eles não precisam ser descompactados em um buffer RGBA bruto.

A maneira como isso funciona é que cada bloco de texels (geralmente 4x4) ocupa um número fixo de bits - portanto, sabemos exatamente quanto tempo no buffer procurar um texel específico - e esses blocos podem ser descomprimidos sem ler todos os arredores / informação de textura anterior. As GPUs contêm hardware especializado que descompacta apenas os blocos texel solicitados conforme necessário para atender às solicitações de amostragem de textura de seus shaders.

Isso contrasta com formatos como jpg e png, onde a quantidade de espaço que cada texel ocupa pode variar na imagem (áreas detalhadas ocupando mais dados, áreas previsíveis ocupando menos), portanto, para encontrar um texel específico, é necessário descompactar a imagem inteira, ou pelo menos grandes / distribuídos pedaços dela. Mas como eles podem compactar seletivamente áreas previsíveis de uma textura, tendem a compactar imagens em tamanhos menores para armazenamento em disco ou transmissão em uma rede do que as obtidas em formatos compatíveis com GPU. Diferentes estratégias para diferentes usos.


Geralmente, várias perguntas devem ser feitas por meio de várias postagens, mas como essa é uma resposta bastante curta, também atingirei o ponto 3:

" Framebuffer " é apenas uma parte específica da memória de vídeo que decidimos usar para armazenar a imagem composta que queremos apresentar na tela. Observe os detalhes na resposta de JarkkoL, onde em algum hardware especializado podemos escolher localizar esse buffer em uma parte específica de nossa memória de vídeo disponível, otimizada para as necessidades de largura de banda dos destinos de renderização.

DMGregory
fonte
Esse link no algoritmo de compactação é extremamente útil e aprofundado. Bom achado!
Coburn
7

As respostas às suas perguntas realmente dependem da plataforma. Geralmente, os formatos BC são mantidos na forma compactada na memória e a descompressão é feita em voo pelas unidades de textura da GPU, mas há exceções. Sabe-se que o Xbox 360 descomprime blocos BC completos de 4x4 pixels para armazenar em cache antes que a TU busque os dados, aumentando assim o uso do cache. Porém, não conheço nenhuma plataforma que descompacte toda a textura para o vram quando carregada, mas duvido muito por causa do uso adicional de memória e largura de banda.

O mesmo vale para os framebuffers - isso depende da plataforma. No Xbox 360, você tinha 10 MB de EDRAM de alta largura de banda dedicada que precisava usar para renderizar destinos. No Xbox One, você ainda possui 32 MB de ESRAM especial, que é preferido para destinos de renderização devido à alta largura de banda (e também pode ser buscada ao contrário do Xbox 360), mas os destinos de renderização também podem residir na memória DDR3 comum.

JarkkoL
fonte