glasm: Support textures used in more than one stage
This commit is contained in:
		| @@ -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)}; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 ReinUsesLisp
					ReinUsesLisp