i965: Factor out push locations.

With UBOs, the answer of "have we decided to push this uniform" gets
a bit more complicated - for one, we have multiple surfaces.  This
patch refactors things so we can add the new code in a single place.

Reviewed-by: Matt Turner <mattst88@gmail.com>
This commit is contained in:
Kenneth Graunke
2017-06-02 09:54:31 -07:00
parent 4f586cd8f1
commit c9ef27e77b
2 changed files with 25 additions and 16 deletions

View File

@@ -2096,6 +2096,25 @@ fs_visitor::assign_constant_locations()
new_thread_local_id_index; new_thread_local_id_index;
} }
bool
fs_visitor::get_pull_locs(const fs_reg &src,
unsigned *out_surf_index,
unsigned *out_pull_index)
{
assert(src.file == UNIFORM);
const unsigned location = src.nr + src.offset / 4;
if (location < uniforms && pull_constant_loc[location] != -1) {
/* A regular uniform push constant */
*out_surf_index = stage_prog_data->binding_table.pull_constants_start;
*out_pull_index = pull_constant_loc[location];
return true;
}
return false;
}
/** /**
* Replace UNIFORM register file access with either UNIFORM_PULL_CONSTANT_LOAD * Replace UNIFORM register file access with either UNIFORM_PULL_CONSTANT_LOAD
* or VARYING_PULL_CONSTANT_LOAD instructions which load values into VGRFs. * or VARYING_PULL_CONSTANT_LOAD instructions which load values into VGRFs.
@@ -2103,7 +2122,7 @@ fs_visitor::assign_constant_locations()
void void
fs_visitor::lower_constant_loads() fs_visitor::lower_constant_loads()
{ {
const unsigned index = stage_prog_data->binding_table.pull_constants_start; unsigned index, pull_index;
foreach_block_and_inst_safe (block, fs_inst, inst, cfg) { foreach_block_and_inst_safe (block, fs_inst, inst, cfg) {
/* Set up the annotation tracking for new generated instructions. */ /* Set up the annotation tracking for new generated instructions. */
@@ -2117,13 +2136,7 @@ fs_visitor::lower_constant_loads()
if (inst->opcode == SHADER_OPCODE_MOV_INDIRECT && i == 0) if (inst->opcode == SHADER_OPCODE_MOV_INDIRECT && i == 0)
continue; continue;
unsigned location = inst->src[i].nr + inst->src[i].offset / 4; if (!get_pull_locs(inst->src[i], &index, &pull_index))
if (location >= uniforms)
continue; /* Out of bounds access */
int pull_index = pull_constant_loc[location];
if (pull_index == -1)
continue; continue;
assert(inst->src[i].stride == 0); assert(inst->src[i].stride == 0);
@@ -2148,13 +2161,7 @@ fs_visitor::lower_constant_loads()
if (inst->opcode == SHADER_OPCODE_MOV_INDIRECT && if (inst->opcode == SHADER_OPCODE_MOV_INDIRECT &&
inst->src[0].file == UNIFORM) { inst->src[0].file == UNIFORM) {
unsigned location = inst->src[0].nr + inst->src[0].offset / 4; if (!get_pull_locs(inst->src[0], &index, &pull_index))
if (location >= uniforms)
continue; /* Out of bounds access */
int pull_index = pull_constant_loc[location];
if (pull_index == -1)
continue; continue;
VARYING_PULL_CONSTANT_LOAD(ibld, inst->dst, VARYING_PULL_CONSTANT_LOAD(ibld, inst->dst,

View File

@@ -125,6 +125,8 @@ public:
void split_virtual_grfs(); void split_virtual_grfs();
bool compact_virtual_grfs(); bool compact_virtual_grfs();
void assign_constant_locations(); void assign_constant_locations();
bool get_pull_locs(const fs_reg &src, unsigned *out_surf_index,
unsigned *out_pull_index);
void lower_constant_loads(); void lower_constant_loads();
void invalidate_live_intervals(); void invalidate_live_intervals();
void calculate_live_intervals(); void calculate_live_intervals();