ReactOS 0.4.17-dev-923-g4c9a150
resource.c
Go to the documentation of this file.
1/*
2 * Copyright 2009 Henri Verbeet for CodeWeavers
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17 *
18 */
19
20#include "dxgi_private.h"
21
23
24/* Inner IUnknown methods */
25
26static inline struct dxgi_resource *impl_from_IUnknown(IUnknown *iface)
27{
28 return CONTAINING_RECORD(iface, struct dxgi_resource, IUnknown_iface);
29}
30
32{
34
35 TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out);
36
37 if ((IsEqualGUID(riid, &IID_IDXGISurface1)
38 || IsEqualGUID(riid, &IID_IDXGISurface)) && resource->IDXGISurface1_iface.lpVtbl != NULL)
39 {
40 IDXGISurface1_AddRef(&resource->IDXGISurface1_iface);
41 *out = &resource->IDXGISurface1_iface;
42 return S_OK;
43 }
44 else if (IsEqualGUID(riid, &IID_IDXGIResource)
45 || IsEqualGUID(riid, &IID_IDXGIDeviceSubObject)
46 || IsEqualGUID(riid, &IID_IDXGIObject)
48 {
49 IDXGIResource_AddRef(&resource->IDXGIResource_iface);
50 *out = &resource->IDXGIResource_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
61{
64
65 TRACE("%p increasing refcount to %lu.\n", resource, refcount);
66
67 return refcount;
68}
69
71{
74
75 TRACE("%p decreasing refcount to %lu.\n", resource, refcount);
76
77 if (!refcount)
78 {
81 }
82
83 return refcount;
84}
85
87{
89}
90
91/* IUnknown methods */
92
94 void **object)
95{
97 return IDXGIResource_QueryInterface(&resource->IDXGIResource_iface, riid, object);
98}
99
101{
103 return IDXGIResource_AddRef(&resource->IDXGIResource_iface);
104}
105
107{
109 return IDXGIResource_Release(&resource->IDXGIResource_iface);
110}
111
112/* IDXGIObject methods */
113
115 REFGUID guid, UINT data_size, const void *data)
116{
118 return IDXGIResource_SetPrivateData(&resource->IDXGIResource_iface, guid, data_size, data);
119}
120
122 REFGUID guid, const IUnknown *object)
123{
125 return IDXGIResource_SetPrivateDataInterface(&resource->IDXGIResource_iface, guid, object);
126}
127
129 REFGUID guid, UINT *data_size, void *data)
130{
132 return IDXGIResource_GetPrivateData(&resource->IDXGIResource_iface, guid, data_size, data);
133}
134
136{
138 return IDXGIResource_GetParent(&resource->IDXGIResource_iface, riid, parent);
139}
140
141/* IDXGIDeviceSubObject methods */
142
144{
146 return IDXGIResource_GetDevice(&resource->IDXGIResource_iface, riid, device);
147}
148
149/* IDXGISurface methods */
151{
153 struct wined3d_resource_desc wined3d_desc;
154
155 TRACE("iface %p, desc %p.\n", iface, desc);
156
158 wined3d_resource_get_desc(resource->wined3d_resource, &wined3d_desc);
160 desc->Width = wined3d_desc.width;
161 desc->Height = wined3d_desc.height;
162 desc->Format = dxgi_format_from_wined3dformat(wined3d_desc.format);
163 dxgi_sample_desc_from_wined3d(&desc->SampleDesc, wined3d_desc.multisample_type, wined3d_desc.multisample_quality);
164
165 return S_OK;
166}
167
169{
172 DWORD wined3d_map_flags = 0;
173 HRESULT hr;
174
175 TRACE("iface %p, mapped_rect %p, flags %#x.\n", iface, mapped_rect, flags);
176
177 if (flags & DXGI_MAP_READ)
178 wined3d_map_flags |= WINED3D_MAP_READ;
179 if (flags & DXGI_MAP_WRITE)
180 wined3d_map_flags |= WINED3D_MAP_WRITE;
182 wined3d_map_flags |= WINED3D_MAP_DISCARD;
183
184 if (SUCCEEDED(hr = wined3d_resource_map(resource->wined3d_resource, 0, &wined3d_map_desc, NULL, wined3d_map_flags)))
185 {
186 mapped_rect->Pitch = wined3d_map_desc.row_pitch;
187 mapped_rect->pBits = wined3d_map_desc.data;
188 }
189
190 return hr;
191}
192
194{
196
197 TRACE("iface %p.\n", iface);
198 wined3d_resource_unmap(resource->wined3d_resource, 0);
199 return S_OK;
200}
201
202/* IDXGISurface1 methods */
204{
206 HRESULT hr;
207
208 FIXME("iface %p, discard %d, hdc %p semi-stub!\n", iface, discard, hdc);
209
210 if (!hdc)
211 return E_INVALIDARG;
212
216
217 if (SUCCEEDED(hr))
218 resource->dc = *hdc;
219
220 return hr;
221}
222
224{
226 HRESULT hr;
227
228 TRACE("iface %p, rect %s\n", iface, wine_dbgstr_rect(dirty_rect));
229
230 if (!IsRectEmpty(dirty_rect))
231 FIXME("dirty rectangle is ignored.\n");
232
236
237 return hr;
238}
239
240static const struct IDXGISurface1Vtbl dxgi_surface_vtbl =
241{
242 /* IUnknown methods */
246 /* IDXGIObject methods */
251 /* IDXGIDeviceSubObject methods */
253 /* IDXGISurface methods */
257 /* IDXGISurface1 methods */
260};
261
263{
265}
266
267/* IUnknown methods */
268
270 void **object)
271{
273 TRACE("Forwarding to outer IUnknown\n");
274 return IUnknown_QueryInterface(resource->outer_unknown, riid, object);
275}
276
278{
280 TRACE("Forwarding to outer IUnknown\n");
281 return IUnknown_AddRef(resource->outer_unknown);
282}
283
285{
287 TRACE("Forwarding to outer IUnknown\n");
288 return IUnknown_Release(resource->outer_unknown);
289}
290
291/* IDXGIObject methods */
292
294 REFGUID guid, UINT data_size, const void *data)
295{
297
298 TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface, debugstr_guid(guid), data_size, data);
299
300 return dxgi_set_private_data(&resource->private_store, guid, data_size, data);
301}
302
304 REFGUID guid, const IUnknown *object)
305{
307
308 TRACE("iface %p, guid %s, object %p.\n", iface, debugstr_guid(guid), object);
309
310 return dxgi_set_private_data_interface(&resource->private_store, guid, object);
311}
312
314 REFGUID guid, UINT *data_size, void *data)
315{
317
318 TRACE("iface %p, guid %s, data_size %p, data %p.\n", iface, debugstr_guid(guid), data_size, data);
319
320 return dxgi_get_private_data(&resource->private_store, guid, data_size, data);
321}
322
324{
326
327 TRACE("iface %p, riid %s, parent %p.\n", iface, debugstr_guid(riid), parent);
328
329 return IDXGIDevice_QueryInterface(resource->device, riid, parent);
330}
331
332/* IDXGIDeviceSubObject methods */
333
335{
337
338 TRACE("iface %p, riid %s, device %p.\n", iface, debugstr_guid(riid), device);
339
340 return IDXGIDevice_QueryInterface(resource->device, riid, device);
341}
342
343/* IDXGIResource methods */
345{
346 FIXME("iface %p, shared_handle %p stub!\n", iface, shared_handle);
347
348 return E_NOTIMPL;
349}
350
352{
354 struct wined3d_resource_desc resource_desc;
355
356 TRACE("iface %p, usage %p.\n", iface, usage);
357
358 wined3d_resource_get_desc(resource->wined3d_resource, &resource_desc);
359
361
362 if (resource_desc.resource_type != WINED3D_RTYPE_BUFFER)
363 {
365 struct wined3d_swapchain_desc swapchain_desc;
366 struct wined3d_swapchain *swapchain;
367
368 if ((swapchain = wined3d_texture_get_swapchain(texture)))
369 {
371
372 wined3d_swapchain_get_desc(swapchain, &swapchain_desc);
373 if (swapchain_desc.swap_effect == WINED3D_SWAP_EFFECT_DISCARD)
375
376 if (wined3d_swapchain_get_back_buffer(swapchain, 0) != texture)
378 }
379 }
380
381 return S_OK;
382}
383
385{
386 FIXME("iface %p, eviction_priority %u stub!\n", iface, eviction_priority);
387
388 return E_NOTIMPL;
389}
390
392{
393 FIXME("iface %p, eviction_priority %p stub!\n", iface, eviction_priority);
394
395 return E_NOTIMPL;
396}
397
398static const struct IDXGIResourceVtbl dxgi_resource_vtbl =
399{
400 /* IUnknown methods */
404 /* IDXGIObject methods */
409 /* IDXGIDeviceSubObject methods */
411 /* IDXGIResource methods */
416};
417
418static const struct IUnknownVtbl dxgi_resource_inner_unknown_vtbl =
419{
420 /* IUnknown methods */
424};
425
427 IUnknown *outer, BOOL needs_surface, struct wined3d_resource *wined3d_resource)
428{
430
432 if ((desc.resource_type == WINED3D_RTYPE_TEXTURE_1D || desc.resource_type == WINED3D_RTYPE_TEXTURE_2D)
433 && needs_surface)
434 {
435 resource->IDXGISurface1_iface.lpVtbl = &dxgi_surface_vtbl;
436 }
437 else
438 resource->IDXGISurface1_iface.lpVtbl = NULL;
439 resource->IDXGIResource_iface.lpVtbl = &dxgi_resource_vtbl;
440 resource->IUnknown_iface.lpVtbl = &dxgi_resource_inner_unknown_vtbl;
441 resource->refcount = 1;
442 wined3d_private_store_init(&resource->private_store);
443 resource->outer_unknown = outer ? outer : &resource->IUnknown_iface;
444 resource->device = device;
445 resource->wined3d_resource = wined3d_resource;
446 resource->dc = NULL;
447
448 return S_OK;
449}
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
static const char * wine_dbgstr_rect(const RECT *prc)
Definition: atltest.h:160
#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 STDMETHODCALLTYPE
Definition: bdasup.h:9
DXGI_FORMAT dxgi_format_from_wined3dformat(enum wined3d_format_id format)
Definition: utils.c:210
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define free
Definition: debug_ros.c:5
HRESULT hr
Definition: delayimp.cpp:582
#define NULL
Definition: types.h:112
static HRESULT STDMETHODCALLTYPE dxgi_surface_GetDesc(IDXGISurface1 *iface, DXGI_SURFACE_DESC *desc)
Definition: resource.c:150
static HRESULT STDMETHODCALLTYPE dxgi_surface_SetPrivateData(IDXGISurface1 *iface, REFGUID guid, UINT data_size, const void *data)
Definition: resource.c:114
static HRESULT STDMETHODCALLTYPE dxgi_resource_SetPrivateDataInterface(IDXGIResource *iface, REFGUID guid, const IUnknown *object)
Definition: resource.c:303
static const struct IDXGISurface1Vtbl dxgi_surface_vtbl
Definition: resource.c:240
static ULONG STDMETHODCALLTYPE dxgi_resource_inner_Release(IUnknown *iface)
Definition: resource.c:70
static struct dxgi_resource * impl_from_IDXGISurface1(IDXGISurface1 *iface)
Definition: resource.c:86
static struct dxgi_resource * impl_from_IDXGIResource(IDXGIResource *iface)
Definition: resource.c:262
static ULONG STDMETHODCALLTYPE dxgi_resource_inner_AddRef(IUnknown *iface)
Definition: resource.c:60
static HRESULT STDMETHODCALLTYPE dxgi_surface_Map(IDXGISurface1 *iface, DXGI_MAPPED_RECT *mapped_rect, UINT flags)
Definition: resource.c:168
static HRESULT STDMETHODCALLTYPE dxgi_resource_SetEvictionPriority(IDXGIResource *iface, UINT eviction_priority)
Definition: resource.c:384
static ULONG STDMETHODCALLTYPE dxgi_surface_AddRef(IDXGISurface1 *iface)
Definition: resource.c:100
static HRESULT STDMETHODCALLTYPE dxgi_surface_GetParent(IDXGISurface1 *iface, REFIID riid, void **parent)
Definition: resource.c:135
static HRESULT STDMETHODCALLTYPE dxgi_resource_inner_QueryInterface(IUnknown *iface, REFIID riid, void **out)
Definition: resource.c:31
static HRESULT STDMETHODCALLTYPE dxgi_resource_GetUsage(IDXGIResource *iface, DXGI_USAGE *usage)
Definition: resource.c:351
static ULONG STDMETHODCALLTYPE dxgi_surface_Release(IDXGISurface1 *iface)
Definition: resource.c:106
static HRESULT STDMETHODCALLTYPE dxgi_surface_SetPrivateDataInterface(IDXGISurface1 *iface, REFGUID guid, const IUnknown *object)
Definition: resource.c:121
static HRESULT STDMETHODCALLTYPE dxgi_resource_QueryInterface(IDXGIResource *iface, REFIID riid, void **object)
Definition: resource.c:269
static const struct IUnknownVtbl dxgi_resource_inner_unknown_vtbl
Definition: resource.c:418
static ULONG STDMETHODCALLTYPE dxgi_resource_Release(IDXGIResource *iface)
Definition: resource.c:284
static HRESULT STDMETHODCALLTYPE dxgi_resource_GetParent(IDXGIResource *iface, REFIID riid, void **parent)
Definition: resource.c:323
static HRESULT STDMETHODCALLTYPE dxgi_surface_GetDevice(IDXGISurface1 *iface, REFIID riid, void **device)
Definition: resource.c:143
static ULONG STDMETHODCALLTYPE dxgi_resource_AddRef(IDXGIResource *iface)
Definition: resource.c:277
static HRESULT STDMETHODCALLTYPE dxgi_surface_ReleaseDC(IDXGISurface1 *iface, RECT *dirty_rect)
Definition: resource.c:223
static HRESULT STDMETHODCALLTYPE dxgi_resource_GetDevice(IDXGIResource *iface, REFIID riid, void **device)
Definition: resource.c:334
static HRESULT STDMETHODCALLTYPE dxgi_resource_GetPrivateData(IDXGIResource *iface, REFGUID guid, UINT *data_size, void *data)
Definition: resource.c:313
static HRESULT STDMETHODCALLTYPE dxgi_surface_QueryInterface(IDXGISurface1 *iface, REFIID riid, void **object)
Definition: resource.c:93
static struct dxgi_resource * impl_from_IUnknown(IUnknown *iface)
Definition: resource.c:26
HRESULT dxgi_resource_init(struct dxgi_resource *resource, IDXGIDevice *device, IUnknown *outer, BOOL needs_surface, struct wined3d_resource *wined3d_resource)
Definition: resource.c:426
static HRESULT STDMETHODCALLTYPE dxgi_resource_GetSharedHandle(IDXGIResource *iface, HANDLE *shared_handle)
Definition: resource.c:344
static HRESULT STDMETHODCALLTYPE dxgi_resource_SetPrivateData(IDXGIResource *iface, REFGUID guid, UINT data_size, const void *data)
Definition: resource.c:293
static HRESULT STDMETHODCALLTYPE dxgi_surface_GetDC(IDXGISurface1 *iface, BOOL discard, HDC *hdc)
Definition: resource.c:203
static HRESULT STDMETHODCALLTYPE dxgi_resource_GetEvictionPriority(IDXGIResource *iface, UINT *eviction_priority)
Definition: resource.c:391
static HRESULT STDMETHODCALLTYPE dxgi_surface_Unmap(IDXGISurface1 *iface)
Definition: resource.c:193
static HRESULT STDMETHODCALLTYPE dxgi_surface_GetPrivateData(IDXGISurface1 *iface, REFGUID guid, UINT *data_size, void *data)
Definition: resource.c:128
static const struct IDXGIResourceVtbl dxgi_resource_vtbl
Definition: resource.c:398
HRESULT CDECL wined3d_resource_unmap(struct wined3d_resource *resource, unsigned int sub_resource_idx)
Definition: resource.c:304
void CDECL wined3d_resource_get_desc(const struct wined3d_resource *resource, struct wined3d_resource_desc *desc)
Definition: resource.c:280
HRESULT CDECL wined3d_resource_map(struct wined3d_resource *resource, unsigned int sub_resource_idx, struct wined3d_map_desc *map_desc, const struct wined3d_box *box, uint32_t flags)
Definition: resource.c:295
HRESULT CDECL wined3d_texture_get_dc(struct wined3d_texture *texture, unsigned int sub_resource_idx, HDC *dc)
Definition: texture.c:4243
struct wined3d_swapchain *CDECL wined3d_texture_get_swapchain(struct wined3d_texture *texture)
Definition: texture.c:4028
struct wined3d_texture *__cdecl wined3d_texture_from_resource(struct wined3d_resource *resource)
Definition: texture.c:3343
HRESULT CDECL wined3d_texture_release_dc(struct wined3d_texture *texture, unsigned int sub_resource_idx, HDC dc)
Definition: texture.c:4291
GUID guid
Definition: version.c:147
r parent
Definition: btrfs.c:3010
const DXGI_USAGE DXGI_USAGE_READ_ONLY
Definition: dxgi.idl:47
const UINT DXGI_MAP_READ
Definition: dxgi.idl:60
const UINT DXGI_MAP_WRITE
Definition: dxgi.idl:61
const DXGI_USAGE DXGI_USAGE_DISCARD_ON_PRESENT
Definition: dxgi.idl:48
UINT DXGI_USAGE
Definition: dxgi.idl:42
const UINT DXGI_MAP_DISCARD
Definition: dxgi.idl:62
const DXGI_USAGE DXGI_USAGE_BACK_BUFFER
Definition: dxgi.idl:45
HRESULT dxgi_get_private_data(struct wined3d_private_store *store, REFGUID guid, UINT *data_size, void *data)
Definition: utils.c:624
void dxgi_sample_desc_from_wined3d(DXGI_SAMPLE_DESC *desc, enum wined3d_multisample_type wined3d_type, unsigned int wined3d_quality)
Definition: utils.c:447
DXGI_USAGE dxgi_usage_from_wined3d_bind_flags(unsigned int wined3d_bind_flags)
Definition: utils.c:490
HRESULT dxgi_set_private_data(struct wined3d_private_store *store, REFGUID guid, UINT data_size, const void *data)
Definition: utils.c:666
HRESULT dxgi_set_private_data_interface(struct wined3d_private_store *store, REFGUID guid, const IUnknown *object)
Definition: utils.c:694
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLenum GLuint texture
Definition: glext.h:6295
GLbitfield flags
Definition: glext.h:7161
GLsizeiptr const GLvoid GLenum usage
Definition: glext.h:5919
unsigned int UINT
Definition: sysinfo.c:13
REFIID riid
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define debugstr_guid
Definition: kernel32.h:35
HDC hdc
Definition: main.c:9
static HDC
Definition: imagelist.c:88
D3D11_SHADER_VARIABLE_DESC desc
Definition: reflection.c:1683
static IUnknown * outer
Definition: compobj.c:82
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define REFIID
Definition: guiddef.h:118
BOOL WINAPI IsRectEmpty(_In_ LPCRECT)
#define TRACE(s)
Definition: solgame.cpp:4
BYTE * pBits
Definition: dxgi.idl:86
Definition: dcommon.idl:28
Definition: scsiwmi.h:51
Definition: devices.h:37
IDXGISurface1 IDXGISurface1_iface
Definition: dxgi_private.h:200
IUnknown IUnknown_iface
Definition: dxgi_private.h:202
IDXGIResource IDXGIResource_iface
Definition: dxgi_private.h:201
enum wined3d_resource_type resource_type
Definition: wined3d.h:1791
unsigned int width
Definition: wined3d.h:1798
unsigned int height
Definition: wined3d.h:1799
enum wined3d_multisample_type multisample_type
Definition: wined3d.h:1793
unsigned int multisample_quality
Definition: wined3d.h:1794
unsigned int bind_flags
Definition: wined3d.h:1796
enum wined3d_format_id format
Definition: wined3d.h:1792
enum wined3d_swap_effect swap_effect
Definition: wined3d.h:1779
#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
struct wined3d_texture *CDECL wined3d_swapchain_get_back_buffer(const struct wined3d_swapchain *swapchain, UINT back_buffer_idx)
Definition: swapchain.c:256
void CDECL wined3d_swapchain_get_desc(const struct wined3d_swapchain *swapchain, struct wined3d_swapchain_desc *desc)
Definition: swapchain.c:345
static void wined3d_private_store_cleanup(struct wined3d_private_store *store)
Definition: wined3d.h:2636
@ WINED3D_SWAP_EFFECT_DISCARD
Definition: wined3d.h:534
@ WINED3D_RTYPE_TEXTURE_2D
Definition: wined3d.h:720
@ WINED3D_RTYPE_TEXTURE_1D
Definition: wined3d.h:719
@ WINED3D_RTYPE_BUFFER
Definition: wined3d.h:718
#define WINED3D_MAP_READ
Definition: wined3d.h:957
static void wined3d_private_store_init(struct wined3d_private_store *store)
Definition: wined3d.h:2607
#define WINED3D_MAP_DISCARD
Definition: wined3d.h:953
#define WINED3D_MAP_WRITE
Definition: wined3d.h:956
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