| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- // Copyright 2021 yuzu Emulator Project
- // Licensed under GPLv2 or any later version
- // Refer to the license.txt file included.
- #pragma once
- #include <string>
- #include <utility>
- #include <vector>
- #include <fmt/format.h>
- #include "shader_recompiler/backend/glsl/var_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::GLSL {
- struct GenericElementInfo {
- std::string name{};
- u32 first_element{};
- u32 num_components{};
- };
- class EmitContext {
- public:
- explicit EmitContext(IR::Program& program, Bindings& bindings, const Profile& profile_,
- const RuntimeInfo& runtime_info_);
- template <GlslVarType type, typename... Args>
- void Add(const char* format_str, IR::Inst& inst, Args&&... args) {
- const auto var_def{var_alloc.AddDefine(inst, type)};
- if (var_def.empty()) {
- // skip assigment.
- code += fmt::format(&format_str[3], std::forward<Args>(args)...);
- } else {
- code += fmt::format(format_str, var_def, std::forward<Args>(args)...);
- }
- // TODO: Remove this
- code += '\n';
- }
- template <typename... Args>
- void AddU1(const char* format_str, IR::Inst& inst, Args&&... args) {
- Add<GlslVarType::U1>(format_str, inst, args...);
- }
- template <typename... Args>
- void AddF16x2(const char* format_str, IR::Inst& inst, Args&&... args) {
- Add<GlslVarType::F16x2>(format_str, inst, args...);
- }
- template <typename... Args>
- void AddU32(const char* format_str, IR::Inst& inst, Args&&... args) {
- Add<GlslVarType::U32>(format_str, inst, args...);
- }
- template <typename... Args>
- void AddS32(const char* format_str, IR::Inst& inst, Args&&... args) {
- Add<GlslVarType::S32>(format_str, inst, args...);
- }
- template <typename... Args>
- void AddF32(const char* format_str, IR::Inst& inst, Args&&... args) {
- Add<GlslVarType::F32>(format_str, inst, args...);
- }
- template <typename... Args>
- void AddS64(const char* format_str, IR::Inst& inst, Args&&... args) {
- Add<GlslVarType::S64>(format_str, inst, args...);
- }
- template <typename... Args>
- void AddU64(const char* format_str, IR::Inst& inst, Args&&... args) {
- Add<GlslVarType::U64>(format_str, inst, args...);
- }
- template <typename... Args>
- void AddF64(const char* format_str, IR::Inst& inst, Args&&... args) {
- Add<GlslVarType::F64>(format_str, inst, args...);
- }
- template <typename... Args>
- void AddU32x2(const char* format_str, IR::Inst& inst, Args&&... args) {
- Add<GlslVarType::U32x2>(format_str, inst, args...);
- }
- template <typename... Args>
- void AddF32x2(const char* format_str, IR::Inst& inst, Args&&... args) {
- Add<GlslVarType::F32x2>(format_str, inst, args...);
- }
- template <typename... Args>
- void AddU32x3(const char* format_str, IR::Inst& inst, Args&&... args) {
- Add<GlslVarType::U32x3>(format_str, inst, args...);
- }
- template <typename... Args>
- void AddF32x3(const char* format_str, IR::Inst& inst, Args&&... args) {
- Add<GlslVarType::F32x3>(format_str, inst, args...);
- }
- template <typename... Args>
- void AddU32x4(const char* format_str, IR::Inst& inst, Args&&... args) {
- Add<GlslVarType::U32x4>(format_str, inst, args...);
- }
- template <typename... Args>
- void AddF32x4(const char* format_str, IR::Inst& inst, Args&&... args) {
- Add<GlslVarType::F32x4>(format_str, inst, args...);
- }
- template <typename... Args>
- void AddPrecF32(const char* format_str, IR::Inst& inst, Args&&... args) {
- Add<GlslVarType::PrecF32>(format_str, inst, args...);
- }
- template <typename... Args>
- void AddPrecF64(const char* format_str, IR::Inst& inst, Args&&... args) {
- Add<GlslVarType::PrecF64>(format_str, inst, args...);
- }
- template <typename... Args>
- void Add(const char* format_str, Args&&... args) {
- code += fmt::format(format_str, std::forward<Args>(args)...);
- // TODO: Remove this
- code += '\n';
- }
- std::string header;
- std::string code;
- VarAlloc var_alloc;
- const Info& info;
- const Profile& profile;
- const RuntimeInfo& runtime_info;
- Stage stage{};
- std::string_view stage_name = "invalid";
- std::vector<u32> texture_buffer_bindings;
- std::vector<u32> image_buffer_bindings;
- std::vector<u32> texture_bindings;
- std::vector<u32> image_bindings;
- std::array<std::array<GenericElementInfo, 4>, 32> output_generics{};
- bool uses_y_direction{};
- bool uses_cc_carry{};
- private:
- void SetupExtensions(std::string& header);
- void DefineConstantBuffers(Bindings& bindings);
- void DefineStorageBuffers(Bindings& bindings);
- void DefineGenericOutput(size_t index, u32 invocations);
- void DefineHelperFunctions();
- void SetupImages(Bindings& bindings);
- };
- } // namespace Shader::Backend::GLSL
|