1*61046927SAndroid Build Coastguard Worker /**************************************************************************
2*61046927SAndroid Build Coastguard Worker *
3*61046927SAndroid Build Coastguard Worker * Copyright 2012-2021 VMware, Inc.
4*61046927SAndroid Build Coastguard Worker * All Rights Reserved.
5*61046927SAndroid Build Coastguard Worker *
6*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
7*61046927SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the
8*61046927SAndroid Build Coastguard Worker * "Software"), to deal in the Software without restriction, including
9*61046927SAndroid Build Coastguard Worker * without limitation the rights to use, copy, modify, merge, publish,
10*61046927SAndroid Build Coastguard Worker * distribute, sub license, and/or sell copies of the Software, and to
11*61046927SAndroid Build Coastguard Worker * permit persons to whom the Software is furnished to do so, subject to
12*61046927SAndroid Build Coastguard Worker * the following conditions:
13*61046927SAndroid Build Coastguard Worker *
14*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15*61046927SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16*61046927SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
17*61046927SAndroid Build Coastguard Worker * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
18*61046927SAndroid Build Coastguard Worker * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
19*61046927SAndroid Build Coastguard Worker * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
20*61046927SAndroid Build Coastguard Worker * USE OR OTHER DEALINGS IN THE SOFTWARE.
21*61046927SAndroid Build Coastguard Worker *
22*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the
23*61046927SAndroid Build Coastguard Worker * next paragraph) shall be included in all copies or substantial portions
24*61046927SAndroid Build Coastguard Worker * of the Software.
25*61046927SAndroid Build Coastguard Worker *
26*61046927SAndroid Build Coastguard Worker **************************************************************************/
27*61046927SAndroid Build Coastguard Worker
28*61046927SAndroid Build Coastguard Worker /*
29*61046927SAndroid Build Coastguard Worker * Query.cpp --
30*61046927SAndroid Build Coastguard Worker * Functions that manipulate query resources.
31*61046927SAndroid Build Coastguard Worker */
32*61046927SAndroid Build Coastguard Worker
33*61046927SAndroid Build Coastguard Worker
34*61046927SAndroid Build Coastguard Worker #include "Query.h"
35*61046927SAndroid Build Coastguard Worker #include "State.h"
36*61046927SAndroid Build Coastguard Worker
37*61046927SAndroid Build Coastguard Worker #include "Debug.h"
38*61046927SAndroid Build Coastguard Worker
39*61046927SAndroid Build Coastguard Worker
40*61046927SAndroid Build Coastguard Worker /*
41*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
42*61046927SAndroid Build Coastguard Worker *
43*61046927SAndroid Build Coastguard Worker * CalcPrivateQuerySize --
44*61046927SAndroid Build Coastguard Worker *
45*61046927SAndroid Build Coastguard Worker * The CalcPrivateQuerySize function determines the size of the
46*61046927SAndroid Build Coastguard Worker * user-mode display driver's private region of memory (that is,
47*61046927SAndroid Build Coastguard Worker * the size of internal driver structures, not the size of the
48*61046927SAndroid Build Coastguard Worker * resource video memory) for a query.
49*61046927SAndroid Build Coastguard Worker *
50*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
51*61046927SAndroid Build Coastguard Worker */
52*61046927SAndroid Build Coastguard Worker
53*61046927SAndroid Build Coastguard Worker SIZE_T APIENTRY
CalcPrivateQuerySize(D3D10DDI_HDEVICE hDevice,__in const D3D10DDIARG_CREATEQUERY * pCreateQuery)54*61046927SAndroid Build Coastguard Worker CalcPrivateQuerySize(D3D10DDI_HDEVICE hDevice, // IN
55*61046927SAndroid Build Coastguard Worker __in const D3D10DDIARG_CREATEQUERY *pCreateQuery) // IN
56*61046927SAndroid Build Coastguard Worker {
57*61046927SAndroid Build Coastguard Worker return sizeof(Query);
58*61046927SAndroid Build Coastguard Worker }
59*61046927SAndroid Build Coastguard Worker
60*61046927SAndroid Build Coastguard Worker
61*61046927SAndroid Build Coastguard Worker static uint
TranslateQueryType(D3D10DDI_QUERY query)62*61046927SAndroid Build Coastguard Worker TranslateQueryType(D3D10DDI_QUERY query)
63*61046927SAndroid Build Coastguard Worker {
64*61046927SAndroid Build Coastguard Worker switch (query) {
65*61046927SAndroid Build Coastguard Worker case D3D10DDI_QUERY_EVENT:
66*61046927SAndroid Build Coastguard Worker return PIPE_QUERY_GPU_FINISHED;
67*61046927SAndroid Build Coastguard Worker case D3D10DDI_QUERY_OCCLUSION:
68*61046927SAndroid Build Coastguard Worker return PIPE_QUERY_OCCLUSION_COUNTER;
69*61046927SAndroid Build Coastguard Worker case D3D10DDI_QUERY_TIMESTAMP:
70*61046927SAndroid Build Coastguard Worker return PIPE_QUERY_TIMESTAMP;
71*61046927SAndroid Build Coastguard Worker case D3D10DDI_QUERY_TIMESTAMPDISJOINT:
72*61046927SAndroid Build Coastguard Worker return PIPE_QUERY_TIMESTAMP_DISJOINT;
73*61046927SAndroid Build Coastguard Worker case D3D10DDI_QUERY_PIPELINESTATS:
74*61046927SAndroid Build Coastguard Worker return PIPE_QUERY_PIPELINE_STATISTICS;
75*61046927SAndroid Build Coastguard Worker case D3D10DDI_QUERY_OCCLUSIONPREDICATE:
76*61046927SAndroid Build Coastguard Worker return PIPE_QUERY_OCCLUSION_PREDICATE;
77*61046927SAndroid Build Coastguard Worker case D3D10DDI_QUERY_STREAMOUTPUTSTATS:
78*61046927SAndroid Build Coastguard Worker return PIPE_QUERY_SO_STATISTICS;
79*61046927SAndroid Build Coastguard Worker case D3D10DDI_QUERY_STREAMOVERFLOWPREDICATE:
80*61046927SAndroid Build Coastguard Worker return PIPE_QUERY_SO_OVERFLOW_PREDICATE;
81*61046927SAndroid Build Coastguard Worker default:
82*61046927SAndroid Build Coastguard Worker LOG_UNSUPPORTED(true);
83*61046927SAndroid Build Coastguard Worker return PIPE_QUERY_TYPES;
84*61046927SAndroid Build Coastguard Worker }
85*61046927SAndroid Build Coastguard Worker }
86*61046927SAndroid Build Coastguard Worker
87*61046927SAndroid Build Coastguard Worker
88*61046927SAndroid Build Coastguard Worker /*
89*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
90*61046927SAndroid Build Coastguard Worker *
91*61046927SAndroid Build Coastguard Worker * CreateQuery --
92*61046927SAndroid Build Coastguard Worker *
93*61046927SAndroid Build Coastguard Worker * The CreateQuery function creates driver-side resources for a
94*61046927SAndroid Build Coastguard Worker * query that the Microsoft Direct3D runtime subsequently issues
95*61046927SAndroid Build Coastguard Worker * for processing.
96*61046927SAndroid Build Coastguard Worker *
97*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
98*61046927SAndroid Build Coastguard Worker */
99*61046927SAndroid Build Coastguard Worker
100*61046927SAndroid Build Coastguard Worker void APIENTRY
CreateQuery(D3D10DDI_HDEVICE hDevice,__in const D3D10DDIARG_CREATEQUERY * pCreateQuery,D3D10DDI_HQUERY hQuery,D3D10DDI_HRTQUERY hRTQuery)101*61046927SAndroid Build Coastguard Worker CreateQuery(D3D10DDI_HDEVICE hDevice, // IN
102*61046927SAndroid Build Coastguard Worker __in const D3D10DDIARG_CREATEQUERY *pCreateQuery, // IN
103*61046927SAndroid Build Coastguard Worker D3D10DDI_HQUERY hQuery, // IN
104*61046927SAndroid Build Coastguard Worker D3D10DDI_HRTQUERY hRTQuery) // IN
105*61046927SAndroid Build Coastguard Worker {
106*61046927SAndroid Build Coastguard Worker LOG_ENTRYPOINT();
107*61046927SAndroid Build Coastguard Worker
108*61046927SAndroid Build Coastguard Worker Device *pDevice = CastDevice(hDevice);
109*61046927SAndroid Build Coastguard Worker struct pipe_context *pipe = pDevice->pipe;
110*61046927SAndroid Build Coastguard Worker
111*61046927SAndroid Build Coastguard Worker Query *pQuery = CastQuery(hQuery);
112*61046927SAndroid Build Coastguard Worker memset(pQuery, 0, sizeof *pQuery);
113*61046927SAndroid Build Coastguard Worker
114*61046927SAndroid Build Coastguard Worker pQuery->Type = pCreateQuery->Query;
115*61046927SAndroid Build Coastguard Worker pQuery->Flags = pCreateQuery->MiscFlags;
116*61046927SAndroid Build Coastguard Worker
117*61046927SAndroid Build Coastguard Worker pQuery->pipe_type = TranslateQueryType(pCreateQuery->Query);
118*61046927SAndroid Build Coastguard Worker if (pQuery->pipe_type < PIPE_QUERY_TYPES) {
119*61046927SAndroid Build Coastguard Worker pQuery->handle = pipe->create_query(pipe, pQuery->pipe_type, 0);
120*61046927SAndroid Build Coastguard Worker }
121*61046927SAndroid Build Coastguard Worker }
122*61046927SAndroid Build Coastguard Worker
123*61046927SAndroid Build Coastguard Worker
124*61046927SAndroid Build Coastguard Worker /*
125*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
126*61046927SAndroid Build Coastguard Worker *
127*61046927SAndroid Build Coastguard Worker * DestroyQuery --
128*61046927SAndroid Build Coastguard Worker *
129*61046927SAndroid Build Coastguard Worker * The DestroyQuery function releases resources for a query.
130*61046927SAndroid Build Coastguard Worker *
131*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
132*61046927SAndroid Build Coastguard Worker */
133*61046927SAndroid Build Coastguard Worker
134*61046927SAndroid Build Coastguard Worker void APIENTRY
DestroyQuery(D3D10DDI_HDEVICE hDevice,D3D10DDI_HQUERY hQuery)135*61046927SAndroid Build Coastguard Worker DestroyQuery(D3D10DDI_HDEVICE hDevice, // IN
136*61046927SAndroid Build Coastguard Worker D3D10DDI_HQUERY hQuery) // IN
137*61046927SAndroid Build Coastguard Worker {
138*61046927SAndroid Build Coastguard Worker LOG_ENTRYPOINT();
139*61046927SAndroid Build Coastguard Worker
140*61046927SAndroid Build Coastguard Worker struct pipe_context *pipe = CastPipeContext(hDevice);
141*61046927SAndroid Build Coastguard Worker Query *pQuery = CastQuery(hQuery);
142*61046927SAndroid Build Coastguard Worker
143*61046927SAndroid Build Coastguard Worker if (pQuery->handle) {
144*61046927SAndroid Build Coastguard Worker pipe->destroy_query(pipe, pQuery->handle);
145*61046927SAndroid Build Coastguard Worker }
146*61046927SAndroid Build Coastguard Worker }
147*61046927SAndroid Build Coastguard Worker
148*61046927SAndroid Build Coastguard Worker
149*61046927SAndroid Build Coastguard Worker /*
150*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
151*61046927SAndroid Build Coastguard Worker *
152*61046927SAndroid Build Coastguard Worker * QueryBegin --
153*61046927SAndroid Build Coastguard Worker *
154*61046927SAndroid Build Coastguard Worker * The QueryBegin function marks the beginning of a sequence of
155*61046927SAndroid Build Coastguard Worker * graphics commands for a query and transitions the query to the
156*61046927SAndroid Build Coastguard Worker * "building" state.
157*61046927SAndroid Build Coastguard Worker *
158*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
159*61046927SAndroid Build Coastguard Worker */
160*61046927SAndroid Build Coastguard Worker
161*61046927SAndroid Build Coastguard Worker void APIENTRY
QueryBegin(D3D10DDI_HDEVICE hDevice,D3D10DDI_HQUERY hQuery)162*61046927SAndroid Build Coastguard Worker QueryBegin(D3D10DDI_HDEVICE hDevice, // IN
163*61046927SAndroid Build Coastguard Worker D3D10DDI_HQUERY hQuery) // IN
164*61046927SAndroid Build Coastguard Worker {
165*61046927SAndroid Build Coastguard Worker LOG_ENTRYPOINT();
166*61046927SAndroid Build Coastguard Worker
167*61046927SAndroid Build Coastguard Worker Device *pDevice = CastDevice(hDevice);
168*61046927SAndroid Build Coastguard Worker struct pipe_context *pipe = pDevice->pipe;
169*61046927SAndroid Build Coastguard Worker
170*61046927SAndroid Build Coastguard Worker Query *pQuery = CastQuery(hQuery);
171*61046927SAndroid Build Coastguard Worker struct pipe_query *state = CastPipeQuery(hQuery);
172*61046927SAndroid Build Coastguard Worker
173*61046927SAndroid Build Coastguard Worker if (state) {
174*61046927SAndroid Build Coastguard Worker assert(pQuery->pipe_type < PIPE_QUERY_TYPES);
175*61046927SAndroid Build Coastguard Worker pipe->begin_query(pipe, state);
176*61046927SAndroid Build Coastguard Worker }
177*61046927SAndroid Build Coastguard Worker }
178*61046927SAndroid Build Coastguard Worker
179*61046927SAndroid Build Coastguard Worker
180*61046927SAndroid Build Coastguard Worker /*
181*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
182*61046927SAndroid Build Coastguard Worker *
183*61046927SAndroid Build Coastguard Worker * QueryEnd --
184*61046927SAndroid Build Coastguard Worker *
185*61046927SAndroid Build Coastguard Worker * The QueryEnd function marks the end of a sequence of graphics
186*61046927SAndroid Build Coastguard Worker * commands for a query and transitions the query to the
187*61046927SAndroid Build Coastguard Worker * "issued" state.
188*61046927SAndroid Build Coastguard Worker *
189*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
190*61046927SAndroid Build Coastguard Worker */
191*61046927SAndroid Build Coastguard Worker
192*61046927SAndroid Build Coastguard Worker void APIENTRY
QueryEnd(D3D10DDI_HDEVICE hDevice,D3D10DDI_HQUERY hQuery)193*61046927SAndroid Build Coastguard Worker QueryEnd(D3D10DDI_HDEVICE hDevice, // IN
194*61046927SAndroid Build Coastguard Worker D3D10DDI_HQUERY hQuery) // IN
195*61046927SAndroid Build Coastguard Worker {
196*61046927SAndroid Build Coastguard Worker LOG_ENTRYPOINT();
197*61046927SAndroid Build Coastguard Worker
198*61046927SAndroid Build Coastguard Worker Device *pDevice = CastDevice(hDevice);
199*61046927SAndroid Build Coastguard Worker struct pipe_context *pipe = pDevice->pipe;
200*61046927SAndroid Build Coastguard Worker Query *pQuery = CastQuery(hQuery);
201*61046927SAndroid Build Coastguard Worker struct pipe_query *state = pQuery->handle;
202*61046927SAndroid Build Coastguard Worker
203*61046927SAndroid Build Coastguard Worker pQuery->SeqNo = ++pDevice->LastEmittedQuerySeqNo;
204*61046927SAndroid Build Coastguard Worker pQuery->GetDataCount = 0;
205*61046927SAndroid Build Coastguard Worker
206*61046927SAndroid Build Coastguard Worker if (state) {
207*61046927SAndroid Build Coastguard Worker pipe->end_query(pipe, state);
208*61046927SAndroid Build Coastguard Worker }
209*61046927SAndroid Build Coastguard Worker }
210*61046927SAndroid Build Coastguard Worker
211*61046927SAndroid Build Coastguard Worker
212*61046927SAndroid Build Coastguard Worker /*
213*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
214*61046927SAndroid Build Coastguard Worker *
215*61046927SAndroid Build Coastguard Worker * QueryGetData --
216*61046927SAndroid Build Coastguard Worker *
217*61046927SAndroid Build Coastguard Worker * The QueryGetData function polls for the state of a query operation.
218*61046927SAndroid Build Coastguard Worker *
219*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
220*61046927SAndroid Build Coastguard Worker */
221*61046927SAndroid Build Coastguard Worker
222*61046927SAndroid Build Coastguard Worker void APIENTRY
QueryGetData(D3D10DDI_HDEVICE hDevice,D3D10DDI_HQUERY hQuery,__out_bcount_full_opt (DataSize)void * pData,UINT DataSize,UINT Flags)223*61046927SAndroid Build Coastguard Worker QueryGetData(D3D10DDI_HDEVICE hDevice, // IN
224*61046927SAndroid Build Coastguard Worker D3D10DDI_HQUERY hQuery, // IN
225*61046927SAndroid Build Coastguard Worker __out_bcount_full_opt (DataSize) void *pData, // OUT
226*61046927SAndroid Build Coastguard Worker UINT DataSize, // IN
227*61046927SAndroid Build Coastguard Worker UINT Flags) // IN
228*61046927SAndroid Build Coastguard Worker {
229*61046927SAndroid Build Coastguard Worker LOG_ENTRYPOINT();
230*61046927SAndroid Build Coastguard Worker
231*61046927SAndroid Build Coastguard Worker Device *pDevice = CastDevice(hDevice);
232*61046927SAndroid Build Coastguard Worker struct pipe_context *pipe = pDevice->pipe;
233*61046927SAndroid Build Coastguard Worker Query *pQuery = CastQuery(hQuery);
234*61046927SAndroid Build Coastguard Worker struct pipe_query *state = pQuery->handle;
235*61046927SAndroid Build Coastguard Worker
236*61046927SAndroid Build Coastguard Worker /*
237*61046927SAndroid Build Coastguard Worker * Never return data for recently emitted queries immediately, to make
238*61046927SAndroid Build Coastguard Worker * wgfasync happy.
239*61046927SAndroid Build Coastguard Worker */
240*61046927SAndroid Build Coastguard Worker if (DataSize == 0 &&
241*61046927SAndroid Build Coastguard Worker (pQuery->SeqNo - pDevice->LastFinishedQuerySeqNo) > 0 &&
242*61046927SAndroid Build Coastguard Worker (pQuery->GetDataCount++) == 0) {
243*61046927SAndroid Build Coastguard Worker SetError(hDevice, DXGI_DDI_ERR_WASSTILLDRAWING);
244*61046927SAndroid Build Coastguard Worker return;
245*61046927SAndroid Build Coastguard Worker }
246*61046927SAndroid Build Coastguard Worker
247*61046927SAndroid Build Coastguard Worker bool wait = !!(Flags & D3D10_DDI_GET_DATA_DO_NOT_FLUSH);
248*61046927SAndroid Build Coastguard Worker union pipe_query_result result;
249*61046927SAndroid Build Coastguard Worker
250*61046927SAndroid Build Coastguard Worker memset(&result, 0, sizeof result);
251*61046927SAndroid Build Coastguard Worker
252*61046927SAndroid Build Coastguard Worker bool ret;
253*61046927SAndroid Build Coastguard Worker
254*61046927SAndroid Build Coastguard Worker if (state) {
255*61046927SAndroid Build Coastguard Worker ret = pipe->get_query_result(pipe, state, wait, &result);
256*61046927SAndroid Build Coastguard Worker } else {
257*61046927SAndroid Build Coastguard Worker LOG_UNSUPPORTED(true);
258*61046927SAndroid Build Coastguard Worker ret = true;
259*61046927SAndroid Build Coastguard Worker }
260*61046927SAndroid Build Coastguard Worker
261*61046927SAndroid Build Coastguard Worker if (!ret) {
262*61046927SAndroid Build Coastguard Worker SetError(hDevice, DXGI_DDI_ERR_WASSTILLDRAWING);
263*61046927SAndroid Build Coastguard Worker return;
264*61046927SAndroid Build Coastguard Worker }
265*61046927SAndroid Build Coastguard Worker
266*61046927SAndroid Build Coastguard Worker if (pData) {
267*61046927SAndroid Build Coastguard Worker switch (pQuery->Type) {
268*61046927SAndroid Build Coastguard Worker case D3D10DDI_QUERY_EVENT:
269*61046927SAndroid Build Coastguard Worker case D3D10DDI_QUERY_OCCLUSIONPREDICATE:
270*61046927SAndroid Build Coastguard Worker case D3D10DDI_QUERY_STREAMOVERFLOWPREDICATE:
271*61046927SAndroid Build Coastguard Worker *(BOOL *)pData = result.b;
272*61046927SAndroid Build Coastguard Worker break;
273*61046927SAndroid Build Coastguard Worker case D3D10DDI_QUERY_OCCLUSION:
274*61046927SAndroid Build Coastguard Worker case D3D10DDI_QUERY_TIMESTAMP:
275*61046927SAndroid Build Coastguard Worker *(UINT64 *)pData = result.u64;
276*61046927SAndroid Build Coastguard Worker break;
277*61046927SAndroid Build Coastguard Worker case D3D10DDI_QUERY_TIMESTAMPDISJOINT:
278*61046927SAndroid Build Coastguard Worker {
279*61046927SAndroid Build Coastguard Worker D3D10_DDI_QUERY_DATA_TIMESTAMP_DISJOINT *pResult =
280*61046927SAndroid Build Coastguard Worker (D3D10_DDI_QUERY_DATA_TIMESTAMP_DISJOINT *)pData;
281*61046927SAndroid Build Coastguard Worker pResult->Frequency = result.timestamp_disjoint.frequency;
282*61046927SAndroid Build Coastguard Worker pResult->Disjoint = result.timestamp_disjoint.disjoint;
283*61046927SAndroid Build Coastguard Worker }
284*61046927SAndroid Build Coastguard Worker break;
285*61046927SAndroid Build Coastguard Worker case D3D10DDI_QUERY_PIPELINESTATS:
286*61046927SAndroid Build Coastguard Worker {
287*61046927SAndroid Build Coastguard Worker D3D10_DDI_QUERY_DATA_PIPELINE_STATISTICS *pResult =
288*61046927SAndroid Build Coastguard Worker (D3D10_DDI_QUERY_DATA_PIPELINE_STATISTICS *)pData;
289*61046927SAndroid Build Coastguard Worker pResult->IAVertices = result.pipeline_statistics.ia_vertices;
290*61046927SAndroid Build Coastguard Worker pResult->IAPrimitives = result.pipeline_statistics.ia_primitives;
291*61046927SAndroid Build Coastguard Worker pResult->VSInvocations = result.pipeline_statistics.vs_invocations;
292*61046927SAndroid Build Coastguard Worker pResult->GSInvocations = result.pipeline_statistics.gs_invocations;
293*61046927SAndroid Build Coastguard Worker pResult->GSPrimitives = result.pipeline_statistics.gs_primitives;
294*61046927SAndroid Build Coastguard Worker pResult->CInvocations = result.pipeline_statistics.c_invocations;
295*61046927SAndroid Build Coastguard Worker pResult->CPrimitives = result.pipeline_statistics.c_primitives;
296*61046927SAndroid Build Coastguard Worker pResult->PSInvocations = result.pipeline_statistics.ps_invocations;
297*61046927SAndroid Build Coastguard Worker //pResult->HSInvocations = result.pipeline_statistics.hs_invocations;
298*61046927SAndroid Build Coastguard Worker //pResult->DSInvocations = result.pipeline_statistics.ds_invocations;
299*61046927SAndroid Build Coastguard Worker //pResult->CSInvocations = result.pipeline_statistics.cs_invocations;
300*61046927SAndroid Build Coastguard Worker }
301*61046927SAndroid Build Coastguard Worker break;
302*61046927SAndroid Build Coastguard Worker case D3D10DDI_QUERY_STREAMOUTPUTSTATS:
303*61046927SAndroid Build Coastguard Worker {
304*61046927SAndroid Build Coastguard Worker D3D10_DDI_QUERY_DATA_SO_STATISTICS *pResult =
305*61046927SAndroid Build Coastguard Worker (D3D10_DDI_QUERY_DATA_SO_STATISTICS *)pData;
306*61046927SAndroid Build Coastguard Worker pResult->NumPrimitivesWritten = result.so_statistics.num_primitives_written;
307*61046927SAndroid Build Coastguard Worker pResult->PrimitivesStorageNeeded = result.so_statistics.primitives_storage_needed;
308*61046927SAndroid Build Coastguard Worker }
309*61046927SAndroid Build Coastguard Worker break;
310*61046927SAndroid Build Coastguard Worker default:
311*61046927SAndroid Build Coastguard Worker assert(0);
312*61046927SAndroid Build Coastguard Worker break;
313*61046927SAndroid Build Coastguard Worker }
314*61046927SAndroid Build Coastguard Worker }
315*61046927SAndroid Build Coastguard Worker
316*61046927SAndroid Build Coastguard Worker /*
317*61046927SAndroid Build Coastguard Worker * Keep track of the last finished query, as wgfasync checks that queries
318*61046927SAndroid Build Coastguard Worker * are completed in order.
319*61046927SAndroid Build Coastguard Worker */
320*61046927SAndroid Build Coastguard Worker if ((pQuery->SeqNo - pDevice->LastFinishedQuerySeqNo) > 0) {
321*61046927SAndroid Build Coastguard Worker pDevice->LastFinishedQuerySeqNo = pQuery->SeqNo;
322*61046927SAndroid Build Coastguard Worker }
323*61046927SAndroid Build Coastguard Worker pQuery->GetDataCount = 0x80000000;
324*61046927SAndroid Build Coastguard Worker }
325*61046927SAndroid Build Coastguard Worker
326*61046927SAndroid Build Coastguard Worker
327*61046927SAndroid Build Coastguard Worker /*
328*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
329*61046927SAndroid Build Coastguard Worker *
330*61046927SAndroid Build Coastguard Worker * SetPredication --
331*61046927SAndroid Build Coastguard Worker *
332*61046927SAndroid Build Coastguard Worker * The SetPredication function specifies whether rendering and
333*61046927SAndroid Build Coastguard Worker * resource-manipulation commands that follow are actually performed.
334*61046927SAndroid Build Coastguard Worker *
335*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
336*61046927SAndroid Build Coastguard Worker */
337*61046927SAndroid Build Coastguard Worker
338*61046927SAndroid Build Coastguard Worker void APIENTRY
SetPredication(D3D10DDI_HDEVICE hDevice,D3D10DDI_HQUERY hQuery,BOOL PredicateValue)339*61046927SAndroid Build Coastguard Worker SetPredication(D3D10DDI_HDEVICE hDevice, // IN
340*61046927SAndroid Build Coastguard Worker D3D10DDI_HQUERY hQuery, // IN
341*61046927SAndroid Build Coastguard Worker BOOL PredicateValue) // IN
342*61046927SAndroid Build Coastguard Worker {
343*61046927SAndroid Build Coastguard Worker LOG_ENTRYPOINT();
344*61046927SAndroid Build Coastguard Worker
345*61046927SAndroid Build Coastguard Worker Device *pDevice = CastDevice(hDevice);
346*61046927SAndroid Build Coastguard Worker struct pipe_context *pipe = pDevice->pipe;
347*61046927SAndroid Build Coastguard Worker Query *pQuery = CastQuery(hQuery);
348*61046927SAndroid Build Coastguard Worker struct pipe_query *state = CastPipeQuery(hQuery);
349*61046927SAndroid Build Coastguard Worker enum pipe_render_cond_flag wait;
350*61046927SAndroid Build Coastguard Worker
351*61046927SAndroid Build Coastguard Worker wait = (pQuery && pQuery->Flags & D3D10DDI_QUERY_MISCFLAG_PREDICATEHINT) ?
352*61046927SAndroid Build Coastguard Worker PIPE_RENDER_COND_NO_WAIT : PIPE_RENDER_COND_WAIT;
353*61046927SAndroid Build Coastguard Worker
354*61046927SAndroid Build Coastguard Worker pipe->render_condition(pipe, state, PredicateValue, wait);
355*61046927SAndroid Build Coastguard Worker
356*61046927SAndroid Build Coastguard Worker pDevice->pPredicate = pQuery;
357*61046927SAndroid Build Coastguard Worker pDevice->PredicateValue = PredicateValue;
358*61046927SAndroid Build Coastguard Worker }
359*61046927SAndroid Build Coastguard Worker
360*61046927SAndroid Build Coastguard Worker
361*61046927SAndroid Build Coastguard Worker /*
362*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
363*61046927SAndroid Build Coastguard Worker *
364*61046927SAndroid Build Coastguard Worker * CheckPredicate --
365*61046927SAndroid Build Coastguard Worker *
366*61046927SAndroid Build Coastguard Worker * Check predicate value and whether to draw or not.
367*61046927SAndroid Build Coastguard Worker *
368*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
369*61046927SAndroid Build Coastguard Worker */
370*61046927SAndroid Build Coastguard Worker
371*61046927SAndroid Build Coastguard Worker BOOL
CheckPredicate(Device * pDevice)372*61046927SAndroid Build Coastguard Worker CheckPredicate(Device *pDevice)
373*61046927SAndroid Build Coastguard Worker {
374*61046927SAndroid Build Coastguard Worker Query *pQuery = pDevice->pPredicate;
375*61046927SAndroid Build Coastguard Worker if (!pQuery) {
376*61046927SAndroid Build Coastguard Worker return true;
377*61046927SAndroid Build Coastguard Worker }
378*61046927SAndroid Build Coastguard Worker
379*61046927SAndroid Build Coastguard Worker assert(pQuery->Type == D3D10DDI_QUERY_OCCLUSIONPREDICATE ||
380*61046927SAndroid Build Coastguard Worker pQuery->Type == D3D10DDI_QUERY_STREAMOVERFLOWPREDICATE);
381*61046927SAndroid Build Coastguard Worker
382*61046927SAndroid Build Coastguard Worker struct pipe_context *pipe = pDevice->pipe;
383*61046927SAndroid Build Coastguard Worker struct pipe_query *query = pQuery->handle;
384*61046927SAndroid Build Coastguard Worker assert(query);
385*61046927SAndroid Build Coastguard Worker
386*61046927SAndroid Build Coastguard Worker union pipe_query_result result;
387*61046927SAndroid Build Coastguard Worker memset(&result, 0, sizeof result);
388*61046927SAndroid Build Coastguard Worker
389*61046927SAndroid Build Coastguard Worker bool ret;
390*61046927SAndroid Build Coastguard Worker ret = pipe->get_query_result(pipe, query, true, &result);
391*61046927SAndroid Build Coastguard Worker assert(ret == true);
392*61046927SAndroid Build Coastguard Worker if (!ret) {
393*61046927SAndroid Build Coastguard Worker return true;
394*61046927SAndroid Build Coastguard Worker }
395*61046927SAndroid Build Coastguard Worker
396*61046927SAndroid Build Coastguard Worker if (!!result.b == !!pDevice->PredicateValue) {
397*61046927SAndroid Build Coastguard Worker return false;
398*61046927SAndroid Build Coastguard Worker }
399*61046927SAndroid Build Coastguard Worker
400*61046927SAndroid Build Coastguard Worker return true;
401*61046927SAndroid Build Coastguard Worker }
402*61046927SAndroid Build Coastguard Worker
403*61046927SAndroid Build Coastguard Worker
404*61046927SAndroid Build Coastguard Worker /*
405*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
406*61046927SAndroid Build Coastguard Worker *
407*61046927SAndroid Build Coastguard Worker * CheckCounterInfo --
408*61046927SAndroid Build Coastguard Worker *
409*61046927SAndroid Build Coastguard Worker * The CheckCounterInfo function determines global information that
410*61046927SAndroid Build Coastguard Worker * is related to manipulating counters.
411*61046927SAndroid Build Coastguard Worker *
412*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
413*61046927SAndroid Build Coastguard Worker */
414*61046927SAndroid Build Coastguard Worker
415*61046927SAndroid Build Coastguard Worker void APIENTRY
CheckCounterInfo(D3D10DDI_HDEVICE hDevice,__out D3D10DDI_COUNTER_INFO * pCounterInfo)416*61046927SAndroid Build Coastguard Worker CheckCounterInfo(D3D10DDI_HDEVICE hDevice, // IN
417*61046927SAndroid Build Coastguard Worker __out D3D10DDI_COUNTER_INFO *pCounterInfo) // OUT
418*61046927SAndroid Build Coastguard Worker {
419*61046927SAndroid Build Coastguard Worker //LOG_ENTRYPOINT();
420*61046927SAndroid Build Coastguard Worker
421*61046927SAndroid Build Coastguard Worker pCounterInfo->LastDeviceDependentCounter = (D3D10DDI_QUERY)0;
422*61046927SAndroid Build Coastguard Worker pCounterInfo->NumSimultaneousCounters = 0;
423*61046927SAndroid Build Coastguard Worker pCounterInfo->NumDetectableParallelUnits = 0;
424*61046927SAndroid Build Coastguard Worker }
425*61046927SAndroid Build Coastguard Worker
426*61046927SAndroid Build Coastguard Worker
427*61046927SAndroid Build Coastguard Worker /*
428*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
429*61046927SAndroid Build Coastguard Worker *
430*61046927SAndroid Build Coastguard Worker * CheckCounter --
431*61046927SAndroid Build Coastguard Worker *
432*61046927SAndroid Build Coastguard Worker * The CheckCounter function retrieves information that
433*61046927SAndroid Build Coastguard Worker * describes a counter.
434*61046927SAndroid Build Coastguard Worker *
435*61046927SAndroid Build Coastguard Worker * ----------------------------------------------------------------------
436*61046927SAndroid Build Coastguard Worker */
437*61046927SAndroid Build Coastguard Worker
438*61046927SAndroid Build Coastguard Worker void APIENTRY
CheckCounter(D3D10DDI_HDEVICE hDevice,D3D10DDI_QUERY Query,__out D3D10DDI_COUNTER_TYPE * pCounterType,__out UINT * pActiveCounters,__out_ecount_part_z_opt (* pNameLength,* pNameLength)LPSTR pName,__inout_opt UINT * pNameLength,__out_ecount_part_z_opt (* pUnitsLength,* pUnitsLength)LPSTR pUnits,__inout_opt UINT * pUnitsLength,__out_ecount_part_z_opt (* pDescriptionLength,* pDescriptionLength)LPSTR pDescription,__inout_opt UINT * pDescriptionLength)439*61046927SAndroid Build Coastguard Worker CheckCounter(
440*61046927SAndroid Build Coastguard Worker D3D10DDI_HDEVICE hDevice, // IN
441*61046927SAndroid Build Coastguard Worker D3D10DDI_QUERY Query, // IN
442*61046927SAndroid Build Coastguard Worker __out D3D10DDI_COUNTER_TYPE *pCounterType, // OUT
443*61046927SAndroid Build Coastguard Worker __out UINT *pActiveCounters, // OUT
444*61046927SAndroid Build Coastguard Worker __out_ecount_part_z_opt (*pNameLength, *pNameLength) LPSTR pName, // OUT
445*61046927SAndroid Build Coastguard Worker __inout_opt UINT *pNameLength, // OUT
446*61046927SAndroid Build Coastguard Worker __out_ecount_part_z_opt (*pUnitsLength, *pUnitsLength) LPSTR pUnits, // OUT
447*61046927SAndroid Build Coastguard Worker __inout_opt UINT *pUnitsLength, // OUT
448*61046927SAndroid Build Coastguard Worker __out_ecount_part_z_opt (*pDescriptionLength, *pDescriptionLength) LPSTR pDescription, // OUT
449*61046927SAndroid Build Coastguard Worker __inout_opt UINT* pDescriptionLength) // OUT
450*61046927SAndroid Build Coastguard Worker {
451*61046927SAndroid Build Coastguard Worker LOG_ENTRYPOINT();
452*61046927SAndroid Build Coastguard Worker
453*61046927SAndroid Build Coastguard Worker SetError(hDevice, DXGI_DDI_ERR_UNSUPPORTED);
454*61046927SAndroid Build Coastguard Worker }
455