On 26 August 2013 15:12, Paul Berry <stereotype...@gmail.com> wrote: > This patch implements pull constant upload, binding table upload, and > surface setup for geometry shaders, by re-using vertex shader code > that was generalized in previous patches. > > Based on work by Eric Anholt <e...@anholt.net>. > --- > src/mesa/drivers/dri/i965/Makefile.sources | 1 + > src/mesa/drivers/dri/i965/brw_context.h | 2 + > src/mesa/drivers/dri/i965/brw_gs_surface_state.c | 123 > +++++++++++++++++++++++ > src/mesa/drivers/dri/i965/brw_state.h | 3 + > src/mesa/drivers/dri/i965/brw_state_upload.c | 3 + > 5 files changed, 132 insertions(+) > create mode 100644 src/mesa/drivers/dri/i965/brw_gs_surface_state.c > > diff --git a/src/mesa/drivers/dri/i965/Makefile.sources > b/src/mesa/drivers/dri/i965/Makefile.sources > index 290cd93..81a16ff 100644 > --- a/src/mesa/drivers/dri/i965/Makefile.sources > +++ b/src/mesa/drivers/dri/i965/Makefile.sources > @@ -63,6 +63,7 @@ i965_FILES = \ > brw_gs.c \ > brw_gs_emit.c \ > brw_gs_state.c \ > + brw_gs_surface_state.c \ > brw_interpolation_map.c \ > brw_lower_texture_gradients.cpp \ > brw_misc_state.c \ > diff --git a/src/mesa/drivers/dri/i965/brw_context.h > b/src/mesa/drivers/dri/i965/brw_context.h > index 35193a6..622b5c8 100644 > --- a/src/mesa/drivers/dri/i965/brw_context.h > +++ b/src/mesa/drivers/dri/i965/brw_context.h > @@ -148,6 +148,7 @@ enum brw_state_id { > BRW_STATE_BATCH, > BRW_STATE_INDEX_BUFFER, > BRW_STATE_VS_CONSTBUF, > + BRW_STATE_GS_CONSTBUF, > BRW_STATE_PROGRAM_CACHE, > BRW_STATE_STATE_BASE_ADDRESS, > BRW_STATE_VUE_MAP_VS, > @@ -185,6 +186,7 @@ enum brw_state_id { > /** \see brw.state.depth_region */ > #define BRW_NEW_INDEX_BUFFER (1 << BRW_STATE_INDEX_BUFFER) > #define BRW_NEW_VS_CONSTBUF (1 << BRW_STATE_VS_CONSTBUF) > +#define BRW_NEW_GS_CONSTBUF (1 << BRW_STATE_GS_CONSTBUF) > #define BRW_NEW_PROGRAM_CACHE (1 << BRW_STATE_PROGRAM_CACHE) > #define BRW_NEW_STATE_BASE_ADDRESS (1 << BRW_STATE_STATE_BASE_ADDRESS) > #define BRW_NEW_VUE_MAP_VS (1 << BRW_STATE_VUE_MAP_VS) > diff --git a/src/mesa/drivers/dri/i965/brw_gs_surface_state.c > b/src/mesa/drivers/dri/i965/brw_gs_surface_state.c > new file mode 100644 > index 0000000..d3d48ff > --- /dev/null > +++ b/src/mesa/drivers/dri/i965/brw_gs_surface_state.c > @@ -0,0 +1,123 @@ > +/* > + * Copyright © 2013 Intel Corporation > + * > + * Permission is hereby granted, free of charge, to any person obtaining a > + * copy of this software and associated documentation files (the > "Software"), > + * to deal in the Software without restriction, including without > limitation > + * the rights to use, copy, modify, merge, publish, distribute, > sublicense, > + * and/or sell copies of the Software, and to permit persons to whom the > + * Software is furnished to do so, subject to the following conditions: > + * > + * The above copyright notice and this permission notice (including the > next > + * paragraph) shall be included in all copies or substantial portions of > the > + * Software. > + * > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, > EXPRESS OR > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF > MERCHANTABILITY, > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT > SHALL > + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR > OTHER > + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING > + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER > DEALINGS > + * IN THE SOFTWARE. > + */ > + > +#include "main/mtypes.h" > +#include "program/prog_parameter.h" > + > +#include "brw_context.h" > +#include "brw_state.h" > + > + > +/* Creates a new GS constant buffer reflecting the current GS program's > + * constants, if needed by the GS program. > + * > + * Otherwise, constants go through the CURBEs using the > brw_constant_buffer > + * state atom. > + */ > +static void > +brw_upload_gs_pull_constants(struct brw_context *brw) > +{ > + struct brw_vec4_context_base *vec4_ctx = &brw->gs.base; > + > + /* BRW_NEW_GEOMETRY_PROGRAM */ > + struct brw_geometry_program *gp = > + (struct brw_geometry_program *) brw->geometry_program; > + > + if (!gp) > + return; > + > + /* CACHE_NEW_GS_PROG */ > + const struct brw_vec4_prog_data *prog_data = &brw->gs.prog_data->base; > + > + /* _NEW_PROGRAM_CONSTANTS */ > + brw_upload_vec4_pull_constants(brw, BRW_NEW_GS_CONSTBUF, > &gp->program.Base, > + vec4_ctx, prog_data); > +} > + > +const struct brw_tracked_state brw_gs_pull_constants = { > + .dirty = { > + .mesa = (_NEW_PROGRAM_CONSTANTS), > + .brw = (BRW_NEW_BATCH | BRW_NEW_GEOMETRY_PROGRAM), > + .cache = CACHE_NEW_GS_PROG, > + }, > + .emit = brw_upload_gs_pull_constants, > +}; > + > +static void > +brw_upload_gs_ubo_surfaces(struct brw_context *brw) > +{ > + struct gl_context *ctx = &brw->ctx; > + struct brw_vec4_context_base *vec4_ctx = &brw->gs.base; > + > + /* _NEW_PROGRAM */ > + struct gl_shader_program *prog = ctx->Shader.CurrentGeometryProgram; > + > + if (!prog) > + return; > + > + brw_upload_ubo_surfaces(brw, > prog->_LinkedShaders[MESA_SHADER_GEOMETRY], > + &vec4_ctx->surf_offset[SURF_INDEX_VEC4_UBO(0)]); > +} > + > +const struct brw_tracked_state brw_gs_ubo_surfaces = { > + .dirty = { > + .mesa = (_NEW_PROGRAM | > + _NEW_BUFFER_OBJECT), > + .brw = BRW_NEW_BATCH, > + .cache = 0, >
Whoops, I neglected to account for commit 77d8fbc (mesa: add & use a new driver flag for UBO updates instead of _NEW_BUFFER_OBJECT). This should be: .dirty = { .mesa = _NEW_PROGRAM, .brw = BRW_NEW_BATCH | BRW_NEW_UNIFORM_BUFFER, .cache = 0, }, I've fixed it in my "gs" branch. > + }, > + .emit = brw_upload_gs_ubo_surfaces, > +}; > + > + > +/** > + * Constructs the binding table for the WM surface state, which maps unit > + * numbers to surface state objects. > + */ > +static void > +brw_gs_upload_binding_table(struct brw_context *brw) > +{ > + struct brw_vec4_context_base *vec4_ctx = &brw->gs.base; > + > + /* If there's no GS, skip changing anything. */ > + if (!brw->gs.prog_data) > + return; > + > + /* CACHE_NEW_GS_PROG */ > + const struct brw_vec4_prog_data *prog_data = &brw->gs.prog_data->base; > + > + /* BRW_NEW_SURFACES and BRW_NEW_GS_CONSTBUF */ > + brw_vec4_upload_binding_table(brw, BRW_NEW_GS_BINDING_TABLE, vec4_ctx, > + prog_data); > +} > + > +const struct brw_tracked_state brw_gs_binding_table = { > + .dirty = { > + .mesa = 0, > + .brw = (BRW_NEW_BATCH | > + BRW_NEW_GS_CONSTBUF | > + BRW_NEW_SURFACES), > + .cache = CACHE_NEW_GS_PROG > + }, > + .emit = brw_gs_upload_binding_table, > +}; > diff --git a/src/mesa/drivers/dri/i965/brw_state.h > b/src/mesa/drivers/dri/i965/brw_state.h > index 3a2f54f..72ac84c 100644 > --- a/src/mesa/drivers/dri/i965/brw_state.h > +++ b/src/mesa/drivers/dri/i965/brw_state.h > @@ -47,6 +47,7 @@ extern const struct brw_tracked_state brw_cc_unit; > extern const struct brw_tracked_state brw_clip_prog; > extern const struct brw_tracked_state brw_clip_unit; > extern const struct brw_tracked_state brw_vs_pull_constants; > +extern const struct brw_tracked_state brw_gs_pull_constants; > extern const struct brw_tracked_state brw_wm_pull_constants; > extern const struct brw_tracked_state brw_constant_buffer; > extern const struct brw_tracked_state brw_curbe_offsets; > @@ -69,11 +70,13 @@ extern const struct brw_tracked_state brw_urb_fence; > extern const struct brw_tracked_state brw_vs_prog; > extern const struct brw_tracked_state brw_vs_samplers; > extern const struct brw_tracked_state brw_vs_ubo_surfaces; > +extern const struct brw_tracked_state brw_gs_ubo_surfaces; > extern const struct brw_tracked_state brw_vs_unit; > extern const struct brw_tracked_state brw_wm_prog; > extern const struct brw_tracked_state brw_renderbuffer_surfaces; > extern const struct brw_tracked_state brw_texture_surfaces; > extern const struct brw_tracked_state brw_wm_binding_table; > +extern const struct brw_tracked_state brw_gs_binding_table; > extern const struct brw_tracked_state brw_vs_binding_table; > extern const struct brw_tracked_state brw_wm_ubo_surfaces; > extern const struct brw_tracked_state brw_wm_unit; > diff --git a/src/mesa/drivers/dri/i965/brw_state_upload.c > b/src/mesa/drivers/dri/i965/brw_state_upload.c > index 9638c69..0d77c9e 100644 > --- a/src/mesa/drivers/dri/i965/brw_state_upload.c > +++ b/src/mesa/drivers/dri/i965/brw_state_upload.c > @@ -202,11 +202,14 @@ static const struct brw_tracked_state *gen7_atoms[] = > */ > &brw_vs_pull_constants, > &brw_vs_ubo_surfaces, > + &brw_gs_pull_constants, > + &brw_gs_ubo_surfaces, > &brw_wm_pull_constants, > &brw_wm_ubo_surfaces, > &gen6_renderbuffer_surfaces, > &brw_texture_surfaces, > &brw_vs_binding_table, > + &brw_gs_binding_table, > &brw_wm_binding_table, > > &brw_fs_samplers, > -- > 1.8.4 > >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev