glsl: Make ir_variable::num_state_slots and ir_variable::state_slots private
Also move num_state_slots inside ir_variable_data for better packing. The payoff for this will come in a few more patches. No change Valgrind massif results for a trimmed apitrace of dota2. Signed-off-by: Ian Romanick <ian.d.romanick@intel.com> Reviewed-by: Matt Turner <mattst88@gmail.com> Reviewed-by: Tapani Pälli <tapani.palli@intel.com>
This commit is contained in:
@@ -478,12 +478,9 @@ builtin_variable_generator::add_uniform(const glsl_type *type,
|
||||
&_mesa_builtin_uniform_desc[i];
|
||||
|
||||
const unsigned array_count = type->is_array() ? type->length : 1;
|
||||
uni->num_state_slots = array_count * statevar->num_elements;
|
||||
|
||||
ir_state_slot *slots =
|
||||
ralloc_array(uni, ir_state_slot, uni->num_state_slots);
|
||||
|
||||
uni->state_slots = slots;
|
||||
uni->allocate_state_slots(array_count * statevar->num_elements);
|
||||
|
||||
for (unsigned a = 0; a < array_count; a++) {
|
||||
for (unsigned j = 0; j < statevar->num_elements; j++) {
|
||||
|
||||
+45
-16
@@ -537,6 +537,37 @@ public:
|
||||
return this->max_ifc_array_access;
|
||||
}
|
||||
|
||||
inline unsigned get_num_state_slots() const
|
||||
{
|
||||
return this->data._num_state_slots;
|
||||
}
|
||||
|
||||
inline void set_num_state_slots(unsigned n)
|
||||
{
|
||||
this->data._num_state_slots = n;
|
||||
}
|
||||
|
||||
inline ir_state_slot *get_state_slots()
|
||||
{
|
||||
return this->state_slots;
|
||||
}
|
||||
|
||||
inline const ir_state_slot *get_state_slots() const
|
||||
{
|
||||
return this->state_slots;
|
||||
}
|
||||
|
||||
inline ir_state_slot *allocate_state_slots(unsigned n)
|
||||
{
|
||||
this->state_slots = ralloc_array(this, ir_state_slot, n);
|
||||
this->data._num_state_slots = 0;
|
||||
|
||||
if (this->state_slots != NULL)
|
||||
this->data._num_state_slots = n;
|
||||
|
||||
return this->state_slots;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable emitting extension warnings for this variable
|
||||
*/
|
||||
@@ -734,6 +765,10 @@ public:
|
||||
/** Image internal format if specified explicitly, otherwise GL_NONE. */
|
||||
uint16_t image_format;
|
||||
|
||||
private:
|
||||
unsigned _num_state_slots; /**< Number of state slots used */
|
||||
|
||||
public:
|
||||
/**
|
||||
* Storage location of the base of this variable
|
||||
*
|
||||
@@ -786,22 +821,6 @@ public:
|
||||
friend class ir_variable;
|
||||
} data;
|
||||
|
||||
/**
|
||||
* Built-in state that backs this uniform
|
||||
*
|
||||
* Once set at variable creation, \c state_slots must remain invariant.
|
||||
* This is because, ideally, this array would be shared by all clones of
|
||||
* this variable in the IR tree. In other words, we'd really like for it
|
||||
* to be a fly-weight.
|
||||
*
|
||||
* If the variable is not a uniform, \c num_state_slots will be zero and
|
||||
* \c state_slots will be \c NULL.
|
||||
*/
|
||||
/*@{*/
|
||||
unsigned num_state_slots; /**< Number of state slots used */
|
||||
ir_state_slot *state_slots; /**< State descriptors. */
|
||||
/*@}*/
|
||||
|
||||
/**
|
||||
* Value assigned in the initializer of a variable declared "const"
|
||||
*/
|
||||
@@ -833,6 +852,16 @@ private:
|
||||
*/
|
||||
unsigned *max_ifc_array_access;
|
||||
|
||||
/**
|
||||
* Built-in state that backs this uniform
|
||||
*
|
||||
* Once set at variable creation, \c state_slots must remain invariant.
|
||||
*
|
||||
* If the variable is not a uniform, \c _num_state_slots will be zero and
|
||||
* \c state_slots will be \c NULL.
|
||||
*/
|
||||
ir_state_slot *state_slots;
|
||||
|
||||
/**
|
||||
* For variables that are in an interface block or are an instance of an
|
||||
* interface block, this is the \c GLSL_TYPE_INTERFACE type for that block.
|
||||
|
||||
@@ -53,15 +53,10 @@ ir_variable::clone(void *mem_ctx, struct hash_table *ht) const
|
||||
|
||||
memcpy(&var->data, &this->data, sizeof(var->data));
|
||||
|
||||
var->num_state_slots = this->num_state_slots;
|
||||
if (this->state_slots) {
|
||||
/* FINISHME: This really wants to use something like talloc_reference, but
|
||||
* FINISHME: ralloc doesn't have any similar function.
|
||||
*/
|
||||
var->state_slots = ralloc_array(var, ir_state_slot,
|
||||
this->num_state_slots);
|
||||
memcpy(var->state_slots, this->state_slots,
|
||||
sizeof(this->state_slots[0]) * var->num_state_slots);
|
||||
if (this->get_state_slots()) {
|
||||
ir_state_slot *s = var->allocate_state_slots(this->get_num_state_slots());
|
||||
memcpy(s, this->get_state_slots(),
|
||||
sizeof(s[0]) * var->get_num_state_slots());
|
||||
}
|
||||
|
||||
if (this->constant_value)
|
||||
|
||||
@@ -707,7 +707,7 @@ ir_validate::visit(ir_variable *ir)
|
||||
|
||||
if (ir->data.mode == ir_var_uniform
|
||||
&& strncmp(ir->name, "gl_", 3) == 0
|
||||
&& ir->state_slots == NULL) {
|
||||
&& ir->get_state_slots() == NULL) {
|
||||
printf("built-in uniform has no state\n");
|
||||
ir->print();
|
||||
abort();
|
||||
|
||||
+4
-3
@@ -1832,9 +1832,10 @@ update_array_sizes(struct gl_shader_program *prog)
|
||||
* Determine the number of slots per array element by dividing by
|
||||
* the old (total) size.
|
||||
*/
|
||||
if (var->num_state_slots > 0) {
|
||||
var->num_state_slots = (size + 1)
|
||||
* (var->num_state_slots / var->type->length);
|
||||
const unsigned num_slots = var->get_num_state_slots();
|
||||
if (num_slots > 0) {
|
||||
var->set_num_state_slots((size + 1)
|
||||
* (num_slots / var->type->length));
|
||||
}
|
||||
|
||||
var->type = glsl_type::get_array_instance(var->type->fields.array,
|
||||
|
||||
@@ -1177,10 +1177,10 @@ fs_visitor::setup_uniform_values(ir_variable *ir)
|
||||
void
|
||||
fs_visitor::setup_builtin_uniform_values(ir_variable *ir)
|
||||
{
|
||||
const ir_state_slot *const slots = ir->state_slots;
|
||||
assert(ir->state_slots != NULL);
|
||||
const ir_state_slot *const slots = ir->get_state_slots();
|
||||
assert(slots != NULL);
|
||||
|
||||
for (unsigned int i = 0; i < ir->num_state_slots; i++) {
|
||||
for (unsigned int i = 0; i < ir->get_num_state_slots(); i++) {
|
||||
/* This state reference has already been setup by ir_to_mesa, but we'll
|
||||
* get the same index back here.
|
||||
*/
|
||||
|
||||
@@ -220,10 +220,10 @@ brw_link_shader(struct gl_context *ctx, struct gl_shader_program *shProg)
|
||||
|| (strncmp(var->name, "gl_", 3) != 0))
|
||||
continue;
|
||||
|
||||
const ir_state_slot *const slots = var->state_slots;
|
||||
assert(var->state_slots != NULL);
|
||||
const ir_state_slot *const slots = var->get_state_slots();
|
||||
assert(slots != NULL);
|
||||
|
||||
for (unsigned int i = 0; i < var->num_state_slots; i++) {
|
||||
for (unsigned int i = 0; i < var->get_num_state_slots(); i++) {
|
||||
_mesa_add_state_reference(prog->Parameters,
|
||||
(gl_state_index *) slots[i].tokens);
|
||||
}
|
||||
|
||||
@@ -745,10 +745,10 @@ vec4_visitor::setup_uniform_clipplane_values()
|
||||
void
|
||||
vec4_visitor::setup_builtin_uniform_values(ir_variable *ir)
|
||||
{
|
||||
const ir_state_slot *const slots = ir->state_slots;
|
||||
assert(ir->state_slots != NULL);
|
||||
const ir_state_slot *const slots = ir->get_state_slots();
|
||||
assert(slots != NULL);
|
||||
|
||||
for (unsigned int i = 0; i < ir->num_state_slots; i++) {
|
||||
for (unsigned int i = 0; i < ir->get_num_state_slots(); i++) {
|
||||
/* This state reference has already been setup by ir_to_mesa,
|
||||
* but we'll get the same index back here. We can reference
|
||||
* ParameterValues directly, since unlike brw_fs.cpp, we never
|
||||
|
||||
@@ -682,8 +682,8 @@ ir_to_mesa_visitor::visit(ir_variable *ir)
|
||||
|
||||
if (ir->data.mode == ir_var_uniform && strncmp(ir->name, "gl_", 3) == 0) {
|
||||
unsigned int i;
|
||||
const ir_state_slot *const slots = ir->state_slots;
|
||||
assert(ir->state_slots != NULL);
|
||||
const ir_state_slot *const slots = ir->get_state_slots();
|
||||
assert(slots != NULL);
|
||||
|
||||
/* Check if this statevar's setup in the STATE file exactly
|
||||
* matches how we'll want to reference it as a
|
||||
@@ -691,7 +691,7 @@ ir_to_mesa_visitor::visit(ir_variable *ir)
|
||||
* temporary storage and hope that it'll get copy-propagated
|
||||
* out.
|
||||
*/
|
||||
for (i = 0; i < ir->num_state_slots; i++) {
|
||||
for (i = 0; i < ir->get_num_state_slots(); i++) {
|
||||
if (slots[i].swizzle != SWIZZLE_XYZW) {
|
||||
break;
|
||||
}
|
||||
@@ -699,7 +699,7 @@ ir_to_mesa_visitor::visit(ir_variable *ir)
|
||||
|
||||
variable_storage *storage;
|
||||
dst_reg dst;
|
||||
if (i == ir->num_state_slots) {
|
||||
if (i == ir->get_num_state_slots()) {
|
||||
/* We'll set the index later. */
|
||||
storage = new(mem_ctx) variable_storage(ir, PROGRAM_STATE_VAR, -1);
|
||||
this->variables.push_tail(storage);
|
||||
@@ -710,7 +710,7 @@ ir_to_mesa_visitor::visit(ir_variable *ir)
|
||||
* of the type. However, this had better match the number of state
|
||||
* elements that we're going to copy into the new temporary.
|
||||
*/
|
||||
assert((int) ir->num_state_slots == type_size(ir->type));
|
||||
assert((int) ir->get_num_state_slots() == type_size(ir->type));
|
||||
|
||||
storage = new(mem_ctx) variable_storage(ir, PROGRAM_TEMPORARY,
|
||||
this->next_temp);
|
||||
@@ -721,7 +721,7 @@ ir_to_mesa_visitor::visit(ir_variable *ir)
|
||||
}
|
||||
|
||||
|
||||
for (unsigned int i = 0; i < ir->num_state_slots; i++) {
|
||||
for (unsigned int i = 0; i < ir->get_num_state_slots(); i++) {
|
||||
int index = _mesa_add_state_reference(this->prog->Parameters,
|
||||
(gl_state_index *)slots[i].tokens);
|
||||
|
||||
@@ -741,7 +741,7 @@ ir_to_mesa_visitor::visit(ir_variable *ir)
|
||||
}
|
||||
|
||||
if (storage->file == PROGRAM_TEMPORARY &&
|
||||
dst.index != storage->index + (int) ir->num_state_slots) {
|
||||
dst.index != storage->index + (int) ir->get_num_state_slots()) {
|
||||
linker_error(this->shader_program,
|
||||
"failed to load builtin uniform `%s' "
|
||||
"(%d/%d regs loaded)\n",
|
||||
|
||||
@@ -1072,8 +1072,8 @@ glsl_to_tgsi_visitor::visit(ir_variable *ir)
|
||||
|
||||
if (ir->data.mode == ir_var_uniform && strncmp(ir->name, "gl_", 3) == 0) {
|
||||
unsigned int i;
|
||||
const ir_state_slot *const slots = ir->state_slots;
|
||||
assert(ir->state_slots != NULL);
|
||||
const ir_state_slot *const slots = ir->get_state_slots();
|
||||
assert(slots != NULL);
|
||||
|
||||
/* Check if this statevar's setup in the STATE file exactly
|
||||
* matches how we'll want to reference it as a
|
||||
@@ -1081,7 +1081,7 @@ glsl_to_tgsi_visitor::visit(ir_variable *ir)
|
||||
* temporary storage and hope that it'll get copy-propagated
|
||||
* out.
|
||||
*/
|
||||
for (i = 0; i < ir->num_state_slots; i++) {
|
||||
for (i = 0; i < ir->get_num_state_slots(); i++) {
|
||||
if (slots[i].swizzle != SWIZZLE_XYZW) {
|
||||
break;
|
||||
}
|
||||
@@ -1089,7 +1089,7 @@ glsl_to_tgsi_visitor::visit(ir_variable *ir)
|
||||
|
||||
variable_storage *storage;
|
||||
st_dst_reg dst;
|
||||
if (i == ir->num_state_slots) {
|
||||
if (i == ir->get_num_state_slots()) {
|
||||
/* We'll set the index later. */
|
||||
storage = new(mem_ctx) variable_storage(ir, PROGRAM_STATE_VAR, -1);
|
||||
this->variables.push_tail(storage);
|
||||
@@ -1100,7 +1100,7 @@ glsl_to_tgsi_visitor::visit(ir_variable *ir)
|
||||
* of the type. However, this had better match the number of state
|
||||
* elements that we're going to copy into the new temporary.
|
||||
*/
|
||||
assert((int) ir->num_state_slots == type_size(ir->type));
|
||||
assert((int) ir->get_num_state_slots() == type_size(ir->type));
|
||||
|
||||
dst = st_dst_reg(get_temp(ir->type));
|
||||
|
||||
@@ -1110,7 +1110,7 @@ glsl_to_tgsi_visitor::visit(ir_variable *ir)
|
||||
}
|
||||
|
||||
|
||||
for (unsigned int i = 0; i < ir->num_state_slots; i++) {
|
||||
for (unsigned int i = 0; i < ir->get_num_state_slots(); i++) {
|
||||
int index = _mesa_add_state_reference(this->prog->Parameters,
|
||||
(gl_state_index *)slots[i].tokens);
|
||||
|
||||
@@ -1135,7 +1135,7 @@ glsl_to_tgsi_visitor::visit(ir_variable *ir)
|
||||
}
|
||||
|
||||
if (storage->file == PROGRAM_TEMPORARY &&
|
||||
dst.index != storage->index + (int) ir->num_state_slots) {
|
||||
dst.index != storage->index + (int) ir->get_num_state_slots()) {
|
||||
fail_link(this->shader_program,
|
||||
"failed to load builtin uniform `%s' (%d/%d regs loaded)\n",
|
||||
ir->name, dst.index - storage->index,
|
||||
|
||||
Reference in New Issue
Block a user