[Mesa-dev] [PATCH 2/7] vbo: Add a predraw resolve callback
Marek Olšák
maraeo at gmail.com
Thu Sep 10 05:15:07 PDT 2015
Hi Chris,
Instead of the nop functions, could you just do:
if (vbo_context(ctx)->resolve)
vbo_context(ctx)->resolve(ctx);
Marek
On Wed, Sep 9, 2015 at 3:38 PM, Chris Wilson <chris at chris-wilson.co.uk> wrote:
> A common problem with using HiZ and multisampling is that surfaces need
> to resolved prior to use. Currently i965 does this inside its state
> update hook, but that is a comparatively heavyweight operation that need
> not be performed so frequently. The obvious solution (and therefore
> fraught with dragons) is to move the HiZ/color resolves into the
> brw_draw_prims() - however, the resolves are performed using meta and
> end up re-entering brw_draw_prims() corrupting the context state of the
> original call. To avoid the meta recursion, we can add a new callback
> (vbo->resolve()) into the vbo pipeline that is called just before
> vbo->draw().
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Brian Paul <brianp at vmware.com>
> Cc: Jordan Justen <jordan.l.justen at intel.com>
> Cc: Jason Ekstrand <jason.ekstrand at intel.com>
> Cc: Kenneth Graunke <kenneth at whitecape.org>
> Cc: Francisco Jerez <currojerez at riseup.net>
> ---
> src/mesa/vbo/vbo.h | 1 +
> src/mesa/vbo/vbo_context.c | 19 +++++++++++++++++++
> src/mesa/vbo/vbo_context.h | 1 +
> src/mesa/vbo/vbo_exec_array.c | 1 +
> src/mesa/vbo/vbo_exec_draw.c | 5 ++++-
> src/mesa/vbo/vbo_save_draw.c | 2 ++
> 6 files changed, 28 insertions(+), 1 deletion(-)
>
> diff --git a/src/mesa/vbo/vbo.h b/src/mesa/vbo/vbo.h
> index 2aaff5d..b64c468 100644
> --- a/src/mesa/vbo/vbo.h
> +++ b/src/mesa/vbo/vbo.h
> @@ -89,6 +89,7 @@ vbo_initialize_save_dispatch(const struct gl_context *ctx,
> struct _glapi_table *exec);
>
>
> +typedef void (*vbo_resolve_func)( struct gl_context *ctx);
> typedef void (*vbo_draw_func)( struct gl_context *ctx,
> const struct _mesa_prim *prims,
> GLuint nr_prims,
> diff --git a/src/mesa/vbo/vbo_context.c b/src/mesa/vbo/vbo_context.c
> index e3eb286..1f0b46a 100644
> --- a/src/mesa/vbo/vbo_context.c
> +++ b/src/mesa/vbo/vbo_context.c
> @@ -148,11 +148,30 @@ static void init_mat_currval(struct gl_context *ctx)
> }
>
>
> +static void nop_resolve(struct gl_context *ctx)
> +{
> +}
> +
> +static void nop_draw(struct gl_context *ctx,
> + const struct _mesa_prim *prims,
> + GLuint nr_prims,
> + const struct _mesa_index_buffer *ib,
> + GLboolean index_bounds_valid,
> + GLuint min_index,
> + GLuint max_index,
> + struct gl_transform_feedback_object *tfb_vertcount,
> + unsigned stream,
> + struct gl_buffer_object *indirect)
> +{
> +}
> +
> GLboolean _vbo_CreateContext( struct gl_context *ctx )
> {
> struct vbo_context *vbo = CALLOC_STRUCT(vbo_context);
>
> ctx->vbo_context = vbo;
> + vbo->draw_prims = nop_draw;
> + vbo->resolve = nop_resolve;
>
> /* Initialize the arrayelt helper
> */
> diff --git a/src/mesa/vbo/vbo_context.h b/src/mesa/vbo/vbo_context.h
> index a376efe..c4033ee4 100644
> --- a/src/mesa/vbo/vbo_context.h
> +++ b/src/mesa/vbo/vbo_context.h
> @@ -75,6 +75,7 @@ struct vbo_context {
> /* Callback into the driver. This must always succeed, the driver
> * is responsible for initiating any fallback actions required:
> */
> + vbo_resolve_func resolve;
> vbo_draw_func draw_prims;
> };
>
> diff --git a/src/mesa/vbo/vbo_exec_array.c b/src/mesa/vbo/vbo_exec_array.c
> index 34d2c1d..d592ae4 100644
> --- a/src/mesa/vbo/vbo_exec_array.c
> +++ b/src/mesa/vbo/vbo_exec_array.c
> @@ -549,6 +549,7 @@ vbo_bind_arrays(struct gl_context *ctx)
> struct vbo_context *vbo = vbo_context(ctx);
> struct vbo_exec_context *exec = &vbo->exec;
>
> + vbo->resolve(ctx);
> vbo_draw_method(vbo, DRAW_ARRAYS);
>
> if (exec->array.recalculate_inputs) {
> diff --git a/src/mesa/vbo/vbo_exec_draw.c b/src/mesa/vbo/vbo_exec_draw.c
> index 2bfb0c3..fa5b06b 100644
> --- a/src/mesa/vbo/vbo_exec_draw.c
> +++ b/src/mesa/vbo/vbo_exec_draw.c
> @@ -388,11 +388,14 @@ vbo_exec_vtx_flush(struct vbo_exec_context *exec, GLboolean keepUnmapped)
>
> if (exec->vtx.copied.nr != exec->vtx.vert_count) {
> struct gl_context *ctx = exec->ctx;
> +
> + vbo_context(ctx)->resolve( ctx );
>
> /* Before the update_state() as this may raise _NEW_VARYING_VP_INPUTS
> * from _mesa_set_varying_vp_inputs().
> */
> - vbo_exec_bind_arrays( ctx );
> + vbo_draw_method( vbo_context(ctx), DRAW_BEGIN_END);
> + vbo_exec_bind_arrays( ctx );
>
> if (ctx->NewState)
> _mesa_update_state( ctx );
> diff --git a/src/mesa/vbo/vbo_save_draw.c b/src/mesa/vbo/vbo_save_draw.c
> index b1fd689..2103b8e 100644
> --- a/src/mesa/vbo/vbo_save_draw.c
> +++ b/src/mesa/vbo/vbo_save_draw.c
> @@ -297,6 +297,8 @@ vbo_save_playback_vertex_list(struct gl_context *ctx, void *data)
> return;
> }
>
> + vbo_context(ctx)->resolve(ctx);
> +
> vbo_bind_vertex_list( ctx, node );
>
> vbo_draw_method(vbo_context(ctx), DRAW_DISPLAY_LIST);
> --
> 2.5.1
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list