For patches 2 & 3: Reviewed-by: Marek Olšák <marek.ol...@amd.com>
Marek On Mon, Feb 16, 2015 at 8:36 AM, Ilia Mirkin <imir...@alum.mit.edu> wrote: > If the driver actually supports ETC2, don't decode it in software. > > Signed-off-by: Ilia Mirkin <imir...@alum.mit.edu> > --- > src/mesa/state_tracker/st_cb_texture.c | 4 ++-- > src/mesa/state_tracker/st_context.c | 3 +++ > src/mesa/state_tracker/st_context.h | 1 + > src/mesa/state_tracker/st_format.c | 43 > +++++++++++++++++++++++++++------- > 4 files changed, 40 insertions(+), 11 deletions(-) > > diff --git a/src/mesa/state_tracker/st_cb_texture.c > b/src/mesa/state_tracker/st_cb_texture.c > index abc68c0..0525e87 100644 > --- a/src/mesa/state_tracker/st_cb_texture.c > +++ b/src/mesa/state_tracker/st_cb_texture.c > @@ -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; > diff --git a/src/mesa/state_tracker/st_context.c > b/src/mesa/state_tracker/st_context.c > index 9fd6cae..5834eba 100644 > --- a/src/mesa/state_tracker/st_context.c > +++ b/src/mesa/state_tracker/st_context.c > @@ -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); > > diff --git a/src/mesa/state_tracker/st_context.h > b/src/mesa/state_tracker/st_context.h > index 20d5678..b091a88 100644 > --- a/src/mesa/state_tracker/st_context.h > +++ b/src/mesa/state_tracker/st_context.h > @@ -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; > diff --git a/src/mesa/state_tracker/st_format.c > b/src/mesa/state_tracker/st_format.c > index 66cace1..a68101e 100644 > --- a/src/mesa/state_tracker/st_format.c > +++ b/src/mesa/state_tracker/st_format.c > @@ -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_R8G8B8A8_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_R8G8B8A8_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_R8G8B8A8_SNORM; > > 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; > } > -- > 2.0.5 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev