1 / 24

Ensamblador ARB Vertex Program v1.0

Ensamblador ARB Vertex Program v1.0. Jordi Roca Monfort 30 de Junio del 2004. Parte 1: El ensamblador implementado. Generación Código. Específico GPU. Genérico. AST. !!ARBvp1.0. Arquitectura Ensamblador. Line:By0By1By2By3By4By5By6By7By8By9ByAByBByByDByEByF

raven
Download Presentation

Ensamblador ARB Vertex Program v1.0

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Ensamblador ARB Vertex Program v1.0 Jordi Roca Monfort 30 de Junio del 2004

  2. Parte 1: El ensamblador implementado

  3. Generación Código Específico GPU Genérico AST !!ARBvp1.0 Arquitectura Ensamblador Line:By0By1By2By3By4By5By6By7By8By9ByAByBByByDByEByF 011: 16 00 03 28 00 01 00 08 26 1b 6a 00 0f 1b 04 78 012: 09 00 03 00 00 00 02 08 24 1b 1b 00 08 1b 14 18 013: 09 00 04 00 00 00 02 08 24 1b 1b 00 04 1b 14 b8 014: 09 00 05 00 00 00 02 08 24 1b 1b 00 02 1b 04 58 015: 09 00 06 00 00 00 02 08 24 1b 1b 00 01 1b 04 f8 016: 16 00 01 00 00 00 02 30 24 1b 1b 00 08 1b 14 98 017: 16 00 02 00 00 01 02 30 24 1b 1b 00 08 1b 04 38 018: 16 00 00 00 00 00 03 30 24 00 1b 00 02 1b 04 d8 019: 16 00 01 00 00 00 03 30 24 00 1b 00 01 1b 14 78 020: 01 00 08 00 00 08 18 08 24 04 ae 00 0c 1b 04 18 021: 17 00 00 00 00 00 13 30 24 00 00 00 08 1b 04 b8 022: 17 00 01 00 00 00 13 30 24 00 00 00 04 1b 14 58 023: 01 00 08 00 00 09 18 08 24 04 04 00 0c 1b 14 f8 024: 01 00 08 00 00 0a 18 08 26 04 ae 00 0c 1b 04 98 025: 01 00 08 00 00 0b 18 08 26 04 04 00 0c 1b 14 38 !!ARBvp1.0 PARAM arr[5] = { program.env[0..4] }; #ADDRESS addr; ATTRIB v1 = vertex.attrib[1]; PARAM par1 = program.local[0]; OUTPUT oPos = result.position; OUTPUT oCol = result.color.front.primary; OUTPUT oTex = result.texcoord[2]; ARL addr.x, v1.x; MOV res, arr[addr.x - 1]; END Análisis léxico – Sintáctico (Flex + Bison) Análisis Semántico (casi completo) Tabla símbolos InsertarST(“arr”,5, ENV_PARAMETER)

  4. Arquitectura Ensamblador (2) • Generación de código • 2 fases: • Front-End: Traducción a instrucciones y bancos de registros genéricos. • Back-End: Traducción a instrucciones y bancos de registros de la GPU. • Justificación: • Separar código dependiente sólo de la especificación y código dependiente de la GPU: • Abstraer limitaciones de la GPU (un solo operando direccionado de forma relativa, una sola lectura por instrucción al banco de parametros). • Cambiar la tecnología de la shader unit implica cambiar sólo el código dependiente

  5. Temporary Variables Program Constant Parameters Tx4 variables (T 12) Lx4 registers (L  96) ARB Vertex Program v1.0 model Program Local Parameters Vertex Attributes Program Environment Parameters Nx4 registers (N 16) Lx4 registers (L  96) ARB Vertex Program 1.0 Ex4 registers (E  96) Address Variables M instructions (M 128) Ax4 variables (A  1) Vertex Result Registers Todos los bancos: 3 puertos de lectura!! • Direccionamiento relativo en los 3 operandos!! Rx4 registers (R  8)

  6. 128 bits 4 floats 128 bits 4 floats 128 bits 4 floats 128 bits 4 floats NV Vertex Shader 2.0 model Vertex Input Constant Memory CC register 16 entries Temporaries Registers A0 NV VertexShader 2.0 addr A1 data 64k instructions with branchs 16 entries Vertex Output Temporaries Bank: 3p Constant Memory: 1p Vertex Input: 1p 256 entries 21 entries

  7. Necesidad de código independiente Ref (ARB1_0_vertex_program.txt) Issues section, Issue 14, line 441 "What semantic restrictions, if any, should be imposed on using multiple vertex attributes or program parameters in the same instruction? RESOLVED: None. If the underlying hardware implementation does not support reads of multiple attributes or program parameters, the driver may need to transparently insert additional instructions and/or consume temporaries to perform the operation."

  8. Necesidad de código independiente (2) NV VP2 Instructions Limitations: Ref (NV_vertex_program2.txt) Section 2.14.1.8, Vertex Program Specification subsection Semantic Restrictions "A vertex program fails to load if any instruction sources more than one unique program parameter register. An instruction can match the <progParamRegister> rule more than once only if all such matches are identical. A vertex program fails to load if any instruction sources more than one unique vertex attribute register. An instruction can match the <vtxAttribRegister> rule more than once only if all such matches refer to the same register."

  9. 3 lecturas al banco de constantes en la misma instrucción Prefetch de operandos (caso1) ARBVP1.0 NV30 VS2.0 MAD r3, c0 , c1, c2 MOV r0, c0 MOV r3, c1 MAD r3, r0 , r3, c2

  10. 2 accesos relativos al banco de constantes en la misma instrucción Prefetch de operandos (caso2) ARBVP1.0 NV30 VS2.0 ADD r3, c0[a0.x] , c1[a0.x + 4] MOV r3, c0[a0.x] ADD r3, r3 , c1[a0.x + 4]

  11. Instrucciones no soportadas (SUB) ARBVP1.0 NV30 VS2.0 SUB r3, r1, r2 ADD r3, r1, -r2

  12. Instrucciones no soportadas (ABS) ARBVP1.0 NV30 VS2.0 ABS r2, r1 MAX r2, r1, -r1

  13. Instrucciones no soportadas (POW) ARBVP1.0 NV30 VS2.0 POW r3.xy, r1.x, r2.y LOG r3.x, r1.x; MUL r3.x, r3.x, r2.y; EXP r3.xy, r3.x; ab = 2 (b x log 2(a)) Si a es potencia de 2 resultado exacto: 43 = 2 (3 x log 2(4)); 43 = 2 (3 x 2); 43 = 2 6; Si no, hay perdida de precisión: 33 = 2 (3 x log 2(3)); 33 = 2 (3 x 1.5849); 33 = 2 4.7547;

  14. Ojo: los operandos pueden tener swizzles masks !! Instrucciones no soportadas (XPD) ARBVP1.0 NV30 VS2.0 XPD r3, r1, r2 MUL r3.xyz, r1.zxy, r2.yzx; MAD r3.xyz, r1.yzx, r2.zxy, - r3.xyz; a x b = (aybz – azby, azbx – axbz, axby – aybx) Hay que componer las swizzles !! Composición de permutaciones

  15. Constant Memory c1 1.0 -1.0 0.0 1.0 -1.0 0.0 2.3 0.0 -1.0 0.0 0.0 -1.0 1.0 4.7 1.0 1.0 0.0 0.0 0.0 0.0 1.2 -1.2 X = + = 0.0 1.0 1.0 1.0 1.0 r0 r3 -1.0 0.0 -1.2 1.2 -1.2 Instrucciones no soportadas (SWZ) ARBVP1.0 NV30 VS2.0 SWZ r3, r0, -1,0,x,-w MAD r3, r0.xxxw, c1.xxyz, c1.zxxx

  16. Parte 2: Integración con la librería

  17. Soporte OpenGL para Vertex Program • Los atributos de un vertice se transforman antes de primitive assembly y rasterización. • La transformación se puede hacer con 2 modos: • OpenGL conventional T&L mode • Vertex Program mode • Para establecer este modo: void Enable(VERTEX_PROGRAM_ARB);

  18. Concepto de program target • Target = tipo de programa ARB • La extensión ARB vertex program proporciona llamadas en las que se especifica el tipo de programa: • La misma extensión especifica nuevos tipos de programas. Esta extensión incluye solo un tipo: VERTEX_PROGRAM_ARB • Para nuevos tipos de programas de futuras extensiones FRAGMENT_PROGRAM_ARB

  19. Concepto de program target • Ejemplo: carga de un vertex program: • Paso 1: generamos un identificador único para cualquier tipo de programa. glGenProgramsARB( 1, &progid ); • Paso 2: creamos un objeto (program object) con el identificador y este se asocia al tipo de programa. El nuevo objeto pasa a ser el current program del tipo de programa:glBindProgramARB( GL_VERTEX_PROGRAM_ARB, progid ); • podemos tener varios programas del mismo tipo pero solamente el current (el especificado con el último glBindProgramARB()) es el que se aplica.

  20. Concepto de program target • Ejemplo: carga de un vertex program: • Paso 3: especificamos el programa del objeto current para un tipo de programa: glProgramStringARB( GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(myProgString), myProgString); • En este momento se compila el programa. • Paso 4: Con glGetIntergv(GL_PROGRAM_ERROR_POSITION_ARB,&errPos ); glGetString( GL_PROGRAM_ERROR_STRING_ARB,&errString ); comprovamos errores de compilación.

  21. global state Target object Program object current object id´s progid currentBound Used Stats program mode enabled param.local[0..96] param.env[0..96] Assemblers pointers Line:By0By1By2By3By4By5By6By7By8By9ByAByBBy 011: 16 00 03 28 00 01 00 08 26 1b 6a 00 012: 09 00 03 00 00 00 02 08 24 1b 1b 00 013: 09 00 04 00 00 00 02 08 24 1b 1b 00 04 014: 09 00 05 00 00 00 02 08 24 1b 1b 00 015: 09 00 06 00 00 00 02 08 24 1b 1b 00 01 016: 16 00 01 00 00 00 02 30 24 1b 1b 00 08 017: 16 00 02 00 00 01 02 30 24 1b 1b 00 08 018: 16 00 00 00 00 00 03 30 24 00 1b 00 02 019: 16 00 01 00 00 00 03 30 24 00 1b 00 01 ARB VP 1.0 assembler Estado de un programa • Se mantiene en el program object:

  22. más llamadas • Valores de atributos “genéricos” de un vértice se especifican con nuevos comandos: • glVertexAttrib4fARB( index, x, y, z, w ) • glVertexAttribs4fvARB( index, values ) • También se pueden utilizar los “convencionales”: • glVertex3f(), glNormal(), glColor() ....

  23. más llamadas • Especificar parámetros locales del current program: • glProgramLocalParameter4fARB( GL_VERTEX_PROGRAM_ARB, index, x, y, z, w ) • glProgramLocalParameter4fvARB( GL_VERTEX_PROGRAM_ARB, index, params ) • Especificar parámetros globales del target: • glProgramEnvParameter4fARB( GL_VERTEX_PROGRAM_ARB, index, x, y, z, w ) • glProgramEnvParameter4fvARB(GL_VERTEX_PROGRAM_ARB, index, params )

  24. Consulta de limites de la implementación • Número máximo de instrucciones • glGetProgramivARB( GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_INSTRUCTIONS, &maxInsts ); • Número máximo de temporales • glGetProgramivARB( GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_INSTRUCTIONS, &maxTemps ); • Número máximo de parametros declarados • glGetProgramivARB( GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_PARAMETERS, &maxParams ); • ...y otras

More Related