direct3d11: fix possibly failing CopySubresourceRegion on odd dimensions
authorSteve Lhomme <robUx4@videolabs.io>
Tue, 1 Aug 2017 13:01:21 +0000 (15:01 +0200)
committerJean-Baptiste Kempf <jb@videolan.org>
Fri, 4 Aug 2017 08:10:49 +0000 (10:10 +0200)
The texture is created with extra size so we can use more for the copy.

Signed-off-by: Jean-Baptiste Kempf <jb@videolan.org>
modules/video_output/win32/direct3d11.c

index 3ae3f4b..6ecad0c 100644 (file)
@@ -1139,8 +1139,6 @@ static void Prepare(vout_display_t *vd, picture_t *picture, subpicture_t *subpic
         if (!is_d3d11_opaque(picture->format.i_chroma))
             Direct3D11UnmapPoolTexture(picture);
         ID3D11Texture2D_GetDesc(sys->stagingSys.texture[0], &texDesc);
-        assert(picture->format.i_x_offset + picture->format.i_visible_width <= texDesc.Width);
-        assert(picture->format.i_y_offset + picture->format.i_visible_height <= texDesc.Height);
         D3D11_BOX box = {
             .top = 0,
             .bottom = picture->format.i_y_offset + picture->format.i_visible_height,
@@ -1148,6 +1146,14 @@ static void Prepare(vout_display_t *vd, picture_t *picture, subpicture_t *subpic
             .right = picture->format.i_x_offset + picture->format.i_visible_width,
             .back = 1,
         };
+        if ( sys->picQuadConfig->formatTexture != DXGI_FORMAT_R8G8B8A8_UNORM &&
+             sys->picQuadConfig->formatTexture != DXGI_FORMAT_B5G6R5_UNORM )
+        {
+            box.bottom = (box.bottom + 0x01) & ~0x01;
+            box.right  = (box.right  + 0x01) & ~0x01;
+        }
+        assert(box.right <= texDesc.Width);
+        assert(box.bottom <= texDesc.Height);
         ID3D11DeviceContext_CopySubresourceRegion(sys->d3dcontext,
                                                   sys->stagingSys.resource[KNOWN_DXGI_INDEX],
                                                   0, 0, 0, 0,