[Mesa-dev] [PATCH 1/4] nv50: add a header file for nv50_query

Pierre Moreau pierre.morrow at free.fr
Mon Oct 19 01:43:47 PDT 2015


Hi Samuel,

(some comments further down)

On 11:30 PM - Oct 18 2015, Samuel Pitoiset wrote:
> Like for nvc0, this will allow to split different types of queries and
> to prepare the way for both global performance counters and MP counters.
> 
> While we are at it, make use of nv50_query struct instead of pipe_query.
> 
> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
> ---
>  src/gallium/drivers/nouveau/Makefile.sources       |  1 +
>  src/gallium/drivers/nouveau/nv50/nv50_context.h    | 12 +------
>  src/gallium/drivers/nouveau/nv50/nv50_query.c      | 29 ++--------------
>  src/gallium/drivers/nouveau/nv50/nv50_query.h      | 40 ++++++++++++++++++++++
>  .../drivers/nouveau/nv50/nv50_shader_state.c       |  4 +--
>  src/gallium/drivers/nouveau/nv50/nv50_vbo.c        |  3 +-
>  6 files changed, 49 insertions(+), 40 deletions(-)
>  create mode 100644 src/gallium/drivers/nouveau/nv50/nv50_query.h
> 
> diff --git a/src/gallium/drivers/nouveau/Makefile.sources b/src/gallium/drivers/nouveau/Makefile.sources
> index c18e9f5..06d9d97 100644
> --- a/src/gallium/drivers/nouveau/Makefile.sources
> +++ b/src/gallium/drivers/nouveau/Makefile.sources
> @@ -73,6 +73,7 @@ NV50_C_SOURCES := \
>  	nv50/nv50_program.h \
>  	nv50/nv50_push.c \
>  	nv50/nv50_query.c \
> +	nv50/nv50_query.h \
>  	nv50/nv50_resource.c \
>  	nv50/nv50_resource.h \
>  	nv50/nv50_screen.c \
> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_context.h b/src/gallium/drivers/nouveau/nv50/nv50_context.h
> index 69c1212..fb74a97 100644
> --- a/src/gallium/drivers/nouveau/nv50/nv50_context.h
> +++ b/src/gallium/drivers/nouveau/nv50/nv50_context.h
> @@ -16,6 +16,7 @@
>  #include "nv50/nv50_program.h"
>  #include "nv50/nv50_resource.h"
>  #include "nv50/nv50_transfer.h"
> +#include "nv50/nv50_query.h"
>  
>  #include "nouveau_context.h"
>  #include "nouveau_debug.h"
> @@ -195,17 +196,6 @@ void nv50_default_kick_notify(struct nouveau_pushbuf *);
>  /* nv50_draw.c */
>  extern struct draw_stage *nv50_draw_render_stage(struct nv50_context *);
>  
> -/* nv50_query.c */
> -void nv50_init_query_functions(struct nv50_context *);
> -void nv50_query_pushbuf_submit(struct nouveau_pushbuf *, uint16_t method,
> -                               struct pipe_query *, unsigned result_offset);
> -void nv84_query_fifo_wait(struct nouveau_pushbuf *, struct pipe_query *);
> -void nva0_so_target_save_offset(struct pipe_context *,
> -                                struct pipe_stream_output_target *,
> -                                unsigned index, bool seralize);
> -
> -#define NVA0_QUERY_STREAM_OUTPUT_BUFFER_OFFSET (PIPE_QUERY_TYPES + 0)
> -
>  /* nv50_shader_state.c */
>  void nv50_vertprog_validate(struct nv50_context *);
>  void nv50_gmtyprog_validate(struct nv50_context *);
> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_query.c b/src/gallium/drivers/nouveau/nv50/nv50_query.c
> index 5368ee7..7718d69 100644
> --- a/src/gallium/drivers/nouveau/nv50/nv50_query.c
> +++ b/src/gallium/drivers/nouveau/nv50/nv50_query.c
> @@ -25,6 +25,7 @@
>  #define NV50_PUSH_EXPLICIT_SPACE_CHECKING
>  
>  #include "nv50/nv50_context.h"
> +#include "nv50/nv50_query.h"
>  #include "nv_object.xml.h"
>  
>  #define NV50_QUERY_STATE_READY   0
> @@ -39,29 +40,8 @@
>   * queries anyway.
>   */
>  
> -struct nv50_query {
> -   uint32_t *data;
> -   uint16_t type;
> -   uint16_t index;
> -   uint32_t sequence;
> -   struct nouveau_bo *bo;
> -   uint32_t base;
> -   uint32_t offset; /* base + i * 32 */
> -   uint8_t state;
> -   bool is64bit;
> -   int nesting; /* only used for occlusion queries */
> -   struct nouveau_mm_allocation *mm;
> -   struct nouveau_fence *fence;
> -};
> -
>  #define NV50_QUERY_ALLOC_SPACE 256
>  
> -static inline struct nv50_query *
> -nv50_query(struct pipe_query *pipe)
> -{
> -   return (struct nv50_query *)pipe;
> -}
> -
>  static bool
>  nv50_query_allocate(struct nv50_context *nv50, struct nv50_query *q, int size)
>  {
> @@ -363,9 +343,8 @@ nv50_query_result(struct pipe_context *pipe, struct pipe_query *pq,
>  }
>  
>  void
> -nv84_query_fifo_wait(struct nouveau_pushbuf *push, struct pipe_query *pq)
> +nv84_query_fifo_wait(struct nouveau_pushbuf *push, struct nv50_query *q)
>  {
> -   struct nv50_query *q = nv50_query(pq);
>     unsigned offset = q->offset;
>  
>     PUSH_SPACE(push, 5);
> @@ -453,10 +432,8 @@ nv50_render_condition(struct pipe_context *pipe,
>  
>  void
>  nv50_query_pushbuf_submit(struct nouveau_pushbuf *push, uint16_t method,
> -                          struct pipe_query *pq, unsigned result_offset)
> +                          struct nv50_query *q, unsigned result_offset)
>  {
> -   struct nv50_query *q = nv50_query(pq);
> -
>     nv50_query_update(q);
>     if (q->state != NV50_QUERY_STATE_READY)
>        nouveau_bo_wait(q->bo, NOUVEAU_BO_RD, push->client);
> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_query.h b/src/gallium/drivers/nouveau/nv50/nv50_query.h
> new file mode 100644
> index 0000000..722af0c
> --- /dev/null
> +++ b/src/gallium/drivers/nouveau/nv50/nv50_query.h
> @@ -0,0 +1,40 @@

Shouldn't there be a copyright notice (or whatever that text is called) here?

> +#ifndef __NV50_QUERY_H__
> +#define __NV50_QUERY_H__
> +
> +#include "pipe/p_context.h"
> +
> +#include "nouveau_context.h"
> +#include "nouveau_mm.h"
> +
> +#define NVA0_QUERY_STREAM_OUTPUT_BUFFER_OFFSET (PIPE_QUERY_TYPES + 0)
> +
> +struct nv50_query {
> +   uint32_t *data;
> +   uint16_t type;
> +   uint16_t index;
> +   uint32_t sequence;
> +   struct nouveau_bo *bo;
> +   uint32_t base;
> +   uint32_t offset; /* base + i * 32 */
> +   uint8_t state;
> +   bool is64bit;
> +   int nesting; /* only used for occlusion queries */
> +   struct nouveau_mm_allocation *mm;
> +   struct nouveau_fence *fence;
> +};
> +
> +static inline struct nv50_query *
> +nv50_query(struct pipe_query *pipe)
> +{
> +   return (struct nv50_query *)pipe;
> +}
> +
> +void nv50_init_query_functions(struct nv50_context *);
> +void nv50_query_pushbuf_submit(struct nouveau_pushbuf *, uint16_t,
> +                               struct nv50_query *, unsigned result_offset);
> +void nv84_query_fifo_wait(struct nouveau_pushbuf *, struct nv50_query *);
> +void nva0_so_target_save_offset(struct pipe_context *,
> +                                struct pipe_stream_output_target *,
> +                                unsigned, bool);
> +
> +#endif
> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_shader_state.c b/src/gallium/drivers/nouveau/nv50/nv50_shader_state.c
> index 941555f..958d044 100644
> --- a/src/gallium/drivers/nouveau/nv50/nv50_shader_state.c
> +++ b/src/gallium/drivers/nouveau/nv50/nv50_shader_state.c
> @@ -629,7 +629,7 @@ nv50_stream_output_validate(struct nv50_context *nv50)
>        const unsigned n = nv50->screen->base.class_3d >= NVA0_3D_CLASS ? 4 : 3;
>  
>        if (n == 4 && !targ->clean)
> -         nv84_query_fifo_wait(push, targ->pq);
> +         nv84_query_fifo_wait(push, nv50_query(targ->pq));

This is not related to your patch, but there should be an `assert(targ->pq)`
here, as `nv84_query_fifo_wait` dereferences it without checking (or add a check
in `nv84_query_fifo_wait`. Or maybe `targ->pq` can't be NULL, in that case the
`assert` a few lines below is useless and could be remove.

>        BEGIN_NV04(push, NV50_3D(STRMOUT_ADDRESS_HIGH(i)), n);
>        PUSH_DATAh(push, buf->address + targ->pipe.buffer_offset);
>        PUSH_DATA (push, buf->address + targ->pipe.buffer_offset);
> @@ -639,7 +639,7 @@ nv50_stream_output_validate(struct nv50_context *nv50)
>           if (!targ->clean) {
>              assert(targ->pq);
>              nv50_query_pushbuf_submit(push, NVA0_3D_STRMOUT_OFFSET(i),
> -                                      targ->pq, 0x4);
> +                                      nv50_query(targ->pq), 0x4);

You're casting `targ->pq` only twice, so not sure if it would make sense to
define a `nv50_query` pointer at the start of the function (along with the
assert, if neeeded), and cast `targ->pq` only once.

>           } else {
>              BEGIN_NV04(push, NVA0_3D(STRMOUT_OFFSET(i)), 1);
>              PUSH_DATA(push, 0);
> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_vbo.c b/src/gallium/drivers/nouveau/nv50/nv50_vbo.c
> index f5f4708..dbc6632 100644
> --- a/src/gallium/drivers/nouveau/nv50/nv50_vbo.c
> +++ b/src/gallium/drivers/nouveau/nv50/nv50_vbo.c
> @@ -745,7 +745,8 @@ nva0_draw_stream_output(struct nv50_context *nv50,
>        PUSH_DATA (push, 0);
>        BEGIN_NV04(push, NVA0_3D(DRAW_TFB_STRIDE), 1);
>        PUSH_DATA (push, so->stride);
> -      nv50_query_pushbuf_submit(push, NVA0_3D_DRAW_TFB_BYTES, so->pq, 0x4);
> +      nv50_query_pushbuf_submit(push, NVA0_3D_DRAW_TFB_BYTES,
> +                                nv50_query(so->pq), 0x4);

Again, if an assert is needed for the comments above, you might need to add one
here too.


Pierre



>        BEGIN_NV04(push, NV50_3D(VERTEX_END_GL), 1);
>        PUSH_DATA (push, 0);
>  
> -- 
> 2.6.1
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list