"fb tex slice <texture target> <texture index> <level> <layer>" can be
used to bind an arbitrary layer of the specified texture as color
attachment of the current framebuffer object.
---
 tests/shaders/shader_runner.c | 67 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 67 insertions(+)

diff --git a/tests/shaders/shader_runner.c b/tests/shaders/shader_runner.c
index 7151fd2..7123c1a 100644
--- a/tests/shaders/shader_runner.c
+++ b/tests/shaders/shader_runner.c
@@ -2997,6 +2997,73 @@ piglit_display(void)
                                w = get_texture_binding(tex)->width;
                                h = get_texture_binding(tex)->height;
 
+                       } else if (parse_str(rest, "tex slice ", &rest)) {
+                               GLenum tex_target;
+
+                               REQUIRE(parse_tex_target(rest, &tex_target, 
&rest) &&
+                                       parse_int(rest, &tex, &rest) &&
+                                       parse_int(rest, &l, &rest) &&
+                                       parse_int(rest, &z, &rest),
+                                       "Framebuffer binding command not "
+                                       "understood at: %s\n", rest);
+
+                               const GLuint tex_obj = 
get_texture_binding(tex)->obj;
+
+                               glGenFramebuffers(1, &fbo);
+                               glBindFramebuffer(target, fbo);
+
+                               if (tex_target == GL_TEXTURE_1D) {
+                                       REQUIRE(z == 0,
+                                               "Invalid layer index provided "
+                                               "in command: %s\n", line);
+                                       glFramebufferTexture1D(
+                                               target, GL_COLOR_ATTACHMENT0,
+                                               tex_target, tex_obj, l);
+
+                               } else if (tex_target == GL_TEXTURE_2D ||
+                                          tex_target == GL_TEXTURE_RECTANGLE ||
+                                          tex_target == 
GL_TEXTURE_2D_MULTISAMPLE) {
+                                       REQUIRE(z == 0,
+                                               "Invalid layer index provided "
+                                               "in command: %s\n", line);
+                                       glFramebufferTexture2D(
+                                               target, GL_COLOR_ATTACHMENT0,
+                                               tex_target, tex_obj, l);
+
+                               } else if (tex_target == GL_TEXTURE_CUBE_MAP) {
+                                       static const GLenum cubemap_targets[] = 
{
+                                               GL_TEXTURE_CUBE_MAP_POSITIVE_X,
+                                               GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
+                                               GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
+                                               GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
+                                               GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
+                                               GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
+                                       };
+                                       REQUIRE(z < ARRAY_SIZE(cubemap_targets),
+                                               "Invalid layer index provided "
+                                               "in command: %s\n", line);
+                                       tex_target = cubemap_targets[z];
+
+                                       glFramebufferTexture2D(
+                                               target, GL_COLOR_ATTACHMENT0,
+                                               tex_target, tex_obj, l);
+
+                               } else {
+                                       glFramebufferTextureLayer(
+                                               target, GL_COLOR_ATTACHMENT0,
+                                               tex_obj, l, z);
+                               }
+
+                               if (!piglit_check_gl_error(GL_NO_ERROR)) {
+                                       fprintf(stderr, "Error binding texture "
+                                               "attachment for command: %s\n",
+                                               line);
+                                       piglit_report_result(PIGLIT_FAIL);
+                               }
+
+                               w = MAX2(1, get_texture_binding(tex)->width >> 
l);
+                               h = MAX2(1, get_texture_binding(tex)->height >> 
l);
+
                        } else if (sscanf(rest, "tex layered %d", &tex) == 1) {
                                glGenFramebuffers(1, &fbo);
                                glBindFramebuffer(target, fbo);
-- 
2.9.0

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

Reply via email to