2 * Copyright 2009 Henri Verbeet for CodeWeavers
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.
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.
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
20 #include "dxgi_private.h"
22 /* Inner IUnknown methods */
24 static inline struct dxgi_surface
*impl_from_IUnknown(IUnknown
*iface
)
26 return CONTAINING_RECORD(iface
, struct dxgi_surface
, IUnknown_iface
);
29 static HRESULT STDMETHODCALLTYPE
dxgi_surface_inner_QueryInterface(IUnknown
*iface
, REFIID riid
, void **out
)
31 struct dxgi_surface
*surface
= impl_from_IUnknown(iface
);
33 TRACE("iface %p, riid %s, out %p.\n", iface
, debugstr_guid(riid
), out
);
35 if (IsEqualGUID(riid
, &IID_IDXGISurface
)
36 || IsEqualGUID(riid
, &IID_IDXGIDeviceSubObject
)
37 || IsEqualGUID(riid
, &IID_IDXGIObject
)
38 || IsEqualGUID(riid
, &IID_IUnknown
))
40 IDXGISurface_AddRef(&surface
->IDXGISurface_iface
);
41 *out
= &surface
->IDXGISurface_iface
;
45 WARN("%s not implemented, returning E_NOINTERFACE\n", debugstr_guid(riid
));
51 static ULONG STDMETHODCALLTYPE
dxgi_surface_inner_AddRef(IUnknown
*iface
)
53 struct dxgi_surface
*surface
= impl_from_IUnknown(iface
);
54 ULONG refcount
= InterlockedIncrement(&surface
->refcount
);
56 TRACE("%p increasing refcount to %u.\n", surface
, refcount
);
61 static ULONG STDMETHODCALLTYPE
dxgi_surface_inner_Release(IUnknown
*iface
)
63 struct dxgi_surface
*surface
= impl_from_IUnknown(iface
);
64 ULONG refcount
= InterlockedDecrement(&surface
->refcount
);
66 TRACE("%p decreasing refcount to %u.\n", surface
, refcount
);
70 IDXGIDevice_Release(surface
->device
);
71 HeapFree(GetProcessHeap(), 0, surface
);
77 static inline struct dxgi_surface
*impl_from_IDXGISurface(IDXGISurface
*iface
)
79 return CONTAINING_RECORD(iface
, struct dxgi_surface
, IDXGISurface_iface
);
82 /* IUnknown methods */
84 static HRESULT STDMETHODCALLTYPE
dxgi_surface_QueryInterface(IDXGISurface
*iface
, REFIID riid
,
87 struct dxgi_surface
*This
= impl_from_IDXGISurface(iface
);
88 TRACE("Forwarding to outer IUnknown\n");
89 return IUnknown_QueryInterface(This
->outer_unknown
, riid
, object
);
92 static ULONG STDMETHODCALLTYPE
dxgi_surface_AddRef(IDXGISurface
*iface
)
94 struct dxgi_surface
*This
= impl_from_IDXGISurface(iface
);
95 TRACE("Forwarding to outer IUnknown\n");
96 return IUnknown_AddRef(This
->outer_unknown
);
99 static ULONG STDMETHODCALLTYPE
dxgi_surface_Release(IDXGISurface
*iface
)
101 struct dxgi_surface
*This
= impl_from_IDXGISurface(iface
);
102 TRACE("Forwarding to outer IUnknown\n");
103 return IUnknown_Release(This
->outer_unknown
);
106 /* IDXGIObject methods */
108 static HRESULT STDMETHODCALLTYPE
dxgi_surface_SetPrivateData(IDXGISurface
*iface
,
109 REFGUID guid
, UINT data_size
, const void *data
)
111 FIXME("iface %p, guid %s, data_size %u, data %p stub!\n", iface
, debugstr_guid(guid
), data_size
, data
);
116 static HRESULT STDMETHODCALLTYPE
dxgi_surface_SetPrivateDataInterface(IDXGISurface
*iface
,
117 REFGUID guid
, const IUnknown
*object
)
119 FIXME("iface %p, guid %s, object %p stub!\n", iface
, debugstr_guid(guid
), object
);
124 static HRESULT STDMETHODCALLTYPE
dxgi_surface_GetPrivateData(IDXGISurface
*iface
,
125 REFGUID guid
, UINT
*data_size
, void *data
)
127 FIXME("iface %p, guid %s, data_size %p, data %p stub!\n", iface
, debugstr_guid(guid
), data_size
, data
);
132 static HRESULT STDMETHODCALLTYPE
dxgi_surface_GetParent(IDXGISurface
*iface
, REFIID riid
, void **parent
)
134 struct dxgi_surface
*This
= impl_from_IDXGISurface(iface
);
136 TRACE("iface %p, riid %s, parent %p.\n", iface
, debugstr_guid(riid
), parent
);
138 return IDXGIDevice_QueryInterface(This
->device
, riid
, parent
);
141 /* IDXGIDeviceSubObject methods */
143 static HRESULT STDMETHODCALLTYPE
dxgi_surface_GetDevice(IDXGISurface
*iface
, REFIID riid
, void **device
)
145 struct dxgi_surface
*This
= impl_from_IDXGISurface(iface
);
147 TRACE("iface %p, riid %s, device %p.\n", iface
, debugstr_guid(riid
), device
);
149 return IDXGIDevice_QueryInterface(This
->device
, riid
, device
);
152 /* IDXGISurface methods */
153 static HRESULT STDMETHODCALLTYPE
dxgi_surface_GetDesc(IDXGISurface
*iface
, DXGI_SURFACE_DESC
*desc
)
155 FIXME("iface %p, desc %p stub!\n", iface
, desc
);
160 static HRESULT STDMETHODCALLTYPE
dxgi_surface_Map(IDXGISurface
*iface
, DXGI_MAPPED_RECT
*mapped_rect
, UINT flags
)
162 FIXME("iface %p, mapped_rect %p, flags %#x stub!\n", iface
, mapped_rect
, flags
);
167 static HRESULT STDMETHODCALLTYPE
dxgi_surface_Unmap(IDXGISurface
*iface
)
169 FIXME("iface %p stub!\n", iface
);
174 static const struct IDXGISurfaceVtbl dxgi_surface_vtbl
=
176 /* IUnknown methods */
177 dxgi_surface_QueryInterface
,
179 dxgi_surface_Release
,
180 /* IDXGIObject methods */
181 dxgi_surface_SetPrivateData
,
182 dxgi_surface_SetPrivateDataInterface
,
183 dxgi_surface_GetPrivateData
,
184 dxgi_surface_GetParent
,
185 /* IDXGIDeviceSubObject methods */
186 dxgi_surface_GetDevice
,
187 /* IDXGISurface methods */
188 dxgi_surface_GetDesc
,
193 static const struct IUnknownVtbl dxgi_surface_inner_unknown_vtbl
=
195 /* IUnknown methods */
196 dxgi_surface_inner_QueryInterface
,
197 dxgi_surface_inner_AddRef
,
198 dxgi_surface_inner_Release
,
201 HRESULT
dxgi_surface_init(struct dxgi_surface
*surface
, IDXGIDevice
*device
, IUnknown
*outer
)
203 surface
->IDXGISurface_iface
.lpVtbl
= &dxgi_surface_vtbl
;
204 surface
->IUnknown_iface
.lpVtbl
= &dxgi_surface_inner_unknown_vtbl
;
205 surface
->refcount
= 1;
206 surface
->outer_unknown
= outer
? outer
: &surface
->IUnknown_iface
;
207 surface
->device
= device
;
208 IDXGIDevice_AddRef(device
);