gallium/u_threaded: add a fast path for unbinding shader buffers
authorMarek Olšák <marek.olsak@amd.com>
Fri, 12 May 2017 19:38:12 +0000 (21:38 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Thu, 18 May 2017 20:15:02 +0000 (22:15 +0200)
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/gallium/auxiliary/util/u_threaded_context.c

index e33c846379630e446a98ff4c2545a48df92009f7..8ea7f8aa260d956461a9e1e59f3f2d3ca1bc04d8 100644 (file)
@@ -824,6 +824,7 @@ tc_set_shader_images(struct pipe_context *_pipe,
 
 struct tc_shader_buffers {
    ubyte shader, start, count;
+   bool unbind;
    struct pipe_shader_buffer slot[0]; /* more will be allocated if needed */
 };
 
@@ -833,6 +834,11 @@ tc_call_set_shader_buffers(struct pipe_context *pipe, union tc_payload *payload)
    struct tc_shader_buffers *p = (struct tc_shader_buffers *)payload;
    unsigned count = p->count;
 
+   if (p->unbind) {
+      pipe->set_shader_buffers(pipe, p->shader, p->start, p->count, NULL);
+      return;
+   }
+
    pipe->set_shader_buffers(pipe, p->shader, p->start, p->count, p->slot);
 
    for (unsigned i = 0; i < count; i++)
@@ -849,11 +855,13 @@ tc_set_shader_buffers(struct pipe_context *_pipe, unsigned shader,
 
    struct threaded_context *tc = threaded_context(_pipe);
    struct tc_shader_buffers *p =
-      tc_add_slot_based_call(tc, TC_CALL_set_shader_buffers, tc_shader_buffers, count);
+      tc_add_slot_based_call(tc, TC_CALL_set_shader_buffers, tc_shader_buffers,
+                             buffers ? count : 0);
 
    p->shader = shader;
    p->start = start;
    p->count = count;
+   p->unbind = buffers == NULL;
 
    if (buffers) {
       for (unsigned i = 0; i < count; i++) {
@@ -871,8 +879,6 @@ tc_set_shader_buffers(struct pipe_context *_pipe, unsigned shader,
                            src->buffer_offset + src->buffer_size);
          }
       }
-   } else {
-      memset(p->slot, 0, count * sizeof(buffers[0]));
    }
 }