summaryrefslogtreecommitdiffstats
path: root/src/mesa/main
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2013-06-03 15:12:49 -0700
committerEric Anholt <[email protected]>2013-06-17 15:26:20 -0700
commitb65b1c3148ad7ebaaca422bc572dead0864dcd6a (patch)
tree8812998b539c593f38d2f71b1a296a5882132832 /src/mesa/main
parent9e8400f4c95bde1f955c7977066583b507159a10 (diff)
mesa: Hide weirdness of 1D_ARRAY textures from Driver.CopyTexSubImage().
Intel had brokenness here, and I'd like to continue moving Mesa toward hiding 1D_ARRAY's ridiculousness inside of the core, like we did with MapTextureImage. Fixes copyteximage 1D_ARRAY on intel. There's still an impedance mismatch in meta when falling back to read and texsubimage, since texsubimage expects coordinates into 1D_ARRAY as (width, slice, 0) instead of (width, 0, slice). v2: Fix offset of scanline reads from the source. (Thanks Brian!), replace dd.h comment with Paul's text and replace early exit with an assert. Reviewed-by: Brian Paul <[email protected]> (v1) Reviewed-by: Kenneth Graunke <[email protected]> (v1) Reviewed-by: Paul Berry <[email protected]> (v1)
Diffstat (limited to 'src/mesa/main')
-rw-r--r--src/mesa/main/dd.h8
-rw-r--r--src/mesa/main/teximage.c40
2 files changed, 42 insertions, 6 deletions
diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h
index 6d564b25274..e2519780ab2 100644
--- a/src/mesa/main/dd.h
+++ b/src/mesa/main/dd.h
@@ -248,10 +248,16 @@ struct dd_function_table {
/**
* Called by glCopyTex[Sub]Image[123]D().
+ *
+ * This function should copy a rectangular region in the rb to a single
+ * destination slice, specified by @slice. In the case of 1D array
+ * textures (where one GL call can potentially affect multiple destination
+ * slices), core mesa takes care of calling this function multiple times,
+ * once for each scanline to be copied.
*/
void (*CopyTexSubImage)(struct gl_context *ctx, GLuint dims,
struct gl_texture_image *texImage,
- GLint xoffset, GLint yoffset, GLint zoffset,
+ GLint xoffset, GLint yoffset, GLint slice,
struct gl_renderbuffer *rb,
GLint x, GLint y,
GLsizei width, GLsizei height);
diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c
index 6f7fbc0d2a1..5226687ff92 100644
--- a/src/mesa/main/teximage.c
+++ b/src/mesa/main/teximage.c
@@ -3429,6 +3429,35 @@ get_copy_tex_image_source(struct gl_context *ctx, gl_format texFormat)
}
}
+static void
+copytexsubimage_by_slice(struct gl_context *ctx,
+ struct gl_texture_image *texImage,
+ GLuint dims,
+ GLint xoffset, GLint yoffset, GLint zoffset,
+ struct gl_renderbuffer *rb,
+ GLint x, GLint y,
+ GLsizei width, GLsizei height)
+{
+ if (texImage->TexObject->Target == GL_TEXTURE_1D_ARRAY) {
+ int slice;
+
+ /* For 1D arrays, we copy each scanline of the source rectangle into the
+ * next array slice.
+ */
+ assert(zoffset == 0);
+
+ for (slice = 0; slice < height; slice++) {
+ assert(yoffset + slice < texImage->Height);
+ ctx->Driver.CopyTexSubImage(ctx, 2, texImage,
+ xoffset, 0, yoffset + slice,
+ rb, x, y + slice, width, 1);
+ }
+ } else {
+ ctx->Driver.CopyTexSubImage(ctx, dims, texImage,
+ xoffset, yoffset, zoffset,
+ rb, x, y, width, height);
+ }
+}
/**
@@ -3517,8 +3546,9 @@ copyteximage(struct gl_context *ctx, GLuint dims,
struct gl_renderbuffer *srcRb =
get_copy_tex_image_source(ctx, texImage->TexFormat);
- ctx->Driver.CopyTexSubImage(ctx, dims, texImage, dstX, dstY, dstZ,
- srcRb, srcX, srcY, width, height);
+ copytexsubimage_by_slice(ctx, texImage, dims,
+ dstX, dstY, dstZ,
+ srcRb, srcX, srcY, width, height);
}
check_gen_mipmap(ctx, target, texObj, level);
@@ -3610,9 +3640,9 @@ copytexsubimage(struct gl_context *ctx, GLuint dims, GLenum target, GLint level,
struct gl_renderbuffer *srcRb =
get_copy_tex_image_source(ctx, texImage->TexFormat);
- ctx->Driver.CopyTexSubImage(ctx, dims, texImage,
- xoffset, yoffset, zoffset,
- srcRb, x, y, width, height);
+ copytexsubimage_by_slice(ctx, texImage, dims,
+ xoffset, yoffset, zoffset,
+ srcRb, x, y, width, height);
check_gen_mipmap(ctx, target, texObj, level);