From: Nicolai Hähnle Date: Sat, 9 Jan 2016 23:05:58 +0000 (-0500) Subject: st/mesa: implement Driver.InvalidateBufferSubData X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=70e66c57bbff930f7caa8606e75cfc91417bbc67;p=mesa.git st/mesa: implement Driver.InvalidateBufferSubData Reviewed-by: Marek Olšák --- diff --git a/src/mesa/state_tracker/st_cb_bufferobjects.c b/src/mesa/state_tracker/st_cb_bufferobjects.c index 0c5fecea51f..68be8ba64ac 100644 --- a/src/mesa/state_tracker/st_cb_bufferobjects.c +++ b/src/mesa/state_tracker/st_cb_bufferobjects.c @@ -332,6 +332,31 @@ st_bufferobj_data(struct gl_context *ctx, } +/** + * Called via glInvalidateBuffer(Sub)Data. + */ +static void +st_bufferobj_invalidate(struct gl_context *ctx, + struct gl_buffer_object *obj, + GLintptr offset, + GLsizeiptr size) +{ + struct st_context *st = st_context(ctx); + struct pipe_context *pipe = st->pipe; + struct st_buffer_object *st_obj = st_buffer_object(obj); + + /* We ignore partial invalidates. */ + if (offset != 0 || size != obj->Size) + return; + + /* Nothing to invalidate. */ + if (!st_obj->buffer) + return; + + pipe->invalidate_resource(pipe, st_obj->buffer); +} + + /** * Called via glMapBufferRange(). */ @@ -517,7 +542,8 @@ st_bufferobj_validate_usage(struct st_context *st, void -st_init_bufferobject_functions(struct dd_function_table *functions) +st_init_bufferobject_functions(struct pipe_screen *screen, + struct dd_function_table *functions) { /* plug in default driver fallbacks (such as for ClearBufferSubData) */ _mesa_init_buffer_object_functions(functions); @@ -532,4 +558,7 @@ st_init_bufferobject_functions(struct dd_function_table *functions) functions->UnmapBuffer = st_bufferobj_unmap; functions->CopyBufferSubData = st_copy_buffer_subdata; functions->ClearBufferSubData = st_clear_buffer_subdata; + + if (screen->get_param(screen, PIPE_CAP_INVALIDATE_BUFFER)) + functions->InvalidateBufferSubData = st_bufferobj_invalidate; } diff --git a/src/mesa/state_tracker/st_cb_bufferobjects.h b/src/mesa/state_tracker/st_cb_bufferobjects.h index 647efe4cc9c..f55e2ef542b 100644 --- a/src/mesa/state_tracker/st_cb_bufferobjects.h +++ b/src/mesa/state_tracker/st_cb_bufferobjects.h @@ -62,7 +62,8 @@ st_bufferobj_validate_usage(struct st_context *st, extern void -st_init_bufferobject_functions(struct dd_function_table *functions); +st_init_bufferobject_functions(struct pipe_screen *screen, + struct dd_function_table *functions); #endif diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c index 87193a9d478..4add50e3ed9 100644 --- a/src/mesa/state_tracker/st_context.c +++ b/src/mesa/state_tracker/st_context.c @@ -446,7 +446,7 @@ void st_init_driver_functions(struct pipe_screen *screen, _mesa_init_sampler_object_functions(functions); st_init_blit_functions(functions); - st_init_bufferobject_functions(functions); + st_init_bufferobject_functions(screen, functions); st_init_clear_functions(functions); st_init_bitmap_functions(functions); st_init_copy_image_functions(functions);