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