diff --git a/src/mesa/drivers/dri/i915/intel_mipmap_tree.c b/src/mesa/drivers/dri/i915/intel_mipmap_tree.c index 6635b88f44b..7f4f00cf8e3 100644 --- a/src/mesa/drivers/dri/i915/intel_mipmap_tree.c +++ b/src/mesa/drivers/dri/i915/intel_mipmap_tree.c @@ -201,7 +201,12 @@ void intel_miptree_set_image_offset(struct intel_mipmap_tree *mt, - +/** + * Map a teximage in a mipmap tree. + * \param row_stride returns row stride in bytes + * \param image_stride returns image stride in bytes (for 3D textures). + * \return address of mapping + */ GLubyte *intel_miptree_image_map(struct intel_context *intel, struct intel_mipmap_tree *mt, GLuint face, diff --git a/src/mesa/drivers/dri/i915/intel_tex.c b/src/mesa/drivers/dri/i915/intel_tex.c index 136286f0603..a945609023c 100644 --- a/src/mesa/drivers/dri/i915/intel_tex.c +++ b/src/mesa/drivers/dri/i915/intel_tex.c @@ -148,6 +148,7 @@ void intelInitTextureFuncs(struct dd_function_table * functions) functions->CopyTexImage2D = intelCopyTexImage2D; functions->CopyTexSubImage1D = intelCopyTexSubImage1D; functions->CopyTexSubImage2D = intelCopyTexSubImage2D; + functions->GetTexImage = intelGetTexImage; functions->NewTextureObject = intelNewTextureObject; functions->NewTextureImage = intelNewTextureImage; functions->DeleteTexture = _mesa_delete_texture_object; diff --git a/src/mesa/drivers/dri/i915/intel_tex.h b/src/mesa/drivers/dri/i915/intel_tex.h index bb000bd9e93..7f4068c01a9 100644 --- a/src/mesa/drivers/dri/i915/intel_tex.h +++ b/src/mesa/drivers/dri/i915/intel_tex.h @@ -119,6 +119,11 @@ void intelCopyTexSubImage2D( GLcontext *ctx, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height ); +void intelGetTexImage( GLcontext *ctx, GLenum target, GLint level, + GLenum format, GLenum type, GLvoid *pixels, + struct gl_texture_object *texObj, + struct gl_texture_image *texImage ); + GLuint intel_finalize_mipmap_tree( struct intel_context *intel, GLuint unit ); void intel_tex_map_images( struct intel_context *intel, diff --git a/src/mesa/drivers/dri/i915/intel_tex_image.c b/src/mesa/drivers/dri/i915/intel_tex_image.c index d38f20606bb..3a437adbf00 100644 --- a/src/mesa/drivers/dri/i915/intel_tex_image.c +++ b/src/mesa/drivers/dri/i915/intel_tex_image.c @@ -396,5 +396,45 @@ void intelTexImage1D(GLcontext *ctx, +/** + * Need to map texture image into memory before copying image data, + * then unmap it. + */ +void intelGetTexImage( GLcontext *ctx, GLenum target, GLint level, + GLenum format, GLenum type, GLvoid *pixels, + struct gl_texture_object *texObj, + struct gl_texture_image *texImage ) +{ + struct intel_context *intel = intel_context( ctx ); + struct intel_texture_image *intelImage = intel_texture_image(texImage); + /* Map */ +#ifdef ALL_IMAGES /* XXX Remove this, just for debug/test */ + intel_tex_map_images(intel, intel_texture_object(texObj)); +#else + /* XXX what if intelImage->mt is NULL? */ + if (intelImage->mt) { + intelImage->base.Data = + intel_miptree_image_map(intel, + intelImage->mt, + intelImage->face, + intelImage->level, + &intelImage->base.RowStride, + &intelImage->base.ImageStride); + } +#endif + + _mesa_get_teximage(ctx, target, level, format, type, pixels, + texObj, texImage); + + /* Unmap */ +#ifdef ALL_IMAGES + intel_tex_unmap_images(intel, intel_texture_object(texObj)); +#else + if (intelImage->mt) { + intel_miptree_image_unmap(intel, intelImage->mt); + intelImage->base.Data = NULL; + } +#endif +} diff --git a/src/mesa/drivers/dri/i915/intel_tex_validate.c b/src/mesa/drivers/dri/i915/intel_tex_validate.c index b9cb9f1f3a6..3bfc659409a 100644 --- a/src/mesa/drivers/dri/i915/intel_tex_validate.c +++ b/src/mesa/drivers/dri/i915/intel_tex_validate.c @@ -209,11 +209,6 @@ void intel_tex_map_images( struct intel_context *intel, struct intel_texture_image *intelImage = intel_texture_image(intelObj->base.Image[face][i]); - /* XXX: Fallbacks will fail for 3d textures because core mesa - * doesn't have a place to put ImageStride -- assumes each - * teximage's depth slices are packed contiguously. This - * isn't true for i915. - */ if (intelImage->mt) { intelImage->base.Data = intel_miptree_image_map(intel, @@ -221,7 +216,10 @@ void intel_tex_map_images( struct intel_context *intel, intelImage->face, intelImage->level, &intelImage->base.RowStride, - NULL); + &intelImage->base.ImageStride); + /* convert stride to texels, not bytes */ + intelImage->base.RowStride /= intelImage->mt->cpp; + intelImage->base.ImageStride /= intelImage->mt->cpp; } } }