On 06/26/2012 07:28 AM, Daniel Vetter wrote:
> ... and the hardware seems to take the lenght of the pipe control
> command to indicate whether the write is 64bit or 32bit. Which makes
> sense for immediate writes.
> 
> I've discovered this by writing a pattern into the query object bo and
> noticing that the high 32bits are left intact, even on those pipe
> control writes that seemingly worked.

I can't find any documentation or other justification for this, but if
you think it's useful, adding the extra 0 shouldn't hurt anything.

Minor bikeshed below.

> ---
>  src/mesa/drivers/dri/i965/brw_queryobj.c |   10 ++++++----
>  src/mesa/drivers/dri/intel/intel_reg.h   |    1 +
>  2 files changed, 7 insertions(+), 4 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_queryobj.c 
> b/src/mesa/drivers/dri/i965/brw_queryobj.c
> index d7870d1..dae7af0 100644
> --- a/src/mesa/drivers/dri/i965/brw_queryobj.c
> +++ b/src/mesa/drivers/dri/i965/brw_queryobj.c
> @@ -333,7 +333,7 @@ brw_emit_query_begin(struct brw_context *brw)
>        return;
>  
>     if (intel->gen >= 6) {
> -       BEGIN_BATCH(12);
> +       BEGIN_BATCH(13);
>  
>         /* Workaround: A non-zero post-sync op (i.e. the DEPTH_COUNT write 
> below
>       * needs a pipe control with CS_STALL set beforehand.
> @@ -346,13 +346,14 @@ brw_emit_query_begin(struct brw_context *brw)
>         OUT_BATCH(0);
>  
>         /* The actual DEPTH_COUNT write. */
> -       OUT_BATCH(_3DSTATE_PIPE_CONTROL);
> +       OUT_BATCH(_3DSTATE_PIPE_CONTROL_5);

I would really prefer this to be

       OUT_BATCH(_3DSTATE_PIPE_CONTROL | (5 - 2));

since this is what we do with every other state packet command.  I'm not
a fan of PIPE_CONTROL being the only command with a length baked into
the define.  (That said, I'm not suggesting removing the baked length
right now...but doing this will result in | 2 | 3 which is fine, since 3
includes all the bits for 2 anyway.)

Otherwise I have to wonder what a PIPE_CONTROL_5 is.

>         OUT_BATCH(PIPE_CONTROL_WRITE_DEPTH_COUNT);
>         OUT_RELOC(brw->query.bo,
>                I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
>                PIPE_CONTROL_GLOBAL_GTT_WRITE |
>                ((brw->query.index * 2) * sizeof(uint64_t)));
>         OUT_BATCH(0);
> +       OUT_BATCH(0);
>  
>         /* We need to emit depth stall to get the right value for the depth
>       * count. As a workaround this needs a preceeding pipe control with a
> @@ -403,7 +404,7 @@ brw_emit_query_end(struct brw_context *brw)
>        return;
>  
>     if (intel->gen >= 6) {
> -       BEGIN_BATCH(12);
> +       BEGIN_BATCH(13);
>  
>         /* Workaround: A non-zero post-sync op (i.e. the DEPTH_COUNT write 
> below
>       * needs a pipe control with CS_STALL set beforehand.
> @@ -416,13 +417,14 @@ brw_emit_query_end(struct brw_context *brw)
>         OUT_BATCH(0);
>  
>         /* The actual DEPTH_COUNT write. */
> -       OUT_BATCH(_3DSTATE_PIPE_CONTROL);
> +       OUT_BATCH(_3DSTATE_PIPE_CONTROL_5);

ditto

>         OUT_BATCH(PIPE_CONTROL_WRITE_DEPTH_COUNT);
>         OUT_RELOC(brw->query.bo,
>                I915_GEM_DOMAIN_INSTRUCTION, I915_GEM_DOMAIN_INSTRUCTION,
>                PIPE_CONTROL_GLOBAL_GTT_WRITE |
>                ((brw->query.index * 2 + 1) * sizeof(uint64_t)));
>         OUT_BATCH(0);
> +       OUT_BATCH(0);
>  
>         /* We need to emit depth stall to get the right value for the depth
>       * count. As a workaround this needs a preceeding pipe control with a
> diff --git a/src/mesa/drivers/dri/intel/intel_reg.h 
> b/src/mesa/drivers/dri/intel/intel_reg.h
> index e2a6ee2..04f7a8d 100644
> --- a/src/mesa/drivers/dri/intel/intel_reg.h
> +++ b/src/mesa/drivers/dri/intel/intel_reg.h
> @@ -59,6 +59,7 @@
>   * additional flushing control.
>   */
>  #define _3DSTATE_PIPE_CONTROL                (CMD_3D | (3 << 27) | (2 << 24) 
> | 2)
> +#define _3DSTATE_PIPE_CONTROL_5              (CMD_3D | (3 << 27) | (2 << 24) 
> | 3)
>  #define PIPE_CONTROL_CS_STALL                (1 << 20)
>  #define PIPE_CONTROL_GLOBAL_SNAPSHOT_COUNT_RESET     (1 << 19)
>  #define PIPE_CONTROL_TLB_INVALIDATE  (1 << 18)
> 

and then no need to add this.

With that change, this is:
Acked-by: Kenneth Graunke <kenn...@whitecape.org>

Though, again, I'm not sure why it'd be necessary.
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to