mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-07 00:00:12 +01:00
st/mesa: pass etc2 textures to driver if supported
If the driver actually supports ETC2, don't decode it in software. Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu> Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
parent
845b9e4294
commit
33edda7d97
4 changed files with 40 additions and 11 deletions
|
|
@ -211,7 +211,7 @@ st_MapTextureImage(struct gl_context *ctx,
|
|||
map = st_texture_image_map(st, stImage, pipeMode, x, y, slice, w, h, 1,
|
||||
&transfer);
|
||||
if (map) {
|
||||
if (_mesa_is_format_etc2(texImage->TexFormat) ||
|
||||
if ((_mesa_is_format_etc2(texImage->TexFormat) && !st->has_etc2) ||
|
||||
(texImage->TexFormat == MESA_FORMAT_ETC1_RGB8 && !st->has_etc1)) {
|
||||
/* ETC isn't supported by gallium and it's represented
|
||||
* by uncompressed formats. Only write transfers with precompressed
|
||||
|
|
@ -254,7 +254,7 @@ st_UnmapTextureImage(struct gl_context *ctx,
|
|||
struct st_context *st = st_context(ctx);
|
||||
struct st_texture_image *stImage = st_texture_image(texImage);
|
||||
|
||||
if (_mesa_is_format_etc2(texImage->TexFormat) ||
|
||||
if ((_mesa_is_format_etc2(texImage->TexFormat) && !st->has_etc2) ||
|
||||
(texImage->TexFormat == MESA_FORMAT_ETC1_RGB8 && !st->has_etc1)) {
|
||||
/* Decompress the ETC texture to the mapped one. */
|
||||
unsigned z = slice + stImage->base.Face;
|
||||
|
|
|
|||
|
|
@ -230,6 +230,9 @@ st_create_context_priv( struct gl_context *ctx, struct pipe_context *pipe,
|
|||
st->has_etc1 = screen->is_format_supported(screen, PIPE_FORMAT_ETC1_RGB8,
|
||||
PIPE_TEXTURE_2D, 0,
|
||||
PIPE_BIND_SAMPLER_VIEW);
|
||||
st->has_etc2 = screen->is_format_supported(screen, PIPE_FORMAT_ETC2_RGB8,
|
||||
PIPE_TEXTURE_2D, 0,
|
||||
PIPE_BIND_SAMPLER_VIEW);
|
||||
st->prefer_blit_based_texture_transfer = screen->get_param(screen,
|
||||
PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER);
|
||||
|
||||
|
|
|
|||
|
|
@ -93,6 +93,7 @@ struct st_context
|
|||
boolean has_time_elapsed;
|
||||
boolean has_shader_model3;
|
||||
boolean has_etc1;
|
||||
boolean has_etc2;
|
||||
boolean prefer_blit_based_texture_transfer;
|
||||
|
||||
boolean needs_texcoord_semantic;
|
||||
|
|
|
|||
|
|
@ -443,21 +443,25 @@ st_mesa_format_to_pipe_format(struct st_context *st, mesa_format mesaFormat)
|
|||
* The destination formats mustn't be changed, because they are also
|
||||
* destination formats of the unpack/decompression function. */
|
||||
case MESA_FORMAT_ETC2_RGB8:
|
||||
case MESA_FORMAT_ETC2_RGBA8_EAC:
|
||||
case MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1:
|
||||
return PIPE_FORMAT_R8G8B8A8_UNORM;
|
||||
return st->has_etc2 ? PIPE_FORMAT_ETC2_RGB8 : PIPE_FORMAT_R8G8B8A8_UNORM;
|
||||
case MESA_FORMAT_ETC2_SRGB8:
|
||||
return st->has_etc2 ? PIPE_FORMAT_ETC2_SRGB8 : PIPE_FORMAT_B8G8R8A8_SRGB;
|
||||
case MESA_FORMAT_ETC2_RGBA8_EAC:
|
||||
return st->has_etc2 ? PIPE_FORMAT_ETC2_RGBA8 : PIPE_FORMAT_R8G8B8A8_UNORM;
|
||||
case MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC:
|
||||
case MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1:
|
||||
return PIPE_FORMAT_B8G8R8A8_SRGB;
|
||||
return st->has_etc2 ? PIPE_FORMAT_ETC2_SRGBA8 : PIPE_FORMAT_B8G8R8A8_SRGB;
|
||||
case MESA_FORMAT_ETC2_R11_EAC:
|
||||
return PIPE_FORMAT_R16_UNORM;
|
||||
return st->has_etc2 ? PIPE_FORMAT_ETC2_R11_UNORM : PIPE_FORMAT_R16_UNORM;
|
||||
case MESA_FORMAT_ETC2_RG11_EAC:
|
||||
return PIPE_FORMAT_R16G16_UNORM;
|
||||
return st->has_etc2 ? PIPE_FORMAT_ETC2_RG11_UNORM : PIPE_FORMAT_R16G16_UNORM;
|
||||
case MESA_FORMAT_ETC2_SIGNED_R11_EAC:
|
||||
return PIPE_FORMAT_R16_SNORM;
|
||||
return st->has_etc2 ? PIPE_FORMAT_ETC2_R11_SNORM : PIPE_FORMAT_R16_SNORM;
|
||||
case MESA_FORMAT_ETC2_SIGNED_RG11_EAC:
|
||||
return PIPE_FORMAT_R16G16_SNORM;
|
||||
return st->has_etc2 ? PIPE_FORMAT_ETC2_RG11_SNORM : PIPE_FORMAT_R16G16_SNORM;
|
||||
case MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1:
|
||||
return st->has_etc2 ? PIPE_FORMAT_ETC2_RGB8A1 : PIPE_FORMAT_R8G8B8A8_UNORM;
|
||||
case MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1:
|
||||
return st->has_etc2 ? PIPE_FORMAT_ETC2_SRGB8A1 : PIPE_FORMAT_B8G8R8A8_SRGB;
|
||||
|
||||
default:
|
||||
return PIPE_FORMAT_NONE;
|
||||
|
|
@ -856,6 +860,27 @@ st_pipe_format_to_mesa_format(enum pipe_format format)
|
|||
case PIPE_FORMAT_XRGB8888_SRGB:
|
||||
return MESA_FORMAT_X8R8G8B8_SRGB;
|
||||
|
||||
case PIPE_FORMAT_ETC2_RGB8:
|
||||
return MESA_FORMAT_ETC2_RGB8;
|
||||
case PIPE_FORMAT_ETC2_SRGB8:
|
||||
return MESA_FORMAT_ETC2_SRGB8;
|
||||
case PIPE_FORMAT_ETC2_RGB8A1:
|
||||
return MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1;
|
||||
case PIPE_FORMAT_ETC2_SRGB8A1:
|
||||
return MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1;
|
||||
case PIPE_FORMAT_ETC2_RGBA8:
|
||||
return MESA_FORMAT_ETC2_RGBA8_EAC;
|
||||
case PIPE_FORMAT_ETC2_SRGBA8:
|
||||
return MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC;
|
||||
case PIPE_FORMAT_ETC2_R11_UNORM:
|
||||
return MESA_FORMAT_ETC2_R11_EAC;
|
||||
case PIPE_FORMAT_ETC2_R11_SNORM:
|
||||
return MESA_FORMAT_ETC2_SIGNED_R11_EAC;
|
||||
case PIPE_FORMAT_ETC2_RG11_UNORM:
|
||||
return MESA_FORMAT_ETC2_RG11_EAC;
|
||||
case PIPE_FORMAT_ETC2_RG11_SNORM:
|
||||
return MESA_FORMAT_ETC2_SIGNED_RG11_EAC;
|
||||
|
||||
default:
|
||||
return MESA_FORMAT_NONE;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue