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

Reply via email to