Skip to content

Commit d073d3e

Browse files
giomascejulliard
authored andcommitted
mfplat: Only upload surface data to GPU for DXGI buffers when writing.
1 parent 49b8e55 commit d073d3e

File tree

2 files changed

+10
-6
lines changed

2 files changed

+10
-6
lines changed

dlls/mfplat/buffer.c

+10-5
Original file line numberDiff line numberDiff line change
@@ -936,7 +936,7 @@ static HRESULT dxgi_surface_buffer_map(struct buffer *buffer, MF2DBuffer_LockFla
936936
return hr;
937937
}
938938

939-
static void dxgi_surface_buffer_unmap(struct buffer *buffer)
939+
static void dxgi_surface_buffer_unmap(struct buffer *buffer, MF2DBuffer_LockFlags flags)
940940
{
941941
ID3D11DeviceContext *immediate_context;
942942
ID3D11Device *device;
@@ -946,8 +946,11 @@ static void dxgi_surface_buffer_unmap(struct buffer *buffer)
946946
ID3D11DeviceContext_Unmap(immediate_context, (ID3D11Resource *)buffer->dxgi_surface.rb_texture, 0);
947947
memset(&buffer->dxgi_surface.map_desc, 0, sizeof(buffer->dxgi_surface.map_desc));
948948

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+
}
951954

952955
ID3D11DeviceContext_Release(immediate_context);
953956
ID3D11Device_Release(device);
@@ -1014,7 +1017,7 @@ static HRESULT WINAPI dxgi_surface_buffer_Unlock(IMFMediaBuffer *iface)
10141017
{
10151018
copy_image(buffer, buffer->dxgi_surface.map_desc.pData, buffer->dxgi_surface.map_desc.RowPitch,
10161019
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);
10181021

10191022
free(buffer->_2d.linear_buffer);
10201023
buffer->_2d.linear_buffer = NULL;
@@ -1052,6 +1055,8 @@ static HRESULT dxgi_surface_buffer_lock(struct buffer *buffer, MF2DBuffer_LockFl
10521055
{
10531056
if (!buffer->_2d.locks)
10541057
buffer->_2d.lock_flags = flags;
1058+
else
1059+
buffer->_2d.lock_flags |= flags;
10551060
buffer->_2d.locks++;
10561061
*scanline0 = buffer->dxgi_surface.map_desc.pData;
10571062
*pitch = buffer->dxgi_surface.map_desc.RowPitch;
@@ -1096,7 +1101,7 @@ static HRESULT WINAPI dxgi_surface_buffer_Unlock2D(IMF2DBuffer2 *iface)
10961101
{
10971102
if (!--buffer->_2d.locks)
10981103
{
1099-
dxgi_surface_buffer_unmap(buffer);
1104+
dxgi_surface_buffer_unmap(buffer, buffer->_2d.lock_flags);
11001105
buffer->_2d.lock_flags = 0;
11011106
}
11021107
}

dlls/mfplat/tests/mfplat.c

-1
Original file line numberDiff line numberDiff line change
@@ -7452,7 +7452,6 @@ static void test_d3d11_surface_buffer(void)
74527452
IMF2DBuffer2_Unlock2D(_2dbuffer2);
74537453

74547454
color = get_d3d11_texture_color(texture, 0, 0);
7455-
todo_wine
74567455
ok(color == 0xcdcdcdcd, "Unexpected leading dword %#lx.\n", color);
74577456
put_d3d11_texture_color(texture, 0, 0, 0xefefefef);
74587457

0 commit comments

Comments
 (0)