[Mesa-dev] [RFC PATCH 2/4] Add prefer_no_swizzle parameter to ChooseTextureFormat

Chris Forbes chrisf at ijw.co.nz
Mon Mar 10 02:20:20 PDT 2014


This is a hint that we want components ordered as they are in the
internalformat name.

We want this for views (and so also for
immutable-format textures from which views might be created).

In other cases we might want to prefer ARGB or BGRA component order
to avoid reswizzling uploads, or for interaction with scanout hardware.

Signed-off-by: Chris Forbes <chrisf at ijw.co.nz>
---
 src/mesa/drivers/dri/i915/intel_fbo.c          | 3 ++-
 src/mesa/drivers/dri/i965/intel_fbo.c          | 3 ++-
 src/mesa/drivers/dri/nouveau/nouveau_texture.c | 3 ++-
 src/mesa/drivers/dri/radeon/radeon_texture.c   | 3 ++-
 src/mesa/drivers/dri/swrast/swrast.c           | 6 ++++--
 src/mesa/main/dd.h                             | 3 ++-
 src/mesa/main/texformat.c                      | 5 ++++-
 src/mesa/main/texformat.h                      | 3 ++-
 src/mesa/main/teximage.c                       | 2 +-
 src/mesa/main/texobj.c                         | 3 ++-
 src/mesa/state_tracker/st_format.c             | 3 ++-
 src/mesa/state_tracker/st_format.h             | 2 +-
 12 files changed, 26 insertions(+), 13 deletions(-)

diff --git a/src/mesa/drivers/dri/i915/intel_fbo.c b/src/mesa/drivers/dri/i915/intel_fbo.c
index a806a42..70aae1e 100644
--- a/src/mesa/drivers/dri/i915/intel_fbo.c
+++ b/src/mesa/drivers/dri/i915/intel_fbo.c
@@ -186,7 +186,8 @@ intel_alloc_renderbuffer_storage(struct gl_context * ctx, struct gl_renderbuffer
        */
       rb->Format = intel->ctx.Driver.ChooseTextureFormat(ctx, GL_TEXTURE_2D,
 							 internalFormat,
-							 GL_NONE, GL_NONE);
+							 GL_NONE, GL_NONE,
+							 GL_FALSE);
       break;
    case GL_STENCIL_INDEX:
    case GL_STENCIL_INDEX1_EXT:
diff --git a/src/mesa/drivers/dri/i965/intel_fbo.c b/src/mesa/drivers/dri/i965/intel_fbo.c
index c70b1bf..c695773 100644
--- a/src/mesa/drivers/dri/i965/intel_fbo.c
+++ b/src/mesa/drivers/dri/i965/intel_fbo.c
@@ -283,7 +283,8 @@ intel_alloc_renderbuffer_storage(struct gl_context * ctx, struct gl_renderbuffer
        */
       rb->Format = ctx->Driver.ChooseTextureFormat(ctx, GL_TEXTURE_2D,
                                                    internalFormat,
-                                                   GL_NONE, GL_NONE);
+                                                   GL_NONE, GL_NONE,
+                                                   GL_FALSE);
       break;
    case GL_STENCIL_INDEX:
    case GL_STENCIL_INDEX1_EXT:
diff --git a/src/mesa/drivers/dri/nouveau/nouveau_texture.c b/src/mesa/drivers/dri/nouveau/nouveau_texture.c
index a8c0268..d6c6be2 100644
--- a/src/mesa/drivers/dri/nouveau/nouveau_texture.c
+++ b/src/mesa/drivers/dri/nouveau/nouveau_texture.c
@@ -163,7 +163,8 @@ nouveau_unmap_texture_image(struct gl_context *ctx, struct gl_texture_image *ti,
 static mesa_format
 nouveau_choose_tex_format(struct gl_context *ctx, GLenum target,
                           GLint internalFormat,
-			  GLenum srcFormat, GLenum srcType)
+                          GLenum srcFormat, GLenum srcType,
+                          GLboolean prefer_no_swizzle)
 {
 	switch (internalFormat) {
 	case 4:
diff --git a/src/mesa/drivers/dri/radeon/radeon_texture.c b/src/mesa/drivers/dri/radeon/radeon_texture.c
index 5bf6541..ad4d274 100644
--- a/src/mesa/drivers/dri/radeon/radeon_texture.c
+++ b/src/mesa/drivers/dri/radeon/radeon_texture.c
@@ -246,7 +246,8 @@ mesa_format radeonChooseTextureFormat_mesa(struct gl_context * ctx,
 					 GLenum target,
 					 GLint internalFormat,
 					 GLenum format,
-					 GLenum type)
+					 GLenum type,
+					 GLboolean prefer_no_swizzle)
 {
 	return radeonChooseTextureFormat(ctx, internalFormat, format,
 					 type, 0);
diff --git a/src/mesa/drivers/dri/swrast/swrast.c b/src/mesa/drivers/dri/swrast/swrast.c
index 071192c..648b814 100644
--- a/src/mesa/drivers/dri/swrast/swrast.c
+++ b/src/mesa/drivers/dri/swrast/swrast.c
@@ -629,11 +629,13 @@ static mesa_format swrastChooseTextureFormat(struct gl_context * ctx,
                                            GLenum target,
 					   GLint internalFormat,
 					   GLenum format,
-					   GLenum type)
+					   GLenum type,
+					   GLboolean prefer_no_swizzle)
 {
     if (internalFormat == GL_RGB)
 	return MESA_FORMAT_B8G8R8X8_UNORM;
-    return _mesa_choose_tex_format(ctx, target, internalFormat, format, type);
+    return _mesa_choose_tex_format(ctx, target, internalFormat,
+                                   format, type, prefer_no_swizzle);
 }
 
 static void
diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h
index 9715241..aae1428 100644
--- a/src/mesa/main/dd.h
+++ b/src/mesa/main/dd.h
@@ -184,7 +184,8 @@ struct dd_function_table {
     */
    mesa_format (*ChooseTextureFormat)(struct gl_context *ctx,
                                       GLenum target, GLint internalFormat,
-                                      GLenum srcFormat, GLenum srcType );
+                                      GLenum srcFormat, GLenum srcType,
+                                      GLboolean prefer_no_swizzle);
 
    /**
     * Determine sample counts support for a particular target and format
diff --git a/src/mesa/main/texformat.c b/src/mesa/main/texformat.c
index 004e7eb..33725dc 100644
--- a/src/mesa/main/texformat.c
+++ b/src/mesa/main/texformat.c
@@ -53,6 +53,8 @@
  * \param internalFormat  user's prefered internal texture format.
  * \param format  incoming image pixel format.
  * \param type  incoming image data type.
+ * \param prefer_no_swizzle  prefer formats with the component order
+ *              matching the provided internalformat
  *
  * \return the closest mesa_format for the given format/type arguments
  *
@@ -61,7 +63,8 @@
  */
 mesa_format
 _mesa_choose_tex_format(struct gl_context *ctx, GLenum target,
-                        GLint internalFormat, GLenum format, GLenum type)
+                        GLint internalFormat, GLenum format, GLenum type,
+                        GLboolean prefer_no_swizzle)
 {
    (void) format;
 
diff --git a/src/mesa/main/texformat.h b/src/mesa/main/texformat.h
index 32e2099..04501f1 100644
--- a/src/mesa/main/texformat.h
+++ b/src/mesa/main/texformat.h
@@ -33,7 +33,8 @@ struct gl_context;
 
 extern mesa_format
 _mesa_choose_tex_format(struct gl_context *ctx, GLenum target,
-                        GLint internalFormat, GLenum format, GLenum type);
+                        GLint internalFormat, GLenum format, GLenum type,
+                        GLboolean prefer_no_swizzle);
 
 extern GLboolean
 _mesa_tex_target_is_array(GLenum target);
diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c
index a59eac1..65f149e 100644
--- a/src/mesa/main/teximage.c
+++ b/src/mesa/main/teximage.c
@@ -3028,7 +3028,7 @@ _mesa_choose_texture_format(struct gl_context *ctx,
 
    /* choose format from scratch */
    f = ctx->Driver.ChooseTextureFormat(ctx, texObj->Target, internalFormat,
-                                       format, type);
+                                       format, type, prefer_no_swizzle);
    ASSERT(f != MESA_FORMAT_NONE);
    return f;
 }
diff --git a/src/mesa/main/texobj.c b/src/mesa/main/texobj.c
index 918dd59..c2b3190 100644
--- a/src/mesa/main/texobj.c
+++ b/src/mesa/main/texobj.c
@@ -829,7 +829,8 @@ _mesa_get_fallback_texture(struct gl_context *ctx, gl_texture_index tex)
 
       texFormat = ctx->Driver.ChooseTextureFormat(ctx, target,
                                                   GL_RGBA, GL_RGBA,
-                                                  GL_UNSIGNED_BYTE);
+                                                  GL_UNSIGNED_BYTE,
+                                                  GL_FALSE);
 
       /* need a loop here just for cube maps */
       for (face = 0; face < numFaces; face++) {
diff --git a/src/mesa/state_tracker/st_format.c b/src/mesa/state_tracker/st_format.c
index a55ee30..969df2a 100644
--- a/src/mesa/state_tracker/st_format.c
+++ b/src/mesa/state_tracker/st_format.c
@@ -1774,7 +1774,8 @@ st_choose_matching_format(struct pipe_screen *screen, unsigned bind,
 mesa_format
 st_ChooseTextureFormat(struct gl_context *ctx, GLenum target,
                        GLint internalFormat,
-                       GLenum format, GLenum type)
+                       GLenum format, GLenum type,
+                       GLboolean prefer_no_swizzle)
 {
    const boolean want_renderable =
       internalFormat == 3 || internalFormat == 4 ||
diff --git a/src/mesa/state_tracker/st_format.h b/src/mesa/state_tracker/st_format.h
index ce1e230..9a09dce 100644
--- a/src/mesa/state_tracker/st_format.h
+++ b/src/mesa/state_tracker/st_format.h
@@ -64,7 +64,7 @@ st_choose_matching_format(struct pipe_screen *screen, unsigned bind,
 extern mesa_format
 st_ChooseTextureFormat(struct gl_context * ctx, GLenum target,
                        GLint internalFormat,
-                       GLenum format, GLenum type);
+                       GLenum format, GLenum type, GLboolean prefer_no_swizzle);
 
 size_t
 st_QuerySamplesForFormat(struct gl_context *ctx, GLenum target,
-- 
1.9.0



More information about the mesa-dev mailing list