// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include #include #include #include #include "shader_recompiler/backend/glasm/reg_alloc.h" #include "shader_recompiler/stage.h" namespace Shader { struct Info; struct Profile; struct RuntimeInfo; } // namespace Shader namespace Shader::Backend { struct Bindings; } namespace Shader::IR { class Inst; struct Program; } // namespace Shader::IR namespace Shader::Backend::GLASM { class EmitContext { public: explicit EmitContext(IR::Program& program, Bindings& bindings, const Profile& profile_, const RuntimeInfo& runtime_info_); template void Add(const char* format_str, IR::Inst& inst, Args&&... args) { code += fmt::format(fmt::runtime(format_str), reg_alloc.Define(inst), std::forward(args)...); // TODO: Remove this code += '\n'; } template void LongAdd(const char* format_str, IR::Inst& inst, Args&&... args) { code += fmt::format(fmt::runtime(format_str), reg_alloc.LongDefine(inst), std::forward(args)...); // TODO: Remove this code += '\n'; } template void Add(const char* format_str, Args&&... args) { code += fmt::format(fmt::runtime(format_str), std::forward(args)...); // TODO: Remove this code += '\n'; } std::string code; RegAlloc reg_alloc{}; const Info& info; const Profile& profile; const RuntimeInfo& runtime_info; std::vector texture_buffer_bindings; std::vector image_buffer_bindings; std::vector texture_bindings; std::vector image_bindings; Stage stage{}; std::string_view stage_name = "invalid"; std::string_view attrib_name = "invalid"; u32 num_safety_loop_vars{}; bool uses_y_direction{}; }; } // namespace Shader::Backend::GLASM