[Mesa-dev] [PATCH v2 07/11] gallium: add a way to store query result into buffer

Marek Olšák maraeo at gmail.com
Wed Feb 3 16:45:24 UTC 2016


On Wed, Feb 3, 2016 at 4:59 PM, Ilia Mirkin <imirkin at alum.mit.edu> wrote:
> On Wed, Feb 3, 2016 at 5:07 AM, Marek Olšák <maraeo at gmail.com> wrote:
>> On Sun, Jan 31, 2016 at 9:32 PM, Ilia Mirkin <imirkin at alum.mit.edu> wrote:
>>> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
>>> ---
>>>  src/gallium/docs/source/context.rst  |  5 +++++
>>>  src/gallium/include/pipe/p_context.h | 22 ++++++++++++++++++++++
>>>  src/gallium/include/pipe/p_defines.h | 10 ++++++++++
>>>  3 files changed, 37 insertions(+)
>>>
>>> diff --git a/src/gallium/docs/source/context.rst b/src/gallium/docs/source/context.rst
>>> index 4c03e00..904e1ff 100644
>>> --- a/src/gallium/docs/source/context.rst
>>> +++ b/src/gallium/docs/source/context.rst
>>> @@ -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
>>> diff --git a/src/gallium/include/pipe/p_context.h b/src/gallium/include/pipe/p_context.h
>>> index f69a75b..6c95b7b 100644
>>> --- a/src/gallium/include/pipe/p_context.h
>>> +++ b/src/gallium/include/pipe/p_context.h
>>> @@ -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);
>>> +
>>>     /*@}*/
>>>
>>>     /**
>>> diff --git a/src/gallium/include/pipe/p_defines.h b/src/gallium/include/pipe/p_defines.h
>>> index 335f4e6..6cdb099 100644
>>> --- a/src/gallium/include/pipe/p_defines.h
>>> +++ b/src/gallium/include/pipe/p_defines.h
>>> @@ -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
>>> @@ -838,6 +840,14 @@ union pipe_query_result
>>>     union pipe_numeric_type_union batch[1];
>>>  };
>>>
>>> +enum pipe_query_value_type
>>> +{
>>> +   QUERY_I32,
>>> +   QUERY_U32,
>>> +   QUERY_I64,
>>> +   QUERY_U64,
>>> +};
>>
>> This should have a PIPE_ prefix, e.g. PIPE_QUERY_TYPE_...
>
> So like PIPE_QUERY_TYPE_I32 and such? That sounds good to me.
>
>>
>> Other than that, patches 1-8, 10-11:
>>
>> Reviewed-by: Marek Olšák <marek.olsak at amd.com>
>
> Thanks!
>
> You also pointed out a minor issue with format security on another
> patch which I'll also fix. Did you actually mean to include the nvc0
> patch (#11 in the series) in your R-b? If you actually looked at it,
> then great :)

Oh sorry, I didn't want to include it.

Marek


More information about the mesa-dev mailing list