ReactOS 0.4.17-dev-934-g091855f
device.c File Reference
#include "dxgi_private.h"
Include dependency graph for device.c:

Go to the source code of this file.

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (dxgi)
 
static void STDMETHODCALLTYPE dxgi_null_wined3d_object_destroyed (void *parent)
 
static struct dxgi_device * impl_from_IWineDXGIDevice (IWineDXGIDevice *iface)
 
static HRESULT STDMETHODCALLTYPE dxgi_device_QueryInterface (IWineDXGIDevice *iface, REFIID riid, void **object)
 
static ULONG STDMETHODCALLTYPE dxgi_device_AddRef (IWineDXGIDevice *iface)
 
static ULONG STDMETHODCALLTYPE dxgi_device_Release (IWineDXGIDevice *iface)
 
static HRESULT STDMETHODCALLTYPE dxgi_device_SetPrivateData (IWineDXGIDevice *iface, REFGUID guid, UINT data_size, const void *data)
 
static HRESULT STDMETHODCALLTYPE dxgi_device_SetPrivateDataInterface (IWineDXGIDevice *iface, REFGUID guid, const IUnknown *object)
 
static HRESULT STDMETHODCALLTYPE dxgi_device_GetPrivateData (IWineDXGIDevice *iface, REFGUID guid, UINT *data_size, void *data)
 
static HRESULT STDMETHODCALLTYPE dxgi_device_GetParent (IWineDXGIDevice *iface, REFIID riid, void **parent)
 
static HRESULT STDMETHODCALLTYPE dxgi_device_GetAdapter (IWineDXGIDevice *iface, IDXGIAdapter **adapter)
 
static HRESULT STDMETHODCALLTYPE dxgi_device_CreateSurface (IWineDXGIDevice *iface, const DXGI_SURFACE_DESC *desc, UINT surface_count, DXGI_USAGE usage, const DXGI_SHARED_RESOURCE *shared_resource, IDXGISurface **surface)
 
static HRESULT STDMETHODCALLTYPE dxgi_device_QueryResourceResidency (IWineDXGIDevice *iface, IUnknown *const *resources, DXGI_RESIDENCY *residency, UINT resource_count)
 
static HRESULT STDMETHODCALLTYPE dxgi_device_SetGPUThreadPriority (IWineDXGIDevice *iface, INT priority)
 
static HRESULT STDMETHODCALLTYPE dxgi_device_GetGPUThreadPriority (IWineDXGIDevice *iface, INT *priority)
 
static HRESULT STDMETHODCALLTYPE dxgi_device_SetMaximumFrameLatency (IWineDXGIDevice *iface, UINT max_latency)
 
static HRESULT STDMETHODCALLTYPE dxgi_device_GetMaximumFrameLatency (IWineDXGIDevice *iface, UINT *max_latency)
 
static HRESULT STDMETHODCALLTYPE dxgi_device_OfferResources (IWineDXGIDevice *iface, UINT resource_count, IDXGIResource *const *resources, DXGI_OFFER_RESOURCE_PRIORITY priority)
 
static HRESULT STDMETHODCALLTYPE dxgi_device_ReclaimResources (IWineDXGIDevice *iface, UINT resource_count, IDXGIResource *const *resources, BOOL *discarded)
 
static HRESULT STDMETHODCALLTYPE dxgi_device_EnqueueSetEvent (IWineDXGIDevice *iface, HANDLE event)
 
static void STDMETHODCALLTYPE dxgi_device_Trim (IWineDXGIDevice *iface)
 
static HRESULT STDMETHODCALLTYPE dxgi_device_create_resource (IWineDXGIDevice *iface, struct wined3d_resource *wined3d_resource, DXGI_USAGE usage, const DXGI_SHARED_RESOURCE *shared_resource, IUnknown *outer, BOOL needs_surface, void **resource)
 
static struct dxgi_device * impl_from_IWineDXGISwapChainFactory (IWineDXGISwapChainFactory *iface)
 
static HRESULT STDMETHODCALLTYPE dxgi_swapchain_factory_QueryInterface (IWineDXGISwapChainFactory *iface, REFIID iid, void **out)
 
static ULONG STDMETHODCALLTYPE dxgi_swapchain_factory_AddRef (IWineDXGISwapChainFactory *iface)
 
static ULONG STDMETHODCALLTYPE dxgi_swapchain_factory_Release (IWineDXGISwapChainFactory *iface)
 
static HRESULT STDMETHODCALLTYPE dxgi_swapchain_factory_create_swapchain (IWineDXGISwapChainFactory *iface, IDXGIFactory *factory, HWND window, const DXGI_SWAP_CHAIN_DESC1 *desc, const DXGI_SWAP_CHAIN_FULLSCREEN_DESC *fullscreen_desc, IDXGIOutput *output, IDXGISwapChain1 **swapchain)
 
HRESULT dxgi_device_init (struct dxgi_device *device, struct dxgi_device_layer *layer, IDXGIFactory *factory, IDXGIAdapter *adapter, const D3D_FEATURE_LEVEL *feature_levels, unsigned int level_count)
 

Variables

static const struct wined3d_parent_ops dxgi_null_wined3d_parent_ops
 
static const struct IWineDXGIDeviceVtbl dxgi_device_vtbl
 
static const struct IWineDXGISwapChainFactoryVtbl dxgi_swapchain_factory_vtbl
 

Function Documentation

◆ dxgi_device_AddRef()

static ULONG STDMETHODCALLTYPE dxgi_device_AddRef ( IWineDXGIDevice *  iface)
static

Definition at line 76 of file device.c.

77{
80
81 TRACE("%p increasing refcount to %lu\n", device, refcount);
82
83 return refcount;
84}
#define InterlockedIncrement
Definition: armddk.h:53
static struct dxgi_device * impl_from_IWineDXGIDevice(IWineDXGIDevice *iface)
Definition: device.c:31
#define TRACE(s)
Definition: solgame.cpp:4
Definition: devices.h:37
uint32_t ULONG
Definition: typedefs.h:59

Referenced by dxgi_swapchain_factory_AddRef().

◆ dxgi_device_create_resource()

static HRESULT STDMETHODCALLTYPE dxgi_device_create_resource ( IWineDXGIDevice *  iface,
struct wined3d_resource *  wined3d_resource,
DXGI_USAGE  usage,
const DXGI_SHARED_RESOURCE *  shared_resource,
IUnknown *  outer,
BOOL  needs_surface,
void **  resource 
)
static

Definition at line 333 of file device.c.

336{
337 struct dxgi_resource *object;
338 HRESULT hr;
339
340 TRACE("iface %p, wined3d_resource %p, usage %#x, shared_resource %p, outer %p, needs_surface %d, "
341 "resource %p.\n", iface, wined3d_resource, usage, shared_resource, outer, needs_surface,
342 resource);
343
344 if (!(object = calloc(1, sizeof(*object))))
345 {
346 ERR("Failed to allocate DXGI resource object memory.\n");
347 return E_OUTOFMEMORY;
348 }
349
350 if (FAILED(hr = dxgi_resource_init(object, (IDXGIDevice *)iface, outer, needs_surface, wined3d_resource)))
351 {
352 WARN("Failed to initialize resource, hr %#lx.\n", hr);
353 free(object);
354 return hr;
355 }
356
357 TRACE("Created resource %p.\n", object);
358 *resource = outer ? &object->IUnknown_iface : (IUnknown *)&object->IDXGIResource_iface;
359
360 return S_OK;
361}
#define WARN(fmt,...)
Definition: precomp.h:61
#define ERR(fmt,...)
Definition: precomp.h:57
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define free
Definition: debug_ros.c:5
HRESULT hr
Definition: delayimp.cpp:582
HRESULT dxgi_resource_init(struct dxgi_resource *resource, IDXGIDevice *device, IUnknown *outer, BOOL needs_surface, struct wined3d_resource *wined3d_resource)
Definition: resource.c:426
GLsizeiptr const GLvoid GLenum usage
Definition: glext.h:5919
#define S_OK
Definition: intsafe.h:52
#define FAILED(hr)
Definition: intsafe.h:51
static IUnknown * outer
Definition: compobj.c:82
#define calloc
Definition: rosglue.h:14

◆ dxgi_device_CreateSurface()

static HRESULT STDMETHODCALLTYPE dxgi_device_CreateSurface ( IWineDXGIDevice *  iface,
const DXGI_SURFACE_DESC *  desc,
UINT  surface_count,
DXGI_USAGE  usage,
const DXGI_SHARED_RESOURCE *  shared_resource,
IDXGISurface **  surface 
)
static

Definition at line 174 of file device.c.

177{
179 struct wined3d_resource_desc surface_desc;
180 IWineDXGIDeviceParent *dxgi_device_parent;
181 HRESULT hr;
182 UINT i;
183 UINT j;
184
185 TRACE("iface %p, desc %p, surface_count %u, usage %#x, shared_resource %p, surface %p.\n",
186 iface, desc, surface_count, usage, shared_resource, surface);
187
188 hr = IWineDXGIDevice_QueryInterface(iface, &IID_IWineDXGIDeviceParent, (void **)&dxgi_device_parent);
189 if (FAILED(hr))
190 {
191 ERR("Device should implement IWineDXGIDeviceParent.\n");
192 return E_FAIL;
193 }
194
195 surface_desc.resource_type = WINED3D_RTYPE_TEXTURE_2D;
196 surface_desc.format = wined3dformat_from_dxgi_format(desc->Format);
197 wined3d_sample_desc_from_dxgi(&surface_desc.multisample_type,
198 &surface_desc.multisample_quality, &desc->SampleDesc);
199 surface_desc.bind_flags = wined3d_bind_flags_from_dxgi_usage(usage);
200 surface_desc.usage = 0;
201 surface_desc.access = WINED3D_RESOURCE_ACCESS_GPU;
202 surface_desc.width = desc->Width;
203 surface_desc.height = desc->Height;
204 surface_desc.depth = 1;
205 surface_desc.size = 0;
206
208 memset(surface, 0, surface_count * sizeof(*surface));
209 for (i = 0; i < surface_count; ++i)
210 {
212
213 if (FAILED(hr = wined3d_texture_create(device->wined3d_device, &surface_desc,
215 {
216 ERR("Failed to create wined3d texture, hr %#lx.\n", hr);
217 goto fail;
218 }
219
220 if (FAILED(hr = IWineDXGIDeviceParent_register_swapchain_texture(
221 dxgi_device_parent, wined3d_texture, 0, &surface[i])))
222 {
224 ERR("Failed to create parent swapchain texture, hr %#lx.\n", hr);
225 goto fail;
226 }
228
229 TRACE("Created IDXGISurface %p (%u/%u).\n", surface[i], i + 1, surface_count);
230 }
232 IWineDXGIDeviceParent_Release(dxgi_device_parent);
233
234 return S_OK;
235
236fail:
238 for (j = 0; j < i; ++j)
239 {
240 IDXGISurface_Release(surface[i]);
241 }
242 IWineDXGIDeviceParent_Release(dxgi_device_parent);
243 return hr;
244}
enum wined3d_format_id wined3dformat_from_dxgi_format(DXGI_FORMAT format)
Definition: utils.c:323
#define E_FAIL
Definition: ddrawi.h:102
#define NULL
Definition: types.h:112
static const struct wined3d_parent_ops dxgi_null_wined3d_parent_ops
Definition: device.c:26
HRESULT CDECL wined3d_texture_create(struct wined3d_device *device, const struct wined3d_resource_desc *desc, UINT layer_count, UINT level_count, uint32_t flags, const struct wined3d_sub_resource_data *data, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_texture **texture)
Definition: texture.c:4158
ULONG CDECL wined3d_texture_decref(struct wined3d_texture *texture)
Definition: texture.c:1606
void wined3d_sample_desc_from_dxgi(enum wined3d_multisample_type *wined3d_type, unsigned int *wined3d_quality, const DXGI_SAMPLE_DESC *dxgi_desc)
Definition: utils.c:454
unsigned int wined3d_bind_flags_from_dxgi_usage(DXGI_USAGE usage)
Definition: utils.c:504
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
unsigned int UINT
Definition: sysinfo.c:13
D3D11_SHADER_VARIABLE_DESC desc
Definition: reflection.c:1683
#define memset(x, y, z)
Definition: compat.h:39
#define WINED3D_RESOURCE_ACCESS_GPU
Definition: wined3d.h:51
@ WINED3D_RTYPE_TEXTURE_2D
Definition: wined3d.h:720
void WINAPI wined3d_mutex_unlock(void)
Definition: wined3d_main.c:544
void WINAPI wined3d_mutex_lock(void)
Definition: wined3d_main.c:539

◆ dxgi_device_EnqueueSetEvent()

static HRESULT STDMETHODCALLTYPE dxgi_device_EnqueueSetEvent ( IWineDXGIDevice *  iface,
HANDLE  event 
)
static

Definition at line 319 of file device.c.

320{
321 FIXME("iface %p, event %p stub!\n", iface, event);
322
323 return E_NOTIMPL;
324}
#define FIXME(fmt,...)
Definition: precomp.h:53
#define E_NOTIMPL
Definition: ddrawi.h:99
Definition: filter.c:185

◆ dxgi_device_GetAdapter()

static HRESULT STDMETHODCALLTYPE dxgi_device_GetAdapter ( IWineDXGIDevice *  iface,
IDXGIAdapter **  adapter 
)
static

Definition at line 163 of file device.c.

164{
166
167 TRACE("iface %p, adapter %p.\n", iface, adapter);
168
169 *adapter = (IDXGIAdapter *)device->adapter;
170 IDXGIAdapter_AddRef(*adapter);
171 return S_OK;
172}
return adapter

◆ dxgi_device_GetGPUThreadPriority()

static HRESULT STDMETHODCALLTYPE dxgi_device_GetGPUThreadPriority ( IWineDXGIDevice *  iface,
INT *  priority 
)
static

Definition at line 262 of file device.c.

263{
264 FIXME("iface %p, priority %p stub!\n", iface, priority);
265
266 return E_NOTIMPL;
267}
static int priority
Definition: timer.c:163

◆ dxgi_device_GetMaximumFrameLatency()

static HRESULT STDMETHODCALLTYPE dxgi_device_GetMaximumFrameLatency ( IWineDXGIDevice *  iface,
UINT *  max_latency 
)
static

Definition at line 285 of file device.c.

286{
288
289 TRACE("iface %p, max_latency %p.\n", iface, max_latency);
290
291 if (!max_latency)
293
295 *max_latency = wined3d_device_get_max_frame_latency(device->wined3d_device);
297
298 return S_OK;
299}
unsigned int CDECL wined3d_device_get_max_frame_latency(const struct wined3d_device *device)
Definition: device.c:2729
#define DXGI_ERROR_INVALID_CALL
Definition: winerror.h:7120

◆ dxgi_device_GetParent()

static HRESULT STDMETHODCALLTYPE dxgi_device_GetParent ( IWineDXGIDevice *  iface,
REFIID  riid,
void **  parent 
)
static

Definition at line 141 of file device.c.

142{
144 HRESULT hr;
145
146 TRACE("iface %p, riid %s, parent %p.\n", iface, debugstr_guid(riid), parent);
147
148 hr = IWineDXGIDevice_GetAdapter(iface, &adapter);
149 if (FAILED(hr))
150 {
151 ERR("Failed to get adapter, hr %#lx.\n", hr);
152 return hr;
153 }
154
155 hr = IDXGIAdapter_QueryInterface(adapter, riid, parent);
156 IDXGIAdapter_Release(adapter);
157
158 return hr;
159}
r parent
Definition: btrfs.c:3010
REFIID riid
Definition: atlbase.h:39
#define debugstr_guid
Definition: kernel32.h:35

◆ dxgi_device_GetPrivateData()

static HRESULT STDMETHODCALLTYPE dxgi_device_GetPrivateData ( IWineDXGIDevice *  iface,
REFGUID  guid,
UINT *  data_size,
void *  data 
)
static

Definition at line 131 of file device.c.

133{
135
136 TRACE("iface %p, guid %s, data_size %p, data %p.\n", iface, debugstr_guid(guid), data_size, data);
137
138 return dxgi_get_private_data(&device->private_store, guid, data_size, data);
139}
GUID guid
Definition: version.c:147
HRESULT dxgi_get_private_data(struct wined3d_private_store *store, REFGUID guid, UINT *data_size, void *data)
Definition: utils.c:624
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950

◆ dxgi_device_init()

HRESULT dxgi_device_init ( struct dxgi_device *  device,
struct dxgi_device_layer *  layer,
IDXGIFactory *  factory,
IDXGIAdapter *  adapter,
const D3D_FEATURE_LEVEL *  feature_levels,
unsigned int  level_count 
)

Definition at line 486 of file device.c.

489{
491 struct wined3d_swapchain_desc swapchain_desc;
492 IWineDXGIDeviceParent *dxgi_device_parent;
495 struct dxgi_output *dxgi_output;
496 struct IDXGIOutput *output;
497 void *layer_base;
498 HWND window;
499 HRESULT hr;
500
502 {
503 WARN("This is not the factory we're looking for.\n");
504 return E_FAIL;
505 }
506
508 {
509 WARN("This is not the adapter we're looking for.\n");
510 return E_FAIL;
511 }
512
513 device->IWineDXGIDevice_iface.lpVtbl = &dxgi_device_vtbl;
514 device->IWineDXGISwapChainFactory_iface.lpVtbl = &dxgi_swapchain_factory_vtbl;
515 device->refcount = 1;
517 wined3d_private_store_init(&device->private_store);
518
519 layer_base = device + 1;
520
521 if (FAILED(hr = layer->create(layer->id, &layer_base, 0,
522 device, &IID_IUnknown, (void **)&device->child_layer)))
523 {
524 WARN("Failed to create device, returning %#lx.\n", hr);
525 wined3d_private_store_cleanup(&device->private_store);
527 return hr;
528 }
529
530 if (FAILED(hr = IWineDXGIDevice_QueryInterface(&device->IWineDXGIDevice_iface,
531 &IID_IWineDXGIDeviceParent, (void **)&dxgi_device_parent)))
532 {
533 ERR("DXGI device should implement IWineDXGIDeviceParent.\n");
534 IUnknown_Release(device->child_layer);
535 wined3d_private_store_cleanup(&device->private_store);
537 return hr;
538 }
539 wined3d_device_parent = IWineDXGIDeviceParent_get_wined3d_device_parent(dxgi_device_parent);
540 IWineDXGIDeviceParent_Release(dxgi_device_parent);
541
544 (const enum wined3d_feature_level *)feature_levels, level_count,
545 wined3d_device_parent, &device->wined3d_device)))
546 {
547 WARN("Failed to create a wined3d device, returning %#lx.\n", hr);
548 IUnknown_Release(device->child_layer);
549 wined3d_private_store_cleanup(&device->private_store);
551 return hr;
552 }
553
556 {
557 ERR("Failed to get output from window %p.\n", window);
558 wined3d_device_decref(device->wined3d_device);
559 IUnknown_Release(device->child_layer);
560 wined3d_private_store_cleanup(&device->private_store);
562 return hr;
563 }
565
566 memset(&swapchain_desc, 0, sizeof(swapchain_desc));
567 swapchain_desc.swap_effect = WINED3D_SWAP_EFFECT_DISCARD;
568 swapchain_desc.device_window = window;
569 swapchain_desc.windowed = TRUE;
570 swapchain_desc.flags = WINED3D_SWAPCHAIN_IMPLICIT;
571 swapchain_desc.output = dxgi_output->wined3d_output;
572 IDXGIOutput_Release(output);
573
574 if (FAILED(hr = wined3d_swapchain_create(device->wined3d_device, &swapchain_desc,
575 NULL, NULL, &dxgi_null_wined3d_parent_ops, &device->implicit_swapchain)))
576 {
577 ERR("Failed to create implicit swapchain, hr %#lx.\n", hr);
578 wined3d_device_decref(device->wined3d_device);
579 IUnknown_Release(device->child_layer);
580 wined3d_private_store_cleanup(&device->private_store);
582 return E_OUTOFMEMORY;
583 }
584
586
588 IWineDXGIAdapter_AddRef(device->adapter);
589
590 return S_OK;
591}
const GUID IID_IUnknown
#define TRUE
Definition: types.h:120
struct dxgi_adapter * unsafe_impl_from_IDXGIAdapter(IDXGIAdapter *iface)
Definition: adapter.c:418
static const struct IWineDXGIDeviceVtbl dxgi_device_vtbl
Definition: device.c:363
static const struct IWineDXGISwapChainFactoryVtbl dxgi_swapchain_factory_vtbl
Definition: device.c:478
ULONG CDECL wined3d_device_decref(struct wined3d_device *device)
Definition: device.c:251
struct dxgi_factory * unsafe_impl_from_IDXGIFactory(IDXGIFactory *iface)
Definition: factory.c:546
HRESULT dxgi_get_output_from_window(IWineDXGIFactory *factory, HWND window, IDXGIOutput **dxgi_output)
Definition: swapchain.c:103
struct dxgi_output * unsafe_impl_from_IDXGIOutput(IDXGIOutput *iface)
Definition: output.c:706
HWND dxgi_factory_get_device_window(struct dxgi_factory *factory)
Definition: factory.c:607
GLenum GLuint GLint GLint layer
Definition: glext.h:7007
static D3D_DRIVER_TYPE HMODULE UINT const D3D_FEATURE_LEVEL * feature_levels
Definition: hlsl_d3d11.c:28
static IHTMLWindow2 * window
Definition: events.c:77
struct wined3d_adapter * wined3d_adapter
Definition: dxgi_private.h:162
IWineDXGIAdapter IWineDXGIAdapter_iface
Definition: dxgi_private.h:160
struct wined3d * wined3d
Definition: dxgi_private.h:117
IWineDXGIFactory IWineDXGIFactory_iface
Definition: dxgi_private.h:114
struct wined3d_output * wined3d_output
Definition: dxgi_private.h:148
Definition: main.c:439
HRESULT CDECL wined3d_device_create(struct wined3d *wined3d, struct wined3d_adapter *adapter, enum wined3d_device_type device_type, HWND focus_window, uint32_t flags, BYTE surface_alignment, const enum wined3d_feature_level *feature_levels, unsigned int feature_level_count, struct wined3d_device_parent *device_parent, struct wined3d_device **device)
Definition: directx.c:2777
HRESULT CDECL wined3d_swapchain_create(struct wined3d_device *device, const struct wined3d_swapchain_desc *desc, struct wined3d_swapchain_state_parent *state_parent, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_swapchain **swapchain)
Definition: swapchain.c:1732
static void wined3d_private_store_cleanup(struct wined3d_private_store *store)
Definition: wined3d.h:2636
#define WINED3D_SWAPCHAIN_IMPLICIT
Definition: wined3d.h:901
@ WINED3D_SWAP_EFFECT_DISCARD
Definition: wined3d.h:534
static void wined3d_private_store_init(struct wined3d_private_store *store)
Definition: wined3d.h:2607
wined3d_feature_level
Definition: wined3d.h:98
@ WINED3D_DEVICE_TYPE_HAL
Definition: wined3d.h:91

Referenced by DXGID3D10CreateDevice().

◆ dxgi_device_OfferResources()

static HRESULT STDMETHODCALLTYPE dxgi_device_OfferResources ( IWineDXGIDevice *  iface,
UINT  resource_count,
IDXGIResource *const *  resources,
DXGI_OFFER_RESOURCE_PRIORITY  priority 
)
static

Definition at line 301 of file device.c.

303{
304 FIXME("iface %p, resource_count %u, resources %p, priority %u stub!\n", iface, resource_count,
306
307 return E_NOTIMPL;
308}
FxCmResList * resources

◆ dxgi_device_QueryInterface()

static HRESULT STDMETHODCALLTYPE dxgi_device_QueryInterface ( IWineDXGIDevice *  iface,
REFIID  riid,
void **  object 
)
static

Definition at line 38 of file device.c.

39{
41
42 TRACE("iface %p, riid %s, object %p\n", iface, debugstr_guid(riid), object);
43
45 || IsEqualGUID(riid, &IID_IDXGIObject)
46 || IsEqualGUID(riid, &IID_IDXGIDevice)
47 || IsEqualGUID(riid, &IID_IDXGIDevice1)
48 || IsEqualGUID(riid, &IID_IDXGIDevice2)
49 || IsEqualGUID(riid, &IID_IDXGIDevice3)
50 || IsEqualGUID(riid, &IID_IWineDXGIDevice))
51 {
52 IUnknown_AddRef(iface);
53 *object = iface;
54 return S_OK;
55 }
56
57 if (IsEqualGUID(riid, &IID_IWineDXGISwapChainFactory))
58 {
59 IUnknown_AddRef(iface);
60 *object = &device->IWineDXGISwapChainFactory_iface;
61 return S_OK;
62 }
63
64 if (device->child_layer)
65 {
66 TRACE("Forwarding to child layer %p.\n", device->child_layer);
67 return IUnknown_QueryInterface(device->child_layer, riid, object);
68 }
69
70 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid));
71
72 *object = NULL;
73 return E_NOINTERFACE;
74}
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define E_NOINTERFACE
Definition: winerror.h:3479

Referenced by dxgi_swapchain_factory_QueryInterface().

◆ dxgi_device_QueryResourceResidency()

static HRESULT STDMETHODCALLTYPE dxgi_device_QueryResourceResidency ( IWineDXGIDevice *  iface,
IUnknown *const *  resources,
DXGI_RESIDENCY *  residency,
UINT  resource_count 
)
static

Definition at line 246 of file device.c.

248{
249 FIXME("iface %p, resources %p, residency %p, resource_count %u stub!\n",
250 iface, resources, residency, resource_count);
251
252 return E_NOTIMPL;
253}

◆ dxgi_device_ReclaimResources()

static HRESULT STDMETHODCALLTYPE dxgi_device_ReclaimResources ( IWineDXGIDevice *  iface,
UINT  resource_count,
IDXGIResource *const *  resources,
BOOL *  discarded 
)
static

Definition at line 310 of file device.c.

312{
313 FIXME("iface %p, resource_count %u, resources %p, discarded %p stub!\n", iface, resource_count,
314 resources, discarded);
315
316 return E_NOTIMPL;
317}

◆ dxgi_device_Release()

static ULONG STDMETHODCALLTYPE dxgi_device_Release ( IWineDXGIDevice *  iface)
static

Definition at line 86 of file device.c.

87{
90
91 TRACE("%p decreasing refcount to %lu.\n", device, refcount);
92
93 if (!refcount)
94 {
95 if (device->child_layer)
96 IUnknown_Release(device->child_layer);
98 wined3d_swapchain_decref(device->implicit_swapchain);
99 wined3d_device_decref(device->wined3d_device);
101 IWineDXGIAdapter_Release(device->adapter);
102 wined3d_private_store_cleanup(&device->private_store);
103 free(device);
104 }
105
106 return refcount;
107}
#define InterlockedDecrement
Definition: armddk.h:52
ULONG CDECL wined3d_swapchain_decref(struct wined3d_swapchain *swapchain)
Definition: swapchain.c:144

Referenced by dxgi_swapchain_factory_Release().

◆ dxgi_device_SetGPUThreadPriority()

static HRESULT STDMETHODCALLTYPE dxgi_device_SetGPUThreadPriority ( IWineDXGIDevice *  iface,
INT  priority 
)
static

Definition at line 255 of file device.c.

256{
257 FIXME("iface %p, priority %d stub!\n", iface, priority);
258
259 return E_NOTIMPL;
260}

◆ dxgi_device_SetMaximumFrameLatency()

static HRESULT STDMETHODCALLTYPE dxgi_device_SetMaximumFrameLatency ( IWineDXGIDevice *  iface,
UINT  max_latency 
)
static

Definition at line 269 of file device.c.

270{
272
273 TRACE("iface %p, max_latency %u.\n", iface, max_latency);
274
275 if (max_latency > DXGI_FRAME_LATENCY_MAX)
277
279 wined3d_device_set_max_frame_latency(device->wined3d_device, max_latency);
281
282 return S_OK;
283}
void CDECL wined3d_device_set_max_frame_latency(struct wined3d_device *device, unsigned int latency)
Definition: device.c:2717
@ DXGI_FRAME_LATENCY_MAX
Definition: dxgi_private.h:44

◆ dxgi_device_SetPrivateData()

static HRESULT STDMETHODCALLTYPE dxgi_device_SetPrivateData ( IWineDXGIDevice *  iface,
REFGUID  guid,
UINT  data_size,
const void *  data 
)
static

Definition at line 111 of file device.c.

113{
115
116 TRACE("iface %p, guid %s, data_size %u, data %p.\n", iface, debugstr_guid(guid), data_size, data);
117
118 return dxgi_set_private_data(&device->private_store, guid, data_size, data);
119}
HRESULT dxgi_set_private_data(struct wined3d_private_store *store, REFGUID guid, UINT data_size, const void *data)
Definition: utils.c:666

◆ dxgi_device_SetPrivateDataInterface()

static HRESULT STDMETHODCALLTYPE dxgi_device_SetPrivateDataInterface ( IWineDXGIDevice *  iface,
REFGUID  guid,
const IUnknown *  object 
)
static

Definition at line 121 of file device.c.

123{
125
126 TRACE("iface %p, guid %s, object %p.\n", iface, debugstr_guid(guid), object);
127
128 return dxgi_set_private_data_interface(&device->private_store, guid, object);
129}
HRESULT dxgi_set_private_data_interface(struct wined3d_private_store *store, REFGUID guid, const IUnknown *object)
Definition: utils.c:694

◆ dxgi_device_Trim()

static void STDMETHODCALLTYPE dxgi_device_Trim ( IWineDXGIDevice *  iface)
static

Definition at line 326 of file device.c.

327{
328 FIXME("iface %p stub!\n", iface);
329}

◆ dxgi_null_wined3d_object_destroyed()

static void STDMETHODCALLTYPE dxgi_null_wined3d_object_destroyed ( void *  parent)
static

Definition at line 24 of file device.c.

24{}

◆ dxgi_swapchain_factory_AddRef()

static ULONG STDMETHODCALLTYPE dxgi_swapchain_factory_AddRef ( IWineDXGISwapChainFactory *  iface)
static

Definition at line 408 of file device.c.

409{
411
412 TRACE("iface %p.\n", iface);
413
414 return dxgi_device_AddRef(&device->IWineDXGIDevice_iface);
415}
static struct dxgi_device * impl_from_IWineDXGISwapChainFactory(IWineDXGISwapChainFactory *iface)
Definition: device.c:393
static ULONG STDMETHODCALLTYPE dxgi_device_AddRef(IWineDXGIDevice *iface)
Definition: device.c:76

◆ dxgi_swapchain_factory_create_swapchain()

static HRESULT STDMETHODCALLTYPE dxgi_swapchain_factory_create_swapchain ( IWineDXGISwapChainFactory *  iface,
IDXGIFactory *  factory,
HWND  window,
const DXGI_SWAP_CHAIN_DESC1 *  desc,
const DXGI_SWAP_CHAIN_FULLSCREEN_DESC *  fullscreen_desc,
IDXGIOutput *  output,
IDXGISwapChain1 **  swapchain 
)
static

Definition at line 426 of file device.c.

429{
431 struct wined3d_swapchain_desc wined3d_desc;
432 struct IDXGIOutput *containing_output;
434 struct d3d11_swapchain *object;
435 HRESULT hr;
436
437 TRACE("iface %p, factory %p, window %p, desc %p, fullscreen_desc %p, output %p, swapchain %p.\n",
438 iface, factory, window, desc, fullscreen_desc, output, swapchain);
439
441 {
442 WARN("Factory %p is not a valid dxgi factory.\n", factory);
443 return E_FAIL;
444 }
445
447 {
448 WARN("Failed to get output from window %p, hr %#lx.\n", window, hr);
449 return hr;
450 }
451
452 hr = wined3d_swapchain_desc_from_dxgi(&wined3d_desc, containing_output, window, desc,
453 fullscreen_desc);
454 IDXGIOutput_Release(containing_output);
455 if (FAILED(hr))
456 return hr;
457
458 if (!(object = calloc(1, sizeof(*object))))
459 {
460 ERR("Failed to allocate swapchain memory.\n");
461 return E_OUTOFMEMORY;
462 }
463
464 if (FAILED(hr = d3d11_swapchain_init(object, device, &wined3d_desc)))
465 {
466 WARN("Failed to initialise swapchain, hr %#lx.\n", hr);
467 free(object);
468 return hr;
469 }
470
471 TRACE("Created swapchain %p.\n", object);
472
473 *swapchain = (IDXGISwapChain1 *)&object->IDXGISwapChain4_iface;
474
475 return S_OK;
476}
HRESULT wined3d_swapchain_desc_from_dxgi(struct wined3d_swapchain_desc *wined3d_desc, IDXGIOutput *dxgi_containing_output, HWND window, const DXGI_SWAP_CHAIN_DESC1 *dxgi_desc, const DXGI_SWAP_CHAIN_FULLSCREEN_DESC *dxgi_fullscreen_desc)
Definition: utils.c:571
HRESULT d3d11_swapchain_init(struct d3d11_swapchain *swapchain, struct dxgi_device *device, struct wined3d_swapchain_desc *desc)
Definition: swapchain.c:991

◆ dxgi_swapchain_factory_QueryInterface()

static HRESULT STDMETHODCALLTYPE dxgi_swapchain_factory_QueryInterface ( IWineDXGISwapChainFactory *  iface,
REFIID  iid,
void **  out 
)
static

Definition at line 398 of file device.c.

400{
402
403 TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out);
404
405 return dxgi_device_QueryInterface(&device->IWineDXGIDevice_iface, iid, out);
406}
static HRESULT STDMETHODCALLTYPE dxgi_device_QueryInterface(IWineDXGIDevice *iface, REFIID riid, void **object)
Definition: device.c:38
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383

◆ dxgi_swapchain_factory_Release()

static ULONG STDMETHODCALLTYPE dxgi_swapchain_factory_Release ( IWineDXGISwapChainFactory *  iface)
static

Definition at line 417 of file device.c.

418{
420
421 TRACE("iface %p.\n", iface);
422
423 return dxgi_device_Release(&device->IWineDXGIDevice_iface);
424}
static ULONG STDMETHODCALLTYPE dxgi_device_Release(IWineDXGIDevice *iface)
Definition: device.c:86

◆ impl_from_IWineDXGIDevice()

◆ impl_from_IWineDXGISwapChainFactory()

static struct dxgi_device * impl_from_IWineDXGISwapChainFactory ( IWineDXGISwapChainFactory *  iface)
inlinestatic

Definition at line 393 of file device.c.

394{
395 return CONTAINING_RECORD(iface, struct dxgi_device, IWineDXGISwapChainFactory_iface);
396}

Referenced by dxgi_swapchain_factory_AddRef(), dxgi_swapchain_factory_create_swapchain(), dxgi_swapchain_factory_QueryInterface(), and dxgi_swapchain_factory_Release().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( dxgi  )

Variable Documentation

◆ dxgi_device_vtbl

const struct IWineDXGIDeviceVtbl dxgi_device_vtbl
static
Initial value:
=
{
}
static HRESULT STDMETHODCALLTYPE dxgi_device_OfferResources(IWineDXGIDevice *iface, UINT resource_count, IDXGIResource *const *resources, DXGI_OFFER_RESOURCE_PRIORITY priority)
Definition: device.c:301
static HRESULT STDMETHODCALLTYPE dxgi_device_GetParent(IWineDXGIDevice *iface, REFIID riid, void **parent)
Definition: device.c:141
static HRESULT STDMETHODCALLTYPE dxgi_device_GetPrivateData(IWineDXGIDevice *iface, REFGUID guid, UINT *data_size, void *data)
Definition: device.c:131
static HRESULT STDMETHODCALLTYPE dxgi_device_CreateSurface(IWineDXGIDevice *iface, const DXGI_SURFACE_DESC *desc, UINT surface_count, DXGI_USAGE usage, const DXGI_SHARED_RESOURCE *shared_resource, IDXGISurface **surface)
Definition: device.c:174
static HRESULT STDMETHODCALLTYPE dxgi_device_SetPrivateDataInterface(IWineDXGIDevice *iface, REFGUID guid, const IUnknown *object)
Definition: device.c:121
static void STDMETHODCALLTYPE dxgi_device_Trim(IWineDXGIDevice *iface)
Definition: device.c:326
static HRESULT STDMETHODCALLTYPE dxgi_device_GetGPUThreadPriority(IWineDXGIDevice *iface, INT *priority)
Definition: device.c:262
static HRESULT STDMETHODCALLTYPE dxgi_device_SetMaximumFrameLatency(IWineDXGIDevice *iface, UINT max_latency)
Definition: device.c:269
static HRESULT STDMETHODCALLTYPE dxgi_device_ReclaimResources(IWineDXGIDevice *iface, UINT resource_count, IDXGIResource *const *resources, BOOL *discarded)
Definition: device.c:310
static HRESULT STDMETHODCALLTYPE dxgi_device_EnqueueSetEvent(IWineDXGIDevice *iface, HANDLE event)
Definition: device.c:319
static HRESULT STDMETHODCALLTYPE dxgi_device_create_resource(IWineDXGIDevice *iface, struct wined3d_resource *wined3d_resource, DXGI_USAGE usage, const DXGI_SHARED_RESOURCE *shared_resource, IUnknown *outer, BOOL needs_surface, void **resource)
Definition: device.c:333
static HRESULT STDMETHODCALLTYPE dxgi_device_SetGPUThreadPriority(IWineDXGIDevice *iface, INT priority)
Definition: device.c:255
static HRESULT STDMETHODCALLTYPE dxgi_device_GetAdapter(IWineDXGIDevice *iface, IDXGIAdapter **adapter)
Definition: device.c:163
static HRESULT STDMETHODCALLTYPE dxgi_device_SetPrivateData(IWineDXGIDevice *iface, REFGUID guid, UINT data_size, const void *data)
Definition: device.c:111
static HRESULT STDMETHODCALLTYPE dxgi_device_QueryResourceResidency(IWineDXGIDevice *iface, IUnknown *const *resources, DXGI_RESIDENCY *residency, UINT resource_count)
Definition: device.c:246
static HRESULT STDMETHODCALLTYPE dxgi_device_GetMaximumFrameLatency(IWineDXGIDevice *iface, UINT *max_latency)
Definition: device.c:285

Definition at line 363 of file device.c.

Referenced by dxgi_device_init().

◆ dxgi_null_wined3d_parent_ops

const struct wined3d_parent_ops dxgi_null_wined3d_parent_ops
static
Initial value:
=
{
}
static void STDMETHODCALLTYPE dxgi_null_wined3d_object_destroyed(void *parent)
Definition: device.c:24

Definition at line 26 of file device.c.

Referenced by dxgi_device_CreateSurface(), and dxgi_device_init().

◆ dxgi_swapchain_factory_vtbl

const struct IWineDXGISwapChainFactoryVtbl dxgi_swapchain_factory_vtbl
static
Initial value:
=
{
}
static HRESULT STDMETHODCALLTYPE dxgi_swapchain_factory_QueryInterface(IWineDXGISwapChainFactory *iface, REFIID iid, void **out)
Definition: device.c:398
static ULONG STDMETHODCALLTYPE dxgi_swapchain_factory_AddRef(IWineDXGISwapChainFactory *iface)
Definition: device.c:408
static ULONG STDMETHODCALLTYPE dxgi_swapchain_factory_Release(IWineDXGISwapChainFactory *iface)
Definition: device.c:417
static HRESULT STDMETHODCALLTYPE dxgi_swapchain_factory_create_swapchain(IWineDXGISwapChainFactory *iface, IDXGIFactory *factory, HWND window, const DXGI_SWAP_CHAIN_DESC1 *desc, const DXGI_SWAP_CHAIN_FULLSCREEN_DESC *fullscreen_desc, IDXGIOutput *output, IDXGISwapChain1 **swapchain)
Definition: device.c:426

Definition at line 478 of file device.c.

Referenced by dxgi_device_init().