Stefan Dösinger : wined3d: Make Clear aware of the depth stencil sharing.
Alexandre Julliard
julliard at winehq.org
Tue Feb 5 06:34:58 CST 2008
Module: wine
Branch: master
Commit: 1424e7fd09f935ed5b2d64fe06a7e86ee8e4ae86
URL: http://source.winehq.org/git/wine.git/?a=commit;h=1424e7fd09f935ed5b2d64fe06a7e86ee8e4ae86
Author: Stefan Dösinger <stefan at codeweavers.com>
Date: Sun Jan 27 14:11:16 2008 +0100
wined3d: Make Clear aware of the depth stencil sharing.
---
dlls/wined3d/device.c | 21 +++++++++++++++++++++
dlls/wined3d/drawprim.c | 2 +-
dlls/wined3d/wined3d_private.h | 2 ++
3 files changed, 24 insertions(+), 1 deletions(-)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index f0bac3e..c159674 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -4800,6 +4800,7 @@ HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This, IWineD3DSurfa
RECT vp_rect;
WINED3DVIEWPORT *vp = &This->stateBlock->viewport;
UINT drawable_width, drawable_height;
+ IWineD3DSurfaceImpl *depth_stencil = (IWineD3DSurfaceImpl *) This->stencilBufferTarget;
/* When we're clearing parts of the drawable, make sure that the target surface is well up to date in the
* drawable. After the clear we'll mark the drawable up to date, so we have to make sure that this is true
@@ -4858,6 +4859,26 @@ HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This, IWineD3DSurfa
checkGLcall("glClearDepth");
glMask = glMask | GL_DEPTH_BUFFER_BIT;
IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_ZWRITEENABLE));
+
+ if(This->depth_copy_state == WINED3D_DCS_COPY) {
+ if(vp->X != 0 || vp->Y != 0 ||
+ vp->Width < depth_stencil->currentDesc.Width || vp->Height < depth_stencil->currentDesc.Height) {
+ depth_copy((IWineD3DDevice *) This);
+ }
+ else if(This->stateBlock->renderState[WINED3DRS_SCISSORTESTENABLE] && (
+ This->stateBlock->scissorRect.left > 0 || This->stateBlock->scissorRect.top > 0 ||
+ This->stateBlock->scissorRect.right < depth_stencil->currentDesc.Width ||
+ This->stateBlock->scissorRect.bottom < depth_stencil->currentDesc.Height)) {
+ depth_copy((IWineD3DDevice *) This);
+ }
+ else if(Count > 0 && pRects && (
+ pRects[0].x1 > 0 || pRects[0].y1 > 0 ||
+ pRects[0].x2 < depth_stencil->currentDesc.Width ||
+ pRects[0].y2 < depth_stencil->currentDesc.Height)) {
+ depth_copy((IWineD3DDevice *) This);
+ }
+ }
+ This->depth_copy_state = WINED3D_DCS_INITIAL;
}
if (Flags & WINED3DCLEAR_TARGET) {
diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c
index 70a8c46..2ece349 100644
--- a/dlls/wined3d/drawprim.c
+++ b/dlls/wined3d/drawprim.c
@@ -757,7 +757,7 @@ static void depth_blt(IWineD3DDevice *iface, GLuint texture) {
This->shader_backend->shader_select(iface, use_ps(This), use_vs(This));
}
-static void depth_copy(IWineD3DDevice *iface) {
+void depth_copy(IWineD3DDevice *iface) {
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
IWineD3DSurfaceImpl *depth_stencil = (IWineD3DSurfaceImpl *)This->auto_depth_stencil_buffer;
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 27b1dc1..21c37cb 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -411,6 +411,8 @@ extern glAttribFunc normal_funcs[WINED3DDECLTYPE_UNUSED];
#define GET_TEXCOORD_SIZE_FROM_FVF(d3dvtVertexType, tex_num) \
(((((d3dvtVertexType) >> (16 + (2 * (tex_num)))) + 1) & 0x03) + 1)
+void depth_copy(IWineD3DDevice *iface);
+
/* Routines and structures related to state management */
typedef struct WineD3DContext WineD3DContext;
typedef void (*APPLYSTATEFUNC)(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *ctx);
More information about the wine-cvs
mailing list