xref: /aosp_15_r20/external/mesa3d/src/gallium/frontends/nine/query9.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright 2011 Joakim Sindholt <[email protected]>
3*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker  */
5*61046927SAndroid Build Coastguard Worker 
6*61046927SAndroid Build Coastguard Worker #include "device9.h"
7*61046927SAndroid Build Coastguard Worker #include "nine_state.h"
8*61046927SAndroid Build Coastguard Worker #include "query9.h"
9*61046927SAndroid Build Coastguard Worker #include "nine_helpers.h"
10*61046927SAndroid Build Coastguard Worker #include "pipe/p_screen.h"
11*61046927SAndroid Build Coastguard Worker #include "pipe/p_context.h"
12*61046927SAndroid Build Coastguard Worker #include "util/u_math.h"
13*61046927SAndroid Build Coastguard Worker #include "nine_dump.h"
14*61046927SAndroid Build Coastguard Worker 
15*61046927SAndroid Build Coastguard Worker #define DBG_CHANNEL DBG_QUERY
16*61046927SAndroid Build Coastguard Worker 
17*61046927SAndroid Build Coastguard Worker static inline unsigned
d3dquerytype_to_pipe_query(struct pipe_screen * screen,D3DQUERYTYPE type)18*61046927SAndroid Build Coastguard Worker d3dquerytype_to_pipe_query(struct pipe_screen *screen, D3DQUERYTYPE type)
19*61046927SAndroid Build Coastguard Worker {
20*61046927SAndroid Build Coastguard Worker     switch (type) {
21*61046927SAndroid Build Coastguard Worker     case D3DQUERYTYPE_EVENT:
22*61046927SAndroid Build Coastguard Worker         return PIPE_QUERY_GPU_FINISHED;
23*61046927SAndroid Build Coastguard Worker     case D3DQUERYTYPE_OCCLUSION:
24*61046927SAndroid Build Coastguard Worker         return screen->get_param(screen, PIPE_CAP_OCCLUSION_QUERY) ?
25*61046927SAndroid Build Coastguard Worker                PIPE_QUERY_OCCLUSION_COUNTER : PIPE_QUERY_TYPES;
26*61046927SAndroid Build Coastguard Worker     case D3DQUERYTYPE_TIMESTAMP:
27*61046927SAndroid Build Coastguard Worker         return screen->get_param(screen, PIPE_CAP_QUERY_TIMESTAMP) ?
28*61046927SAndroid Build Coastguard Worker                PIPE_QUERY_TIMESTAMP : PIPE_QUERY_TYPES;
29*61046927SAndroid Build Coastguard Worker     case D3DQUERYTYPE_TIMESTAMPDISJOINT:
30*61046927SAndroid Build Coastguard Worker     case D3DQUERYTYPE_TIMESTAMPFREQ:
31*61046927SAndroid Build Coastguard Worker         return screen->get_param(screen, PIPE_CAP_QUERY_TIMESTAMP) ?
32*61046927SAndroid Build Coastguard Worker                PIPE_QUERY_TIMESTAMP_DISJOINT : PIPE_QUERY_TYPES;
33*61046927SAndroid Build Coastguard Worker     case D3DQUERYTYPE_VERTEXSTATS:
34*61046927SAndroid Build Coastguard Worker         return screen->get_param(screen,
35*61046927SAndroid Build Coastguard Worker                                  PIPE_CAP_QUERY_PIPELINE_STATISTICS) ?
36*61046927SAndroid Build Coastguard Worker                PIPE_QUERY_PIPELINE_STATISTICS : PIPE_QUERY_TYPES;
37*61046927SAndroid Build Coastguard Worker     default:
38*61046927SAndroid Build Coastguard Worker         return PIPE_QUERY_TYPES; /* Query not supported */
39*61046927SAndroid Build Coastguard Worker     }
40*61046927SAndroid Build Coastguard Worker }
41*61046927SAndroid Build Coastguard Worker 
42*61046927SAndroid Build Coastguard Worker #define GET_DATA_SIZE_CASE2(a, b) case D3DQUERYTYPE_##a: return sizeof(D3DDEVINFO_##b)
43*61046927SAndroid Build Coastguard Worker #define GET_DATA_SIZE_CASET(a, b) case D3DQUERYTYPE_##a: return sizeof(b)
44*61046927SAndroid Build Coastguard Worker static inline DWORD
nine_query_result_size(D3DQUERYTYPE type)45*61046927SAndroid Build Coastguard Worker nine_query_result_size(D3DQUERYTYPE type)
46*61046927SAndroid Build Coastguard Worker {
47*61046927SAndroid Build Coastguard Worker     switch (type) {
48*61046927SAndroid Build Coastguard Worker     GET_DATA_SIZE_CASE2(VERTEXSTATS, D3DVERTEXSTATS);
49*61046927SAndroid Build Coastguard Worker     GET_DATA_SIZE_CASET(EVENT, BOOL);
50*61046927SAndroid Build Coastguard Worker     GET_DATA_SIZE_CASET(OCCLUSION, DWORD);
51*61046927SAndroid Build Coastguard Worker     GET_DATA_SIZE_CASET(TIMESTAMP, UINT64);
52*61046927SAndroid Build Coastguard Worker     GET_DATA_SIZE_CASET(TIMESTAMPDISJOINT, BOOL);
53*61046927SAndroid Build Coastguard Worker     GET_DATA_SIZE_CASET(TIMESTAMPFREQ, UINT64);
54*61046927SAndroid Build Coastguard Worker     default:
55*61046927SAndroid Build Coastguard Worker         assert(0);
56*61046927SAndroid Build Coastguard Worker         return 0;
57*61046927SAndroid Build Coastguard Worker     }
58*61046927SAndroid Build Coastguard Worker }
59*61046927SAndroid Build Coastguard Worker 
60*61046927SAndroid Build Coastguard Worker HRESULT
nine_is_query_supported(struct pipe_screen * screen,D3DQUERYTYPE type)61*61046927SAndroid Build Coastguard Worker nine_is_query_supported(struct pipe_screen *screen, D3DQUERYTYPE type)
62*61046927SAndroid Build Coastguard Worker {
63*61046927SAndroid Build Coastguard Worker     const unsigned ptype = d3dquerytype_to_pipe_query(screen, type);
64*61046927SAndroid Build Coastguard Worker 
65*61046927SAndroid Build Coastguard Worker     user_assert(ptype != ~0, D3DERR_INVALIDCALL);
66*61046927SAndroid Build Coastguard Worker 
67*61046927SAndroid Build Coastguard Worker     if (ptype == PIPE_QUERY_TYPES) {
68*61046927SAndroid Build Coastguard Worker         DBG("Query type %u (%s) not supported.\n",
69*61046927SAndroid Build Coastguard Worker             type, nine_D3DQUERYTYPE_to_str(type));
70*61046927SAndroid Build Coastguard Worker         return D3DERR_NOTAVAILABLE;
71*61046927SAndroid Build Coastguard Worker     }
72*61046927SAndroid Build Coastguard Worker     return D3D_OK;
73*61046927SAndroid Build Coastguard Worker }
74*61046927SAndroid Build Coastguard Worker 
75*61046927SAndroid Build Coastguard Worker HRESULT
NineQuery9_ctor(struct NineQuery9 * This,struct NineUnknownParams * pParams,D3DQUERYTYPE Type)76*61046927SAndroid Build Coastguard Worker NineQuery9_ctor( struct NineQuery9 *This,
77*61046927SAndroid Build Coastguard Worker                  struct NineUnknownParams *pParams,
78*61046927SAndroid Build Coastguard Worker                  D3DQUERYTYPE Type )
79*61046927SAndroid Build Coastguard Worker {
80*61046927SAndroid Build Coastguard Worker     struct NineDevice9 *device = pParams->device;
81*61046927SAndroid Build Coastguard Worker     const unsigned ptype = d3dquerytype_to_pipe_query(device->screen, Type);
82*61046927SAndroid Build Coastguard Worker     HRESULT hr;
83*61046927SAndroid Build Coastguard Worker 
84*61046927SAndroid Build Coastguard Worker     DBG("This=%p pParams=%p Type=%d\n", This, pParams, Type);
85*61046927SAndroid Build Coastguard Worker 
86*61046927SAndroid Build Coastguard Worker     hr = NineUnknown_ctor(&This->base, pParams);
87*61046927SAndroid Build Coastguard Worker     if (FAILED(hr))
88*61046927SAndroid Build Coastguard Worker         return hr;
89*61046927SAndroid Build Coastguard Worker 
90*61046927SAndroid Build Coastguard Worker     This->state = NINE_QUERY_STATE_FRESH;
91*61046927SAndroid Build Coastguard Worker     This->type = Type;
92*61046927SAndroid Build Coastguard Worker 
93*61046927SAndroid Build Coastguard Worker     user_assert(ptype != ~0, D3DERR_INVALIDCALL);
94*61046927SAndroid Build Coastguard Worker 
95*61046927SAndroid Build Coastguard Worker     if (ptype < PIPE_QUERY_TYPES) {
96*61046927SAndroid Build Coastguard Worker         This->pq = nine_context_create_query(device, ptype);
97*61046927SAndroid Build Coastguard Worker         if (!This->pq)
98*61046927SAndroid Build Coastguard Worker             return E_OUTOFMEMORY;
99*61046927SAndroid Build Coastguard Worker     } else {
100*61046927SAndroid Build Coastguard Worker         assert(0); /* we have checked this case before */
101*61046927SAndroid Build Coastguard Worker     }
102*61046927SAndroid Build Coastguard Worker 
103*61046927SAndroid Build Coastguard Worker     This->instant =
104*61046927SAndroid Build Coastguard Worker         Type == D3DQUERYTYPE_EVENT ||
105*61046927SAndroid Build Coastguard Worker         Type == D3DQUERYTYPE_RESOURCEMANAGER ||
106*61046927SAndroid Build Coastguard Worker         Type == D3DQUERYTYPE_TIMESTAMP ||
107*61046927SAndroid Build Coastguard Worker         Type == D3DQUERYTYPE_TIMESTAMPFREQ ||
108*61046927SAndroid Build Coastguard Worker         Type == D3DQUERYTYPE_VCACHE ||
109*61046927SAndroid Build Coastguard Worker         Type == D3DQUERYTYPE_VERTEXSTATS;
110*61046927SAndroid Build Coastguard Worker 
111*61046927SAndroid Build Coastguard Worker     This->result_size = nine_query_result_size(Type);
112*61046927SAndroid Build Coastguard Worker 
113*61046927SAndroid Build Coastguard Worker     return D3D_OK;
114*61046927SAndroid Build Coastguard Worker }
115*61046927SAndroid Build Coastguard Worker 
116*61046927SAndroid Build Coastguard Worker void
NineQuery9_dtor(struct NineQuery9 * This)117*61046927SAndroid Build Coastguard Worker NineQuery9_dtor( struct NineQuery9 *This )
118*61046927SAndroid Build Coastguard Worker {
119*61046927SAndroid Build Coastguard Worker     struct NineDevice9 *device = This->base.device;
120*61046927SAndroid Build Coastguard Worker 
121*61046927SAndroid Build Coastguard Worker     DBG("This=%p\n", This);
122*61046927SAndroid Build Coastguard Worker 
123*61046927SAndroid Build Coastguard Worker     if (This->pq) {
124*61046927SAndroid Build Coastguard Worker         if (This->state == NINE_QUERY_STATE_RUNNING)
125*61046927SAndroid Build Coastguard Worker             nine_context_end_query(device, &This->counter, This->pq);
126*61046927SAndroid Build Coastguard Worker         nine_context_destroy_query(device, This->pq);
127*61046927SAndroid Build Coastguard Worker     }
128*61046927SAndroid Build Coastguard Worker 
129*61046927SAndroid Build Coastguard Worker     NineUnknown_dtor(&This->base);
130*61046927SAndroid Build Coastguard Worker }
131*61046927SAndroid Build Coastguard Worker 
132*61046927SAndroid Build Coastguard Worker D3DQUERYTYPE NINE_WINAPI
NineQuery9_GetType(struct NineQuery9 * This)133*61046927SAndroid Build Coastguard Worker NineQuery9_GetType( struct NineQuery9 *This )
134*61046927SAndroid Build Coastguard Worker {
135*61046927SAndroid Build Coastguard Worker     return This->type;
136*61046927SAndroid Build Coastguard Worker }
137*61046927SAndroid Build Coastguard Worker 
138*61046927SAndroid Build Coastguard Worker DWORD NINE_WINAPI
NineQuery9_GetDataSize(struct NineQuery9 * This)139*61046927SAndroid Build Coastguard Worker NineQuery9_GetDataSize( struct NineQuery9 *This )
140*61046927SAndroid Build Coastguard Worker {
141*61046927SAndroid Build Coastguard Worker     return This->result_size;
142*61046927SAndroid Build Coastguard Worker }
143*61046927SAndroid Build Coastguard Worker 
144*61046927SAndroid Build Coastguard Worker HRESULT NINE_WINAPI
NineQuery9_Issue(struct NineQuery9 * This,DWORD dwIssueFlags)145*61046927SAndroid Build Coastguard Worker NineQuery9_Issue( struct NineQuery9 *This,
146*61046927SAndroid Build Coastguard Worker                   DWORD dwIssueFlags )
147*61046927SAndroid Build Coastguard Worker {
148*61046927SAndroid Build Coastguard Worker     struct NineDevice9 *device = This->base.device;
149*61046927SAndroid Build Coastguard Worker 
150*61046927SAndroid Build Coastguard Worker     DBG("This=%p dwIssueFlags=%d\n", This, dwIssueFlags);
151*61046927SAndroid Build Coastguard Worker 
152*61046927SAndroid Build Coastguard Worker     user_assert((dwIssueFlags == D3DISSUE_BEGIN) ||
153*61046927SAndroid Build Coastguard Worker                 (dwIssueFlags == 0) ||
154*61046927SAndroid Build Coastguard Worker                 (dwIssueFlags == D3DISSUE_END), D3DERR_INVALIDCALL);
155*61046927SAndroid Build Coastguard Worker 
156*61046927SAndroid Build Coastguard Worker     /* Wine tests: always return D3D_OK on D3DISSUE_BEGIN
157*61046927SAndroid Build Coastguard Worker      * even when the call is supposed to be forbidden */
158*61046927SAndroid Build Coastguard Worker     if (dwIssueFlags == D3DISSUE_BEGIN && This->instant)
159*61046927SAndroid Build Coastguard Worker         return D3D_OK;
160*61046927SAndroid Build Coastguard Worker 
161*61046927SAndroid Build Coastguard Worker     if (dwIssueFlags == D3DISSUE_BEGIN) {
162*61046927SAndroid Build Coastguard Worker         if (This->state == NINE_QUERY_STATE_RUNNING)
163*61046927SAndroid Build Coastguard Worker             nine_context_end_query(device, &This->counter, This->pq);
164*61046927SAndroid Build Coastguard Worker         nine_context_begin_query(device, &This->counter, This->pq);
165*61046927SAndroid Build Coastguard Worker         This->state = NINE_QUERY_STATE_RUNNING;
166*61046927SAndroid Build Coastguard Worker     } else {
167*61046927SAndroid Build Coastguard Worker         if (This->state != NINE_QUERY_STATE_RUNNING &&
168*61046927SAndroid Build Coastguard Worker             This->type != D3DQUERYTYPE_EVENT &&
169*61046927SAndroid Build Coastguard Worker             This->type != D3DQUERYTYPE_TIMESTAMP)
170*61046927SAndroid Build Coastguard Worker             nine_context_begin_query(device, &This->counter, This->pq);
171*61046927SAndroid Build Coastguard Worker         nine_context_end_query(device, &This->counter, This->pq);
172*61046927SAndroid Build Coastguard Worker         This->state = NINE_QUERY_STATE_ENDED;
173*61046927SAndroid Build Coastguard Worker     }
174*61046927SAndroid Build Coastguard Worker     return D3D_OK;
175*61046927SAndroid Build Coastguard Worker }
176*61046927SAndroid Build Coastguard Worker 
177*61046927SAndroid Build Coastguard Worker union nine_query_result
178*61046927SAndroid Build Coastguard Worker {
179*61046927SAndroid Build Coastguard Worker     D3DDEVINFO_D3DVERTEXSTATS vertexstats;
180*61046927SAndroid Build Coastguard Worker     DWORD dw;
181*61046927SAndroid Build Coastguard Worker     BOOL b;
182*61046927SAndroid Build Coastguard Worker     UINT64 u64;
183*61046927SAndroid Build Coastguard Worker };
184*61046927SAndroid Build Coastguard Worker 
185*61046927SAndroid Build Coastguard Worker HRESULT NINE_WINAPI
NineQuery9_GetData(struct NineQuery9 * This,void * pData,DWORD dwSize,DWORD dwGetDataFlags)186*61046927SAndroid Build Coastguard Worker NineQuery9_GetData( struct NineQuery9 *This,
187*61046927SAndroid Build Coastguard Worker                     void *pData,
188*61046927SAndroid Build Coastguard Worker                     DWORD dwSize,
189*61046927SAndroid Build Coastguard Worker                     DWORD dwGetDataFlags )
190*61046927SAndroid Build Coastguard Worker {
191*61046927SAndroid Build Coastguard Worker     struct NineDevice9 *device = This->base.device;
192*61046927SAndroid Build Coastguard Worker     bool ok, wait_query_result = false;
193*61046927SAndroid Build Coastguard Worker     union pipe_query_result presult;
194*61046927SAndroid Build Coastguard Worker     union nine_query_result nresult;
195*61046927SAndroid Build Coastguard Worker 
196*61046927SAndroid Build Coastguard Worker     DBG("This=%p pData=%p dwSize=%d dwGetDataFlags=%d\n",
197*61046927SAndroid Build Coastguard Worker         This, pData, dwSize, dwGetDataFlags);
198*61046927SAndroid Build Coastguard Worker 
199*61046927SAndroid Build Coastguard Worker     /* according to spec we should return D3DERR_INVALIDCALL here, but
200*61046927SAndroid Build Coastguard Worker      * wine returns S_FALSE because it is apparently the behaviour
201*61046927SAndroid Build Coastguard Worker      * on windows */
202*61046927SAndroid Build Coastguard Worker     user_assert(This->state != NINE_QUERY_STATE_RUNNING, S_FALSE);
203*61046927SAndroid Build Coastguard Worker     user_assert(dwSize == 0 || pData, D3DERR_INVALIDCALL);
204*61046927SAndroid Build Coastguard Worker     user_assert(dwGetDataFlags == 0 ||
205*61046927SAndroid Build Coastguard Worker                 dwGetDataFlags == D3DGETDATA_FLUSH, D3DERR_INVALIDCALL);
206*61046927SAndroid Build Coastguard Worker 
207*61046927SAndroid Build Coastguard Worker     if (This->state == NINE_QUERY_STATE_FRESH) {
208*61046927SAndroid Build Coastguard Worker         /* App forgot calling Issue. call it for it.
209*61046927SAndroid Build Coastguard Worker          * However Wine states that return value should
210*61046927SAndroid Build Coastguard Worker          * be S_OK, so wait for the result to return S_OK. */
211*61046927SAndroid Build Coastguard Worker         NineQuery9_Issue(This, D3DISSUE_END);
212*61046927SAndroid Build Coastguard Worker         wait_query_result = true;
213*61046927SAndroid Build Coastguard Worker     }
214*61046927SAndroid Build Coastguard Worker 
215*61046927SAndroid Build Coastguard Worker     /* The documentation mentions no special case for D3DQUERYTYPE_TIMESTAMP.
216*61046927SAndroid Build Coastguard Worker      * However Windows tests show that the query always succeeds when
217*61046927SAndroid Build Coastguard Worker      * D3DGETDATA_FLUSH is specified. */
218*61046927SAndroid Build Coastguard Worker     if (This->type == D3DQUERYTYPE_TIMESTAMP &&
219*61046927SAndroid Build Coastguard Worker         (dwGetDataFlags & D3DGETDATA_FLUSH))
220*61046927SAndroid Build Coastguard Worker         wait_query_result = true;
221*61046927SAndroid Build Coastguard Worker 
222*61046927SAndroid Build Coastguard Worker 
223*61046927SAndroid Build Coastguard Worker     /* Note: We ignore dwGetDataFlags, because get_query_result will
224*61046927SAndroid Build Coastguard Worker      * flush automatically if needed */
225*61046927SAndroid Build Coastguard Worker 
226*61046927SAndroid Build Coastguard Worker     ok = nine_context_get_query_result(device, This->pq, &This->counter,
227*61046927SAndroid Build Coastguard Worker                                        !!(dwGetDataFlags & D3DGETDATA_FLUSH),
228*61046927SAndroid Build Coastguard Worker                                        wait_query_result, &presult);
229*61046927SAndroid Build Coastguard Worker 
230*61046927SAndroid Build Coastguard Worker     if (!ok) return S_FALSE;
231*61046927SAndroid Build Coastguard Worker 
232*61046927SAndroid Build Coastguard Worker     if (!dwSize)
233*61046927SAndroid Build Coastguard Worker         return S_OK;
234*61046927SAndroid Build Coastguard Worker 
235*61046927SAndroid Build Coastguard Worker     switch (This->type) {
236*61046927SAndroid Build Coastguard Worker     case D3DQUERYTYPE_EVENT:
237*61046927SAndroid Build Coastguard Worker         nresult.b = presult.b;
238*61046927SAndroid Build Coastguard Worker         break;
239*61046927SAndroid Build Coastguard Worker     case D3DQUERYTYPE_OCCLUSION:
240*61046927SAndroid Build Coastguard Worker         nresult.dw = presult.u64;
241*61046927SAndroid Build Coastguard Worker         break;
242*61046927SAndroid Build Coastguard Worker     case D3DQUERYTYPE_TIMESTAMP:
243*61046927SAndroid Build Coastguard Worker         nresult.u64 = presult.u64;
244*61046927SAndroid Build Coastguard Worker         break;
245*61046927SAndroid Build Coastguard Worker     case D3DQUERYTYPE_TIMESTAMPDISJOINT:
246*61046927SAndroid Build Coastguard Worker         nresult.b = presult.timestamp_disjoint.disjoint;
247*61046927SAndroid Build Coastguard Worker         break;
248*61046927SAndroid Build Coastguard Worker     case D3DQUERYTYPE_TIMESTAMPFREQ:
249*61046927SAndroid Build Coastguard Worker         /* Applications use it to convert the TIMESTAMP value to time.
250*61046927SAndroid Build Coastguard Worker            AMD drivers on win seem to return the actual hardware clock
251*61046927SAndroid Build Coastguard Worker            resolution and corresponding values in TIMESTAMP.
252*61046927SAndroid Build Coastguard Worker            However, this behaviour is not easy to replicate here.
253*61046927SAndroid Build Coastguard Worker            So instead we do what wine and opengl do, and use
254*61046927SAndroid Build Coastguard Worker            nanoseconds TIMESTAMPs.
255*61046927SAndroid Build Coastguard Worker            (Which is also the unit used by PIPE_QUERY_TIMESTAMP.)
256*61046927SAndroid Build Coastguard Worker         */
257*61046927SAndroid Build Coastguard Worker         nresult.u64 = 1000000000;
258*61046927SAndroid Build Coastguard Worker         break;
259*61046927SAndroid Build Coastguard Worker     case D3DQUERYTYPE_VERTEXSTATS:
260*61046927SAndroid Build Coastguard Worker         nresult.vertexstats.NumRenderedTriangles =
261*61046927SAndroid Build Coastguard Worker             presult.pipeline_statistics.c_invocations;
262*61046927SAndroid Build Coastguard Worker         nresult.vertexstats.NumExtraClippingTriangles =
263*61046927SAndroid Build Coastguard Worker             presult.pipeline_statistics.c_primitives;
264*61046927SAndroid Build Coastguard Worker         break;
265*61046927SAndroid Build Coastguard Worker     default:
266*61046927SAndroid Build Coastguard Worker         assert(0);
267*61046927SAndroid Build Coastguard Worker         break;
268*61046927SAndroid Build Coastguard Worker     }
269*61046927SAndroid Build Coastguard Worker     memcpy(pData, &nresult, MIN2(sizeof(nresult), dwSize));
270*61046927SAndroid Build Coastguard Worker 
271*61046927SAndroid Build Coastguard Worker     return S_OK;
272*61046927SAndroid Build Coastguard Worker }
273*61046927SAndroid Build Coastguard Worker 
274*61046927SAndroid Build Coastguard Worker IDirect3DQuery9Vtbl NineQuery9_vtable = {
275*61046927SAndroid Build Coastguard Worker     (void *)NineUnknown_QueryInterface,
276*61046927SAndroid Build Coastguard Worker     (void *)NineUnknown_AddRef,
277*61046927SAndroid Build Coastguard Worker     (void *)NineUnknown_Release,
278*61046927SAndroid Build Coastguard Worker     (void *)NineUnknown_GetDevice, /* actually part of Query9 iface */
279*61046927SAndroid Build Coastguard Worker     (void *)NineQuery9_GetType,
280*61046927SAndroid Build Coastguard Worker     (void *)NineQuery9_GetDataSize,
281*61046927SAndroid Build Coastguard Worker     (void *)NineQuery9_Issue,
282*61046927SAndroid Build Coastguard Worker     (void *)NineQuery9_GetData
283*61046927SAndroid Build Coastguard Worker };
284*61046927SAndroid Build Coastguard Worker 
285*61046927SAndroid Build Coastguard Worker static const GUID *NineQuery9_IIDs[] = {
286*61046927SAndroid Build Coastguard Worker     &IID_IDirect3DQuery9,
287*61046927SAndroid Build Coastguard Worker     &IID_IUnknown,
288*61046927SAndroid Build Coastguard Worker     NULL
289*61046927SAndroid Build Coastguard Worker };
290*61046927SAndroid Build Coastguard Worker 
291*61046927SAndroid Build Coastguard Worker HRESULT
NineQuery9_new(struct NineDevice9 * pDevice,struct NineQuery9 ** ppOut,D3DQUERYTYPE Type)292*61046927SAndroid Build Coastguard Worker NineQuery9_new( struct NineDevice9 *pDevice,
293*61046927SAndroid Build Coastguard Worker                 struct NineQuery9 **ppOut,
294*61046927SAndroid Build Coastguard Worker                 D3DQUERYTYPE Type )
295*61046927SAndroid Build Coastguard Worker {
296*61046927SAndroid Build Coastguard Worker     NINE_DEVICE_CHILD_NEW(Query9, ppOut, pDevice, Type);
297*61046927SAndroid Build Coastguard Worker }
298