summaryrefslogtreecommitdiffstats
path: root/src/mesa/state_tracker
diff options
context:
space:
mode:
authorMarek Olšák <[email protected]>2013-09-28 21:28:53 +0200
committerMarek Olšák <[email protected]>2013-10-08 16:23:04 +0200
commite9c9d2820331b2c23dfcd5982948831ba79b2e4b (patch)
tree8e0770b0d536737f6e6f1643a3b7e65fef7612b3 /src/mesa/state_tracker
parent20bf508a42b0fdd5b094842b1bbeb412ce3f8505 (diff)
st/mesa: improve format selection for GLES
Reviewed-by: Wladimir J. van der Laan <[email protected]>
Diffstat (limited to 'src/mesa/state_tracker')
-rw-r--r--src/mesa/state_tracker/st_format.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/mesa/state_tracker/st_format.c b/src/mesa/state_tracker/st_format.c
index 64bfd1faaff..33c2ca66179 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);