diff options
| author | 2022-01-03 00:39:59 +0100 | |
|---|---|---|
| committer | 2022-01-03 00:39:59 +0100 | |
| commit | ae7da0b12dd8aef115d741eb60d00ddf8ed357df (patch) | |
| tree | 09d269fe3838d1f8aa5672d2af06cbeb9b45d81f /src/shader_recompiler/backend/spirv | |
| parent | Merge pull request #7659 from ameerj/overlap-overflow (diff) | |
| parent | glsl: Add boolean reference workaround (diff) | |
| download | yuzu-ae7da0b12dd8aef115d741eb60d00ddf8ed357df.tar.gz yuzu-ae7da0b12dd8aef115d741eb60d00ddf8ed357df.tar.xz yuzu-ae7da0b12dd8aef115d741eb60d00ddf8ed357df.zip | |
Merge pull request #7629 from ameerj/nv-driver-fixes
shaders: Add fixes for NVIDIA drivers 495+
Diffstat (limited to 'src/shader_recompiler/backend/spirv')
| -rw-r--r-- | src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp | 25 | ||||
| -rw-r--r-- | src/shader_recompiler/backend/spirv/emit_spirv_instructions.h | 1 |
2 files changed, 26 insertions, 0 deletions
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp index 14f470812..8ea730c80 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp | |||
| @@ -355,6 +355,31 @@ Id EmitGetAttribute(EmitContext& ctx, IR::Attribute attr, Id vertex) { | |||
| 355 | } | 355 | } |
| 356 | } | 356 | } |
| 357 | 357 | ||
| 358 | Id EmitGetAttributeU32(EmitContext& ctx, IR::Attribute attr, Id) { | ||
| 359 | switch (attr) { | ||
| 360 | case IR::Attribute::PrimitiveId: | ||
| 361 | return ctx.OpLoad(ctx.U32[1], ctx.primitive_id); | ||
| 362 | case IR::Attribute::InstanceId: | ||
| 363 | if (ctx.profile.support_vertex_instance_id) { | ||
| 364 | return ctx.OpLoad(ctx.U32[1], ctx.instance_id); | ||
| 365 | } else { | ||
| 366 | const Id index{ctx.OpLoad(ctx.U32[1], ctx.instance_index)}; | ||
| 367 | const Id base{ctx.OpLoad(ctx.U32[1], ctx.base_instance)}; | ||
| 368 | return ctx.OpISub(ctx.U32[1], index, base); | ||
| 369 | } | ||
| 370 | case IR::Attribute::VertexId: | ||
| 371 | if (ctx.profile.support_vertex_instance_id) { | ||
| 372 | return ctx.OpLoad(ctx.U32[1], ctx.vertex_id); | ||
| 373 | } else { | ||
| 374 | const Id index{ctx.OpLoad(ctx.U32[1], ctx.vertex_index)}; | ||
| 375 | const Id base{ctx.OpLoad(ctx.U32[1], ctx.base_vertex)}; | ||
| 376 | return ctx.OpISub(ctx.U32[1], index, base); | ||
| 377 | } | ||
| 378 | default: | ||
| 379 | throw NotImplementedException("Read U32 attribute {}", attr); | ||
| 380 | } | ||
| 381 | } | ||
| 382 | |||
| 358 | void EmitSetAttribute(EmitContext& ctx, IR::Attribute attr, Id value, [[maybe_unused]] Id vertex) { | 383 | void EmitSetAttribute(EmitContext& ctx, IR::Attribute attr, Id value, [[maybe_unused]] Id vertex) { |
| 359 | const std::optional<OutAttr> output{OutputAttrPointer(ctx, attr)}; | 384 | const std::optional<OutAttr> output{OutputAttrPointer(ctx, attr)}; |
| 360 | if (!output) { | 385 | if (!output) { |
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h b/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h index 6cd22dd3e..887112deb 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h +++ b/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h | |||
| @@ -53,6 +53,7 @@ Id EmitGetCbufU32(EmitContext& ctx, const IR::Value& binding, const IR::Value& o | |||
| 53 | Id EmitGetCbufF32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset); | 53 | Id EmitGetCbufF32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset); |
| 54 | Id EmitGetCbufU32x2(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset); | 54 | Id EmitGetCbufU32x2(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset); |
| 55 | Id EmitGetAttribute(EmitContext& ctx, IR::Attribute attr, Id vertex); | 55 | Id EmitGetAttribute(EmitContext& ctx, IR::Attribute attr, Id vertex); |
| 56 | Id EmitGetAttributeU32(EmitContext& ctx, IR::Attribute attr, Id vertex); | ||
| 56 | void EmitSetAttribute(EmitContext& ctx, IR::Attribute attr, Id value, Id vertex); | 57 | void EmitSetAttribute(EmitContext& ctx, IR::Attribute attr, Id value, Id vertex); |
| 57 | Id EmitGetAttributeIndexed(EmitContext& ctx, Id offset, Id vertex); | 58 | Id EmitGetAttributeIndexed(EmitContext& ctx, Id offset, Id vertex); |
| 58 | void EmitSetAttributeIndexed(EmitContext& ctx, Id offset, Id value, Id vertex); | 59 | void EmitSetAttributeIndexed(EmitContext& ctx, Id offset, Id value, Id vertex); |