winehq.org
Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2025
February
January
2024
December
November
October
September
August
July
June
May
April
March
February
January
2023
December
November
October
September
August
July
June
May
April
March
February
January
2022
December
November
October
September
August
July
June
May
April
March
February
January
2021
December
November
October
September
August
July
June
May
April
March
February
January
2020
December
November
October
September
August
July
June
May
April
March
February
January
2019
December
November
October
September
August
July
June
May
April
March
February
January
2018
December
November
October
September
August
July
June
May
April
March
February
January
2017
December
November
October
September
August
July
June
May
April
March
February
January
2016
December
November
October
September
August
July
June
May
April
March
February
January
2015
December
November
October
September
August
July
June
May
April
March
February
January
2014
December
November
October
September
August
July
June
May
April
March
February
January
2013
December
November
October
September
August
July
June
May
April
March
February
January
2012
December
November
October
September
August
July
June
May
April
March
February
January
2011
December
November
October
September
August
July
June
May
April
March
February
January
2010
December
November
October
September
August
July
June
May
April
March
February
January
2009
December
November
October
September
August
July
June
May
April
March
February
January
2008
December
November
October
September
August
July
June
May
April
March
February
January
2007
December
November
October
September
August
July
June
May
April
March
February
January
2006
December
November
October
September
August
July
June
May
April
March
February
January
2005
December
November
October
September
August
July
June
May
April
March
February
January
2004
December
November
October
September
August
July
June
May
April
March
February
January
2003
December
November
October
September
August
July
June
May
April
March
February
January
2002
December
November
October
September
August
July
June
May
April
March
February
January
2001
December
November
October
September
August
July
June
May
April
March
February
List overview
wine-commits
February 2022
----- 2025 -----
February 2025
January 2025
----- 2024 -----
December 2024
November 2024
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
----- 2011 -----
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
----- 2010 -----
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
----- 2009 -----
December 2009
November 2009
October 2009
September 2009
August 2009
July 2009
June 2009
May 2009
April 2009
March 2009
February 2009
January 2009
----- 2008 -----
December 2008
November 2008
October 2008
September 2008
August 2008
July 2008
June 2008
May 2008
April 2008
March 2008
February 2008
January 2008
----- 2007 -----
December 2007
November 2007
October 2007
September 2007
August 2007
July 2007
June 2007
May 2007
April 2007
March 2007
February 2007
January 2007
----- 2006 -----
December 2006
November 2006
October 2006
September 2006
August 2006
July 2006
June 2006
May 2006
April 2006
March 2006
February 2006
January 2006
----- 2005 -----
December 2005
November 2005
October 2005
September 2005
August 2005
July 2005
June 2005
May 2005
April 2005
March 2005
February 2005
January 2005
----- 2004 -----
December 2004
November 2004
October 2004
September 2004
August 2004
July 2004
June 2004
May 2004
April 2004
March 2004
February 2004
January 2004
----- 2003 -----
December 2003
November 2003
October 2003
September 2003
August 2003
July 2003
June 2003
May 2003
April 2003
March 2003
February 2003
January 2003
----- 2002 -----
December 2002
November 2002
October 2002
September 2002
August 2002
July 2002
June 2002
May 2002
April 2002
March 2002
February 2002
January 2002
----- 2001 -----
December 2001
November 2001
October 2001
September 2001
August 2001
July 2001
June 2001
May 2001
April 2001
March 2001
February 2001
wine-commits@winehq.org
2 participants
1495 discussions
Start a n
N
ew thread
Nikolay Sivov : mfplat/tests: Add a separate test function for MFGetPlaneSize().
by Alexandre Julliard
14 Feb '22
14 Feb '22
Module: wine Branch: master Commit: ee8ddf37c9af60db6c15f6f7d99c9de593a2e120 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=ee8ddf37c9af60db6c15f6f7…
Author: Nikolay Sivov <nsivov(a)codeweavers.com> Date: Mon Feb 14 21:46:24 2022 +0300 mfplat/tests: Add a separate test function for MFGetPlaneSize(). Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/mfplat/tests/mfplat.c | 206 +++++++++++++++++++++++++-------------------- 1 file changed, 114 insertions(+), 92 deletions(-) diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c index cabcc1b06b0..50f4e059205 100644 --- a/dlls/mfplat/tests/mfplat.c +++ b/dlls/mfplat/tests/mfplat.c @@ -4117,104 +4117,102 @@ static void test_stream_descriptor(void) IMFStreamDescriptor_Release(stream_desc); } -static void test_MFCalculateImageSize(void) +static const struct image_size_test { - static const struct image_size_test - { - const GUID *subtype; - UINT32 width; - UINT32 height; - UINT32 size; - UINT32 plane_size; /* Matches image size when 0. */ - } - image_size_tests[] = - { - { &MFVideoFormat_RGB8, 3, 5, 20 }, - { &MFVideoFormat_RGB8, 1, 1, 4 }, - { &MFVideoFormat_RGB555, 3, 5, 40 }, - { &MFVideoFormat_RGB555, 1, 1, 4 }, - { &MFVideoFormat_RGB565, 3, 5, 40 }, - { &MFVideoFormat_RGB565, 1, 1, 4 }, - { &MFVideoFormat_RGB24, 3, 5, 60 }, - { &MFVideoFormat_RGB24, 1, 1, 4 }, - { &MFVideoFormat_RGB32, 3, 5, 60 }, - { &MFVideoFormat_RGB32, 1, 1, 4 }, - { &MFVideoFormat_ARGB32, 3, 5, 60 }, - { &MFVideoFormat_ARGB32, 1, 1, 4 }, - { &MFVideoFormat_A2R10G10B10, 3, 5, 60 }, - { &MFVideoFormat_A2R10G10B10, 1, 1, 4 }, - { &MFVideoFormat_A16B16G16R16F, 3, 5, 120 }, - { &MFVideoFormat_A16B16G16R16F, 1, 1, 8 }, + const GUID *subtype; + UINT32 width; + UINT32 height; + UINT32 size; + UINT32 plane_size; /* Matches image size when 0. */ +} +image_size_tests[] = +{ + { &MFVideoFormat_RGB8, 3, 5, 20 }, + { &MFVideoFormat_RGB8, 1, 1, 4 }, + { &MFVideoFormat_RGB555, 3, 5, 40 }, + { &MFVideoFormat_RGB555, 1, 1, 4 }, + { &MFVideoFormat_RGB565, 3, 5, 40 }, + { &MFVideoFormat_RGB565, 1, 1, 4 }, + { &MFVideoFormat_RGB24, 3, 5, 60 }, + { &MFVideoFormat_RGB24, 1, 1, 4 }, + { &MFVideoFormat_RGB32, 3, 5, 60 }, + { &MFVideoFormat_RGB32, 1, 1, 4 }, + { &MFVideoFormat_ARGB32, 3, 5, 60 }, + { &MFVideoFormat_ARGB32, 1, 1, 4 }, + { &MFVideoFormat_A2R10G10B10, 3, 5, 60 }, + { &MFVideoFormat_A2R10G10B10, 1, 1, 4 }, + { &MFVideoFormat_A16B16G16R16F, 3, 5, 120 }, + { &MFVideoFormat_A16B16G16R16F, 1, 1, 8 }, + + /* YUV */ + { &MFVideoFormat_NV12, 1, 3, 9, 4 }, + { &MFVideoFormat_NV12, 1, 2, 6, 3 }, + { &MFVideoFormat_NV12, 2, 2, 6, 6 }, + { &MFVideoFormat_NV12, 3, 2, 12, 9 }, + { &MFVideoFormat_NV12, 4, 2, 12 }, + { &MFVideoFormat_NV12, 320, 240, 115200 }, + { &MFVideoFormat_AYUV, 1, 1, 4 }, + { &MFVideoFormat_AYUV, 2, 1, 8 }, + { &MFVideoFormat_AYUV, 1, 2, 8 }, + { &MFVideoFormat_AYUV, 4, 3, 48 }, + { &MFVideoFormat_AYUV, 320, 240, 307200 }, + { &MFVideoFormat_IMC1, 1, 1, 4 }, + { &MFVideoFormat_IMC1, 2, 1, 4 }, + { &MFVideoFormat_IMC1, 1, 2, 8 }, + { &MFVideoFormat_IMC1, 4, 3, 24 }, + { &MFVideoFormat_IMC1, 320, 240, 153600 }, + { &MFVideoFormat_IMC3, 1, 1, 4 }, + { &MFVideoFormat_IMC3, 2, 1, 4 }, + { &MFVideoFormat_IMC3, 1, 2, 8 }, + { &MFVideoFormat_IMC3, 4, 3, 24 }, + { &MFVideoFormat_IMC3, 320, 240, 153600 }, + { &MFVideoFormat_IMC2, 1, 3, 9, 4 }, + { &MFVideoFormat_IMC2, 1, 2, 6, 3 }, + { &MFVideoFormat_IMC2, 2, 2, 6, 6 }, + { &MFVideoFormat_IMC2, 3, 2, 12, 9 }, + { &MFVideoFormat_IMC2, 4, 2, 12 }, + { &MFVideoFormat_IMC2, 320, 240, 115200 }, + { &MFVideoFormat_IMC4, 1, 3, 9, 4 }, + { &MFVideoFormat_IMC4, 1, 2, 6, 3 }, + { &MFVideoFormat_IMC4, 2, 2, 6, 6 }, + { &MFVideoFormat_IMC4, 3, 2, 12, 9 }, + { &MFVideoFormat_IMC4, 4, 2, 12 }, + { &MFVideoFormat_IMC4, 320, 240, 115200 }, + { &MFVideoFormat_YV12, 1, 1, 3, 1 }, + { &MFVideoFormat_YV12, 2, 1, 3 }, + { &MFVideoFormat_YV12, 1, 2, 6, 3 }, + { &MFVideoFormat_YV12, 4, 3, 18 }, + { &MFVideoFormat_YV12, 320, 240, 115200 }, + + { &MFVideoFormat_I420, 1, 1, 3, 1 }, + { &MFVideoFormat_I420, 2, 1, 3 }, + { &MFVideoFormat_I420, 1, 2, 6, 3 }, + { &MFVideoFormat_I420, 4, 3, 18 }, + { &MFVideoFormat_I420, 320, 240, 115200 }, + + { &MFVideoFormat_IYUV, 1, 1, 3, 1 }, + { &MFVideoFormat_IYUV, 2, 1, 3 }, + { &MFVideoFormat_IYUV, 1, 2, 6, 3 }, + { &MFVideoFormat_IYUV, 4, 3, 18 }, + { &MFVideoFormat_IYUV, 320, 240, 115200 }, + + { &MFVideoFormat_YUY2, 2, 1, 4 }, + { &MFVideoFormat_YUY2, 4, 3, 24 }, + { &MFVideoFormat_YUY2, 128, 128, 32768 }, + { &MFVideoFormat_YUY2, 320, 240, 153600 }, + + { &MFVideoFormat_UYVY, 2, 1, 4 }, + { &MFVideoFormat_UYVY, 4, 3, 24 }, + { &MFVideoFormat_UYVY, 128, 128, 32768 }, + { &MFVideoFormat_UYVY, 320, 240, 153600 }, +}; - /* YUV */ - { &MFVideoFormat_NV12, 1, 3, 9, 4 }, - { &MFVideoFormat_NV12, 1, 2, 6, 3 }, - { &MFVideoFormat_NV12, 2, 2, 6, 6 }, - { &MFVideoFormat_NV12, 3, 2, 12, 9 }, - { &MFVideoFormat_NV12, 4, 2, 12 }, - { &MFVideoFormat_NV12, 320, 240, 115200 }, - { &MFVideoFormat_AYUV, 1, 1, 4 }, - { &MFVideoFormat_AYUV, 2, 1, 8 }, - { &MFVideoFormat_AYUV, 1, 2, 8 }, - { &MFVideoFormat_AYUV, 4, 3, 48 }, - { &MFVideoFormat_AYUV, 320, 240, 307200 }, - { &MFVideoFormat_IMC1, 1, 1, 4 }, - { &MFVideoFormat_IMC1, 2, 1, 4 }, - { &MFVideoFormat_IMC1, 1, 2, 8 }, - { &MFVideoFormat_IMC1, 4, 3, 24 }, - { &MFVideoFormat_IMC1, 320, 240, 153600 }, - { &MFVideoFormat_IMC3, 1, 1, 4 }, - { &MFVideoFormat_IMC3, 2, 1, 4 }, - { &MFVideoFormat_IMC3, 1, 2, 8 }, - { &MFVideoFormat_IMC3, 4, 3, 24 }, - { &MFVideoFormat_IMC3, 320, 240, 153600 }, - { &MFVideoFormat_IMC2, 1, 3, 9, 4 }, - { &MFVideoFormat_IMC2, 1, 2, 6, 3 }, - { &MFVideoFormat_IMC2, 2, 2, 6, 6 }, - { &MFVideoFormat_IMC2, 3, 2, 12, 9 }, - { &MFVideoFormat_IMC2, 4, 2, 12 }, - { &MFVideoFormat_IMC2, 320, 240, 115200 }, - { &MFVideoFormat_IMC4, 1, 3, 9, 4 }, - { &MFVideoFormat_IMC4, 1, 2, 6, 3 }, - { &MFVideoFormat_IMC4, 2, 2, 6, 6 }, - { &MFVideoFormat_IMC4, 3, 2, 12, 9 }, - { &MFVideoFormat_IMC4, 4, 2, 12 }, - { &MFVideoFormat_IMC4, 320, 240, 115200 }, - { &MFVideoFormat_YV12, 1, 1, 3, 1 }, - { &MFVideoFormat_YV12, 2, 1, 3 }, - { &MFVideoFormat_YV12, 1, 2, 6, 3 }, - { &MFVideoFormat_YV12, 4, 3, 18 }, - { &MFVideoFormat_YV12, 320, 240, 115200 }, - - { &MFVideoFormat_I420, 1, 1, 3, 1 }, - { &MFVideoFormat_I420, 2, 1, 3 }, - { &MFVideoFormat_I420, 1, 2, 6, 3 }, - { &MFVideoFormat_I420, 4, 3, 18 }, - { &MFVideoFormat_I420, 320, 240, 115200 }, - - { &MFVideoFormat_IYUV, 1, 1, 3, 1 }, - { &MFVideoFormat_IYUV, 2, 1, 3 }, - { &MFVideoFormat_IYUV, 1, 2, 6, 3 }, - { &MFVideoFormat_IYUV, 4, 3, 18 }, - { &MFVideoFormat_IYUV, 320, 240, 115200 }, - - { &MFVideoFormat_YUY2, 2, 1, 4 }, - { &MFVideoFormat_YUY2, 4, 3, 24 }, - { &MFVideoFormat_YUY2, 128, 128, 32768 }, - { &MFVideoFormat_YUY2, 320, 240, 153600 }, - - { &MFVideoFormat_UYVY, 2, 1, 4 }, - { &MFVideoFormat_UYVY, 4, 3, 24 }, - { &MFVideoFormat_UYVY, 128, 128, 32768 }, - { &MFVideoFormat_UYVY, 320, 240, 153600 }, - }; +static void test_MFCalculateImageSize(void) +{ unsigned int i; UINT32 size; HRESULT hr; - if (!pMFGetPlaneSize) - win_skip("MFGetPlaneSize() is not available.\n"); - size = 1; hr = MFCalculateImageSize(&IID_IUnknown, 1, 1, &size); ok(hr == E_INVALIDARG || broken(hr == S_OK) /* Vista */, "Unexpected hr %#x.\n", hr); @@ -4244,6 +4242,29 @@ static void test_MFCalculateImageSize(void) } } +static void test_MFGetPlaneSize(void) +{ + unsigned int i; + UINT32 size; + HRESULT hr; + + if (!pMFGetPlaneSize) + { + win_skip("MFGetPlaneSize() is not available.\n"); + return; + } + + for (i = 0; i < ARRAY_SIZE(image_size_tests); ++i) + { + const struct image_size_test *ptr = &image_size_tests[i]; + unsigned int plane_size = ptr->plane_size ? ptr->plane_size : ptr->size; + + hr = pMFGetPlaneSize(ptr->subtype->Data1, ptr->width, ptr->height, &size); + ok(hr == S_OK, "%u: failed to get plane size, hr %#x.\n", i, hr); + ok(size == plane_size, "%u: unexpected plane size %u, expected %u.\n", i, size, plane_size); + } +} + static void test_MFCompareFullToPartialMediaType(void) { IMFMediaType *full_type, *partial_type; @@ -7940,6 +7961,7 @@ START_TEST(mfplat) test_MFInvokeCallback(); test_stream_descriptor(); test_MFCalculateImageSize(); + test_MFGetPlaneSize(); test_MFCompareFullToPartialMediaType(); test_attributes_serialization(); test_wrapped_media_type();
1
0
0
0
Zebediah Figura : wined3d: Allow NOOVERWRITE maps to be accelerated on 32-bit architectures.
by Alexandre Julliard
14 Feb '22
14 Feb '22
Module: wine Branch: master Commit: 30d670a7b9cd937eba6cb4d07ef4118dba57d3b4 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=30d670a7b9cd937eba6cb4d0…
Author: Zebediah Figura <zfigura(a)codeweavers.com> Date: Fri Feb 11 19:42:04 2022 -0600 wined3d: Allow NOOVERWRITE maps to be accelerated on 32-bit architectures. Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com> Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/wined3d/buffer.c | 3 +-- dlls/wined3d/cs.c | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c index 50e3e9fe2b4..902ab720396 100644 --- a/dlls/wined3d/buffer.c +++ b/dlls/wined3d/buffer.c @@ -1002,8 +1002,7 @@ static HRESULT buffer_resource_sub_resource_map(struct wined3d_resource *resourc * but it's safe because the client thread will wait for the * map to return, thus completely serializing this call with * other client code. */ - if (wined3d_map_persistent()) - buffer->resource.client.addr = addr; + buffer->resource.client.addr = addr; if (((DWORD_PTR)buffer->map_ptr) & (RESOURCE_ALIGNMENT - 1)) { diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c index ed8a41c778b..63d8628cea7 100644 --- a/dlls/wined3d/cs.c +++ b/dlls/wined3d/cs.c @@ -3088,8 +3088,7 @@ static bool wined3d_cs_map_upload_bo(struct wined3d_device_context *context, str if (!device->adapter->adapter_ops->adapter_alloc_bo(device, resource, sub_resource_idx, &addr)) return false; - if (wined3d_map_persistent()) - client->addr = addr; + client->addr = addr; } else {
1
0
0
0
Zebediah Figura : wined3d: Keep a client reference count for the BO map pointer.
by Alexandre Julliard
14 Feb '22
14 Feb '22
Module: wine Branch: master Commit: 831ff102008e2ba93a403344646b5ed67258eaeb URL:
https://source.winehq.org/git/wine.git/?a=commit;h=831ff102008e2ba93a403344…
Author: Zebediah Figura <zfigura(a)codeweavers.com> Date: Fri Feb 11 19:42:03 2022 -0600 wined3d: Keep a client reference count for the BO map pointer. Currently this has no effect. Depending on whether wined3d_map_persistent() returns true, either the client thread doesn't access the map pointer outside of d3d map requests, or the BO is never unmapped. However, we'd like to be able to let NOOVERWRITE maps be accelerated while still being able to unmap arbitrary BOs at arbitrary times from the CS thread. Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com> Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/wined3d/adapter_vk.c | 11 +++++++++++ dlls/wined3d/context_gl.c | 12 ++++++++++++ dlls/wined3d/context_vk.c | 2 ++ dlls/wined3d/cs.c | 38 ++++++++++++++++++++++++++++++++------ dlls/wined3d/device.c | 4 ++++ dlls/wined3d/wined3d_private.h | 15 +++++++++++++++ 6 files changed, 76 insertions(+), 6 deletions(-) diff --git a/dlls/wined3d/adapter_vk.c b/dlls/wined3d/adapter_vk.c index 53591cdcaa6..239cd7cca8d 100644 --- a/dlls/wined3d/adapter_vk.c +++ b/dlls/wined3d/adapter_vk.c @@ -831,7 +831,18 @@ static void wined3d_bo_vk_unmap(struct wined3d_bo_vk *bo, struct wined3d_context return; } + wined3d_device_bo_map_lock(context_vk->c.device); + /* The mapping is still in use by the client (viz. for an accelerated + * NOOVERWRITE map). The client will trigger another unmap request when the + * d3d application requests to unmap the BO. */ + if (bo->b.client_map_count) + { + wined3d_device_bo_map_unlock(context_vk->c.device); + TRACE("BO %p is still in use by a client thread; not unmapping.\n", bo); + return; + } bo->b.map_ptr = NULL; + wined3d_device_bo_map_unlock(context_vk->c.device); if ((slab = bo->slab)) { diff --git a/dlls/wined3d/context_gl.c b/dlls/wined3d/context_gl.c index c6816d97c63..23bac4de133 100644 --- a/dlls/wined3d/context_gl.c +++ b/dlls/wined3d/context_gl.c @@ -2953,7 +2953,18 @@ static void wined3d_bo_gl_unmap(struct wined3d_bo_gl *bo, struct wined3d_context return; } + wined3d_device_bo_map_lock(context_gl->c.device); + /* The mapping is still in use by the client (viz. for an accelerated + * NOOVERWRITE map). The client will trigger another unmap request when the + * d3d application requests to unmap the BO. */ + if (bo->b.client_map_count) + { + wined3d_device_bo_map_unlock(context_gl->c.device); + TRACE("BO %p is still in use by a client thread; not unmapping.\n", bo); + return; + } bo->b.map_ptr = NULL; + wined3d_device_bo_map_unlock(context_gl->c.device); wined3d_context_gl_bind_bo(context_gl, bo->binding, bo->id); GL_EXTCALL(glUnmapBuffer(bo->binding)); @@ -3220,6 +3231,7 @@ bool wined3d_context_gl_create_bo(struct wined3d_context_gl *context_gl, GLsizei bo->b.buffer_offset = buffer_offset; bo->b.memory_offset = bo->b.buffer_offset; bo->b.map_ptr = NULL; + bo->b.client_map_count = 0; return true; } diff --git a/dlls/wined3d/context_vk.c b/dlls/wined3d/context_vk.c index 98610d65c5d..61056a7f8cb 100644 --- a/dlls/wined3d/context_vk.c +++ b/dlls/wined3d/context_vk.c @@ -463,6 +463,7 @@ static bool wined3d_context_vk_create_slab_bo(struct wined3d_context_vk *context *bo = slab->bo; bo->memory = NULL; bo->slab = slab; + bo->b.client_map_count = 0; bo->b.map_ptr = NULL; bo->b.buffer_offset = idx * object_size; bo->b.memory_offset = slab->bo.b.memory_offset + bo->b.buffer_offset; @@ -541,6 +542,7 @@ BOOL wined3d_context_vk_create_bo(struct wined3d_context_vk *context_vk, VkDevic return FALSE; } + bo->b.client_map_count = 0; bo->b.map_ptr = NULL; bo->b.buffer_offset = 0; bo->size = size; diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c index 27a597d0b74..ed8a41c778b 100644 --- a/dlls/wined3d/cs.c +++ b/dlls/wined3d/cs.c @@ -20,6 +20,7 @@ #include "wined3d_private.h" WINE_DEFAULT_DEBUG_CHANNEL(d3d); +WINE_DECLARE_DEBUG_CHANNEL(d3d_perf); WINE_DECLARE_DEBUG_CHANNEL(d3d_sync); WINE_DECLARE_DEBUG_CHANNEL(fps); @@ -3079,7 +3080,7 @@ static bool wined3d_cs_map_upload_bo(struct wined3d_device_context *context, str struct wined3d_client_resource *client = &resource->client; struct wined3d_device *device = context->device; struct wined3d_bo_address addr; - const struct wined3d_bo *bo; + struct wined3d_bo *bo; uint8_t *map_ptr; if (flags & WINED3D_MAP_DISCARD) @@ -3095,13 +3096,29 @@ static bool wined3d_cs_map_upload_bo(struct wined3d_device_context *context, str addr = client->addr; } - bo = addr.buffer_object; - map_ptr = bo ? bo->map_ptr : NULL; + map_ptr = NULL; + if ((bo = addr.buffer_object)) + { + wined3d_device_bo_map_lock(device); + if ((map_ptr = bo->map_ptr)) + ++bo->client_map_count; + wined3d_device_bo_map_unlock(device); + + if (!map_ptr) + { + /* adapter_alloc_bo() should have given us a mapped BO if we are + * discarding. */ + assert(flags & WINED3D_MAP_NOOVERWRITE); + WARN_(d3d_perf)("Not accelerating a NOOVERWRITE map because the BO is not mapped.\n"); + return false; + } + } map_ptr += (uintptr_t)addr.addr; if (!map_ptr) { - TRACE("Sub-resource is not mapped.\n"); + assert(flags & WINED3D_MAP_NOOVERWRITE); + WARN_(d3d_perf)("Not accelerating a NOOVERWRITE map because the sub-resource has no valid address.\n"); return false; } @@ -3140,14 +3157,23 @@ static bool wined3d_bo_address_is_null(struct wined3d_const_bo_address *addr) } static bool wined3d_cs_unmap_upload_bo(struct wined3d_device_context *context, struct wined3d_resource *resource, - unsigned int sub_resource_idx, struct wined3d_box *box, struct upload_bo *bo) + unsigned int sub_resource_idx, struct wined3d_box *box, struct upload_bo *upload_bo) { struct wined3d_client_resource *client = &resource->client; + struct wined3d_device *device = context->device; + struct wined3d_bo *bo; if (wined3d_bo_address_is_null(&client->mapped_upload.addr)) return false; - *bo = client->mapped_upload; + if ((bo = client->mapped_upload.addr.buffer_object)) + { + wined3d_device_bo_map_lock(device); + --bo->client_map_count; + wined3d_device_bo_map_unlock(device); + } + + *upload_bo = client->mapped_upload; *box = client->mapped_box; memset(&client->mapped_upload, 0, sizeof(client->mapped_upload)); memset(&client->mapped_box, 0, sizeof(client->mapped_box)); diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index 09be992dd2f..4dac9220f0f 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -246,6 +246,8 @@ void wined3d_device_cleanup(struct wined3d_device *device) wine_rb_destroy(&device->depth_stencil_states, device_leftover_depth_stencil_state, NULL); wine_rb_destroy(&device->so_descs, device_free_so_desc, NULL); + wined3d_lock_cleanup(&device->bo_map_lock); + wined3d_decref(device->wined3d); device->wined3d = NULL; } @@ -5971,6 +5973,8 @@ HRESULT wined3d_device_init(struct wined3d_device *device, struct wined3d *wined goto err; } + wined3d_lock_init(&device->bo_map_lock, "wined3d_device.bo_map_lock"); + return WINED3D_OK; err: diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index dd0a49db3b5..d0e4f0cdfaf 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -1605,10 +1605,13 @@ do { \ struct wined3d_bo { + /* client_map_count and map_ptr are accessed from both the client and CS + * threads, and protected by wined3d_device.bo_map_lock. */ struct list users; void *map_ptr; size_t buffer_offset; size_t memory_offset; + unsigned int client_map_count; bool coherent; }; @@ -3946,6 +3949,8 @@ struct wined3d_device /* Context management */ struct wined3d_context **contexts; UINT context_count; + + CRITICAL_SECTION bo_map_lock; }; void wined3d_device_cleanup(struct wined3d_device *device) DECLSPEC_HIDDEN; @@ -3967,6 +3972,16 @@ HRESULT wined3d_device_set_implicit_swapchain(struct wined3d_device *device, struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN; void wined3d_device_uninit_3d(struct wined3d_device *device) DECLSPEC_HIDDEN; +static inline void wined3d_device_bo_map_lock(struct wined3d_device *device) +{ + EnterCriticalSection(&device->bo_map_lock); +} + +static inline void wined3d_device_bo_map_unlock(struct wined3d_device *device) +{ + LeaveCriticalSection(&device->bo_map_lock); +} + struct wined3d_device_no3d { struct wined3d_device d;
1
0
0
0
Henri Verbeet : wined3d: Use the chunk allocator for GL vertex buffers.
by Alexandre Julliard
14 Feb '22
14 Feb '22
Module: wine Branch: master Commit: a13fc3bb7e055562b8b9deae985c64c5c7861424 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=a13fc3bb7e055562b8b9deae…
Author: Henri Verbeet <hverbeet(a)codeweavers.com> Date: Fri Feb 11 19:42:02 2022 -0600 wined3d: Use the chunk allocator for GL vertex buffers. Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com> Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/wined3d/context_gl.c | 1 + 1 file changed, 1 insertion(+) diff --git a/dlls/wined3d/context_gl.c b/dlls/wined3d/context_gl.c index 2a37834b706..c6816d97c63 100644 --- a/dlls/wined3d/context_gl.c +++ b/dlls/wined3d/context_gl.c @@ -3139,6 +3139,7 @@ static bool use_buffer_chunk_suballocation(const struct wined3d_gl_info *gl_info { switch (binding) { + case GL_ARRAY_BUFFER: case GL_ATOMIC_COUNTER_BUFFER: case GL_DRAW_INDIRECT_BUFFER: case GL_PIXEL_UNPACK_BUFFER:
1
0
0
0
Zebediah Figura : wined3d: Allow up to 128 MiB of persistently mapped memory on 32-bit architectures.
by Alexandre Julliard
14 Feb '22
14 Feb '22
Module: wine Branch: master Commit: eb90d5db4f9bf92059d379d4fe0ea4a516db5e5c URL:
https://source.winehq.org/git/wine.git/?a=commit;h=eb90d5db4f9bf92059d379d4…
Author: Zebediah Figura <zfigura(a)codeweavers.com> Date: Fri Feb 11 19:42:01 2022 -0600 wined3d: Allow up to 128 MiB of persistently mapped memory on 32-bit architectures. Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com> Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/wined3d/adapter_vk.c | 24 ++++++++++++----- dlls/wined3d/context_gl.c | 61 +++++++++++++++++++++++++----------------- dlls/wined3d/context_vk.c | 20 ++++++++++---- dlls/wined3d/directx.c | 9 +++++++ dlls/wined3d/wined3d_private.h | 9 +++++++ 5 files changed, 87 insertions(+), 36 deletions(-) Diff:
https://source.winehq.org/git/wine.git/?a=commitdiff;h=eb90d5db4f9bf92059d3…
1
0
0
0
Rémi Bernon : mf: Handle MESourceSeeked and MEStreamSeeked state change events.
by Alexandre Julliard
14 Feb '22
14 Feb '22
Module: wine Branch: master Commit: 899ae42b206a8c2e462a789249e2c2f143d4a582 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=899ae42b206a8c2e462a7892…
Author: Rémi Bernon <rbernon(a)codeweavers.com> Date: Fri Feb 11 14:53:07 2022 +0100 mf: Handle MESourceSeeked and MEStreamSeeked state change events. If a session is paused then started again, or if a start position is provided we wait forever for the source to send a MESourceStarted event, when it sends a MESourceSeeked instead. This causes a deadlock in Bright Memory: Infinite as the game then waits for the Start command to complete, while the session is stuck in the SESSION_STATE_STARTING_SOURCES state. Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/mf/session.c | 8 ++++++++ dlls/mfplat/tests/mfplat.c | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/dlls/mf/session.c b/dlls/mf/session.c index 05b7af81df7..6ee3c454c6e 100644 --- a/dlls/mf/session.c +++ b/dlls/mf/session.c @@ -2295,6 +2295,8 @@ static enum object_state session_get_object_state_for_event(MediaEventType event { switch (event) { + case MESourceSeeked: + case MEStreamSeeked: case MESourceStarted: case MEStreamStarted: case MEStreamSinkStarted: @@ -2471,6 +2473,7 @@ static void session_set_source_object_state(struct media_session *session, IUnkn switch (event_type) { + case MESourceSeeked: case MESourceStarted: case MESourcePaused: case MESourceStopped: @@ -2485,6 +2488,7 @@ static void session_set_source_object_state(struct media_session *session, IUnkn } } break; + case MEStreamSeeked: case MEStreamStarted: case MEStreamPaused: case MEStreamStopped: @@ -3172,6 +3176,10 @@ static HRESULT WINAPI session_events_callback_Invoke(IMFAsyncCallback *iface, IM switch (event_type) { + case MESourceSeeked: + case MEStreamSeeked: + FIXME("Source/stream seeking, semi-stub!\n"); + /* fallthrough */ case MESourceStarted: case MESourcePaused: case MESourceStopped: diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c index c70d8a9ca81..cabcc1b06b0 100644 --- a/dlls/mfplat/tests/mfplat.c +++ b/dlls/mfplat/tests/mfplat.c @@ -942,6 +942,44 @@ static void test_source_resolver(void) video_stream = (IMFMediaStream *)var.punkVal; } + hr = IMFMediaSource_Pause(mediasource); + ok(hr == S_OK, "Failed to pause media source, hr %#x.\n", hr); + if (get_event((IMFMediaEventGenerator *)mediasource, MESourcePaused, &var)) + ok(var.vt == VT_EMPTY, "Unexpected value type.\n"); + + var.vt = VT_EMPTY; + hr = IMFMediaSource_Start(mediasource, descriptor, &GUID_NULL, &var); + ok(hr == S_OK, "Failed to start media source, hr %#x.\n", hr); + + if (get_event((IMFMediaEventGenerator *)mediasource, MESourceStarted, &var)) + ok(var.vt == VT_EMPTY, "Unexpected value type.\n"); + + hr = IMFMediaSource_Pause(mediasource); + ok(hr == S_OK, "Failed to pause media source, hr %#x.\n", hr); + if (get_event((IMFMediaEventGenerator *)mediasource, MESourcePaused, &var)) + ok(var.vt == VT_EMPTY, "Unexpected value type.\n"); + + var.vt = VT_I8; + var.uhVal.QuadPart = 0; + hr = IMFMediaSource_Start(mediasource, descriptor, &GUID_NULL, &var); + ok(hr == S_OK, "Failed to start media source, hr %#x.\n", hr); + + if (get_event((IMFMediaEventGenerator *)mediasource, MESourceSeeked, &var)) + ok(var.vt == VT_I8, "Unexpected value type.\n"); + + hr = IMFMediaSource_Stop(mediasource); + ok(hr == S_OK, "Failed to pause media source, hr %#x.\n", hr); + if (get_event((IMFMediaEventGenerator *)mediasource, MESourceStopped, &var)) + ok(var.vt == VT_EMPTY, "Unexpected value type.\n"); + + var.vt = VT_I8; + var.uhVal.QuadPart = 0; + hr = IMFMediaSource_Start(mediasource, descriptor, &GUID_NULL, &var); + ok(hr == S_OK, "Failed to start media source, hr %#x.\n", hr); + + if (get_event((IMFMediaEventGenerator *)mediasource, MESourceStarted, &var)) + ok(var.vt == VT_I8, "Unexpected value type.\n"); + sample_count = 10; for (i = 0; i < sample_count; ++i)
1
0
0
0
Paul Gofman : wined3d: Clear GL backbuffer in wined3d_context_gl_init().
by Alexandre Julliard
14 Feb '22
14 Feb '22
Module: wine Branch: master Commit: b36e4cfe2d7ceef6f6b672811d9481d6c23c0ac9 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=b36e4cfe2d7ceef6f6b67281…
Author: Paul Gofman <pgofman(a)codeweavers.com> Date: Fri Feb 11 18:42:28 2022 +0300 wined3d: Clear GL backbuffer in wined3d_context_gl_init(). Signed-off-by: Paul Gofman <pgofman(a)codeweavers.com> Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/wined3d/context_gl.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/dlls/wined3d/context_gl.c b/dlls/wined3d/context_gl.c index 9153b7fd95f..f8a96c8a10a 100644 --- a/dlls/wined3d/context_gl.c +++ b/dlls/wined3d/context_gl.c @@ -1897,7 +1897,7 @@ HGLRC context_create_wgl_attribs(const struct wined3d_gl_info *gl_info, HDC hdc, } static BOOL wined3d_context_gl_create_wgl_ctx(struct wined3d_context_gl *context_gl, - struct wined3d_swapchain_gl *swapchain_gl) + struct wined3d_swapchain_gl *swapchain_gl, BOOL *new_drawable) { enum wined3d_swap_effect swap_effect = swapchain_gl->s.state.desc.swap_effect; const struct wined3d_format *colour_format, *ds_format; @@ -1920,6 +1920,8 @@ static BOOL wined3d_context_gl_create_wgl_ctx(struct wined3d_context_gl *context swap_effect_copy = swap_effect == WINED3D_SWAP_EFFECT_COPY || swap_effect == WINED3D_SWAP_EFFECT_COPY_VSYNC; + *new_drawable = !GetPixelFormat(context_gl->dc); + if (wined3d_settings.offscreen_rendering_mode == ORM_BACKBUFFER) { static const enum wined3d_format_id ds_formats[] = @@ -2018,7 +2020,7 @@ static BOOL wined3d_context_gl_create_wgl_ctx(struct wined3d_context_gl *context } context_gl->dc_is_private = TRUE; - return wined3d_context_gl_create_wgl_ctx(context_gl, swapchain_gl); + return wined3d_context_gl_create_wgl_ctx(context_gl, swapchain_gl, new_drawable); } share_ctx = device->context_count ? wined3d_context_gl(device->contexts[0])->gl_ctx : NULL; @@ -2064,6 +2066,7 @@ HRESULT wined3d_context_gl_init(struct wined3d_context_gl *context_gl, struct wi const struct wined3d_d3d_info *d3d_info; const struct wined3d_gl_info *gl_info; struct wined3d_device *device; + BOOL new_drawable; unsigned int i; TRACE("context_gl %p, swapchain %p.\n", context_gl, swapchain_gl); @@ -2142,7 +2145,7 @@ HRESULT wined3d_context_gl_init(struct wined3d_context_gl *context_gl, struct wi sizeof(*context_gl->texture_type)))) goto fail; - if (!wined3d_context_gl_create_wgl_ctx(context_gl, swapchain_gl)) + if (!wined3d_context_gl_create_wgl_ctx(context_gl, swapchain_gl, &new_drawable)) goto fail; /* Set up the context defaults. */ @@ -2299,6 +2302,14 @@ HRESULT wined3d_context_gl_init(struct wined3d_context_gl *context_gl, struct wi gl_info->gl_ops.gl.p_glScissor(0, 0, 0, 0); checkGLcall("glScissor"); + if (new_drawable) + { + gl_info->gl_ops.gl.p_glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + gl_info->gl_ops.gl.p_glClearDepth(1.0f); + gl_info->gl_ops.gl.p_glClearStencil(0); + gl_info->gl_ops.gl.p_glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + checkGLcall("glClear"); + } return WINED3D_OK; fail:
1
0
0
0
Francois Gouget : hnetcfg: Fix the spelling of a TRACE() message.
by Alexandre Julliard
14 Feb '22
14 Feb '22
Module: wine Branch: master Commit: fcc0f1fb645111352bea815deefa34aecf4248ef URL:
https://source.winehq.org/git/wine.git/?a=commit;h=fcc0f1fb645111352bea815d…
Author: Francois Gouget <fgouget(a)free.fr> Date: Mon Feb 14 13:58:38 2022 +0100 hnetcfg: Fix the spelling of a TRACE() message. Signed-off-by: Francois Gouget <fgouget(a)free.fr> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/hnetcfg/port.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dlls/hnetcfg/port.c b/dlls/hnetcfg/port.c index bda9455a2b5..61513f97746 100644 --- a/dlls/hnetcfg/port.c +++ b/dlls/hnetcfg/port.c @@ -1522,7 +1522,7 @@ static HRESULT WINAPI static_ports_Add( struct port_mapping mapping_data; HRESULT ret; - TRACE( "iface %p, external %ld, protocol %s, internal %ld, client %s, enabled %d, descritption %s, mapping %p.\n", + TRACE( "iface %p, external %ld, protocol %s, internal %ld, client %s, enabled %d, description %s, mapping %p.\n", iface, external, debugstr_w(protocol), internal, debugstr_w(client), enabled, debugstr_w(description), mapping );
1
0
0
0
Francois Gouget : kernel32/tests: Add a trailing linefeed to an ok() message.
by Alexandre Julliard
14 Feb '22
14 Feb '22
Module: wine Branch: master Commit: 0016df0fb142f5b7be82c1b93e20409ae7fa2e62 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=0016df0fb142f5b7be82c1b9…
Author: Francois Gouget <fgouget(a)free.fr> Date: Mon Feb 14 13:57:36 2022 +0100 kernel32/tests: Add a trailing linefeed to an ok() message. Signed-off-by: Francois Gouget <fgouget(a)free.fr> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/kernel32/tests/pipe.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dlls/kernel32/tests/pipe.c b/dlls/kernel32/tests/pipe.c index f73ef627c67..053e103bf14 100644 --- a/dlls/kernel32/tests/pipe.c +++ b/dlls/kernel32/tests/pipe.c @@ -3081,7 +3081,7 @@ static void test_blocking_rw(HANDLE writer, HANDLE reader, DWORD buf_size, BOOL res = pCancelIoEx(reader, &read_overlapped2); ok(res, "CancelIoEx failed with error %d\n", GetLastError()); res = pCancelIoEx(reader, &read_overlapped2); - ok(!res, "CancelIOEx succeeded unexpectedly"); + ok(!res, "CancelIOEx succeeded unexpectedly\n"); ok(GetLastError() == ERROR_NOT_FOUND, "In CancelIoEx failure, expected ERROR_NOT_FOUND, got %d\n", GetLastError()); test_overlapped_failure(reader, &read_overlapped2, ERROR_OPERATION_ABORTED);
1
0
0
0
Francois Gouget : msdasql: Remove a couple of unneeded NULL casts.
by Alexandre Julliard
14 Feb '22
14 Feb '22
Module: wine Branch: master Commit: 64a778338664ec65994f9a185d8c7b2cf2174890 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=64a778338664ec65994f9a18…
Author: Francois Gouget <fgouget(a)free.fr> Date: Mon Feb 14 13:57:28 2022 +0100 msdasql: Remove a couple of unneeded NULL casts. Signed-off-by: Francois Gouget <fgouget(a)free.fr> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/msdasql/msdasql_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dlls/msdasql/msdasql_main.c b/dlls/msdasql/msdasql_main.c index 3e1af95b1a7..60d46349590 100644 --- a/dlls/msdasql/msdasql_main.c +++ b/dlls/msdasql/msdasql_main.c @@ -547,7 +547,7 @@ static HRESULT WINAPI dbinit_Initialize(IDBInitialize *iface) } ret = SQLConnectW( provider->hdbc, (SQLWCHAR *)V_BSTR(&provider->properties[i].value), - SQL_NTS, (SQLWCHAR *)NULL, SQL_NTS, (SQLWCHAR *)NULL, SQL_NTS ); + SQL_NTS, NULL, SQL_NTS, NULL, SQL_NTS ); TRACE("SQLConnectW ret %d\n", ret); if (ret != SQL_SUCCESS) {
1
0
0
0
← Newer
1
...
76
77
78
79
80
81
82
...
150
Older →
Jump to page:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
Results per page:
10
25
50
100
200