Introdução às GPUs Marcelo Walter UFPE atualização/maio 2009 Graphics Pipeline 2 1
Graphics Pipeline glbegin(gl_triangles); gl3f(0.0,0.0,0.0); gl3f(1.0,0.0,0.0); gl3f(0.5,1.0,0.0);... glend(); 3 Graphics Pipeline 2 3 1 4 4 2
Graphics Pipeline 1 2 3 4 3 1 2 3 1 4 5 Graphics Pipeline 4 3 1 1 2 3 6 transf em coordenadas câmera iluminação 3
Graphics Pipeline 4 2 3 1 3 1 7 Graphics Pipeline 3 1 3 4 2 1 8 4
Graphics Pipeline 1 3 4 3 2 1 9 Graphics Pipeline 1 2 1 3 4 3 10 Conecta vértices em triângulos recorte Eliminação de faces traseiras rasterização 5
Graphics Pipeline 1 2 1 3 4 3 11 Graphics Pipeline 3 4 12 Executa interpolações Determina cor final do fragmento 6
Graphics Pipeline 4 3 1 13 Graphics Pipeline 4 3 1 14 7
Graphics Pipeline 15 Depth buffer Blending Stencil operations Graphics Pipeline 16 8
Graphics Pipeline 17 Graphics Pipeline 18 9
Graphics Pipeline: Paralelização 1 2 3 19 Graphics Pipeline: Paralelização 1 2 3 20 10
Graphics Pipeline: Paralelização 21 Graphics Pipeline: Paralelização 22 11
// In: // eye_space position = TEX7 Programmable Graphics Pipeline // eye space T = (TEX4.x, TEX5.x, TEX6.x) denormalized // eye space B = (TEX4.y, TEX5.y, TEX6.y) denormalized // eye space N = (TEX4.z, TEX5.z, TEX6.z) denormalized fragout frag program main(vf30 In) { CPU GPU Boundary Programmable Processor 23 float m = 30; // power float3 hicol = float3( 1.0, 0.1, 0.1 ); // lit color float3 lowcol = float3( 0.3, 0.0, 0.0 ); // dark color float3 speccol = float3( 1.0, 1.0, 1.0 ); // specular color // Get eye-space eye vector. float3 e = normalize( -In.TEX7.xyz ); // Get eye-space normal vector. float3 n = normalize( float3(in.tex4.z, In.TEX5.z, In.TEX6.z ) ); Processor Programmable Graphics Pipeline CPU GPU Boundary 24 Program 12
25 Processor Processor Processor Processor Program Programmable Graphics Pipeline CPU GPU Boundary Processor Programmable Graphics Pipeline CPU GPU Boundary 26 Programmable Fragment Processor Program 13
Processor Programmable Graphics Pipeline CPU GPU Boundary Fragment Processor 27 Program Processor Programmable Graphics Pipeline CPU GPU Boundary Fragment Processor Fragment Processor Fragment Processor Fragment Processor 28 Program 14
Processor Graphics Pipeline: The Big Picture CPU GPU Boundary Fragment Processor 29 GPU como um processador de streams (fluxo) Multiple programmable processing units Connected by data flows Application Processor Assembly & ization Fragment Processor Framebuffer Framebuffer Textures 30 Program Program 15
Gargalos: Computation Frequencies 1 2 3 > vários 3 Processor Fragment Processor 31 4 3 1 Processador de Vértices Totalmente programável (SIMD / MIMD) Processa 4-vectors (RGBA / XYZW) Não consegue ler informações de outros vértices No edge, face, nor neighboring vertex info Não cria nem deleta vértices 1 vertex in and 1 vertex out Programas podem ser carregados dinamicamente Texture Fetch Consegue acessar texturas 32 16
Processador de Vértices input attributes output attributes Processor input parameters temporary registers texture memory 33 Atributos de Entrada dos Vértices Processor position texture coord 0 weight texture coord 1 normal texture coord 2 primary color texture coord 3 secondary color texture coord 4 34 fog - - texture coord 5 texture coord 6 texture coord 7 17
Parâmetros de Entrada Processor 35 parameter 0 parameter 1 parameter 2 parameter 3 parameter 4... - parameter 127... modelview modelview inverse skinning matrices other parameters Parâmetros de Entrada Processor 36 temporary 0 temporary 1 temporary 2 temporary 3 temporary 4... - temporary 12... 18
Atributos de Saída dos Vértices Processor clip-space position texture coord 0 front primary color front secondary color texture coord 1 texture coord 2 back secondary color texture coord 3 back primary color texture coord 4 37 fog point size - texture coord 5 texture coord 6 texture coord 7 Processador de Fragmentos Totalmente programável (SIMD) Processa vectors (4 valores)(rgba / XYZW) Acesso a Texturas Render to Texture Fragmentos transformados em pixels são escritos numa textura e não enviados ao Tipicamente mais útil do que o VP Mais pipelines de fragmentos do que de vértices 38 19
Processador de Fragmentos Interpolated vertex attributes Fragment attributes Fragment Processor input parameters temporary registers texture memory 39 Atributos de Entrada Interpolated vertex attributes Fragment Processor color Secondary color Texture coordinate Fog coordinate x - - - 40 20
Atributos de Saída Fragment attributes Fragment Processor z depth color Frag data 41 Tipos de Dados Scalars: float/integer/boolean Precisão de 32 ou 16 bits ATI suporta 24 bits GLSL tem inteiros de 16 bits Vector 3 ou 4 componentes Arrays (de tamanho fixo) No bit operations Matrix data types Texture data type 42 21
Data Binding Modos: uniform: : o parâmetro é fixo dentro de uma chamda glbegin() ()-glend() varying: : dados interpolados enviados ao programa de fragmento (ex. cor pixel, coordenadas de textura) attribute: : dados per-vertex enviados à GPU pela CPU (coordenadas( de vértices, coordenadas de texturas, normais,, etc). 43 Data Binding Direção ção: in: : dados enviados para dentro do programa (ex. vertex coordinates) out: : dados enviados para fora do the programa (ex. depth) inout: : ambos acima (ex. cor) 44 22
Operações e Fluxo de Controle Aritmética usual e operações algébricas especiais (trigonometry, interpolation, discrete derivatives, etc) No integer mod for-loops, while-do loops, if-then-else statements. discard permite desabilitar um fragmento e encerrar o processamento Chamadas recursivas não n estão suportadas Sempre uma função main default que começa o programa 45 23