[dx92] BackBuffer writing non-full screen
Jason Edmeades
us at the-edmeades.demon.co.uk
Thu Oct 30 18:41:27 CST 2003
Changelog
Make support for CopyRects to a small area of the back buffer, and
correct the general method of updating the back buffer.
Jason
[The sample app I am testing with almost works perfectly now and
exercises some interesting areas of dx8]
-------------- next part --------------
diff -u3 dlls/d3d8/dx91/device.c dlls/d3d8/device.c
--- dlls/d3d8/dx91/device.c 2003-10-31 00:05:25.000000000 +0000
+++ dlls/d3d8/device.c 2003-10-30 23:51:40.000000000 +0000
@@ -1051,7 +1051,7 @@
dest_rect.left = p->x;
dest_rect.top = p->y;
dest_rect.right = p->x + (r->right - r->left);
- dest_rect.left = p->y + (r->bottom - r->top);
+ dest_rect.bottom= p->y + (r->bottom - r->top);
IDirect3DSurface8Impl_LockRect((LPDIRECT3DSURFACE8) dst, &lrDst, &dest_rect, 0L);
TRACE("Locked src and dst\n");
diff -u3 dlls/d3d8/dx91/surface.c dlls/d3d8/surface.c
--- dlls/d3d8/dx91/surface.c 2003-10-28 21:32:12.000000000 +0000
+++ dlls/d3d8/surface.c 2003-10-31 00:33:59.000000000 +0000
@@ -280,8 +280,9 @@
}
HRESULT WINAPI IDirect3DSurface8Impl_UnlockRect(LPDIRECT3DSURFACE8 iface) {
+ GLint skipBytes = 0;
ICOM_THIS(IDirect3DSurface8Impl,iface);
-
+
if (FALSE == This->locked) {
ERR("trying to lock unlocked surf@%p\n", This);
return D3DERR_INVALIDCALL;
@@ -375,19 +376,26 @@
}
vcheckGLcall("glDrawBuffer");
- glRasterPos2i(This->lockedRect.left, This->lockedRect.top);
+ /* If not fullscreen, we need to skip a number of bytes to find the next row of data */
+ glGetIntegerv(GL_UNPACK_ROW_LENGTH, &skipBytes);
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, This->myDesc.Width);
+
+ /* And back buffers are not blended */
+ glDisable(GL_BLEND);
+
+ glRasterPos3i(This->lockedRect.left, This->lockedRect.top, 1);
vcheckGLcall("glRasterPos2f");
switch (This->myDesc.Format) {
case D3DFMT_R5G6B5:
{
- glDrawPixels(This->lockedRect.right - This->lockedRect.left, This->lockedRect.bottom - This->lockedRect.top,
+ glDrawPixels(This->lockedRect.right - This->lockedRect.left, (This->lockedRect.bottom - This->lockedRect.top)-1,
GL_RGB, GL_UNSIGNED_SHORT_5_6_5, This->allocatedMemory);
vcheckGLcall("glDrawPixels");
}
break;
case D3DFMT_R8G8B8:
{
- glDrawPixels(This->lockedRect.right - This->lockedRect.left, This->lockedRect.bottom - This->lockedRect.top,
+ glDrawPixels(This->lockedRect.right - This->lockedRect.left, (This->lockedRect.bottom - This->lockedRect.top)-1,
GL_RGB, GL_UNSIGNED_BYTE, This->allocatedMemory);
vcheckGLcall("glDrawPixels");
}
@@ -396,7 +404,7 @@
{
glPixelStorei(GL_PACK_SWAP_BYTES, TRUE);
vcheckGLcall("glPixelStorei");
- glDrawPixels(This->lockedRect.right - This->lockedRect.left, This->lockedRect.bottom - This->lockedRect.top,
+ glDrawPixels(This->lockedRect.right - This->lockedRect.left, (This->lockedRect.bottom - This->lockedRect.top)-1,
GL_BGRA, GL_UNSIGNED_BYTE, This->allocatedMemory);
vcheckGLcall("glDrawPixels");
glPixelStorei(GL_PACK_SWAP_BYTES, prev_store);
@@ -414,6 +422,10 @@
glRasterPos3iv(&prev_rasterpos[0]);
vcheckGLcall("glRasterPos3iv");
+ /* Reset to previous pack row length / blending state */
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, skipBytes);
+ if (This->Device->StateBlock->renderstate[D3DRS_ALPHABLENDENABLE]) glEnable(GL_BLEND);
+
LEAVE_GL();
/** restore clean dirty state */
More information about the wine-patches
mailing list