diff options
Diffstat (limited to 'src/shader_recompiler/backend')
| -rw-r--r-- | src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp | 16 |
1 files changed, 9 insertions, 7 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 23a74f966..f3de577f6 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 | |||
| @@ -211,7 +211,7 @@ Id EmitGetAttribute(EmitContext& ctx, IR::Attribute attr, Id vertex) { | |||
| 211 | } | 211 | } |
| 212 | switch (attr) { | 212 | switch (attr) { |
| 213 | case IR::Attribute::PrimitiveId: | 213 | case IR::Attribute::PrimitiveId: |
| 214 | return ctx.OpLoad(ctx.U32[1], ctx.primitive_id); | 214 | return ctx.OpBitcast(ctx.F32[1], ctx.OpLoad(ctx.U32[1], ctx.primitive_id)); |
| 215 | case IR::Attribute::PositionX: | 215 | case IR::Attribute::PositionX: |
| 216 | case IR::Attribute::PositionY: | 216 | case IR::Attribute::PositionY: |
| 217 | case IR::Attribute::PositionZ: | 217 | case IR::Attribute::PositionZ: |
| @@ -220,17 +220,19 @@ Id EmitGetAttribute(EmitContext& ctx, IR::Attribute attr, Id vertex) { | |||
| 220 | ctx.F32[1], AttrPointer(ctx, ctx.input_f32, vertex, ctx.input_position, element_id())); | 220 | ctx.F32[1], AttrPointer(ctx, ctx.input_f32, vertex, ctx.input_position, element_id())); |
| 221 | case IR::Attribute::InstanceId: | 221 | case IR::Attribute::InstanceId: |
| 222 | if (ctx.profile.support_vertex_instance_id) { | 222 | if (ctx.profile.support_vertex_instance_id) { |
| 223 | return ctx.OpLoad(ctx.U32[1], ctx.instance_id); | 223 | return ctx.OpBitcast(ctx.F32[1], ctx.OpLoad(ctx.U32[1], ctx.instance_id)); |
| 224 | } else { | 224 | } else { |
| 225 | return ctx.OpISub(ctx.U32[1], ctx.OpLoad(ctx.U32[1], ctx.instance_index), | 225 | const Id index{ctx.OpLoad(ctx.U32[1], ctx.instance_index)}; |
| 226 | ctx.OpLoad(ctx.U32[1], ctx.base_instance)); | 226 | const Id base{ctx.OpLoad(ctx.U32[1], ctx.base_instance)}; |
| 227 | return ctx.OpBitcast(ctx.F32[1], ctx.OpISub(ctx.U32[1], index, base)); | ||
| 227 | } | 228 | } |
| 228 | case IR::Attribute::VertexId: | 229 | case IR::Attribute::VertexId: |
| 229 | if (ctx.profile.support_vertex_instance_id) { | 230 | if (ctx.profile.support_vertex_instance_id) { |
| 230 | return ctx.OpLoad(ctx.U32[1], ctx.vertex_id); | 231 | return ctx.OpBitcast(ctx.F32[1], ctx.OpLoad(ctx.U32[1], ctx.vertex_id)); |
| 231 | } else { | 232 | } else { |
| 232 | return ctx.OpISub(ctx.U32[1], ctx.OpLoad(ctx.U32[1], ctx.vertex_index), | 233 | const Id index{ctx.OpLoad(ctx.U32[1], ctx.vertex_index)}; |
| 233 | ctx.OpLoad(ctx.U32[1], ctx.base_vertex)); | 234 | const Id base{ctx.OpLoad(ctx.U32[1], ctx.base_vertex)}; |
| 235 | return ctx.OpBitcast(ctx.F32[1], ctx.OpISub(ctx.U32[1], index, base)); | ||
| 234 | } | 236 | } |
| 235 | case IR::Attribute::FrontFace: | 237 | case IR::Attribute::FrontFace: |
| 236 | return ctx.OpSelect(ctx.U32[1], ctx.OpLoad(ctx.U1, ctx.front_face), | 238 | return ctx.OpSelect(ctx.U32[1], ctx.OpLoad(ctx.U1, ctx.front_face), |