st/mesa: Reduce array updates due to current changes.

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 <marek.olsak@amd.com>
Reviewed-by: Brian Paul <brianp@vmware.com>
Signed-off-by: Mathias Fröhlich <Mathias.Froehlich@web.de>
This commit is contained in:
Mathias Fröhlich
2018-12-22 16:49:16 +01:00
parent 6f42303646
commit 1ab2159249
2 changed files with 10 additions and 1 deletions

View File

@@ -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. */

View File

@@ -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))