Hi there,
I was playing with a older Japanese side scrolling shooter benchmark and
was getting 4.3 frames per second. Some digging revealed that the game
made extensive use of Blt on gdi surfaces and it looks like the current
implementation of Blt actually locks the entire destination surface to
blt to it. This then causes the Unlock to copy the entire screen out.
This means that every time any sprite moved the entire screen redrew.
I threw together this patch, which seems far to simple to be at all
correct, and suddenly i was getting 28.8 frames per second. I know it is
not fully correct because a a portion of the game (drawn by FastBlt it
looks like) stopped rendering correctly with this patch.
But I thought it may get someone who knows that area better thinking
about it. If we can optimize this then a number of the scrolling shooter
games will become playable. I am told that these style games are still
very popular here.
And if said people in the know where to busy, maybe they could give me
some pointers on if I have the right approach or not.
If anyone is interested I can provide an archive with the benchmark
program in it.
-aric
diff --git a/dlls/wined3d/surface_base.c b/dlls/wined3d/surface_base.c
index 57809e1..2ec3a52 100644
--- a/dlls/wined3d/surface_base.c
+++ b/dlls/wined3d/surface_base.c
@@ -852,7 +852,7 @@ IWineD3DBaseSurfaceImpl_Blt(IWineD3DSurface *iface,
if (Src == This)
{
- IWineD3DSurface_LockRect(iface, &dlock, NULL, 0);
+ IWineD3DSurface_LockRect(iface, &dlock, DestRect, 0);
dfmt = This->resource.format;
slock = dlock;
sfmt = dfmt;
@@ -877,20 +877,26 @@ IWineD3DBaseSurfaceImpl_Blt(IWineD3DSurface *iface,
sfmt = Src->resource.format;
}
sEntry = getFormatDescEntry(sfmt, NULL, NULL);
- IWineD3DSurface_LockRect(iface, &dlock,NULL,0);
+ IWineD3DSurface_LockRect(iface, &dlock, DestRect,0);
}
if (!DDBltFx || !(DDBltFx->dwDDFX)) Flags &= ~WINEDDBLT_DDFX;
if (sEntry->isFourcc && dEntry->isFourcc)
- {
- memcpy(dlock.pBits, slock.pBits, This->resource.size);
- goto release;
+ {
+ if (!DestRect)
+ {
+ memcpy(dlock.pBits, slock.pBits, This->resource.size);
+ goto release;
+ }
}
if (DestRect)
{
- xdst = *DestRect;
+ xdst.top = 0;
+ xdst.bottom = DestRect->bottom - DestRect->top;
+ xdst.left = 0;
+ xdst.right = DestRect->right - DestRect->left;
}
else
{