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
1e6a3896
Commit
1e6a3896
authored
Oct 13, 2006
by
Stefan Dösinger
Committed by
Alexandre Julliard
Oct 16, 2006
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
d3d8: Implement CopyRects with BltFast.
parent
a7395ade
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
55 additions
and
150 deletions
+55
-150
device.c
dlls/d3d8/device.c
+55
-4
device.c
dlls/wined3d/device.c
+0
-144
wined3d_interface.h
include/wine/wined3d_interface.h
+0
-2
No files found.
dlls/d3d8/device.c
View file @
1e6a3896
...
...
@@ -570,12 +570,63 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CreateImageSurface(LPDIRECT3DDEVICE8
}
static
HRESULT
WINAPI
IDirect3DDevice8Impl_CopyRects
(
LPDIRECT3DDEVICE8
iface
,
IDirect3DSurface8
*
pSourceSurface
,
CONST
RECT
*
pSourceRects
,
UINT
cRects
,
IDirect3DSurface8
*
pDestinationSurface
,
CONST
POINT
*
pDestPoints
)
{
IDirect3DDevice8Impl
*
This
=
(
IDirect3DDevice8Impl
*
)
iface
;
IDirect3DSurface8Impl
*
Source
=
(
IDirect3DSurface8Impl
*
)
pSourceSurface
;
IDirect3DSurface8Impl
*
Dest
=
(
IDirect3DSurface8Impl
*
)
pDestinationSurface
;
HRESULT
hr
=
WINED3D_OK
;
WINED3DFORMAT
srcFormat
,
destFormat
;
UINT
srcWidth
,
destWidth
;
UINT
srcHeight
,
destHeight
;
UINT
srcSize
;
WINED3DSURFACE_DESC
winedesc
;
TRACE
(
"(%p) pSrcSur=%p, pSourceRects=%p, cRects=%d, pDstSur=%p, pDestPtsArr=%p
\n
"
,
iface
,
pSourceSurface
,
pSourceRects
,
cRects
,
pDestinationSurface
,
pDestPoints
);
/* Check that the source texture is in WINED3DPOOL_SYSTEMMEM and the destination texture is in WINED3DPOOL_DEFAULT */
memset
(
&
winedesc
,
0
,
sizeof
(
winedesc
));
winedesc
.
Format
=
&
srcFormat
;
winedesc
.
Width
=
&
srcWidth
;
winedesc
.
Height
=
&
srcHeight
;
winedesc
.
Size
=
&
srcSize
;
IWineD3DSurface_GetDesc
(
Source
->
wineD3DSurface
,
&
winedesc
);
winedesc
.
Format
=
&
destFormat
;
winedesc
.
Width
=
&
destWidth
;
winedesc
.
Height
=
&
destHeight
;
winedesc
.
Size
=
NULL
;
IWineD3DSurface_GetDesc
(
Dest
->
wineD3DSurface
,
&
winedesc
);
/* Check that the source and destination formats match */
if
(
srcFormat
!=
destFormat
&&
WINED3DFMT_UNKNOWN
!=
destFormat
)
{
WARN
(
"(%p) source %p format must match the dest %p format, returning WINED3DERR_INVALIDCALL
\n
"
,
iface
,
pSourceSurface
,
pDestinationSurface
);
return
WINED3DERR_INVALIDCALL
;
}
else
if
(
WINED3DFMT_UNKNOWN
==
destFormat
)
{
TRACE
(
"(%p) : Converting destination surface from WINED3DFMT_UNKNOWN to the source format
\n
"
,
iface
);
IWineD3DSurface_SetFormat
(
Dest
->
wineD3DSurface
,
srcFormat
);
destFormat
=
srcFormat
;
}
TRACE
(
"(%p) Relay
\n
"
,
This
);
/* Quick if complete copy ... */
if
(
cRects
==
0
&&
pSourceRects
==
NULL
&&
pDestPoints
==
NULL
)
{
IWineD3DSurface_BltFast
(
Dest
->
wineD3DSurface
,
0
,
0
,
Source
->
wineD3DSurface
,
NULL
,
DDBLTFAST_NOCOLORKEY
);
}
else
{
unsigned
int
i
;
/* Copy rect by rect */
if
(
NULL
!=
pSourceRects
&&
NULL
!=
pDestPoints
)
{
for
(
i
=
0
;
i
<
cRects
;
++
i
)
{
IWineD3DSurface_BltFast
(
Dest
->
wineD3DSurface
,
pDestPoints
[
i
].
x
,
pDestPoints
[
i
].
y
,
Source
->
wineD3DSurface
,
(
RECT
*
)
&
pSourceRects
[
i
],
DDBLTFAST_NOCOLORKEY
);
}
}
else
{
for
(
i
=
0
;
i
<
cRects
;
++
i
)
{
IWineD3DSurface_BltFast
(
Dest
->
wineD3DSurface
,
0
,
0
,
Source
->
wineD3DSurface
,
(
RECT
*
)
&
pSourceRects
[
i
],
DDBLTFAST_NOCOLORKEY
);
}
}
}
return
IWineD3DDevice_CopyRects
(
This
->
WineD3DDevice
,
pSourceSurface
==
NULL
?
NULL
:
((
IDirect3DSurface8Impl
*
)
pSourceSurface
)
->
wineD3DSurface
,
pSourceRects
,
cRects
,
pDestinationSurface
==
NULL
?
NULL
:
((
IDirect3DSurface8Impl
*
)
pDestinationSurface
)
->
wineD3DSurface
,
pDestPoints
);
return
hr
;
}
static
HRESULT
WINAPI
IDirect3DDevice8Impl_UpdateTexture
(
LPDIRECT3DDEVICE8
iface
,
IDirect3DBaseTexture8
*
pSourceTexture
,
IDirect3DBaseTexture8
*
pDestinationTexture
)
{
...
...
dlls/wined3d/device.c
View file @
1e6a3896
...
...
@@ -6821,149 +6821,6 @@ static HRESULT WINAPI IWineD3DDeviceImpl_UpdateSurface(IWineD3DDevice *iface,
return
WINED3D_OK
;
}
/* Used by DirectX 8 */
static
HRESULT
WINAPI
IWineD3DDeviceImpl_CopyRects
(
IWineD3DDevice
*
iface
,
IWineD3DSurface
*
pSourceSurface
,
CONST
RECT
*
pSourceRectsArray
,
UINT
cRects
,
IWineD3DSurface
*
pDestinationSurface
,
CONST
POINT
*
pDestPointsArray
)
{
IWineD3DDeviceImpl
*
This
=
(
IWineD3DDeviceImpl
*
)
iface
;
HRESULT
hr
=
WINED3D_OK
;
WINED3DFORMAT
srcFormat
,
destFormat
;
UINT
srcWidth
,
destWidth
;
UINT
srcHeight
,
destHeight
;
UINT
srcSize
;
WINED3DSURFACE_DESC
winedesc
;
TRACE
(
"(%p) pSrcSur=%p, pSourceRects=%p, cRects=%d, pDstSur=%p, pDestPtsArr=%p
\n
"
,
This
,
pSourceSurface
,
pSourceRectsArray
,
cRects
,
pDestinationSurface
,
pDestPointsArray
);
/* Check that the source texture is in WINED3DPOOL_SYSTEMMEM and the destination texture is in WINED3DPOOL_DEFAULT */
memset
(
&
winedesc
,
0
,
sizeof
(
winedesc
));
winedesc
.
Format
=
&
srcFormat
;
winedesc
.
Width
=
&
srcWidth
;
winedesc
.
Height
=
&
srcHeight
;
winedesc
.
Size
=
&
srcSize
;
IWineD3DSurface_GetDesc
(
pSourceSurface
,
&
winedesc
);
winedesc
.
Format
=
&
destFormat
;
winedesc
.
Width
=
&
destWidth
;
winedesc
.
Height
=
&
destHeight
;
winedesc
.
Size
=
NULL
;
IWineD3DSurface_GetDesc
(
pDestinationSurface
,
&
winedesc
);
/* Check that the source and destination formats match */
if
(
srcFormat
!=
destFormat
&&
WINED3DFMT_UNKNOWN
!=
destFormat
)
{
WARN
(
"(%p) source %p format must match the dest %p format, returning WINED3DERR_INVALIDCALL
\n
"
,
This
,
pSourceSurface
,
pDestinationSurface
);
return
WINED3DERR_INVALIDCALL
;
}
else
if
(
WINED3DFMT_UNKNOWN
==
destFormat
)
{
TRACE
(
"(%p) : Converting destination surface from WINED3DFMT_UNKNOWN to the source format
\n
"
,
This
);
IWineD3DSurface_SetFormat
(
pDestinationSurface
,
srcFormat
);
destFormat
=
srcFormat
;
}
/* Quick if complete copy ... */
if
(
cRects
==
0
&&
pSourceRectsArray
==
NULL
&&
pDestPointsArray
==
NULL
)
{
if
(
srcWidth
==
destWidth
&&
srcHeight
==
destHeight
)
{
WINED3DLOCKED_RECT
lrSrc
;
WINED3DLOCKED_RECT
lrDst
;
IWineD3DSurface_LockRect
(
pSourceSurface
,
&
lrSrc
,
NULL
,
WINED3DLOCK_READONLY
);
IWineD3DSurface_LockRect
(
pDestinationSurface
,
&
lrDst
,
NULL
,
0L
);
TRACE
(
"Locked src and dst, Direct copy as surfaces are equal, w=%d, h=%d
\n
"
,
srcWidth
,
srcHeight
);
memcpy
(
lrDst
.
pBits
,
lrSrc
.
pBits
,
srcSize
);
IWineD3DSurface_UnlockRect
(
pSourceSurface
);
IWineD3DSurface_UnlockRect
(
pDestinationSurface
);
TRACE
(
"Unlocked src and dst
\n
"
);
}
else
{
FIXME
(
"Wanted to copy all surfaces but size not compatible, returning WINED3DERR_INVALIDCALL
\n
"
);
hr
=
WINED3DERR_INVALIDCALL
;
}
}
else
{
if
(
NULL
!=
pSourceRectsArray
&&
NULL
!=
pDestPointsArray
)
{
int
bytesPerPixel
=
((
IWineD3DSurfaceImpl
*
)
pSourceSurface
)
->
bytesPerPixel
;
unsigned
int
i
;
/* Copy rect by rect */
for
(
i
=
0
;
i
<
cRects
;
++
i
)
{
CONST
RECT
*
r
=
&
pSourceRectsArray
[
i
];
CONST
POINT
*
p
=
&
pDestPointsArray
[
i
];
int
copyperline
;
int
j
;
WINED3DLOCKED_RECT
lrSrc
;
WINED3DLOCKED_RECT
lrDst
;
RECT
dest_rect
;
TRACE
(
"Copying rect %d (%d,%d),(%d,%d) -> (%d,%d)
\n
"
,
i
,
r
->
left
,
r
->
top
,
r
->
right
,
r
->
bottom
,
p
->
x
,
p
->
y
);
if
(
srcFormat
==
WINED3DFMT_DXT1
)
{
copyperline
=
((
r
->
right
-
r
->
left
)
*
bytesPerPixel
)
/
2
;
/* DXT1 is half byte per pixel */
}
else
{
copyperline
=
((
r
->
right
-
r
->
left
)
*
bytesPerPixel
);
}
IWineD3DSurface_LockRect
(
pSourceSurface
,
&
lrSrc
,
r
,
WINED3DLOCK_READONLY
);
dest_rect
.
left
=
p
->
x
;
dest_rect
.
top
=
p
->
y
;
dest_rect
.
right
=
p
->
x
+
(
r
->
right
-
r
->
left
);
dest_rect
.
bottom
=
p
->
y
+
(
r
->
bottom
-
r
->
top
);
IWineD3DSurface_LockRect
(
pDestinationSurface
,
&
lrDst
,
&
dest_rect
,
0L
);
TRACE
(
"Locked src and dst
\n
"
);
/* Find where to start */
for
(
j
=
0
;
j
<
(
r
->
bottom
-
r
->
top
-
1
);
++
j
)
{
memcpy
((
char
*
)
lrDst
.
pBits
+
(
j
*
lrDst
.
Pitch
),
(
char
*
)
lrSrc
.
pBits
+
(
j
*
lrSrc
.
Pitch
),
copyperline
);
}
IWineD3DSurface_UnlockRect
(
pSourceSurface
);
IWineD3DSurface_UnlockRect
(
pDestinationSurface
);
TRACE
(
"Unlocked src and dst
\n
"
);
}
}
else
{
unsigned
int
i
;
int
bytesPerPixel
=
((
IWineD3DSurfaceImpl
*
)
pSourceSurface
)
->
bytesPerPixel
;
int
copyperline
;
int
j
;
WINED3DLOCKED_RECT
lrSrc
;
WINED3DLOCKED_RECT
lrDst
;
RECT
dest_rect
;
for
(
i
=
0
;
i
<
cRects
;
i
++
)
{
CONST
RECT
*
r
=
&
pSourceRectsArray
[
i
];
TRACE
(
"Copying rect %d (%d,%d),(%d,%d) -> (0, 0)
\n
"
,
i
,
r
->
left
,
r
->
top
,
r
->
right
,
r
->
bottom
);
if
(
srcFormat
==
WINED3DFMT_DXT1
)
{
copyperline
=
((
r
->
right
-
r
->
left
)
*
bytesPerPixel
)
/
2
;
/* DXT1 is half byte per pixel */
}
else
{
copyperline
=
((
r
->
right
-
r
->
left
)
*
bytesPerPixel
);
}
IWineD3DSurface_LockRect
(
pSourceSurface
,
&
lrSrc
,
r
,
WINED3DLOCK_READONLY
);
dest_rect
.
left
=
0
;
dest_rect
.
top
=
0
;
dest_rect
.
right
=
r
->
right
-
r
->
left
;
dest_rect
.
bottom
=
r
->
bottom
-
r
->
top
;
IWineD3DSurface_LockRect
(
pDestinationSurface
,
&
lrDst
,
&
dest_rect
,
0L
);
TRACE
(
"Locked src and dst
\n
"
);
/* Find where to start */
for
(
j
=
0
;
j
<
(
r
->
bottom
-
r
->
top
-
1
);
++
j
)
{
memcpy
((
char
*
)
lrDst
.
pBits
+
(
j
*
lrDst
.
Pitch
),
(
char
*
)
lrSrc
.
pBits
+
(
j
*
lrSrc
.
Pitch
),
copyperline
);
}
IWineD3DSurface_UnlockRect
(
pSourceSurface
);
IWineD3DSurface_UnlockRect
(
pDestinationSurface
);
TRACE
(
"Unlocked src and dst
\n
"
);
}
}
}
return
hr
;
}
/* Implementation details at http://developer.nvidia.com/attach/6494
and
http://oss.sgi.com/projects/ogl-sample/registry/NV/evaluators.txt
...
...
@@ -8119,7 +7976,6 @@ const IWineD3DDeviceVtbl IWineD3DDevice_Vtbl =
IWineD3DDeviceImpl_ColorFill
,
IWineD3DDeviceImpl_UpdateTexture
,
IWineD3DDeviceImpl_UpdateSurface
,
IWineD3DDeviceImpl_CopyRects
,
IWineD3DDeviceImpl_StretchRect
,
IWineD3DDeviceImpl_GetRenderTargetData
,
IWineD3DDeviceImpl_GetFrontBufferData
,
...
...
include/wine/wined3d_interface.h
View file @
1e6a3896
...
...
@@ -455,7 +455,6 @@ DECLARE_INTERFACE_(IWineD3DDevice,IWineD3DBase)
STDMETHOD
(
ColorFill
)(
THIS_
struct
IWineD3DSurface
*
pSurface
,
CONST
WINED3DRECT
*
pRect
,
WINED3DCOLOR
color
)
PURE
;
STDMETHOD
(
UpdateTexture
)(
THIS_
struct
IWineD3DBaseTexture
*
pSourceTexture
,
struct
IWineD3DBaseTexture
*
pDestinationTexture
)
PURE
;
STDMETHOD
(
UpdateSurface
)(
THIS_
struct
IWineD3DSurface
*
pSourceSurface
,
CONST
RECT
*
pSourceRect
,
struct
IWineD3DSurface
*
pDestinationSurface
,
CONST
POINT
*
pDestPoint
)
PURE
;
STDMETHOD
(
CopyRects
)(
THIS_
struct
IWineD3DSurface
*
pSourceSurface
,
CONST
RECT
*
pSourceRectsArray
,
UINT
cRects
,
struct
IWineD3DSurface
*
pDestinationSurface
,
CONST
POINT
*
pDestPointsArray
);
STDMETHOD
(
StretchRect
)(
THIS_
struct
IWineD3DSurface
*
pSourceSurface
,
CONST
RECT
*
pSourceRect
,
struct
IWineD3DSurface
*
pDestinationSurface
,
CONST
RECT
*
pDestRect
,
WINED3DTEXTUREFILTERTYPE
Filter
)
PURE
;
STDMETHOD
(
GetRenderTargetData
)(
THIS_
struct
IWineD3DSurface
*
pRenderTarget
,
struct
IWineD3DSurface
*
pSurface
)
PURE
;
STDMETHOD
(
GetFrontBufferData
)(
THIS_
UINT
iSwapChain
,
struct
IWineD3DSurface
*
pSurface
)
PURE
;
...
...
@@ -596,7 +595,6 @@ DECLARE_INTERFACE_(IWineD3DDevice,IWineD3DBase)
#define IWineD3DDevice_ColorFill(p,a,b,c) (p)->lpVtbl->ColorFill(p,a,b,c)
#define IWineD3DDevice_UpdateTexture(p,a,b) (p)->lpVtbl->UpdateTexture(p,a,b)
#define IWineD3DDevice_UpdateSurface(p,a,b,c,d) (p)->lpVtbl->UpdateSurface(p,a,b,c,d)
#define IWineD3DDevice_CopyRects(p,a,b,c,d,e) (p)->lpVtbl->CopyRects(p,a,b,c,d,e)
#define IWineD3DDevice_StretchRect(p,a,b,c,d,e) (p)->lpVtbl->StretchRect(p,a,b,c,d,e)
#define IWineD3DDevice_GetRenderTargetData(p,a,b) (p)->lpVtbl->GetRenderTargetData(p,a,b)
#define IWineD3DDevice_GetFrontBufferData(p,a,b) (p)->lpVtbl->GetFrontBufferData(p,a,b)
...
...
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