mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-04 11:20:20 +01:00
st/mesa: improve format selection for GLES
Reviewed-by: Wladimir J. van der Laan <laanwj@gmail.com>
This commit is contained in:
parent
20bf508a42
commit
e9c9d28203
3 changed files with 40 additions and 1 deletions
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue