1 / 39

Herramientas de Soporte para un Simulador de un Procesador Gráfico 3D

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.

Télécharger la présentation

Herramientas de Soporte para un Simulador de un Procesador Gráfico 3D

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. 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

  2. Proyecto bGPU Realidad Objetivo Aplicación OpenGL Aplicación OpenGL API OpenGL API OpenGL Driver hardware gráfico Driver (bGPU) Simulador bGPU Estadísticas

  3. 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

  4. API OpenGL Driver hardware gráfico Mi Proyecto Aplicación OpenGL

  5. 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

  6. 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

  7. 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

  8. Aplicación OpenGL Driver hardware gráfico OpenGL • ¿Qué es OpenGL? • Aplicaciones • Ejemplo simple Aplicación OpenGL API OpenGL Driver hardware gráfico

  9. 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

  10. OpenGL - Aplicaciones Juegos 3D Software científico/médico Realidad Virtual CAD/CAM

  11. 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; }

  12. 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

  13. 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

  14. 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 …

  15. GLInterceptor - Estadísticas

  16. 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

  17. 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

  18. 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 );

  19. API OpenGL Driver hardware gráfico GLPlayer Traza OpenGL • ¿Qué es GLPlayer? • Arquitectura • GLExec GLPlayer API OpenGL Driver hardware gráfico

  20. 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

  21. 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

  22. 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 

  23. GLPlayer - GLExec Traza OpenGL Traza OpenGL GLPlayer TraceDriver API OpenGL API OpenGL (bGPU) Driver hardware gráfico Driver (bGPU) Simulador bGPU Estadísticas

  24. 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

  25. 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 • driverwriteGPURegister(GPU_PRIMITIVE, data)

  26. 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

  27. 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

  28. 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

  29. 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

  30. 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

  31. 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; driverwriteGPURegister(GPU_VERTEX_CONSTANT, 4, data); Carga un vertex program en la memoria de instrucciones del Vertex Shader driversendCommand(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; driverwriteGPURegister(GPU_PRIMITIVE, data) • void sendCommand( GPUCommand com); Indica que ya se puede empezar a procesar el batch actual driversendCommand(GPU_DRAW);

  32. 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 );

  33. 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

  34. 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

  35. bGPU Traffic Visualizer – Interfaz Barra de desplazamiento vertical Opciones Número de ciclo Barra de desplazamiento horizontal Signals

  36. 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

  37. 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

  38. 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?

  39. Herramientas de Soporte para un Simulador de un Procesador Gráfico 3D Demo GLIntercepor & GLPlayer

More Related