OSDN Git Service

mesa: Convert GetCompressedTexImage to using MapTextureImage().
authorBrian Paul <brianp@vmware.com>
Sat, 30 Jul 2011 00:14:34 +0000 (17:14 -0700)
committerEric Anholt <eric@anholt.net>
Tue, 27 Sep 2011 19:12:07 +0000 (12:12 -0700)
This changes drivers to not map the texture on their own before
calling _mesa_get_compressed_teximage().

Tested-by: Brian Paul <brianp@vmware.com>
src/mesa/drivers/dri/intel/intel_tex_image.c
src/mesa/drivers/dri/radeon/radeon_tex_getimage.c
src/mesa/drivers/dri/radeon/radeon_texture.c
src/mesa/drivers/dri/radeon/radeon_texture.h
src/mesa/main/texgetimage.c
src/mesa/state_tracker/st_cb_texture.c

index ecccb47..96717d3 100644 (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
index 6e9772e..a72c2da 100644 (file)
  * 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);
-}
index bb27629..d7636ca 100644 (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;
index c02aa30..3d096b1 100644 (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,
index 2830dda..4d58309 100644 (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);
    }
index e744a9f..ffb5635 100644 (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 */
@@ -1015,29 +1007,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,
                GLint width, GLint height, GLint depth,
@@ -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;