From ed8b4ed6c4c0f2d318e21ed964bb18d0e5a3b800 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Tue, 13 Feb 2018 04:25:29 +0100 Subject: [PATCH] st/mesa: implement ASTC 2D LDR fallback for all drivers MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Tested-by: Mike Lothian Tested-By: Gert Wollny Tested-by: Dieter Nützel Reviewed-By: Gert Wollny --- src/mesa/state_tracker/st_cb_texture.c | 17 +++++++- src/mesa/state_tracker/st_context.c | 3 ++ src/mesa/state_tracker/st_context.h | 1 + src/mesa/state_tracker/st_extensions.c | 5 +++ src/mesa/state_tracker/st_format.c | 56 ++++++++++++++++++++++++++ 5 files changed, 80 insertions(+), 2 deletions(-) diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c index 80eb171dfd8..56d8c411472 100644 --- a/src/mesa/state_tracker/st_cb_texture.c +++ b/src/mesa/state_tracker/st_cb_texture.c @@ -41,6 +41,7 @@ #include "main/pbo.h" #include "main/pixeltransfer.h" #include "main/texcompress.h" +#include "main/texcompress_astc.h" #include "main/texcompress_etc.h" #include "main/texgetimage.h" #include "main/teximage.h" @@ -227,6 +228,9 @@ st_compressed_format_fallback(struct st_context *st, mesa_format format) if (_mesa_is_format_etc2(format)) return !st->has_etc2; + if (_mesa_is_format_astc_2d(format)) + return !st->has_astc_2d_ldr; + return false; } @@ -337,14 +341,20 @@ st_UnmapTextureImage(struct gl_context *ctx, itransfer->temp_data, itransfer->temp_stride, transfer->box.width, transfer->box.height); - } - else { + } else if (_mesa_is_format_etc2(texImage->TexFormat)) { bool bgra = stImage->pt->format == PIPE_FORMAT_B8G8R8A8_SRGB; _mesa_unpack_etc2_format(itransfer->map, transfer->stride, itransfer->temp_data, itransfer->temp_stride, transfer->box.width, transfer->box.height, texImage->TexFormat, bgra); + } else if (_mesa_is_format_astc_2d(texImage->TexFormat)) { + _mesa_unpack_astc_2d_ldr(itransfer->map, transfer->stride, + itransfer->temp_data, itransfer->temp_stride, + transfer->box.width, transfer->box.height, + texImage->TexFormat); + } else { + unreachable("unexpected format for a compressed format fallback"); } } @@ -1415,6 +1425,7 @@ st_TexSubImage(struct gl_context *ctx, GLuint dims, dst_level = texImage->TexObject->MinLevel + texImage->Level; assert(!_mesa_is_format_etc2(texImage->TexFormat) && + !_mesa_is_format_astc_2d(texImage->TexFormat) && texImage->TexFormat != MESA_FORMAT_ETC1_RGB8); if (!dst) @@ -1875,6 +1886,7 @@ st_GetTexSubImage(struct gl_context * ctx, boolean done = FALSE; assert(!_mesa_is_format_etc2(texImage->TexFormat) && + !_mesa_is_format_astc_2d(texImage->TexFormat) && texImage->TexFormat != MESA_FORMAT_ETC1_RGB8); st_flush_bitmap_cache(st); @@ -2392,6 +2404,7 @@ st_CopyTexSubImage(struct gl_context *ctx, GLuint dims, st_invalidate_readpix_cache(st); assert(!_mesa_is_format_etc2(texImage->TexFormat) && + !_mesa_is_format_astc_2d(texImage->TexFormat) && texImage->TexFormat != MESA_FORMAT_ETC1_RGB8); if (!strb || !strb->surface || !stImage->pt) { diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c index b7330acfcca..c124793fa40 100644 --- a/src/mesa/state_tracker/st_context.c +++ b/src/mesa/state_tracker/st_context.c @@ -438,6 +438,9 @@ st_create_context_priv(struct gl_context *ctx, struct pipe_context *pipe, st->has_etc2 = screen->is_format_supported(screen, PIPE_FORMAT_ETC2_RGB8, PIPE_TEXTURE_2D, 0, PIPE_BIND_SAMPLER_VIEW); + st->has_astc_2d_ldr = + screen->is_format_supported(screen, PIPE_FORMAT_ASTC_4x4_SRGB, + 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); st->force_persample_in_shader = diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h index a4d52b40ae4..6b1b5633ecc 100644 --- a/src/mesa/state_tracker/st_context.h +++ b/src/mesa/state_tracker/st_context.h @@ -120,6 +120,7 @@ struct st_context boolean has_shader_model3; boolean has_etc1; boolean has_etc2; + boolean has_astc_2d_ldr; boolean prefer_blit_based_texture_transfer; boolean force_persample_in_shader; boolean has_shareable_shaders; diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c index aaf1aa10ac6..2ec47581c50 100644 --- a/src/mesa/state_tracker/st_extensions.c +++ b/src/mesa/state_tracker/st_extensions.c @@ -802,6 +802,11 @@ void st_init_extensions(struct pipe_screen *screen, PIPE_FORMAT_ASTC_12x10_SRGB, PIPE_FORMAT_ASTC_12x12_SRGB } }, + /* ASTC software fallback support. */ + { { o(KHR_texture_compression_astc_ldr) }, + { PIPE_FORMAT_R8G8B8A8_UNORM, + PIPE_FORMAT_R8G8B8A8_SRGB } }, + { { o(EXT_texture_shared_exponent) }, { PIPE_FORMAT_R9G9B9E5_FLOAT } }, diff --git a/src/mesa/state_tracker/st_format.c b/src/mesa/state_tracker/st_format.c index 45513e8683e..afe810f4d15 100644 --- a/src/mesa/state_tracker/st_format.c +++ b/src/mesa/state_tracker/st_format.c @@ -487,61 +487,117 @@ st_mesa_format_to_pipe_format(const struct st_context *st, has_bgra_srgb ? PIPE_FORMAT_B8G8R8A8_SRGB : PIPE_FORMAT_R8G8B8A8_SRGB; case MESA_FORMAT_RGBA_ASTC_4x4: + if (!st->has_astc_2d_ldr) + return PIPE_FORMAT_R8G8B8A8_UNORM; return PIPE_FORMAT_ASTC_4x4; case MESA_FORMAT_RGBA_ASTC_5x4: + if (!st->has_astc_2d_ldr) + return PIPE_FORMAT_R8G8B8A8_UNORM; return PIPE_FORMAT_ASTC_5x4; case MESA_FORMAT_RGBA_ASTC_5x5: + if (!st->has_astc_2d_ldr) + return PIPE_FORMAT_R8G8B8A8_UNORM; return PIPE_FORMAT_ASTC_5x5; case MESA_FORMAT_RGBA_ASTC_6x5: + if (!st->has_astc_2d_ldr) + return PIPE_FORMAT_R8G8B8A8_UNORM; return PIPE_FORMAT_ASTC_6x5; case MESA_FORMAT_RGBA_ASTC_6x6: + if (!st->has_astc_2d_ldr) + return PIPE_FORMAT_R8G8B8A8_UNORM; return PIPE_FORMAT_ASTC_6x6; case MESA_FORMAT_RGBA_ASTC_8x5: + if (!st->has_astc_2d_ldr) + return PIPE_FORMAT_R8G8B8A8_UNORM; return PIPE_FORMAT_ASTC_8x5; case MESA_FORMAT_RGBA_ASTC_8x6: + if (!st->has_astc_2d_ldr) + return PIPE_FORMAT_R8G8B8A8_UNORM; return PIPE_FORMAT_ASTC_8x6; case MESA_FORMAT_RGBA_ASTC_8x8: + if (!st->has_astc_2d_ldr) + return PIPE_FORMAT_R8G8B8A8_UNORM; return PIPE_FORMAT_ASTC_8x8; case MESA_FORMAT_RGBA_ASTC_10x5: + if (!st->has_astc_2d_ldr) + return PIPE_FORMAT_R8G8B8A8_UNORM; return PIPE_FORMAT_ASTC_10x5; case MESA_FORMAT_RGBA_ASTC_10x6: + if (!st->has_astc_2d_ldr) + return PIPE_FORMAT_R8G8B8A8_UNORM; return PIPE_FORMAT_ASTC_10x6; case MESA_FORMAT_RGBA_ASTC_10x8: + if (!st->has_astc_2d_ldr) + return PIPE_FORMAT_R8G8B8A8_UNORM; return PIPE_FORMAT_ASTC_10x8; case MESA_FORMAT_RGBA_ASTC_10x10: + if (!st->has_astc_2d_ldr) + return PIPE_FORMAT_R8G8B8A8_UNORM; return PIPE_FORMAT_ASTC_10x10; case MESA_FORMAT_RGBA_ASTC_12x10: + if (!st->has_astc_2d_ldr) + return PIPE_FORMAT_R8G8B8A8_UNORM; return PIPE_FORMAT_ASTC_12x10; case MESA_FORMAT_RGBA_ASTC_12x12: + if (!st->has_astc_2d_ldr) + return PIPE_FORMAT_R8G8B8A8_UNORM; return PIPE_FORMAT_ASTC_12x12; case MESA_FORMAT_SRGB8_ALPHA8_ASTC_4x4: + if (!st->has_astc_2d_ldr) + return PIPE_FORMAT_R8G8B8A8_SRGB; return PIPE_FORMAT_ASTC_4x4_SRGB; case MESA_FORMAT_SRGB8_ALPHA8_ASTC_5x4: + if (!st->has_astc_2d_ldr) + return PIPE_FORMAT_R8G8B8A8_SRGB; return PIPE_FORMAT_ASTC_5x4_SRGB; case MESA_FORMAT_SRGB8_ALPHA8_ASTC_5x5: + if (!st->has_astc_2d_ldr) + return PIPE_FORMAT_R8G8B8A8_SRGB; return PIPE_FORMAT_ASTC_5x5_SRGB; case MESA_FORMAT_SRGB8_ALPHA8_ASTC_6x5: + if (!st->has_astc_2d_ldr) + return PIPE_FORMAT_R8G8B8A8_SRGB; return PIPE_FORMAT_ASTC_6x5_SRGB; case MESA_FORMAT_SRGB8_ALPHA8_ASTC_6x6: + if (!st->has_astc_2d_ldr) + return PIPE_FORMAT_R8G8B8A8_SRGB; return PIPE_FORMAT_ASTC_6x6_SRGB; case MESA_FORMAT_SRGB8_ALPHA8_ASTC_8x5: + if (!st->has_astc_2d_ldr) + return PIPE_FORMAT_R8G8B8A8_SRGB; return PIPE_FORMAT_ASTC_8x5_SRGB; case MESA_FORMAT_SRGB8_ALPHA8_ASTC_8x6: + if (!st->has_astc_2d_ldr) + return PIPE_FORMAT_R8G8B8A8_SRGB; return PIPE_FORMAT_ASTC_8x6_SRGB; case MESA_FORMAT_SRGB8_ALPHA8_ASTC_8x8: + if (!st->has_astc_2d_ldr) + return PIPE_FORMAT_R8G8B8A8_SRGB; return PIPE_FORMAT_ASTC_8x8_SRGB; case MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x5: + if (!st->has_astc_2d_ldr) + return PIPE_FORMAT_R8G8B8A8_SRGB; return PIPE_FORMAT_ASTC_10x5_SRGB; case MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x6: + if (!st->has_astc_2d_ldr) + return PIPE_FORMAT_R8G8B8A8_SRGB; return PIPE_FORMAT_ASTC_10x6_SRGB; case MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x8: + if (!st->has_astc_2d_ldr) + return PIPE_FORMAT_R8G8B8A8_SRGB; return PIPE_FORMAT_ASTC_10x8_SRGB; case MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x10: + if (!st->has_astc_2d_ldr) + return PIPE_FORMAT_R8G8B8A8_SRGB; return PIPE_FORMAT_ASTC_10x10_SRGB; case MESA_FORMAT_SRGB8_ALPHA8_ASTC_12x10: + if (!st->has_astc_2d_ldr) + return PIPE_FORMAT_R8G8B8A8_SRGB; return PIPE_FORMAT_ASTC_12x10_SRGB; case MESA_FORMAT_SRGB8_ALPHA8_ASTC_12x12: + if (!st->has_astc_2d_ldr) + return PIPE_FORMAT_R8G8B8A8_SRGB; return PIPE_FORMAT_ASTC_12x12_SRGB; default: -- 2.30.2