Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mesa
Path: blob/21.2-virgl/src/compiler/glsl/ir_array_refcount.h
4545 views
1
/*
2
* Copyright © 2016 Intel Corporation
3
*
4
* Permission is hereby granted, free of charge, to any person obtaining a
5
* copy of this software and associated documentation files (the "Software"),
6
* to deal in the Software without restriction, including without limitation
7
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
8
* and/or sell copies of the Software, and to permit persons to whom the
9
* Software is furnished to do so, subject to the following conditions:
10
*
11
* The above copyright notice and this permission notice (including the next
12
* paragraph) shall be included in all copies or substantial portions of the
13
* Software.
14
*
15
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21
* DEALINGS IN THE SOFTWARE.
22
*/
23
24
/**
25
* \file ir_array_refcount.h
26
*
27
* Provides a visitor which produces a list of variables referenced.
28
*/
29
30
#ifndef GLSL_IR_ARRAY_REFCOUNT_H
31
#define GLSL_IR_ARRAY_REFCOUNT_H
32
33
#include "ir.h"
34
#include "ir_visitor.h"
35
#include "linker_util.h"
36
#include "compiler/glsl_types.h"
37
#include "util/bitset.h"
38
39
class ir_array_refcount_entry
40
{
41
public:
42
ir_array_refcount_entry(ir_variable *var);
43
~ir_array_refcount_entry();
44
45
ir_variable *var; /* The key: the variable's pointer. */
46
47
/** Has the variable been referenced? */
48
bool is_referenced;
49
50
/** Count of nested arrays in the type. */
51
unsigned array_depth;
52
53
/** Set of bit-flags to note which array elements have been accessed. */
54
BITSET_WORD *bits;
55
56
/** Has a linearized array index been referenced? */
57
bool is_linearized_index_referenced(unsigned linearized_index) const
58
{
59
assert(bits != 0);
60
assert(linearized_index <= num_bits);
61
62
return BITSET_TEST(bits, linearized_index);
63
}
64
65
private:
66
67
/**
68
* Total number of bits referenced by \c bits.
69
*
70
* Also the total number of array(s-of-arrays) elements of \c var.
71
*/
72
unsigned num_bits;
73
74
friend class array_refcount_test;
75
};
76
77
class ir_array_refcount_visitor : public ir_hierarchical_visitor {
78
public:
79
ir_array_refcount_visitor(void);
80
~ir_array_refcount_visitor(void);
81
82
virtual ir_visitor_status visit(ir_dereference_variable *);
83
84
virtual ir_visitor_status visit_enter(ir_function_signature *);
85
virtual ir_visitor_status visit_enter(ir_dereference_array *);
86
87
/**
88
* Find variable in the hash table, and insert it if not present
89
*/
90
ir_array_refcount_entry *get_variable_entry(ir_variable *var);
91
92
/**
93
* Hash table mapping ir_variable to ir_array_refcount_entry.
94
*/
95
struct hash_table *ht;
96
97
void *mem_ctx;
98
99
private:
100
/** Get an array_deref_range element from private tracking. */
101
array_deref_range *get_array_deref();
102
103
/**
104
* Last ir_dereference_array that was visited
105
*
106
* Used to prevent some redundant calculations.
107
*
108
* \sa ::visit_enter(ir_dereference_array *)
109
*/
110
ir_dereference_array *last_array_deref;
111
112
/**
113
* \name array_deref_range tracking
114
*/
115
/*@{*/
116
/** Currently allocated block of derefs. */
117
array_deref_range *derefs;
118
119
/** Number of derefs used in current processing. */
120
unsigned num_derefs;
121
122
/** Size of the derefs buffer in bytes. */
123
unsigned derefs_size;
124
/*@}*/
125
};
126
127
#endif /* GLSL_IR_ARRAY_REFCOUNT_H */
128
129