Module: Mesa Branch: main Commit: 4f4e28face6af5d93a5120d5c8701467790688ac URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=4f4e28face6af5d93a5120d5c8701467790688ac
Author: Erik Faye-Lund <[email protected]> Date: Wed Aug 10 08:45:16 2022 +0200 mesa/st: implement fallback for bptc Acked-by: Marek Olšák <[email protected]> Acked-by: Soroush Kashani <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18012> --- src/mesa/state_tracker/st_cb_texture.c | 9 +++++++++ src/mesa/state_tracker/st_format.c | 11 +++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c index f05a9788302..b369495e1f2 100644 --- a/src/mesa/state_tracker/st_cb_texture.c +++ b/src/mesa/state_tracker/st_cb_texture.c @@ -44,6 +44,7 @@ #include "main/pixeltransfer.h" #include "main/texcompress.h" #include "main/texcompress_astc.h" +#include "main/texcompress_bptc.h" #include "main/texcompress_etc.h" #include "main/texgetimage.h" #include "main/teximage.h" @@ -438,6 +439,8 @@ st_compressed_format_fallback(struct st_context *st, mesa_format format) return !st->has_etc1; case MESA_FORMAT_LAYOUT_ETC2: return !st->has_etc2; + case MESA_FORMAT_LAYOUT_BPTC: + return !st->has_bptc; case MESA_FORMAT_LAYOUT_ASTC: return st_astc_format_fallback(st, format); default: @@ -618,6 +621,12 @@ st_UnmapTextureImage(struct gl_context *ctx, itransfer->temp_stride, transfer->box.width, transfer->box.height, texImage->TexFormat); + } else if (_mesa_is_format_bptc(texImage->TexFormat)) { + _mesa_unpack_bptc(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"); } diff --git a/src/mesa/state_tracker/st_format.c b/src/mesa/state_tracker/st_format.c index f951c81cf95..c3cbefe3de0 100644 --- a/src/mesa/state_tracker/st_format.c +++ b/src/mesa/state_tracker/st_format.c @@ -119,6 +119,17 @@ st_mesa_format_to_pipe_format(const struct st_context *st, } } + if (_mesa_is_format_bptc(mesaFormat) && !st->has_bptc) { + switch (mesaFormat) { + case MESA_FORMAT_BPTC_RGB_SIGNED_FLOAT: + case MESA_FORMAT_BPTC_RGB_UNSIGNED_FLOAT: + return PIPE_FORMAT_R32G32B32X32_FLOAT; + default: + return _mesa_is_format_srgb(mesaFormat) ? PIPE_FORMAT_R8G8B8A8_SRGB : + PIPE_FORMAT_R8G8B8A8_UNORM; + } + } + return mesaFormat; }
