glsl: use ARB_enhahnced_layouts for packing where possible
If packing doesn't cross locations we can easily make use of ARB_enhanced_layouts to do packing rather than using the GLSL IR lowering pass lower_packed_varyings(). Shader-db Broadwell results: total instructions in shared programs: 12977822 -> 12977819 (-0.00%) instructions in affected programs: 1871 -> 1868 (-0.16%) helped: 4 HURT: 3 total cycles in shared programs: 246567288 -> 246567668 (0.00%) cycles in affected programs: 1370386 -> 1370766 (0.03%) helped: 592 HURT: 733 Acked-by: Elie Tournier <elie.tournier@collabora.com> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:

committed by
Timothy Arceri

parent
eb8aa93c03
commit
21173194db
@@ -1217,6 +1217,7 @@ class varying_matches
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
varying_matches(bool disable_varying_packing, bool xfb_enabled,
|
varying_matches(bool disable_varying_packing, bool xfb_enabled,
|
||||||
|
bool enhanced_layouts_enabled,
|
||||||
gl_shader_stage producer_stage,
|
gl_shader_stage producer_stage,
|
||||||
gl_shader_stage consumer_stage);
|
gl_shader_stage consumer_stage);
|
||||||
~varying_matches();
|
~varying_matches();
|
||||||
@@ -1250,6 +1251,8 @@ private:
|
|||||||
*/
|
*/
|
||||||
const bool xfb_enabled;
|
const bool xfb_enabled;
|
||||||
|
|
||||||
|
const bool enhanced_layouts_enabled;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Enum representing the order in which varyings are packed within a
|
* Enum representing the order in which varyings are packed within a
|
||||||
* packing class.
|
* packing class.
|
||||||
@@ -1326,10 +1329,12 @@ private:
|
|||||||
|
|
||||||
varying_matches::varying_matches(bool disable_varying_packing,
|
varying_matches::varying_matches(bool disable_varying_packing,
|
||||||
bool xfb_enabled,
|
bool xfb_enabled,
|
||||||
|
bool enhanced_layouts_enabled,
|
||||||
gl_shader_stage producer_stage,
|
gl_shader_stage producer_stage,
|
||||||
gl_shader_stage consumer_stage)
|
gl_shader_stage consumer_stage)
|
||||||
: disable_varying_packing(disable_varying_packing),
|
: disable_varying_packing(disable_varying_packing),
|
||||||
xfb_enabled(xfb_enabled),
|
xfb_enabled(xfb_enabled),
|
||||||
|
enhanced_layouts_enabled(enhanced_layouts_enabled),
|
||||||
producer_stage(producer_stage),
|
producer_stage(producer_stage),
|
||||||
consumer_stage(consumer_stage)
|
consumer_stage(consumer_stage)
|
||||||
{
|
{
|
||||||
@@ -1622,6 +1627,12 @@ varying_matches::assign_locations(struct gl_shader_program *prog,
|
|||||||
void
|
void
|
||||||
varying_matches::store_locations() const
|
varying_matches::store_locations() const
|
||||||
{
|
{
|
||||||
|
/* Check is location needs to be packed with lower_packed_varyings() or if
|
||||||
|
* we can just use ARB_enhanced_layouts packing.
|
||||||
|
*/
|
||||||
|
bool pack_loc[MAX_VARYINGS_INCL_PATCH] = { 0 };
|
||||||
|
const glsl_type *loc_type[MAX_VARYINGS_INCL_PATCH][4] = { {NULL, NULL} };
|
||||||
|
|
||||||
for (unsigned i = 0; i < this->num_matches; i++) {
|
for (unsigned i = 0; i < this->num_matches; i++) {
|
||||||
ir_variable *producer_var = this->matches[i].producer_var;
|
ir_variable *producer_var = this->matches[i].producer_var;
|
||||||
ir_variable *consumer_var = this->matches[i].consumer_var;
|
ir_variable *consumer_var = this->matches[i].consumer_var;
|
||||||
@@ -1639,6 +1650,64 @@ varying_matches::store_locations() const
|
|||||||
consumer_var->data.location = VARYING_SLOT_VAR0 + slot;
|
consumer_var->data.location = VARYING_SLOT_VAR0 + slot;
|
||||||
consumer_var->data.location_frac = offset;
|
consumer_var->data.location_frac = offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Find locations suitable for native packing via
|
||||||
|
* ARB_enhanced_layouts.
|
||||||
|
*/
|
||||||
|
if (producer_var && consumer_var) {
|
||||||
|
if (enhanced_layouts_enabled) {
|
||||||
|
const glsl_type *type =
|
||||||
|
get_varying_type(producer_var, producer_stage);
|
||||||
|
if (type->is_array() || type->is_matrix() || type->is_record() ||
|
||||||
|
type->is_double()) {
|
||||||
|
unsigned comp_slots = type->component_slots() + offset;
|
||||||
|
unsigned slots = comp_slots / 4;
|
||||||
|
if (comp_slots % 4)
|
||||||
|
slots += 1;
|
||||||
|
|
||||||
|
for (unsigned j = 0; j < slots; j++) {
|
||||||
|
pack_loc[slot + j] = true;
|
||||||
|
}
|
||||||
|
} else if (offset + type->vector_elements > 4) {
|
||||||
|
pack_loc[slot] = true;
|
||||||
|
pack_loc[slot + 1] = true;
|
||||||
|
} else {
|
||||||
|
loc_type[slot][offset] = type;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Attempt to use ARB_enhanced_layouts for more efficient packing if
|
||||||
|
* suitable.
|
||||||
|
*/
|
||||||
|
if (enhanced_layouts_enabled) {
|
||||||
|
for (unsigned i = 0; i < this->num_matches; i++) {
|
||||||
|
ir_variable *producer_var = this->matches[i].producer_var;
|
||||||
|
ir_variable *consumer_var = this->matches[i].consumer_var;
|
||||||
|
unsigned generic_location = this->matches[i].generic_location;
|
||||||
|
unsigned slot = generic_location / 4;
|
||||||
|
|
||||||
|
if (pack_loc[slot] || !producer_var || !consumer_var)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
const glsl_type *type =
|
||||||
|
get_varying_type(producer_var, producer_stage);
|
||||||
|
bool type_match = true;
|
||||||
|
for (unsigned j = 0; j < 4; j++) {
|
||||||
|
if (loc_type[slot][j]) {
|
||||||
|
if (type->base_type != loc_type[slot][j]->base_type)
|
||||||
|
type_match = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (type_match) {
|
||||||
|
producer_var->data.explicit_location = 1;
|
||||||
|
consumer_var->data.explicit_location = 1;
|
||||||
|
producer_var->data.explicit_component = 1;
|
||||||
|
consumer_var->data.explicit_component = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2100,6 +2169,7 @@ assign_varying_locations(struct gl_context *ctx,
|
|||||||
disable_varying_packing = true;
|
disable_varying_packing = true;
|
||||||
|
|
||||||
varying_matches matches(disable_varying_packing, xfb_enabled,
|
varying_matches matches(disable_varying_packing, xfb_enabled,
|
||||||
|
ctx->Extensions.ARB_enhanced_layouts,
|
||||||
producer ? producer->Stage : (gl_shader_stage)-1,
|
producer ? producer->Stage : (gl_shader_stage)-1,
|
||||||
consumer ? consumer->Stage : (gl_shader_stage)-1);
|
consumer ? consumer->Stage : (gl_shader_stage)-1);
|
||||||
hash_table *tfeedback_candidates =
|
hash_table *tfeedback_candidates =
|
||||||
|
Reference in New Issue
Block a user