diff --git a/src/shader_recompiler/frontend/translate/scalar_alu.cpp b/src/shader_recompiler/frontend/translate/scalar_alu.cpp index 7f7c9d7e..50a550d4 100644 --- a/src/shader_recompiler/frontend/translate/scalar_alu.cpp +++ b/src/shader_recompiler/frontend/translate/scalar_alu.cpp @@ -96,6 +96,8 @@ void Translator::EmitScalarAlu(const GcnInst& inst) { return S_MAX_U32(inst); case Opcode::S_WQM_B64: break; + case Opcode::S_CMPK_EQ_U32: + return S_CMPK_EQ_U32(inst); default: LogMissingOpcode(inst); } @@ -468,4 +470,11 @@ void Translator::S_MIN_U32(const GcnInst& inst) { ir.SetScc(ir.IEqual(result, src0)); } +void Translator::S_CMPK_EQ_U32(const GcnInst& inst) { + const s32 simm16 = inst.control.sopk.simm; + const IR::U32 src0{GetSrc(inst.src[0])}; + const IR::U32 src1{ir.Imm32(simm16)}; + ir.SetScc(ir.IEqual(src0, src1)); +} + } // namespace Shader::Gcn diff --git a/src/shader_recompiler/frontend/translate/translate.h b/src/shader_recompiler/frontend/translate/translate.h index 009acabd..6de5e367 100644 --- a/src/shader_recompiler/frontend/translate/translate.h +++ b/src/shader_recompiler/frontend/translate/translate.h @@ -98,6 +98,7 @@ public: void S_ADDK_I32(const GcnInst& inst); void S_MAX_U32(const GcnInst& inst); void S_MIN_U32(const GcnInst& inst); + void S_CMPK_EQ_U32(const GcnInst& inst); // Scalar Memory void S_LOAD_DWORD(int num_dwords, const GcnInst& inst); diff --git a/src/shader_recompiler/frontend/translate/vector_alu.cpp b/src/shader_recompiler/frontend/translate/vector_alu.cpp index 0216238a..99543a20 100644 --- a/src/shader_recompiler/frontend/translate/vector_alu.cpp +++ b/src/shader_recompiler/frontend/translate/vector_alu.cpp @@ -307,6 +307,8 @@ void Translator::EmitVectorAlu(const GcnInst& inst) { return V_MBCNT_U32_B32(true, inst); case Opcode::V_MBCNT_HI_U32_B32: return V_MBCNT_U32_B32(false, inst); + case Opcode::V_NOP: + return; default: LogMissingOpcode(inst); } diff --git a/src/video_core/amdgpu/liverpool.cpp b/src/video_core/amdgpu/liverpool.cpp index 89ab7fe4..5b3db603 100644 --- a/src/video_core/amdgpu/liverpool.cpp +++ b/src/video_core/amdgpu/liverpool.cpp @@ -455,6 +455,9 @@ Liverpool::Task Liverpool::ProcessGraphics(std::span dcb, std::span(opcode), count); diff --git a/src/video_core/renderer_vulkan/liverpool_to_vk.cpp b/src/video_core/renderer_vulkan/liverpool_to_vk.cpp index c42e4f60..025f311d 100644 --- a/src/video_core/renderer_vulkan/liverpool_to_vk.cpp +++ b/src/video_core/renderer_vulkan/liverpool_to_vk.cpp @@ -320,6 +320,7 @@ std::span GetAllFormats() { vk::Format::eR8G8Uint, vk::Format::eR8G8Unorm, vk::Format::eR8Sint, + vk::Format::eR8Snorm, vk::Format::eR8Uint, vk::Format::eR8Unorm, vk::Format::eR8Srgb, diff --git a/src/video_core/texture_cache/image_view.cpp b/src/video_core/texture_cache/image_view.cpp index 9f6ec5c4..08be6bdc 100644 --- a/src/video_core/texture_cache/image_view.cpp +++ b/src/video_core/texture_cache/image_view.cpp @@ -59,6 +59,9 @@ vk::Format TrySwizzleFormat(vk::Format format, u32 dst_sel) { if (format == vk::Format::eR8G8B8A8Unorm && dst_sel == 0b111100101110) { return vk::Format::eB8G8R8A8Unorm; } + if (format == vk::Format::eR8G8B8A8Srgb && dst_sel == 0b111100101110) { + return vk::Format::eB8G8R8A8Srgb; + } return format; }