changeset 27969:7ddd69cf214f

Lock/unlock surface only once even when drawing many slices. Patch originally by Jim Hauxwell [james dattrax co.uk]
author reimar
date Sun, 23 Nov 2008 18:42:29 +0000
parents 1081658aa871
children 2b6952476210
files libvo/vo_direct3d.c
diffstat 1 files changed, 14 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/libvo/vo_direct3d.c	Sun Nov 23 18:24:53 2008 +0000
+++ b/libvo/vo_direct3d.c	Sun Nov 23 18:42:29 2008 +0000
@@ -162,6 +162,11 @@
     mp_msg(MSGT_VO,MSGL_V,"<vo_direct3d>destroy_d3d_context called\r\n");
     /* Let's destroy the old (if any) D3D Content */
 
+    if (priv->locked_rect.pBits) {
+        IDirect3DSurface9_UnlockRect(priv->d3d_surface);
+        priv->locked_rect.pBits = NULL;
+    }
+
     if (priv->d3d_surface != NULL) {
         IDirect3DSurface9_Release (priv->d3d_surface);
         priv->d3d_surface = NULL;
@@ -295,22 +300,26 @@
         goto skip_upload;
     }
 
-    /* If the previous if failed, we should draw a packed frame */
+    /* If we're here, then we should lock the rect and copy a packed frame */
+    if (!priv->locked_rect.pBits) {
     if (FAILED(IDirect3DSurface9_LockRect(priv->d3d_surface,
                                            &priv->locked_rect, NULL, 0))) {
        mp_msg(MSGT_VO,MSGL_ERR,"<vo_direct3d>Surface lock failure\n");
        return VO_ERROR;
     }
+    }
 
     memcpy_pic(priv->locked_rect.pBits, mpi->planes[0], mpi->stride[0],
                mpi->height, priv->locked_rect.Pitch, mpi->stride[0]);
 
+skip_upload:
+    /* This unlock is used for both slice_draw path and render_d3d_frame path. */
     if (FAILED(IDirect3DSurface9_UnlockRect(priv->d3d_surface))) {
         mp_msg(MSGT_VO,MSGL_V,"<vo_direct3d>Surface unlock failure\n");
         return VO_ERROR;
     }
+    priv->locked_rect.pBits = NULL;
 
-skip_upload:
     if (FAILED(IDirect3DDevice9_BeginScene(priv->d3d_device))) {
        mp_msg(MSGT_VO,MSGL_ERR,"<vo_direct3d>BeginScene failed\n");
        return VO_ERROR;
@@ -596,11 +605,14 @@
     char *Dst;      /**< Pointer to the destination image */
     int  UVstride;  /**< Stride of the U/V planes */
 
+    /* Lock the offscreen surface if it's not already locked. */
+    if (!priv->locked_rect.pBits) {
     if (FAILED(IDirect3DSurface9_LockRect(priv->d3d_surface,
                                            &priv->locked_rect, NULL, 0))) {
         mp_msg(MSGT_VO,MSGL_V,"<vo_direct3d>Surface lock failure\n");
         return VO_FALSE;
     }
+    }
 
     UVstride = priv->locked_rect.Pitch / 2;
 
@@ -634,11 +646,6 @@
 
     memcpy_pic(Dst, Src, w, h, UVstride, stride[2]);
 
-    if (FAILED(IDirect3DSurface9_UnlockRect(priv->d3d_surface))) {
-        mp_msg(MSGT_VO,MSGL_V,"<vo_direct3d>Surface unlock failure\n");
-        return VO_ERROR;
-    }
-
     return 0; /* Success */
 }