[vlc-commits] direct3d11: map all planes at once
Steve Lhomme
git at videolan.org
Wed Dec 13 11:15:37 CET 2017
vlc/vlc-3.0 | branch: master | Steve Lhomme <robUx4 at videolabs.io> | Tue Dec 12 18:22:56 2017 +0100| [0c22bc60a75d193f163d219077d3c30a0f73949c] | committer: Hugo Beauzée-Luyssen
direct3d11: map all planes at once
Rather than failing in the middle and copying only part of the planes.
Signed-off-by: Jean-Baptiste Kempf <jb at videolan.org>
(cherry picked from commit cbb51a5f4425f904d188b41a04de930b5a9276db)
Signed-off-by: Hugo Beauzée-Luyssen <hugo at beauzee.fr>
> http://git.videolan.org/gitweb.cgi/vlc/vlc-3.0.git/?a=commit;h=0c22bc60a75d193f163d219077d3c30a0f73949c
---
modules/video_output/win32/direct3d11.c | 32 +++++++++++++++++++++++---------
1 file changed, 23 insertions(+), 9 deletions(-)
diff --git a/modules/video_output/win32/direct3d11.c b/modules/video_output/win32/direct3d11.c
index 1fd25bb85a..41644264a1 100644
--- a/modules/video_output/win32/direct3d11.c
+++ b/modules/video_output/win32/direct3d11.c
@@ -1061,21 +1061,35 @@ static void Prepare(vout_display_t *vd, picture_t *picture, subpicture_t *subpic
D3D11_TEXTURE2D_DESC texDesc;
int i;
HRESULT hr;
+ plane_t planes[PICTURE_PLANE_MAX];
+ bool b_mapped = true;
for (i = 0; i < picture->i_planes; i++) {
hr = ID3D11DeviceContext_Map(sys->d3d_dev.d3dcontext, sys->stagingSys.resource[i],
0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
- if( FAILED(hr) )
+ if( unlikely(FAILED(hr)) )
+ {
+ while (i-- > 0)
+ ID3D11DeviceContext_Unmap(sys->d3d_dev.d3dcontext, sys->stagingSys.resource[i], 0);
+ b_mapped = false;
break;
+ }
ID3D11Texture2D_GetDesc(sys->stagingSys.texture[i], &texDesc);
- plane_t texture_plane;
- texture_plane.i_lines = texDesc.Height;
- texture_plane.i_pitch = mappedResource.RowPitch;
- texture_plane.p_pixels = mappedResource.pData;
- texture_plane.i_visible_lines = picture->p[i].i_visible_lines;
- texture_plane.i_visible_pitch = picture->p[i].i_visible_pitch;
- plane_CopyPixels(&texture_plane, &picture->p[i]);
- ID3D11DeviceContext_Unmap(sys->d3d_dev.d3dcontext, sys->stagingSys.resource[i], 0);
+ planes[i].i_lines = texDesc.Height;
+ planes[i].i_pitch = mappedResource.RowPitch;
+ planes[i].p_pixels = mappedResource.pData;
+
+ planes[i].i_visible_lines = picture->p[i].i_visible_lines;
+ planes[i].i_visible_pitch = picture->p[i].i_visible_pitch;
+ }
+
+ if (b_mapped)
+ {
+ for (i = 0; i < picture->i_planes; i++)
+ plane_CopyPixels(&planes[i], &picture->p[i]);
+
+ for (i = 0; i < picture->i_planes; i++)
+ ID3D11DeviceContext_Unmap(sys->d3d_dev.d3dcontext, sys->stagingSys.resource[i], 0);
}
}
else
More information about the vlc-commits
mailing list