¿Cómo maneja la GPU la textura y la VRAM?

18

En realidad es un montón de preguntas interrelacionadas:

  1. ¿Las texturas comprimidas (dxt5 / dxt1, etc.) alguna vez se descomprimen completamente al pasar por la canalización de renderizado?

  2. Si la respuesta a la primera pregunta es verdadera, ¿cómo se gestiona la memoria para varias texturas grandes sin comprimir?

  3. ¿Framebuffer es diferente de VRAM en la GPU moderna?

Allahjane
fuente

Respuestas:

29

Los formatos de textura comprimida de GPU como DXT / BC / ETC están diseñados específicamente para leerse directamente desde su forma comprimida. No necesitan ser desempaquetados en un búfer RGBA sin procesar.

La forma en que esto funciona es que cada bloque de texels (a menudo 4x4) ocupa un número fijo de bits, por lo que sabemos exactamente a qué distancia en el búfer buscar un texel en particular, y estos bloques se pueden descomprimir sin leer todo el entorno / información de textura anterior. Las GPU contienen hardware especializado que descomprime solo los bloques de texel solicitados según sea necesario para cumplir con las solicitudes de muestreo de textura de sus sombreadores.

Esto contrasta con formatos como jpg y png, donde la cantidad de espacio que ocupa cada texel puede variar en la imagen (áreas detalladas que ocupan más datos, áreas predecibles que ocupan menos), por lo que para encontrar un texel en particular, debe descomprimir toda la imagen, o al menos fragmentos grandes / distribuidos de ella. Pero debido a que pueden comprimir selectivamente áreas predecibles de una textura, tienden a comprimir imágenes a tamaños más pequeños para almacenarlas en un disco o transmitirlas a través de una red que lo que obtenemos de formatos compatibles con GPU. Diferentes estrategias para diferentes usos.


En general, hacer múltiples preguntas debe hacerse a través de múltiples publicaciones, pero como esta es una respuesta bastante corta, también llegaré al punto 3:

" Framebuffer " es solo un bit particular de memoria de video que hemos decidido usar para almacenar la imagen compuesta que queremos presentar en la pantalla. Tenga en cuenta los detalles en la respuesta de JarkkoL, donde en algún hardware especializado podríamos elegir ubicar este búfer en una parte particular de nuestra memoria de video disponible que está optimizada para las necesidades de ancho de banda de los objetivos de renderizado.

DMGregory
fuente
Ese enlace en el algoritmo de compresión es extremadamente útil y profundo. Buen hallazgo!
Coburn
7

Las respuestas a sus preguntas realmente dependen de la plataforma. En general, los formatos BC se mantienen en forma comprimida en la memoria y la descompresión se realiza en vuelo por unidades de textura de GPU, pero hay excepciones. Es decir, se sabe que Xbox 360 descomprime bloques BC completos de 4x4 píxeles en la memoria caché antes de que TU recupere los datos, lo que infla el uso de la memoria caché. Sin embargo, no conozco ninguna plataforma que descomprima toda la textura para cargar con la carga, pero lo dudo mucho debido al uso de memoria y ancho de banda adicional.

Lo mismo ocurre con los framebuffers: depende de la plataforma. En Xbox 360, tenía 10 MB de EDRAM dedicada de alto ancho de banda que tenía que usar para los objetivos de renderizado. En Xbox One, todavía tiene 32 MB de ESRAM especial que se prefiere para los objetivos de procesamiento debido al alto ancho de banda (y también se puede obtener a diferencia de Xbox 360), pero los objetivos de procesamiento también pueden residir en la memoria DDR3 normal.

JarkkoL
fuente