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:
@@ -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)
|
||||
|
@@ -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();
|
||||
|
@@ -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);
|
||||
|
@@ -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);
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user