Make support for CopyRects to a small area of the back buffer, and
correct the general method of updating the back buffer.
This commit is contained in:
parent
99e3e6f88b
commit
2b832f11a5
|
@ -1051,7 +1051,7 @@ HRESULT WINAPI IDirect3DDevice8Impl_CopyRects(LPDIRECT3DDEVICE8 iface,
|
||||||
dest_rect.left = p->x;
|
dest_rect.left = p->x;
|
||||||
dest_rect.top = p->y;
|
dest_rect.top = p->y;
|
||||||
dest_rect.right = p->x + (r->right - r->left);
|
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);
|
IDirect3DSurface8Impl_LockRect((LPDIRECT3DSURFACE8) dst, &lrDst, &dest_rect, 0L);
|
||||||
TRACE("Locked src and dst\n");
|
TRACE("Locked src and dst\n");
|
||||||
|
|
||||||
|
|
|
@ -280,6 +280,7 @@ HRESULT WINAPI IDirect3DSurface8Impl_LockRect(LPDIRECT3DSURFACE8 iface, D3DLOCKE
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT WINAPI IDirect3DSurface8Impl_UnlockRect(LPDIRECT3DSURFACE8 iface) {
|
HRESULT WINAPI IDirect3DSurface8Impl_UnlockRect(LPDIRECT3DSURFACE8 iface) {
|
||||||
|
GLint skipBytes = 0;
|
||||||
ICOM_THIS(IDirect3DSurface8Impl,iface);
|
ICOM_THIS(IDirect3DSurface8Impl,iface);
|
||||||
|
|
||||||
if (FALSE == This->locked) {
|
if (FALSE == This->locked) {
|
||||||
|
@ -375,19 +376,26 @@ HRESULT WINAPI IDirect3DSurface8Impl_UnlockRect(LPDIRECT3DSURFACE8 iface) {
|
||||||
}
|
}
|
||||||
vcheckGLcall("glDrawBuffer");
|
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");
|
vcheckGLcall("glRasterPos2f");
|
||||||
switch (This->myDesc.Format) {
|
switch (This->myDesc.Format) {
|
||||||
case D3DFMT_R5G6B5:
|
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);
|
GL_RGB, GL_UNSIGNED_SHORT_5_6_5, This->allocatedMemory);
|
||||||
vcheckGLcall("glDrawPixels");
|
vcheckGLcall("glDrawPixels");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case D3DFMT_R8G8B8:
|
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);
|
GL_RGB, GL_UNSIGNED_BYTE, This->allocatedMemory);
|
||||||
vcheckGLcall("glDrawPixels");
|
vcheckGLcall("glDrawPixels");
|
||||||
}
|
}
|
||||||
|
@ -396,7 +404,7 @@ HRESULT WINAPI IDirect3DSurface8Impl_UnlockRect(LPDIRECT3DSURFACE8 iface) {
|
||||||
{
|
{
|
||||||
glPixelStorei(GL_PACK_SWAP_BYTES, TRUE);
|
glPixelStorei(GL_PACK_SWAP_BYTES, TRUE);
|
||||||
vcheckGLcall("glPixelStorei");
|
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);
|
GL_BGRA, GL_UNSIGNED_BYTE, This->allocatedMemory);
|
||||||
vcheckGLcall("glDrawPixels");
|
vcheckGLcall("glDrawPixels");
|
||||||
glPixelStorei(GL_PACK_SWAP_BYTES, prev_store);
|
glPixelStorei(GL_PACK_SWAP_BYTES, prev_store);
|
||||||
|
@ -414,6 +422,10 @@ HRESULT WINAPI IDirect3DSurface8Impl_UnlockRect(LPDIRECT3DSURFACE8 iface) {
|
||||||
glRasterPos3iv(&prev_rasterpos[0]);
|
glRasterPos3iv(&prev_rasterpos[0]);
|
||||||
vcheckGLcall("glRasterPos3iv");
|
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();
|
LEAVE_GL();
|
||||||
|
|
||||||
/** restore clean dirty state */
|
/** restore clean dirty state */
|
||||||
|
|
Loading…
Reference in New Issue