Mesa (master): st/mesa: improve format selection for GLES

Marek Olšák mareko at kemper.freedesktop.org
Tue Oct 8 14:24:16 UTC 2013


Module: Mesa
Branch: master
Commit: e9c9d2820331b2c23dfcd5982948831ba79b2e4b
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=e9c9d2820331b2c23dfcd5982948831ba79b2e4b

Author: Marek Olšák <marek.olsak at amd.com>
Date:   Sat Sep 28 21:28:53 2013 +0200

st/mesa: improve format selection for GLES

Reviewed-by: Wladimir J. van der Laan <laanwj at gmail.com>

---

 src/mesa/main/texgetimage.c        |    2 +-
 src/mesa/main/texgetimage.h        |    3 +++
 src/mesa/state_tracker/st_format.c |   36 ++++++++++++++++++++++++++++++++++++
 3 files changed, 40 insertions(+), 1 deletions(-)

diff --git a/src/mesa/main/texgetimage.c b/src/mesa/main/texgetimage.c
index 7050f10..d66ca1a 100644
--- a/src/mesa/main/texgetimage.c
+++ b/src/mesa/main/texgetimage.c
@@ -319,7 +319,7 @@ get_tex_rgba_compressed(struct gl_context *ctx, GLuint dimensions,
  * Return a base GL format given the user-requested format
  * for glGetTexImage().
  */
-static GLenum
+GLenum
 _mesa_base_pack_format(GLenum format)
 {
    switch (format) {
diff --git a/src/mesa/main/texgetimage.h b/src/mesa/main/texgetimage.h
index 91ae6e2..a292fab 100644
--- a/src/mesa/main/texgetimage.h
+++ b/src/mesa/main/texgetimage.h
@@ -33,6 +33,9 @@ struct gl_context;
 struct gl_texture_image;
 struct gl_texture_object;
 
+extern GLenum
+_mesa_base_pack_format(GLenum format);
+
 extern void
 _mesa_get_teximage(struct gl_context *ctx,
                    GLenum format, GLenum type, GLvoid *pixels,
diff --git a/src/mesa/state_tracker/st_format.c b/src/mesa/state_tracker/st_format.c
index 64bfd1f..33c2ca6 100644
--- a/src/mesa/state_tracker/st_format.c
+++ b/src/mesa/state_tracker/st_format.c
@@ -35,6 +35,8 @@
 #include "main/imports.h"
 #include "main/context.h"
 #include "main/glformats.h"
+#include "main/texgetimage.h"
+#include "main/teximage.h"
 #include "main/texstore.h"
 #include "main/image.h"
 #include "main/macros.h"
@@ -1745,6 +1747,40 @@ st_ChooseTextureFormat(struct gl_context *ctx, GLenum target,
 	 bindings |= PIPE_BIND_RENDER_TARGET;
    }
 
+   /* GLES allows the driver to choose any format which matches
+    * the format+type combo, because GLES only supports unsized internal
+    * formats and expects the driver to choose whatever suits it.
+    */
+   if (_mesa_is_gles(ctx)) {
+      GLenum baseFormat = _mesa_base_tex_format(ctx, internalFormat);
+      GLenum basePackFormat = _mesa_base_pack_format(format);
+      GLenum iformat = internalFormat;
+
+      /* Treat GL_BGRA as GL_RGBA. */
+      if (iformat == GL_BGRA)
+         iformat = GL_RGBA;
+
+      /* Check if the internalformat is unsized and compatible
+       * with the "format".
+       */
+      if (iformat == baseFormat && iformat == basePackFormat) {
+         pFormat = st_choose_matching_format(st->pipe->screen, bindings,
+                                             format, type,
+                                             ctx->Unpack.SwapBytes);
+
+         if (pFormat != PIPE_FORMAT_NONE)
+            return st_pipe_format_to_mesa_format(pFormat);
+
+         /* try choosing format again, this time without render target bindings */
+         pFormat = st_choose_matching_format(st->pipe->screen,
+                                             PIPE_BIND_SAMPLER_VIEW,
+                                             format, type,
+                                             ctx->Unpack.SwapBytes);
+         if (pFormat != PIPE_FORMAT_NONE)
+            return st_pipe_format_to_mesa_format(pFormat);
+      }
+   }
+
    pFormat = st_choose_format(st, internalFormat, format, type,
                               PIPE_TEXTURE_2D, 0, bindings, ctx->Mesa_DXTn);
 




More information about the mesa-commit mailing list