summaryrefslogtreecommitdiffstats
path: root/src/mesa/drivers/dri/i965/gen6_vs_state.c
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2014-05-19 10:06:15 -0700
committerKenneth Graunke <kenneth@whitecape.org>2014-07-02 12:45:59 -0700
commit34f4e614dd28983a3e5dd5a3b34721ca4d0a8162 (patch)
tree41490d16f89f30984ade86c279e7af882a08641a /src/mesa/drivers/dri/i965/gen6_vs_state.c
parentc0f1929dd23bbc558e9eef0f8fd40e10dfef3c21 (diff)
downloadexternal_mesa3d-34f4e614dd28983a3e5dd5a3b34721ca4d0a8162.zip
external_mesa3d-34f4e614dd28983a3e5dd5a3b34721ca4d0a8162.tar.gz
external_mesa3d-34f4e614dd28983a3e5dd5a3b34721ca4d0a8162.tar.bz2
i965/gen6+: Merge VS/GS and WM push constant buffer upload paths.
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Diffstat (limited to 'src/mesa/drivers/dri/i965/gen6_vs_state.c')
-rw-r--r--src/mesa/drivers/dri/i965/gen6_vs_state.c61
1 files changed, 41 insertions, 20 deletions
diff --git a/src/mesa/drivers/dri/i965/gen6_vs_state.c b/src/mesa/drivers/dri/i965/gen6_vs_state.c
index 9d3c184..407818e 100644
--- a/src/mesa/drivers/dri/i965/gen6_vs_state.c
+++ b/src/mesa/drivers/dri/i965/gen6_vs_state.c
@@ -32,13 +32,29 @@
#include "program/prog_parameter.h"
#include "program/prog_statevars.h"
#include "intel_batchbuffer.h"
+#include "glsl/glsl_parser_extras.h"
+/**
+ * Creates a streamed BO containing the push constants for the VS or GS on
+ * gen6+.
+ *
+ * Push constants are constant values (such as GLSL uniforms) that are
+ * pre-loaded into a shader stage's register space at thread spawn time.
+ *
+ * Not all GLSL uniforms will be uploaded as push constants: The hardware has
+ * a limitation of 32 or 64 EU registers (256 or 512 floats) per stage to be
+ * uploaded as push constants, while GL 4.4 requires at least 1024 components
+ * to be usable for the VS. Plus, currently we always use pull constants
+ * instead of push constants when doing variable-index array access.
+ *
+ * See brw_curbe.c for the equivalent gen4/5 code.
+ */
void
-gen6_upload_vec4_push_constants(struct brw_context *brw,
- const struct gl_program *prog,
- const struct brw_vec4_prog_data *prog_data,
- struct brw_stage_state *stage_state,
- enum aub_state_struct_type type)
+gen6_upload_push_constants(struct brw_context *brw,
+ const struct gl_program *prog,
+ const struct brw_stage_prog_data *prog_data,
+ struct brw_stage_state *stage_state,
+ enum aub_state_struct_type type)
{
struct gl_context *ctx = &brw->ctx;
@@ -48,15 +64,14 @@ gen6_upload_vec4_push_constants(struct brw_context *brw,
/* XXX: Should this happen somewhere before to get our state flag set? */
_mesa_load_state_parameters(ctx, prog->Parameters);
- if (prog_data->base.nr_params == 0) {
+ if (prog_data->nr_params == 0) {
stage_state->push_const_size = 0;
} else {
- int params_uploaded;
float *param;
int i;
param = brw_state_batch(brw, type,
- prog_data->base.nr_params * sizeof(float),
+ prog_data->nr_params * sizeof(float),
32, &stage_state->push_const_offset);
/* _NEW_PROGRAM_CONSTANTS
@@ -65,21 +80,27 @@ gen6_upload_vec4_push_constants(struct brw_context *brw,
* side effect of dereferencing uniforms, so _NEW_PROGRAM_CONSTANTS
* wouldn't be set for them.
*/
- for (i = 0; i < prog_data->base.nr_params; i++) {
- param[i] = *prog_data->base.param[i];
+ for (i = 0; i < prog_data->nr_params; i++) {
+ param[i] = *prog_data->param[i];
}
- params_uploaded = prog_data->base.nr_params / 4;
if (0) {
- fprintf(stderr, "Constant buffer:\n");
- for (i = 0; i < params_uploaded; i++) {
- float *buf = param + i * 4;
- fprintf(stderr, "%d: %f %f %f %f\n",
- i, buf[0], buf[1], buf[2], buf[3]);
+ fprintf(stderr, "%s constants:\n",
+ _mesa_shader_stage_to_string(stage_state->stage));
+ for (i = 0; i < prog_data->nr_params; i++) {
+ if ((i & 7) == 0)
+ fprintf(stderr, "g%d: ",
+ prog_data->dispatch_grf_start_reg + i / 8);
+ fprintf(stderr, "%8f ", param[i]);
+ if ((i & 7) == 7)
+ fprintf(stderr, "\n");
}
+ if ((i & 7) != 0)
+ fprintf(stderr, "\n");
+ fprintf(stderr, "\n");
}
- stage_state->push_const_size = (params_uploaded + 1) / 2;
+ stage_state->push_const_size = ALIGN(prog_data->nr_params, 8) / 8;
/* We can only push 32 registers of constants at a time. */
assert(stage_state->push_const_size <= 32);
}
@@ -94,10 +115,10 @@ gen6_upload_vs_push_constants(struct brw_context *brw)
const struct brw_vertex_program *vp =
brw_vertex_program_const(brw->vertex_program);
/* CACHE_NEW_VS_PROG */
- const struct brw_vec4_prog_data *prog_data = &brw->vs.prog_data->base;
+ const struct brw_stage_prog_data *prog_data = &brw->vs.prog_data->base.base;
- gen6_upload_vec4_push_constants(brw, &vp->program.Base, prog_data,
- stage_state, AUB_TRACE_VS_CONSTANTS);
+ gen6_upload_push_constants(brw, &vp->program.Base, prog_data,
+ stage_state, AUB_TRACE_VS_CONSTANTS);
if (brw->gen >= 7) {
if (brw->gen == 7 && !brw->is_haswell && !brw->is_baytrail)