diff options
Diffstat (limited to 'src/mesa')
-rw-r--r-- | src/mesa/main/texgetimage.c | 2 | ||||
-rw-r--r-- | src/mesa/main/texgetimage.h | 3 | ||||
-rw-r--r-- | 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 7050f1080a4..d66ca1abcc6 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 91ae6e2e969..a292fabc0d4 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 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); |