gallium: add a way to store query result into buffer
authorIlia Mirkin <imirkin@alum.mit.edu>
Sun, 3 May 2015 00:28:11 +0000 (20:28 -0400)
committerIlia Mirkin <imirkin@alum.mit.edu>
Fri, 5 Feb 2016 02:21:30 +0000 (21:21 -0500)
Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/docs/source/context.rst
src/gallium/include/pipe/p_context.h
src/gallium/include/pipe/p_defines.h

index 4c03e00008c2ac0ae03df499a293711902e1b54d..904e1ff04e78a551ab89f9927ad989a6b618d0b5 100644 (file)
@@ -325,6 +325,11 @@ returned).  Otherwise, if the ``wait`` parameter is FALSE, the call
 will not block and the return value will be TRUE if the query has
 completed or FALSE otherwise.
 
+``get_query_result_resource`` is used to store the result of a query into
+a resource without synchronizing with the CPU. This write will optionally
+wait for the query to complete, and will optionally write whether the value
+is available instead of the value itself.
+
 The interface currently includes the following types of queries:
 
 ``PIPE_QUERY_OCCLUSION_COUNTER`` counts the number of fragments which
index f69a75be50eaf3dc3516f83de3c92bdd33cc1d86..6c95b7b2178e2fded5c678980f393c83ebefe46d 100644 (file)
@@ -150,6 +150,28 @@ struct pipe_context {
                                struct pipe_query *q,
                                boolean wait,
                                union pipe_query_result *result);
+
+   /**
+    * Get results of a query, storing into resource. Note that this may not
+    * be used with batch queries.
+    *
+    * \param wait  if true, this query will block until the result is ready
+    * \param result_type  the type of the value being stored:
+    * \param index  for queries that return multiple pieces of data, which
+    *               item of that data to store (e.g. for
+    *               PIPE_QUERY_PIPELINE_STATISTICS).
+    *               When the index is -1, instead of the value of the query
+    *               the driver should instead write a 1/0 to the appropriate
+    *               location with 1 meaning that the query result is available.
+    */
+   void (*get_query_result_resource)(struct pipe_context *pipe,
+                                     struct pipe_query *q,
+                                     boolean wait,
+                                     enum pipe_query_value_type result_type,
+                                     int index,
+                                     struct pipe_resource *resource,
+                                     unsigned offset);
+
    /*@}*/
 
    /**
index a96c06f9d8c0a1af2e329389c88326dddfda363c..fb845520afc5e5d588a7f194c478a0bc84612a5e 100644 (file)
@@ -353,6 +353,7 @@ enum pipe_flush_flags
  */
 #define PIPE_BARRIER_MAPPED_BUFFER     (1 << 0)
 #define PIPE_BARRIER_SHADER_BUFFER     (1 << 1)
+#define PIPE_BARRIER_QUERY_BUFFER      (1 << 2)
 
 /**
  * Resource binding flags -- state tracker must specify in advance all
@@ -376,6 +377,7 @@ enum pipe_flush_flags
 #define PIPE_BIND_SHADER_IMAGE         (1 << 15) /* set_shader_images */
 #define PIPE_BIND_COMPUTE_RESOURCE     (1 << 16) /* set_compute_resources */
 #define PIPE_BIND_COMMAND_ARGS_BUFFER  (1 << 17) /* pipe_draw_info.indirect */
+#define PIPE_BIND_QUERY_BUFFER         (1 << 18) /* get_query_result_resource */
 
 /**
  * The first two flags above were previously part of the amorphous
@@ -840,6 +842,14 @@ union pipe_query_result
    union pipe_numeric_type_union batch[1];
 };
 
+enum pipe_query_value_type
+{
+   PIPE_QUERY_TYPE_I32,
+   PIPE_QUERY_TYPE_U32,
+   PIPE_QUERY_TYPE_I64,
+   PIPE_QUERY_TYPE_U64,
+};
+
 union pipe_color_union
 {
    float f[4];