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
353b3ba6
Commit
353b3ba6
authored
Jan 14, 2014
by
Stefan Dösinger
Committed by
Alexandre Julliard
Jan 14, 2014
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
wined3d: Don't lock directly into the DIB.
parent
d5b72bbc
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
5 additions
and
47 deletions
+5
-47
surface.c
dlls/wined3d/surface.c
+3
-45
swapchain.c
dlls/wined3d/swapchain.c
+2
-0
wined3d_private.h
dlls/wined3d/wined3d_private.h
+0
-2
No files found.
dlls/wined3d/surface.c
View file @
353b3ba6
...
...
@@ -85,7 +85,6 @@ static void surface_cleanup(struct wined3d_surface *surface)
DeleteDC
(
surface
->
hDC
);
DeleteObject
(
surface
->
dib
.
DIBsection
);
surface
->
dib
.
bitmap_data
=
NULL
;
surface
->
resource
.
allocatedMemory
=
NULL
;
}
if
(
surface
->
overlay_dest
)
...
...
@@ -488,17 +487,6 @@ static HRESULT surface_create_dib_section(struct wined3d_surface *surface)
}
TRACE
(
"DIBSection at %p.
\n
"
,
surface
->
dib
.
bitmap_data
);
/* Copy the existing surface to the dib section. */
if
(
surface
->
resource
.
allocatedMemory
)
{
memcpy
(
surface
->
dib
.
bitmap_data
,
surface
->
resource
.
allocatedMemory
,
surface
->
resource
.
height
*
wined3d_surface_get_pitch
(
surface
));
}
else
if
(
!
surface
->
user_memory
)
{
/* This is to make maps read the GL texture although memory is allocated. */
surface
->
flags
&=
~
SFLAG_INSYSMEM
;
}
surface
->
dib
.
bitmap_size
=
b_info
->
bmiHeader
.
biSizeImage
;
HeapFree
(
GetProcessHeap
(),
0
,
b_info
);
...
...
@@ -1302,12 +1290,6 @@ HRESULT CDECL wined3d_surface_get_render_target_data(struct wined3d_surface *sur
/* Context activation is done by the caller. */
static
void
surface_remove_pbo
(
struct
wined3d_surface
*
surface
,
const
struct
wined3d_gl_info
*
gl_info
)
{
if
(
surface
->
flags
&
SFLAG_DIBSECTION
)
{
surface
->
resource
.
allocatedMemory
=
surface
->
dib
.
bitmap_data
;
}
else
{
if
(
!
surface
->
resource
.
heap_memory
)
wined3d_resource_allocate_sysmem
(
&
surface
->
resource
);
else
if
(
!
(
surface
->
flags
&
SFLAG_CLIENT
))
...
...
@@ -1315,7 +1297,6 @@ static void surface_remove_pbo(struct wined3d_surface *surface, const struct win
surface
,
surface
->
resource
.
heap_memory
,
surface
->
flags
);
surface
->
resource
.
allocatedMemory
=
surface
->
resource
.
heap_memory
;
}
GL_EXTCALL
(
glBindBufferARB
(
GL_PIXEL_UNPACK_BUFFER_ARB
,
surface
->
pbo
));
checkGLcall
(
"glBindBufferARB(GL_PIXEL_UNPACK_BUFFER, surface->pbo)"
);
...
...
@@ -1477,11 +1458,8 @@ static HRESULT gdi_surface_private_setup(struct wined3d_surface *surface)
/* Sysmem textures have memory already allocated - release it,
* this avoids an unnecessary memcpy. */
hr
=
surface_create_dib_section
(
surface
);
if
(
SUCCEEDED
(
hr
))
{
wined3d_resource_free_sysmem
(
&
surface
->
resource
);
surface
->
resource
.
allocatedMemory
=
surface
->
dib
.
bitmap_data
;
}
if
(
FAILED
(
hr
))
return
hr
;
/* We don't mind the nonpow2 stuff in GDI. */
surface
->
pow2Width
=
surface
->
resource
.
width
;
...
...
@@ -2801,9 +2779,8 @@ HRESULT CDECL wined3d_surface_update_desc(struct wined3d_surface *surface,
ERR
(
"Failed to create dib section, hr %#x.
\n
"
,
hr
);
return
hr
;
}
surface
->
resource
.
allocatedMemory
=
surface
->
dib
.
bitmap_data
;
}
else
if
(
!
surface_init_sysmem
(
surface
))
if
(
!
surface_init_sysmem
(
surface
))
return
E_OUTOFMEMORY
;
surface_validate_location
(
surface
,
surface
->
map_binding
);
...
...
@@ -3276,13 +3253,6 @@ HRESULT CDECL wined3d_surface_getdc(struct wined3d_surface *surface, HDC *dc)
hr
=
surface_create_dib_section
(
surface
);
if
(
FAILED
(
hr
))
return
WINED3DERR_INVALIDCALL
;
/* Use the DIB section from now on if we are not using a PBO or user memory. */
if
(
!
(
surface
->
flags
&
(
SFLAG_PBO
|
SFLAG_PIN_SYSMEM
)
||
surface
->
user_memory
))
{
wined3d_resource_free_sysmem
(
&
surface
->
resource
);
surface
->
resource
.
allocatedMemory
=
surface
->
dib
.
bitmap_data
;
}
}
/* Map the surface. */
...
...
@@ -3294,7 +3264,6 @@ HRESULT CDECL wined3d_surface_getdc(struct wined3d_surface *surface, HDC *dc)
}
surface
->
getdc_map_mem
=
map
.
data
;
if
(
surface
->
dib
.
bitmap_data
!=
surface
->
getdc_map_mem
)
memcpy
(
surface
->
dib
.
bitmap_data
,
surface
->
getdc_map_mem
,
surface
->
resource
.
size
);
if
(
surface
->
resource
.
format
->
id
==
WINED3DFMT_P8_UINT
...
...
@@ -3356,7 +3325,6 @@ HRESULT CDECL wined3d_surface_releasedc(struct wined3d_surface *surface, HDC dc)
return
WINEDDERR_NODC
;
}
if
(
surface
->
dib
.
bitmap_data
!=
surface
->
getdc_map_mem
)
memcpy
(
surface
->
getdc_map_mem
,
surface
->
dib
.
bitmap_data
,
surface
->
resource
.
size
);
/* We locked first, so unlock now. */
...
...
@@ -6450,16 +6418,6 @@ static HRESULT surface_init(struct wined3d_surface *surface, struct wined3d_text
return
hr
;
}
/* Similar to lockable rendertargets above, creating the DIB section
* during surface initialization prevents the sysmem pointer from changing
* after a wined3d_surface_getdc() call. */
if
((
desc
->
usage
&
WINED3DUSAGE_OWNDC
)
&&
!
surface
->
hDC
&&
SUCCEEDED
(
surface_create_dib_section
(
surface
)))
{
wined3d_resource_free_sysmem
(
&
surface
->
resource
);
surface
->
resource
.
allocatedMemory
=
surface
->
dib
.
bitmap_data
;
}
surface
->
map_binding
=
SFLAG_INSYSMEM
;
return
hr
;
...
...
dlls/wined3d/swapchain.c
View file @
353b3ba6
...
...
@@ -623,6 +623,8 @@ void x11_copy_to_screen(const struct wined3d_swapchain *swapchain, const RECT *r
TRACE
(
"Copying surface %p to screen.
\n
"
,
front
);
memcpy
(
front
->
dib
.
bitmap_data
,
front
->
resource
.
heap_memory
,
front
->
resource
.
size
);
src_dc
=
front
->
hDC
;
window
=
swapchain
->
win_handle
;
dst_dc
=
GetDCEx
(
window
,
0
,
DCX_CLIPSIBLINGS
|
DCX_CACHE
);
...
...
dlls/wined3d/wined3d_private.h
View file @
353b3ba6
...
...
@@ -2309,7 +2309,6 @@ void flip_surface(struct wined3d_surface *front, struct wined3d_surface *back) D
/* In some conditions the surface memory must not be freed:
* SFLAG_CONVERTED: Converting the data back would take too long
* SFLAG_DIBSECTION: The dib code manages the memory
* SFLAG_DYNLOCK: Avoid freeing the data for performance
* SFLAG_PBO: PBOs don't use 'normal' memory. It is either allocated by the driver or must be NULL.
* SFLAG_CLIENT: OpenGL uses our memory as backup
...
...
@@ -2317,7 +2316,6 @@ void flip_surface(struct wined3d_surface *front, struct wined3d_surface *back) D
#define SFLAG_DONOTFREE (SFLAG_CONVERTED | \
SFLAG_DYNLOCK | \
SFLAG_CLIENT | \
SFLAG_DIBSECTION | \
SFLAG_PBO | \
SFLAG_PIN_SYSMEM)
...
...
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