@@ -936,7 +936,7 @@ static HRESULT dxgi_surface_buffer_map(struct buffer *buffer, MF2DBuffer_LockFla
936
936
return hr ;
937
937
}
938
938
939
- static void dxgi_surface_buffer_unmap (struct buffer * buffer )
939
+ static void dxgi_surface_buffer_unmap (struct buffer * buffer , MF2DBuffer_LockFlags flags )
940
940
{
941
941
ID3D11DeviceContext * immediate_context ;
942
942
ID3D11Device * device ;
@@ -946,8 +946,11 @@ static void dxgi_surface_buffer_unmap(struct buffer *buffer)
946
946
ID3D11DeviceContext_Unmap (immediate_context , (ID3D11Resource * )buffer -> dxgi_surface .rb_texture , 0 );
947
947
memset (& buffer -> dxgi_surface .map_desc , 0 , sizeof (buffer -> dxgi_surface .map_desc ));
948
948
949
- ID3D11DeviceContext_CopySubresourceRegion (immediate_context , (ID3D11Resource * )buffer -> dxgi_surface .texture ,
950
- buffer -> dxgi_surface .sub_resource_idx , 0 , 0 , 0 , (ID3D11Resource * )buffer -> dxgi_surface .rb_texture , 0 , NULL );
949
+ if (flags == MF2DBuffer_LockFlags_Write || flags == MF2DBuffer_LockFlags_ReadWrite )
950
+ {
951
+ ID3D11DeviceContext_CopySubresourceRegion (immediate_context , (ID3D11Resource * )buffer -> dxgi_surface .texture ,
952
+ buffer -> dxgi_surface .sub_resource_idx , 0 , 0 , 0 , (ID3D11Resource * )buffer -> dxgi_surface .rb_texture , 0 , NULL );
953
+ }
951
954
952
955
ID3D11DeviceContext_Release (immediate_context );
953
956
ID3D11Device_Release (device );
@@ -1014,7 +1017,7 @@ static HRESULT WINAPI dxgi_surface_buffer_Unlock(IMFMediaBuffer *iface)
1014
1017
{
1015
1018
copy_image (buffer , buffer -> dxgi_surface .map_desc .pData , buffer -> dxgi_surface .map_desc .RowPitch ,
1016
1019
buffer -> _2d .linear_buffer , buffer -> _2d .width , buffer -> _2d .width , buffer -> _2d .height );
1017
- dxgi_surface_buffer_unmap (buffer );
1020
+ dxgi_surface_buffer_unmap (buffer , MF2DBuffer_LockFlags_ReadWrite );
1018
1021
1019
1022
free (buffer -> _2d .linear_buffer );
1020
1023
buffer -> _2d .linear_buffer = NULL ;
@@ -1052,6 +1055,8 @@ static HRESULT dxgi_surface_buffer_lock(struct buffer *buffer, MF2DBuffer_LockFl
1052
1055
{
1053
1056
if (!buffer -> _2d .locks )
1054
1057
buffer -> _2d .lock_flags = flags ;
1058
+ else
1059
+ buffer -> _2d .lock_flags |= flags ;
1055
1060
buffer -> _2d .locks ++ ;
1056
1061
* scanline0 = buffer -> dxgi_surface .map_desc .pData ;
1057
1062
* pitch = buffer -> dxgi_surface .map_desc .RowPitch ;
@@ -1096,7 +1101,7 @@ static HRESULT WINAPI dxgi_surface_buffer_Unlock2D(IMF2DBuffer2 *iface)
1096
1101
{
1097
1102
if (!-- buffer -> _2d .locks )
1098
1103
{
1099
- dxgi_surface_buffer_unmap (buffer );
1104
+ dxgi_surface_buffer_unmap (buffer , buffer -> _2d . lock_flags );
1100
1105
buffer -> _2d .lock_flags = 0 ;
1101
1106
}
1102
1107
}
0 commit comments