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
3b0e37a0
Commit
3b0e37a0
authored
Mar 01, 2017
by
Henri Verbeet
Committed by
Alexandre Julliard
Mar 01, 2017
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
wined3d: Send swapchain context creation through the command stream.
Signed-off-by:
Henri Verbeet
<
hverbeet@codeweavers.com
>
Signed-off-by:
Alexandre Julliard
<
julliard@winehq.org
>
parent
8952040a
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
45 additions
and
41 deletions
+45
-41
swapchain.c
dlls/wined3d/swapchain.c
+45
-41
No files found.
dlls/wined3d/swapchain.c
View file @
3b0e37a0
...
...
@@ -782,6 +782,50 @@ static void wined3d_swapchain_apply_sample_count_override(const struct wined3d_s
*
quality
=
0
;
}
static
void
wined3d_swapchain_cs_init
(
void
*
object
)
{
struct
wined3d_swapchain
*
swapchain
=
object
;
const
struct
wined3d_gl_info
*
gl_info
;
unsigned
int
i
;
static
const
enum
wined3d_format_id
formats
[]
=
{
WINED3DFMT_D24_UNORM_S8_UINT
,
WINED3DFMT_D32_UNORM
,
WINED3DFMT_R24_UNORM_X8_TYPELESS
,
WINED3DFMT_D16_UNORM
,
WINED3DFMT_S1_UINT_D15_UNORM
,
};
gl_info
=
&
swapchain
->
device
->
adapter
->
gl_info
;
/* Without ORM_FBO, switching the depth/stencil format is hard. Always
* request a depth/stencil buffer in the likely case it's needed later. */
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
formats
);
++
i
)
{
swapchain
->
ds_format
=
wined3d_get_format
(
gl_info
,
formats
[
i
],
WINED3DUSAGE_DEPTHSTENCIL
);
if
((
swapchain
->
context
[
0
]
=
context_create
(
swapchain
,
swapchain
->
front_buffer
,
swapchain
->
ds_format
)))
break
;
TRACE
(
"Depth stencil format %s is not supported, trying next format.
\n
"
,
debug_d3dformat
(
formats
[
i
]));
}
if
(
!
swapchain
->
context
[
0
])
{
WARN
(
"Failed to create context.
\n
"
);
return
;
}
swapchain
->
num_contexts
=
1
;
if
(
wined3d_settings
.
offscreen_rendering_mode
!=
ORM_FBO
&&
(
!
swapchain
->
desc
.
enable_auto_depth_stencil
||
swapchain
->
desc
.
auto_depth_stencil_format
!=
swapchain
->
ds_format
->
id
))
FIXME
(
"Add OpenGL context recreation support.
\n
"
);
context_release
(
swapchain
->
context
[
0
]);
swapchain_update_swap_interval
(
swapchain
);
}
static
HRESULT
swapchain_init
(
struct
wined3d_swapchain
*
swapchain
,
struct
wined3d_device
*
device
,
struct
wined3d_swapchain_desc
*
desc
,
void
*
parent
,
const
struct
wined3d_parent_ops
*
parent_ops
)
{
...
...
@@ -908,17 +952,6 @@ static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, struct wined3
if
(
!
(
device
->
wined3d
->
flags
&
WINED3D_NO3D
))
{
static
const
enum
wined3d_format_id
formats
[]
=
{
WINED3DFMT_D24_UNORM_S8_UINT
,
WINED3DFMT_D32_UNORM
,
WINED3DFMT_R24_UNORM_X8_TYPELESS
,
WINED3DFMT_D16_UNORM
,
WINED3DFMT_S1_UINT_D15_UNORM
};
const
struct
wined3d_gl_info
*
gl_info
=
&
adapter
->
gl_info
;
swapchain
->
context
=
HeapAlloc
(
GetProcessHeap
(),
0
,
sizeof
(
*
swapchain
->
context
));
if
(
!
swapchain
->
context
)
{
...
...
@@ -927,42 +960,13 @@ static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, struct wined3
goto
err
;
}
/* In WGL both color, depth and stencil are features of a pixel format. In case of D3D they are separate.
* You are able to add a depth + stencil surface at a later stage when you need it.
* In order to support this properly in WineD3D we need the ability to recreate the opengl context and
* drawable when this is required. This is very tricky as we need to reapply ALL opengl states for the new
* context, need torecreate shaders, textures and other resources.
*
* The context manager already takes care of the state problem and for the other tasks code from Reset
* can be used. These changes are way to risky during the 1.0 code freeze which is taking place right now.
* Likely a lot of other new bugs will be exposed. For that reason request a depth stencil surface all the
* time. It can cause a slight performance hit but fixes a lot of regressions. A fixme reminds of that this
* issue needs to be fixed. */
for
(
i
=
0
;
i
<
(
sizeof
(
formats
)
/
sizeof
(
*
formats
));
i
++
)
{
swapchain
->
ds_format
=
wined3d_get_format
(
gl_info
,
formats
[
i
],
WINED3DUSAGE_DEPTHSTENCIL
);
swapchain
->
context
[
0
]
=
context_create
(
swapchain
,
swapchain
->
front_buffer
,
swapchain
->
ds_format
);
if
(
swapchain
->
context
[
0
])
break
;
TRACE
(
"Depth stencil format %s is not supported, trying next format
\n
"
,
debug_d3dformat
(
formats
[
i
]));
}
wined3d_cs_init_object
(
device
->
cs
,
wined3d_swapchain_cs_init
,
swapchain
);
if
(
!
swapchain
->
context
[
0
])
{
WARN
(
"Failed to create context.
\n
"
);
hr
=
WINED3DERR_NOTAVAILABLE
;
goto
err
;
}
swapchain
->
num_contexts
=
1
;
if
(
wined3d_settings
.
offscreen_rendering_mode
!=
ORM_FBO
&&
(
!
desc
->
enable_auto_depth_stencil
||
swapchain
->
desc
.
auto_depth_stencil_format
!=
swapchain
->
ds_format
->
id
))
{
FIXME
(
"Add OpenGL context recreation support to context_validate_onscreen_formats
\n
"
);
}
context_release
(
swapchain
->
context
[
0
]);
swapchain_update_swap_interval
(
swapchain
);
}
if
(
swapchain
->
desc
.
backbuffer_count
>
0
)
...
...
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