A driver doesn't have to set _NEW_BUFFER_OBJECT if it doesn't reallocate the buffer from core Mesa's point of view, which avoids unnecessary state validation.
Gallium drivers can be asked to reallocate a buffer privately by setting PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE. st/mesa doesn't set _NEW_BUFFER_OBJECT if transfer_inline_write is used. --- src/mesa/drivers/dri/intel/intel_buffer_objects.c | 2 ++ src/mesa/drivers/dri/nouveau/nouveau_bufferobj.c | 4 +++- src/mesa/drivers/dri/radeon/radeon_buffer_objects.c | 2 ++ src/mesa/main/bufferobj.c | 4 +++- src/mesa/state_tracker/st_cb_bufferobjects.c | 2 ++ 5 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/mesa/drivers/dri/intel/intel_buffer_objects.c b/src/mesa/drivers/dri/intel/intel_buffer_objects.c index e270db8..4499764 100644 --- a/src/mesa/drivers/dri/intel/intel_buffer_objects.c +++ b/src/mesa/drivers/dri/intel/intel_buffer_objects.c @@ -128,6 +128,8 @@ intel_bufferobj_data(struct gl_context * ctx, (void) target; #endif + ctx->NewState |= _NEW_BUFFER_OBJECT; + intel_obj->Base.Size = size; intel_obj->Base.Usage = usage; diff --git a/src/mesa/drivers/dri/nouveau/nouveau_bufferobj.c b/src/mesa/drivers/dri/nouveau/nouveau_bufferobj.c index 717c0b8..2508933 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_bufferobj.c +++ b/src/mesa/drivers/dri/nouveau/nouveau_bufferobj.c @@ -79,7 +79,9 @@ nouveau_bufferobj_data(struct gl_context *ctx, GLenum target, GLsizeiptrARB size struct nouveau_bufferobj *nbo = to_nouveau_bufferobj(obj); int ret; - obj->Size = size; + ctx->NewState |= _NEW_BUFFER_OBJECT; + + obj->Size = size; obj->Usage = usage; /* Free previous storage */ diff --git a/src/mesa/drivers/dri/radeon/radeon_buffer_objects.c b/src/mesa/drivers/dri/radeon/radeon_buffer_objects.c index 5abc52b..c855224 100644 --- a/src/mesa/drivers/dri/radeon/radeon_buffer_objects.c +++ b/src/mesa/drivers/dri/radeon/radeon_buffer_objects.c @@ -92,6 +92,8 @@ radeonBufferData(struct gl_context * ctx, radeonContextPtr radeon = RADEON_CONTEXT(ctx); struct radeon_buffer_object *radeon_obj = get_radeon_buffer_object(obj); + ctx->NewState |= _NEW_BUFFER_OBJECT; + radeon_obj->Base.Size = size; radeon_obj->Base.Usage = usage; diff --git a/src/mesa/main/bufferobj.c b/src/mesa/main/bufferobj.c index b82ba7b..32a69aa 100644 --- a/src/mesa/main/bufferobj.c +++ b/src/mesa/main/bufferobj.c @@ -413,6 +413,8 @@ _mesa_buffer_data( struct gl_context *ctx, GLenum target, GLsizeiptrARB size, (void) ctx; (void) target; + ctx->NewState |= _NEW_BUFFER_OBJECT; + new_data = _mesa_realloc( bufObj->Data, bufObj->Size, size ); if (new_data) { bufObj->Data = (GLubyte *) new_data; @@ -1061,7 +1063,7 @@ _mesa_BufferData(GLenum target, GLsizeiptrARB size, ASSERT(bufObj->Pointer == NULL); } - FLUSH_VERTICES(ctx, _NEW_BUFFER_OBJECT); + FLUSH_VERTICES(ctx, 0); bufObj->Written = GL_TRUE; diff --git a/src/mesa/state_tracker/st_cb_bufferobjects.c b/src/mesa/state_tracker/st_cb_bufferobjects.c index 1b3991c..60df7cc 100644 --- a/src/mesa/state_tracker/st_cb_bufferobjects.c +++ b/src/mesa/state_tracker/st_cb_bufferobjects.c @@ -196,6 +196,8 @@ st_bufferobj_data(struct gl_context *ctx, return GL_TRUE; } + ctx->NewState |= _NEW_BUFFER_OBJECT; + st_obj->Base.Size = size; st_obj->Base.Usage = usage; -- 1.7.10.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev