gallium/u_threaded: unify user and non-user codepaths in set_constant_buffer
authorMarek Olšák <marek.olsak@amd.com>
Sat, 12 Dec 2020 22:10:00 +0000 (17:10 -0500)
committerMarge Bot <eric+marge@anholt.net>
Wed, 27 Jan 2021 23:53:35 +0000 (23:53 +0000)
We can do this cleanup thanks to take_ownership.

Reviewed-by: Zoltán Böszörményi <zboszor@gmail.com>
Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8298>

src/gallium/auxiliary/util/u_threaded_context.c

index cc7fc94..187b6c3 100644 (file)
@@ -805,29 +805,22 @@ tc_set_constant_buffer(struct pipe_context *_pipe,
       return;
    }
 
-   if (cb->user_buffer) {
-      struct pipe_resource *buffer = NULL;
-      unsigned offset;
+   struct pipe_resource *buffer;
+   unsigned offset;
 
+   if (cb->user_buffer) {
       /* This must be done before adding set_constant_buffer, because it could
        * generate e.g. transfer_unmap and flush partially-uninitialized
        * set_constant_buffer to the driver if it was done afterwards.
        */
-      u_upload_data(tc->base.const_uploader, 0, cb->buffer_size, tc->ubo_alignment,
-                    cb->user_buffer, &offset, &buffer);
+      buffer = NULL;
+      u_upload_data(tc->base.const_uploader, 0, cb->buffer_size,
+                    tc->ubo_alignment, cb->user_buffer, &offset, &buffer);
       u_upload_unmap(tc->base.const_uploader);
-
-      struct tc_constant_buffer *p =
-         tc_add_struct_typed_call(tc, TC_CALL_set_constant_buffer,
-                                  tc_constant_buffer);
-      p->info.shader = shader;
-      p->info.index = index;
-      p->info.is_null = false;
-      p->cb.buffer_size = cb->buffer_size;
-      p->cb.user_buffer = NULL;
-      p->cb.buffer_offset = offset;
-      p->cb.buffer = buffer;
-      return;
+      take_ownership = true;
+   } else {
+      buffer = cb->buffer;
+      offset = cb->buffer_offset;
    }
 
    struct tc_constant_buffer *p =
@@ -837,13 +830,13 @@ tc_set_constant_buffer(struct pipe_context *_pipe,
    p->info.index = index;
    p->info.is_null = false;
    p->cb.user_buffer = NULL;
-   p->cb.buffer_offset = cb->buffer_offset;
+   p->cb.buffer_offset = offset;
    p->cb.buffer_size = cb->buffer_size;
 
    if (take_ownership)
-      p->cb.buffer = cb->buffer;
+      p->cb.buffer = buffer;
    else
-      tc_set_resource_reference(&p->cb.buffer, cb->buffer);
+      tc_set_resource_reference(&p->cb.buffer, buffer);
 }
 
 struct tc_inlinable_constants {