Corrects the way that _mesa_meta_pbo_TexSubImage and _mesa_meta_pbo_GetTexSubImage handle 1D_ARRAY textures. Fixes a failure in the Piglit arb_direct_state_access/gettextureimage-targets test. --- src/mesa/drivers/common/meta_tex_subimage.c | 60 ++++++++++++++++------------- 1 file changed, 34 insertions(+), 26 deletions(-)
diff --git a/src/mesa/drivers/common/meta_tex_subimage.c b/src/mesa/drivers/common/meta_tex_subimage.c index 6196283..1ed39ab 100644 --- a/src/mesa/drivers/common/meta_tex_subimage.c +++ b/src/mesa/drivers/common/meta_tex_subimage.c @@ -140,7 +140,7 @@ _mesa_meta_pbo_TexSubImage(struct gl_context *ctx, GLuint dims, struct gl_texture_image *pbo_tex_image; GLenum status; bool success = false; - int z; + int z, iters; /* XXX: This should probably be passed in from somewhere */ const char *where = "_mesa_meta_pbo_TexSubImage"; @@ -188,12 +188,6 @@ _mesa_meta_pbo_TexSubImage(struct gl_context *ctx, GLuint dims, _mesa_BindFramebuffer(GL_READ_FRAMEBUFFER, fbos[0]); _mesa_BindFramebuffer(GL_DRAW_FRAMEBUFFER, fbos[1]); - if (tex_image->TexObject->Target == GL_TEXTURE_1D_ARRAY) { - assert(depth == 1); - depth = height; - height = 1; - } - _mesa_meta_bind_fbo_image(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, pbo_tex_image, 0); /* If this passes on the first layer it should pass on the others */ @@ -217,7 +211,10 @@ _mesa_meta_pbo_TexSubImage(struct gl_context *ctx, GLuint dims, GL_COLOR_BUFFER_BIT, GL_NEAREST)) goto fail; - for (z = 1; z < depth; z++) { + iters = tex_image->TexObject->Target == GL_TEXTURE_1D_ARRAY ? + height : depth; + + for (z = 1; z < iters; z++) { _mesa_meta_bind_fbo_image(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, pbo_tex_image, z); _mesa_meta_bind_fbo_image(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, @@ -225,11 +222,18 @@ _mesa_meta_pbo_TexSubImage(struct gl_context *ctx, GLuint dims, _mesa_update_state(ctx); - _mesa_meta_BlitFramebuffer(ctx, ctx->ReadBuffer, ctx->DrawBuffer, - 0, 0, width, height, - xoffset, yoffset, - xoffset + width, yoffset + height, - GL_COLOR_BUFFER_BIT, GL_NEAREST); + if (tex_image->TexObject->Target == GL_TEXTURE_1D_ARRAY) + _mesa_meta_BlitFramebuffer(ctx, ctx->ReadBuffer, ctx->DrawBuffer, + 0, z, width, z + 1, + xoffset, yoffset, + xoffset + width, yoffset + 1, + GL_COLOR_BUFFER_BIT, GL_NEAREST); + else + _mesa_meta_BlitFramebuffer(ctx, ctx->ReadBuffer, ctx->DrawBuffer, + 0, 0, width, height, + xoffset, yoffset, + xoffset + width, yoffset + height, + GL_COLOR_BUFFER_BIT, GL_NEAREST); } success = true; @@ -256,7 +260,7 @@ _mesa_meta_pbo_GetTexSubImage(struct gl_context *ctx, GLuint dims, struct gl_texture_image *pbo_tex_image; GLenum status; bool success = false; - int z; + int z, iters; /* XXX: This should probably be passed in from somewhere */ const char *where = "_mesa_meta_pbo_GetTexSubImage"; @@ -298,12 +302,6 @@ _mesa_meta_pbo_GetTexSubImage(struct gl_context *ctx, GLuint dims, _mesa_GenFramebuffers(2, fbos); - if (tex_image && tex_image->TexObject->Target == GL_TEXTURE_1D_ARRAY) { - assert(depth == 1); - depth = height; - height = 1; - } - /* If we were given a texture, bind it to the read framebuffer. If not, * we're doing a ReadPixels and we should just use whatever framebuffer * the client has bound. @@ -337,7 +335,10 @@ _mesa_meta_pbo_GetTexSubImage(struct gl_context *ctx, GLuint dims, GL_COLOR_BUFFER_BIT, GL_NEAREST)) goto fail; - for (z = 1; z < depth; z++) { + iters = tex_image->TexObject->Target == GL_TEXTURE_1D_ARRAY ? + height : depth; + + for (z = 1; z < iters; z++) { _mesa_meta_bind_fbo_image(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex_image, zoffset + z); _mesa_meta_bind_fbo_image(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, @@ -345,11 +346,18 @@ _mesa_meta_pbo_GetTexSubImage(struct gl_context *ctx, GLuint dims, _mesa_update_state(ctx); - _mesa_meta_BlitFramebuffer(ctx, ctx->ReadBuffer, ctx->DrawBuffer, - xoffset, yoffset, - xoffset + width, yoffset + height, - 0, 0, width, height, - GL_COLOR_BUFFER_BIT, GL_NEAREST); + if (tex_image->TexObject->Target == GL_TEXTURE_1D_ARRAY) + _mesa_meta_BlitFramebuffer(ctx, ctx->ReadBuffer, ctx->DrawBuffer, + xoffset, yoffset, + xoffset + width, yoffset + 1, + 0, z, width, z + 1, + GL_COLOR_BUFFER_BIT, GL_NEAREST); + else + _mesa_meta_BlitFramebuffer(ctx, ctx->ReadBuffer, ctx->DrawBuffer, + xoffset, yoffset, + xoffset + width, yoffset + height, + 0, 0, width, height, + GL_COLOR_BUFFER_BIT, GL_NEAREST); } success = true; -- 2.1.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev