<div dir="ltr">On 28 August 2013 15:31, Eric Anholt <span dir="ltr"><<a href="mailto:eric@anholt.net" target="_blank">eric@anholt.net</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="HOEnZb"><div class="h5">Paul Berry <<a href="mailto:stereotype441@gmail.com">stereotype441@gmail.com</a>> writes:<br>
<br>
> On 27 August 2013 15:21, Eric Anholt <<a href="mailto:eric@anholt.net">eric@anholt.net</a>> wrote:<br>
><br>
>> This brings over the batch-wrap-prevention and aperture space checking<br>
>> code from the normal brw_draw.c path, so that we don't need to flush the<br>
>> batch every time.<br>
>><br>
>> There's a risk here if the intel_emit_post_sync_nonzero_flush() call isn't<br>
>> high enough up in the state emit sequences -- before, we implicitly had<br>
>> one at the batch flush before any state was emitted, so Mesa's workaround<br>
>> emits didn't really matter.<br>
>><br>
>> Improves cairo-gl performance by 13.7733% +/- 1.74876% (n=30/32)<br>
>> Improves minecraft apitrace performance by 1.03183% +/- 0.482297% (n=90).<br>
>> Reduces low-resolution GLB 2.7 performance by 1.17553% +/- 0.432263% (n=88)<br>
>> Reduces Lightsmark performance by 3.70246% +/- 0.322432% (n=126)<br>
>> No statistically significant performance difference on unigine tropics<br>
>> (n=10)<br>
>> No statistically significant performance difference on openarena (n=755)<br>
>><br>
>> The two apps that are hurt happen to include stalls on busy buffer<br>
>> objects, so I think this is an effect of missing out on an opportune<br>
>> flush.<br>
>> ---<br>
>>  src/mesa/drivers/dri/i965/brw_blorp.cpp  | 50<br>
>> ++++++++++++++++++++++++++++++++<br>
>>  src/mesa/drivers/dri/i965/brw_blorp.h    |  4 ---<br>
>>  src/mesa/drivers/dri/i965/gen6_blorp.cpp | 12 --------<br>
>>  src/mesa/drivers/dri/i965/gen7_blorp.cpp |  1 -<br>
>>  4 files changed, 50 insertions(+), 17 deletions(-)<br>
>><br>
>> diff --git a/src/mesa/drivers/dri/i965/brw_blorp.cpp<br>
>> b/src/mesa/drivers/dri/i965/brw_blorp.cpp<br>
>> index 1576ff2..c566d1d 100644<br>
>> --- a/src/mesa/drivers/dri/i965/brw_blorp.cpp<br>
>> +++ b/src/mesa/drivers/dri/i965/brw_blorp.cpp<br>
>> @@ -21,6 +21,7 @@<br>
>>   * IN THE SOFTWARE.<br>
>>   */<br>
>><br>
>> +#include <errno.h><br>
>>  #include "intel_batchbuffer.h"<br>
>>  #include "intel_fbo.h"<br>
>><br>
>> @@ -191,6 +192,26 @@ intel_hiz_exec(struct brw_context *brw, struct<br>
>> intel_mipmap_tree *mt,<br>
>>  void<br>
>>  brw_blorp_exec(struct brw_context *brw, const brw_blorp_params *params)<br>
>>  {<br>
>> +   struct gl_context *ctx = &brw->ctx;<br>
>> +   uint32_t estimated_max_batch_usage = 1500;<br>
>> +   bool check_aperture_failed_once = false;<br>
>> +<br>
>> +   /* Flush the sampler and render caches.  We definitely need to flush<br>
>> the<br>
>> +    * sampler cache so that we get updated contents from the render cache<br>
>> for<br>
>> +    * the glBlitFramebuffer() source.  Also, we are sometimes warned in<br>
>> the<br>
>> +    * docs to flush the cache between reinterpretations of the same<br>
>> surface<br>
>> +    * data with different formats, which blorp does for stencil and depth<br>
>> +    * data.<br>
>> +    */<br>
>> +   intel_batchbuffer_emit_mi_flush(brw);<br>
>> +<br>
>> +retry:<br>
>> +   intel_batchbuffer_require_space(brw, estimated_max_batch_usage, false);<br>
>> +   intel_batchbuffer_save_state(brw);<br>
>> +   drm_intel_bo *saved_bo = brw-><a href="http://batch.bo" target="_blank">batch.bo</a>;<br>
>> +   uint32_t saved_used = brw->batch.used;<br>
>> +   uint32_t saved_state_batch_offset = brw->batch.state_batch_offset;<br>
>> +<br>
>>     switch (brw->gen) {<br>
>>     case 6:<br>
>>        gen6_blorp_exec(brw, params);<br>
>> @@ -204,6 +225,35 @@ brw_blorp_exec(struct brw_context *brw, const<br>
>> brw_blorp_params *params)<br>
>>        break;<br>
>>     }<br>
>><br>
>><br>
> Would it be feasible to add an assertion here to verify that the amount of<br>
> batch space actually used by this blorp call is less than or equal to<br>
> estimated_max_batch_usage?  That would give me a lot of increased<br>
> confidence that the magic number 1500 is correct.<br>
><br>
> With the added assertion, the series is:<br>
><br>
> Reviewed-by: Paul Berry <<a href="mailto:stereotype441@gmail.com">stereotype441@gmail.com</a>><br>
<br>
</div></div>That's this code:<br>
<div class="HOEnZb"><div class="h5"><br>
+   /* Make sure we didn't wrap the batch unintentionally, and make sure we<br>
+    * reserved enough space that a wrap will never happen.<br>
+    */<br>
+   assert(brw-><a href="http://batch.bo" target="_blank">batch.bo</a> == saved_bo);<br>
+   assert((brw->batch.used - saved_used) * 4 +<br>
+          (saved_state_batch_offset - brw->batch.state_batch_offset) <<br>
+          estimated_max_batch_usage);<br>
</div></div></blockquote></div><br></div><div class="gmail_extra">You're right.  I misunderstood and thought these assertions were merely checking that we didn't run out of room.  Patch is:<br><br></div><div class="gmail_extra">
Reviewed-by: Paul Berry <<a href="mailto:stereotype441@gmail.com">stereotype441@gmail.com</a>><br><br></div><div class="gmail_extra">as is.<br></div></div>