summaryrefslogtreecommitdiffstats
path: root/src/shader_recompiler
diff options
context:
space:
mode:
authorReinUsesLisp <reinuseslisp@airmail.cc>2021-04-13 03:26:15 +0200
committerameerj <52414509+ameerj@users.noreply.github.com>2021-07-23 03:51:27 +0200
commitc070991def83e9bbfd599b03a6d52eb2bd4131c9 (patch)
tree5c1909cb0b7aee8001b658e61f31620b1e52d580 /src/shader_recompiler
parentshader: Add constant propagation for *&^| binary operations (diff)
downloadyuzu-c070991def83e9bbfd599b03a6d52eb2bd4131c9.tar
yuzu-c070991def83e9bbfd599b03a6d52eb2bd4131c9.tar.gz
yuzu-c070991def83e9bbfd599b03a6d52eb2bd4131c9.tar.bz2
yuzu-c070991def83e9bbfd599b03a6d52eb2bd4131c9.tar.lz
yuzu-c070991def83e9bbfd599b03a6d52eb2bd4131c9.tar.xz
yuzu-c070991def83e9bbfd599b03a6d52eb2bd4131c9.tar.zst
yuzu-c070991def83e9bbfd599b03a6d52eb2bd4131c9.zip
Diffstat (limited to 'src/shader_recompiler')
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv_special.cpp28
1 files changed, 18 insertions, 10 deletions
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_special.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_special.cpp
index 6c8fcd5a5..fee740c08 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv_special.cpp
+++ b/src/shader_recompiler/backend/spirv/emit_spirv_special.cpp
@@ -15,6 +15,13 @@ void ConvertDepthMode(EmitContext& ctx) {
const Id vector{ctx.OpCompositeInsert(ctx.F32[4], screen_depth, position, 2u)};
ctx.OpStore(ctx.output_position, vector);
}
+
+void SetFixedPipelinePointSize(EmitContext& ctx) {
+ if (ctx.profile.fixed_state_point_size) {
+ const float point_size{*ctx.profile.fixed_state_point_size};
+ ctx.OpStore(ctx.output_point_size, ctx.Constant(ctx.F32[1], point_size));
+ }
+}
} // Anonymous namespace
void EmitPrologue(EmitContext& ctx) {
@@ -28,10 +35,9 @@ void EmitPrologue(EmitContext& ctx) {
ctx.OpStore(generic_id, default_vector);
}
}
- if (ctx.profile.fixed_state_point_size) {
- const float point_size{*ctx.profile.fixed_state_point_size};
- ctx.OpStore(ctx.output_point_size, ctx.Constant(ctx.F32[1], point_size));
- }
+ }
+ if (ctx.stage == Stage::VertexB || ctx.stage == Stage::Geometry) {
+ SetFixedPipelinePointSize(ctx);
}
}
@@ -45,21 +51,23 @@ void EmitEmitVertex(EmitContext& ctx, const IR::Value& stream) {
if (ctx.profile.convert_depth_mode) {
ConvertDepthMode(ctx);
}
- if (!stream.IsImmediate()) {
+ if (stream.IsImmediate()) {
+ ctx.OpEmitStreamVertex(ctx.Def(stream));
+ } else {
// LOG_WARNING(..., "EmitVertex's stream is not constant");
ctx.OpEmitStreamVertex(ctx.u32_zero_value);
- return;
}
- ctx.OpEmitStreamVertex(ctx.Def(stream));
+ // Restore fixed pipeline point size after emitting the vertex
+ SetFixedPipelinePointSize(ctx);
}
void EmitEndPrimitive(EmitContext& ctx, const IR::Value& stream) {
- if (!stream.IsImmediate()) {
+ if (stream.IsImmediate()) {
+ ctx.OpEndStreamPrimitive(ctx.Def(stream));
+ } else {
// LOG_WARNING(..., "EndPrimitive's stream is not constant");
ctx.OpEndStreamPrimitive(ctx.u32_zero_value);
- return;
}
- ctx.OpEndStreamPrimitive(ctx.Def(stream));
}
} // namespace Shader::Backend::SPIRV