[Mesa-dev] [PATCH 8/9] i965: Implement ARB_query_buffer_object for HSW+
Kristian Høgsberg
krh at bitplanet.net
Wed Apr 27 20:21:04 UTC 2016
On Wed, Apr 27, 2016 at 12:13 PM, Kenneth Graunke <kenneth at whitecape.org> wrote:
> On Thursday, April 21, 2016 10:18:48 PM PDT Jordan Justen wrote:
> [snip]
>> diff --git a/src/mesa/drivers/dri/i965/brw_queryobj.c b/src/mesa/drivers/
> dri/i965/brw_queryobj.c
>> index a8e5aba..81ee5ea 100644
>> --- a/src/mesa/drivers/dri/i965/brw_queryobj.c
>> +++ b/src/mesa/drivers/dri/i965/brw_queryobj.c
>> @@ -462,7 +462,7 @@ brw_emit_query_end(struct brw_context *brw)
>> * current GPU time. This is unlike GL_TIME_ELAPSED, which measures the
>> * time while the query is active.
>> */
>> -static void
>> +void
>> brw_query_counter(struct gl_context *ctx, struct gl_query_object *q)
>> {
>> struct brw_context *brw = brw_context(ctx);
>> @@ -507,12 +507,42 @@ brw_get_timestamp(struct gl_context *ctx)
>> return result;
>> }
>>
>
> /**
> * Is this type of query written by PIPE_CONTROL?
> */
>
>> +bool
>> +brw_is_query_pipelined(struct brw_query_object *query)
>> +{
>> + switch (query->Base.Target) {
>> + case GL_TIMESTAMP:
>> + case GL_TIME_ELAPSED:
>> + case GL_ANY_SAMPLES_PASSED:
>> + case GL_ANY_SAMPLES_PASSED_CONSERVATIVE:
>> + case GL_SAMPLES_PASSED_ARB:
>> + return true;
>> +
>> + case GL_PRIMITIVES_GENERATED:
>> + case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN:
>> + case GL_VERTICES_SUBMITTED_ARB:
>> + case GL_PRIMITIVES_SUBMITTED_ARB:
>> + case GL_VERTEX_SHADER_INVOCATIONS_ARB:
>> + case GL_GEOMETRY_SHADER_INVOCATIONS:
>> + case GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB:
>> + case GL_FRAGMENT_SHADER_INVOCATIONS_ARB:
>> + case GL_CLIPPING_INPUT_PRIMITIVES_ARB:
>> + case GL_CLIPPING_OUTPUT_PRIMITIVES_ARB:
>> + case GL_COMPUTE_SHADER_INVOCATIONS_ARB:
>> + case GL_TESS_CONTROL_SHADER_PATCHES_ARB:
>> + case GL_TESS_EVALUATION_SHADER_INVOCATIONS_ARB:
>> + return false;
>> +
>> + default:
>> + unreachable("Unrecognized query target in is_query_pipelined()");
>> + }
>> +}
>> +
>> /* Initialize query object functions used on all generations. */
>> void brw_init_common_queryobj_functions(struct dd_function_table
> *functions)
>> {
>> functions->NewQueryObject = brw_new_query_object;
>> functions->DeleteQuery = brw_delete_query;
>> - functions->QueryCounter = brw_query_counter;
>> functions->GetTimestamp = brw_get_timestamp;
>> }
>>
>> @@ -523,4 +553,5 @@ void gen4_init_queryobj_functions(struct
> dd_function_table *functions)
>> functions->EndQuery = brw_end_query;
>> functions->CheckQuery = brw_check_query;
>> functions->WaitQuery = brw_wait_query;
>> + functions->QueryCounter = brw_query_counter;
>> }
>> diff --git a/src/mesa/drivers/dri/i965/gen6_queryobj.c b/src/mesa/drivers/
> dri/i965/gen6_queryobj.c
>> index 960ccfd..f95c9fc 100644
>> --- a/src/mesa/drivers/dri/i965/gen6_queryobj.c
>> +++ b/src/mesa/drivers/dri/i965/gen6_queryobj.c
>> @@ -37,8 +37,25 @@
>> #include "brw_defines.h"
>> #include "brw_state.h"
>> #include "intel_batchbuffer.h"
>> +#include "intel_buffer_objects.h"
>> #include "intel_reg.h"
>>
>> +static inline void
>> +set_query_availability(struct brw_context *brw, struct brw_query_object
> *query,
>> + bool available)
>> +{
>> + /* For ARB_query_buffer_object we write the query availability for
>> + * pipelined results
>> + */
>
> I could use some more comments here. How about:
>
> /* For platforms that support ARB_query_buffer_object, we write the
> * query availability for "pipelined" queries.
> *
> * Most counter snapshots are written by the command streamer, by
> * doing a CS stall and then MI_STORE_REGISTER_MEM. For these
> * counters, the CS stall guarantees that the results will be
> * available when subsequent GPU commands run. So we don't need to
Maybe say CS commands instead of GPU commands?
> * do any additional tracking.
> *
> * Other counters (occlusion queries and timestamp) are written by
> * PIPE_CONTROL, without a CS stall. This means that we can't be
> * sure whether the writes have landed yet or not. Performing a
> * PIPE_CONTROL with an immediate write will synchronize with
> * those earlier writes, so we write 1 when the value has landed.
> */
>
>> + if (brw->ctx.Extensions.ARB_query_buffer_object &&
>> + brw_is_query_pipelined(query)) {
>> + brw_emit_pipe_control_write(brw,
>> + PIPE_CONTROL_WRITE_IMMEDIATE,
>> + query->bo, 2 * sizeof(uint64_t),
>> + available, 0);
>> + }
>> +}
>> +
>> static void
>> write_primitives_generated(struct brw_context *brw,
>> drm_intel_bo *query_bo, int stream, int idx)
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
More information about the mesa-dev
mailing list