From 1ab21592499b4ff55d08d0c8551325924fb4ec3c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Mathias=20Fr=C3=B6hlich?= Date: Sat, 22 Dec 2018 16:49:16 +0100 Subject: [PATCH] st/mesa: Reduce array updates due to current changes. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Since using bitmasks we can easily check if we have any current value that is potentially uploaded on array setup. So check for any potential vertex program input that is not already a vao enabled array. Only flag array update if there is a potential overlap. Reviewed-by: Marek Olšák Reviewed-by: Brian Paul Signed-off-by: Mathias Fröhlich --- src/mesa/state_tracker/st_context.c | 2 +- src/mesa/state_tracker/st_context.h | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c index 0a0bd8ba1ca..45451531df9 100644 --- a/src/mesa/state_tracker/st_context.c +++ b/src/mesa/state_tracker/st_context.c @@ -224,7 +224,7 @@ st_invalidate_state(struct gl_context *ctx) if (new_state & _NEW_PIXEL) st->dirty |= ST_NEW_PIXEL_TRANSFER; - if (new_state & _NEW_CURRENT_ATTRIB) + if (new_state & _NEW_CURRENT_ATTRIB && st_vp_uses_current_values(ctx)) st->dirty |= ST_NEW_VERTEX_ARRAYS; /* Update the vertex shader if ctx->Light._ClampVertexColor was changed. */ diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h index ed69e3d4873..324a7f24178 100644 --- a/src/mesa/state_tracker/st_context.h +++ b/src/mesa/state_tracker/st_context.h @@ -28,6 +28,7 @@ #ifndef ST_CONTEXT_H #define ST_CONTEXT_H +#include "main/arrayobj.h" #include "main/mtypes.h" #include "state_tracker/st_api.h" #include "main/fbobject.h" @@ -398,6 +399,14 @@ st_user_clip_planes_enabled(struct gl_context *ctx) ctx->Transform.ClipPlanesEnabled; } + +static inline bool +st_vp_uses_current_values(const struct gl_context *ctx) +{ + const uint64_t inputs = ctx->VertexProgram._Current->info.inputs_read; + return _mesa_draw_current_bits(ctx) & inputs; +} + /** clear-alloc a struct-sized object, with casting */ #define ST_CALLOC_STRUCT(T) (struct T *) calloc(1, sizeof(struct T)) -- 2.30.2