diff options
author | Laura Ekstrand <[email protected]> | 2015-02-18 17:17:38 -0800 |
---|---|---|
committer | Emil Velikov <[email protected]> | 2015-02-27 23:03:30 +0000 |
commit | dfbaa8a8436be43a7889366ee87daa7b173eedd6 (patch) | |
tree | d6e4a977f58f7458af76c013bc01e00ebb5cb79e | |
parent | 9e8446beb1519464646aa906134fd4b2d3c0e99f (diff) |
common: Fix PBOs for 1D_ARRAY.
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.
Reviewed-by: Jason Ekstrand <[email protected]>
Tested-by: Laura Ekstrand <[email protected]>
Cc: "10.4, 10.5" <[email protected]>
(cherry picked from commit 546aba143d13ba3f993ead4cc30b2404abfc0202)
-rw-r--r-- | src/mesa/drivers/common/meta_tex_subimage.c | 62 |
1 files changed, 36 insertions, 26 deletions
diff --git a/src/mesa/drivers/common/meta_tex_subimage.c b/src/mesa/drivers/common/meta_tex_subimage.c index b659426243d..ffbbacd8fd8 100644 --- a/src/mesa/drivers/common/meta_tex_subimage.c +++ b/src/mesa/drivers/common/meta_tex_subimage.c @@ -137,7 +137,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"; @@ -190,12 +190,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 */ @@ -219,7 +213,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, @@ -227,11 +224,18 @@ _mesa_meta_pbo_TexSubImage(struct gl_context *ctx, GLuint dims, _mesa_update_state(ctx); - _mesa_meta_BlitFramebuffer(ctx, ctx->ReadBuffer, ctx->DrawBuffer, - 0, z * height, width, (z + 1) * 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, z * height, width, (z + 1) * height, + xoffset, yoffset, + xoffset + width, yoffset + height, + GL_COLOR_BUFFER_BIT, GL_NEAREST); } success = true; @@ -258,7 +262,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"; @@ -305,12 +309,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. @@ -344,7 +342,12 @@ _mesa_meta_pbo_GetTexSubImage(struct gl_context *ctx, GLuint dims, GL_COLOR_BUFFER_BIT, GL_NEAREST)) goto fail; - for (z = 1; z < depth; z++) { + if (tex_image && tex_image->TexObject->Target == GL_TEXTURE_1D_ARRAY) + iters = height; + else + iters = 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, @@ -352,11 +355,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, z * height, width, (z + 1) * 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, z * height, width, (z + 1) * height, + GL_COLOR_BUFFER_BIT, GL_NEAREST); } success = true; |