On 12/20/2013 09:26 PM, Kenneth Graunke wrote:
On 11/27/2013 05:28 AM, Petri Latvala wrote:
v2: Don't add function parameters, pass the required size in
prog_data->nr_params.
Signed-off-by: Petri Latvala <petri.latv...@intel.com>
---
src/mesa/drivers/dri/i965/brw_vec4.h | 5 +++--
src/mesa/drivers/dri/i965/brw_vec4_gs.c | 5 +++++
src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp | 7 +++++++
src/mesa/drivers/dri/i965/brw_vs.c | 8 ++++++++
4 files changed, 23 insertions(+), 2 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/brw_vec4.h
b/src/mesa/drivers/dri/i965/brw_vec4.h
index 5cec9f9..5f5f5cd 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4.h
+++ b/src/mesa/drivers/dri/i965/brw_vec4.h
@@ -325,8 +325,9 @@ public:
*/
dst_reg output_reg[BRW_VARYING_SLOT_COUNT];
const char *output_reg_annotation[BRW_VARYING_SLOT_COUNT];
- int uniform_size[MAX_UNIFORMS];
- int uniform_vector_size[MAX_UNIFORMS];
+ int *uniform_size;
+ int *uniform_vector_size;
+ int uniform_param_count; /*< Size of uniform_[vector_]size arrays */
I'm not crazy about this variable name. Between the params arrays,
uniform_* arrays, nr_params count, and uniforms count...we already have
a lot of distinct things that sound alike.
How about:
int uniform_array_size; /**< Size of uniform_[vector_]size arrays. */
That seems clearer to me. Especially seeing that the value here is
really the size of the array, which is an overestimate/upper bound on
the number of uniforms, not the actual number of elements in the
uniforms or params arrays.
Sounds good. Changing the name.
int uniforms;
src_reg shader_start_time;
diff --git a/src/mesa/drivers/dri/i965/brw_vec4_gs.c
b/src/mesa/drivers/dri/i965/brw_vec4_gs.c
index 018b0b6..7cf9bac 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4_gs.c
+++ b/src/mesa/drivers/dri/i965/brw_vec4_gs.c
@@ -64,6 +64,11 @@ do_gs_prog(struct brw_context *brw,
c.prog_data.base.param = rzalloc_array(NULL, const float *, param_count);
c.prog_data.base.pull_param = rzalloc_array(NULL, const float *,
param_count);
+ /* Setting nr_params here NOT to the size of the param and pull_param
+ * arrays, but to the number of uniform components vec4_visitor
+ * needs. vec4_visitor::setup_uniforms() will set it back to a proper value.
+ */
+ c.prog_data.base.nr_params = param_count / 4 + gs->num_samplers;
Hmm. You're counting the number of vec4s, but...don't samplers take up
a single entry, since they're just integers? This seems odd to me.
No, that value is the number of float-size components. param_count,
calculated above that code, multiplies the number of components by 4 to
have room elsewhere for scalar params that eat up a vec4. I'm just
dividing the number back.
You might also consider doing ALIGN(param_count, 4) / 4 so that you
round up rather than truncating on the division.
Ok, changing that. Here and in vs.
I also would really like to keep nr_params in consistent units, i.e.
always uniform float-size components or always vec4s.
I would really like that too, but unfortunately the inconsistency was
already present.
The best option would be to have another variable for uniform memory
use, but I didn't want to make too invasive changes. nr_param gets used
here for uniform float-size counts, and later on for something else.
This results in some overuse of memory when uniforms are smaller than vec4s.
if (gp->program.OutputType == GL_POINTS) {
/* When the output type is points, the geometry shader may output data
diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
index a13eafb..b9226dc 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
@@ -3253,6 +3253,10 @@ vec4_visitor::vec4_visitor(struct brw_context *brw,
fail_msg(NULL),
first_non_payload_grf(0),
need_all_constants_in_pull_buffer(false),
+ /* Initialize uniform_param_count to at least 1 because gen6 VS requires
at
+ * least one. See setup_uniforms() in brw_vec4.cpp.
+ */
I think you mean "Gen4-5 requires at least one push constant", not "gen6
VS." At least, that's what setup_uniforms() is doing.
Argh, yes. Fixing that comment.
+ uniform_param_count(prog_data->nr_params ? prog_data->nr_params : 1),
I think this would be clearer as:
MAX2(prog_data->nr_params, 1)
Yes, changing.
--
Petri Latvala
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev