[Mesa-dev] [PATCH 2/2 v3] i965: Use predicate enable bit for conditional rendering w/o stalling

Neil Roberts neil at linux.intel.com
Mon May 11 07:14:21 PDT 2015


Kenneth Graunke <kenneth at whitecape.org> writes:

> It might be nice to create a brw_load_register_mem64 function, for
> symmetry with brw_store_register_mem64 - we might want to reuse it
> elsewhere someday.

Ok, that sounds sensible.

> One interesting quirk: the two halves of your register write may land
> in two separate batchbuffers, since it's done with two BEGIN_BATCH /
> ADVANCE_BATCH blocks (each of which only reserves space for one LRM).

Ah right, yes, good point.

> */ goes on its own line, here and elsewhere.

Oops, yes.

>> +   } else {
>> +      if (brw->ctx.Query.CondRenderQuery) {
>> +         perf_debug("Conditional rendering is implemented in software and may "
>> +                    "stall.\n");
>> +      }
>> +
>> +      return _mesa_check_conditional_render(&brw->ctx);
>
> I'd put this in the same block as the perf_debug and just do 'return
> true' here - we can save the function call and redundant query check in
> the common case (and this is a really hot path).

Ok, sounds good.

>> @@ -333,6 +335,9 @@ intelInitExtensions(struct gl_context *ctx)
>>           ctx->Extensions.ARB_transform_feedback2 = true;
>>           ctx->Extensions.ARB_transform_feedback3 = true;
>>           ctx->Extensions.ARB_transform_feedback_instanced = true;
>> +
>> +         if (brw->intelScreen->cmd_parser_version >= 2)
>> +            brw->predicate.supported = true;
>
> So, this is insufficient for Haswell.  There was not a version bump when
> it actually started working (I think Daniel assumed we didn't need it,
> since we were already attempting to write registers ourselves.)
>
> I think the best plan of action is to submit a kernel patch bumping the
> command parser version number to 4, then change this to:
>
>    const int cmd_parser_version = brw->intelScreen->cmd_parser_version;
>
>    if (cmd_parser_version >= (brw->is_haswell ? 4 : 2))
>       brw->predicate.supported = true;

I don't think this is necessary. It's a bit hard to tell from the patch
diff but this hunk is inside an if statement like this:

   if (brw->gen >= 7) {
      /* ... */
      if (can_do_pipelined_register_writes(brw)) {
         /* ... transform feedback stuff ... */
         if (brw->intelScreen->cmd_parser_version >= 2)
            brw->predicate.supported = true;
      }
      /* ... */
   }

Therefore it will only try to use the predicate register if the command
parser is at least version 2 *and* we can do register writes. I don't
think there is any version of the kernel where this wouldn't correctly
detect whether it can write to the predicate register.

If you agree with this then I'll post a v4 with all the other changes.
In the meantime there is a WIP branch of it here:

https://github.com/bpeel/mesa/tree/wip/conditional-render

Many thanks for the detailed review.

Regards,
- Neil


More information about the mesa-dev mailing list