Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
15b6bc61
Commit
15b6bc61
authored
Nov 19, 2009
by
Henri Verbeet
Committed by
Alexandre Julliard
Nov 19, 2009
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
dxgi: Add a separate function for device initialization.
parent
ccbcf8f2
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
120 additions
and
102 deletions
+120
-102
device.c
dlls/dxgi/device.c
+78
-1
dxgi_main.c
dlls/dxgi/dxgi_main.c
+7
-68
dxgi_private.h
dlls/dxgi/dxgi_private.h
+35
-33
No files found.
dlls/dxgi/device.c
View file @
15b6bc61
...
...
@@ -312,7 +312,7 @@ static HRESULT STDMETHODCALLTYPE dxgi_device_create_swapchain(IWineDXGIDevice *i
return
S_OK
;
}
const
struct
IWineDXGIDeviceVtbl
dxgi_device_vtbl
=
static
const
struct
IWineDXGIDeviceVtbl
dxgi_device_vtbl
=
{
/* IUnknown methods */
dxgi_device_QueryInterface
,
...
...
@@ -334,3 +334,80 @@ const struct IWineDXGIDeviceVtbl dxgi_device_vtbl =
dxgi_device_create_surface
,
dxgi_device_create_swapchain
,
};
HRESULT
dxgi_device_init
(
struct
dxgi_device
*
device
,
struct
dxgi_device_layer
*
layer
,
IDXGIFactory
*
factory
,
IDXGIAdapter
*
adapter
)
{
IWineD3DDeviceParent
*
wined3d_device_parent
;
IWineDXGIAdapter
*
wine_adapter
;
UINT
adapter_ordinal
;
IWineD3D
*
wined3d
;
void
*
layer_base
;
HRESULT
hr
;
device
->
vtbl
=
&
dxgi_device_vtbl
;
device
->
refcount
=
1
;
layer_base
=
device
+
1
;
hr
=
layer
->
create
(
layer
->
id
,
&
layer_base
,
0
,
device
,
&
IID_IUnknown
,
(
void
**
)
&
device
->
child_layer
);
if
(
FAILED
(
hr
))
{
WARN
(
"Failed to create device, returning %#x.
\n
"
,
hr
);
goto
fail
;
}
hr
=
IDXGIFactory_QueryInterface
(
factory
,
&
IID_IWineDXGIFactory
,
(
void
**
)
&
device
->
factory
);
if
(
FAILED
(
hr
))
{
WARN
(
"This is not the factory we're looking for, returning %#x.
\n
"
,
hr
);
goto
fail
;
}
wined3d
=
IWineDXGIFactory_get_wined3d
(
device
->
factory
);
hr
=
IDXGIAdapter_QueryInterface
(
adapter
,
&
IID_IWineDXGIAdapter
,
(
void
**
)
&
wine_adapter
);
if
(
FAILED
(
hr
))
{
WARN
(
"This is not the adapter we're looking for, returning %#x.
\n
"
,
hr
);
EnterCriticalSection
(
&
dxgi_cs
);
IWineD3D_Release
(
wined3d
);
LeaveCriticalSection
(
&
dxgi_cs
);
goto
fail
;
}
adapter_ordinal
=
IWineDXGIAdapter_get_ordinal
(
wine_adapter
);
IWineDXGIAdapter_Release
(
wine_adapter
);
hr
=
IUnknown_QueryInterface
((
IUnknown
*
)
device
,
&
IID_IWineD3DDeviceParent
,
(
void
**
)
&
wined3d_device_parent
);
if
(
FAILED
(
hr
))
{
ERR
(
"DXGI device should implement IWineD3DDeviceParent.
\n
"
);
goto
fail
;
}
FIXME
(
"Ignoring adapter type.
\n
"
);
EnterCriticalSection
(
&
dxgi_cs
);
hr
=
IWineD3D_CreateDevice
(
wined3d
,
adapter_ordinal
,
WINED3DDEVTYPE_HAL
,
NULL
,
0
,
(
IUnknown
*
)
device
,
wined3d_device_parent
,
&
device
->
wined3d_device
);
IWineD3DDeviceParent_Release
(
wined3d_device_parent
);
IWineD3D_Release
(
wined3d
);
LeaveCriticalSection
(
&
dxgi_cs
);
if
(
FAILED
(
hr
))
{
WARN
(
"Failed to create a wined3d device, returning %#x.
\n
"
,
hr
);
goto
fail
;
}
return
S_OK
;
fail:
if
(
device
->
wined3d_device
)
{
EnterCriticalSection
(
&
dxgi_cs
);
IWineD3DDevice_Release
(
device
->
wined3d_device
);
LeaveCriticalSection
(
&
dxgi_cs
);
}
if
(
device
->
factory
)
IWineDXGIFactory_Release
(
device
->
factory
);
if
(
device
->
child_layer
)
IUnknown_Release
(
device
->
child_layer
);
return
hr
;
}
dlls/dxgi/dxgi_main.c
View file @
15b6bc61
...
...
@@ -226,14 +226,9 @@ static HRESULT register_d3d10core_layers(HMODULE d3d10core)
HRESULT
WINAPI
DXGID3D10CreateDevice
(
HMODULE
d3d10core
,
IDXGIFactory
*
factory
,
IDXGIAdapter
*
adapter
,
UINT
flags
,
DWORD
unknown0
,
void
**
device
)
{
IWineD3DDeviceParent
*
wined3d_device_parent
;
struct
layer_get_size_args
get_size_args
;
struct
dxgi_device
*
dxgi_device
;
struct
dxgi_device_layer
d3d10_layer
;
IWineDXGIAdapter
*
wine_adapter
;
UINT
adapter_ordinal
;
IWineD3D
*
wined3d
;
void
*
layer_base
;
UINT
device_size
;
DWORD
count
;
HRESULT
hr
;
...
...
@@ -282,75 +277,19 @@ HRESULT WINAPI DXGID3D10CreateDevice(HMODULE d3d10core, IDXGIFactory *factory, I
return
E_OUTOFMEMORY
;
}
dxgi_device
->
vtbl
=
&
dxgi_device_vtbl
;
dxgi_device
->
refcount
=
1
;
layer_base
=
dxgi_device
+
1
;
hr
=
d3d10_layer
.
create
(
d3d10_layer
.
id
,
&
layer_base
,
0
,
dxgi_device
,
&
IID_IUnknown
,
(
void
**
)
&
dxgi_device
->
child_layer
);
hr
=
dxgi_device_init
(
dxgi_device
,
&
d3d10_layer
,
factory
,
adapter
);
if
(
FAILED
(
hr
))
{
WARN
(
"Failed to create device, returning %#x
\n
"
,
hr
);
goto
fail
;
}
hr
=
IDXGIFactory_QueryInterface
(
factory
,
&
IID_IWineDXGIFactory
,
(
void
**
)
&
dxgi_device
->
factory
);
if
(
FAILED
(
hr
))
{
WARN
(
"This is not the factory we're looking for, returning %#x
\n
"
,
hr
);
goto
fail
;
}
wined3d
=
IWineDXGIFactory_get_wined3d
(
dxgi_device
->
factory
);
hr
=
IDXGIAdapter_QueryInterface
(
adapter
,
&
IID_IWineDXGIAdapter
,
(
void
**
)
&
wine_adapter
);
if
(
FAILED
(
hr
))
{
WARN
(
"This is not the adapter we're looking for, returning %#x
\n
"
,
hr
);
EnterCriticalSection
(
&
dxgi_cs
);
IWineD3D_Release
(
wined3d
);
LeaveCriticalSection
(
&
dxgi_cs
);
goto
fail
;
}
adapter_ordinal
=
IWineDXGIAdapter_get_ordinal
(
wine_adapter
);
IWineDXGIAdapter_Release
(
wine_adapter
);
hr
=
IUnknown_QueryInterface
((
IUnknown
*
)
dxgi_device
,
&
IID_IWineD3DDeviceParent
,
(
void
**
)
&
wined3d_device_parent
);
if
(
FAILED
(
hr
))
{
ERR
(
"DXGI device should implement IWineD3DDeviceParent
\n
"
);
goto
fail
;
}
FIXME
(
"Ignoring adapter type
\n
"
);
EnterCriticalSection
(
&
dxgi_cs
);
hr
=
IWineD3D_CreateDevice
(
wined3d
,
adapter_ordinal
,
WINED3DDEVTYPE_HAL
,
NULL
,
0
,
(
IUnknown
*
)
dxgi_device
,
wined3d_device_parent
,
&
dxgi_device
->
wined3d_device
);
IWineD3DDeviceParent_Release
(
wined3d_device_parent
);
IWineD3D_Release
(
wined3d
);
LeaveCriticalSection
(
&
dxgi_cs
);
if
(
FAILED
(
hr
))
{
WARN
(
"Failed to create a WineD3D device, returning %#x
\n
"
,
hr
);
goto
fail
;
WARN
(
"Failed to initialize device, hr %#x.
\n
"
,
hr
);
HeapFree
(
GetProcessHeap
(),
0
,
dxgi_device
);
*
device
=
NULL
;
return
hr
;
}
TRACE
(
"Created device %p.
\n
"
,
dxgi_device
);
*
device
=
dxgi_device
;
return
hr
;
fail:
if
(
dxgi_device
->
wined3d_device
)
{
EnterCriticalSection
(
&
dxgi_cs
);
IWineD3DDevice_Release
(
dxgi_device
->
wined3d_device
);
LeaveCriticalSection
(
&
dxgi_cs
);
}
if
(
dxgi_device
->
factory
)
IWineDXGIFactory_Release
(
dxgi_device
->
factory
);
if
(
dxgi_device
->
child_layer
)
IUnknown_Release
(
dxgi_device
->
child_layer
);
HeapFree
(
GetProcessHeap
(),
0
,
dxgi_device
);
*
device
=
NULL
;
return
hr
;
return
S_OK
;
}
HRESULT
WINAPI
DXGID3D10RegisterLayers
(
const
struct
dxgi_device_layer
*
layers
,
UINT
layer_count
)
...
...
dlls/dxgi/dxgi_private.h
View file @
15b6bc61
...
...
@@ -36,6 +36,38 @@
extern
CRITICAL_SECTION
dxgi_cs
DECLSPEC_HIDDEN
;
/* Layered device */
enum
dxgi_device_layer_id
{
DXGI_DEVICE_LAYER_DEBUG1
=
0x8
,
DXGI_DEVICE_LAYER_THREAD_SAFE
=
0x10
,
DXGI_DEVICE_LAYER_DEBUG2
=
0x20
,
DXGI_DEVICE_LAYER_SWITCH_TO_REF
=
0x30
,
DXGI_DEVICE_LAYER_D3D10_DEVICE
=
0xffffffff
,
};
struct
layer_get_size_args
{
DWORD
unknown0
;
DWORD
unknown1
;
DWORD
*
unknown2
;
DWORD
*
unknown3
;
IDXGIAdapter
*
adapter
;
WORD
interface_major
;
WORD
interface_minor
;
WORD
version_build
;
WORD
version_revision
;
};
struct
dxgi_device_layer
{
enum
dxgi_device_layer_id
id
;
HRESULT
(
WINAPI
*
init
)(
enum
dxgi_device_layer_id
id
,
DWORD
*
count
,
DWORD
*
values
);
UINT
(
WINAPI
*
get_size
)(
enum
dxgi_device_layer_id
id
,
struct
layer_get_size_args
*
args
,
DWORD
unknown0
);
HRESULT
(
WINAPI
*
create
)(
enum
dxgi_device_layer_id
id
,
void
**
layer_base
,
DWORD
unknown0
,
void
*
device_object
,
REFIID
riid
,
void
**
device_layer
);
};
/* TRACE helper functions */
const
char
*
debug_dxgi_format
(
DXGI_FORMAT
format
)
DECLSPEC_HIDDEN
;
...
...
@@ -53,7 +85,6 @@ struct dxgi_factory
};
/* IDXGIDevice */
extern
const
struct
IWineDXGIDeviceVtbl
dxgi_device_vtbl
DECLSPEC_HIDDEN
;
struct
dxgi_device
{
const
struct
IWineDXGIDeviceVtbl
*
vtbl
;
...
...
@@ -63,6 +94,9 @@ struct dxgi_device
IWineDXGIFactory
*
factory
;
};
HRESULT
dxgi_device_init
(
struct
dxgi_device
*
device
,
struct
dxgi_device_layer
*
layer
,
IDXGIFactory
*
factory
,
IDXGIAdapter
*
adapter
)
DECLSPEC_HIDDEN
;
/* IDXGIOutput */
struct
dxgi_output
{
...
...
@@ -104,36 +138,4 @@ struct dxgi_surface
LONG
refcount
;
};
/* Layered device */
enum
dxgi_device_layer_id
{
DXGI_DEVICE_LAYER_DEBUG1
=
0x8
,
DXGI_DEVICE_LAYER_THREAD_SAFE
=
0x10
,
DXGI_DEVICE_LAYER_DEBUG2
=
0x20
,
DXGI_DEVICE_LAYER_SWITCH_TO_REF
=
0x30
,
DXGI_DEVICE_LAYER_D3D10_DEVICE
=
0xffffffff
,
};
struct
layer_get_size_args
{
DWORD
unknown0
;
DWORD
unknown1
;
DWORD
*
unknown2
;
DWORD
*
unknown3
;
IDXGIAdapter
*
adapter
;
WORD
interface_major
;
WORD
interface_minor
;
WORD
version_build
;
WORD
version_revision
;
};
struct
dxgi_device_layer
{
enum
dxgi_device_layer_id
id
;
HRESULT
(
WINAPI
*
init
)(
enum
dxgi_device_layer_id
id
,
DWORD
*
count
,
DWORD
*
values
);
UINT
(
WINAPI
*
get_size
)(
enum
dxgi_device_layer_id
id
,
struct
layer_get_size_args
*
args
,
DWORD
unknown0
);
HRESULT
(
WINAPI
*
create
)(
enum
dxgi_device_layer_id
id
,
void
**
layer_base
,
DWORD
unknown0
,
void
*
device_object
,
REFIID
riid
,
void
**
device_layer
);
};
#endif
/* __WINE_DXGI_PRIVATE_H */
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment