nv50_query.c revision 5eb7ff1175a644ffe3b0f1a75cb235400355f9fb
1857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs/*
2f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller * Copyright 2011 Nouveau Project
3857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs *
4857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * Permission is hereby granted, free of charge, to any person obtaining a
5857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * copy of this software and associated documentation files (the "Software"),
6857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * to deal in the Software without restriction, including without limitation
7857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * and/or sell copies of the Software, and to permit persons to whom the
9857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * Software is furnished to do so, subject to the following conditions:
10857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs *
11857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * The above copyright notice and this permission notice shall be included in
12857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * all copies or substantial portions of the Software.
13857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs *
14857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
173d8d5b298a268b119d840bc9bae0ee9e0c9244a9Kenneth Graunke * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
183d8d5b298a268b119d840bc9bae0ee9e0c9244a9Kenneth Graunke * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
193d8d5b298a268b119d840bc9bae0ee9e0c9244a9Kenneth Graunke * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
203d8d5b298a268b119d840bc9bae0ee9e0c9244a9Kenneth Graunke * OTHER DEALINGS IN THE SOFTWARE.
21f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller *
22f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller * Authors: Christoph Bumiller
23857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs */
24857a3294a959015bf893241199f7fd7f7882a6abBen Skeggs
256d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller#define NV50_PUSH_EXPLICIT_SPACE_CHECKING
266d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller
275eb7ff1175a644ffe3b0f1a75cb235400355f9fbJohannes Obermayr#include "nv50/nv50_context.h"
285eb7ff1175a644ffe3b0f1a75cb235400355f9fbJohannes Obermayr#include "nv_object.xml.h"
29f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller
30f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller/* XXX: Nested queries, and simultaneous queries on multiple gallium contexts
31f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller * (since we use only a single GPU channel per screen) will not work properly.
32f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller *
33f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller * The first is not that big of an issue because OpenGL does not allow nested
34f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller * queries anyway.
35f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller */
3647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
37918fc55e5f5cbedd3ab8fb3e02b225106c059fa6Ben Skeggsstruct nv50_query {
38f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   uint32_t *data;
3902fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller   uint16_t type;
4002fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller   uint16_t index;
41f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   uint32_t sequence;
42f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   struct nouveau_bo *bo;
43f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   uint32_t base;
44f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   uint32_t offset; /* base + i * 16 */
45f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   boolean ready;
46939b26639fdc0913c5670b7fa20aab1f41b2b155Christoph Bumiller   boolean flushed;
47f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   boolean is64bit;
482f30a5bdaad480118e23ac4243de3b4a11ba62a8Ben Skeggs   struct nouveau_mm_allocation *mm;
49918fc55e5f5cbedd3ab8fb3e02b225106c059fa6Ben Skeggs};
50918fc55e5f5cbedd3ab8fb3e02b225106c059fa6Ben Skeggs
51f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller#define NV50_QUERY_ALLOC_SPACE 128
52f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller
53918fc55e5f5cbedd3ab8fb3e02b225106c059fa6Ben Skeggsstatic INLINE struct nv50_query *
54918fc55e5f5cbedd3ab8fb3e02b225106c059fa6Ben Skeggsnv50_query(struct pipe_query *pipe)
55918fc55e5f5cbedd3ab8fb3e02b225106c059fa6Ben Skeggs{
56f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   return (struct nv50_query *)pipe;
57f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller}
58f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller
59f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic boolean
60f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_query_allocate(struct nv50_context *nv50, struct nv50_query *q, int size)
61f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller{
62f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   struct nv50_screen *screen = nv50->screen;
63f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   int ret;
64f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller
65f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   if (q->bo) {
66f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      nouveau_bo_ref(NULL, &q->bo);
67f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      if (q->mm) {
68f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller         if (q->ready)
692f30a5bdaad480118e23ac4243de3b4a11ba62a8Ben Skeggs            nouveau_mm_free(q->mm);
70f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller         else
716d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller            nouveau_fence_work(screen->base.fence.current, nouveau_mm_free_work,
726d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller                               q->mm);
73f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      }
74f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   }
75f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   if (size) {
76cd24fcedecfc41d77047fb827a88db528ed292caBen Skeggs      q->mm = nouveau_mm_allocate(screen->base.mm_GART, size, &q->bo, &q->base);
77f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      if (!q->bo)
78f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller         return FALSE;
79f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      q->offset = q->base;
80f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller
816d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller      ret = nouveau_bo_map(q->bo, 0, screen->base.client);
82f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      if (ret) {
83f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller         nv50_query_allocate(nv50, q, 0);
84f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller         return FALSE;
85f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      }
866d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller      q->data = (uint32_t *)((uint8_t *)q->bo->map + q->base);
87f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   }
88f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   return TRUE;
89f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller}
90f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller
91f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic void
92f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_query_destroy(struct pipe_context *pipe, struct pipe_query *pq)
93f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller{
94f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   nv50_query_allocate(nv50_context(pipe), nv50_query(pq), 0);
95f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   FREE(nv50_query(pq));
96918fc55e5f5cbedd3ab8fb3e02b225106c059fa6Ben Skeggs}
97918fc55e5f5cbedd3ab8fb3e02b225106c059fa6Ben Skeggs
9879bca7dd884da33c06ecd3dabb893f9cfed1aaedBen Skeggsstatic struct pipe_query *
9979bca7dd884da33c06ecd3dabb893f9cfed1aaedBen Skeggsnv50_query_create(struct pipe_context *pipe, unsigned type)
10079bca7dd884da33c06ecd3dabb893f9cfed1aaedBen Skeggs{
101f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   struct nv50_context *nv50 = nv50_context(pipe);
102f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   struct nv50_query *q;
103f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller
104f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   q = CALLOC_STRUCT(nv50_query);
105f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   if (!q)
106f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      return NULL;
107918fc55e5f5cbedd3ab8fb3e02b225106c059fa6Ben Skeggs
108f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   if (!nv50_query_allocate(nv50, q, NV50_QUERY_ALLOC_SPACE)) {
109f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      FREE(q);
110f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      return NULL;
111f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   }
112918fc55e5f5cbedd3ab8fb3e02b225106c059fa6Ben Skeggs
113f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   q->is64bit = (type == PIPE_QUERY_PRIMITIVES_GENERATED ||
114f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller                 type == PIPE_QUERY_PRIMITIVES_EMITTED ||
115f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller                 type == PIPE_QUERY_SO_STATISTICS);
116f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   q->type = type;
117918fc55e5f5cbedd3ab8fb3e02b225106c059fa6Ben Skeggs
118f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   if (q->type == PIPE_QUERY_OCCLUSION_COUNTER) {
119f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      q->offset -= 16;
120f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      q->data -= 16 / sizeof(*q->data); /* we advance before query_begin ! */
121f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   }
122f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller
123f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   return (struct pipe_query *)q;
12479bca7dd884da33c06ecd3dabb893f9cfed1aaedBen Skeggs}
12579bca7dd884da33c06ecd3dabb893f9cfed1aaedBen Skeggs
126b8965bee404cb36ccd97ac089fbd3ffc63268080Ben Skeggsstatic void
1276d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumillernv50_query_get(struct nouveau_pushbuf *push, struct nv50_query *q,
128f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller               unsigned offset, uint32_t get)
12947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
130f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   offset += q->offset;
131918fc55e5f5cbedd3ab8fb3e02b225106c059fa6Ben Skeggs
1326d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller   PUSH_SPACE(push, 5);
1336d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller   PUSH_REFN (push, q->bo, NOUVEAU_BO_GART | NOUVEAU_BO_WR);
1346d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller   BEGIN_NV04(push, NV50_3D(QUERY_ADDRESS_HIGH), 4);
1356d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller   PUSH_DATAh(push, q->bo->offset + offset);
1366d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller   PUSH_DATA (push, q->bo->offset + offset);
1376d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller   PUSH_DATA (push, q->sequence);
1386d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller   PUSH_DATA (push, get);
13947b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
14047b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
141b8965bee404cb36ccd97ac089fbd3ffc63268080Ben Skeggsstatic void
142918fc55e5f5cbedd3ab8fb3e02b225106c059fa6Ben Skeggsnv50_query_begin(struct pipe_context *pipe, struct pipe_query *pq)
14347b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
144f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   struct nv50_context *nv50 = nv50_context(pipe);
1456d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller   struct nouveau_pushbuf *push = nv50->base.pushbuf;
146f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   struct nv50_query *q = nv50_query(pq);
147f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller
148f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   /* For occlusion queries we have to change the storage, because a previous
149f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller    * query might set the initial render conition to FALSE even *after* we re-
150f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller    * initialized it to TRUE.
151f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller    */
152f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   if (q->type == PIPE_QUERY_OCCLUSION_COUNTER) {
153f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      q->offset += 16;
154f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      q->data += 16 / sizeof(*q->data);
155f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      if (q->offset - q->base == NV50_QUERY_ALLOC_SPACE)
156f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller         nv50_query_allocate(nv50, q, NV50_QUERY_ALLOC_SPACE);
157918fc55e5f5cbedd3ab8fb3e02b225106c059fa6Ben Skeggs
158f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      /* XXX: can we do this with the GPU, and sync with respect to a previous
159f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller       *  query ?
160f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller       */
161f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      q->data[1] = 1; /* initial render condition = TRUE */
162f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   }
163f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   if (!q->is64bit)
164f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      q->data[0] = q->sequence++; /* the previously used one */
165918fc55e5f5cbedd3ab8fb3e02b225106c059fa6Ben Skeggs
166f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   switch (q->type) {
167f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   case PIPE_QUERY_OCCLUSION_COUNTER:
1686d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller      PUSH_SPACE(push, 4);
1696d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller      BEGIN_NV04(push, NV50_3D(COUNTER_RESET), 1);
1706d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller      PUSH_DATA (push, NV50_3D_COUNTER_RESET_SAMPLECNT);
1716d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller      BEGIN_NV04(push, NV50_3D(SAMPLECNT_ENABLE), 1);
1726d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller      PUSH_DATA (push, 1);
173f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      break;
17402fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller   case PIPE_QUERY_PRIMITIVES_GENERATED:
17502fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller      nv50_query_get(push, q, 0x10, 0x06805002);
176f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      break;
177f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   case PIPE_QUERY_PRIMITIVES_EMITTED:
17802fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller      nv50_query_get(push, q, 0x10, 0x05805002);
179f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      break;
180f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   case PIPE_QUERY_SO_STATISTICS:
18102fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller      nv50_query_get(push, q, 0x20, 0x05805002);
18202fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller      nv50_query_get(push, q, 0x30, 0x06805002);
183f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      break;
184f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   case PIPE_QUERY_TIME_ELAPSED:
1856d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller      nv50_query_get(push, q, 0x10, 0x00005002);
186f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      break;
187f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   default:
188f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      break;
189f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   }
190f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   q->ready = FALSE;
19147b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
19247b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
193b8965bee404cb36ccd97ac089fbd3ffc63268080Ben Skeggsstatic void
194918fc55e5f5cbedd3ab8fb3e02b225106c059fa6Ben Skeggsnv50_query_end(struct pipe_context *pipe, struct pipe_query *pq)
19579bca7dd884da33c06ecd3dabb893f9cfed1aaedBen Skeggs{
196f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   struct nv50_context *nv50 = nv50_context(pipe);
1976d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller   struct nouveau_pushbuf *push = nv50->base.pushbuf;
198f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   struct nv50_query *q = nv50_query(pq);
199f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller
200f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   switch (q->type) {
201f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   case PIPE_QUERY_OCCLUSION_COUNTER:
2026d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller      nv50_query_get(push, q, 0, 0x0100f002);
2036d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller      PUSH_SPACE(push, 2);
2046d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller      BEGIN_NV04(push, NV50_3D(SAMPLECNT_ENABLE), 1);
2056d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller      PUSH_DATA (push, 0);
206f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      break;
207f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   case PIPE_QUERY_PRIMITIVES_GENERATED:
2086d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller      nv50_query_get(push, q, 0, 0x06805002);
209f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      break;
210f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   case PIPE_QUERY_PRIMITIVES_EMITTED:
2116d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller      nv50_query_get(push, q, 0, 0x05805002);
212f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      break;
213f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   case PIPE_QUERY_SO_STATISTICS:
2146d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller      nv50_query_get(push, q, 0x00, 0x05805002);
2156d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller      nv50_query_get(push, q, 0x10, 0x06805002);
216f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      break;
2179ed65301e044711de0db51b4986085fca170d764Christoph Bumiller   case PIPE_QUERY_TIMESTAMP:
2189ed65301e044711de0db51b4986085fca170d764Christoph Bumiller      q->sequence++;
2199ed65301e044711de0db51b4986085fca170d764Christoph Bumiller      /* fall through */
220f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   case PIPE_QUERY_TIME_ELAPSED:
2216d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller      nv50_query_get(push, q, 0, 0x00005002);
222f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      break;
223f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   case PIPE_QUERY_GPU_FINISHED:
2249ed65301e044711de0db51b4986085fca170d764Christoph Bumiller      q->sequence++;
2256d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller      nv50_query_get(push, q, 0, 0x1000f010);
226f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      break;
22702fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller   case NVA0_QUERY_STREAM_OUTPUT_BUFFER_OFFSET:
22802fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller      nv50_query_get(push, q, 0, 0x0d005002 | (q->index << 5));
22902fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller      break;
230cdf89d0b5c3fccefe573d5adf731dd8fb900b74eRoland Scheidegger   case PIPE_QUERY_TIMESTAMP_DISJOINT:
231cdf89d0b5c3fccefe573d5adf731dd8fb900b74eRoland Scheidegger      break;
232f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   default:
233f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      assert(0);
234f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      break;
235f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   }
2369ed65301e044711de0db51b4986085fca170d764Christoph Bumiller   q->ready = q->flushed = FALSE;
237f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller}
238f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller
239f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic INLINE boolean
240f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_query_ready(struct nv50_query *q)
241f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller{
242f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   return q->ready || (!q->is64bit && (q->data[0] == q->sequence));
243f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller}
244f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller
24579bca7dd884da33c06ecd3dabb893f9cfed1aaedBen Skeggsstatic boolean
246918fc55e5f5cbedd3ab8fb3e02b225106c059fa6Ben Skeggsnv50_query_result(struct pipe_context *pipe, struct pipe_query *pq,
2474445e170bee23a3607ece0e010adef7058ac6a11Marek Olšák                  boolean wait, union pipe_query_result *result)
24847b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs{
2496d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller   struct nv50_context *nv50 = nv50_context(pipe);
250f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   struct nv50_query *q = nv50_query(pq);
2516d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller   uint64_t *res64 = (uint64_t *)result;
25202fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller   uint32_t *res32 = (uint32_t *)result;
2536d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller   boolean *res8 = (boolean *)result;
254f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   uint64_t *data64 = (uint64_t *)q->data;
255f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller
256f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   if (!q->ready) /* update ? */
257f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      q->ready = nv50_query_ready(q);
258f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   if (!q->ready) {
259f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      if (!wait) {
2606d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller         /* for broken apps that spin on GL_QUERY_RESULT_AVAILABLE */
261939b26639fdc0913c5670b7fa20aab1f41b2b155Christoph Bumiller         if (!q->flushed) {
262939b26639fdc0913c5670b7fa20aab1f41b2b155Christoph Bumiller            q->flushed = TRUE;
263939b26639fdc0913c5670b7fa20aab1f41b2b155Christoph Bumiller            PUSH_KICK(nv50->base.pushbuf);
264939b26639fdc0913c5670b7fa20aab1f41b2b155Christoph Bumiller         }
265f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller         return FALSE;
266f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      }
2676d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller      if (nouveau_bo_wait(q->bo, NOUVEAU_BO_RD, nv50->screen->base.client))
268f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller         return FALSE;
269f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   }
270f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   q->ready = TRUE;
271f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller
272f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   switch (q->type) {
2736d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller   case PIPE_QUERY_GPU_FINISHED:
2746d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller      res8[0] = TRUE;
2756d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller      break;
276f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   case PIPE_QUERY_OCCLUSION_COUNTER: /* u32 sequence, u32 count, u64 time */
277f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      res64[0] = q->data[1];
278f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      break;
279f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   case PIPE_QUERY_PRIMITIVES_GENERATED: /* u64 count, u64 time */
280f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   case PIPE_QUERY_PRIMITIVES_EMITTED: /* u64 count, u64 time */
28102fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller      res64[0] = data64[0] - data64[2];
282f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      break;
283f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   case PIPE_QUERY_SO_STATISTICS:
28402fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller      res64[0] = data64[0] - data64[4];
28502fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller      res64[1] = data64[2] - data64[6];
286f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      break;
2879ed65301e044711de0db51b4986085fca170d764Christoph Bumiller   case PIPE_QUERY_TIMESTAMP:
2889ed65301e044711de0db51b4986085fca170d764Christoph Bumiller      res64[0] = data64[1];
2899ed65301e044711de0db51b4986085fca170d764Christoph Bumiller      break;
290cdf89d0b5c3fccefe573d5adf731dd8fb900b74eRoland Scheidegger   case PIPE_QUERY_TIMESTAMP_DISJOINT:
291f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      res64[0] = 1000000000;
292cdf89d0b5c3fccefe573d5adf731dd8fb900b74eRoland Scheidegger      res8[8] = FALSE;
293f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      break;
294f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   case PIPE_QUERY_TIME_ELAPSED:
295f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      res64[0] = data64[1] - data64[3];
296f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      break;
29702fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller   case NVA0_QUERY_STREAM_OUTPUT_BUFFER_OFFSET:
29802fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller      res32[0] = q->data[1];
29902fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller      break;
300f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   default:
301f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      return FALSE;
302f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   }
303f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller
304f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   return TRUE;
30547b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs}
30647b418b8fa5fd242e9021503d6ec329ac3d56fb0Ben Skeggs
30702fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumillervoid
30802fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumillernv84_query_fifo_wait(struct nouveau_pushbuf *push, struct pipe_query *pq)
30902fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller{
31002fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller   struct nv50_query *q = nv50_query(pq);
31102fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller   unsigned offset = q->offset;
31202fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller
31302fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller   PUSH_SPACE(push, 5);
31402fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller   PUSH_REFN (push, q->bo, NOUVEAU_BO_GART | NOUVEAU_BO_RD);
31502fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller   BEGIN_NV04(push, SUBC_3D(NV84_SUBCHAN_SEMAPHORE_ADDRESS_HIGH), 4);
31602fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller   PUSH_DATAh(push, q->bo->offset + offset);
31702fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller   PUSH_DATA (push, q->bo->offset + offset);
31802fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller   PUSH_DATA (push, q->sequence);
31902fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller   PUSH_DATA (push, NV84_SUBCHAN_SEMAPHORE_TRIGGER_ACQUIRE_EQUAL);
32002fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller}
32102fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller
322d6fd31a8d47b6cc70b5e64757e1272ccc6594350Christoph Bumillerstatic void
323d6fd31a8d47b6cc70b5e64757e1272ccc6594350Christoph Bumillernv50_render_condition(struct pipe_context *pipe,
324793e8e3d7ed816cc9a066245dde798afdcf8b581Roland Scheidegger                      struct pipe_query *pq,
325793e8e3d7ed816cc9a066245dde798afdcf8b581Roland Scheidegger                      boolean condition, uint mode)
326d6fd31a8d47b6cc70b5e64757e1272ccc6594350Christoph Bumiller{
327f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   struct nv50_context *nv50 = nv50_context(pipe);
3286d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller   struct nouveau_pushbuf *push = nv50->base.pushbuf;
329f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   struct nv50_query *q;
330f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller
33136ea744f58e5b436c45ed857bd92bbb472e641d5Christoph Bumiller   nv50->cond_query = pq;
332793e8e3d7ed816cc9a066245dde798afdcf8b581Roland Scheidegger   nv50->cond_cond = condition;
33336ea744f58e5b436c45ed857bd92bbb472e641d5Christoph Bumiller   nv50->cond_mode = mode;
33436ea744f58e5b436c45ed857bd92bbb472e641d5Christoph Bumiller
3356d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller   PUSH_SPACE(push, 6);
3366d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller
337f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   if (!pq) {
3386d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller      BEGIN_NV04(push, NV50_3D(COND_MODE), 1);
3396d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller      PUSH_DATA (push, NV50_3D_COND_MODE_ALWAYS);
340f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      return;
341f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   }
342f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   q = nv50_query(pq);
343f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller
344f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   if (mode == PIPE_RENDER_COND_WAIT ||
345f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller       mode == PIPE_RENDER_COND_BY_REGION_WAIT) {
3466d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller      BEGIN_NV04(push, SUBC_3D(NV50_GRAPH_SERIALIZE), 1);
3476d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller      PUSH_DATA (push, 0);
348f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   }
349f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller
3506d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller   BEGIN_NV04(push, NV50_3D(COND_ADDRESS_HIGH), 3);
3516d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller   PUSH_DATAh(push, q->bo->offset + q->offset);
3526d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller   PUSH_DATA (push, q->bo->offset + q->offset);
3536d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller   PUSH_DATA (push, NV50_3D_COND_MODE_RES_NON_ZERO);
354d6fd31a8d47b6cc70b5e64757e1272ccc6594350Christoph Bumiller}
355d6fd31a8d47b6cc70b5e64757e1272ccc6594350Christoph Bumiller
356b8965bee404cb36ccd97ac089fbd3ffc63268080Ben Skeggsvoid
35702fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumillernv50_query_pushbuf_submit(struct nouveau_pushbuf *push,
35802fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller                          struct pipe_query *pq, unsigned result_offset)
35902fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller{
36002fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller   struct nv50_query *q = nv50_query(pq);
36102fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller
36202fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller   /* XXX: does this exist ? */
36302fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller#define NV50_IB_ENTRY_1_NO_PREFETCH (0 << (31 - 8))
36402fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller
36502fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller   nouveau_pushbuf_space(push, 0, 0, 1);
36602fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller   nouveau_pushbuf_data(push, q->bo, q->offset + result_offset, 4 |
36702fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller                        NV50_IB_ENTRY_1_NO_PREFETCH);
36802fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller}
36902fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller
37002fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumillervoid
37102fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumillernva0_so_target_save_offset(struct pipe_context *pipe,
37202fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller                           struct pipe_stream_output_target *ptarg,
37302fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller                           unsigned index, boolean serialize)
37402fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller{
37502fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller   struct nv50_so_target *targ = nv50_so_target(ptarg);
37602fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller
37702fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller   if (serialize) {
37802fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller      struct nouveau_pushbuf *push = nv50_context(pipe)->base.pushbuf;
37902fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller      PUSH_SPACE(push, 2);
38002fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller      BEGIN_NV04(push, SUBC_3D(NV50_GRAPH_SERIALIZE), 1);
38102fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller      PUSH_DATA (push, 0);
38202fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller   }
38302fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller
38402fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller   nv50_query(targ->pq)->index = index;
38502fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller   nv50_query_end(pipe, targ->pq);
38602fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller}
38702fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumiller
38802fac2930581b9bea9f6d221eb6d6b471fc3b9c6Christoph Bumillervoid
389b8965bee404cb36ccd97ac089fbd3ffc63268080Ben Skeggsnv50_init_query_functions(struct nv50_context *nv50)
390b8965bee404cb36ccd97ac089fbd3ffc63268080Ben Skeggs{
3911ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs   struct pipe_context *pipe = &nv50->base.pipe;
3921ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs
3931ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs   pipe->create_query = nv50_query_create;
3941ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs   pipe->destroy_query = nv50_query_destroy;
3951ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs   pipe->begin_query = nv50_query_begin;
3961ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs   pipe->end_query = nv50_query_end;
3971ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs   pipe->get_query_result = nv50_query_result;
3981ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs   pipe->render_condition = nv50_render_condition;
399b8965bee404cb36ccd97ac089fbd3ffc63268080Ben Skeggs}
400