---
 tests/shaders/shader_runner.c | 100 ++++++++++++++++++++++++++----------------
 1 file changed, 62 insertions(+), 38 deletions(-)

diff --git a/tests/shaders/shader_runner.c b/tests/shaders/shader_runner.c
index 2cde9b3..c315676 100644
--- a/tests/shaders/shader_runner.c
+++ b/tests/shaders/shader_runner.c
@@ -140,8 +140,9 @@ static bool prog_in_use = false;
 static bool sso_in_use = false;
 static GLchar *prog_err_info = NULL;
 static GLuint vao = 0;
-static GLuint draw_fbo = 0;
+static GLuint draw_fbo, read_fbo;
 static GLint render_width, render_height;
+static GLint read_width, read_height;
 
 static bool report_subtests = false;
 
@@ -2960,18 +2961,22 @@ piglit_display(void)
                } else if (sscanf(line, "depthfunc %31s", s) == 1) {
                        glDepthFunc(piglit_get_gl_enum_from_name(s));
                } else if (parse_str(line, "fb ", &rest)) {
+                       const GLenum target =
+                               parse_str(rest, "draw ", &rest) ? 
GL_DRAW_FRAMEBUFFER :
+                               parse_str(rest, "read ", &rest) ? 
GL_READ_FRAMEBUFFER :
+                               GL_FRAMEBUFFER;
                        GLuint fbo = 0;
 
                        if (parse_str(rest, "tex 2d ", &rest)) {
                                glGenFramebuffers(1, &fbo);
-                               glBindFramebuffer(GL_FRAMEBUFFER, fbo);
+                               glBindFramebuffer(target, fbo);
 
                                REQUIRE(parse_int(rest, &tex, &rest),
                                        "Framebuffer binding command not "
                                        "understood at: %s\n", rest);
 
                                glFramebufferTexture2D(
-                                       GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
+                                       target, GL_COLOR_ATTACHMENT0,
                                        GL_TEXTURE_2D,
                                        get_texture_binding(tex)->obj, 0);
                                if (!piglit_check_gl_error(GL_NO_ERROR)) {
@@ -2985,10 +2990,10 @@ piglit_display(void)
 
                        } else if (sscanf(rest, "tex layered %d", &tex) == 1) {
                                glGenFramebuffers(1, &fbo);
-                               glBindFramebuffer(GL_FRAMEBUFFER, fbo);
+                               glBindFramebuffer(target, fbo);
 
                                glFramebufferTexture(
-                                       GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
+                                       target, GL_COLOR_ATTACHMENT0,
                                        get_texture_binding(tex)->obj, 0);
                                if (!piglit_check_gl_error(GL_NO_ERROR)) {
                                        fprintf(stderr,
@@ -3005,23 +3010,42 @@ piglit_display(void)
                                piglit_report_result(PIGLIT_FAIL);
                        }
 
-                       const GLenum status = 
glCheckFramebufferStatus(GL_FRAMEBUFFER);
+                       const GLenum status = glCheckFramebufferStatus(target);
                        if (status != GL_FRAMEBUFFER_COMPLETE) {
                                fprintf(stderr, "incomplete fbo (status 
0x%x)\n",
                                        status);
                                piglit_report_result(PIGLIT_FAIL);
                        }
 
-                       render_width = w;
-                       render_height = h;
+                       if (target != GL_READ_FRAMEBUFFER) {
+                               render_width = w;
+                               render_height = h;
 
-                       /* Delete the previous draw FB in case
-                        * it's no longer reachable.
-                        */
-                       if (draw_fbo != 0)
-                               glDeleteFramebuffers(1, &draw_fbo);
+                               /* Delete the previous draw FB in case
+                                * it's no longer reachable.
+                                */
+                               if (draw_fbo != 0 &&
+                                   draw_fbo != (target == GL_DRAW_FRAMEBUFFER ?
+                                                read_fbo : 0))
+                                       glDeleteFramebuffers(1, &draw_fbo);
+
+                               draw_fbo = fbo;
+                       }
 
-                       draw_fbo = fbo;
+                       if (target != GL_DRAW_FRAMEBUFFER) {
+                               read_width = w;
+                               read_height = h;
+
+                               /* Delete the previous read FB in case
+                                * it's no longer reachable.
+                                */
+                               if (read_fbo != 0 &&
+                                   read_fbo != (target == GL_READ_FRAMEBUFFER ?
+                                                draw_fbo : 0))
+                                       glDeleteFramebuffers(1, &read_fbo);
+
+                               read_fbo = fbo;
+                       }
 
                } else if (parse_str(line, "frustum", &rest)) {
                        parse_floats(rest, c, 6, NULL);
@@ -3075,12 +3099,12 @@ piglit_display(void)
                                  "( %f , %f , %f , %f )",
                                  c + 0, c + 1,
                                  c + 2, c + 3, c + 4, c + 5) == 6) {
-                       x = c[0] * render_width;
-                       y = c[1] * render_height;
-                       if (x >= render_width)
-                               x = render_width - 1;
-                       if (y >= render_height)
-                               y = render_height - 1;
+                       x = c[0] * read_width;
+                       y = c[1] * read_height;
+                       if (x >= read_width)
+                               x = read_width - 1;
+                       if (y >= read_height)
+                               y = read_height - 1;
 
                        if (!piglit_probe_pixel_rgba(x, y, &c[2])) {
                                result = PIGLIT_FAIL;
@@ -3096,12 +3120,12 @@ piglit_display(void)
                                  "( %f , %f , %f )",
                                  c + 0, c + 1,
                                  c + 2, c + 3, c + 4) == 5) {
-                       x = c[0] * render_width;
-                       y = c[1] * render_height;
-                       if (x >= render_width)
-                               x = render_width - 1;
-                       if (y >= render_height)
-                               y = render_height - 1;
+                       x = c[0] * read_width;
+                       y = c[1] * read_height;
+                       if (x >= read_width)
+                               x = read_width - 1;
+                       if (y >= read_height)
+                               y = read_height - 1;
 
                        if (!piglit_probe_pixel_rgb(x, y, &c[2])) {
                                result = PIGLIT_FAIL;
@@ -3119,10 +3143,10 @@ piglit_display(void)
                                  "( %f , %f , %f )",
                                  c + 0, c + 1, c + 2, c + 3,
                                  c + 4, c + 5, c + 6) == 7) {
-                       x = c[0] * render_width;
-                       y = c[1] * render_height;
-                       w = c[2] * render_width;
-                       h = c[3] * render_height;
+                       x = c[0] * read_width;
+                       y = c[1] * read_height;
+                       w = c[2] * read_width;
+                       h = c[3] * read_height;
 
                        if (!piglit_probe_rect_rgb(x, y, w, h, &c[4])) {
                                result = PIGLIT_FAIL;
@@ -3130,20 +3154,20 @@ piglit_display(void)
                } else if (parse_str(line, "probe all rgba ", &rest)) {
                        parse_floats(rest, c, 4, NULL);
                        if (result != PIGLIT_FAIL &&
-                           !piglit_probe_rect_rgba(0, 0, render_width,
-                                                   render_height, c))
+                           !piglit_probe_rect_rgba(0, 0, read_width,
+                                                   read_height, c))
                                result = PIGLIT_FAIL;
                } else if (parse_str(line, "probe warn all rgba ", &rest)) {
                        parse_floats(rest, c, 4, NULL);
                        if (result == PIGLIT_PASS &&
-                           !piglit_probe_rect_rgba(0, 0, render_width,
-                                                   render_height, c))
+                           !piglit_probe_rect_rgba(0, 0, read_width,
+                                                   read_height, c))
                                result = PIGLIT_WARN;
                } else if (parse_str(line, "probe all rgb", &rest)) {
                        parse_floats(rest, c, 3, NULL);
                        if (result != PIGLIT_FAIL &&
-                           !piglit_probe_rect_rgb(0, 0, render_width,
-                                                  render_height, c))
+                           !piglit_probe_rect_rgb(0, 0, read_width,
+                                                  read_height, c))
                                result = PIGLIT_FAIL;
                } else if (parse_str(line, "tolerance", &rest)) {
                        parse_floats(rest, piglit_tolerance, 4, NULL);
@@ -3585,8 +3609,8 @@ piglit_init(int argc, char **argv)
        else
                gl_max_vertex_attribs = 16;
 
-       render_width = piglit_width;
-       render_height = piglit_height;
+       read_width = render_width = piglit_width;
+       read_height = render_height = piglit_height;
 
        /* Automatic mode can run multiple tests per session. */
        if (report_subtests) {
-- 
2.9.0

_______________________________________________
Piglit mailing list
Piglit@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/piglit

Reply via email to