[Mesa-dev,3/4] st/mesa: pass etc2 textures to driver if supported

Submitted by Ilia Mirkin on Feb. 16, 2015, 7:36 a.m.

Details

Message ID 1424072212-26068-3-git-send-email-imirkin@alum.mit.edu
State New, archived
Headers show

Not browsing as part of any series.

Commit Message

Ilia Mirkin Feb. 16, 2015, 7:36 a.m.
If the driver actually supports ETC2, don't decode it in software.

Signed-off-by: Ilia Mirkin <imirkin@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(-)

Patch hide | download patch | download mbox

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;
    }

Comments

For patches 2 & 3:

Reviewed-by: Marek Olšák <marek.olsak@amd.com>

Marek

On Mon, Feb 16, 2015 at 8:36 AM, Ilia Mirkin <imirkin@alum.mit.edu> wrote:
> If the driver actually supports ETC2, don't decode it in software.
>
> Signed-off-by: Ilia Mirkin <imirkin@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