Mesa (master): llvmpipe: handle SO statistics multi value query copy. (v2)

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Dec 21 01:30:43 UTC 2020


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

Author: Dave Airlie <airlied at redhat.com>
Date:   Fri Dec 18 08:29:12 2020 +1000

llvmpipe: handle SO statistics multi value query copy. (v2)

This is hard to abstract using the vulkan interface, so just
add support for copying both values in the llvmpipe backend
for the lavapipe frontend.

v2: use a loop

Reviewed-by: Roland Scheidegger <sroland at vmware.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7981>

---

 src/gallium/drivers/llvmpipe/lp_query.c | 71 ++++++++++++++++++++-------------
 1 file changed, 43 insertions(+), 28 deletions(-)

diff --git a/src/gallium/drivers/llvmpipe/lp_query.c b/src/gallium/drivers/llvmpipe/lp_query.c
index 6fac76b94fb..0a5d63a0bbe 100644
--- a/src/gallium/drivers/llvmpipe/lp_query.c
+++ b/src/gallium/drivers/llvmpipe/lp_query.c
@@ -215,7 +215,8 @@ llvmpipe_get_query_result_resource(struct pipe_context *pipe,
    }
 
 
-   uint64_t value = 0;
+   uint64_t value = 0, value2 = 0;
+   unsigned num_values = 1;
    if (index == -1)
       if (unsignalled)
          value = 0;
@@ -259,6 +260,11 @@ llvmpipe_get_query_result_resource(struct pipe_context *pipe,
             }
          }
          break;
+      case PIPE_QUERY_SO_STATISTICS:
+         value = pq->num_primitives_written[0];
+         value2 = pq->num_primitives_generated[0];
+         num_values = 2;
+         break;
       case PIPE_QUERY_SO_OVERFLOW_ANY_PREDICATE:
          value = 0;
          for (unsigned s = 0; s < PIPE_MAX_VERTEX_STREAMS; s++)
@@ -315,33 +321,42 @@ llvmpipe_get_query_result_resource(struct pipe_context *pipe,
    }
 
    void *dst = (uint8_t *)lpr->data + offset;
-   switch (result_type) {
-   case PIPE_QUERY_TYPE_I32: {
-      int32_t *iptr = (int32_t *)dst;
-      if (value > 0x7fffffff)
-         *iptr = 0x7fffffff;
-      else
-         *iptr = (int32_t)value;
-      break;
-   }
-   case PIPE_QUERY_TYPE_U32: {
-      uint32_t *uptr = (uint32_t *)dst;
-      if (value > 0xffffffff)
-         *uptr = 0xffffffff;
-      else
-         *uptr = (uint32_t)value;
-      break;
-   }
-   case PIPE_QUERY_TYPE_I64: {
-      int64_t *iptr = (int64_t *)dst;
-      *iptr = (int64_t)value;
-      break;
-   }
-   case PIPE_QUERY_TYPE_U64: {
-      uint64_t *uptr = (uint64_t *)dst;
-      *uptr = (uint64_t)value;
-      break;
-   }
+
+   for (unsigned i = 0; i < num_values; i++) {
+
+      if (i == 1) {
+         value = value2;
+         dst = (char *)dst + ((result_type == PIPE_QUERY_TYPE_I64 ||
+                               result_type == PIPE_QUERY_TYPE_U64) ? 8 : 4);
+      }
+      switch (result_type) {
+      case PIPE_QUERY_TYPE_I32: {
+         int32_t *iptr = (int32_t *)dst;
+         if (value > 0x7fffffff)
+            *iptr = 0x7fffffff;
+         else
+            *iptr = (int32_t)value;
+         break;
+      }
+      case PIPE_QUERY_TYPE_U32: {
+         uint32_t *uptr = (uint32_t *)dst;
+         if (value > 0xffffffff)
+            *uptr = 0xffffffff;
+         else
+            *uptr = (uint32_t)value;
+         break;
+      }
+      case PIPE_QUERY_TYPE_I64: {
+         int64_t *iptr = (int64_t *)dst;
+         *iptr = (int64_t)value;
+         break;
+      }
+      case PIPE_QUERY_TYPE_U64: {
+         uint64_t *uptr = (uint64_t *)dst;
+         *uptr = (uint64_t)value;
+         break;
+      }
+      }
    }
 }
 



More information about the mesa-commit mailing list