[Mesa-dev] [PATCH] st/mesa: try the app's texture format first before using the internal format.

Stéphane Marchesin marcheu at chromium.org
Fri Jun 17 11:34:38 PDT 2011


If we can find it, that means we don't need to do texture format conversion
and therefore we get fast texture uploads for natively supported formats.
---
 src/mesa/state_tracker/st_format.c |   25 +++++++++++++++++--------
 1 files changed, 17 insertions(+), 8 deletions(-)

diff --git a/src/mesa/state_tracker/st_format.c b/src/mesa/state_tracker/st_format.c
index 3583571..e39d835 100644
--- a/src/mesa/state_tracker/st_format.c
+++ b/src/mesa/state_tracker/st_format.c
@@ -615,16 +615,16 @@ static struct format_mapping format_map[] = {
       { PIPE_FORMAT_B10G10R10A2_UNORM, DEFAULT_RGBA_FORMATS }
    },
    {
-      { 4, GL_RGBA, GL_RGBA8, 0 },
-      { DEFAULT_RGBA_FORMATS, 0 }
-   },
-   {
       { GL_BGRA, 0 },
       { PIPE_FORMAT_B8G8R8A8_UNORM, DEFAULT_RGBA_FORMATS }
    },
    {
+      { 4, GL_RGBA, GL_RGBA8, 0 },
+      { PIPE_FORMAT_R8G8B8A8_UNORM, DEFAULT_RGBA_FORMATS }
+   },
+   {
       { 3, GL_RGB, GL_RGB8, 0 },
-      { DEFAULT_RGB_FORMATS, 0 }
+      { PIPE_FORMAT_R8G8B8X8_UNORM, DEFAULT_RGB_FORMATS }
    },
    {
       { GL_RGB12, GL_RGB16, GL_RGBA12, GL_RGBA16, 0 },
@@ -1108,7 +1108,7 @@ static struct format_mapping format_map[] = {
  * Return first supported format from the given list.
  */
 static enum pipe_format
-find_supported_format(struct pipe_screen *screen, 
+find_supported_format(struct pipe_screen *screen,
                       const enum pipe_format formats[],
                       enum pipe_texture_target target,
                       unsigned sample_count,
@@ -1210,14 +1210,23 @@ st_ChooseTextureFormat_renderable(struct gl_context *ctx, GLint internalFormat,
       if (_mesa_is_depth_format(internalFormat) ||
 	  _mesa_is_depth_or_stencil_format(internalFormat))
 	 bindings |= PIPE_BIND_DEPTH_STENCIL;
-      else 
+      else
 	 bindings |= PIPE_BIND_RENDER_TARGET;
    }
 
-   pFormat = st_choose_format(screen, internalFormat,
+   /* First try a format which matches the format provided by the app
+    * This heuristic avoids potentially costly texture format conversions
+    * and gets us much faster texture transfers. */
+   pFormat = st_choose_format(screen, format,
                               PIPE_TEXTURE_2D, 0, bindings);
 
    if (pFormat == PIPE_FORMAT_NONE) {
+      /* Now try the internal format */
+      pFormat = st_choose_format(screen, internalFormat,
+                                 PIPE_TEXTURE_2D, 0, bindings);
+   }
+
+   if (pFormat == PIPE_FORMAT_NONE) {
       /* try choosing format again, this time without render target bindings */
       pFormat = st_choose_format(screen, internalFormat,
                                  PIPE_TEXTURE_2D, 0, PIPE_BIND_SAMPLER_VIEW);
-- 
1.7.5.3.367.ga9930



More information about the mesa-dev mailing list