diff --git a/src/compiler/nir/nir_constant_expressions.py b/src/compiler/nir/nir_constant_expressions.py index 0d65981d7da..777baf746cc 100644 --- a/src/compiler/nir/nir_constant_expressions.py +++ b/src/compiler/nir/nir_constant_expressions.py @@ -284,6 +284,15 @@ unpack_unorm_1x16(uint16_t u) return (float) u / 65535.0f; } +/** + * Evaluate one component of unpackSscaled4x8. + */ +static float +unpack_sscaled_1x8(uint8_t u) +{ + return CLAMP((int8_t) u, -128.0f, +127.0f); +} + /** * Evaluate one component of packHalf2x16. */ diff --git a/src/compiler/nir/nir_lower_alu_width.c b/src/compiler/nir/nir_lower_alu_width.c index a1ed894d7ac..31d92c91ca2 100644 --- a/src/compiler/nir/nir_lower_alu_width.c +++ b/src/compiler/nir/nir_lower_alu_width.c @@ -279,9 +279,12 @@ lower_alu_instr_width(nir_builder *b, nir_instr *instr, void *_data) return NULL; case nir_op_unpack_snorm_8_8: + case nir_op_unpack_sscaled_8_8: case nir_op_unpack_unorm_8_8: case nir_op_unpack_snorm_8_8_8: + case nir_op_unpack_sscaled_8_8_8: case nir_op_unpack_unorm_8_8_8: + case nir_op_unpack_sscaled_8_8_8_8: case nir_op_unpack_unorm_10_10_10_2: case nir_op_unpack_float_11_11_10: return NULL; diff --git a/src/compiler/nir/nir_opcodes.py b/src/compiler/nir/nir_opcodes.py index 2733a12325e..299e309de63 100644 --- a/src/compiler/nir/nir_opcodes.py +++ b/src/compiler/nir/nir_opcodes.py @@ -1883,14 +1883,19 @@ dst.w = unpack_{fmt}_1x{a}((src0.x >> {r + g + b}) & ((1u << {a}) - 1)); """) unpack_r("snorm", 8) +unpack_r("sscaled", 8) unpack_r("unorm", 8) unpack_rg("snorm", 8, 8) +unpack_rg("sscaled", 8, 8) unpack_rg("unorm", 8, 8) unpack_rgb("snorm", 8, 8, 8) +unpack_rgb("sscaled", 8, 8, 8) unpack_rgb("unorm", 8, 8, 8) +unpack_rgba("sscaled", 8, 8, 8, 8) + unpack_r("snorm", 16) unpack_r("unorm", 16) diff --git a/src/imagination/pco/pco_nir_pvfio.c b/src/imagination/pco/pco_nir_pvfio.c index d4331d0072a..d81c7c399f8 100644 --- a/src/imagination/pco/pco_nir_pvfio.c +++ b/src/imagination/pco/pco_nir_pvfio.c @@ -401,6 +401,26 @@ static nir_def *unpack_from_format(nir_builder *b, unpacked = nir_unpack_snorm_4x8(b, input); break; + case PIPE_FORMAT_R8_SSCALED: + assert(dest_type == nir_type_float); + unpacked = nir_unpack_sscaled_8(b, input); + break; + + case PIPE_FORMAT_R8G8_SSCALED: + assert(dest_type == nir_type_float); + unpacked = nir_unpack_sscaled_8_8(b, input); + break; + + case PIPE_FORMAT_R8G8B8_SSCALED: + assert(dest_type == nir_type_float); + unpacked = nir_unpack_sscaled_8_8_8(b, input); + break; + + case PIPE_FORMAT_R8G8B8A8_SSCALED: + assert(dest_type == nir_type_float); + unpacked = nir_unpack_sscaled_8_8_8_8(b, input); + break; + case PIPE_FORMAT_R8G8B8A8_UINT: unpacked = nir_vector_insert_imm( b, diff --git a/src/imagination/pco/pco_trans_nir.c b/src/imagination/pco/pco_trans_nir.c index fc6b2a4ce55..58b93a4c25a 100644 --- a/src/imagination/pco/pco_trans_nir.c +++ b/src/imagination/pco/pco_trans_nir.c @@ -2249,6 +2249,38 @@ static pco_instr *trans_alu(trans_ctx *tctx, nir_alu_instr *alu) .scale = true); break; + case nir_op_unpack_sscaled_8: + instr = pco_unpck(&tctx->b, + dest, + pco_ref_elem(src[0], 0), + .rpt = 1, + .pck_fmt = PCO_PCK_FMT_S8888); + break; + + case nir_op_unpack_sscaled_8_8: + instr = pco_unpck(&tctx->b, + dest, + pco_ref_elem(src[0], 0), + .rpt = 2, + .pck_fmt = PCO_PCK_FMT_S8888); + break; + + case nir_op_unpack_sscaled_8_8_8: + instr = pco_unpck(&tctx->b, + dest, + pco_ref_elem(src[0], 0), + .rpt = 3, + .pck_fmt = PCO_PCK_FMT_S8888); + break; + + case nir_op_unpack_sscaled_8_8_8_8: + instr = pco_unpck(&tctx->b, + dest, + pco_ref_elem(src[0], 0), + .rpt = 4, + .pck_fmt = PCO_PCK_FMT_S8888); + break; + case nir_op_pack_unorm_8: instr = pco_pck(&tctx->b, dest,