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

Author: Mike Blumenkrantz <[email protected]>
Date:   Fri Dec 18 12:44:11 2020 -0500

zink: create result buffers for all query streams

Reviewed-by: Dave Airlie <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9811>

---

 src/gallium/drivers/zink/zink_query.c | 47 +++++++++++++++++++++++++++++++++++
 1 file changed, 47 insertions(+)

diff --git a/src/gallium/drivers/zink/zink_query.c 
b/src/gallium/drivers/zink/zink_query.c
index 9db8ded0637..dd8fdeda474 100644
--- a/src/gallium/drivers/zink/zink_query.c
+++ b/src/gallium/drivers/zink/zink_query.c
@@ -38,12 +38,37 @@ struct zink_query {
    bool have_xfb[NUM_QUERIES]; /* xfb was active during this query */
 
    struct zink_batch_usage batch_id; //batch that the query was started in
+   struct pipe_resource *buffer;
+   struct pipe_resource *xfb_buffers[PIPE_MAX_VERTEX_STREAMS - 1];
 
    union pipe_query_result accumulated_result;
    struct zink_resource *predicate;
    bool predicate_dirty;
 };
 
+static inline unsigned
+get_num_results(enum pipe_query_type query_type)
+{
+   switch (query_type) {
+   case PIPE_QUERY_OCCLUSION_COUNTER:
+   case PIPE_QUERY_OCCLUSION_PREDICATE:
+   case PIPE_QUERY_OCCLUSION_PREDICATE_CONSERVATIVE:
+   case PIPE_QUERY_TIME_ELAPSED:
+   case PIPE_QUERY_TIMESTAMP:
+   case PIPE_QUERY_PIPELINE_STATISTICS_SINGLE:
+      return 1;
+   case PIPE_QUERY_PRIMITIVES_GENERATED:
+   case PIPE_QUERY_SO_OVERFLOW_ANY_PREDICATE:
+   case PIPE_QUERY_SO_OVERFLOW_PREDICATE:
+   case PIPE_QUERY_PRIMITIVES_EMITTED:
+      return 2;
+   default:
+      debug_printf("unknown query: %s\n",
+                   util_str_query_type(query_type, true));
+      unreachable("zink: unknown query type");
+   }
+}
+
 static VkQueryPipelineStatisticFlags
 pipeline_statistic_convert(enum pipe_statistics_query_index idx)
 {
@@ -138,8 +163,10 @@ destroy_query(struct zink_screen *screen, struct 
zink_query *query)
    for (unsigned i = 0; i < ARRAY_SIZE(query->xfb_query_pool); i++) {
       if (query->xfb_query_pool[i])
          vkDestroyQueryPool(screen->dev, query->xfb_query_pool[i], NULL);
+      pipe_resource_reference(&query->xfb_buffers[i], NULL);
    }
    pipe_resource_reference((struct pipe_resource**)&query->predicate, NULL);
+   pipe_resource_reference(&query->buffer, NULL);
    FREE(query);
 }
 
@@ -175,6 +202,12 @@ zink_create_query(struct pipe_context *pctx,
    VkResult status = vkCreateQueryPool(screen->dev, &pool_create, NULL, 
&query->query_pool);
    if (status != VK_SUCCESS)
       goto fail;
+   query->buffer = pipe_buffer_create(pctx->screen, PIPE_BIND_QUERY_BUFFER,
+                                  PIPE_USAGE_STREAM,
+                                  /* this is the maximum possible size of the 
results in a given buffer */
+                                  NUM_QUERIES * get_num_results(query_type) * 
sizeof(uint64_t));
+   if (!query->buffer)
+      goto fail;
    if (query_type == PIPE_QUERY_PRIMITIVES_GENERATED) {
       /* if xfb is active, we need to use an xfb query, otherwise we need 
pipeline statistics */
       pool_create.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
@@ -184,12 +217,26 @@ zink_create_query(struct pipe_context *pctx,
       status = vkCreateQueryPool(screen->dev, &pool_create, NULL, 
&query->xfb_query_pool[0]);
       if (status != VK_SUCCESS)
          goto fail;
+      /* need separate xfb buffer */
+      query->xfb_buffers[0] = pipe_buffer_create(pctx->screen, 
PIPE_BIND_QUERY_BUFFER,
+                                     PIPE_USAGE_STREAM,
+                                     /* this is the maximum possible size of 
the results in a given buffer */
+                                     NUM_QUERIES * get_num_results(query_type) 
* sizeof(uint64_t));
+      if (!query->xfb_buffers[0])
+         goto fail;
    } else if (query_type == PIPE_QUERY_SO_OVERFLOW_ANY_PREDICATE) {
       /* need to monitor all xfb streams */
       for (unsigned i = 0; i < ARRAY_SIZE(query->xfb_query_pool); i++) {
          status = vkCreateQueryPool(screen->dev, &pool_create, NULL, 
&query->xfb_query_pool[i]);
          if (status != VK_SUCCESS)
             goto fail;
+         /* need separate xfb buffer */
+         query->xfb_buffers[i] = pipe_buffer_create(pctx->screen, 
PIPE_BIND_QUERY_BUFFER,
+                                        PIPE_USAGE_STREAM,
+                                        /* this is the maximum possible size 
of the results in a given buffer */
+                                        NUM_QUERIES * 
get_num_results(query_type) * sizeof(uint64_t));
+         if (!query->xfb_buffers[i])
+            goto fail;
       }
    }
    struct zink_batch *batch = &zink_context(pctx)->batch;

_______________________________________________
mesa-commit mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to