Mesa (master): gallium/u_threaded: add a fast path for unbinding shader images

Marek Olšák mareko at kemper.freedesktop.org
Thu May 18 20:15:16 UTC 2017


Module: Mesa
Branch: master
Commit: d4c8f429d1d56bd99035ee30fa2cba3335057b03
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=d4c8f429d1d56bd99035ee30fa2cba3335057b03

Author: Marek Olšák <marek.olsak at amd.com>
Date:   Fri May 12 21:38:12 2017 +0200

gallium/u_threaded: add a fast path for unbinding shader images

Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>

---

 src/gallium/auxiliary/util/u_threaded_context.c | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/src/gallium/auxiliary/util/u_threaded_context.c b/src/gallium/auxiliary/util/u_threaded_context.c
index 50cb820440..e33c846379 100644
--- a/src/gallium/auxiliary/util/u_threaded_context.c
+++ b/src/gallium/auxiliary/util/u_threaded_context.c
@@ -155,7 +155,7 @@ tc_add_sized_call(struct threaded_context *tc, enum tc_call_id id,
    ((struct type*)tc_add_sized_call(tc, execute, \
                                     sizeof(struct type) + \
                                     sizeof(((struct type*)NULL)->slot[0]) * \
-                                    num_slots))
+                                    (num_slots)))
 
 static union tc_payload *
 tc_add_small_call(struct threaded_context *tc, enum tc_call_id id)
@@ -764,6 +764,7 @@ tc_set_sampler_views(struct pipe_context *_pipe,
 
 struct tc_shader_images {
    ubyte shader, start, count;
+   bool unbind;
    struct pipe_image_view slot[0]; /* more will be allocated if needed */
 };
 
@@ -773,6 +774,11 @@ tc_call_set_shader_images(struct pipe_context *pipe, union tc_payload *payload)
    struct tc_shader_images *p = (struct tc_shader_images *)payload;
    unsigned count = p->count;
 
+   if (p->unbind) {
+      pipe->set_shader_images(pipe, p->shader, p->start, p->count, NULL);
+      return;
+   }
+
    pipe->set_shader_images(pipe, p->shader, p->start, p->count, p->slot);
 
    for (unsigned i = 0; i < count; i++)
@@ -790,11 +796,13 @@ tc_set_shader_images(struct pipe_context *_pipe,
 
    struct threaded_context *tc = threaded_context(_pipe);
    struct tc_shader_images *p =
-      tc_add_slot_based_call(tc, TC_CALL_set_shader_images, tc_shader_images, count);
+      tc_add_slot_based_call(tc, TC_CALL_set_shader_images, tc_shader_images,
+                             images ? count : 0);
 
    p->shader = shader;
    p->start = start;
    p->count = count;
+   p->unbind = images == NULL;
 
    if (images) {
       for (unsigned i = 0; i < count; i++) {
@@ -811,8 +819,6 @@ tc_set_shader_images(struct pipe_context *_pipe,
          }
       }
       memcpy(p->slot, images, count * sizeof(images[0]));
-   } else {
-      memset(p->slot, 0, count * sizeof(images[0]));
    }
 }
 




More information about the mesa-commit mailing list