summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/shader_recompiler/backend/glasm/emit_context.cpp10
-rw-r--r--src/shader_recompiler/backend/glasm/emit_context.h14
-rw-r--r--src/shader_recompiler/backend/glasm/emit_glasm.cpp4
-rw-r--r--src/video_core/renderer_opengl/gl_shader_cache.cpp2
4 files changed, 25 insertions, 5 deletions
diff --git a/src/shader_recompiler/backend/glasm/emit_context.cpp b/src/shader_recompiler/backend/glasm/emit_context.cpp
index 4903e9d8e..d1fe84a5f 100644
--- a/src/shader_recompiler/backend/glasm/emit_context.cpp
+++ b/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
diff --git a/src/shader_recompiler/backend/glasm/emit_context.h b/src/shader_recompiler/backend/glasm/emit_context.h
index 4efe42ada..084635c77 100644
--- a/src/shader_recompiler/backend/glasm/emit_context.h
+++ b/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";
};
diff --git a/src/shader_recompiler/backend/glasm/emit_glasm.cpp b/src/shader_recompiler/backend/glasm/emit_glasm.cpp
index a893fa3fb..edf6f5e13 100644
--- a/src/shader_recompiler/backend/glasm/emit_glasm.cpp
+++ b/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)};
diff --git a/src/video_core/renderer_opengl/gl_shader_cache.cpp b/src/video_core/renderer_opengl/gl_shader_cache.cpp
index c10ea2f60..b84b36b9d 100644
--- a/src/video_core/renderer_opengl/gl_shader_cache.cpp
+++ b/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)};