Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
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-cw
Commits
1c14c0d2
Commit
1c14c0d2
authored
Jan 09, 2012
by
Matteo Bruni
Committed by
Alexandre Julliard
Jan 10, 2012
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
wined3d: Don't use separate location flags for depth buffers.
parent
e4c0d6ab
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
29 additions
and
21 deletions
+29
-21
device.c
dlls/wined3d/device.c
+8
-5
drawprim.c
dlls/wined3d/drawprim.c
+2
-3
surface.c
dlls/wined3d/surface.c
+15
-8
wined3d_private.h
dlls/wined3d/wined3d_private.h
+4
-5
No files found.
dlls/wined3d/device.c
View file @
1c14c0d2
...
...
@@ -571,8 +571,9 @@ void device_switch_onscreen_ds(struct wined3d_device *device,
{
if
(
device
->
onscreen_depth_stencil
)
{
surface_load_ds_location
(
device
->
onscreen_depth_stencil
,
context
,
SFLAG_DS_OFFSCREEN
);
surface_modify_ds_location
(
device
->
onscreen_depth_stencil
,
SFLAG_DS_OFFSCREEN
,
surface_load_ds_location
(
device
->
onscreen_depth_stencil
,
context
,
SFLAG_INTEXTURE
);
surface_modify_ds_location
(
device
->
onscreen_depth_stencil
,
SFLAG_INTEXTURE
,
device
->
onscreen_depth_stencil
->
ds_current_size
.
cx
,
device
->
onscreen_depth_stencil
->
ds_current_size
.
cy
);
wined3d_surface_decref
(
device
->
onscreen_depth_stencil
);
...
...
@@ -696,9 +697,9 @@ HRESULT device_clear_render_targets(struct wined3d_device *device, UINT rt_count
if
(
flags
&
WINED3DCLEAR_ZBUFFER
)
{
DWORD
location
=
render_offscreen
?
SFLAG_DS_OFFSCREEN
:
SFLAG_DS_ONSCREEN
;
DWORD
location
=
render_offscreen
?
fb
->
depth_stencil
->
draw_binding
:
SFLAG_INDRAWABLE
;
if
(
location
==
SFLAG_DS_ONSCREEN
&&
fb
->
depth_stencil
!=
device
->
onscreen_depth_stencil
)
if
(
!
render_offscreen
&&
fb
->
depth_stencil
!=
device
->
onscreen_depth_stencil
)
device_switch_onscreen_ds
(
device
,
context
,
fb
->
depth_stencil
);
prepare_ds_clear
(
fb
->
depth_stencil
,
context
,
location
,
draw_rect
,
rect_count
,
clear_rect
);
}
...
...
@@ -729,7 +730,9 @@ HRESULT device_clear_render_targets(struct wined3d_device *device, UINT rt_count
if
(
flags
&
WINED3DCLEAR_ZBUFFER
)
{
surface_modify_location
(
fb
->
depth_stencil
,
fb
->
depth_stencil
->
draw_binding
,
TRUE
);
DWORD
location
=
render_offscreen
?
fb
->
depth_stencil
->
draw_binding
:
SFLAG_INDRAWABLE
;
surface_modify_location
(
fb
->
depth_stencil
,
location
,
TRUE
);
glDepthMask
(
GL_TRUE
);
context_invalidate_state
(
context
,
STATE_RENDER
(
WINED3D_RS_ZWRITEENABLE
));
...
...
dlls/wined3d/drawprim.c
View file @
1c14c0d2
...
...
@@ -615,13 +615,13 @@ void drawPrimitive(struct wined3d_device *device, UINT index_count, UINT StartId
* Z-compare function into account, but we could skip loading the
* depthstencil for D3DCMP_NEVER and D3DCMP_ALWAYS as well. Also note
* that we never copy the stencil data.*/
DWORD
location
=
context
->
render_offscreen
?
SFLAG_DS_OFFSCREEN
:
SFLAG_DS_ONSCREEN
;
DWORD
location
=
context
->
render_offscreen
?
device
->
fb
.
depth_stencil
->
draw_binding
:
SFLAG_INDRAWABLE
;
if
(
state
->
render_states
[
WINED3D_RS_ZWRITEENABLE
]
||
state
->
render_states
[
WINED3D_RS_ZENABLE
])
{
struct
wined3d_surface
*
ds
=
device
->
fb
.
depth_stencil
;
RECT
current_rect
,
draw_rect
,
r
;
if
(
location
==
SFLAG_DS_ONSCREEN
&&
ds
!=
device
->
onscreen_depth_stencil
)
if
(
!
context
->
render_offscreen
&&
ds
!=
device
->
onscreen_depth_stencil
)
device_switch_onscreen_ds
(
device
,
context
,
ds
);
if
(
ds
->
flags
&
location
)
...
...
@@ -638,7 +638,6 @@ void drawPrimitive(struct wined3d_device *device, UINT index_count, UINT StartId
if
(
state
->
render_states
[
WINED3D_RS_ZWRITEENABLE
])
{
surface_modify_ds_location
(
ds
,
location
,
ds
->
ds_current_size
.
cx
,
ds
->
ds_current_size
.
cy
);
surface_modify_location
(
ds
,
ds
->
draw_binding
,
TRUE
);
}
}
}
...
...
dlls/wined3d/surface.c
View file @
1c14c0d2
...
...
@@ -1395,9 +1395,8 @@ static HRESULT wined3d_surface_depth_blt(struct wined3d_surface *src_surface, co
wined3d_surface_depth_blt_fbo
(
device
,
src_surface
,
src_rect
,
dst_surface
,
dst_rect
);
surface_modify_ds_location
(
dst_surface
,
SFLAG_
DS_OFFSCREEN
,
surface_modify_ds_location
(
dst_surface
,
SFLAG_
INTEXTURE
,
dst_surface
->
ds_current_size
.
cx
,
dst_surface
->
ds_current_size
.
cy
);
surface_modify_location
(
dst_surface
,
SFLAG_INTEXTURE
,
TRUE
);
return
WINED3D_OK
;
}
...
...
@@ -5557,12 +5556,19 @@ void surface_modify_ds_location(struct wined3d_surface *surface,
{
TRACE
(
"surface %p, new location %#x, w %u, h %u.
\n
"
,
surface
,
location
,
w
,
h
);
if
(
location
&
~
SFLAG_
DS_
LOCATIONS
)
if
(
location
&
~
SFLAG_LOCATIONS
)
FIXME
(
"Invalid location (%#x) specified.
\n
"
,
location
);
if
(
!
(
surface
->
flags
&
SFLAG_ALLOCATED
))
location
&=
~
SFLAG_INTEXTURE
;
if
(
!
(
surface
->
rb_resolved
))
location
&=
~
SFLAG_INRB_RESOLVED
;
if
(
!
(
surface
->
rb_multisample
))
location
&=
~
SFLAG_INRB_MULTISAMPLE
;
surface
->
ds_current_size
.
cx
=
w
;
surface
->
ds_current_size
.
cy
=
h
;
surface
->
flags
&=
~
SFLAG_
DS_
LOCATIONS
;
surface
->
flags
&=
~
SFLAG_LOCATIONS
;
surface
->
flags
|=
location
;
}
...
...
@@ -5603,7 +5609,7 @@ void surface_load_ds_location(struct wined3d_surface *surface, struct wined3d_co
return
;
}
if
(
!
(
surface
->
flags
&
SFLAG_
DS_
LOCATIONS
))
if
(
!
(
surface
->
flags
&
SFLAG_LOCATIONS
))
{
/* This mostly happens when a depth / stencil is used without being
* cleared first. In principle we could upload from sysmem, or
...
...
@@ -5617,7 +5623,7 @@ void surface_load_ds_location(struct wined3d_surface *surface, struct wined3d_co
return
;
}
if
(
location
==
SFLAG_
DS_OFFSCREEN
)
if
(
location
==
SFLAG_
INTEXTURE
)
{
GLint
old_binding
=
0
;
GLenum
bind_target
;
...
...
@@ -5684,7 +5690,7 @@ void surface_load_ds_location(struct wined3d_surface *surface, struct wined3d_co
if
(
wined3d_settings
.
strict_draw_ordering
)
wglFlush
();
/* Flush to ensure ordering across contexts. */
}
else
if
(
location
==
SFLAG_
DS_ONSCREEN
)
else
if
(
location
==
SFLAG_
INDRAWABLE
)
{
TRACE
(
"Copying depth texture to onscreen depth buffer.
\n
"
);
...
...
@@ -5721,6 +5727,7 @@ void surface_modify_location(struct wined3d_surface *surface, DWORD location, BO
surface
,
debug_surflocation
(
location
),
persistent
);
if
(
wined3d_settings
.
offscreen_rendering_mode
==
ORM_FBO
&&
surface_is_offscreen
(
surface
)
&&
!
(
surface
->
resource
.
usage
&
WINED3DUSAGE_DEPTHSTENCIL
)
&&
(
location
&
SFLAG_INDRAWABLE
))
ERR
(
"Trying to invalidate the SFLAG_INDRAWABLE location of an offscreen surface.
\n
"
);
...
...
@@ -6112,7 +6119,7 @@ HRESULT surface_load_location(struct wined3d_surface *surface, DWORD location, c
if
(
location
==
SFLAG_INTEXTURE
)
{
struct
wined3d_context
*
context
=
context_acquire
(
device
,
NULL
);
surface_load_ds_location
(
surface
,
context
,
SFLAG_DS_OFFSCREEN
);
surface_load_ds_location
(
surface
,
context
,
location
);
context_release
(
context
);
return
WINED3D_OK
;
}
...
...
dlls/wined3d/wined3d_private.h
View file @
1c14c0d2
...
...
@@ -2153,8 +2153,6 @@ void flip_surface(struct wined3d_surface *front, struct wined3d_surface *back) D
#define SFLAG_INDRAWABLE 0x00100000
/* The GL drawable is current. */
#define SFLAG_INRB_MULTISAMPLE 0x00200000
/* The multisample renderbuffer is current. */
#define SFLAG_INRB_RESOLVED 0x00400000
/* The resolved renderbuffer is current. */
#define SFLAG_DS_ONSCREEN 0x00800000
/* This is a depth / stencil surface, last modified onscreen. */
#define SFLAG_DS_OFFSCREEN 0x01000000
/* This is a depth / stencil surface, last modified offscreen. */
#define SFLAG_PIN_SYSMEM 0x02000000
/* Keep the surface in sysmem, at the same address. */
/* In some conditions the surface memory must not be freed:
...
...
@@ -2181,9 +2179,10 @@ void flip_surface(struct wined3d_surface *front, struct wined3d_surface *back) D
SFLAG_INRB_MULTISAMPLE | \
SFLAG_INRB_RESOLVED)
#define SFLAG_DS_LOCATIONS (SFLAG_DS_ONSCREEN | \
SFLAG_DS_OFFSCREEN)
#define SFLAG_DS_DISCARDED SFLAG_DS_LOCATIONS
#define SFLAG_DS_DISCARDED (SFLAG_INTEXTURE | \
SFLAG_INDRAWABLE | \
SFLAG_INRB_MULTISAMPLE | \
SFLAG_INRB_RESOLVED)
typedef
enum
{
NO_CONVERSION
,
...
...
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