summaryrefslogtreecommitdiff
path: root/src/shader_recompiler/backend/glsl/var_alloc.h
diff options
context:
space:
mode:
authorGravatar ameerj2021-05-30 17:27:00 -0400
committerGravatar ameerj2021-07-22 21:51:37 -0400
commit1269a0cf8b3844c1a9bb06c843a7698b0a9643d5 (patch)
treea0716589fa3952bdeb0f1d19b4bb455d9cdd86e5 /src/shader_recompiler/backend/glsl/var_alloc.h
parentglsl: Fix ATOM and implement ATOMS (diff)
downloadyuzu-1269a0cf8b3844c1a9bb06c843a7698b0a9643d5.tar.gz
yuzu-1269a0cf8b3844c1a9bb06c843a7698b0a9643d5.tar.xz
yuzu-1269a0cf8b3844c1a9bb06c843a7698b0a9643d5.zip
glsl: Rework variable allocator to allow for variable reuse
Diffstat (limited to 'src/shader_recompiler/backend/glsl/var_alloc.h')
-rw-r--r--src/shader_recompiler/backend/glsl/var_alloc.h100
1 files changed, 100 insertions, 0 deletions
diff --git a/src/shader_recompiler/backend/glsl/var_alloc.h b/src/shader_recompiler/backend/glsl/var_alloc.h
new file mode 100644
index 000000000..29d78a571
--- /dev/null
+++ b/src/shader_recompiler/backend/glsl/var_alloc.h
@@ -0,0 +1,100 @@
1// Copyright 2021 yuzu Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#pragma once
6
7#include <bitset>
8#include <string>
9#include <vector>
10
11#include "common/bit_field.h"
12#include "common/common_types.h"
13
14namespace Shader::IR {
15class Inst;
16class Value;
17enum class Type;
18} // namespace Shader::IR
19
20namespace Shader::Backend::GLSL {
21enum class GlslVarType : u32 {
22 U1,
23 F16x2,
24 S32,
25 U32,
26 F32,
27 S64,
28 U64,
29 F64,
30 U32x2,
31 F32x2,
32 U32x3,
33 F32x3,
34 U32x4,
35 F32x4,
36 Void,
37};
38
39struct Id {
40 union {
41 u32 raw;
42 BitField<0, 1, u32> is_valid;
43 BitField<1, 4, GlslVarType> type;
44 BitField<5, 27, u32> index;
45 };
46
47 bool operator==(Id rhs) const noexcept {
48 return raw == rhs.raw;
49 }
50 bool operator!=(Id rhs) const noexcept {
51 return !operator==(rhs);
52 }
53};
54static_assert(sizeof(Id) == sizeof(u32));
55
56class VarAlloc {
57public:
58 static constexpr size_t NUM_VARS = 511;
59 struct UseTracker {
60 size_t num_used{};
61 std::bitset<NUM_VARS> var_use{};
62 bool uses_temp{};
63 };
64
65 std::string Define(IR::Inst& inst, GlslVarType type);
66 std::string Define(IR::Inst& inst, IR::Type type);
67
68 std::string Consume(const IR::Value& value);
69 std::string ConsumeInst(IR::Inst& inst);
70
71 std::string GetGlslType(GlslVarType type) const;
72 std::string GetGlslType(IR::Type type) const;
73
74 const UseTracker& GetUseTracker(GlslVarType type) const;
75 std::string Representation(u32 index, GlslVarType type) const;
76
77private:
78 GlslVarType RegType(IR::Type type) const;
79 Id Alloc(GlslVarType type);
80 void Free(Id id);
81 UseTracker& GetUseTracker(GlslVarType type);
82 std::string Representation(Id id) const;
83
84 UseTracker var_bool{};
85 UseTracker var_f16x2{};
86 UseTracker var_s32{};
87 UseTracker var_u32{};
88 UseTracker var_u32x2{};
89 UseTracker var_u32x3{};
90 UseTracker var_u32x4{};
91 UseTracker var_f32{};
92 UseTracker var_f32x2{};
93 UseTracker var_f32x3{};
94 UseTracker var_f32x4{};
95 UseTracker var_u64{};
96 UseTracker var_s64{};
97 UseTracker var_f64{};
98};
99
100} // namespace Shader::Backend::GLSL