I tried to make the presentation be the data that was originally probed -- there's a second readpixels that's unfortunately, but we do use separate textures so that any workaround relayouts of the probed textures don't get tweaked in the process of displaying. --- tests/texturing/depthstencil-render-miplevels.cpp | 105 ++++++++++++++++++++- 1 file changed, 102 insertions(+), 3 deletions(-)
diff --git a/tests/texturing/depthstencil-render-miplevels.cpp b/tests/texturing/depthstencil-render-miplevels.cpp index b41fea8..2ffe07d 100644 --- a/tests/texturing/depthstencil-render-miplevels.cpp +++ b/tests/texturing/depthstencil-render-miplevels.cpp @@ -90,8 +90,8 @@ PIGLIT_GL_TEST_CONFIG_BEGIN config.supports_gl_compat_version = 10; - config.window_width = 16; - config.window_height = 16; + config.window_width = 512; + config.window_height = 512; config.window_visual = PIGLIT_GL_VISUAL_RGBA; PIGLIT_GL_TEST_CONFIG_END @@ -109,7 +109,8 @@ bool attach_stencil_first = false; GLenum depth_format; int miplevel0_size; int max_miplevel; - +float **depth_miplevel_data; +uint8_t **stencil_miplevel_data; /** * Check if the given depth/stencil/rgba texture internal format is supported. @@ -260,6 +261,9 @@ populate_miplevel(int level) /** * Test that every pixel in the depth and stencil buffers (if present) * is equal to the value set by populate_miplevel. + * + * If we're going to later render our results to the screen for + * debugging, then save off a copy of the data we read now. */ bool test_miplevel(int level) @@ -272,6 +276,14 @@ test_miplevel(int level) printf("Probing miplevel %d depth\n", level); pass = piglit_probe_rect_depth(0, 0, dim, dim, float_value) && pass; + + if (!piglit_automatic) { + depth_miplevel_data[level] = + (float *)malloc(4 * dim * dim); + glReadPixels(0, 0, dim, dim, + GL_DEPTH_COMPONENT, GL_FLOAT, + depth_miplevel_data[level]); + } } if (attach_stencil) { @@ -279,6 +291,14 @@ test_miplevel(int level) pass = piglit_probe_rect_stencil(0, 0, dim, dim, stencil_for_level(level)) && pass; + + if (!piglit_automatic) { + stencil_miplevel_data[level] = + (uint8_t *)malloc(dim * dim); + glReadPixels(0, 0, dim, dim, + GL_STENCIL_INDEX, GL_UNSIGNED_BYTE, + stencil_miplevel_data[level]); + } } return pass; @@ -332,6 +352,9 @@ piglit_init(int argc, char **argv) while ((miplevel0_size >> (max_miplevel + 1)) > 0) ++max_miplevel; } + depth_miplevel_data = (float **)calloc(max_miplevel, sizeof(float *)); + stencil_miplevel_data = (uint8_t **)calloc(max_miplevel, + sizeof(uint8_t *)); /* argv[2]: buffer combination */ if (strcmp(argv[2], "s=z24_s8") == 0) { @@ -426,6 +449,79 @@ piglit_init(int argc, char **argv) } } +static void +render_tex_to_screen(GLuint tex, int x, int y) +{ + glBindTexture(GL_TEXTURE_2D, tex); + glEnable(GL_TEXTURE_2D); + + for (int level = 0; level <= max_miplevel; ++level) { + int dim = miplevel0_size >> level; + + piglit_draw_rect_tex(x, y, dim, dim, + 0, 0, 1, 1); + + y += dim + 1; + } +} + +/** + * Presents the results of the rendering on the screen. + */ +static void +render_results_to_screen() +{ + GLuint tex; + + printf("\n"); + printf("Depth is on the left, stencil is on the right.\n"); + printf("Colors should proceed from nearly-black to nearly-red.\n"); + + piglit_ortho_projection(piglit_width, piglit_height, false); + + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); + glClearColor(0.5, 0.5, 0.5, 0.0); + glClear(GL_COLOR_BUFFER_BIT); + + glGenTextures(1, &tex); + glBindTexture(GL_TEXTURE_2D, tex); + + if (attach_depth) { + for (int level = 0; level <= max_miplevel; ++level) { + int dim = miplevel0_size >> level; + + glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA, + dim, dim, + 0, + GL_RED, GL_FLOAT, + depth_miplevel_data[level]); + if (!piglit_check_gl_error(GL_NO_ERROR)) + piglit_report_result(PIGLIT_FAIL); + } + + render_tex_to_screen(tex, 0, 1); + } + + + if (attach_stencil) { + for (int level = 0; level <= max_miplevel; ++level) { + int dim = miplevel0_size >> level; + + glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA, + dim, dim, + 0, + GL_RED, GL_UNSIGNED_BYTE, + stencil_miplevel_data[level]); + if (!piglit_check_gl_error(GL_NO_ERROR)) + piglit_report_result(PIGLIT_FAIL); + } + + render_tex_to_screen(tex, miplevel0_size + 10, 1); + } + + piglit_present_results(); +} + extern "C" enum piglit_result piglit_display() { @@ -467,6 +563,9 @@ piglit_display() pass = test_miplevel(level) && pass; } + if (!piglit_automatic) + render_results_to_screen(); + return pass ? PIGLIT_PASS : PIGLIT_FAIL; } -- 1.7.10.4 _______________________________________________ Piglit mailing list Piglit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/piglit