summaryrefslogtreecommitdiffstats
path: root/src/shader_recompiler/ir_opt
diff options
context:
space:
mode:
Diffstat (limited to 'src/shader_recompiler/ir_opt')
-rw-r--r--src/shader_recompiler/ir_opt/collect_shader_info_pass.cpp1
-rw-r--r--src/shader_recompiler/ir_opt/constant_propagation_pass.cpp23
2 files changed, 24 insertions, 0 deletions
diff --git a/src/shader_recompiler/ir_opt/collect_shader_info_pass.cpp b/src/shader_recompiler/ir_opt/collect_shader_info_pass.cpp
index 1e476d83d..a78c469be 100644
--- a/src/shader_recompiler/ir_opt/collect_shader_info_pass.cpp
+++ b/src/shader_recompiler/ir_opt/collect_shader_info_pass.cpp
@@ -389,6 +389,7 @@ void VisitUsages(Info& info, IR::Inst& inst) {
info.uses_demote_to_helper_invocation = true;
break;
case IR::Opcode::GetAttribute:
+ case IR::Opcode::GetAttributeU32:
info.loads.mask[static_cast<size_t>(inst.Arg(0).Attribute())] = true;
break;
case IR::Opcode::SetAttribute:
diff --git a/src/shader_recompiler/ir_opt/constant_propagation_pass.cpp b/src/shader_recompiler/ir_opt/constant_propagation_pass.cpp
index d089fdd12..c134a12bc 100644
--- a/src/shader_recompiler/ir_opt/constant_propagation_pass.cpp
+++ b/src/shader_recompiler/ir_opt/constant_propagation_pass.cpp
@@ -505,6 +505,29 @@ void FoldBitCast(IR::Inst& inst, IR::Opcode reverse) {
return;
}
}
+ if constexpr (op == IR::Opcode::BitCastU32F32) {
+ // Workaround for new NVIDIA driver bug, where:
+ // uint attr = ftou(itof(gl_InstanceID));
+ // always returned 0.
+ // We can instead manually optimize this and work around the driver bug:
+ // uint attr = uint(gl_InstanceID);
+ if (arg_inst->GetOpcode() == IR::Opcode::GetAttribute) {
+ const IR::Attribute attr{arg_inst->Arg(0).Attribute()};
+ switch (attr) {
+ case IR::Attribute::PrimitiveId:
+ case IR::Attribute::InstanceId:
+ case IR::Attribute::VertexId:
+ break;
+ default:
+ return;
+ }
+ // Replace the bitcasts with an integer attribute get
+ inst.ReplaceOpcode(IR::Opcode::GetAttributeU32);
+ inst.SetArg(0, arg_inst->Arg(0));
+ inst.SetArg(1, arg_inst->Arg(1));
+ return;
+ }
+ }
}
void FoldInverseFunc(IR::Inst& inst, IR::Opcode reverse) {