forked from eden-emu/eden
		
	glasm: Support textures used in more than one stage
This commit is contained in:
		
							parent
							
								
									e4835094aa
								
							
						
					
					
						commit
						0c82ee3444
					
				
					 4 changed files with 25 additions and 5 deletions
				
			
		|  | @ -4,6 +4,7 @@ | |||
| 
 | ||||
| #include <string_view> | ||||
| 
 | ||||
| #include "shader_recompiler/backend/bindings.h" | ||||
| #include "shader_recompiler/backend/glasm/emit_context.h" | ||||
| #include "shader_recompiler/frontend/ir/program.h" | ||||
| 
 | ||||
|  | @ -22,7 +23,7 @@ std::string_view InterpDecorator(Interpolation interp) { | |||
| } | ||||
| } // Anonymous namespace
 | ||||
| 
 | ||||
| EmitContext::EmitContext(IR::Program& program) { | ||||
| EmitContext::EmitContext(IR::Program& program, Bindings& bindings) : info{program.info} { | ||||
|     // FIXME: Temporary partial implementation
 | ||||
|     u32 cbuf_index{}; | ||||
|     for (const auto& desc : program.info.constant_buffer_descriptors) { | ||||
|  | @ -79,6 +80,13 @@ EmitContext::EmitContext(IR::Program& program) { | |||
|             Add("OUTPUT out_attr{}[]={{result.attrib[{}..{}]}};", index, index, index); | ||||
|         } | ||||
|     } | ||||
|     const size_t num_textures{program.info.texture_descriptors.size()}; | ||||
|     texture_bindings.resize(num_textures); | ||||
|     for (size_t index = 0; index < num_textures; ++index) { | ||||
|         const auto& desc{program.info.texture_descriptors[index]}; | ||||
|         texture_bindings[index] = bindings.texture; | ||||
|         bindings.texture += desc.count; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| } // namespace Shader::Backend::GLASM
 | ||||
|  |  | |||
|  | @ -6,11 +6,20 @@ | |||
| 
 | ||||
| #include <string> | ||||
| #include <utility> | ||||
| #include <vector> | ||||
| 
 | ||||
| #include <fmt/format.h> | ||||
| 
 | ||||
| #include "shader_recompiler/backend/glasm/reg_alloc.h" | ||||
| 
 | ||||
| namespace Shader { | ||||
| struct Info; | ||||
| } | ||||
| 
 | ||||
| namespace Shader::Backend { | ||||
| struct Bindings; | ||||
| } | ||||
| 
 | ||||
| namespace Shader::IR { | ||||
| class Inst; | ||||
| struct Program; | ||||
|  | @ -20,7 +29,7 @@ namespace Shader::Backend::GLASM { | |||
| 
 | ||||
| class EmitContext { | ||||
| public: | ||||
|     explicit EmitContext(IR::Program& program); | ||||
|     explicit EmitContext(IR::Program& program, Bindings& bindings); | ||||
| 
 | ||||
|     template <typename... Args> | ||||
|     void Add(const char* format_str, IR::Inst& inst, Args&&... args) { | ||||
|  | @ -45,6 +54,9 @@ public: | |||
| 
 | ||||
|     std::string code; | ||||
|     RegAlloc reg_alloc{*this}; | ||||
|     const Info& info; | ||||
| 
 | ||||
|     std::vector<u32> texture_bindings; | ||||
| 
 | ||||
|     std::string_view stage_name = "invalid"; | ||||
| }; | ||||
|  |  | |||
|  | @ -312,8 +312,8 @@ std::string_view StageHeader(Stage stage) { | |||
| } | ||||
| } // Anonymous namespace
 | ||||
| 
 | ||||
| std::string EmitGLASM(const Profile&, IR::Program& program, Bindings&) { | ||||
|     EmitContext ctx{program}; | ||||
| std::string EmitGLASM(const Profile&, IR::Program& program, Bindings& bindings) { | ||||
|     EmitContext ctx{program, bindings}; | ||||
|     Precolor(ctx, program); | ||||
|     EmitCode(ctx, program); | ||||
|     std::string header{StageHeader(program.stage)}; | ||||
|  |  | |||
|  | @ -302,7 +302,7 @@ std::unique_ptr<GraphicsProgram> ShaderCache::CreateGraphicsProgram( | |||
|         const size_t stage_index{index - 1}; | ||||
|         infos[stage_index] = &program.info; | ||||
|         if (device.UseAssemblyShaders()) { | ||||
|             const std::string code{EmitGLASM(profile, program)}; | ||||
|             const std::string code{EmitGLASM(profile, program, binding)}; | ||||
|             assembly_programs[stage_index] = CompileProgram(code, AssemblyStage(stage_index)); | ||||
|         } else { | ||||
|             const std::vector<u32> code{EmitSPIRV(profile, program, binding)}; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 ReinUsesLisp
						ReinUsesLisp