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