[Mesa-dev] [PATCH 04/18] i965: enable component packing for vs and fs
Timothy Arceri
timothy.arceri at collabora.com
Wed Jun 15 05:38:36 UTC 2016
---
src/mesa/drivers/dri/i965/brw_fs.cpp | 20 ++++++++++++--------
src/mesa/drivers/dri/i965/brw_fs.h | 5 +++--
src/mesa/drivers/dri/i965/brw_fs_nir.cpp | 29 ++++++++++++++++++++---------
3 files changed, 35 insertions(+), 19 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
index 8774f25..1fdb654 100644
--- a/src/mesa/drivers/dri/i965/brw_fs.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
@@ -1127,7 +1127,8 @@ fs_visitor::emit_general_interpolation(fs_reg *attr, const char *name,
const glsl_type *type,
glsl_interp_qualifier interpolation_mode,
int *location, bool mod_centroid,
- bool mod_sample)
+ bool mod_sample,
+ unsigned num_packed_components)
{
assert(stage == MESA_SHADER_FRAGMENT);
brw_wm_prog_data *prog_data = (brw_wm_prog_data*) this->prog_data;
@@ -1149,22 +1150,26 @@ fs_visitor::emit_general_interpolation(fs_reg *attr, const char *name,
for (unsigned i = 0; i < length; i++) {
emit_general_interpolation(attr, name, elem_type, interpolation_mode,
- location, mod_centroid, mod_sample);
+ location, mod_centroid, mod_sample,
+ num_packed_components);
}
} else if (type->is_record()) {
for (unsigned i = 0; i < type->length; i++) {
const glsl_type *field_type = type->fields.structure[i].type;
emit_general_interpolation(attr, name, field_type, interpolation_mode,
- location, mod_centroid, mod_sample);
+ location, mod_centroid, mod_sample,
+ num_packed_components);
}
} else {
assert(type->is_scalar() || type->is_vector());
+ unsigned num_components = num_packed_components ?
+ num_packed_components : type->vector_elements;
if (prog_data->urb_setup[*location] == -1) {
/* If there's no incoming setup data for this slot, don't
* emit interpolation for it.
*/
- *attr = offset(*attr, bld, type->vector_elements);
+ *attr = offset(*attr, bld, num_components);
(*location)++;
return;
}
@@ -1176,7 +1181,6 @@ fs_visitor::emit_general_interpolation(fs_reg *attr, const char *name,
* handed us defined values in only the constant offset
* field of the setup reg.
*/
- unsigned vector_elements = type->vector_elements;
/* Data starts at suboffet 3 in 32-bit units (12 bytes), so it is not
* 64-bit aligned and the current implementation fails to read the
@@ -1184,10 +1188,10 @@ fs_visitor::emit_general_interpolation(fs_reg *attr, const char *name,
* read it as vector of floats with twice the number of components.
*/
if (attr->type == BRW_REGISTER_TYPE_DF) {
- vector_elements *= 2;
+ num_components *= 2;
attr->type = BRW_REGISTER_TYPE_F;
}
- for (unsigned int i = 0; i < vector_elements; i++) {
+ for (unsigned int i = 0; i < num_components; i++) {
struct brw_reg interp = interp_reg(*location, i);
interp = suboffset(interp, 3);
interp.type = attr->type;
@@ -1196,7 +1200,7 @@ fs_visitor::emit_general_interpolation(fs_reg *attr, const char *name,
}
} else {
/* Smooth/noperspective interpolation case. */
- for (unsigned int i = 0; i < type->vector_elements; i++) {
+ for (unsigned int i = 0; i < num_components; i++) {
struct brw_reg interp = interp_reg(*location, i);
if (devinfo->needs_unlit_centroid_workaround && mod_centroid) {
/* Get the pixel/sample mask into f0 so that we know
diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/brw_fs.h
index 4237197..fc85206 100644
--- a/src/mesa/drivers/dri/i965/brw_fs.h
+++ b/src/mesa/drivers/dri/i965/brw_fs.h
@@ -181,7 +181,7 @@ public:
const glsl_type *type,
glsl_interp_qualifier interpolation_mode,
int *location, bool mod_centroid,
- bool mod_sample);
+ bool mod_sample, unsigned num_components);
fs_reg *emit_vs_system_value(int location);
void emit_interpolation_setup_gen4();
void emit_interpolation_setup_gen6();
@@ -200,7 +200,8 @@ public:
void emit_nir_code();
void nir_setup_inputs();
void nir_setup_single_output_varying(fs_reg *reg, const glsl_type *type,
- unsigned *location);
+ unsigned *location,
+ unsigned num_components);
void nir_setup_outputs();
void nir_setup_uniforms();
void nir_emit_system_values();
diff --git a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
index b811953..b90cc8b 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
@@ -78,7 +78,8 @@ fs_visitor::nir_setup_inputs()
emit_general_interpolation(&input, var->name, var->type,
(glsl_interp_qualifier) var->data.interpolation,
&location, var->data.centroid,
- var->data.sample);
+ var->data.sample,
+ var->data.num_packed_components);
}
}
}
@@ -86,23 +87,27 @@ fs_visitor::nir_setup_inputs()
void
fs_visitor::nir_setup_single_output_varying(fs_reg *reg,
const glsl_type *type,
- unsigned *location)
+ unsigned *location,
+ unsigned num_packed_components)
{
if (type->is_array() || type->is_matrix()) {
const struct glsl_type *elem_type = glsl_get_array_element(type);
const unsigned length = glsl_get_length(type);
for (unsigned i = 0; i < length; i++) {
- nir_setup_single_output_varying(reg, elem_type, location);
+ nir_setup_single_output_varying(reg, elem_type, location,
+ num_packed_components);
}
} else if (type->is_record()) {
for (unsigned i = 0; i < type->length; i++) {
const struct glsl_type *field_type = type->fields.structure[i].type;
- nir_setup_single_output_varying(reg, field_type, location);
+ nir_setup_single_output_varying(reg, field_type, location,
+ num_packed_components);
}
} else {
assert(type->is_scalar() || type->is_vector());
- unsigned num_elements = type->vector_elements;
+ unsigned num_elements = num_packed_components ? num_packed_components :
+ type->vector_elements;
if (type->is_double())
num_elements *= 2;
for (unsigned count = 0; count < num_elements; count += 4) {
@@ -132,7 +137,8 @@ fs_visitor::nir_setup_outputs()
case MESA_SHADER_TESS_EVAL:
case MESA_SHADER_GEOMETRY: {
unsigned location = var->data.location;
- nir_setup_single_output_varying(®, var->type, &location);
+ nir_setup_single_output_varying(®, var->type, &location,
+ var->data.num_packed_components);
break;
}
case MESA_SHADER_FRAGMENT:
@@ -158,7 +164,9 @@ fs_visitor::nir_setup_outputs()
} else if (var->data.location == FRAG_RESULT_SAMPLE_MASK) {
this->sample_mask = reg;
} else {
- int vector_elements = var->type->without_array()->vector_elements;
+ int vector_elements = var->data.num_packed_components ?
+ var->data.num_packed_components :
+ var->type->without_array()->vector_elements;
/* gl_FragData or a user-defined FS output */
assert(var->data.location >= FRAG_RESULT_DATA0 &&
@@ -3706,6 +3714,7 @@ fs_visitor::nir_emit_intrinsic(const fs_builder &bld, nir_intrinsic_instr *instr
case nir_intrinsic_load_input: {
fs_reg src;
+ unsigned first_component = nir_intrinsic_component(instr);
unsigned num_components = instr->num_components;
enum brw_reg_type type = dest.type;
@@ -3730,7 +3739,7 @@ fs_visitor::nir_emit_intrinsic(const fs_builder &bld, nir_intrinsic_instr *instr
src = offset(src, bld, const_offset->u32[0]);
for (unsigned j = 0; j < num_components; j++) {
- bld.MOV(offset(dest, bld, j), offset(src, bld, j));
+ bld.MOV(offset(dest, bld, j), offset(src, bld, j + first_component));
}
if (type == BRW_REGISTER_TYPE_DF) {
@@ -3856,6 +3865,7 @@ fs_visitor::nir_emit_intrinsic(const fs_builder &bld, nir_intrinsic_instr *instr
new_dest = offset(new_dest, bld, const_offset->u32[0]);
unsigned num_components = instr->num_components;
+ unsigned first_component = nir_intrinsic_component(instr);
unsigned bit_size = instr->src[0].is_ssa ?
instr->src[0].ssa->bit_size : instr->src[0].reg.reg->bit_size;
if (bit_size == 64) {
@@ -3869,7 +3879,8 @@ fs_visitor::nir_emit_intrinsic(const fs_builder &bld, nir_intrinsic_instr *instr
}
for (unsigned j = 0; j < num_components; j++) {
- bld.MOV(offset(new_dest, bld, j), offset(src, bld, j));
+ bld.MOV(offset(new_dest, bld, j + first_component),
+ offset(src, bld, j));
}
break;
}
--
2.5.5
More information about the mesa-dev
mailing list