From eb2021507556633cd6ba64cda26653e3c43e80df Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Tue, 4 Jun 2013 10:35:26 -0700 Subject: [PATCH] intel: Allow blorp CopyTexSubImage to nonzero destination slices. Reviewed-by: Kenneth Graunke Reviewed-by: Paul Berry --- src/mesa/drivers/dri/i965/brw_blorp_blit.cpp | 12 ++++-------- src/mesa/drivers/dri/i965/brw_context.h | 1 + src/mesa/drivers/dri/intel/intel_tex_copy.c | 10 ++++------ 3 files changed, 9 insertions(+), 14 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp index 7b063fff922..8694128d25f 100644 --- a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp +++ b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp @@ -330,6 +330,7 @@ bool brw_blorp_copytexsubimage(struct intel_context *intel, struct gl_renderbuffer *src_rb, struct gl_texture_image *dst_image, + int slice, int srcX0, int srcY0, int dstX0, int dstY0, int width, int height) @@ -354,12 +355,6 @@ brw_blorp_copytexsubimage(struct intel_context *intel, return false; } - /* We can't use blorp to copy to a 1D array texture, since it can only - * write to one layer of the texture at a time. - */ - if (dst_mt->target == GL_TEXTURE_1D_ARRAY) - return false; - /* Source clipping shouldn't be necessary, since copytexsubimage (in * src/mesa/main/teximage.c) calls _mesa_clip_copytexsubimage() which * takes care of it. @@ -388,7 +383,7 @@ brw_blorp_copytexsubimage(struct intel_context *intel, brw_blorp_blit_miptrees(intel, src_mt, src_irb->mt_level, src_irb->mt_layer, - dst_mt, dst_image->Level, dst_image->Face, + dst_mt, dst_image->Level, dst_image->Face + slice, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, false, mirror_y); @@ -411,7 +406,8 @@ brw_blorp_copytexsubimage(struct intel_context *intel, if (src_mt != dst_mt) { brw_blorp_blit_miptrees(intel, src_mt, src_irb->mt_level, src_irb->mt_layer, - dst_mt, dst_image->Level, dst_image->Face, + dst_mt, dst_image->Level, + dst_image->Face + slice, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, false, mirror_y); diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h index 0db1a1802b8..f54a937cc1e 100644 --- a/src/mesa/drivers/dri/i965/brw_context.h +++ b/src/mesa/drivers/dri/i965/brw_context.h @@ -1238,6 +1238,7 @@ bool brw_blorp_copytexsubimage(struct intel_context *intel, struct gl_renderbuffer *src_rb, struct gl_texture_image *dst_image, + int slice, int srcX0, int srcY0, int dstX0, int dstY0, int width, int height); diff --git a/src/mesa/drivers/dri/intel/intel_tex_copy.c b/src/mesa/drivers/dri/intel/intel_tex_copy.c index 9413b144d93..d018cece1cb 100644 --- a/src/mesa/drivers/dri/intel/intel_tex_copy.c +++ b/src/mesa/drivers/dri/intel/intel_tex_copy.c @@ -102,14 +102,12 @@ intelCopyTexSubImage(struct gl_context *ctx, GLuint dims, { struct intel_context *intel = intel_context(ctx); - if (slice == 0) { #ifndef I915 - /* Try BLORP first. It can handle almost everything. */ - if (brw_blorp_copytexsubimage(intel, rb, texImage, x, y, - xoffset, yoffset, width, height)) - return; + /* Try BLORP first. It can handle almost everything. */ + if (brw_blorp_copytexsubimage(intel, rb, texImage, slice, x, y, + xoffset, yoffset, width, height)) + return; #endif - } /* Next, try the BLT engine. */ if (intel_copy_texsubimage(intel, -- 2.30.2