From 5b6f9f78202e1f2f0ed8b162d49a28e9b79a8883 Mon Sep 17 00:00:00 2001 From: Frodo Baggins Date: Fri, 11 Jul 2025 20:26:35 -0700 Subject: [PATCH] also need to zero extend u8/u16 to u32 result --- .../backend/spirv/emit_spirv_convert.cpp | 2 -- .../frontend/translate/vector_memory.cpp | 18 ++++++++---------- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_convert.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_convert.cpp index 9fb9d44e2..d4ff3ff69 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_convert.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_convert.cpp @@ -272,14 +272,12 @@ Id EmitConvertU32U8(EmitContext& ctx, Id value) { } Id EmitConvertS32S8(EmitContext& ctx, Id value) { - ASSERT(ctx.profile.support_int8); // TODO const Id as_s8 = ctx.OpBitcast(ctx.S8, value); const Id as_s32 = ctx.OpSConvert(ctx.S32[1], as_s8); return ctx.OpBitcast(ctx.U32[1], as_s32); } Id EmitConvertS32S16(EmitContext& ctx, Id value) { - ASSERT(ctx.profile.support_int16); // TODO const Id as_s16 = ctx.OpBitcast(ctx.S16, value); const Id as_s32 = ctx.OpSConvert(ctx.S32[1], as_s16); return ctx.OpBitcast(ctx.U32[1], as_s32); diff --git a/src/shader_recompiler/frontend/translate/vector_memory.cpp b/src/shader_recompiler/frontend/translate/vector_memory.cpp index f4f0b994e..ec9bc200d 100644 --- a/src/shader_recompiler/frontend/translate/vector_memory.cpp +++ b/src/shader_recompiler/frontend/translate/vector_memory.cpp @@ -258,18 +258,16 @@ void Translator::BUFFER_LOAD(u32 num_dwords, bool is_inst_typed, bool is_buffer_ } else { IR::Value value; switch (scalar_width) { - case 8: - value = ir.LoadBufferU8(handle, address, buffer_info); - if (is_signed) { - value = ir.SConvert(32, IR::U8{value}); - } + case 8: { + IR::U8 byte_val = ir.LoadBufferU8(handle, address, buffer_info); + value = is_signed ? ir.SConvert(32, byte_val) : ir.UConvert(32, byte_val); break; - case 16: - value = ir.LoadBufferU16(handle, address, buffer_info); - if (is_signed) { - value = ir.SConvert(32, IR::U16{value}); - } + } + case 16: { + IR::U16 short_val = ir.LoadBufferU16(handle, address, buffer_info); + value = is_signed ? ir.SConvert(32, short_val) : ir.UConvert(32, short_val); break; + } case 32: value = ir.LoadBufferU32(num_dwords, handle, address, buffer_info); break;