wined3d: QueryInterface corrections.
[wine] / dlls / wined3d / query.c
1 /*
2  * IWineD3DQuery implementation
3  *
4  * Copyright 2005 Oliver Stieber
5  *
6  *
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with this library; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
21  */
22
23
24 #include "config.h"
25 #include "wined3d_private.h"
26
27 /*
28 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/directx9_c/directx/graphics/programmingguide/advancedtopics/Queries.asp
29 */
30
31 WINE_DEFAULT_DEBUG_CHANNEL(d3d);
32
33 /* *******************************************
34    IWineD3DQuery IUnknown parts follow
35    ******************************************* */
36 HRESULT WINAPI IWineD3DQueryImpl_QueryInterface(IWineD3DQuery *iface, REFIID riid, LPVOID *ppobj)
37 {
38     IWineD3DQueryImpl *This = (IWineD3DQueryImpl *)iface;
39     TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(riid),ppobj);
40     if (IsEqualGUID(riid, &IID_IUnknown)
41         || IsEqualGUID(riid, &IID_IWineD3DBase)
42         || IsEqualGUID(riid, &IID_IWineD3DQuery)) {
43         IUnknown_AddRef(iface);
44         *ppobj = This;
45         return S_OK;
46     }
47     *ppobj = NULL;
48     return E_NOINTERFACE;
49 }
50
51 ULONG WINAPI IWineD3DQueryImpl_AddRef(IWineD3DQuery *iface) {
52     IWineD3DQueryImpl *This = (IWineD3DQueryImpl *)iface;
53     TRACE("(%p) : AddRef increasing from %ld\n", This, This->ref);
54     return InterlockedIncrement(&This->ref);
55 }
56
57 ULONG WINAPI IWineD3DQueryImpl_Release(IWineD3DQuery *iface) {
58     IWineD3DQueryImpl *This = (IWineD3DQueryImpl *)iface;
59     ULONG ref;
60     TRACE("(%p) : Releasing from %ld\n", This, This->ref);
61     ref = InterlockedDecrement(&This->ref);
62     if (ref == 0) {
63         if(This->extendedData != NULL){
64             HeapFree(GetProcessHeap(), 0, This->extendedData);
65         }
66         HeapFree(GetProcessHeap(), 0, This);
67     }
68     return ref;
69 }
70
71 /* *******************************************
72    IWineD3DQuery IWineD3DQuery parts follow
73    ******************************************* */
74 HRESULT WINAPI IWineD3DQueryImpl_GetParent(IWineD3DQuery *iface, IUnknown** parent){
75     IWineD3DQueryImpl *This = (IWineD3DQueryImpl *)iface;
76
77     *parent= (IUnknown*) parent;
78     IUnknown_AddRef(*parent);
79     TRACE("(%p) : returning %p\n", This, *parent);
80     return WINED3D_OK;
81 }
82
83 HRESULT WINAPI IWineD3DQueryImpl_GetDevice(IWineD3DQuery* iface, IWineD3DDevice **pDevice){
84     IWineD3DQueryImpl *This = (IWineD3DQueryImpl *)iface;
85     IWineD3DDevice_AddRef((IWineD3DDevice *)This->wineD3DDevice);
86     *pDevice = (IWineD3DDevice *)This->wineD3DDevice;
87     TRACE("(%p) returning %p\n", This, *pDevice);
88     return WINED3D_OK;
89 }
90
91
92 HRESULT WINAPI IWineD3DQueryImpl_GetData(IWineD3DQuery* iface, void* pData, DWORD dwSize, DWORD dwGetDataFlags){
93     IWineD3DQueryImpl *This = (IWineD3DQueryImpl *)iface;
94     if(dwSize == 0){
95         /*you can use this method to poll the resource for the query status*/
96         /*We return success(S_OK) if we support a feature, and faikure(S_FALSE) if we don't, just return success and fluff it for now*/
97         return S_OK;
98     }else{
99     }
100
101     switch (This->type){
102
103     case WINED3DQUERYTYPE_VCACHE:
104     {
105
106         WINED3DDEVINFO_VCACHE *data = (WINED3DDEVINFO_VCACHE *)pData;
107         data->Pattern     = MAKEFOURCC('C','A','C','H');
108         data->OptMethod   = 0; /*0 get longest strips, 1 optimize vertex cache*/
109         data->CacheSize   = 0; /*cache size, only required if OptMethod == 1*/
110         data->MagicNumber = 0; /*only required if OptMethod == 1 (used internally)*/
111
112     }
113     break;
114     case WINED3DQUERYTYPE_RESOURCEMANAGER:
115     {
116         WINED3DDEVINFO_RESOURCEMANAGER *data = (WINED3DDEVINFO_RESOURCEMANAGER *)pData;
117         int i;
118         for(i = 0; i < WINED3DRTYPECOUNT; i++){
119             /*I'm setting the default values to 1 so as to reduce the risk of a div/0 in the caller*/
120             /*  isTextureResident could be used to get some of this infomration  */
121             data->stats[i].bThrashing            = FALSE;
122             data->stats[i].ApproxBytesDownloaded = 1;
123             data->stats[i].NumEvicts             = 1;
124             data->stats[i].NumVidCreates         = 1;
125             data->stats[i].LastPri               = 1;
126             data->stats[i].NumUsed               = 1;
127             data->stats[i].NumUsedInVidMem       = 1;
128             data->stats[i].WorkingSet            = 1;
129             data->stats[i].WorkingSetBytes       = 1;
130             data->stats[i].TotalManaged          = 1;
131             data->stats[i].TotalBytes            = 1;
132         }
133
134     }
135     break;
136     case WINED3DQUERYTYPE_VERTEXSTATS:
137     {
138         WINED3DDEVINFO_VERTEXSTATS *data = (WINED3DDEVINFO_VERTEXSTATS *)pData;
139         data->NumRenderedTriangles      = 1;
140         data->NumExtraClippingTriangles = 1;
141
142     }
143     break;
144     case WINED3DQUERYTYPE_EVENT:
145     {
146         BOOL* data = pData;
147         *data = TRUE; /*Don't know what this is supposed to be*/
148     }
149     break;
150     case WINED3DQUERYTYPE_OCCLUSION:
151     {
152         DWORD* data = pData;
153         *data = 1;
154         /* TODO: opengl occlusion queries
155         http://www.gris.uni-tuebingen.de/~bartz/Publications/paper/hww98.pdf
156         http://oss.sgi.com/projects/ogl-sample/registry/ARB/occlusion_query.txt
157         http://oss.sgi.com/projects/ogl-sample/registry/ARB/occlusion_query.txt
158         */
159     }
160     break;
161     case WINED3DQUERYTYPE_TIMESTAMP:
162     {
163         UINT64* data = pData;
164         *data = 1; /*Don't know what this is supposed to be*/
165     }
166     break;
167     case WINED3DQUERYTYPE_TIMESTAMPDISJOINT:
168     {
169         BOOL* data = pData;
170         *data = FALSE; /*Don't know what this is supposed to be*/
171     }
172     break;
173     case WINED3DQUERYTYPE_TIMESTAMPFREQ:
174     {
175         UINT64* data = pData;
176         *data = 1; /*Don't know what this is supposed to be*/
177     }
178     break;
179     case WINED3DQUERYTYPE_PIPELINETIMINGS:
180     {
181         WINED3DDEVINFO_PIPELINETIMINGS *data = (WINED3DDEVINFO_PIPELINETIMINGS *)pData;
182
183         data->VertexProcessingTimePercent    =   1.0f;
184         data->PixelProcessingTimePercent     =   1.0f;
185         data->OtherGPUProcessingTimePercent  =  97.0f;
186         data->GPUIdleTimePercent             =   1.0f;
187     }
188     break;
189     case WINED3DQUERYTYPE_INTERFACETIMINGS:
190     {
191         WINED3DDEVINFO_INTERFACETIMINGS *data = (WINED3DDEVINFO_INTERFACETIMINGS *)pData;
192
193         data->WaitingForGPUToUseApplicationResourceTimePercent =   1.0f;
194         data->WaitingForGPUToAcceptMoreCommandsTimePercent     =   1.0f;
195         data->WaitingForGPUToStayWithinLatencyTimePercent      =   1.0f;
196         data->WaitingForGPUExclusiveResourceTimePercent        =   1.0f;
197         data->WaitingForGPUOtherTimePercent                    =  96.0f;
198     }
199
200     break;
201     case WINED3DQUERYTYPE_VERTEXTIMINGS:
202     {
203         WINED3DDEVINFO_STAGETIMINGS *data = (WINED3DDEVINFO_STAGETIMINGS *)pData;
204         data->MemoryProcessingPercent      = 50.0f;
205         data->ComputationProcessingPercent = 50.0f;
206
207     }
208     break;
209     case WINED3DQUERYTYPE_PIXELTIMINGS:
210     {
211         WINED3DDEVINFO_STAGETIMINGS *data = (WINED3DDEVINFO_STAGETIMINGS *)pData;
212         data->MemoryProcessingPercent      = 50.0f;
213         data->ComputationProcessingPercent = 50.0f;
214     }
215     break;
216     case WINED3DQUERYTYPE_BANDWIDTHTIMINGS:
217     {
218         WINED3DDEVINFO_BANDWIDTHTIMINGS *data = (WINED3DDEVINFO_BANDWIDTHTIMINGS *)pData;
219         data->MaxBandwidthUtilized                =  1.0f;
220         data->FrontEndUploadMemoryUtilizedPercent =  1.0f;
221         data->VertexRateUtilizedPercent           =  1.0f;
222         data->TriangleSetupRateUtilizedPercent    =  1.0f;
223         data->FillRateUtilizedPercent             = 97.0f;
224     }
225     break;
226     case WINED3DQUERYTYPE_CACHEUTILIZATION:
227     {
228         WINED3DDEVINFO_CACHEUTILIZATION *data = (WINED3DDEVINFO_CACHEUTILIZATION *)pData;
229
230         data->TextureCacheHitRate             = 1.0f;
231         data->PostTransformVertexCacheHitRate = 1.0f;
232     }
233
234
235     break;
236     default:
237         FIXME("(%p) Unhandled query type %d\n",This , This->type);
238
239     };
240
241     /*dwGetDataFlags = 0 || D3DGETDATA_FLUSH
242     D3DGETDATA_FLUSH may return WINED3DERR_DEVICELOST if the device is lost
243     */
244     FIXME("(%p) : stub\n", This);
245     return S_OK; /* S_OK if the query data is available*/
246 }
247
248
249 DWORD WINAPI IWineD3DQueryImpl_GetDataSize(IWineD3DQuery* iface){
250     IWineD3DQueryImpl *This = (IWineD3DQueryImpl *)iface;
251     int dataSize = 0;
252     FIXME("(%p) : stub\n", This);
253     switch(This->type){
254     case WINED3DQUERYTYPE_VCACHE:
255         dataSize = sizeof(WINED3DDEVINFO_VCACHE);
256         break;
257     case WINED3DQUERYTYPE_RESOURCEMANAGER:
258         dataSize = sizeof(WINED3DDEVINFO_RESOURCEMANAGER);
259         break;
260     case WINED3DQUERYTYPE_VERTEXSTATS:
261         dataSize = sizeof(WINED3DDEVINFO_VERTEXSTATS);
262         break;
263     case WINED3DQUERYTYPE_EVENT:
264         dataSize = sizeof(BOOL);
265         break;
266     case WINED3DQUERYTYPE_OCCLUSION:
267         dataSize = sizeof(DWORD);
268         /*
269         http://www.gris.uni-tuebingen.de/~bartz/Publications/paper/hww98.pdf
270         http://oss.sgi.com/projects/ogl-sample/registry/ARB/occlusion_query.txt
271         http://oss.sgi.com/projects/ogl-sample/registry/ARB/occlusion_query.txt
272         */
273         break;
274     case WINED3DQUERYTYPE_TIMESTAMP:
275         dataSize = sizeof(UINT64);
276         break;
277     case WINED3DQUERYTYPE_TIMESTAMPDISJOINT:
278         dataSize = sizeof(BOOL);
279         break;
280     case WINED3DQUERYTYPE_TIMESTAMPFREQ:
281         dataSize = sizeof(UINT64);
282         break;
283     case WINED3DQUERYTYPE_PIPELINETIMINGS:
284         dataSize = sizeof(WINED3DDEVINFO_PIPELINETIMINGS);
285         break;
286     case WINED3DQUERYTYPE_INTERFACETIMINGS:
287         dataSize = sizeof(WINED3DDEVINFO_INTERFACETIMINGS);
288         break;
289     case WINED3DQUERYTYPE_VERTEXTIMINGS:
290         dataSize = sizeof(WINED3DDEVINFO_STAGETIMINGS);
291         break;
292     case WINED3DQUERYTYPE_PIXELTIMINGS:
293         dataSize = sizeof(WINED3DDEVINFO_STAGETIMINGS);
294         break;
295     case WINED3DQUERYTYPE_BANDWIDTHTIMINGS:
296         dataSize = sizeof(WINED3DQUERYTYPE_BANDWIDTHTIMINGS);
297         break;
298     case WINED3DQUERYTYPE_CACHEUTILIZATION:
299         dataSize = sizeof(WINED3DDEVINFO_CACHEUTILIZATION);
300         break;
301     default:
302        FIXME("(%p) Unhandled query type %d\n",This , This->type);
303        dataSize = 0;
304     }
305     return dataSize;
306 }
307
308
309 WINED3DQUERYTYPE WINAPI IWineD3DQueryImpl_GetType(IWineD3DQuery* iface){
310     IWineD3DQueryImpl *This = (IWineD3DQueryImpl *)iface;
311     return This->type;
312 }
313
314
315 HRESULT WINAPI IWineD3DQueryImpl_Issue(IWineD3DQuery* iface,  DWORD dwIssueFlags){
316     IWineD3DQueryImpl *This = (IWineD3DQueryImpl *)iface;
317     FIXME("(%p) : stub\n", This);
318     return WINED3D_OK; /* can be WINED3DERR_INVALIDCALL.    */
319 }
320
321
322 /**********************************************************
323  * IWineD3DQuery VTbl follows
324  **********************************************************/
325
326 const IWineD3DQueryVtbl IWineD3DQuery_Vtbl =
327 {
328     /*** IUnknown methods ***/
329     IWineD3DQueryImpl_QueryInterface,
330     IWineD3DQueryImpl_AddRef,
331     IWineD3DQueryImpl_Release,
332      /*** IWineD3Dquery methods ***/
333     IWineD3DQueryImpl_GetParent,
334     IWineD3DQueryImpl_GetDevice,
335     IWineD3DQueryImpl_GetData,
336     IWineD3DQueryImpl_GetDataSize,
337     IWineD3DQueryImpl_GetType,
338     IWineD3DQueryImpl_Issue
339 };