diff options
Diffstat (limited to 'src/shader_recompiler/frontend/maxwell/translate_program.cpp')
| -rw-r--r-- | src/shader_recompiler/frontend/maxwell/translate_program.cpp | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/src/shader_recompiler/frontend/maxwell/translate_program.cpp b/src/shader_recompiler/frontend/maxwell/translate_program.cpp index 4a0ccceb7..a3b99e24d 100644 --- a/src/shader_recompiler/frontend/maxwell/translate_program.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate_program.cpp | |||
| @@ -172,7 +172,10 @@ std::map<IR::Attribute, IR::Attribute> GenerateLegacyToGenericMappings( | |||
| 172 | return mapping; | 172 | return mapping; |
| 173 | } | 173 | } |
| 174 | 174 | ||
| 175 | void EmitGeometryPassthrough(IR::IREmitter& ir, const IR::Program& program, const Shader::VaryingState &passthrough_mask, bool passthrough_position, std::optional<IR::Attribute> passthrough_layer_attr) { | 175 | void EmitGeometryPassthrough(IR::IREmitter& ir, const IR::Program& program, |
| 176 | const Shader::VaryingState& passthrough_mask, | ||
| 177 | bool passthrough_position, | ||
| 178 | std::optional<IR::Attribute> passthrough_layer_attr) { | ||
| 176 | for (u32 i = 0; i < program.output_vertices; i++) { | 179 | for (u32 i = 0; i < program.output_vertices; i++) { |
| 177 | // Assign generics from input | 180 | // Assign generics from input |
| 178 | for (u32 j = 0; j < 32; j++) { | 181 | for (u32 j = 0; j < 32; j++) { |
| @@ -198,7 +201,8 @@ void EmitGeometryPassthrough(IR::IREmitter& ir, const IR::Program& program, cons | |||
| 198 | 201 | ||
| 199 | if (passthrough_layer_attr) { | 202 | if (passthrough_layer_attr) { |
| 200 | // Assign layer | 203 | // Assign layer |
| 201 | ir.SetAttribute(IR::Attribute::Layer, ir.GetAttribute(*passthrough_layer_attr), ir.Imm32(0)); | 204 | ir.SetAttribute(IR::Attribute::Layer, ir.GetAttribute(*passthrough_layer_attr), |
| 205 | ir.Imm32(0)); | ||
| 202 | } | 206 | } |
| 203 | 207 | ||
| 204 | // Emit vertex | 208 | // Emit vertex |
| @@ -209,21 +213,23 @@ void EmitGeometryPassthrough(IR::IREmitter& ir, const IR::Program& program, cons | |||
| 209 | 213 | ||
| 210 | u32 GetOutputTopologyVertices(OutputTopology output_topology) { | 214 | u32 GetOutputTopologyVertices(OutputTopology output_topology) { |
| 211 | switch (output_topology) { | 215 | switch (output_topology) { |
| 212 | case OutputTopology::PointList: | 216 | case OutputTopology::PointList: |
| 213 | return 1; | 217 | return 1; |
| 214 | case OutputTopology::LineStrip: | 218 | case OutputTopology::LineStrip: |
| 215 | return 2; | 219 | return 2; |
| 216 | default: | 220 | default: |
| 217 | return 3; | 221 | return 3; |
| 218 | } | 222 | } |
| 219 | } | 223 | } |
| 220 | 224 | ||
| 221 | void LowerGeometryPassthrough(const IR::Program& program, const HostTranslateInfo& host_info) { | 225 | void LowerGeometryPassthrough(const IR::Program& program, const HostTranslateInfo& host_info) { |
| 222 | for (IR::Block *const block : program.blocks) { | 226 | for (IR::Block* const block : program.blocks) { |
| 223 | for (IR::Inst &inst : block->Instructions()) { | 227 | for (IR::Inst& inst : block->Instructions()) { |
| 224 | if (inst.GetOpcode() == IR::Opcode::Epilogue) { | 228 | if (inst.GetOpcode() == IR::Opcode::Epilogue) { |
| 225 | IR::IREmitter ir{*block, IR::Block::InstructionList::s_iterator_to(inst)}; | 229 | IR::IREmitter ir{*block, IR::Block::InstructionList::s_iterator_to(inst)}; |
| 226 | EmitGeometryPassthrough(ir, program, program.info.passthrough, program.info.passthrough.AnyComponent(IR::Attribute::PositionX), {}); | 230 | EmitGeometryPassthrough( |
| 231 | ir, program, program.info.passthrough, | ||
| 232 | program.info.passthrough.AnyComponent(IR::Attribute::PositionX), {}); | ||
| 227 | } | 233 | } |
| 228 | } | 234 | } |
| 229 | } | 235 | } |
| @@ -407,7 +413,6 @@ IR::Program GenerateGeometryPassthrough(ObjectPool<IR::Inst>& inst_pool, | |||
| 407 | program.output_topology = output_topology; | 413 | program.output_topology = output_topology; |
| 408 | program.output_vertices = GetOutputTopologyVertices(output_topology); | 414 | program.output_vertices = GetOutputTopologyVertices(output_topology); |
| 409 | 415 | ||
| 410 | |||
| 411 | program.is_geometry_passthrough = false; | 416 | program.is_geometry_passthrough = false; |
| 412 | program.info.loads.mask = source_program.info.stores.mask; | 417 | program.info.loads.mask = source_program.info.stores.mask; |
| 413 | program.info.stores.mask = source_program.info.stores.mask; | 418 | program.info.stores.mask = source_program.info.stores.mask; |
| @@ -420,7 +425,8 @@ IR::Program GenerateGeometryPassthrough(ObjectPool<IR::Inst>& inst_pool, | |||
| 420 | node.data.block = current_block; | 425 | node.data.block = current_block; |
| 421 | 426 | ||
| 422 | IR::IREmitter ir{*current_block}; | 427 | IR::IREmitter ir{*current_block}; |
| 423 | EmitGeometryPassthrough(ir, program, program.info.stores, true, source_program.info.emulated_layer); | 428 | EmitGeometryPassthrough(ir, program, program.info.stores, true, |
| 429 | source_program.info.emulated_layer); | ||
| 424 | 430 | ||
| 425 | IR::Block* return_block{block_pool.Create(inst_pool)}; | 431 | IR::Block* return_block{block_pool.Create(inst_pool)}; |
| 426 | IR::IREmitter{*return_block}.Epilogue(); | 432 | IR::IREmitter{*return_block}.Epilogue(); |