diff options
Diffstat (limited to 'src/shader_recompiler')
| -rw-r--r-- | src/shader_recompiler/backend/glasm/emit_glasm.cpp | 3 | ||||
| -rw-r--r-- | src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp | 8 |
2 files changed, 10 insertions, 1 deletions
diff --git a/src/shader_recompiler/backend/glasm/emit_glasm.cpp b/src/shader_recompiler/backend/glasm/emit_glasm.cpp index 66e4aea04..f39b02f77 100644 --- a/src/shader_recompiler/backend/glasm/emit_glasm.cpp +++ b/src/shader_recompiler/backend/glasm/emit_glasm.cpp | |||
| @@ -286,7 +286,8 @@ void SetupOptions(const IR::Program& program, const Profile& profile, | |||
| 286 | if (info.uses_sparse_residency) { | 286 | if (info.uses_sparse_residency) { |
| 287 | header += "OPTION EXT_sparse_texture2;"; | 287 | header += "OPTION EXT_sparse_texture2;"; |
| 288 | } | 288 | } |
| 289 | if ((info.stores_viewport_index || info.stores_layer) && stage != Stage::Geometry) { | 289 | if (((info.stores_viewport_index || info.stores_layer) && stage != Stage::Geometry) || |
| 290 | info.stores_viewport_mask) { | ||
| 290 | if (profile.support_viewport_index_layer_non_geometry) { | 291 | if (profile.support_viewport_index_layer_non_geometry) { |
| 291 | header += "OPTION NV_viewport_array2;"; | 292 | header += "OPTION NV_viewport_array2;"; |
| 292 | } | 293 | } |
diff --git a/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp b/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp index 20b925877..bc195d248 100644 --- a/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp +++ b/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp | |||
| @@ -157,6 +157,14 @@ void EmitSetAttribute(EmitContext& ctx, IR::Attribute attr, ScalarF32 value, | |||
| 157 | "Viewport stored outside of geometry shader not supported by device"); | 157 | "Viewport stored outside of geometry shader not supported by device"); |
| 158 | } | 158 | } |
| 159 | break; | 159 | break; |
| 160 | case IR::Attribute::ViewportMask: | ||
| 161 | // NV_viewport_array2 is required to access result.viewportmask, regardless of shader stage. | ||
| 162 | if (ctx.profile.support_viewport_index_layer_non_geometry) { | ||
| 163 | ctx.Add("MOV.F result.viewportmask[0].x,{};", value); | ||
| 164 | } else { | ||
| 165 | LOG_WARNING(Shader_GLASM, "Device does not support storing to ViewportMask"); | ||
| 166 | } | ||
| 167 | break; | ||
| 160 | case IR::Attribute::PointSize: | 168 | case IR::Attribute::PointSize: |
| 161 | ctx.Add("MOV.F result.pointsize.x,{};", value); | 169 | ctx.Add("MOV.F result.pointsize.x,{};", value); |
| 162 | break; | 170 | break; |