/** * Need to map texture image into memory before copying image data, * then unmap it. */ static void intel_get_tex_image(GLcontext * ctx, GLenum target, GLint level, GLenum format, GLenum type, GLvoid * pixels, struct gl_texture_object *texObj, struct gl_texture_image *texImage, int compressed) { struct intel_context *intel = intel_context(ctx); struct intel_texture_image *intelImage = intel_texture_image(texImage); /* Map */ if (intelImage->mt) { /* Image is stored in hardware format in a buffer managed by the * kernel. Need to explicitly map and unmap it. */ intelImage->base.Data = intel_miptree_image_map(intel, intelImage->mt, intelImage->face, intelImage->level, &intelImage->base.RowStride, intelImage->base.ImageOffsets); intelImage->base.RowStride /= intelImage->mt->cpp; } else { /* Otherwise, the image should actually be stored in * intelImage->base.Data. This is pretty confusing for * everybody, I'd much prefer to separate the two functions of * texImage->Data - storage for texture images in main memory * and access (ie mappings) of images. In other words, we'd * create a new texImage->Map field and leave Data simply for * storage. */ assert(intelImage->base.Data); } if (compressed) { _mesa_get_compressed_teximage(ctx, target, level, pixels, texObj, texImage); } else { _mesa_get_teximage(ctx, target, level, format, type, pixels, texObj, texImage); } /* Unmap */ if (intelImage->mt) { intel_miptree_image_unmap(intel, intelImage->mt); intelImage->base.Data = NULL; } }
/** * Called via ctx->Driver.GetTexImage() */ static void st_GetTexImage(struct gl_context * ctx, GLenum format, GLenum type, GLvoid * pixels, struct gl_texture_image *texImage) { struct st_texture_image *stImage = st_texture_image(texImage); if (stImage->pt && util_format_is_s3tc(stImage->pt->format)) { /* Need to decompress the texture. * We'll do this by rendering a textured quad (which is hopefully * faster than using the fallback code in texcompress.c). * Note that we only expect RGBA formats (no Z/depth formats). */ decompress_with_blit(ctx, format, type, pixels, texImage); } else { _mesa_get_teximage(ctx, format, type, pixels, texImage); } }