diff --git a/src/shader_recompiler/backend/spirv/emit_spirv.cpp b/src/shader_recompiler/backend/spirv/emit_spirv.cpp index 5551ae39d..a585f3283 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv.cpp @@ -25,6 +25,7 @@ static constexpr spv::ExecutionMode GetInputPrimitiveType(AmdGpu::PrimitiveType case AmdGpu::PrimitiveType::LineList: return spv::ExecutionMode::InputLines; case AmdGpu::PrimitiveType::TriangleList: + case AmdGpu::PrimitiveType::TriangleStrip: return spv::ExecutionMode::Triangles; default: UNREACHABLE(); @@ -322,6 +323,7 @@ std::vector EmitSPIRV(const Profile& profile, const RuntimeInfo& runtime_in break; } PatchPhiNodes(program, ctx); + binding.user_data += program.info.ud_mask.NumRegs(); return ctx.Assemble(); } diff --git a/src/shader_recompiler/frontend/copy_shader.cpp b/src/shader_recompiler/frontend/copy_shader.cpp index 810176326..a194aec95 100644 --- a/src/shader_recompiler/frontend/copy_shader.cpp +++ b/src/shader_recompiler/frontend/copy_shader.cpp @@ -35,7 +35,7 @@ CopyShaderData ParseCopyShader(const std::span& code) { for (int i = 0; i < inst.src_count; ++i) { const auto ofs = offsets[inst.src[i].code]; if (ofs != -1) { - data.attr_map[ofs] = semantic; + data.attr_map[ofs] = {semantic, i}; if (semantic > last_attr) { last_attr = semantic; } diff --git a/src/shader_recompiler/frontend/copy_shader.h b/src/shader_recompiler/frontend/copy_shader.h index ceaa716ab..ca3e1ac3e 100644 --- a/src/shader_recompiler/frontend/copy_shader.h +++ b/src/shader_recompiler/frontend/copy_shader.h @@ -12,7 +12,7 @@ namespace Shader { struct CopyShaderData { - std::unordered_map attr_map; + std::unordered_map> attr_map; u32 num_attrs{0}; }; diff --git a/src/shader_recompiler/ir/passes/ring_access_elimination.cpp b/src/shader_recompiler/ir/passes/ring_access_elimination.cpp index ccca762bf..857921b1f 100644 --- a/src/shader_recompiler/ir/passes/ring_access_elimination.cpp +++ b/src/shader_recompiler/ir/passes/ring_access_elimination.cpp @@ -83,15 +83,15 @@ void RingAccessElimination(const IR::Program& program, const RuntimeInfo& runtim const auto data = ir.BitCast(IR::U32{inst.Arg(2)}); const auto comp_ofs = runtime_info.gs_info.output_vertices * 4u; const auto output_size = comp_ofs * runtime_info.gs_info.out_vertex_data_size; - const auto comp = (offset / comp_ofs) % 4; const auto vc_read_ofs = (((offset / comp_ofs) * comp_ofs) % output_size) * 16u; - const auto& attr = runtime_info.gs_info.copy_data.attr_map.find(vc_read_ofs); - ASSERT(attr != runtime_info.gs_info.copy_data.attr_map.cend()); + const auto& it = runtime_info.gs_info.copy_data.attr_map.find(vc_read_ofs); + ASSERT(it != runtime_info.gs_info.copy_data.attr_map.cend()); + const auto& [attr, comp] = it->second; inst.ReplaceOpcode(IR::Opcode::SetAttribute); inst.ClearArgs(); - inst.SetArg(0, IR::Value{attr->second}); + inst.SetArg(0, IR::Value{attr}); inst.SetArg(1, data); inst.SetArg(2, ir.Imm32(comp)); break; diff --git a/src/shader_recompiler/runtime_info.h b/src/shader_recompiler/runtime_info.h index 45cc1bacc..8c0838c96 100644 --- a/src/shader_recompiler/runtime_info.h +++ b/src/shader_recompiler/runtime_info.h @@ -73,10 +73,10 @@ struct VertexRuntimeInfo { static constexpr auto GsMaxOutputStreams = 4u; using GsOutputPrimTypes = std::array; struct GeometryRuntimeInfo { - u32 num_invocations; - u32 output_vertices; - u32 in_vertex_data_size; - u32 out_vertex_data_size; + u32 num_invocations{}; + u32 output_vertices{}; + u32 in_vertex_data_size{}; + u32 out_vertex_data_size{}; AmdGpu::PrimitiveType in_primitive; GsOutputPrimTypes out_primitive; CopyShaderData copy_data; @@ -157,6 +157,10 @@ struct RuntimeInfo { return vs_info == other.vs_info; case Stage::Compute: return cs_info == other.cs_info; + case Stage::Export: + return es_info == other.es_info; + case Stage::Geometry: + return gs_info == other.gs_info; default: return true; } diff --git a/src/video_core/renderer_vulkan/vk_instance.cpp b/src/video_core/renderer_vulkan/vk_instance.cpp index 3f874ff88..7a1d784fa 100644 --- a/src/video_core/renderer_vulkan/vk_instance.cpp +++ b/src/video_core/renderer_vulkan/vk_instance.cpp @@ -322,6 +322,7 @@ bool Instance::CreateDevice() { .geometryShader = features.geometryShader, .logicOp = features.logicOp, .depthBiasClamp = features.depthBiasClamp, + .fillModeNonSolid = features.fillModeNonSolid, .multiViewport = features.multiViewport, .samplerAnisotropy = features.samplerAnisotropy, .vertexPipelineStoresAndAtomics = features.vertexPipelineStoresAndAtomics,