From: Carl Worth Date: Wed, 15 Aug 2012 18:16:52 +0000 (-0700) Subject: glxsimple: Introduce an inter-frame texture dependency to exercise trim code X-Git-Url: https://git.cworth.org/git?p=apitrace-tests;a=commitdiff_plain;h=775a8790750a28d7c39cd1ff54f62b90edc8ad2d glxsimple: Introduce an inter-frame texture dependency to exercise trim code The previous glxsimple program was too simple as each frame was entirely self-contained, (textures were created, initialized, and referenced only within single frames). For more realistic trimming, we create and initialize a texture in one frame, then reference that texture in a later frame. This is a better test to ensure that when trimming the first frame the texture creation and initialization is not discarded. --- diff --git a/cli/src/glxsimple.c b/cli/src/glxsimple.c index b29fa9e..a4c9560 100644 --- a/cli/src/glxsimple.c +++ b/cli/src/glxsimple.c @@ -118,11 +118,11 @@ paint_rgb_using_glsl (double r, double g, double b) glUseProgram (0); } -static void -paint_rgb_using_texture (double r, double g, double b) +static GLuint +create_rgb_texture (double r, double g, double b) { uint8_t data[3]; - GLuint texture; + GLuint texture = 0; data[0] = (uint8_t) (255.0 * r); data[1] = (uint8_t) (255.0 * g); @@ -137,6 +137,14 @@ paint_rgb_using_texture (double r, double g, double b) 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, data); + return texture; +} + +static void +paint_using_texture (GLuint texture) +{ + glBindTexture (GL_TEXTURE_2D, texture); + glEnable (GL_TEXTURE_2D); draw_fullscreen_textured_quad (); @@ -147,8 +155,10 @@ paint_rgb_using_texture (double r, double g, double b) static void draw (Display *dpy, Window window, int width, int height) { +#define PASSES 2 int i; GLenum glew_err; + GLuint texture[PASSES]; int visual_attr[] = { GLX_RGBA, @@ -184,23 +194,30 @@ draw (Display *dpy, Window window, int width, int height) #define RGB(frame) (((frame+1)/4) % 2), (((frame+1)/2) % 2), ((frame+1) % 2) int frame = 0; - for (i = 0; i < 2; i++) { - /* Frame: Draw a solid (magenta) frame using glClear. */ + for (i = 0; i < PASSES; i++) { + + /* Frame: Draw a solid frame using glClear. */ paint_rgb_using_clear (RGB(frame)); glXSwapBuffers (dpy, window); frame++; - /* Frame: Draw a solid (yellow) frame using GLSL. */ + /* Frame: Draw a solid frame using GLSL. */ paint_rgb_using_glsl (RGB(frame)); glXSwapBuffers (dpy, window); frame++; - /* Frame: Draw a solid (cyan) frame using a texture. */ - paint_rgb_using_texture (RGB(frame)); + /* Frame: Draw a solid frame using a texture. */ + texture[i] = create_rgb_texture (RGB(frame)); + paint_using_texture (texture[i]); glXSwapBuffers (dpy, window); frame++; } + /* Draw another frame with a re-used texture. */ + paint_using_texture (texture[0]); + glXSwapBuffers (dpy, window); + frame++; + /* Cleanup */ glXDestroyContext (dpy, ctx); } diff --git a/trim_stress/glxsimple.trace b/trim_stress/glxsimple.trace index 9c22592..162de4d 100644 Binary files a/trim_stress/glxsimple.trace and b/trim_stress/glxsimple.trace differ