OSDN Git Service

mesa: Generalize TexStorage allocator between swrast and intel.
authorEric Anholt <eric@anholt.net>
Sat, 13 Apr 2013 08:37:35 +0000 (01:37 -0700)
committerEric Anholt <eric@anholt.net>
Sun, 21 Apr 2013 19:28:04 +0000 (12:28 -0700)
This should be reusable for other non-gallium drivers, so we can make the
extension always be available.

v2: Add a more detailed comment than the old function had (recommended
    by Brian).

Reviewed-by: Brian Paul <brianp@vmware.com> (v1)
src/mesa/drivers/common/driverfuncs.c
src/mesa/drivers/dri/intel/intel_tex.c
src/mesa/main/texstorage.c
src/mesa/main/texstorage.h
src/mesa/swrast/s_texture.c
src/mesa/swrast/swrast.h

index a98dfc6..9112eb0 100644 (file)
@@ -40,6 +40,7 @@
 #include "main/texgetimage.h"
 #include "main/teximage.h"
 #include "main/texobj.h"
+#include "main/texstorage.h"
 #include "main/texstore.h"
 #include "main/bufferobj.h"
 #include "main/fbobject.h"
@@ -209,7 +210,7 @@ _mesa_init_driver_functions(struct dd_function_table *driver)
    driver->EndCallList = NULL;
 
    /* GL_ARB_texture_storage */
-   driver->AllocTextureStorage = _swrast_AllocTextureStorage;
+   driver->AllocTextureStorage = _mesa_alloc_texture_storage;
 
    /* GL_ARB_texture_multisample */
    driver->GetSamplePosition = NULL;
index 9bba989..ee8db71 100644 (file)
@@ -127,31 +127,6 @@ intel_alloc_texture_image_buffer(struct gl_context *ctx,
    return true;
 }
 
-/**
- * Called via ctx->Driver.AllocTextureStorage()
- * Just have to allocate memory for the texture images.
- */
-static GLboolean
-intel_alloc_texture_storage(struct gl_context *ctx,
-                            struct gl_texture_object *texObj,
-                            GLsizei levels, GLsizei width,
-                            GLsizei height, GLsizei depth)
-{
-   const int numFaces = _mesa_num_tex_faces(texObj->Target);
-   int face;
-   int level;
-
-   for (face = 0; face < numFaces; face++) {
-      for (level = 0; level < levels; level++) {
-         struct gl_texture_image *const texImage = texObj->Image[face][level];
-         if (!intel_alloc_texture_image_buffer(ctx, texImage))
-            return false;
-      }
-   }
-
-   return true;
-}
-
 static void
 intel_free_texture_image_buffer(struct gl_context * ctx,
                                struct gl_texture_image *texImage)
@@ -231,7 +206,6 @@ intelInitTextureFuncs(struct dd_function_table *functions)
    functions->DeleteTexture = intelDeleteTextureObject;
    functions->AllocTextureImageBuffer = intel_alloc_texture_image_buffer;
    functions->FreeTextureImageBuffer = intel_free_texture_image_buffer;
-   functions->AllocTextureStorage = intel_alloc_texture_storage;
    functions->MapTextureImage = intel_map_texture_image;
    functions->UnmapTextureImage = intel_unmap_texture_image;
 }
index 330d676..c1f2c16 100644 (file)
@@ -244,6 +244,36 @@ _mesa_is_legal_tex_storage_format(struct gl_context *ctx, GLenum internalformat)
    }
 }
 
+/**
+ * Default ctx->Driver.AllocTextureStorage() handler.
+ *
+ * The driver can override this with a more specific implementation if it
+ * desires, but this can be used to get the texture images allocated using the
+ * usual texture image handling code.  The immutability of
+ * GL_ARB_texture_storage texture layouts is handled by texObj->Immutable
+ * checks at glTexImage* time.
+ */
+GLboolean
+_mesa_alloc_texture_storage(struct gl_context *ctx,
+                            struct gl_texture_object *texObj,
+                            GLsizei levels, GLsizei width,
+                            GLsizei height, GLsizei depth)
+{
+   const int numFaces = _mesa_num_tex_faces(texObj->Target);
+   int face;
+   int level;
+
+   for (face = 0; face < numFaces; face++) {
+      for (level = 0; level < levels; level++) {
+         struct gl_texture_image *const texImage = texObj->Image[face][level];
+         if (!ctx->Driver.AllocTextureImageBuffer(ctx, texImage))
+            return GL_FALSE;
+      }
+   }
+
+   return GL_TRUE;
+}
+
 
 /**
  * Do error checking for calls to glTexStorage1/2/3D().
index 9f172e1..0240ca3 100644 (file)
@@ -60,5 +60,10 @@ _mesa_TextureStorage3DEXT(GLuint texture, GLenum target, GLsizei levels,
 extern GLboolean
 _mesa_is_legal_tex_storage_format(struct gl_context *ctx, GLenum internalformat);
 
+extern GLboolean
+_mesa_alloc_texture_storage(struct gl_context *ctx,
+                            struct gl_texture_object *texObj,
+                            GLsizei levels, GLsizei width,
+                            GLsizei height, GLsizei depth);
 
 #endif /* TEXSTORAGE_H */
index 8ae3d5b..51048be 100644 (file)
@@ -322,30 +322,3 @@ _swrast_unmap_textures(struct gl_context *ctx)
       enabledUnits &= ~(1 << unit);
    }
 }
-
-
-/**
- * Called via ctx->Driver.AllocTextureStorage()
- * Just have to allocate memory for the texture images.
- */
-GLboolean
-_swrast_AllocTextureStorage(struct gl_context *ctx,
-                            struct gl_texture_object *texObj,
-                            GLsizei levels, GLsizei width,
-                            GLsizei height, GLsizei depth)
-{
-   const GLint numFaces = (texObj->Target == GL_TEXTURE_CUBE_MAP) ? 6 : 1;
-   GLint face, level;
-
-   for (face = 0; face < numFaces; face++) {
-      for (level = 0; level < levels; level++) {
-         struct gl_texture_image *texImage = texObj->Image[face][level];
-         if (!_swrast_alloc_texture_image_buffer(ctx, texImage)) {
-            return GL_FALSE;
-         }
-      }
-   }
-
-   return GL_TRUE;
-}
-
index 82555ae..0f74bb9 100644 (file)
@@ -272,14 +272,6 @@ _swrast_finish_render_texture(struct gl_context *ctx,
                               struct gl_renderbuffer_attachment *att);
 
 
-
-extern GLboolean
-_swrast_AllocTextureStorage(struct gl_context *ctx,
-                            struct gl_texture_object *texObj,
-                            GLsizei levels, GLsizei width,
-                            GLsizei height, GLsizei depth);
-
-
 /**
  * The driver interface for the software rasterizer.
  * XXX this may go away.