glsl: Add structures to track accessed elements of a single array
Signed-off-by: Ian Romanick <ian.d.romanick@intel.com> Cc: mesa-stable@lists.freedesktop.org Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
parent
b7053b80f2
commit
8d499f60c8
|
@ -34,6 +34,7 @@
|
|||
#include "util/hash_table.h"
|
||||
|
||||
ir_array_refcount_visitor::ir_array_refcount_visitor()
|
||||
: derefs(0), num_derefs(0), derefs_size(0)
|
||||
{
|
||||
this->mem_ctx = ralloc_context(NULL);
|
||||
this->ht = _mesa_hash_table_create(NULL, _mesa_hash_pointer,
|
||||
|
@ -84,6 +85,26 @@ ir_array_refcount_visitor::get_variable_entry(ir_variable *var)
|
|||
}
|
||||
|
||||
|
||||
array_deref_range *
|
||||
ir_array_refcount_visitor::get_array_deref()
|
||||
{
|
||||
if ((num_derefs + 1) * sizeof(array_deref_range) > derefs_size) {
|
||||
void *ptr = reralloc_size(mem_ctx, derefs, derefs_size + 4096);
|
||||
|
||||
if (ptr == NULL)
|
||||
return NULL;
|
||||
|
||||
derefs_size += 4096;
|
||||
derefs = (array_deref_range *)ptr;
|
||||
}
|
||||
|
||||
array_deref_range *d = &derefs[num_derefs];
|
||||
num_derefs++;
|
||||
|
||||
return d;
|
||||
}
|
||||
|
||||
|
||||
ir_visitor_status
|
||||
ir_array_refcount_visitor::visit(ir_dereference_variable *ir)
|
||||
{
|
||||
|
|
|
@ -32,6 +32,23 @@
|
|||
#include "compiler/glsl_types.h"
|
||||
#include "util/bitset.h"
|
||||
|
||||
/**
|
||||
* Describes an access of an array element or an access of the whole array
|
||||
*/
|
||||
struct array_deref_range {
|
||||
/**
|
||||
* Index that was accessed.
|
||||
*
|
||||
* All valid array indices are less than the size of the array. If index
|
||||
* is equal to the size of the array, this means the entire array has been
|
||||
* accessed (e.g., due to use of a non-constant index).
|
||||
*/
|
||||
unsigned index;
|
||||
|
||||
/** Size of the array. Used for offset calculations. */
|
||||
unsigned size;
|
||||
};
|
||||
|
||||
class ir_array_refcount_entry
|
||||
{
|
||||
public:
|
||||
|
@ -86,4 +103,22 @@ public:
|
|||
struct hash_table *ht;
|
||||
|
||||
void *mem_ctx;
|
||||
|
||||
private:
|
||||
/** Get an array_deref_range element from private tracking. */
|
||||
array_deref_range *get_array_deref();
|
||||
|
||||
/**
|
||||
* \name array_deref_range tracking
|
||||
*/
|
||||
/*@{*/
|
||||
/** Currently allocated block of derefs. */
|
||||
array_deref_range *derefs;
|
||||
|
||||
/** Number of derefs used in current processing. */
|
||||
unsigned num_derefs;
|
||||
|
||||
/** Size of the derefs buffer in bytes. */
|
||||
unsigned derefs_size;
|
||||
/*@}*/
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue