wined3d: Handle depth/stencil surfaces in IWineD3DSurfaceImpl_LoadLocation().
authorHenri Verbeet <hverbeet@codeweavers.com>
Mon, 17 May 2010 09:14:45 +0000 (11:14 +0200)
committerAlexandre Julliard <julliard@winehq.org>
Mon, 17 May 2010 11:19:40 +0000 (13:19 +0200)
dlls/wined3d/device.c
dlls/wined3d/drawprim.c
dlls/wined3d/surface.c

index 2b8f2311133ad45ee442fe303d2145ff3b4ef655..cf23b3bb51531f04193b801c0572567d974ab8f6 100644 (file)
@@ -4483,6 +4483,7 @@ HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This, IWineD3DSurfac
         if (location == SFLAG_DS_ONSCREEN && depth_stencil != This->onscreen_depth_stencil)
             device_switch_onscreen_ds(This, context, depth_stencil);
         prepare_ds_clear(depth_stencil, context, location, &draw_rect, Count, clear_rect);
+        IWineD3DSurface_ModifyLocation((IWineD3DSurface *)depth_stencil, SFLAG_INDRAWABLE, TRUE);
 
         glDepthMask(GL_TRUE);
         IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_ZWRITEENABLE));
index 1f904eaa9daef634c3c523d8dc730bc9868e2ff3..3da4093ac393d7df248ece66f2d7404747b3951e 100644 (file)
@@ -634,9 +634,12 @@ void drawPrimitive(IWineD3DDevice *iface, UINT index_count, UINT StartIdx, UINT
                 surface_load_ds_location(This->depth_stencil, context, location);
 
             if (This->stateBlock->renderState[WINED3DRS_ZWRITEENABLE])
+            {
                 surface_modify_ds_location(This->depth_stencil, location,
                         This->depth_stencil->ds_current_size.cx,
                         This->depth_stencil->ds_current_size.cy);
+                IWineD3DSurface_ModifyLocation((IWineD3DSurface *)This->depth_stencil, SFLAG_INDRAWABLE, TRUE);
+            }
         }
     }
 
index db4a58b0d5ea6bb9944761b3432109a790d0f787..4b70622cd4b32d68d00819d240a4c6492a00d1a9 100644 (file)
@@ -4390,6 +4390,22 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D
     BOOL drawable_read_ok = TRUE;
     BOOL in_fbo = FALSE;
 
+    if (This->resource.usage & WINED3DUSAGE_DEPTHSTENCIL)
+    {
+        if (flag == SFLAG_INTEXTURE)
+        {
+            struct wined3d_context *context = context_acquire(device, NULL);
+            surface_load_ds_location(This, context, SFLAG_DS_OFFSCREEN);
+            context_release(context);
+            return WINED3D_OK;
+        }
+        else
+        {
+            FIXME("Unimplemented location %#x for depth/stencil buffers.\n", flag);
+            return WINED3DERR_INVALIDCALL;
+        }
+    }
+
     if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
     {
         if (surface_is_offscreen(This))