Re: [Mesa-dev] [PATCH 05/37] i965/gen6/gs: Setup constant push buffers for gen6 geometry shaders.
On Thu, Aug 14, 2014 at 4:11 AM, Iago Toral Quiroga ito...@igalia.com wrote: --- src/mesa/drivers/dri/i965/brw_state.h| 1 + src/mesa/drivers/dri/i965/brw_state_upload.c | 1 + src/mesa/drivers/dri/i965/gen6_gs_state.c| 59 ++-- 3 files changed, 49 insertions(+), 12 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_state.h b/src/mesa/drivers/dri/i965/brw_state.h index abead18..95dc411 100644 --- a/src/mesa/drivers/dri/i965/brw_state.h +++ b/src/mesa/drivers/dri/i965/brw_state.h @@ -101,6 +101,7 @@ extern const struct brw_tracked_state gen6_clip_vp; extern const struct brw_tracked_state gen6_color_calc_state; extern const struct brw_tracked_state gen6_depth_stencil_state; extern const struct brw_tracked_state gen6_gs_state; +extern const struct brw_tracked_state gen6_gs_push_constants; extern const struct brw_tracked_state gen6_gs_binding_table; extern const struct brw_tracked_state gen6_multisample_state; extern const struct brw_tracked_state gen6_renderbuffer_surfaces; diff --git a/src/mesa/drivers/dri/i965/brw_state_upload.c b/src/mesa/drivers/dri/i965/brw_state_upload.c index 086956d..0481790 100644 --- a/src/mesa/drivers/dri/i965/brw_state_upload.c +++ b/src/mesa/drivers/dri/i965/brw_state_upload.c @@ -128,6 +128,7 @@ static const struct brw_tracked_state *gen6_atoms[] = gen6_depth_stencil_state, /* must do before cc unit */ gen6_vs_push_constants, /* Before vs_state */ + gen6_gs_push_constants, /* Before gs_state */ gen6_wm_push_constants, /* Before wm_state */ /* Surface state setup. Must come before the VS/WM unit. The binding diff --git a/src/mesa/drivers/dri/i965/gen6_gs_state.c b/src/mesa/drivers/dri/i965/gen6_gs_state.c index e132959..987b7d2 100644 --- a/src/mesa/drivers/dri/i965/gen6_gs_state.c +++ b/src/mesa/drivers/dri/i965/gen6_gs_state.c @@ -31,17 +31,36 @@ #include intel_batchbuffer.h static void -upload_gs_state_for_tf(struct brw_context *brw) +gen6_upload_gs_push_constants(struct brw_context *brw) { - /* Disable all the constant buffers. */ - BEGIN_BATCH(5); - OUT_BATCH(_3DSTATE_CONSTANT_GS 16 | (5 - 2)); - OUT_BATCH(0); - OUT_BATCH(0); - OUT_BATCH(0); - OUT_BATCH(0); - ADVANCE_BATCH(); + /* BRW_NEW_GEOMETRY_PROGRAM */ + const struct brw_geometry_program *gp = + (struct brw_geometry_program *) brw-geometry_program; + + if (gp) { + /* CACHE_NEW_GS_PROG */ + struct brw_stage_state *stage_state = brw-gs.base; + struct brw_stage_prog_data *prog_data = brw-gs.prog_data-base.base; + + gen6_upload_push_constants(brw, gp-program.Base, prog_data, + stage_state, AUB_TRACE_VS_CONSTANTS); + } Why not upload _3DSTATE_CONSTANT_GS here like gen7? -Jordan +} +const struct brw_tracked_state gen6_gs_push_constants = { + .dirty = { + .mesa = _NEW_TRANSFORM | _NEW_PROGRAM_CONSTANTS, + .brw = (BRW_NEW_BATCH | +BRW_NEW_GEOMETRY_PROGRAM | +BRW_NEW_PUSH_CONSTANT_ALLOCATION), + .cache = CACHE_NEW_GS_PROG, + }, + .emit = gen6_upload_gs_push_constants, +}; + +static void +upload_gs_state_for_tf(struct brw_context *brw) +{ if (brw-ff_gs.prog_active) { BEGIN_BATCH(7); OUT_BATCH(_3DSTATE_GS 16 | (7 - 2)); @@ -87,8 +106,8 @@ upload_gs_state(struct brw_context *brw) const struct brw_vec4_prog_data *prog_data = brw-gs.prog_data-base; const struct brw_stage_state *stage_state = brw-gs.base; - if (active) { - /* FIXME: enable constant buffers */ + if (!active || stage_state-push_const_size == 0) { + /* Disable the push constant buffers. */ BEGIN_BATCH(5); OUT_BATCH(_3DSTATE_CONSTANT_GS 16 | (5 - 2)); OUT_BATCH(0); @@ -96,7 +115,23 @@ upload_gs_state(struct brw_context *brw) OUT_BATCH(0); OUT_BATCH(0); ADVANCE_BATCH(); + } else { + BEGIN_BATCH(5); + OUT_BATCH(_3DSTATE_CONSTANT_GS 16 | + GEN6_CONSTANT_BUFFER_0_ENABLE | + (5 - 2)); + /* Pointer to the GS constant buffer. Covered by the set of + * state flags from gen6_upload_vs_constants + */ + OUT_BATCH(stage_state-push_const_offset + +stage_state-push_const_size - 1); + OUT_BATCH(0); + OUT_BATCH(0); + OUT_BATCH(0); + ADVANCE_BATCH(); + } + if (active) { BEGIN_BATCH(7); OUT_BATCH(_3DSTATE_GS 16 | (7 - 2)); OUT_BATCH(stage_state-prog_offset); @@ -163,7 +198,7 @@ upload_gs_state(struct brw_context *brw) const struct brw_tracked_state gen6_gs_state = { .dirty = { - .mesa = _NEW_TRANSFORM, + .mesa = _NEW_TRANSFORM | _NEW_PROGRAM_CONSTANTS, .brw = BRW_NEW_CONTEXT | BRW_NEW_PUSH_CONSTANT_ALLOCATION, .cache = (CACHE_NEW_GS_PROG | CACHE_NEW_FF_GS_PROG) }, -- 1.9.1
[Mesa-dev] [PATCH 05/37] i965/gen6/gs: Setup constant push buffers for gen6 geometry shaders.
--- src/mesa/drivers/dri/i965/brw_state.h| 1 + src/mesa/drivers/dri/i965/brw_state_upload.c | 1 + src/mesa/drivers/dri/i965/gen6_gs_state.c| 59 ++-- 3 files changed, 49 insertions(+), 12 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_state.h b/src/mesa/drivers/dri/i965/brw_state.h index abead18..95dc411 100644 --- a/src/mesa/drivers/dri/i965/brw_state.h +++ b/src/mesa/drivers/dri/i965/brw_state.h @@ -101,6 +101,7 @@ extern const struct brw_tracked_state gen6_clip_vp; extern const struct brw_tracked_state gen6_color_calc_state; extern const struct brw_tracked_state gen6_depth_stencil_state; extern const struct brw_tracked_state gen6_gs_state; +extern const struct brw_tracked_state gen6_gs_push_constants; extern const struct brw_tracked_state gen6_gs_binding_table; extern const struct brw_tracked_state gen6_multisample_state; extern const struct brw_tracked_state gen6_renderbuffer_surfaces; diff --git a/src/mesa/drivers/dri/i965/brw_state_upload.c b/src/mesa/drivers/dri/i965/brw_state_upload.c index 086956d..0481790 100644 --- a/src/mesa/drivers/dri/i965/brw_state_upload.c +++ b/src/mesa/drivers/dri/i965/brw_state_upload.c @@ -128,6 +128,7 @@ static const struct brw_tracked_state *gen6_atoms[] = gen6_depth_stencil_state, /* must do before cc unit */ gen6_vs_push_constants, /* Before vs_state */ + gen6_gs_push_constants, /* Before gs_state */ gen6_wm_push_constants, /* Before wm_state */ /* Surface state setup. Must come before the VS/WM unit. The binding diff --git a/src/mesa/drivers/dri/i965/gen6_gs_state.c b/src/mesa/drivers/dri/i965/gen6_gs_state.c index e132959..987b7d2 100644 --- a/src/mesa/drivers/dri/i965/gen6_gs_state.c +++ b/src/mesa/drivers/dri/i965/gen6_gs_state.c @@ -31,17 +31,36 @@ #include intel_batchbuffer.h static void -upload_gs_state_for_tf(struct brw_context *brw) +gen6_upload_gs_push_constants(struct brw_context *brw) { - /* Disable all the constant buffers. */ - BEGIN_BATCH(5); - OUT_BATCH(_3DSTATE_CONSTANT_GS 16 | (5 - 2)); - OUT_BATCH(0); - OUT_BATCH(0); - OUT_BATCH(0); - OUT_BATCH(0); - ADVANCE_BATCH(); + /* BRW_NEW_GEOMETRY_PROGRAM */ + const struct brw_geometry_program *gp = + (struct brw_geometry_program *) brw-geometry_program; + + if (gp) { + /* CACHE_NEW_GS_PROG */ + struct brw_stage_state *stage_state = brw-gs.base; + struct brw_stage_prog_data *prog_data = brw-gs.prog_data-base.base; + + gen6_upload_push_constants(brw, gp-program.Base, prog_data, + stage_state, AUB_TRACE_VS_CONSTANTS); + } +} +const struct brw_tracked_state gen6_gs_push_constants = { + .dirty = { + .mesa = _NEW_TRANSFORM | _NEW_PROGRAM_CONSTANTS, + .brw = (BRW_NEW_BATCH | +BRW_NEW_GEOMETRY_PROGRAM | +BRW_NEW_PUSH_CONSTANT_ALLOCATION), + .cache = CACHE_NEW_GS_PROG, + }, + .emit = gen6_upload_gs_push_constants, +}; + +static void +upload_gs_state_for_tf(struct brw_context *brw) +{ if (brw-ff_gs.prog_active) { BEGIN_BATCH(7); OUT_BATCH(_3DSTATE_GS 16 | (7 - 2)); @@ -87,8 +106,8 @@ upload_gs_state(struct brw_context *brw) const struct brw_vec4_prog_data *prog_data = brw-gs.prog_data-base; const struct brw_stage_state *stage_state = brw-gs.base; - if (active) { - /* FIXME: enable constant buffers */ + if (!active || stage_state-push_const_size == 0) { + /* Disable the push constant buffers. */ BEGIN_BATCH(5); OUT_BATCH(_3DSTATE_CONSTANT_GS 16 | (5 - 2)); OUT_BATCH(0); @@ -96,7 +115,23 @@ upload_gs_state(struct brw_context *brw) OUT_BATCH(0); OUT_BATCH(0); ADVANCE_BATCH(); + } else { + BEGIN_BATCH(5); + OUT_BATCH(_3DSTATE_CONSTANT_GS 16 | + GEN6_CONSTANT_BUFFER_0_ENABLE | + (5 - 2)); + /* Pointer to the GS constant buffer. Covered by the set of + * state flags from gen6_upload_vs_constants + */ + OUT_BATCH(stage_state-push_const_offset + +stage_state-push_const_size - 1); + OUT_BATCH(0); + OUT_BATCH(0); + OUT_BATCH(0); + ADVANCE_BATCH(); + } + if (active) { BEGIN_BATCH(7); OUT_BATCH(_3DSTATE_GS 16 | (7 - 2)); OUT_BATCH(stage_state-prog_offset); @@ -163,7 +198,7 @@ upload_gs_state(struct brw_context *brw) const struct brw_tracked_state gen6_gs_state = { .dirty = { - .mesa = _NEW_TRANSFORM, + .mesa = _NEW_TRANSFORM | _NEW_PROGRAM_CONSTANTS, .brw = BRW_NEW_CONTEXT | BRW_NEW_PUSH_CONSTANT_ALLOCATION, .cache = (CACHE_NEW_GS_PROG | CACHE_NEW_FF_GS_PROG) }, -- 1.9.1 ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev