| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- // Copyright 2021 yuzu Emulator Project
- // Licensed under GPLv2 or any later version
- // Refer to the license.txt file included.
- #pragma once
- #include <bitset>
- #include <string>
- #include <vector>
- #include "common/bit_field.h"
- #include "common/common_types.h"
- namespace Shader::IR {
- class Inst;
- class Value;
- enum class Type;
- } // namespace Shader::IR
- namespace Shader::Backend::GLSL {
- enum class GlslVarType : u32 {
- U1,
- F16x2,
- S32,
- U32,
- F32,
- S64,
- U64,
- F64,
- U32x2,
- F32x2,
- U32x3,
- F32x3,
- U32x4,
- F32x4,
- PrecF32,
- PrecF64,
- Void,
- };
- struct Id {
- union {
- u32 raw;
- BitField<0, 1, u32> is_valid;
- BitField<1, 5, GlslVarType> type;
- BitField<6, 26, u32> index;
- };
- bool operator==(Id rhs) const noexcept {
- return raw == rhs.raw;
- }
- bool operator!=(Id rhs) const noexcept {
- return !operator==(rhs);
- }
- };
- static_assert(sizeof(Id) == sizeof(u32));
- class VarAlloc {
- public:
- static constexpr size_t NUM_VARS = 511;
- struct UseTracker {
- size_t num_used{};
- std::bitset<NUM_VARS> var_use{};
- bool uses_temp{};
- };
- /// Used for explicit usages of variables, may revert to temporaries
- std::string Define(IR::Inst& inst, GlslVarType type);
- std::string Define(IR::Inst& inst, IR::Type type);
- /// Used to assign variables used by the IR. May return a blank string if
- /// the instruction's result is unused in the IR.
- std::string AddDefine(IR::Inst& inst, GlslVarType type);
- std::string PhiDefine(IR::Inst& inst, IR::Type type);
- std::string Consume(const IR::Value& value);
- std::string ConsumeInst(IR::Inst& inst);
- std::string GetGlslType(GlslVarType type) const;
- std::string GetGlslType(IR::Type type) const;
- const UseTracker& GetUseTracker(GlslVarType type) const;
- std::string Representation(u32 index, GlslVarType type) const;
- private:
- GlslVarType RegType(IR::Type type) const;
- Id Alloc(GlslVarType type);
- void Free(Id id);
- UseTracker& GetUseTracker(GlslVarType type);
- std::string Representation(Id id) const;
- UseTracker var_bool{};
- UseTracker var_f16x2{};
- UseTracker var_s32{};
- UseTracker var_u32{};
- UseTracker var_u32x2{};
- UseTracker var_u32x3{};
- UseTracker var_u32x4{};
- UseTracker var_f32{};
- UseTracker var_f32x2{};
- UseTracker var_f32x3{};
- UseTracker var_f32x4{};
- UseTracker var_u64{};
- UseTracker var_s64{};
- UseTracker var_f64{};
- UseTracker var_precf32{};
- UseTracker var_precf64{};
- };
- } // namespace Shader::Backend::GLSL
|