Solves bugs related to the driver not setting up the texture miptree correctly, leading to faulty PBO uploads and downloads. --- src/mesa/drivers/common/meta_tex_subimage.c | 13 +++++++++---- src/mesa/drivers/dri/i965/intel_tex.c | 3 ++- src/mesa/main/dd.h | 1 + 3 files changed, 12 insertions(+), 5 deletions(-)
diff --git a/src/mesa/drivers/common/meta_tex_subimage.c b/src/mesa/drivers/common/meta_tex_subimage.c index 68c8273..f4f7716 100644 --- a/src/mesa/drivers/common/meta_tex_subimage.c +++ b/src/mesa/drivers/common/meta_tex_subimage.c @@ -51,7 +51,7 @@ create_texture_for_pbo(struct gl_context *ctx, bool create_pbo, { uint32_t pbo_format; GLenum internal_format; - unsigned row_stride; + unsigned row_stride, image_stride; struct gl_buffer_object *buffer_obj; struct gl_texture_object *tex_obj; struct gl_texture_image *tex_image; @@ -74,6 +74,8 @@ create_texture_for_pbo(struct gl_context *ctx, bool create_pbo, pixels = _mesa_image_address3d(packing, pixels, width, height, format, type, 0, 0, 0); row_stride = _mesa_image_row_stride(packing, width, format, type); + image_stride = _mesa_image_image_stride(packing, width, height, format, + type); if (_mesa_is_bufferobj(packing->BufferObj)) { *tmp_pbo = 0; @@ -89,7 +91,7 @@ create_texture_for_pbo(struct gl_context *ctx, bool create_pbo, */ _mesa_BindBuffer(pbo_target, *tmp_pbo); - _mesa_BufferData(pbo_target, row_stride * height, pixels, GL_STREAM_DRAW); + _mesa_BufferData(pbo_target, image_stride * depth, pixels, GL_STREAM_DRAW); buffer_obj = ctx->Unpack.BufferObj; pixels = NULL; @@ -99,9 +101,11 @@ create_texture_for_pbo(struct gl_context *ctx, bool create_pbo, _mesa_GenTextures(1, tmp_tex); tex_obj = _mesa_lookup_texture(ctx, *tmp_tex); - tex_obj->Target = depth > 1 ? GL_TEXTURE_2D_ARRAY : GL_TEXTURE_2D; - tex_obj->Immutable = GL_TRUE; _mesa_initialize_texture_object(ctx, tex_obj, *tmp_tex, GL_TEXTURE_2D); + /* This must be set after _mesa_initialize_texture_object, not before. */ + tex_obj->Immutable = GL_TRUE; + /* This is required for interactions with ARB_texture_view. */ + tex_obj->NumLayers = 1; internal_format = _mesa_get_format_base_format(pbo_format); @@ -114,6 +118,7 @@ create_texture_for_pbo(struct gl_context *ctx, bool create_pbo, buffer_obj, (intptr_t)pixels, row_stride, + image_stride, read_only)) { _mesa_DeleteTextures(1, tmp_tex); _mesa_DeleteBuffers(1, tmp_pbo); diff --git a/src/mesa/drivers/dri/i965/intel_tex.c b/src/mesa/drivers/dri/i965/intel_tex.c index 2d3009a..3a0c09a 100644 --- a/src/mesa/drivers/dri/i965/intel_tex.c +++ b/src/mesa/drivers/dri/i965/intel_tex.c @@ -305,6 +305,7 @@ intel_set_texture_storage_for_buffer_object(struct gl_context *ctx, struct gl_buffer_object *buffer_obj, uint32_t buffer_offset, uint32_t row_stride, + uint32_t image_stride, bool read_only) { struct brw_context *brw = brw_context(ctx); @@ -334,7 +335,7 @@ intel_set_texture_storage_for_buffer_object(struct gl_context *ctx, drm_intel_bo *bo = intel_bufferobj_buffer(brw, intel_buffer_obj, buffer_offset, - row_stride * image->Height); + image_stride * image->Depth); intel_texobj->mt = intel_miptree_create_for_bo(brw, bo, image->TexFormat, diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h index ec8662b..9de08e2 100644 --- a/src/mesa/main/dd.h +++ b/src/mesa/main/dd.h @@ -429,6 +429,7 @@ struct dd_function_table { struct gl_buffer_object *bufferObj, uint32_t buffer_offset, uint32_t row_stride, + uint32_t image_stride, bool read_only); /** -- 2.1.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev