From 70e66c57bbff930f7caa8606e75cfc91417bbc67 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Nicolai=20H=C3=A4hnle?= Date: Sat, 9 Jan 2016 18:05:58 -0500 Subject: [PATCH] st/mesa: implement Driver.InvalidateBufferSubData MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Reviewed-by: Marek Olšák --- src/mesa/state_tracker/st_cb_bufferobjects.c | 31 +++++++++++++++++++- src/mesa/state_tracker/st_cb_bufferobjects.h | 3 +- src/mesa/state_tracker/st_context.c | 2 +- 3 files changed, 33 insertions(+), 3 deletions(-) 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); -- 2.30.2