i965: Define the setup_vector_uniform_values() backend_visitor interface.

This cleans up the VEC4 implementation of setup_uniform_values()
somewhat and will avoid duplication of the image uniform upload code
by having a common interface to upload a vector of uniforms on either
back-end.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
Francisco Jerez
2015-06-28 21:04:17 +03:00
parent bd0d6a9cce
commit a0c02d2bbb
5 changed files with 44 additions and 19 deletions

View File

@@ -897,6 +897,18 @@ fs_visitor::import_uniforms(fs_visitor *v)
this->param_size = v->param_size;
}
void
fs_visitor::setup_vector_uniform_values(const gl_constant_value *values, unsigned n)
{
static const gl_constant_value zero = { 0 };
for (unsigned i = 0; i < n; ++i)
stage_prog_data->param[uniforms++] = &values[i];
for (unsigned i = n; i < 4; ++i)
stage_prog_data->param[uniforms++] = &zero;
}
fs_reg *
fs_visitor::emit_fragcoord_interpolation(bool pixel_center_integer,
bool origin_upper_left)

View File

@@ -296,6 +296,10 @@ public:
fs_reg get_timestamp(const brw::fs_builder &bld);
struct brw_reg interp_reg(int location, int channel);
virtual void setup_vector_uniform_values(const gl_constant_value *values,
unsigned n);
int implied_mrf_writes(fs_inst *inst);
virtual void dump_instructions();

View File

@@ -26,6 +26,7 @@
#include "brw_defines.h"
#include "main/compiler.h"
#include "glsl/ir.h"
#include "program/prog_parameter.h"
#ifdef __cplusplus
#include "brw_ir_allocator.h"
@@ -268,6 +269,9 @@ public:
void assign_common_binding_table_offsets(uint32_t next_binding_table_offset);
virtual void invalidate_live_intervals() = 0;
virtual void setup_vector_uniform_values(const gl_constant_value *values,
unsigned n) = 0;
};
uint32_t brw_texture_offset(int *offsets, unsigned num_components);

View File

@@ -176,9 +176,12 @@ public:
void fail(const char *msg, ...);
void setup_uniform_clipplane_values(gl_clip_plane *clip_planes);
virtual void setup_vector_uniform_values(const gl_constant_value *values,
unsigned n);
void setup_uniform_values(ir_variable *ir);
void setup_builtin_uniform_values(ir_variable *ir);
int setup_uniforms(int payload_reg);
bool reg_allocate_trivial();
bool reg_allocate();
void evaluate_spill_costs(float *spill_costs, bool *no_spill);

View File

@@ -670,6 +670,21 @@ dst_reg::dst_reg(class vec4_visitor *v, const struct glsl_type *type)
this->type = brw_type_for_base_type(type);
}
void
vec4_visitor::setup_vector_uniform_values(const gl_constant_value *values,
unsigned n)
{
static const gl_constant_value zero = { 0 };
for (unsigned i = 0; i < n; ++i)
stage_prog_data->param[4 * uniforms + i] = &values[i];
for (unsigned i = n; i < 4; ++i)
stage_prog_data->param[4 * uniforms + i] = &zero;
uniform_vector_size[uniforms++] = n;
}
/* Our support for uniforms is piggy-backed on the struct
* gl_fragment_program, because that's where the values actually
* get stored, rather than in some global gl_shader_program uniform
@@ -699,26 +714,13 @@ vec4_visitor::setup_uniform_values(ir_variable *ir)
continue;
}
gl_constant_value *components = storage->storage;
unsigned vector_count = (MAX2(storage->array_elements, 1) *
storage->type->matrix_columns);
const unsigned vector_count = (MAX2(storage->array_elements, 1) *
storage->type->matrix_columns);
const unsigned vector_size = storage->type->vector_elements;
for (unsigned s = 0; s < vector_count; s++) {
assert(uniforms < uniform_array_size);
uniform_vector_size[uniforms] = storage->type->vector_elements;
int i;
for (i = 0; i < uniform_vector_size[uniforms]; i++) {
stage_prog_data->param[uniforms * 4 + i] = components;
components++;
}
for (; i < 4; i++) {
static gl_constant_value zero = { 0.0 };
stage_prog_data->param[uniforms * 4 + i] = &zero;
}
uniforms++;
}
for (unsigned s = 0; s < vector_count; s++)
setup_vector_uniform_values(&storage->storage[s * vector_size],
vector_size);
}
}