390 likes | 585 Views
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. Realidad. Objetivo. Aplicación OpenGL. Aplicación OpenGL.
E N D
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 Realidad Objetivo Aplicación OpenGL Aplicación OpenGL API OpenGL API OpenGL Driver hardware gráfico Driver (bGPU) Simulador bGPU 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
API OpenGL Driver hardware gráfico Mi Proyecto Aplicación OpenGL
GLInterceptor Mi Proyecto Estadísticas Aplicación OpenGL Traza OpenGL TraceDriver API OpenGL API OpenGL (bGPU) GLPlayer Driver hardware gráfico Driver (bGPU) Simulador bGPU Estadísticas
GLInterceptor Mi Proyecto Estadísticas Aplicación OpenGL Traza OpenGL TraceDriver API OpenGL API OpenGL (bGPU) GLPlayer Driver hardware gráfico Driver (bGPU) Simulador bGPU 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
Aplicación OpenGL Driver hardware gráfico OpenGL • ¿Qué es OpenGL? • Aplicaciones • Ejemplo simple Aplicación OpenGL API OpenGL Driver hardware gráfico
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 Software científico/médico Realidad Virtual CAD/CAM
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; }
Aplicación OpenGL GLInterceptor API OpenGL Driver hardware gráfico GLInterceptor • ¿Qué es GLInterceptor? • Trazas • Estadísticas • Arquitectura • Código autogenerado 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 2004 wglDescribePixelFormat(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 - Arquitectura GLIConfig.ini Aplicación OpenGL gl.h glext.h wgl.h wglext.h GLInterceptor DLL start GLWrapper Specific auto auto auto auto auto GLIStatManager TraceWriter GLJumpTable Buffers Objects SpecificStats auto Zlib Compression AdvancedStats tracefile.dat statsPerFrame.csv statsPerBatch.csv opengl32.dll BufferDescriptors.dat MemoryRegions.dat ICD
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 );
API OpenGL Driver hardware gráfico GLPlayer Traza OpenGL • ¿Qué es GLPlayer? • Arquitectura • GLExec GLPlayer API OpenGL Driver hardware gráfico
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 Contexto de visualización (ventana) config.ini Crear ventana SwapBuffers Leer configuración GLPlayer win32 Si wglSwapBuffers(fin del frame) Inicializar GLExec Ejecutar Llamadas OpenGL GLExec Tracefile.dat BufferDescriptors.dat MemoryRegions.dat
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 Traza OpenGL Traza OpenGL GLPlayer TraceDriver API OpenGL API OpenGL (bGPU) Driver hardware gráfico Driver (bGPU) Simulador bGPU Estadísticas
Traza OpenGL TraceDriver Driver (bGPU) Simulador bGPU Estadísticas GPULib Traza OpenGL • ¿Qué es GPULib? • Estado en GPULib • Paradigma glBegin/glEnd • T&L vs Vertex Shaders TraceDriver API OpenGL (bGPU) Driver (bGPU) Simulador bGPU Estadísticas
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
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) GPULib – Ejemplo glBegin/glEnd 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() • 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
Standard T&L Vertex Shader 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 1 unlit model space vertex Vertex Shader (T&L emulated) 1 lit clip space vertex Backface culling Frustum clipping • 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 un-colored pixel Standard Shading Pixel Shader 1 colored pixel Depth Test Store Pixel
Traza OpenGL TraceDriver API OpenGL (bGPU) Simulador bGPU Estadísticas GPUDriver Traza OpenGL • ¿Qué es GPUDriver? • Escritura de registros • Comandos • Gestión de memoria TraceDriver API OpenGL (bGPU) Driver (bGPU) Simulador bGPU Estadísticas
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
Escritura del cuarto sub-registro del banco de constantes del Vertex Shader 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); Carga un vertex program en la memoria de instrucciones del Vertex Shader driversendCommand(GPU_LOAD_VERTEX_PROGRAM); GPUDriver – Escritura de registros y Comandos • void writeGPURegister( GPURegister regId, GPURegData data ); • void writeGPURegister( GPURegister regId, u32bit index, GPURegData data ); Escritura del registro de la GPU que mantiene la primitiva actual data.uintVal = TRIANGLE_FAN; driverwriteGPURegister(GPU_PRIMITIVE, data) • void sendCommand( GPUCommand com); Indica que ya se puede empezar a procesar el batch actual driversendCommand(GPU_DRAW);
GPUDriver – Gestión de Memoria • 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 );
Traza OpenGL TraceDriver API OpenGL (bGPU) Driver hardware gráfico Simulador bGPU Estadísticas Anexo: bGPU Traffic Visualizer Traza OpenGL • ¿Qué es bGPU Traffic Visualizer? • Interfaz • Ejemplo TraceDriver API OpenGL (bGPU) Driver (bGPU) Simulador bGPU Estadísticas Signaltrace.dat
bGPU Traffic Visualizer - ¿Qué es? Traza OpenGL • 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 TraceDriver API OpenGL (bGPU) Driver hardware gráfico Simulador bGPU Signaltrace.dat
bGPU Traffic Visualizer – Interfaz Barra de desplazamiento vertical Opciones Número de ciclo Barra de desplazamiento horizontal Signals
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 bGPU Traffic Visualizer– Ejemplo
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 Demo GLIntercepor & GLPlayer