mesa: Convert GetCompressedTexImage to using MapTextureImage().

This changes drivers to not map the texture on their own before
calling _mesa_get_compressed_teximage().

Tested-by: Brian Paul <brianp@vmware.com>
This commit is contained in:
Brian Paul 2011-07-29 17:14:34 -07:00 committed by Eric Anholt
parent 9f61e43b49
commit 8df7ca7112
6 changed files with 37 additions and 129 deletions

View file

@ -510,16 +510,11 @@ intelTexImage1D(struct gl_context * ctx,
format, type, pixels, unpack, texObj, texImage, 0);
}
/**
* Need to map texture image into memory before copying image data,
* then unmap it.
*/
static void
intel_get_tex_image(struct gl_context * ctx, GLenum target, GLint level,
GLenum format, GLenum type, GLvoid * pixels,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage, GLboolean compressed)
intelGetTexImage(struct gl_context * 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);
@ -565,15 +560,8 @@ intel_get_tex_image(struct gl_context * ctx, GLenum target, GLint level,
intel_tex_image_s8z24_gather(intel, intelImage);
}
if (compressed) {
_mesa_get_compressed_teximage(ctx, target, level, pixels,
texObj, texImage);
}
else {
_mesa_get_teximage(ctx, target, level, format, type, pixels,
texObj, texImage);
}
_mesa_get_teximage(ctx, target, level, format, type, pixels,
texObj, texImage);
/* Unmap */
if (intelImage->mt) {
@ -582,28 +570,6 @@ intel_get_tex_image(struct gl_context * ctx, GLenum target, GLint level,
}
}
static void
intelGetTexImage(struct gl_context * ctx, GLenum target, GLint level,
GLenum format, GLenum type, GLvoid * pixels,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage)
{
intel_get_tex_image(ctx, target, level, format, type, pixels,
texObj, texImage, GL_FALSE);
}
static void
intelGetCompressedTexImage(struct gl_context *ctx, GLenum target, GLint level,
GLvoid *pixels,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage)
{
intel_get_tex_image(ctx, target, level, 0, 0, pixels,
texObj, texImage, GL_TRUE);
}
/**
* Binds a region to a texture image, like it was uploaded by glTexImage2D().
*
@ -722,8 +688,6 @@ intelInitTextureImageFuncs(struct dd_function_table *functions)
functions->TexImage3D = intelTexImage3D;
functions->GetTexImage = intelGetTexImage;
functions->GetCompressedTexImage = intelGetCompressedTexImage;
#if FEATURE_OES_EGL_image
functions->EGLImageTargetTexture2D = intel_image_target_texture_2d;
#endif

View file

@ -39,17 +39,17 @@
* Need to map texture image into memory before copying image data,
* then unmap it.
*/
static void
radeon_get_tex_image(struct gl_context * ctx, GLenum target, GLint level,
GLenum format, GLenum type, GLvoid * pixels,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage, int compressed)
void
radeonGetTexImage(struct gl_context * ctx, GLenum target, GLint level,
GLenum format, GLenum type, GLvoid * pixels,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage)
{
radeon_texture_image *image = get_radeon_texture_image(texImage);
radeon_print(RADEON_TEXTURE, RADEON_NORMAL,
"%s(%p, tex %p, image %p) compressed %d.\n",
__func__, ctx, texObj, image, compressed);
"%s(%p, tex %p, image %p).\n",
__func__, ctx, texObj, image);
if (image->mt) {
radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
@ -67,37 +67,10 @@ radeon_get_tex_image(struct gl_context * ctx, GLenum target, GLint level,
assert(image->base.Base.Data);
}
if (compressed) {
/* FIXME: this can't work for small textures (mips) which
use different hw stride */
_mesa_get_compressed_teximage(ctx, target, level, pixels,
texObj, texImage);
} else {
_mesa_get_teximage(ctx, target, level, format, type, pixels,
texObj, texImage);
}
_mesa_get_teximage(ctx, target, level, format, type, pixels,
texObj, texImage);
if (image->mt) {
radeon_teximage_unmap(image);
}
}
void
radeonGetTexImage(struct gl_context * ctx, GLenum target, GLint level,
GLenum format, GLenum type, GLvoid * pixels,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage)
{
radeon_get_tex_image(ctx, target, level, format, type, pixels,
texObj, texImage, 0);
}
void
radeonGetCompressedTexImage(struct gl_context *ctx, GLenum target, GLint level,
GLvoid *pixels,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage)
{
radeon_get_tex_image(ctx, target, level, 0, 0, pixels,
texObj, texImage, 1);
}

View file

@ -1191,7 +1191,6 @@ radeon_init_common_texture_funcs(radeonContextPtr radeon,
functions->TexSubImage3D = radeonTexSubImage3D;
functions->CompressedTexImage2D = radeonCompressedTexImage2D;
functions->CompressedTexSubImage2D = radeonCompressedTexSubImage2D;
functions->GetCompressedTexImage = radeonGetCompressedTexImage;
functions->GetTexImage = radeonGetTexImage;
functions->GenerateMipmap = radeonGenerateMipmap;

View file

@ -121,10 +121,6 @@ void radeonGetTexImage(struct gl_context * ctx, GLenum target, GLint level,
GLenum format, GLenum type, GLvoid * pixels,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage);
void radeonGetCompressedTexImage(struct gl_context *ctx, GLenum target, GLint level,
GLvoid *pixels,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage);
void radeonCopyTexSubImage2D(struct gl_context *ctx, GLenum target, GLint level,
GLint xoffset, GLint yoffset,

View file

@ -487,11 +487,11 @@ _mesa_get_compressed_teximage(struct gl_context *ctx, GLenum target, GLint level
struct gl_texture_object *texObj,
struct gl_texture_image *texImage)
{
const GLuint row_stride = _mesa_format_row_stride(texImage->TexFormat,
texImage->Width);
const GLuint row_stride_stored = _mesa_format_row_stride(texImage->TexFormat,
texImage->RowStride);
const GLuint row_stride =
_mesa_format_row_stride(texImage->TexFormat, texImage->Width);
GLuint i;
GLubyte *src;
GLint srcRowStride;
if (_mesa_is_bufferobj(ctx->Pack.BufferObj)) {
/* pack texture image into a PBO */
@ -507,25 +507,32 @@ _mesa_get_compressed_teximage(struct gl_context *ctx, GLenum target, GLint level
img = ADD_POINTERS(buf, img);
}
/* map src texture buffer */
ctx->Driver.MapTextureImage(ctx, texImage, 0,
0, 0, texImage->Width, texImage->Height,
GL_MAP_READ_BIT, &src, &srcRowStride);
/* no pixelstore or pixel transfer, but respect stride */
if (row_stride == row_stride_stored) {
if (row_stride == srcRowStride) {
const GLuint size = _mesa_format_image_size(texImage->TexFormat,
texImage->Width,
texImage->Height,
texImage->Depth);
memcpy(img, texImage->Data, size);
memcpy(img, src, size);
}
else {
GLuint bw, bh;
_mesa_get_format_block_size(texImage->TexFormat, &bw, &bh);
for (i = 0; i < (texImage->Height + bh - 1) / bh; i++) {
memcpy((GLubyte *)img + i * row_stride,
(GLubyte *)texImage->Data + i * row_stride_stored,
(GLubyte *)src + i * srcRowStride,
row_stride);
}
}
ctx->Driver.UnmapTextureImage(ctx, texImage, 0);
if (_mesa_is_bufferobj(ctx->Pack.BufferObj)) {
ctx->Driver.UnmapBuffer(ctx, ctx->Pack.BufferObj);
}

View file

@ -926,10 +926,10 @@ decompress_with_blit(struct gl_context * ctx, GLenum target, GLint level,
* then unmap it.
*/
static void
st_get_tex_image(struct gl_context * ctx, GLenum target, GLint level,
GLenum format, GLenum type, GLvoid * pixels,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage, GLboolean compressed_dst)
st_GetTexImage(struct gl_context * ctx, GLenum target, GLint level,
GLenum format, GLenum type, GLvoid * pixels,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage)
{
struct st_context *st = st_context(ctx);
struct st_texture_image *stImage = st_texture_image(texImage);
@ -939,9 +939,7 @@ st_get_tex_image(struct gl_context * ctx, GLenum target, GLint level,
GLuint depth, i;
GLubyte *dest;
if (stImage->pt &&
util_format_is_s3tc(stImage->pt->format) &&
!compressed_dst) {
if (stImage->pt && util_format_is_s3tc(stImage->pt->format)) {
/* Need to decompress the texture.
* We'll do this by rendering a textured quad.
* Note that we only expect RGBA formats (no Z/depth formats).
@ -983,14 +981,8 @@ st_get_tex_image(struct gl_context * ctx, GLenum target, GLint level,
dest = (GLubyte *) pixels;
for (i = 0; i < depth; i++) {
if (compressed_dst) {
_mesa_get_compressed_teximage(ctx, target, level, dest,
texObj, texImage);
}
else {
_mesa_get_teximage(ctx, target, level, format, type, dest,
texObj, texImage);
}
_mesa_get_teximage(ctx, target, level, format, type, dest,
texObj, texImage);
if (stImage->pt && i + 1 < depth) {
/* unmap this slice */
@ -1014,29 +1006,6 @@ st_get_tex_image(struct gl_context * ctx, GLenum target, GLint level,
}
static void
st_GetTexImage(struct gl_context * ctx, GLenum target, GLint level,
GLenum format, GLenum type, GLvoid * pixels,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage)
{
st_get_tex_image(ctx, target, level, format, type, pixels, texObj, texImage,
GL_FALSE);
}
static void
st_GetCompressedTexImage(struct gl_context *ctx, GLenum target, GLint level,
GLvoid *pixels,
struct gl_texture_object *texObj,
struct gl_texture_image *texImage)
{
st_get_tex_image(ctx, target, level, 0, 0, pixels, texObj, texImage,
GL_TRUE);
}
static void
st_TexSubimage(struct gl_context *ctx, GLint dims, GLenum target, GLint level,
GLint xoffset, GLint yoffset, GLint zoffset,
@ -1924,7 +1893,7 @@ st_init_texture_functions(struct dd_function_table *functions)
/* compressed texture functions */
functions->CompressedTexImage2D = st_CompressedTexImage2D;
functions->GetCompressedTexImage = st_GetCompressedTexImage;
functions->GetCompressedTexImage = _mesa_get_compressed_teximage;
functions->NewTextureObject = st_NewTextureObject;
functions->NewTextureImage = st_NewTextureImage;