var_alloc.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. // Copyright 2021 yuzu Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #pragma once
  5. #include <bitset>
  6. #include <string>
  7. #include <vector>
  8. #include "common/bit_field.h"
  9. #include "common/common_types.h"
  10. namespace Shader::IR {
  11. class Inst;
  12. class Value;
  13. enum class Type;
  14. } // namespace Shader::IR
  15. namespace Shader::Backend::GLSL {
  16. enum class GlslVarType : u32 {
  17. U1,
  18. F16x2,
  19. S32,
  20. U32,
  21. F32,
  22. S64,
  23. U64,
  24. F64,
  25. U32x2,
  26. F32x2,
  27. U32x3,
  28. F32x3,
  29. U32x4,
  30. F32x4,
  31. PrecF32,
  32. PrecF64,
  33. Void,
  34. };
  35. struct Id {
  36. union {
  37. u32 raw;
  38. BitField<0, 1, u32> is_valid;
  39. BitField<1, 5, GlslVarType> type;
  40. BitField<6, 26, u32> index;
  41. };
  42. bool operator==(Id rhs) const noexcept {
  43. return raw == rhs.raw;
  44. }
  45. bool operator!=(Id rhs) const noexcept {
  46. return !operator==(rhs);
  47. }
  48. };
  49. static_assert(sizeof(Id) == sizeof(u32));
  50. class VarAlloc {
  51. public:
  52. static constexpr size_t NUM_VARS = 511;
  53. struct UseTracker {
  54. size_t num_used{};
  55. std::bitset<NUM_VARS> var_use{};
  56. bool uses_temp{};
  57. };
  58. /// Used for explicit usages of variables, may revert to temporaries
  59. std::string Define(IR::Inst& inst, GlslVarType type);
  60. std::string Define(IR::Inst& inst, IR::Type type);
  61. /// Used to assign variables used by the IR. May return a blank string if
  62. /// the instruction's result is unused in the IR.
  63. std::string AddDefine(IR::Inst& inst, GlslVarType type);
  64. std::string PhiDefine(IR::Inst& inst, IR::Type type);
  65. std::string Consume(const IR::Value& value);
  66. std::string ConsumeInst(IR::Inst& inst);
  67. std::string GetGlslType(GlslVarType type) const;
  68. std::string GetGlslType(IR::Type type) const;
  69. const UseTracker& GetUseTracker(GlslVarType type) const;
  70. std::string Representation(u32 index, GlslVarType type) const;
  71. private:
  72. GlslVarType RegType(IR::Type type) const;
  73. Id Alloc(GlslVarType type);
  74. void Free(Id id);
  75. UseTracker& GetUseTracker(GlslVarType type);
  76. std::string Representation(Id id) const;
  77. UseTracker var_bool{};
  78. UseTracker var_f16x2{};
  79. UseTracker var_s32{};
  80. UseTracker var_u32{};
  81. UseTracker var_u32x2{};
  82. UseTracker var_u32x3{};
  83. UseTracker var_u32x4{};
  84. UseTracker var_f32{};
  85. UseTracker var_f32x2{};
  86. UseTracker var_f32x3{};
  87. UseTracker var_f32x4{};
  88. UseTracker var_u64{};
  89. UseTracker var_s64{};
  90. UseTracker var_f64{};
  91. UseTracker var_precf32{};
  92. UseTracker var_precf64{};
  93. };
  94. } // namespace Shader::Backend::GLSL