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
f753ff90
Commit
f753ff90
authored
Aug 19, 2014
by
Henri Verbeet
Committed by
Alexandre Julliard
Aug 19, 2014
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
wined3d: Replace surface_is_offscreen() with wined3d_resource_is_offscreen().
Introducing rendertarget views will (eventually) allow rendering to 3D textures and buffers.
parent
694cdcc4
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
46 additions
and
42 deletions
+46
-42
arb_program_shader.c
dlls/wined3d/arb_program_shader.c
+2
-2
context.c
dlls/wined3d/context.c
+4
-4
resource.c
dlls/wined3d/resource.c
+24
-0
surface.c
dlls/wined3d/surface.c
+14
-33
wined3d_private.h
dlls/wined3d/wined3d_private.h
+2
-3
No files found.
dlls/wined3d/arb_program_shader.c
View file @
f753ff90
...
...
@@ -7645,7 +7645,7 @@ HRESULT arbfp_blit_surface(struct wined3d_device *device, DWORD filter,
if
(
wined3d_settings
.
offscreen_rendering_mode
!=
ORM_FBO
&&
(
src_surface
->
locations
&
(
WINED3D_LOCATION_TEXTURE_RGB
|
WINED3D_LOCATION_DRAWABLE
))
==
WINED3D_LOCATION_DRAWABLE
&&
!
surface_is_offscreen
(
src_surfa
ce
))
&&
!
wined3d_resource_is_offscreen
(
&
src_surface
->
resour
ce
))
{
/* Without FBO blits transferring from the drawable to the texture is
* expensive, because we have to flip the data in sysmem. Since we can
...
...
@@ -7662,7 +7662,7 @@ HRESULT arbfp_blit_surface(struct wined3d_device *device, DWORD filter,
context_apply_blit_state
(
context
,
device
);
if
(
!
surface_is_offscreen
(
dst_surfa
ce
))
if
(
!
wined3d_resource_is_offscreen
(
&
dst_surface
->
resour
ce
))
surface_translate_drawable_coords
(
dst_surface
,
context
->
win_handle
,
&
dst_rect
);
arbfp_blit_set
(
device
->
blit_priv
,
context
,
src_surface
);
...
...
dlls/wined3d/context.c
View file @
f753ff90
...
...
@@ -1590,7 +1590,7 @@ struct wined3d_context *context_create(struct wined3d_swapchain *swapchain,
ret
->
current_rt
=
target
;
ret
->
tid
=
GetCurrentThreadId
();
ret
->
render_offscreen
=
surface_is_offscreen
(
target
);
ret
->
render_offscreen
=
wined3d_resource_is_offscreen
(
&
target
->
resource
);
ret
->
draw_buffers_mask
=
context_generate_rt_mask
(
GL_BACK
);
ret
->
valid
=
1
;
...
...
@@ -2316,7 +2316,7 @@ BOOL context_apply_clear_state(struct wined3d_context *context, const struct win
{
context_validate_onscreen_formats
(
context
,
fb
->
depth_stencil
);
if
(
!
rt_count
||
surface_is_offscreen
(
rts
[
0
]
))
if
(
!
rt_count
||
wined3d_resource_is_offscreen
(
&
rts
[
0
]
->
resource
))
{
for
(
i
=
0
;
i
<
rt_count
;
++
i
)
{
...
...
@@ -2349,7 +2349,7 @@ BOOL context_apply_clear_state(struct wined3d_context *context, const struct win
}
}
else
if
(
wined3d_settings
.
offscreen_rendering_mode
==
ORM_FBO
&&
(
!
rt_count
||
surface_is_offscreen
(
rts
[
0
]
)))
&&
(
!
rt_count
||
wined3d_resource_is_offscreen
(
&
rts
[
0
]
->
resource
)))
{
for
(
i
=
0
;
i
<
rt_count
;
++
i
)
{
...
...
@@ -3030,7 +3030,7 @@ static void context_setup_target(struct wined3d_context *context, struct wined3d
{
BOOL
old_render_offscreen
=
context
->
render_offscreen
,
render_offscreen
;
render_offscreen
=
surface_is_offscreen
(
target
);
render_offscreen
=
wined3d_resource_is_offscreen
(
&
target
->
resource
);
if
(
context
->
current_rt
==
target
&&
render_offscreen
==
old_render_offscreen
)
return
;
/* To compensate the lack of format switching with some offscreen rendering methods and on onscreen buffers
...
...
dlls/wined3d/resource.c
View file @
f753ff90
...
...
@@ -299,3 +299,27 @@ GLenum wined3d_resource_gl_legacy_map_flags(DWORD d3d_flags)
return
GL_WRITE_ONLY_ARB
;
return
GL_READ_WRITE_ARB
;
}
BOOL
wined3d_resource_is_offscreen
(
struct
wined3d_resource
*
resource
)
{
struct
wined3d_swapchain
*
swapchain
;
if
(
resource
->
type
==
WINED3D_RTYPE_TEXTURE
)
resource
=
wined3d_texture_get_sub_resource
(
wined3d_texture_from_resource
(
resource
),
0
);
/* Only surface resources can be onscreen. */
if
(
resource
->
type
!=
WINED3D_RTYPE_SURFACE
)
return
TRUE
;
/* Not on a swapchain - must be offscreen */
if
(
!
(
swapchain
=
wined3d_surface_from_resource
(
resource
)
->
swapchain
))
return
TRUE
;
/* The front buffer is always onscreen */
if
(
resource
==
&
swapchain
->
front_buffer
->
container
->
resource
)
return
FALSE
;
/* If the swapchain is rendered to an FBO, the backbuffer is
* offscreen, otherwise onscreen */
return
swapchain
->
render_to_fbo
;
}
dlls/wined3d/surface.c
View file @
f753ff90
...
...
@@ -114,7 +114,7 @@ void wined3d_surface_destroy(struct wined3d_surface *surface)
void
surface_update_draw_binding
(
struct
wined3d_surface
*
surface
)
{
if
(
!
surface_is_offscreen
(
surfa
ce
)
||
wined3d_settings
.
offscreen_rendering_mode
!=
ORM_FBO
)
if
(
!
wined3d_resource_is_offscreen
(
&
surface
->
resour
ce
)
||
wined3d_settings
.
offscreen_rendering_mode
!=
ORM_FBO
)
surface
->
resource
.
draw_binding
=
WINED3D_LOCATION_DRAWABLE
;
else
if
(
surface
->
resource
.
multisample_type
)
surface
->
resource
.
draw_binding
=
WINED3D_LOCATION_RB_MULTISAMPLE
;
...
...
@@ -1516,7 +1516,8 @@ static void surface_upload_data(struct wined3d_surface *surface, const struct wi
if
(
srgb
)
internal
=
format
->
glGammaInternal
;
else
if
(
surface
->
resource
.
usage
&
WINED3DUSAGE_RENDERTARGET
&&
surface_is_offscreen
(
surface
))
else
if
(
surface
->
resource
.
usage
&
WINED3DUSAGE_RENDERTARGET
&&
wined3d_resource_is_offscreen
(
&
surface
->
resource
))
internal
=
format
->
rtInternal
;
else
internal
=
format
->
glInternal
;
...
...
@@ -1858,17 +1859,12 @@ static void surface_allocate_surface(struct wined3d_surface *surface, const stru
GLenum
internal
;
if
(
srgb
)
{
internal
=
format
->
glGammaInternal
;
}
else
if
(
surface
->
resource
.
usage
&
WINED3DUSAGE_RENDERTARGET
&&
surface_is_offscreen
(
surface
))
{
else
if
(
surface
->
resource
.
usage
&
WINED3DUSAGE_RENDERTARGET
&&
wined3d_resource_is_offscreen
(
&
surface
->
resource
))
internal
=
format
->
rtInternal
;
}
else
{
internal
=
format
->
glInternal
;
}
if
(
!
internal
)
FIXME
(
"No GL internal format for format %s.
\n
"
,
debug_d3dformat
(
format
->
id
));
...
...
@@ -3056,7 +3052,7 @@ static void read_from_framebuffer(struct wined3d_surface *surface, DWORD dst_loc
* There is no need to keep track of the current read buffer or reset it, every part of the code
* that reads sets the read buffer as desired.
*/
if
(
surface_is_offscreen
(
surfa
ce
))
if
(
wined3d_resource_is_offscreen
(
&
surface
->
resour
ce
))
{
/* Mapping the primary render target which is not on a swapchain.
* Read from the back buffer. */
...
...
@@ -3155,7 +3151,7 @@ void surface_load_fb_texture(struct wined3d_surface *surface, BOOL srgb)
TRACE
(
"Reading back offscreen render target %p.
\n
"
,
surface
);
if
(
surface_is_offscreen
(
surfa
ce
))
if
(
wined3d_resource_is_offscreen
(
&
surface
->
resour
ce
))
gl_info
->
gl_ops
.
gl
.
p_glReadBuffer
(
device
->
offscreenBuffer
);
else
gl_info
->
gl_ops
.
gl
.
p_glReadBuffer
(
surface_get_gl_buffer
(
surface
));
...
...
@@ -3522,7 +3518,7 @@ static void fb_copy_to_texture_direct(struct wined3d_surface *dst_surface, struc
/* Bind the target texture */
context_bind_texture
(
context
,
dst_surface
->
container
->
target
,
dst_surface
->
container
->
texture_rgb
.
name
);
if
(
surface_is_offscreen
(
src_surfa
ce
))
if
(
wined3d_resource_is_offscreen
(
&
src_surface
->
resour
ce
))
{
TRACE
(
"Reading from an offscreen target
\n
"
);
upsidedown
=
!
upsidedown
;
...
...
@@ -3628,7 +3624,7 @@ static void fb_copy_to_texture_hwstretch(struct wined3d_surface *dst_surface, st
context_apply_blit_state
(
context
,
device
);
wined3d_texture_load
(
dst_surface
->
container
,
context
,
FALSE
);
src_offscreen
=
surface_is_offscreen
(
src_surfa
ce
);
src_offscreen
=
wined3d_resource_is_offscreen
(
&
src_surface
->
resour
ce
);
noBackBufferBackup
=
src_offscreen
&&
wined3d_settings
.
offscreen_rendering_mode
==
ORM_FBO
;
if
(
!
noBackBufferBackup
&&
!
src_surface
->
container
->
texture_rgb
.
name
)
{
...
...
@@ -3927,7 +3923,7 @@ static void surface_blt_to_drawable(const struct wined3d_device *device,
/* Activate the destination context, set it up for blitting */
context_apply_blit_state
(
context
,
device
);
if
(
!
surface_is_offscreen
(
dst_surfa
ce
))
if
(
!
wined3d_resource_is_offscreen
(
&
dst_surface
->
resour
ce
))
surface_translate_drawable_coords
(
dst_surface
,
context
->
win_handle
,
&
dst_rect
);
device
->
blitter
->
set_shader
(
device
->
blit_priv
,
context
,
src_surface
);
...
...
@@ -4527,7 +4523,8 @@ static HRESULT surface_load_drawable(struct wined3d_surface *surface,
{
RECT
r
;
if
(
wined3d_settings
.
offscreen_rendering_mode
==
ORM_FBO
&&
surface_is_offscreen
(
surface
))
if
(
wined3d_settings
.
offscreen_rendering_mode
==
ORM_FBO
&&
wined3d_resource_is_offscreen
(
&
surface
->
resource
))
{
ERR
(
"Trying to load offscreen surface into WINED3D_LOCATION_DRAWABLE.
\n
"
);
return
WINED3DERR_INVALIDCALL
;
...
...
@@ -4555,7 +4552,7 @@ static HRESULT surface_load_texture(struct wined3d_surface *surface,
BYTE
*
mem
=
NULL
;
if
(
wined3d_settings
.
offscreen_rendering_mode
!=
ORM_FBO
&&
surface_is_offscreen
(
surfa
ce
)
&&
wined3d_resource_is_offscreen
(
&
surface
->
resour
ce
)
&&
(
surface
->
locations
&
WINED3D_LOCATION_DRAWABLE
))
{
surface_load_fb_texture
(
surface
,
srgb
);
...
...
@@ -4819,22 +4816,6 @@ HRESULT surface_load_location(struct wined3d_surface *surface, DWORD location)
return
WINED3D_OK
;
}
BOOL
surface_is_offscreen
(
const
struct
wined3d_surface
*
surface
)
{
struct
wined3d_swapchain
*
swapchain
;
/* Not on a swapchain - must be offscreen */
if
(
!
(
swapchain
=
surface
->
swapchain
))
return
TRUE
;
/* The front buffer is always onscreen */
if
(
surface
==
swapchain
->
front_buffer
)
return
FALSE
;
/* If the swapchain is rendered to an FBO, the backbuffer is
* offscreen, otherwise onscreen */
return
swapchain
->
render_to_fbo
;
}
static
HRESULT
ffp_blit_alloc
(
struct
wined3d_device
*
device
)
{
return
WINED3D_OK
;
}
/* Context activation is done by the caller. */
static
void
ffp_blit_free
(
struct
wined3d_device
*
device
)
{
}
...
...
@@ -5857,7 +5838,7 @@ HRESULT CDECL wined3d_surface_blt(struct wined3d_surface *dst_surface, const REC
if
(
SUCCEEDED
(
surface_upload_from_surface
(
dst_surface
,
&
dst_point
,
src_surface
,
&
src_rect
)))
{
if
(
!
surface_is_offscreen
(
dst_surfa
ce
))
if
(
!
wined3d_resource_is_offscreen
(
&
dst_surface
->
resour
ce
))
surface_load_location
(
dst_surface
,
dst_surface
->
resource
.
draw_binding
);
return
WINED3D_OK
;
}
...
...
dlls/wined3d/wined3d_private.h
View file @
f753ff90
...
...
@@ -2061,10 +2061,10 @@ HRESULT resource_init(struct wined3d_resource *resource, struct wined3d_device *
void
resource_unload
(
struct
wined3d_resource
*
resource
)
DECLSPEC_HIDDEN
;
BOOL
wined3d_resource_allocate_sysmem
(
struct
wined3d_resource
*
resource
)
DECLSPEC_HIDDEN
;
void
wined3d_resource_free_sysmem
(
struct
wined3d_resource
*
resource
)
DECLSPEC_HIDDEN
;
DWORD
wined3d_resource_sanitize_map_flags
(
const
struct
wined3d_resource
*
resource
,
DWORD
flags
)
DECLSPEC_HIDDEN
;
GLbitfield
wined3d_resource_gl_map_flags
(
DWORD
d3d_flags
)
DECLSPEC_HIDDEN
;
GLenum
wined3d_resource_gl_legacy_map_flags
(
DWORD
d3d_flags
)
DECLSPEC_HIDDEN
;
BOOL
wined3d_resource_is_offscreen
(
struct
wined3d_resource
*
resource
)
DECLSPEC_HIDDEN
;
DWORD
wined3d_resource_sanitize_map_flags
(
const
struct
wined3d_resource
*
resource
,
DWORD
flags
)
DECLSPEC_HIDDEN
;
/* Tests show that the start address of resources is 32 byte aligned */
#define RESOURCE_ALIGNMENT 16
...
...
@@ -2290,7 +2290,6 @@ GLenum surface_get_gl_buffer(const struct wined3d_surface *surface) DECLSPEC_HID
void
surface_get_drawable_size
(
const
struct
wined3d_surface
*
surface
,
const
struct
wined3d_context
*
context
,
unsigned
int
*
width
,
unsigned
int
*
height
)
DECLSPEC_HIDDEN
;
void
surface_invalidate_location
(
struct
wined3d_surface
*
surface
,
DWORD
location
)
DECLSPEC_HIDDEN
;
BOOL
surface_is_offscreen
(
const
struct
wined3d_surface
*
surface
)
DECLSPEC_HIDDEN
;
void
surface_load
(
struct
wined3d_surface
*
surface
,
BOOL
srgb
)
DECLSPEC_HIDDEN
;
void
surface_load_ds_location
(
struct
wined3d_surface
*
surface
,
struct
wined3d_context
*
context
,
DWORD
location
)
DECLSPEC_HIDDEN
;
...
...
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