From 1735053de5fe77413df63a68382a9e381a525ee7 Mon Sep 17 00:00:00 2001 From: Erik Faye-Lund Date: Wed, 10 Aug 2022 08:45:16 +0200 Subject: [PATCH] mesa/st: implement fallback for rgtc Reviewed-by: Alyssa Rosenzweig Acked-by: Eric Engestrom Tested-by: Eric Engestrom Part-of: --- src/mesa/state_tracker/st_cb_texture.c | 9 +++++++++ src/mesa/state_tracker/st_format.c | 15 +++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c index 2ebe8bbbb0a..aab0c1320a4 100644 --- a/src/mesa/state_tracker/st_cb_texture.c +++ b/src/mesa/state_tracker/st_cb_texture.c @@ -46,6 +46,7 @@ #include "main/texcompress_astc.h" #include "main/texcompress_bptc.h" #include "main/texcompress_etc.h" +#include "main/texcompress_rgtc.h" #include "main/texcompress_s3tc.h" #include "main/texgetimage.h" #include "main/teximage.h" @@ -442,6 +443,8 @@ st_compressed_format_fallback(struct st_context *st, mesa_format format) return !st->has_etc2; case MESA_FORMAT_LAYOUT_S3TC: return !st->has_s3tc; + case MESA_FORMAT_LAYOUT_RGTC: + return !st->has_rgtc; case MESA_FORMAT_LAYOUT_BPTC: return !st->has_bptc; case MESA_FORMAT_LAYOUT_ASTC: @@ -644,6 +647,12 @@ st_UnmapTextureImage(struct gl_context *ctx, itransfer->temp_stride, transfer->box.width, transfer->box.height, texImage->TexFormat); + } else if (_mesa_is_format_rgtc(texImage->TexFormat)) { + _mesa_unpack_rgtc(map, transfer->stride, + itransfer->temp_data, + itransfer->temp_stride, + transfer->box.width, transfer->box.height, + texImage->TexFormat); } else if (_mesa_is_format_bptc(texImage->TexFormat)) { _mesa_unpack_bptc(map, transfer->stride, itransfer->temp_data, diff --git a/src/mesa/state_tracker/st_format.c b/src/mesa/state_tracker/st_format.c index 89ff5124081..041d2c89a36 100644 --- a/src/mesa/state_tracker/st_format.c +++ b/src/mesa/state_tracker/st_format.c @@ -124,6 +124,21 @@ st_mesa_format_to_pipe_format(const struct st_context *st, PIPE_FORMAT_R8G8B8A8_UNORM; } + if ((_mesa_is_format_rgtc(mesaFormat) && !st->has_rgtc)) { + switch (mesaFormat) { + case MESA_FORMAT_R_RGTC1_UNORM: + return PIPE_FORMAT_R8_UNORM; + case MESA_FORMAT_R_RGTC1_SNORM: + return PIPE_FORMAT_R8_SNORM; + case MESA_FORMAT_RG_RGTC2_UNORM: + return PIPE_FORMAT_R8G8_UNORM; + case MESA_FORMAT_RG_RGTC2_SNORM: + return PIPE_FORMAT_R8G8_SNORM; + default: + unreachable("Unknown RGTC format"); + } + } + if (_mesa_is_format_bptc(mesaFormat) && !st->has_bptc) { switch (mesaFormat) { case MESA_FORMAT_BPTC_RGB_SIGNED_FLOAT: