Просмотр исходного кода

glasm: Support textures used in more than one stage

ReinUsesLisp 5 лет назад
Родитель
Сommit
8b7d5912d6

+ 9 - 1
src/shader_recompiler/backend/glasm/emit_context.cpp

@@ -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

+ 13 - 1
src/shader_recompiler/backend/glasm/emit_context.h

@@ -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";
 };

+ 2 - 2
src/shader_recompiler/backend/glasm/emit_glasm.cpp

@@ -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)};

+ 1 - 1
src/video_core/renderer_opengl/gl_shader_cache.cpp

@@ -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)};