[Mesa-dev] [PATCH 10/24] st/mesa: optimize sampler state translation code

Marek Olšák maraeo at gmail.com
Mon Jun 12 18:18:41 UTC 2017


From: Marek Olšák <marek.olsak at amd.com>

---
 src/mesa/state_tracker/st_atom_sampler.c | 79 +++++++++++++-------------------
 1 file changed, 31 insertions(+), 48 deletions(-)

diff --git a/src/mesa/state_tracker/st_atom_sampler.c b/src/mesa/state_tracker/st_atom_sampler.c
index 9695069..ea231f3 100644
--- a/src/mesa/state_tracker/st_atom_sampler.c
+++ b/src/mesa/state_tracker/st_atom_sampler.c
@@ -51,85 +51,68 @@
 
 #include "util/u_format.h"
 
 
 /**
  * Convert GLenum texcoord wrap tokens to pipe tokens.
  */
 static GLuint
 gl_wrap_xlate(GLenum wrap)
 {
-   switch (wrap) {
-   case GL_REPEAT:
-      return PIPE_TEX_WRAP_REPEAT;
-   case GL_CLAMP:
-      return PIPE_TEX_WRAP_CLAMP;
-   case GL_CLAMP_TO_EDGE:
-      return PIPE_TEX_WRAP_CLAMP_TO_EDGE;
-   case GL_CLAMP_TO_BORDER:
-      return PIPE_TEX_WRAP_CLAMP_TO_BORDER;
-   case GL_MIRRORED_REPEAT:
-      return PIPE_TEX_WRAP_MIRROR_REPEAT;
-   case GL_MIRROR_CLAMP_EXT:
-      return PIPE_TEX_WRAP_MIRROR_CLAMP;
-   case GL_MIRROR_CLAMP_TO_EDGE_EXT:
-      return PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE;
-   case GL_MIRROR_CLAMP_TO_BORDER_EXT:
-      return PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER;
-   default:
-      assert(0);
-      return 0;
-   }
+   /* Take advantage of how the enums are defined. */
+   static const unsigned table[32] = {
+      PIPE_TEX_WRAP_CLAMP,
+      PIPE_TEX_WRAP_REPEAT,
+      PIPE_TEX_WRAP_MIRROR_CLAMP,
+      PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      0,
+      PIPE_TEX_WRAP_CLAMP_TO_BORDER,
+      0,
+      PIPE_TEX_WRAP_CLAMP_TO_EDGE,
+      PIPE_TEX_WRAP_MIRROR_REPEAT,
+      0,
+      PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER,
+   };
+
+   return table[wrap & 0x1f];
 }
 
 
 static GLuint
 gl_filter_to_mip_filter(GLenum filter)
 {
-   switch (filter) {
-   case GL_NEAREST:
-   case GL_LINEAR:
+   /* Take advantage of how the enums are defined. */
+   if (filter <= GL_LINEAR)
       return PIPE_TEX_MIPFILTER_NONE;
-
-   case GL_NEAREST_MIPMAP_NEAREST:
-   case GL_LINEAR_MIPMAP_NEAREST:
+   if (filter <= GL_LINEAR_MIPMAP_NEAREST)
       return PIPE_TEX_MIPFILTER_NEAREST;
 
-   case GL_NEAREST_MIPMAP_LINEAR:
-   case GL_LINEAR_MIPMAP_LINEAR:
-      return PIPE_TEX_MIPFILTER_LINEAR;
-
-   default:
-      assert(0);
-      return PIPE_TEX_MIPFILTER_NONE;
-   }
+   return PIPE_TEX_MIPFILTER_LINEAR;
 }
 
 
 static GLuint
 gl_filter_to_img_filter(GLenum filter)
 {
-   switch (filter) {
-   case GL_NEAREST:
-   case GL_NEAREST_MIPMAP_NEAREST:
-   case GL_NEAREST_MIPMAP_LINEAR:
-      return PIPE_TEX_FILTER_NEAREST;
-
-   case GL_LINEAR:
-   case GL_LINEAR_MIPMAP_NEAREST:
-   case GL_LINEAR_MIPMAP_LINEAR:
+   /* Take advantage of how the enums are defined. */
+   if (filter & 1)
       return PIPE_TEX_FILTER_LINEAR;
 
-   default:
-      assert(0);
-      return PIPE_TEX_FILTER_NEAREST;
-   }
+   return PIPE_TEX_FILTER_NEAREST;
 }
 
 
 /**
  * Convert a gl_sampler_object to a pipe_sampler_state object.
  */
 void
 st_convert_sampler(const struct st_context *st,
                    const struct gl_texture_object *texobj,
                    const struct gl_sampler_object *msamp,
-- 
2.7.4



More information about the mesa-dev mailing list