[Mesa-dev] [PATCH 1/3] glsl: Adds an horizontal_location fields to ir_variable.
Vincent Lejeune
vljn at ovi.com
Sun Feb 5 10:02:41 PST 2012
This field allows to address output variables more precisely
(varyings won't have to "hold" a whole register if they are not vec4).
---
src/gallium/state_trackers/dri/drm/dri2.c | 3 +++
src/glsl/ir.cpp | 1 +
src/glsl/ir.h | 22 ++++++++++++++++++++++
src/glsl/ir_clone.cpp | 1 +
src/mesa/drivers/dri/i965/brw_fs.cpp | 4 ++--
5 files changed, 29 insertions(+), 2 deletions(-)
diff --git a/src/gallium/state_trackers/dri/drm/dri2.c b/src/gallium/state_trackers/dri/drm/dri2.c
index afd91ee..4c08a02 100644
--- a/src/gallium/state_trackers/dri/drm/dri2.c
+++ b/src/gallium/state_trackers/dri/drm/dri2.c
@@ -316,6 +316,9 @@ dri2_allocate_buffer(__DRIscreen *sPriv,
switch (format) {
case 32:
+ pf = PIPE_FORMAT_B8G8R8A8_UNORM;
+ break;
+ case 24:
pf = PIPE_FORMAT_B8G8R8X8_UNORM;
break;
case 16:
diff --git a/src/glsl/ir.cpp b/src/glsl/ir.cpp
index a5eca5a..a4c93ce 100644
--- a/src/glsl/ir.cpp
+++ b/src/glsl/ir.cpp
@@ -1335,6 +1335,7 @@ ir_variable::ir_variable(const struct glsl_type *type, const char *name,
this->pixel_center_integer = false;
this->depth_layout = ir_depth_layout_none;
this->used = false;
+ this->horizontal_location = 0;
if (type && type->base_type == GLSL_TYPE_SAMPLER)
this->read_only = true;
diff --git a/src/glsl/ir.h b/src/glsl/ir.h
index 1faae3c..cf0e444 100644
--- a/src/glsl/ir.h
+++ b/src/glsl/ir.h
@@ -396,6 +396,28 @@ public:
* slot has not been assigned, the value will be -1.
*/
int location;
+
+ /**
+ * Storage starting component for this variable
+ *
+ * Variable storage can be 4-bytes aligned instead of 16-bytes aligned to
+ * preserve space, for instance a vec2 can be stored in FILE[location].yz
+ * and in this case, its starting_component is y (eq to 1).
+ *
+ * Register can be seen as a 2D array as follow :
+ * - Locations are assigned to rows,
+ * - Components are assigned to columns.
+ *
+ * 0: [ 0.x 0.y 0.z 0.w]
+ * 1: [ 1.x 1.y 1.z 1.w]
+ * 2: [ 2.x 2.y 2.z 2.w]
+ * ...
+ * n: [ n.x n.y n.z n.w]
+ *
+ * Thus we refers this as "horizontal_location" (vertical location is
+ * the above "location" field).
+ */
+ unsigned horizontal_location:2;
/**
* Built-in state that backs this uniform
diff --git a/src/glsl/ir_clone.cpp b/src/glsl/ir_clone.cpp
index c63615c..17e800a 100644
--- a/src/glsl/ir_clone.cpp
+++ b/src/glsl/ir_clone.cpp
@@ -46,6 +46,7 @@ ir_variable::clone(void *mem_ctx, struct hash_table *ht) const
var->invariant = this->invariant;
var->interpolation = this->interpolation;
var->location = this->location;
+ var->horizontal_location = this->horizontal_location;
var->warn_extension = this->warn_extension;
var->origin_upper_left = this->origin_upper_left;
var->pixel_center_integer = this->pixel_center_integer;
diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
index 6ecaa6c..d095e86 100644
--- a/src/mesa/drivers/dri/i965/brw_fs.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
@@ -462,7 +462,7 @@ fs_visitor::emit_general_interpolation(ir_variable *ir)
* field of the setup reg.
*/
for (unsigned int k = 0; k < type->vector_elements; k++) {
- struct brw_reg interp = interp_reg(location, k);
+ struct brw_reg interp = interp_reg(location, k + ir->horizontal_location);
interp = suboffset(interp, 3);
interp.type = reg->type;
emit(FS_OPCODE_CINTERP, attr, fs_reg(interp));
@@ -482,7 +482,7 @@ fs_visitor::emit_general_interpolation(ir_variable *ir)
k == 3 && !(c->key.proj_attrib_mask & (1 << location))) {
emit(BRW_OPCODE_MOV, attr, fs_reg(1.0f));
} else {
- struct brw_reg interp = interp_reg(location, k);
+ struct brw_reg interp = interp_reg(location, k + ir->horizontal_location);
brw_wm_barycentric_interp_mode barycoord_mode;
if (interpolation_mode == INTERP_QUALIFIER_SMOOTH)
barycoord_mode = BRW_WM_PERSPECTIVE_PIXEL_BARYCENTRIC;
--
1.7.7
More information about the mesa-dev
mailing list