st/mesa: improve format selection for GLES

Reviewed-by: Wladimir J. van der Laan <laanwj@gmail.com>
This commit is contained in:
Marek Olšák 2013-09-28 21:28:53 +02:00
parent 20bf508a42
commit e9c9d28203
3 changed files with 40 additions and 1 deletions

View file

@ -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) {

View file

@ -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,

View file

@ -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);