ReactOS 0.4.17-dev-966-gf06eace
query.c
Go to the documentation of this file.
1/*
2 * IDirect3DQuery9 implementation
3 *
4 * Copyright 2002-2003 Raphael Junqueira
5 * Copyright 2002-2003 Jason Edmeades
6 * Copyright 2005 Oliver Stieber
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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 */
22
23#include "d3d9_private.h"
24
26
28{
29 return (D3DQUERYTYPE)type;
30}
31
33{
34 return (enum wined3d_query_type)type;
35}
36
37static inline struct d3d9_query *impl_from_IDirect3DQuery9(IDirect3DQuery9 *iface)
38{
40}
41
42static HRESULT WINAPI d3d9_query_QueryInterface(IDirect3DQuery9 *iface, REFIID riid, void **out)
43{
44 TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out);
45
46 if (IsEqualGUID(riid, &IID_IDirect3DQuery9)
48 {
50 *out = iface;
51 return S_OK;
52 }
53
54 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid));
55
56 *out = NULL;
57 return E_NOINTERFACE;
58}
59
60static ULONG WINAPI d3d9_query_AddRef(IDirect3DQuery9 *iface)
61{
64
65 TRACE("%p increasing refcount to %lu.\n", iface, refcount);
66
67 return refcount;
68}
69
70static ULONG WINAPI d3d9_query_Release(IDirect3DQuery9 *iface)
71{
74
75 TRACE("%p decreasing refcount to %lu.\n", iface, refcount);
76
77 if (!refcount)
78 {
79 wined3d_query_decref(query->wined3d_query);
80 IDirect3DDevice9Ex_Release(query->parent_device);
81 free(query);
82 }
83 return refcount;
84}
85
87{
89
90 TRACE("iface %p, device %p.\n", iface, device);
91
92 *device = (IDirect3DDevice9 *)query->parent_device;
94
95 TRACE("Returning device %p.\n", *device);
96
97 return D3D_OK;
98}
99
100static D3DQUERYTYPE WINAPI d3d9_query_GetType(IDirect3DQuery9 *iface)
101{
104
105 TRACE("iface %p.\n", iface);
106
110
111 return type;
112}
113
114static DWORD WINAPI d3d9_query_GetDataSize(IDirect3DQuery9 *iface)
115{
117
118 TRACE("iface %p.\n", iface);
119
120 return query->data_size;
121}
122
123static HRESULT WINAPI d3d9_query_Issue(IDirect3DQuery9 *iface, DWORD flags)
124{
126 TRACE("iface %p, flags %#lx.\n", iface, flags);
127 return wined3d_query_issue(query->wined3d_query, flags);
128}
129
130static HRESULT WINAPI d3d9_query_GetData(IDirect3DQuery9 *iface, void *data, DWORD size, DWORD flags)
131{
134 HRESULT hr;
135
136 TRACE("iface %p, data %p, size %lu, flags %#lx.\n", iface, data, size, flags);
137
139 type = wined3d_query_get_type(query->wined3d_query);
141 {
142 struct wined3d_query_data_timestamp_disjoint data_disjoint;
143
144 if (size > sizeof(data_disjoint.disjoint))
145 size = sizeof(data_disjoint.disjoint);
146
147 hr = wined3d_query_get_data(query->wined3d_query, &data_disjoint, sizeof(data_disjoint), flags);
148 if (SUCCEEDED(hr))
149 memcpy(data, &data_disjoint.disjoint, size);
150 }
151 else
152 {
153 hr = wined3d_query_get_data(query->wined3d_query, data, size, flags);
154 }
156
157 if (hr == D3DERR_INVALIDCALL)
158 {
159 if (data)
160 {
161 memset(data, 0, size);
162 memset(data, 0xdd, min(size, query->data_size));
163 }
164 return S_OK;
165 }
166 return hr;
167}
168
169
170static const struct IDirect3DQuery9Vtbl d3d9_query_vtbl =
171{
180};
181
183{
184 HRESULT hr;
185
187 {
188 if (type == 0x16)
189 FIXME("Undocumented query %#x created.\n", type);
190 else
191 WARN("Invalid query type %#x.\n", type);
192
193 return D3DERR_NOTAVAILABLE;
194 }
195
196 query->IDirect3DQuery9_iface.lpVtbl = &d3d9_query_vtbl;
197 query->refcount = 1;
198
201 query, &d3d9_null_wined3d_parent_ops, &query->wined3d_query)))
202 {
204 WARN("Failed to create wined3d query, hr %#lx.\n", hr);
205 return hr;
206 }
207
209 query->data_size = sizeof(DWORD);
211 query->data_size = sizeof(BOOL);
212 else
213 query->data_size = wined3d_query_get_data_size(query->wined3d_query);
215
216 query->parent_device = &device->IDirect3DDevice9Ex_iface;
217 IDirect3DDevice9Ex_AddRef(query->parent_device);
218
219 return D3D_OK;
220}
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
const GUID IID_IUnknown
#define D3DERR_INVALIDCALL
Definition: d3d10_private.h:42
#define IDirect3DDevice9Ex_Release(p)
Definition: d3d9.h:1930
#define IDirect3DDevice9Ex_AddRef(p)
Definition: d3d9.h:1929
#define IDirect3DQuery9_AddRef(p)
Definition: d3d9.h:1170
#define IDirect3DDevice9_AddRef(p)
Definition: d3d9.h:1335
enum _D3DQUERYTYPE D3DQUERYTYPE
@ D3DQUERYTYPE_OCCLUSION
Definition: d3d9types.h:309
@ D3DQUERYTYPE_TIMESTAMPDISJOINT
Definition: d3d9types.h:311
@ D3DQUERYTYPE_MEMORYPRESSURE
Definition: d3d9types.h:320
#define D3D_OK
Definition: d3d.h:106
#define free
Definition: debug_ros.c:5
HRESULT hr
Definition: delayimp.cpp:582
#define NULL
Definition: types.h:112
HRESULT query_init(struct d3d9_query *query, struct d3d9_device *device, D3DQUERYTYPE type)
Definition: query.c:182
static HRESULT WINAPI d3d9_query_QueryInterface(IDirect3DQuery9 *iface, REFIID riid, void **out)
Definition: query.c:42
static struct d3d9_query * impl_from_IDirect3DQuery9(IDirect3DQuery9 *iface)
Definition: query.c:37
static DWORD WINAPI d3d9_query_GetDataSize(IDirect3DQuery9 *iface)
Definition: query.c:114
static ULONG WINAPI d3d9_query_AddRef(IDirect3DQuery9 *iface)
Definition: query.c:60
static HRESULT WINAPI d3d9_query_Issue(IDirect3DQuery9 *iface, DWORD flags)
Definition: query.c:123
static D3DQUERYTYPE d3dquerytype_from_wined3d(enum wined3d_query_type type)
Definition: query.c:27
static D3DQUERYTYPE WINAPI d3d9_query_GetType(IDirect3DQuery9 *iface)
Definition: query.c:100
static HRESULT WINAPI d3d9_query_GetDevice(IDirect3DQuery9 *iface, IDirect3DDevice9 **device)
Definition: query.c:86
static HRESULT WINAPI d3d9_query_GetData(IDirect3DQuery9 *iface, void *data, DWORD size, DWORD flags)
Definition: query.c:130
static enum wined3d_query_type wined3d_query_type_from_d3d(D3DQUERYTYPE type)
Definition: query.c:32
static ULONG WINAPI d3d9_query_Release(IDirect3DQuery9 *iface)
Definition: query.c:70
static const struct IDirect3DQuery9Vtbl d3d9_query_vtbl
Definition: query.c:170
enum wined3d_query_type CDECL wined3d_query_get_type(const struct wined3d_query *query)
Definition: query.c:577
HRESULT CDECL wined3d_query_get_data(struct wined3d_query *query, void *data, UINT data_size, uint32_t flags)
Definition: query.c:452
HRESULT CDECL wined3d_query_issue(struct wined3d_query *query, uint32_t flags)
Definition: query.c:498
HRESULT CDECL wined3d_query_create(struct wined3d_device *device, enum wined3d_query_type type, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_query **query)
Definition: query.c:1988
UINT CDECL wined3d_query_get_data_size(const struct wined3d_query *query)
Definition: query.c:491
ULONG CDECL wined3d_query_decref(struct wined3d_query *query)
Definition: query.c:432
DWORD IDirect3DDevice9
Definition: dxva2api.idl:22
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLsizeiptr size
Definition: glext.h:5919
GLbitfield flags
Definition: glext.h:7161
REFIID riid
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
#define debugstr_guid
Definition: kernel32.h:35
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define min(a, b)
Definition: monoChain.cc:55
#define BOOL
Definition: nt_native.h:43
#define DWORD
Definition: nt_native.h:44
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define REFIID
Definition: guiddef.h:118
#define D3DERR_NOTAVAILABLE
Definition: d3d8.h:80
#define memset(x, y, z)
Definition: compat.h:39
#define TRACE(s)
Definition: solgame.cpp:4
IDirect3DQuery9 IDirect3DQuery9_iface
Definition: d3d9_private.h:301
Definition: devices.h:37
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383
#define WINAPI
Definition: msvc.h:6
const struct wined3d_parent_ops d3d9_null_wined3d_parent_ops
Definition: device.c:29
wined3d_query_type
Definition: wined3d.h:725
@ WINED3D_QUERY_TYPE_TIMESTAMP_DISJOINT
Definition: wined3d.h:732
void WINAPI wined3d_mutex_unlock(void)
Definition: wined3d_main.c:544
void WINAPI wined3d_mutex_lock(void)
Definition: wined3d_main.c:539
#define E_NOINTERFACE
Definition: winerror.h:3479