Herramientas de Soporte para un Simulador de un Procesador Gráfico
3D
Director: Victor Moya del Barrio
Ponente: Agustín Fernández Jiménez
Autor: Carlos González Rodríguez
Departamento: Arquitectura de Computadores
Proyecto bGPU
Aplicación OpenGL
API OpenGL
Driver hardware gráfico
Aplicación OpenGL
API OpenGL
Driver (bGPU)
Simulador bGPU
Realidad Objetivo
Estadísticas
Mi Proyecto Objetivo principal
Poder ejecutar aplicaciones 3D (trazas) que usen la API gráfica OpenGL en el simulador bGPU. También es un objetivo principal la obtención de estadísticas a nivel de la API OpenGL
GLInterceptor TraceDriver GPULib GPUDriver
Objetivos secundarios Comprobar integridad de trazas OpenGL y
visualizar el tráfico interno del simulador GLPlayer bGPU Traffic Visualizer
Mi Proyecto
Aplicación OpenGL
API OpenGL
Driver hardware gráfico
Mi Proyecto
Aplicación OpenGL
API OpenGL
Driver hardware gráfico
Traza OpenGL
GLPlayer
GLInterceptor TraceDriver
API OpenGL (bGPU)
Driver (bGPU)
Simulador bGPU
Estadísticas
Estadísticas
Mi Proyecto
Aplicación OpenGL
API OpenGL
Driver hardware gráfico
Traza OpenGL
GLPlayer
GLInterceptor TraceDriver
API OpenGL (bGPU)
Driver (bGPU)
Simulador bGPU
Estadísticas
Estadísticas
Mi Proyecto - Anexo
La última herramienta en este PFC es un visualizador del tráfico interno del simulador
El visualizador es un complemento independiente del resto de herramientas presentadas hasta ahora
Permite analizar el tráfico interno del simulador bGPU de forma visual
OpenGL
¿Qué es OpenGL?
Aplicaciones Ejemplo simple
API OpenGL
Driver hardware gráfico
Aplicación OpenGL
Driver hardware gráfico
Aplicación OpenGL
OpenGL – ¿Qué es OpenGL?
OpenGL es una API Gráfica que permite especificar los objetos y operaciones necesarias para el desarrollo de gráficos por ordenador de alta calidad, especialmente escenas 3D
Interfaz software para hardware gráfico
Capa software que se ubica entre el programador y la CPU/GPU
Independiente del sistema de ventanas y el SO
API completamente horizontal Interfaz C 455 funciones OpenGL 1.5 763 funciones pertenecientes a extensiones 2938 constantes
OpenGL - Aplicaciones
Juegos 3D
Realidad Virtual CAD/CAM
Software científico/médico
OpenGL - Ejemplo simple
#include <GL/gl.h>#include <GL/glut.h>
void display(void) { glClear (GL_COLOR_BUFFER_BIT); glColor( 1.0, 1.0, 1.0); glBegin(GL_POLYGON); glVertex3f (0.25, 0.25, 0.0); glVertex3f (0.75, 0.25, 0.0); glVertex3f (0.75, 0.75, 0.0); glVertex3f (0.25, 0.75, 0.0); glEnd(); glFlush ();}
void init (void) { glClearColor (0.0, 0.0, 0.0, 0.0); /* select clearing (background)
color */ glMatrixMode(GL_PROJECTION); /* initialize viewing values */ glLoadIdentity(); glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);}
int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutInitWindowSize (250, 250); glutInitWindowPosition (100, 100); glutCreateWindow ("hello"); init (); glutDisplayFunc(display); glutMainLoop(); return 0;}
GLInterceptor
¿Qué es GLInterceptor? Trazas Estadísticas Arquitectura Código autogenerado
Aplicación OpenGL
API OpenGL
Driver hardware gráfico
GLInterceptor
Aplicación OpenGL
API OpenGL
Driver hardware gráfico
GLInterceptor - ¿Qué es GLInterceptor?
Objetivo Capturar todas las llamadas a la API OpenGL Almacenar llamadas con sus parámetros en disco Generar estadísticas de la frecuencia de uso de las llamadas
Requisitos
Soporte para OpenGL 1.5 Soporte para cualquier extensión OpenGL Diversos formatos de traza: Text, bin, comprimido, etc
Dificultad Recordemos números sobre la API OpenGL
455 funciones OpenGL 1.5 763 funciones pertenecientes a extensiones Total: 1218 funciones a “interceptar”
Solución Código fuente autogenerado Entraremos en esto más adelante cuando hablemos de las funciones
Wrapper
GLInterceptor - Trazas
GLI0.t# Trace generated with GLInterceptor 0.1# Thu Jun 03 11:18:45 2004wglDescribePixelFormat(3103857406,1,40,U0x20759612)=54…glBindTexture(GL_TEXTURE_2D,1041)glTexImage2D(GL_TEXTURE_2D,0,3,16,16,0,GL_RGBA,GL_UNSIGNED_BYTE,*68)glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,9729)glGetError()=GL_FALSE…glDisable(GL_CLIP_PLANE0)glColor3f(0.5,0.5,0.5)glBegin(GL_QUADS)glTexCoord2f(0.000976563,0.000976563)glVertex2f(0,0)glTexCoord2f(0.999023,0.000976563)glVertex2f(1280,0)…glVertexPointer(3,GL_FLOAT,16,*1133)glLockArraysEXT(0,4)glBindTexture(GL_TEXTURE_2D,1024)glDisable(GL_BLEND)glDepthMask(TRUE)glEnable(GL_DEPTH_TEST)glDrawElements(GL_TRIANGLES,6,GL_UNSIGNED_INT,*1134)glUnlockArraysEXT()…wglSwapBuffers(3103857406)=1…
GLInterceptor - Estadísticas
FRAME STATS 1 2 ... 2280 2281 2282 2283
glActiveTextureARB 2 ... 146 144 144 144
glAlphaFunc ...
glBegin 1 1 ...
... … … ... ... ... ... ...
glDrawElements ... 176 178 186 184
... … … ... ... ... ... ...
BATCHES 1 1 ... 176 178 186 184
VERTEXES 4 4 ... 28371 28323 29007 29781
TRIANGLES 2 2 ... 9457 9441 9669 9927
GLInterceptor - Arquitectura
Aplicación OpenGLGLIConfig.ini
gl.h glext.h wgl.h wglext.h
GLWrapper SpecificGLInterceptorDLL start
GLIStatManager
SpecificStats
AdvancedStats
TraceWriter GLJumpTableBuffers Objects
Zlib Compression
statsPerFrame.csvstatsPerBatch.csv
tracefile.dat BufferDescriptors.datMemoryRegions.dat
opengl32.dll
ICD
auto
auto
auto
auto
auto auto
GLInterceptor – Código autogenerado
Mecanismo para interceptar llamadas Funciones Wrapper
Una función Wrapper por cada función OpenGL original Actualizan el contador de estadísticas Almacenan la llamada y sus parámetros Ejecutan la función OpenGL original
Código de funciones Wrapper generado de forma automática. GLWrapperGenerator
Una función Wrapper puede tener comportamiento específico Código escrito manualmente
El código específico se escribe en ficheros independientes. El generador de código se encarga de enlazar nuestro código específico con el código autogenerado
Specific.h Directivas
GLInterceptor – Función Wrapper
void GLAPIENTRY glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices){#ifndef WRAP_ONLY_MODE // Specific stats code glDrawElements_STAT(mode,count,type,indices); _COUNT(APICall_glDrawElements);#endif GLInterceptor::init(); CHECKCALL(glDrawElements); DO_REAL_CALL(glDrawElements(mode,count,type,indices));#if !defined(STATS_ONLY_MODE) && !defined(WRAP_ONLY_MODE) _W.writeAPICall("glDrawElements"); _W.writeMark("("); _W.writeEnum(mode); _W.writeMark(","); _W.write(count); _W.writeMark(","); _W.writeEnum(type); _W.writeMark(","); // [GEN-CODE info: Specific user call] glDrawElements_SPECIFIC(mode,count,type,indices); _W.writeMark(")\n");#endif}
//<NL=4>//<A=3>
void GLAPIENTRY glDrawElements_SPECIFIC( GLenum mode, GLsizei count, GLenum type, const GLvoid *indices );
GLPlayer
¿Qué es GLPlayer? Arquitectura GLExec API OpenGL
Driver hardware gráfico
API OpenGL
Driver hardware gráfico
GLPlayer
Traza OpenGL
GLPlayer - ¿Qué es GLPlayer?
Reproductor de trazas OpenGL generadas con GLInterceptor
Verificador visual
Realiza el proceso “inverso” a GLInteceptor ¿Traza correcta?
Crea un contexto/ventana donde recrean todos los comandos OpenGL de la traza
Implementado utilizando el componente GLExec que permite procesar una traza con un grado de abstracción muy elevado
GLPlayer - Arquitectura
GLPlayer win32
Contexto de visualización (ventana)
GLExec
Tracefile.dat BufferDescriptors.dat MemoryRegions.dat
Crear ventana
Inicializar GLExec Ejecutar Llamadas OpenGL
config.ini
Leer configuración
Si wglSwapBuffers(fin del frame)
SwapBuffers
GLPlayer - GLExec
Interfaz “simple” de acceso a una traza Independiente del formato de la traza Transparente a la gestión de buffers Transparente a la ejecución de OpenGL
Usa un mecanismo inverso a GLInterceptor Funciones STUB
Leer llamada seleccionar función STUB
Leer parámetros Ejecutar la función OpenGL
Permite asociar diferentes implementaciones a cada una de las funciones OpenGL de su tabla de funciones, de forma dinámica o estática.
GLPlayer opengl32.dll TraceDriver Librería GPULib …
Fácilmente extensible Funciones STUB auto-generadas No necesita código específico
GLPlayer - GLExec
TraceDriver
Traza OpenGL
API OpenGL (bGPU)
Driver (bGPU)
Simulador bGPU
Estadísticas
API OpenGL
Driver hardware gráfico
GLPlayer
Traza OpenGL
GPULib ¿Qué es GPULib? Estado en GPULib Paradigma
glBegin/glEnd T&L vs Vertex Shaders
TraceDriver
Traza OpenGL
API OpenGL (bGPU)
Driver (bGPU)
Simulador bGPU
Estadísticas
Driver (bGPU)
Simulador bGPU
Estadísticas
TraceDriver
Traza OpenGL
GPULib - ¿Qué es GPULib?
Implementación de la API OpenGL No estricta
No implementa la gestión de errores OpenGL Parcial
Actualmente 60 comandos
Mantiene el estado interno requerido en OpenGL
Utiliza a GPUDriver para comunicarse con el simulador bGPU
driverwriteGPURegister(GPU_PRIMITIVE, data)
GPULib – Estado en GPULib
OpenGL es una máquina de estado
GPULib mantiene actualmente el siguiente estado:
Primitiva actual Color, normal y coordenadas de textura actuales Pilas para las matrices de modelview, proyección y
texturas Matriz actual Buffers internos para vértices, colores y texturas Tamaño de los elementos de cada buffer (tipo) Flags de estado generales:
normales ON glBegin/glEnd mode …
Flags para el manejo de vertex arrays Estado e información de cada uno de los vertex arrays
GPULib – Ejemplo glBegin/glEnd
Presente desde OpenGL 1.0 Primer método ofrecido en la API OpenGL
para dibujar primitivas Todavía se utiliza con bastante frecuencia en
muchas situaciones Hay que soportarlo
No soportado directamente por el simulador El simulador implementa el concepto de batch
Buffer con un conjunto de primitivas (vértices)
Idea. Uso de buffers internos en GPULib
Agrupar primitivas en un buffer y procesarlas a posteriori, todas juntas
Conversión del conjunto de llamadas entre un glBegin y un glEnd en una única llamada glDrawArrays
glBegin(GL_TRIANGLE_FAN) glVertex2f(0, 0); glVertex2f(0,1); for ( int i = 0; i < N; i++
) { glVertex2f(i,i+1); glColor3f(2*i/N, i*i, i); }glEnd()
GPULib – Ejemplo T&L vs Vertex Shaders
Procesado de la geometría e iluminación de los vértices en el procesador gráfico
T&L: Hardware fijo Vertex Shader: Hardware
programable
Vertexes
Backface cullingFrustum clipping
Standard Shading
Pixel Shader
Depth Test
Store Pixel
El simulador bGPU solo proporciona Vertex Shaders.
T&L debe ser emulado con vertex programs
GPULib carga el vertex program adecuado para cada funcionalidad T&L requerida
1 unlit model space vertex
1 lit clip space vertex
1 un-colored pixel
1 colored pixel
Vertex ShaderStandard T&LVertex Shader(T&L emulated)
GPUDriver
¿Qué es GPUDriver? Escritura de
registros Comandos Gestión de memoria
TraceDriver
Traza OpenGL
API OpenGL (bGPU)
Driver (bGPU)
Simulador bGPU
Estadísticas
API OpenGL (bGPU)
Simulador bGPU
Estadísticas
TraceDriver
Traza OpenGL
GPUDriver - ¿Qué es GPUDriver?
Driver genérico para bGPU
Ofrece servicios de control de bGPU Escritura de registros Gestión de regiones memoria Configuración de Streams de datos Configuración de la unidad Streamer Envío de comandos CommandProcessor Escritura de constantes Vertex Shader
Comunicación con el simulador Transacciones AGP
void writeGPURegister( GPURegister regId, GPURegData data ); void writeGPURegister( GPURegister regId, u32bit index, GPURegData data );
GPUDriver – Escritura de registros y Comandos
data.uintVal = TRIANGLE_FAN;
driverwriteGPURegister(GPU_PRIMITIVE, data)
Escritura del registro de la GPU que mantiene la primitiva actual data.qfVal[0] = 1.0f;
data.qfVal[1] = 2.5f;data.qfVal[2] = 0.5f;data.qfVal[3] = 1.0f;
driverwriteGPURegister(GPU_VERTEX_CONSTANT, 4, data);
Escritura del cuarto sub-registro del banco de constantes del Vertex
Shader
void sendCommand( GPUCommand com);
driversendCommand(GPU_DRAW);
Indica que ya se puede empezar a procesar el batch actual
driversendCommand(GPU_LOAD_VERTEX_PROGRAM);
Carga un vertex program en la memoria de instrucciones del Vertex
Shader
Sistema de regiones de memoria basado en descriptores Unix-like
Obtener región de memoria local de bGPU
u32bit obtainMemory( u32bit sizeBytes );
Escribir en una región de memoria bool writeMemory(u32bit md, const u8bit* data, u32bit dataSize); bool writeMemory(u32bit md, u32bit offset, const u8bit* data, u32bit dataSize);
Liberar región de memoria void releaseMemory( u32bit md );
GPUDriver – Gestión de Memoria
Anexo: bGPU Traffic Visualizer
¿Qué es bGPU Traffic Visualizer?
Interfaz Ejemplo
TraceDriver
Traza OpenGL
API OpenGL (bGPU)
Driver (bGPU)
Simulador bGPU
Estadísticas
Driver hardware gráfico
Simulador bGPU
Estadísticas
TraceDriver
Traza OpenGL
API OpenGL (bGPU)
Signaltrace.dat
bGPU Traffic Visualizer - ¿Qué es?
Visualizador del tráfico interno que circula por el simulador
Permite visualizar gran cantidad de datos de forma simultánea
Presentación en forma de cronograma
Abcisas ciclos Ordenadas Signals
Permite evaluar parámetros/rendimiento del simulador
Driver hardware gráfico
Simulador bGPU
TraceDriver
Traza OpenGL
API OpenGL (bGPU)
Signaltrace.dat
bGPU Traffic Visualizer – Interfaz
Número de ciclo
Signals
Opciones
Barra de desplazamiento horizontal
Barra de desplazamiento vertical
bGPU Traffic Visualizer – Ejemplo
Cada uno de estos grupos indica el procesado de un vértice por un el vertex program activo
Por tanto en la imagen se está mostrando como se procesan 3 vértices diferentes
Los huecos entre el procesado de cada vértice muestran el tiempo de carga de los atributos de un vértice desde la memoria local del simulador a los registros INPUT del vertex shader
Conclusiones Objetivos principales OK
Posibilidad de obtener trazas de aplicaciones OpenGL y estadísticas a nivel aplicación
GLInterceptor
Framework para la ejecución de trazas en el simulador TraceDriver GPULib GPUDriver
Objetivos secundarios OK
Verificador de trazas GLPlayer
Visualizador del tráfico interno de bGPU bGPU Traffic Visualizer
Trabajo futuro
Ampliar GPULib con más comandos y estado
Framework para DirectX 3D Diseñar un capturador de trazas
¿D3DInterceptor? Diseñar un lector de trazas similar a
GLExec para DirectX 3D ¿Reutilizar GLExec de OpenGL?
Implementar API DirectX 3D para bGPU ¿GPULibD3D?
Herramientas de Soporte para un Simulador de un Procesador Gráfico
3D
Top Related