Wine-Devel
By thread
wine-devel@list.winehq.org
By month
Messages by month
- ----- 2026 -----
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- 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
December 2019
- 73 participants
- 1394 messages
[PATCH 3/3] d3d8: Support texture dirty regions.
by Henri Verbeet
From: Akihiro Sagawa <sagawa.aki(a)gmail.com>
This supersedes patch 175196.
Signed-off-by: Akihiro Sagawa <sagawa.aki(a)gmail.com>
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/d3d8/tests/visual.c | 12 ++++++------
dlls/d3d8/texture.c | 12 +++++++++++-
2 files changed, 17 insertions(+), 7 deletions(-)
diff --git a/dlls/d3d8/tests/visual.c b/dlls/d3d8/tests/visual.c
index 4477184b573..ab194b9cedf 100644
--- a/dlls/d3d8/tests/visual.c
+++ b/dlls/d3d8/tests/visual.c
@@ -5529,7 +5529,7 @@ static void add_dirty_rect_test(void)
ok(SUCCEEDED(hr), "Failed to set texture, hr %#x.\n", hr);
add_dirty_rect_test_draw(device);
color = getPixelColor(device, 320, 240);
- todo_wine ok(color_match(color, 0x00ff0000, 1),
+ ok(color_match(color, 0x00ff0000, 1),
"Expected color 0x00ff0000, got 0x%08x.\n", color);
hr = IDirect3DDevice8_Present(device, NULL, NULL, NULL, NULL);
ok(SUCCEEDED(hr), "Failed to present, hr %#x.\n", hr);
@@ -5542,7 +5542,7 @@ static void add_dirty_rect_test(void)
ok(SUCCEEDED(hr), "Failed to update texture, hr %#x.\n", hr);
add_dirty_rect_test_draw(device);
color = getPixelColor(device, 320, 240);
- todo_wine ok(color_match(color, 0x00ff0000, 1),
+ ok(color_match(color, 0x00ff0000, 1),
"Expected color 0x00ff0000, got 0x%08x.\n", color);
hr = IDirect3DDevice8_Present(device, NULL, NULL, NULL, NULL);
ok(SUCCEEDED(hr), "Failed to present, hr %#x.\n", hr);
@@ -5554,7 +5554,7 @@ static void add_dirty_rect_test(void)
ok(SUCCEEDED(hr), "Failed to update texture, hr %#x.\n", hr);
add_dirty_rect_test_draw(device);
color = getPixelColor(device, 320, 240);
- todo_wine ok(color_match(color, 0x00ff0000, 1),
+ ok(color_match(color, 0x00ff0000, 1),
"Expected color 0x00ff0000, got 0x%08x.\n", color);
hr = IDirect3DDevice8_Present(device, NULL, NULL, NULL, NULL);
ok(SUCCEEDED(hr), "Failed to present, hr %#x.\n", hr);
@@ -5571,7 +5571,7 @@ static void add_dirty_rect_test(void)
ok(color_match(color, 0x0000ff00, 1),
"Expected color 0x0000ff00, got 0x%08x.\n", color);
color = getPixelColor(device, 1, 1);
- todo_wine ok(color_match(color, 0x00ff0000, 1),
+ ok(color_match(color, 0x00ff0000, 1),
"Expected color 0x00ff0000, got 0x%08x.\n", color);
hr = IDirect3DDevice8_Present(device, NULL, NULL, NULL, NULL);
ok(SUCCEEDED(hr), "Failed to present, hr %#x.\n", hr);
@@ -5593,7 +5593,7 @@ static void add_dirty_rect_test(void)
ok(SUCCEEDED(hr), "Failed to update texture, hr %#x.\n", hr);
add_dirty_rect_test_draw(device);
color = getPixelColor(device, 320, 240);
- todo_wine ok(color_match(color, 0x0000ff00, 1),
+ ok(color_match(color, 0x0000ff00, 1),
"Expected color 0x0000ff00, got 0x%08x.\n", color);
hr = IDirect3DDevice8_Present(device, NULL, NULL, NULL, NULL);
ok(SUCCEEDED(hr), "Failed to present, hr %#x.\n", hr);
@@ -5605,7 +5605,7 @@ static void add_dirty_rect_test(void)
ok(SUCCEEDED(hr), "Failed to update texture, hr %#x.\n", hr);
add_dirty_rect_test_draw(device);
color = getPixelColor(device, 320, 240);
- todo_wine ok(color_match(color, 0x0000ff00, 1),
+ ok(color_match(color, 0x0000ff00, 1),
"Expected color 0x0000ff00, got 0x%08x.\n", color);
hr = IDirect3DDevice8_Present(device, NULL, NULL, NULL, NULL);
ok(SUCCEEDED(hr), "Failed to present, hr %#x.\n", hr);
diff --git a/dlls/d3d8/texture.c b/dlls/d3d8/texture.c
index e34ae8a9c11..c82a75d87a4 100644
--- a/dlls/d3d8/texture.c
+++ b/dlls/d3d8/texture.c
@@ -1124,6 +1124,9 @@ HRESULT texture_init(struct d3d8_texture *texture, struct d3d8_device *device,
if (!levels)
levels = wined3d_log2i(max(width, height)) + 1;
+ if (pool == D3DPOOL_SYSTEMMEM)
+ flags |= WINED3D_TEXTURE_CREATE_RECORD_DIRTY_REGIONS;
+
wined3d_mutex_lock();
hr = wined3d_texture_create(device->wined3d_device, &desc, 1, levels, flags,
NULL, texture, &d3d8_texture_wined3d_parent_ops, &texture->wined3d_texture);
@@ -1175,6 +1178,9 @@ HRESULT cubetexture_init(struct d3d8_texture *texture, struct d3d8_device *devic
if (!levels)
levels = wined3d_log2i(edge_length) + 1;
+ if (pool == D3DPOOL_SYSTEMMEM)
+ flags |= WINED3D_TEXTURE_CREATE_RECORD_DIRTY_REGIONS;
+
wined3d_mutex_lock();
hr = wined3d_texture_create(device->wined3d_device, &desc, 6, levels, flags,
NULL, texture, &d3d8_texture_wined3d_parent_ops, &texture->wined3d_texture);
@@ -1195,6 +1201,7 @@ HRESULT volumetexture_init(struct d3d8_texture *texture, struct d3d8_device *dev
UINT width, UINT height, UINT depth, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool)
{
struct wined3d_resource_desc desc;
+ DWORD flags = 0;
HRESULT hr;
/* In d3d8, 3D textures can't be used as rendertarget or depth/stencil buffer. */
@@ -1228,8 +1235,11 @@ HRESULT volumetexture_init(struct d3d8_texture *texture, struct d3d8_device *dev
if (!levels)
levels = wined3d_log2i(max(max(width, height), depth)) + 1;
+ if (pool == D3DPOOL_SYSTEMMEM)
+ flags |= WINED3D_TEXTURE_CREATE_RECORD_DIRTY_REGIONS;
+
wined3d_mutex_lock();
- hr = wined3d_texture_create(device->wined3d_device, &desc, 1, levels, 0,
+ hr = wined3d_texture_create(device->wined3d_device, &desc, 1, levels, flags,
NULL, texture, &d3d8_texture_wined3d_parent_ops, &texture->wined3d_texture);
wined3d_mutex_unlock();
if (FAILED(hr))
--
2.11.0
Dec. 10, 2019
[PATCH 2/3] wined3d: Update a part of the texture if dirty regions are tracked.
by Henri Verbeet
From: Akihiro Sagawa <sagawa.aki(a)gmail.com>
Wine-Bugs: https://bugs.winehq.org/show_bug.cgi?id=35205
Signed-off-by: Akihiro Sagawa <sagawa.aki(a)gmail.com>
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
This supersedes patch 175195.
dlls/d3d9/tests/visual.c | 12 ++++-----
dlls/wined3d/device.c | 67 ++++++++++++++++++++++++++++++++++++++++--------
2 files changed, 63 insertions(+), 16 deletions(-)
diff --git a/dlls/d3d9/tests/visual.c b/dlls/d3d9/tests/visual.c
index 0a9fb0acc29..c87337057ea 100644
--- a/dlls/d3d9/tests/visual.c
+++ b/dlls/d3d9/tests/visual.c
@@ -19340,7 +19340,7 @@ static void add_dirty_rect_test(void)
ok(SUCCEEDED(hr), "Failed to set texture, hr %#x.\n", hr);
add_dirty_rect_test_draw(device);
color = getPixelColor(device, 320, 240);
- todo_wine ok(color_match(color, 0x00ff0000, 1),
+ ok(color_match(color, 0x00ff0000, 1),
"Expected color 0x00ff0000, got 0x%08x.\n", color);
hr = IDirect3DDevice9_Present(device, NULL, NULL, NULL, NULL);
ok(SUCCEEDED(hr), "Failed to present, hr %#x.\n", hr);
@@ -19353,7 +19353,7 @@ static void add_dirty_rect_test(void)
ok(SUCCEEDED(hr), "Failed to update texture, hr %#x.\n", hr);
add_dirty_rect_test_draw(device);
color = getPixelColor(device, 320, 240);
- todo_wine ok(color_match(color, 0x00ff0000, 1),
+ ok(color_match(color, 0x00ff0000, 1),
"Expected color 0x00ff0000, got 0x%08x.\n", color);
hr = IDirect3DDevice9_Present(device, NULL, NULL, NULL, NULL);
ok(SUCCEEDED(hr), "Failed to present, hr %#x.\n", hr);
@@ -19365,7 +19365,7 @@ static void add_dirty_rect_test(void)
ok(SUCCEEDED(hr), "Failed to update texture, hr %#x.\n", hr);
add_dirty_rect_test_draw(device);
color = getPixelColor(device, 320, 240);
- todo_wine ok(color_match(color, 0x00ff0000, 1),
+ ok(color_match(color, 0x00ff0000, 1),
"Expected color 0x00ff0000, got 0x%08x.\n", color);
hr = IDirect3DDevice9_Present(device, NULL, NULL, NULL, NULL);
ok(SUCCEEDED(hr), "Failed to present, hr %#x.\n", hr);
@@ -19382,7 +19382,7 @@ static void add_dirty_rect_test(void)
ok(color_match(color, 0x0000ff00, 1),
"Expected color 0x0000ff00, got 0x%08x.\n", color);
color = getPixelColor(device, 1, 1);
- todo_wine ok(color_match(color, 0x00ff0000, 1),
+ ok(color_match(color, 0x00ff0000, 1),
"Expected color 0x00ff0000, got 0x%08x.\n", color);
hr = IDirect3DDevice9_Present(device, NULL, NULL, NULL, NULL);
ok(SUCCEEDED(hr), "Failed to present, hr %#x.\n", hr);
@@ -19404,7 +19404,7 @@ static void add_dirty_rect_test(void)
ok(SUCCEEDED(hr), "Failed to update texture, hr %#x.\n", hr);
add_dirty_rect_test_draw(device);
color = getPixelColor(device, 320, 240);
- todo_wine ok(color_match(color, 0x0000ff00, 1),
+ ok(color_match(color, 0x0000ff00, 1),
"Expected color 0x0000ff00, got 0x%08x.\n", color);
hr = IDirect3DDevice9_Present(device, NULL, NULL, NULL, NULL);
ok(SUCCEEDED(hr), "Failed to present, hr %#x.\n", hr);
@@ -19416,7 +19416,7 @@ static void add_dirty_rect_test(void)
ok(SUCCEEDED(hr), "Failed to update texture, hr %#x.\n", hr);
add_dirty_rect_test_draw(device);
color = getPixelColor(device, 320, 240);
- todo_wine ok(color_match(color, 0x0000ff00, 1),
+ ok(color_match(color, 0x0000ff00, 1),
"Expected color 0x0000ff00, got 0x%08x.\n", color);
hr = IDirect3DDevice9_Present(device, NULL, NULL, NULL, NULL);
ok(SUCCEEDED(hr), "Failed to present, hr %#x.\n", hr);
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index dc92d4f4b74..89134207243 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -4141,19 +4141,66 @@ HRESULT CDECL wined3d_device_update_texture(struct wined3d_device *device,
}
}
- if (!entire_texture)
- FIXME("Ignoring dirty regions.\n");
-
/* Update every surface level of the texture. */
- for (i = 0; i < level_count; ++i)
+ if (entire_texture)
{
- wined3d_texture_get_level_box(dst_texture, i, &box);
- for (j = 0; j < layer_count; ++j)
+ for (i = 0; i < level_count; ++i)
+ {
+ wined3d_texture_get_level_box(dst_texture, i, &box);
+ for (j = 0; j < layer_count; ++j)
+ {
+ wined3d_cs_emit_blt_sub_resource(device->cs,
+ &dst_texture->resource, j * dst_level_count + i, &box,
+ &src_texture->resource, j * src_level_count + i + src_skip_levels, &box,
+ 0, NULL, WINED3D_TEXF_POINT);
+ }
+ }
+ }
+ else
+ {
+ unsigned int src_level, box_count, k;
+ const struct wined3d_box *boxes;
+ struct wined3d_box b;
+
+ for (i = 0; i < layer_count; ++i)
{
- wined3d_cs_emit_blt_sub_resource(device->cs,
- &dst_texture->resource, j * dst_level_count + i, &box,
- &src_texture->resource, j * src_level_count + i + src_skip_levels, &box,
- 0, NULL, WINED3D_TEXF_POINT);
+ boxes = regions[i].boxes;
+ box_count = regions[i].box_count;
+ if (regions[i].box_count >= WINED3D_MAX_DIRTY_REGION_COUNT)
+ {
+ boxes = &b;
+ box_count = 1;
+ wined3d_texture_get_level_box(dst_texture, i, &b);
+ }
+
+ for (j = 0; j < level_count; ++j)
+ {
+ src_level = j + src_skip_levels;
+
+ /* TODO: We could pass an array of boxes here to avoid
+ * multiple context acquisitions for the same resource. */
+ for (k = 0; k < box_count; ++k)
+ {
+ box = boxes[k];
+ if (src_level)
+ {
+ box.left >>= src_level;
+ box.top >>= src_level;
+ box.right = min((box.right + (1u << src_level) - 1) >> src_level,
+ wined3d_texture_get_level_width(src_texture, src_level));
+ box.bottom = min((box.bottom + (1u << src_level) - 1) >> src_level,
+ wined3d_texture_get_level_height(src_texture, src_level));
+ box.front >>= src_level;
+ box.back = min((box.back + (1u << src_level) - 1) >> src_level,
+ wined3d_texture_get_level_depth(src_texture, src_level));
+ }
+
+ wined3d_cs_emit_blt_sub_resource(device->cs,
+ &dst_texture->resource, i * dst_level_count + j, &box,
+ &src_texture->resource, i * src_level_count + src_level, &box,
+ 0, NULL, WINED3D_TEXF_POINT);
+ }
+ }
}
}
--
2.11.0
Dec. 10, 2019
[PATCH 1/3] wined3d: Record dirty regions for d3d9 textures.
by Henri Verbeet
From: Akihiro Sagawa <sagawa.aki(a)gmail.com>
Signed-off-by: Akihiro Sagawa <sagawa.aki(a)gmail.com>
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
This supersedes patches 175193 and 175194.
dlls/d3d9/texture.c | 9 ++++-
dlls/wined3d/device.c | 19 ++++++++++
dlls/wined3d/texture.c | 78 ++++++++++++++++++++++++++++++++++++++----
dlls/wined3d/wined3d_private.h | 10 ++++++
include/wine/wined3d.h | 1 +
5 files changed, 109 insertions(+), 8 deletions(-)
diff --git a/dlls/d3d9/texture.c b/dlls/d3d9/texture.c
index ae754b5fa2c..2ef27a6de3d 100644
--- a/dlls/d3d9/texture.c
+++ b/dlls/d3d9/texture.c
@@ -1369,6 +1369,8 @@ HRESULT texture_init(struct d3d9_texture *texture, struct d3d9_device *device,
}
if (!levels)
levels = wined3d_log2i(max(width, height)) + 1;
+ if (pool == D3DPOOL_SYSTEMMEM)
+ flags |= WINED3D_TEXTURE_CREATE_RECORD_DIRTY_REGIONS;
wined3d_mutex_lock();
hr = wined3d_texture_create(device->wined3d_device, &desc, 1, levels, flags,
@@ -1449,6 +1451,8 @@ HRESULT cubetexture_init(struct d3d9_texture *texture, struct d3d9_device *devic
}
if (!levels)
levels = wined3d_log2i(edge_length) + 1;
+ if (pool == D3DPOOL_SYSTEMMEM)
+ flags |= WINED3D_TEXTURE_CREATE_RECORD_DIRTY_REGIONS;
wined3d_mutex_lock();
hr = wined3d_texture_create(device->wined3d_device, &desc, 6, levels, flags,
@@ -1470,6 +1474,7 @@ HRESULT volumetexture_init(struct d3d9_texture *texture, struct d3d9_device *dev
UINT width, UINT height, UINT depth, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool)
{
struct wined3d_resource_desc desc;
+ DWORD flags = 0;
HRESULT hr;
if (pool == D3DPOOL_MANAGED && device->d3d_parent->extended)
@@ -1513,9 +1518,11 @@ HRESULT volumetexture_init(struct d3d9_texture *texture, struct d3d9_device *dev
}
if (!levels)
levels = wined3d_log2i(max(max(width, height), depth)) + 1;
+ if (pool == D3DPOOL_SYSTEMMEM)
+ flags |= WINED3D_TEXTURE_CREATE_RECORD_DIRTY_REGIONS;
wined3d_mutex_lock();
- hr = wined3d_texture_create(device->wined3d_device, &desc, 1, levels, 0,
+ hr = wined3d_texture_create(device->wined3d_device, &desc, 1, levels, flags,
NULL, texture, &d3d9_texture_wined3d_parent_ops, &texture->wined3d_texture);
wined3d_mutex_unlock();
if (FAILED(hr))
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 0ae841d4e35..dc92d4f4b74 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -4059,8 +4059,10 @@ HRESULT CDECL wined3d_device_update_texture(struct wined3d_device *device,
{
unsigned int src_size, dst_size, src_skip_levels = 0;
unsigned int src_level_count, dst_level_count;
+ const struct wined3d_dirty_regions *regions;
unsigned int layer_count, level_count, i, j;
enum wined3d_resource_type type;
+ BOOL entire_texture = TRUE;
struct wined3d_box box;
TRACE("device %p, src_texture %p, dst_texture %p.\n", device, src_texture, dst_texture);
@@ -4127,6 +4129,21 @@ HRESULT CDECL wined3d_device_update_texture(struct wined3d_device *device,
return WINED3DERR_INVALIDCALL;
}
+ if ((regions = src_texture->dirty_regions))
+ {
+ for (i = 0; i < layer_count && entire_texture; ++i)
+ {
+ if (regions[i].box_count >= WINED3D_MAX_DIRTY_REGION_COUNT)
+ continue;
+
+ entire_texture = FALSE;
+ break;
+ }
+ }
+
+ if (!entire_texture)
+ FIXME("Ignoring dirty regions.\n");
+
/* Update every surface level of the texture. */
for (i = 0; i < level_count; ++i)
{
@@ -4140,6 +4157,8 @@ HRESULT CDECL wined3d_device_update_texture(struct wined3d_device *device,
}
}
+ wined3d_texture_clear_dirty_regions(src_texture);
+
return WINED3D_OK;
}
diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c
index 7c9c8298519..03372504bc6 100644
--- a/dlls/wined3d/texture.c
+++ b/dlls/wined3d/texture.c
@@ -340,6 +340,21 @@ void wined3d_texture_invalidate_location(struct wined3d_texture *texture,
sub_resource_idx, texture);
}
+void wined3d_texture_clear_dirty_regions(struct wined3d_texture *texture)
+{
+ unsigned int i;
+
+ TRACE("texture %p\n", texture);
+
+ if (!texture->dirty_regions)
+ return;
+
+ for (i = 0; i < texture->layer_count; ++i)
+ {
+ texture->dirty_regions[i].box_count = 0;
+ }
+}
+
static BOOL wined3d_texture_copy_sysmem_location(struct wined3d_texture *texture,
unsigned int sub_resource_idx, struct wined3d_context *context, DWORD location)
{
@@ -1114,6 +1129,15 @@ static void wined3d_texture_destroy_object(void *object)
heap_free(texture->overlay_info);
}
+ if (texture->dirty_regions)
+ {
+ for (i = 0; i < texture->layer_count; ++i)
+ {
+ heap_free(texture->dirty_regions[i].boxes);
+ }
+ heap_free(texture->dirty_regions);
+ }
+
resource->resource_ops->resource_unload(resource);
}
@@ -1770,6 +1794,37 @@ static struct wined3d_texture_sub_resource *wined3d_texture_get_sub_resource(str
return &texture->sub_resources[sub_resource_idx];
}
+static void wined3d_texture_dirty_region_add(struct wined3d_texture *texture,
+ unsigned int layer, const struct wined3d_box *box)
+{
+ struct wined3d_dirty_regions *regions;
+ unsigned int count;
+
+ if (!texture->dirty_regions)
+ return;
+
+ regions = &texture->dirty_regions[layer];
+ count = regions->box_count + 1;
+ if (count >= WINED3D_MAX_DIRTY_REGION_COUNT || !box
+ || (!box->left && !box->top && !box->front
+ && box->right == texture->resource.width
+ && box->bottom == texture->resource.height
+ && box->back == texture->resource.depth))
+ {
+ regions->box_count = WINED3D_MAX_DIRTY_REGION_COUNT;
+ return;
+ }
+
+ if (!wined3d_array_reserve((void **)®ions->boxes, ®ions->boxes_size, count, sizeof(*regions->boxes)))
+ {
+ WARN("Failed to grow boxes array, marking entire texture dirty.\n");
+ regions->box_count = WINED3D_MAX_DIRTY_REGION_COUNT;
+ return;
+ }
+
+ regions->boxes[regions->box_count++] = *box;
+}
+
HRESULT CDECL wined3d_texture_add_dirty_region(struct wined3d_texture *texture,
UINT layer, const struct wined3d_box *dirty_region)
{
@@ -1781,16 +1836,13 @@ HRESULT CDECL wined3d_texture_add_dirty_region(struct wined3d_texture *texture,
return WINED3DERR_INVALIDCALL;
}
- if (dirty_region)
+ if (dirty_region && FAILED(wined3d_texture_check_box_dimensions(texture, 0, dirty_region)))
{
- if (FAILED(wined3d_texture_check_box_dimensions(texture, 0, dirty_region)))
- {
- WARN("Invalid dirty_region %s specified.\n", debug_box(dirty_region));
- return WINED3DERR_INVALIDCALL;
- }
- FIXME("Ignoring dirty_region %s.\n", debug_box(dirty_region));
+ WARN("Invalid dirty_region %s specified.\n", debug_box(dirty_region));
+ return WINED3DERR_INVALIDCALL;
}
+ wined3d_texture_dirty_region_add(texture, layer, dirty_region);
wined3d_cs_emit_add_dirty_texture_region(texture->resource.device->cs, texture, layer);
return WINED3D_OK;
@@ -3090,6 +3142,11 @@ static HRESULT texture_resource_sub_resource_map(struct wined3d_resource *resour
return E_OUTOFMEMORY;
}
+ /* We only record dirty regions for the top-most level. */
+ if (texture->dirty_regions && flags & WINED3D_MAP_WRITE
+ && !(flags & WINED3D_MAP_NO_DIRTY_UPDATE) && !texture_level)
+ wined3d_texture_dirty_region_add(texture, sub_resource_idx / texture->level_count, box);
+
if (flags & WINED3D_MAP_WRITE
&& (!(flags & WINED3D_MAP_NO_DIRTY_UPDATE) || (resource->usage & WINED3DUSAGE_DYNAMIC)))
wined3d_texture_invalidate_location(texture, sub_resource_idx, ~resource->map_binding);
@@ -3382,6 +3439,13 @@ static HRESULT wined3d_texture_init(struct wined3d_texture *texture, const struc
texture->flags |= WINED3D_TEXTURE_GENERATE_MIPMAPS;
}
+ if (flags & WINED3D_TEXTURE_CREATE_RECORD_DIRTY_REGIONS
+ && !(texture->dirty_regions = heap_calloc(texture->layer_count, sizeof(*texture->dirty_regions))))
+ {
+ wined3d_texture_cleanup_sync(texture);
+ return E_OUTOFMEMORY;
+ }
+
/* Precalculated scaling for 'faked' non power of two texture coords. */
if (texture->resource.gl_type == WINED3D_GL_RES_TYPE_TEX_RECT)
{
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 8f9ad1ce856..60ddf74a0ec 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -74,6 +74,8 @@
#define WINED3D_QUIRK_BROKEN_ARB_FOG 0x00000200
#define WINED3D_QUIRK_NO_INDEPENDENT_BIT_DEPTHS 0x00000400
+#define WINED3D_MAX_DIRTY_REGION_COUNT 7
+
struct wined3d_fragment_pipe_ops;
struct wined3d_adapter;
struct wined3d_context;
@@ -3538,6 +3540,13 @@ struct wined3d_texture
DWORD color_key_flags;
} async;
+ struct wined3d_dirty_regions
+ {
+ struct wined3d_box *boxes;
+ SIZE_T boxes_size;
+ unsigned int box_count;
+ } *dirty_regions;
+
struct wined3d_overlay_info
{
struct list entry;
@@ -3666,6 +3675,7 @@ void wined3d_texture_upload_from_texture(struct wined3d_texture *dst_texture, un
unsigned int src_sub_resource_idx, const struct wined3d_box *src_box) DECLSPEC_HIDDEN;
void wined3d_texture_validate_location(struct wined3d_texture *texture,
unsigned int sub_resource_idx, DWORD location) DECLSPEC_HIDDEN;
+void wined3d_texture_clear_dirty_regions(struct wined3d_texture *texture) DECLSPEC_HIDDEN;
HRESULT wined3d_texture_no3d_init(struct wined3d_texture *texture_no3d, struct wined3d_device *device,
const struct wined3d_resource_desc *desc, unsigned int layer_count, unsigned int level_count,
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index 4b5d4e02f9b..db88e110327 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -1565,6 +1565,7 @@ enum wined3d_shader_type
#define WINED3D_TEXTURE_CREATE_GET_DC_LENIENT 0x00000004
#define WINED3D_TEXTURE_CREATE_GET_DC 0x00000008
#define WINED3D_TEXTURE_CREATE_GENERATE_MIPMAPS 0x00000010
+#define WINED3D_TEXTURE_CREATE_RECORD_DIRTY_REGIONS 0x00000020
#define WINED3D_STANDARD_MULTISAMPLE_PATTERN 0xffffffff
--
2.11.0
Dec. 10, 2019
Re: [PATCH 02/10] jscript: Store the necessary function and variable info in the TypeInfo.
by Jacek Caban
Hi Gabriel,
On 12/9/19 6:12 PM, Gabriel Ivăncescu wrote:
> static DWORD get_flags(jsdisp_t *This, dispex_prop_t *prop)
> {
> if(prop->type == PROP_PROTREF) {
> @@ -590,9 +604,21 @@ static HRESULT fill_protrefs(jsdisp_t *This)
> return S_OK;
> }
>
> +struct typeinfo_func {
> + dispex_prop_t *prop;
> + jsdisp_t *disp;
> +};
Storing the whole function object reference does not seem right here.
Maybe we should store function_code_t instead? We could have a single
getter that could replace both is_source_function() and
get_source_function_params() from your patches. Such getter should
probably use function_vtbl_t for that. Storing bytecode_t pointer inside
function_code_t could also be handy for reference tracking.
>
> + for (prop = This->props, end = prop + This->prop_cnt; prop != end; prop++)
> + {
> + if (!prop->name || prop->type != PROP_JSVAL || !(prop->flags & PROPF_ENUMERABLE))
> + continue;
> +
> + /* If two identifiers differ only by case, the TypeInfo fails */
> + pos = This->props[get_props_idx(This, prop->hash)].bucket_head;
> + while (pos)
> + {
> + cur = This->props + pos;
> +
> + if (prop->hash == cur->hash && prop != cur &&
> + cur->type == PROP_JSVAL && (cur->flags & PROPF_ENUMERABLE) &&
> + !wcsicmp(prop->name, cur->name))
> + {
> + return TYPE_E_AMBIGUOUSNAME;
> + }
> + pos = cur->bucket_next;
> + }
It would be good to limit dispex_prop_t usage inside ITypeInfo in
general. IDispatchEx support in jscript deserves pretty deep changes and
extending usage of its internal structure may not be helpful. I'm fine
with trying to use them here for now, but I'd rather avoid depending on
its internals and that's the kind of internal thing I'd rather not have
here. We could call GetDispID(fdexNameCaseInsensitive) and compare
returned id to current one, if we had support for that. However, is it
really important in practice? I wouldn't mind leaving it as FIXME for now.
Thanks,
Jacek
Dec. 10, 2019
Re: [PATCH 04/14] vbscript: Implement ScriptTypeInfo_GetNames.
by Gabriel Ivăncescu
On 12/10/19 5:35 PM, Jacek Caban wrote:
> On 12/9/19 4:29 PM, Gabriel Ivăncescu wrote:
>> +enum memid_type {
>> +Â Â Â memid_invalid,
>> +Â Â Â memid_inherited,
>> +Â Â Â memid_func,
>> +Â Â Â memid_var
>> +};
>> +
>> +static inline enum memid_type get_memid_type(const ScriptTypeInfo
>> *typeinfo, MEMBERID memid)
>> +{
>> +Â Â Â if (memid <= 0) return memid_invalid;
>> +Â Â Â if (memid & DISPID_FUNCTION_MASK)
>> +Â Â Â {
>> +Â Â Â Â Â Â Â memid &= ~DISPID_FUNCTION_MASK;
>> +Â Â Â Â Â Â Â if (memid >= typeinfo->func_memid_map_cnt)
>> +Â Â Â Â Â Â Â Â Â Â Â return memid_inherited;
>> +Â Â Â Â Â Â Â if (typeinfo->func_memid_map[memid] == ~0)
>> +Â Â Â Â Â Â Â Â Â Â Â return memid_invalid;
>> +Â Â Â Â Â Â Â return memid_func;
>> +Â Â Â }
>> +Â Â Â if (memid > typeinfo->num_vars)
>> +Â Â Â Â Â Â Â return memid_inherited;
>> +Â Â Â return memid_var;
>> +}
>
>
> It seems that could let default ITypeInfo handle invalid IDs and you
> could just forward all calls to unknown IDs to it. You don't need a new
> map for that, you could just use a binary search on funcs.
>
>
> Thanks,
>
> Jacek
>
Sure, that sounds like a good approach as well. I'll look into it tomorrow.
I have a question, though, about jscript (similar patch for jscript, not
sent yet to mailing list). In jscript, variables and functions can be
deleted, and so currently I have a map of memids for both vars and
functions (just one map for both).
Should I also use a binary search there (needed for both variables and
functions), or rather keep the single map for both, which I think is
slightly simpler code?
Currently I identify whether an element in the map is a variable or a
function by looking at where it points to: if it points within the
bounds of the function array, then it's a function. So no extra fields
needed, other than the map itself.
This is all for jscript of course (not vbscript or this patch, but related).
Thanks,
Gabriel
Dec. 10, 2019
Re: [PATCH 01/10] jscript: Add script TypeInfo stub.
by Jacek Caban
Signed-off-by: Jacek Caban <jacek(a)codeweavers.com>
Dec. 10, 2019
[PATCH v4 5/5] strmbase/renderer: Use base sink connection methods.
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
v4: fix test failures.
As regards the todo_wine introduced by this patch, the bug is legitimate (native
can handle 24 bpp) and was previously masked by the fact that we did not
reinitialize the VMR9 on every connection.
dlls/quartz/tests/vmr7.c | 2 +-
dlls/quartz/tests/vmr9.c | 21 +++++++++-----
dlls/quartz/vmr9.c | 8 +++--
dlls/strmbase/renderer.c | 63 ++++++++++++++--------------------------
4 files changed, 40 insertions(+), 54 deletions(-)
diff --git a/dlls/quartz/tests/vmr7.c b/dlls/quartz/tests/vmr7.c
index dae86bd3fa..4a971dcdc1 100644
--- a/dlls/quartz/tests/vmr7.c
+++ b/dlls/quartz/tests/vmr7.c
@@ -1392,7 +1392,7 @@ static void test_connect_pin(void)
hr = IFilterGraph2_Disconnect(graph, pin);
ok(hr == S_OK, "Got hr %#x.\n", hr);
hr = IFilterGraph2_Disconnect(graph, pin);
- todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
ok(source.source.pin.peer == pin, "Got peer %p.\n", peer);
IFilterGraph2_Disconnect(graph, &source.source.pin.IPin_iface);
diff --git a/dlls/quartz/tests/vmr9.c b/dlls/quartz/tests/vmr9.c
index 5ece5c6f7b..241394277b 100644
--- a/dlls/quartz/tests/vmr9.c
+++ b/dlls/quartz/tests/vmr9.c
@@ -901,7 +901,8 @@ static HRESULT WINAPI testsource_AttemptConnection(struct strmbase_source *iface
if (FAILED(hr = IPin_ReceiveConnection(peer, &iface->pin.IPin_iface, mt)))
{
- ok(hr == VFW_E_TYPE_NOT_ACCEPTED || hr == E_FAIL, "Got hr %#x.\n", hr);
+ todo_wine_if (((VIDEOINFOHEADER *)mt->pbFormat)->bmiHeader.biBitCount == 24)
+ ok(hr == VFW_E_TYPE_NOT_ACCEPTED || hr == E_FAIL, "Got hr %#x.\n", hr);
IPin_Release(peer);
iface->pin.peer = NULL;
FreeMediaType(&iface->pin.mt);
@@ -1315,13 +1316,17 @@ static void test_connect_pin(void)
skip("Got E_FAIL when connecting.\n");
goto out;
}
- ok(hr == S_OK, "Got hr %#x for subtype %s and bpp %u.\n", hr,
- wine_dbgstr_guid(subtype_tests[i]), bpp_tests[j]);
+ todo_wine_if (bpp_tests[j] == 24)
+ ok(hr == S_OK, "Got hr %#x for subtype %s and bpp %u.\n", hr,
+ wine_dbgstr_guid(subtype_tests[i]), bpp_tests[j]);
- hr = IFilterGraph2_Disconnect(graph, &source.source.pin.IPin_iface);
- ok(hr == S_OK, "Got hr %#x.\n", hr);
- hr = IFilterGraph2_Disconnect(graph, pin);
- ok(hr == S_OK, "Got hr %#x.\n", hr);
+ if (hr == S_OK)
+ {
+ hr = IFilterGraph2_Disconnect(graph, &source.source.pin.IPin_iface);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ hr = IFilterGraph2_Disconnect(graph, pin);
+ ok(hr == S_OK, "Got hr %#x.\n", hr);
+ }
}
}
@@ -1391,7 +1396,7 @@ static void test_connect_pin(void)
hr = IFilterGraph2_Disconnect(graph, pin);
ok(hr == S_OK, "Got hr %#x.\n", hr);
hr = IFilterGraph2_Disconnect(graph, pin);
- todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+ ok(hr == S_FALSE, "Got hr %#x.\n", hr);
ok(source.source.pin.peer == pin, "Got peer %p.\n", source.source.pin.peer);
IFilterGraph2_Disconnect(graph, &source.source.pin.IPin_iface);
diff --git a/dlls/quartz/vmr9.c b/dlls/quartz/vmr9.c
index a9b90b322d..a3391870a7 100644
--- a/dlls/quartz/vmr9.c
+++ b/dlls/quartz/vmr9.c
@@ -356,7 +356,7 @@ static HRESULT VMR9_maybe_init(struct quartz_vmr *This, BOOL force)
HRESULT hr;
TRACE("my mode: %u, my window: %p, my last window: %p\n", This->mode, This->baseControlWindow.baseWindow.hWnd, This->hWndClippingWindow);
- if (This->num_surfaces || !This->renderer.sink.pin.peer)
+ if (This->num_surfaces)
return S_OK;
if (This->mode == VMR9Mode_Windowless && !This->hWndClippingWindow)
@@ -410,7 +410,8 @@ static void vmr_start_stream(struct strmbase_renderer *iface)
TRACE("(%p)\n", This);
- VMR9_maybe_init(This, TRUE);
+ if (This->renderer.sink.pin.peer)
+ VMR9_maybe_init(This, TRUE);
IVMRImagePresenter9_StartPresenting(This->presenter, This->cookie);
SetWindowPos(This->baseControlWindow.baseWindow.hWnd, NULL,
This->source_rect.left,
@@ -1760,7 +1761,8 @@ static HRESULT WINAPI VMR9WindowlessControl_SetVideoClippingWindow(IVMRWindowles
EnterCriticalSection(&This->renderer.filter.csFilter);
This->hWndClippingWindow = hwnd;
- VMR9_maybe_init(This, FALSE);
+ if (This->renderer.sink.pin.peer)
+ VMR9_maybe_init(This, FALSE);
if (!hwnd)
IVMRSurfaceAllocatorEx9_TerminateDevice(This->allocator, This->cookie);
LeaveCriticalSection(&This->renderer.filter.csFilter);
diff --git a/dlls/strmbase/renderer.c b/dlls/strmbase/renderer.c
index 7d8dbdfa93..7b9736ccfb 100644
--- a/dlls/strmbase/renderer.c
+++ b/dlls/strmbase/renderer.c
@@ -40,46 +40,6 @@ static inline struct strmbase_renderer *impl_from_IPin(IPin *iface)
return CONTAINING_RECORD(iface, struct strmbase_renderer, sink.pin.IPin_iface);
}
-static HRESULT WINAPI BaseRenderer_InputPin_ReceiveConnection(IPin *iface, IPin *peer, const AM_MEDIA_TYPE *mt)
-{
- struct strmbase_renderer *filter = impl_from_IPin(iface);
- HRESULT hr;
-
- TRACE("iface %p, peer %p, mt %p.\n", iface, peer, mt);
- strmbase_dump_media_type(mt);
-
- EnterCriticalSection(&filter->filter.csFilter);
- hr = BaseInputPinImpl_ReceiveConnection(iface, peer, mt);
- if (SUCCEEDED(hr))
- {
- if (filter->pFuncsTable->renderer_connect)
- hr = filter->pFuncsTable->renderer_connect(filter, mt);
- }
- LeaveCriticalSection(&filter->filter.csFilter);
-
- return hr;
-}
-
-static HRESULT WINAPI BaseRenderer_InputPin_Disconnect(IPin * iface)
-{
- struct strmbase_renderer *filter = impl_from_IPin(iface);
- HRESULT hr;
-
- TRACE("iface %p.\n", iface);
-
- EnterCriticalSection(&filter->filter.csFilter);
- hr = BaseInputPinImpl_Disconnect(iface);
- if (SUCCEEDED(hr))
- {
- if (filter->pFuncsTable->pfnBreakConnect)
- hr = filter->pFuncsTable->pfnBreakConnect(filter);
- }
- BaseRendererImpl_ClearPendingSample(filter);
- LeaveCriticalSection(&filter->filter.csFilter);
-
- return hr;
-}
-
static HRESULT WINAPI BaseRenderer_InputPin_EndOfStream(IPin * iface)
{
struct strmbase_renderer *filter = impl_from_IPin(iface);
@@ -157,8 +117,8 @@ static const IPinVtbl BaseRenderer_InputPin_Vtbl =
BasePinImpl_AddRef,
BasePinImpl_Release,
BaseInputPinImpl_Connect,
- BaseRenderer_InputPin_ReceiveConnection,
- BaseRenderer_InputPin_Disconnect,
+ BaseInputPinImpl_ReceiveConnection,
+ BaseInputPinImpl_Disconnect,
BasePinImpl_ConnectedTo,
BasePinImpl_ConnectionMediaType,
BasePinImpl_QueryPinInfo,
@@ -312,12 +272,31 @@ static HRESULT WINAPI BaseRenderer_Receive(struct strmbase_sink *pin, IMediaSamp
return BaseRendererImpl_Receive(filter, sample);
}
+static HRESULT sink_connect(struct strmbase_sink *iface, IPin *peer, const AM_MEDIA_TYPE *mt)
+{
+ struct strmbase_renderer *filter = impl_from_IPin(&iface->pin.IPin_iface);
+
+ if (filter->pFuncsTable->renderer_connect)
+ return filter->pFuncsTable->renderer_connect(filter, mt);
+ return S_OK;
+}
+
+static void sink_disconnect(struct strmbase_sink *iface)
+{
+ struct strmbase_renderer *filter = impl_from_IPin(&iface->pin.IPin_iface);
+
+ if (filter->pFuncsTable->pfnBreakConnect)
+ filter->pFuncsTable->pfnBreakConnect(filter);
+}
+
static const struct strmbase_sink_ops sink_ops =
{
.base.pin_query_accept = sink_query_accept,
.base.pin_query_interface = sink_query_interface,
.base.pin_get_media_type = strmbase_pin_get_media_type,
.pfnReceive = BaseRenderer_Receive,
+ .sink_connect = sink_connect,
+ .sink_disconnect = sink_disconnect,
};
void strmbase_renderer_cleanup(struct strmbase_renderer *filter)
--
2.24.0
Dec. 10, 2019
[PATCH v4 4/5] strmbase/transform: Use base sink connection methods.
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/strmbase/transform.c | 56 +++++++++++++++------------------------
1 file changed, 21 insertions(+), 35 deletions(-)
diff --git a/dlls/strmbase/transform.c b/dlls/strmbase/transform.c
index bf74ad0f49..993e30202b 100644
--- a/dlls/strmbase/transform.c
+++ b/dlls/strmbase/transform.c
@@ -212,12 +212,31 @@ static HRESULT sink_query_interface(struct strmbase_pin *iface, REFIID iid, void
return S_OK;
}
+static HRESULT sink_connect(struct strmbase_sink *iface, IPin *peer, const AM_MEDIA_TYPE *mt)
+{
+ TransformFilter *filter = impl_from_sink_IPin(&iface->pin.IPin_iface);
+
+ if (filter->pFuncsTable->transform_connect_sink)
+ return filter->pFuncsTable->transform_connect_sink(filter, mt);
+ return S_OK;
+}
+
+static void sink_disconnect(struct strmbase_sink *iface)
+{
+ TransformFilter *filter = impl_from_sink_IPin(&iface->pin.IPin_iface);
+
+ if (filter->pFuncsTable->pfnBreakConnect)
+ filter->pFuncsTable->pfnBreakConnect(filter, PINDIR_INPUT);
+}
+
static const struct strmbase_sink_ops sink_ops =
{
.base.pin_query_accept = sink_query_accept,
.base.pin_get_media_type = strmbase_pin_get_media_type,
.base.pin_query_interface = sink_query_interface,
.pfnReceive = TransformFilter_Input_Receive,
+ .sink_connect = sink_connect,
+ .sink_disconnect = sink_disconnect,
};
static HRESULT source_query_interface(struct strmbase_pin *iface, REFIID iid, void **out)
@@ -397,39 +416,6 @@ static HRESULT WINAPI TransformFilter_InputPin_EndOfStream(IPin * iface)
return VFW_E_NOT_CONNECTED;
}
-static HRESULT WINAPI TransformFilter_InputPin_ReceiveConnection(IPin * iface, IPin * pReceivePin, const AM_MEDIA_TYPE * pmt)
-{
- TransformFilter *pTransform = impl_from_sink_IPin(iface);
- HRESULT hr = S_OK;
-
- TRACE("(%p)->(%p, %p)\n", iface, pReceivePin, pmt);
- strmbase_dump_media_type(pmt);
-
- if (pTransform->pFuncsTable->transform_connect_sink)
- hr = pTransform->pFuncsTable->transform_connect_sink(pTransform, pmt);
-
- if (SUCCEEDED(hr))
- {
- hr = BaseInputPinImpl_ReceiveConnection(iface, pReceivePin, pmt);
- if (FAILED(hr) && pTransform->pFuncsTable->pfnBreakConnect)
- pTransform->pFuncsTable->pfnBreakConnect(pTransform, PINDIR_INPUT);
- }
-
- return hr;
-}
-
-static HRESULT WINAPI TransformFilter_InputPin_Disconnect(IPin * iface)
-{
- TransformFilter *pTransform = impl_from_sink_IPin(iface);
-
- TRACE("(%p)->()\n", iface);
-
- if (pTransform->pFuncsTable->pfnBreakConnect)
- pTransform->pFuncsTable->pfnBreakConnect(pTransform, PINDIR_INPUT);
-
- return BaseInputPinImpl_Disconnect(iface);
-}
-
static HRESULT WINAPI TransformFilter_InputPin_BeginFlush(IPin * iface)
{
TransformFilter *pTransform = impl_from_sink_IPin(iface);
@@ -483,8 +469,8 @@ static const IPinVtbl TransformFilter_InputPin_Vtbl =
BasePinImpl_AddRef,
BasePinImpl_Release,
BaseInputPinImpl_Connect,
- TransformFilter_InputPin_ReceiveConnection,
- TransformFilter_InputPin_Disconnect,
+ BaseInputPinImpl_ReceiveConnection,
+ BaseInputPinImpl_Disconnect,
BasePinImpl_ConnectedTo,
BasePinImpl_ConnectionMediaType,
BasePinImpl_QueryPinInfo,
--
2.24.0
Dec. 10, 2019
[PATCH v4 3/5] strmbase: Add callbacks for sink (dis)connection.
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/qcap/avico.c | 4 +--
dlls/qcap/avimux.c | 4 +--
dlls/qcap/smartteefilter.c | 2 +-
dlls/qedit/samplegrabber.c | 2 +-
dlls/strmbase/pin.c | 56 +++++++++++++++++++++-----------------
dlls/strmbase/renderer.c | 2 +-
dlls/strmbase/transform.c | 2 +-
include/wine/strmbase.h | 9 +++---
8 files changed, 44 insertions(+), 37 deletions(-)
diff --git a/dlls/qcap/avico.c b/dlls/qcap/avico.c
index debe6bca38..f822d4e461 100644
--- a/dlls/qcap/avico.c
+++ b/dlls/qcap/avico.c
@@ -291,7 +291,7 @@ static HRESULT WINAPI AVICompressorIn_ReceiveConnection(IPin *iface,
hres = fill_format_info(This, (VIDEOINFOHEADER*)pmt->pbFormat);
if(FAILED(hres))
- BasePinImpl_Disconnect(iface);
+ BaseInputPinImpl_Disconnect(iface);
return hres;
}
@@ -302,7 +302,7 @@ static HRESULT WINAPI AVICompressorIn_Disconnect(IPin *iface)
TRACE("(%p)\n", This);
- hres = BasePinImpl_Disconnect(iface);
+ hres = BaseInputPinImpl_Disconnect(iface);
if(FAILED(hres))
return hres;
diff --git a/dlls/qcap/avimux.c b/dlls/qcap/avimux.c
index c344ab4726..63e98e8877 100644
--- a/dlls/qcap/avimux.c
+++ b/dlls/qcap/avimux.c
@@ -1469,7 +1469,7 @@ static HRESULT WINAPI AviMuxIn_ReceiveConnection(IPin *iface,
if(SUCCEEDED(hr))
hr = IMemAllocator_Commit(avimuxin->samples_allocator);
if(FAILED(hr)) {
- BasePinImpl_Disconnect(iface);
+ BaseInputPinImpl_Disconnect(iface);
return hr;
}
@@ -1497,7 +1497,7 @@ static HRESULT WINAPI AviMuxIn_Disconnect(IPin *iface)
TRACE("pin %p.\n", avimuxin);
- hr = BasePinImpl_Disconnect(iface);
+ hr = BaseInputPinImpl_Disconnect(iface);
if(FAILED(hr))
return hr;
diff --git a/dlls/qcap/smartteefilter.c b/dlls/qcap/smartteefilter.c
index 929929632f..e1fcea55f9 100644
--- a/dlls/qcap/smartteefilter.c
+++ b/dlls/qcap/smartteefilter.c
@@ -87,7 +87,7 @@ static const IPinVtbl SmartTeeFilterInputVtbl = {
BasePinImpl_Release,
BaseInputPinImpl_Connect,
BaseInputPinImpl_ReceiveConnection,
- BasePinImpl_Disconnect,
+ BaseInputPinImpl_Disconnect,
BasePinImpl_ConnectedTo,
BasePinImpl_ConnectionMediaType,
BasePinImpl_QueryPinInfo,
diff --git a/dlls/qedit/samplegrabber.c b/dlls/qedit/samplegrabber.c
index f8d90a5c0d..c65ab9caa7 100644
--- a/dlls/qedit/samplegrabber.c
+++ b/dlls/qedit/samplegrabber.c
@@ -523,7 +523,7 @@ static const IPinVtbl sink_vtbl =
BasePinImpl_Release,
BaseInputPinImpl_Connect,
SampleGrabber_In_IPin_ReceiveConnection,
- BasePinImpl_Disconnect,
+ BaseInputPinImpl_Disconnect,
BasePinImpl_ConnectedTo,
BasePinImpl_ConnectionMediaType,
BasePinImpl_QueryPinInfo,
diff --git a/dlls/strmbase/pin.c b/dlls/strmbase/pin.c
index bcac22eb3c..5255a6c7b0 100644
--- a/dlls/strmbase/pin.c
+++ b/dlls/strmbase/pin.c
@@ -119,31 +119,6 @@ ULONG WINAPI BasePinImpl_Release(IPin *iface)
return IBaseFilter_Release(&pin->filter->IBaseFilter_iface);
}
-HRESULT WINAPI BasePinImpl_Disconnect(IPin * iface)
-{
- struct strmbase_pin *This = impl_from_IPin(iface);
- HRESULT hr;
-
- TRACE("(%p)->()\n", This);
-
- EnterCriticalSection(&This->filter->csFilter);
- {
- if (This->peer)
- {
- IPin_Release(This->peer);
- This->peer = NULL;
- FreeMediaType(&This->mt);
- ZeroMemory(&This->mt, sizeof(This->mt));
- hr = S_OK;
- }
- else
- hr = S_FALSE;
- }
- LeaveCriticalSection(&This->filter->csFilter);
-
- return hr;
-}
-
HRESULT WINAPI BasePinImpl_ConnectedTo(IPin * iface, IPin ** ppPin)
{
struct strmbase_pin *This = impl_from_IPin(iface);
@@ -685,6 +660,9 @@ HRESULT WINAPI BaseInputPinImpl_ReceiveConnection(IPin * iface, IPin * pReceiveP
}
}
+ if (SUCCEEDED(hr) && This->pFuncsTable->sink_connect)
+ hr = This->pFuncsTable->sink_connect(This, pReceivePin, pmt);
+
if (SUCCEEDED(hr))
{
CopyMediaType(&This->pin.mt, pmt);
@@ -697,6 +675,34 @@ HRESULT WINAPI BaseInputPinImpl_ReceiveConnection(IPin * iface, IPin * pReceiveP
return hr;
}
+HRESULT WINAPI BaseInputPinImpl_Disconnect(IPin *iface)
+{
+ struct strmbase_sink *pin = impl_sink_from_IPin(iface);
+ HRESULT hr;
+
+ TRACE("pin %p.\n", pin);
+
+ EnterCriticalSection(&pin->pin.filter->csFilter);
+
+ if (pin->pin.peer)
+ {
+ if (pin->pFuncsTable->sink_disconnect)
+ pin->pFuncsTable->sink_disconnect(pin);
+
+ IPin_Release(pin->pin.peer);
+ pin->pin.peer = NULL;
+ FreeMediaType(&pin->pin.mt);
+ memset(&pin->pin.mt, 0, sizeof(AM_MEDIA_TYPE));
+ hr = S_OK;
+ }
+ else
+ hr = S_FALSE;
+
+ LeaveCriticalSection(&pin->pin.filter->csFilter);
+
+ return hr;
+}
+
static HRESULT deliver_endofstream(IPin* pin, LPVOID unused)
{
return IPin_EndOfStream( pin );
diff --git a/dlls/strmbase/renderer.c b/dlls/strmbase/renderer.c
index cedcd9a62a..7d8dbdfa93 100644
--- a/dlls/strmbase/renderer.c
+++ b/dlls/strmbase/renderer.c
@@ -68,7 +68,7 @@ static HRESULT WINAPI BaseRenderer_InputPin_Disconnect(IPin * iface)
TRACE("iface %p.\n", iface);
EnterCriticalSection(&filter->filter.csFilter);
- hr = BasePinImpl_Disconnect(iface);
+ hr = BaseInputPinImpl_Disconnect(iface);
if (SUCCEEDED(hr))
{
if (filter->pFuncsTable->pfnBreakConnect)
diff --git a/dlls/strmbase/transform.c b/dlls/strmbase/transform.c
index 30ed0006cb..bf74ad0f49 100644
--- a/dlls/strmbase/transform.c
+++ b/dlls/strmbase/transform.c
@@ -427,7 +427,7 @@ static HRESULT WINAPI TransformFilter_InputPin_Disconnect(IPin * iface)
if (pTransform->pFuncsTable->pfnBreakConnect)
pTransform->pFuncsTable->pfnBreakConnect(pTransform, PINDIR_INPUT);
- return BasePinImpl_Disconnect(iface);
+ return BaseInputPinImpl_Disconnect(iface);
}
static HRESULT WINAPI TransformFilter_InputPin_BeginFlush(IPin * iface)
diff --git a/include/wine/strmbase.h b/include/wine/strmbase.h
index 461214cf08..83ad2e0bd6 100644
--- a/include/wine/strmbase.h
+++ b/include/wine/strmbase.h
@@ -91,9 +91,10 @@ typedef HRESULT (WINAPI *BaseInputPin_Receive)(struct strmbase_sink *This, IMedi
struct strmbase_sink_ops
{
- BasePinFuncTable base;
- /* Optional */
- BaseInputPin_Receive pfnReceive;
+ BasePinFuncTable base;
+ BaseInputPin_Receive pfnReceive;
+ HRESULT (*sink_connect)(struct strmbase_sink *pin, IPin *peer, const AM_MEDIA_TYPE *mt);
+ void (*sink_disconnect)(struct strmbase_sink *pin);
};
/* Base Pin */
@@ -102,7 +103,7 @@ LONG WINAPI BasePinImpl_GetMediaTypeVersion(struct strmbase_pin *pin);
HRESULT WINAPI BasePinImpl_QueryInterface(IPin *iface, REFIID iid, void **out);
ULONG WINAPI BasePinImpl_AddRef(IPin *iface);
ULONG WINAPI BasePinImpl_Release(IPin *iface);
-HRESULT WINAPI BasePinImpl_Disconnect(IPin * iface);
+HRESULT WINAPI BaseInputPinImpl_Disconnect(IPin * iface);
HRESULT WINAPI BasePinImpl_ConnectedTo(IPin * iface, IPin ** ppPin);
HRESULT WINAPI BasePinImpl_ConnectionMediaType(IPin * iface, AM_MEDIA_TYPE * pmt);
HRESULT WINAPI BasePinImpl_QueryPinInfo(IPin * iface, PIN_INFO * pInfo);
--
2.24.0
Dec. 10, 2019
[PATCH v4 2/5] strmbase: Pass an AM_MEDIA_TYPE pointer to CompleteConnect().
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/quartz/dsoundrender.c | 13 +++-----
dlls/quartz/vmr9.c | 65 +++++++++++++++++++-------------------
dlls/strmbase/renderer.c | 4 +--
include/wine/strmbase.h | 3 +-
4 files changed, 39 insertions(+), 46 deletions(-)
diff --git a/dlls/quartz/dsoundrender.c b/dlls/quartz/dsoundrender.c
index cad210a876..6fd49dac9b 100644
--- a/dlls/quartz/dsoundrender.c
+++ b/dlls/quartz/dsoundrender.c
@@ -413,18 +413,13 @@ static void dsound_render_start_stream(struct strmbase_renderer *iface)
}
}
-static HRESULT WINAPI DSoundRender_CompleteConnect(struct strmbase_renderer *iface, IPin *pReceivePin)
+static HRESULT dsound_render_connect(struct strmbase_renderer *iface, const AM_MEDIA_TYPE *mt)
{
DSoundRenderImpl *This = impl_from_strmbase_renderer(iface);
- const AM_MEDIA_TYPE *pmt = &This->renderer.sink.pin.mt;
+ const WAVEFORMATEX *format = (WAVEFORMATEX *)mt->pbFormat;
HRESULT hr = S_OK;
- WAVEFORMATEX *format;
DSBUFFERDESC buf_desc;
- TRACE("(%p)->(%p)\n", This, pReceivePin);
-
- format = (WAVEFORMATEX*)pmt->pbFormat;
-
This->buf_size = format->nAvgBytesPerSec;
memset(&buf_desc,0,sizeof(DSBUFFERDESC));
@@ -433,7 +428,7 @@ static HRESULT WINAPI DSoundRender_CompleteConnect(struct strmbase_renderer *ifa
DSBCAPS_CTRLFREQUENCY | DSBCAPS_GLOBALFOCUS |
DSBCAPS_GETCURRENTPOSITION2;
buf_desc.dwBufferBytes = This->buf_size;
- buf_desc.lpwfxFormat = format;
+ buf_desc.lpwfxFormat = (WAVEFORMATEX *)format;
hr = IDirectSound8_CreateSoundBuffer(This->dsound, &buf_desc, &This->dsbuffer, NULL);
This->writepos = This->buf_size;
if (FAILED(hr))
@@ -539,7 +534,7 @@ static const struct strmbase_renderer_ops renderer_ops =
.renderer_stop_stream = dsound_render_stop_stream,
.pfnShouldDrawSampleNow = DSoundRender_ShouldDrawSampleNow,
.pfnPrepareReceive = DSoundRender_PrepareReceive,
- .pfnCompleteConnect = DSoundRender_CompleteConnect,
+ .renderer_connect = dsound_render_connect,
.pfnBreakConnect = DSoundRender_BreakConnect,
.pfnEndOfStream = DSoundRender_EndOfStream,
.pfnEndFlush = DSoundRender_EndFlush,
diff --git a/dlls/quartz/vmr9.c b/dlls/quartz/vmr9.c
index 60c19e0019..a9b90b322d 100644
--- a/dlls/quartz/vmr9.c
+++ b/dlls/quartz/vmr9.c
@@ -331,38 +331,20 @@ static HRESULT WINAPI VMR9_DoRenderSample(struct strmbase_renderer *iface, IMedi
return hr;
}
-static HRESULT WINAPI VMR9_CheckMediaType(struct strmbase_renderer *iface, const AM_MEDIA_TYPE *pmt)
+static HRESULT WINAPI VMR9_CheckMediaType(struct strmbase_renderer *iface, const AM_MEDIA_TYPE *mt)
{
- struct quartz_vmr *This = impl_from_IBaseFilter(&iface->filter.IBaseFilter_iface);
+ const VIDEOINFOHEADER *vih;
- if (!IsEqualIID(&pmt->majortype, &MEDIATYPE_Video) || !pmt->pbFormat)
+ if (!IsEqualIID(&mt->majortype, &MEDIATYPE_Video) || !mt->pbFormat)
return S_FALSE;
- /* Ignore subtype, test for bicompression instead */
- if (IsEqualIID(&pmt->formattype, &FORMAT_VideoInfo))
- {
- VIDEOINFOHEADER *format = (VIDEOINFOHEADER *)pmt->pbFormat;
+ if (!IsEqualGUID(&mt->formattype, &FORMAT_VideoInfo)
+ && !IsEqualGUID(&mt->formattype, &FORMAT_VideoInfo2))
+ return S_FALSE;
- This->bmiheader = format->bmiHeader;
- This->VideoWidth = format->bmiHeader.biWidth;
- This->VideoHeight = format->bmiHeader.biHeight;
- SetRect(&This->source_rect, 0, 0, This->VideoWidth, This->VideoHeight);
- }
- else if (IsEqualIID(&pmt->formattype, &FORMAT_VideoInfo2))
- {
- VIDEOINFOHEADER2 *format = (VIDEOINFOHEADER2 *)pmt->pbFormat;
+ vih = (VIDEOINFOHEADER *)mt->pbFormat;
- This->bmiheader = format->bmiHeader;
- This->VideoWidth = format->bmiHeader.biWidth;
- This->VideoHeight = format->bmiHeader.biHeight;
- SetRect(&This->source_rect, 0, 0, This->VideoWidth, This->VideoHeight);
- }
- else
- {
- ERR("Format type %s not supported\n", debugstr_guid(&pmt->formattype));
- return S_FALSE;
- }
- if (This->bmiheader.biCompression != BI_RGB)
+ if (vih->bmiHeader.biCompression != BI_RGB)
return S_FALSE;
return S_OK;
}
@@ -461,16 +443,33 @@ static HRESULT WINAPI VMR9_ShouldDrawSampleNow(struct strmbase_renderer *iface,
return S_FALSE;
}
-static HRESULT WINAPI VMR9_CompleteConnect(struct strmbase_renderer *This, IPin *pReceivePin)
+static HRESULT vmr_connect(struct strmbase_renderer *iface, const AM_MEDIA_TYPE *mt)
{
- struct quartz_vmr *pVMR9 = impl_from_IBaseFilter(&This->filter.IBaseFilter_iface);
+ struct quartz_vmr *filter = impl_from_IBaseFilter(&iface->filter.IBaseFilter_iface);
HRESULT hr;
- TRACE("(%p)\n", This);
+ if (IsEqualGUID(&mt->formattype, &FORMAT_VideoInfo))
+ {
+ VIDEOINFOHEADER *format = (VIDEOINFOHEADER *)mt->pbFormat;
+
+ filter->bmiheader = format->bmiHeader;
+ filter->VideoWidth = format->bmiHeader.biWidth;
+ filter->VideoHeight = format->bmiHeader.biHeight;
+ SetRect(&filter->source_rect, 0, 0, filter->VideoWidth, filter->VideoHeight);
+ }
+ else if (IsEqualIID(&mt->formattype, &FORMAT_VideoInfo2))
+ {
+ VIDEOINFOHEADER2 *format = (VIDEOINFOHEADER2 *)mt->pbFormat;
+
+ filter->bmiheader = format->bmiHeader;
+ filter->VideoWidth = format->bmiHeader.biWidth;
+ filter->VideoHeight = format->bmiHeader.biHeight;
+ SetRect(&filter->source_rect, 0, 0, filter->VideoWidth, filter->VideoHeight);
+ }
- if (pVMR9->mode ||
- SUCCEEDED(hr = IVMRFilterConfig9_SetRenderingMode(&pVMR9->IVMRFilterConfig9_iface, VMR9Mode_Windowed)))
- hr = VMR9_maybe_init(pVMR9, FALSE);
+ if (filter->mode
+ || SUCCEEDED(hr = IVMRFilterConfig9_SetRenderingMode(&filter->IVMRFilterConfig9_iface, VMR9Mode_Windowed)))
+ hr = VMR9_maybe_init(filter, FALSE);
return hr;
}
@@ -576,7 +575,7 @@ static const struct strmbase_renderer_ops renderer_ops =
.renderer_start_stream = vmr_start_stream,
.renderer_stop_stream = vmr_stop_stream,
.pfnShouldDrawSampleNow = VMR9_ShouldDrawSampleNow,
- .pfnCompleteConnect = VMR9_CompleteConnect,
+ .renderer_connect = vmr_connect,
.pfnBreakConnect = VMR9_BreakConnect,
.renderer_destroy = vmr_destroy,
.renderer_query_interface = vmr_query_interface,
diff --git a/dlls/strmbase/renderer.c b/dlls/strmbase/renderer.c
index d592ab034e..cedcd9a62a 100644
--- a/dlls/strmbase/renderer.c
+++ b/dlls/strmbase/renderer.c
@@ -52,8 +52,8 @@ static HRESULT WINAPI BaseRenderer_InputPin_ReceiveConnection(IPin *iface, IPin
hr = BaseInputPinImpl_ReceiveConnection(iface, peer, mt);
if (SUCCEEDED(hr))
{
- if (filter->pFuncsTable->pfnCompleteConnect)
- hr = filter->pFuncsTable->pfnCompleteConnect(filter, peer);
+ if (filter->pFuncsTable->renderer_connect)
+ hr = filter->pFuncsTable->renderer_connect(filter, mt);
}
LeaveCriticalSection(&filter->filter.csFilter);
diff --git a/include/wine/strmbase.h b/include/wine/strmbase.h
index 7e3b38b49d..461214cf08 100644
--- a/include/wine/strmbase.h
+++ b/include/wine/strmbase.h
@@ -523,7 +523,6 @@ typedef HRESULT (WINAPI *BaseRenderer_EndOfStream)(struct strmbase_renderer *ifa
typedef HRESULT (WINAPI *BaseRenderer_BeginFlush) (struct strmbase_renderer *iface);
typedef HRESULT (WINAPI *BaseRenderer_EndFlush) (struct strmbase_renderer *iface);
typedef HRESULT (WINAPI *BaseRenderer_BreakConnect) (struct strmbase_renderer *iface);
-typedef HRESULT (WINAPI *BaseRenderer_CompleteConnect) (struct strmbase_renderer *iface, IPin *peer);
struct strmbase_renderer_ops
{
@@ -534,7 +533,7 @@ struct strmbase_renderer_ops
void (*renderer_stop_stream)(struct strmbase_renderer *iface);
BaseRenderer_ShouldDrawSampleNow pfnShouldDrawSampleNow;
BaseRenderer_PrepareReceive pfnPrepareReceive;
- BaseRenderer_CompleteConnect pfnCompleteConnect;
+ HRESULT (*renderer_connect)(struct strmbase_renderer *iface, const AM_MEDIA_TYPE *mt);
BaseRenderer_BreakConnect pfnBreakConnect;
BaseRenderer_EndOfStream pfnEndOfStream;
BaseRenderer_EndFlush pfnEndFlush;
--
2.24.0
Dec. 10, 2019
[PATCH v4 1/5] strmbase: Combine the SetMediaType() and CompleteConnect() callbacks.
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/quartz/acmwrapper.c | 115 +++++++-----------------
dlls/quartz/avidec.c | 37 ++------
dlls/strmbase/transform.c | 7 +-
dlls/winegstreamer/gsttffilter.c | 146 +++++++++++--------------------
dlls/wineqtdecoder/qtvdecoder.c | 25 ++----
include/wine/strmbase.h | 5 +-
6 files changed, 103 insertions(+), 232 deletions(-)
diff --git a/dlls/quartz/acmwrapper.c b/dlls/quartz/acmwrapper.c
index 8eea6ab147..33d9debe5c 100644
--- a/dlls/quartz/acmwrapper.c
+++ b/dlls/quartz/acmwrapper.c
@@ -40,7 +40,6 @@ typedef struct ACMWrapperImpl
TransformFilter tf;
HACMSTREAM has;
- LPWAVEFORMATEX pWfIn;
LPWAVEFORMATEX pWfOut;
LONGLONG lasttime_real;
@@ -224,85 +223,43 @@ error:
return hr;
}
-static HRESULT WINAPI ACMWrapper_SetMediaType(TransformFilter *tf, PIN_DIRECTION dir, const AM_MEDIA_TYPE * pmt)
+static BOOL is_audio_subtype(const GUID *guid)
{
- ACMWrapperImpl* This = impl_from_TransformFilter(tf);
- MMRESULT res;
-
- TRACE("(%p)->(%i %p)\n", This, dir, pmt);
-
- if (dir != PINDIR_INPUT)
- return S_OK;
-
- /* Check root (GUID w/o FOURCC) */
- if ((IsEqualIID(&pmt->majortype, &MEDIATYPE_Audio)) &&
- (!memcmp(((const char *)&pmt->subtype)+4, ((const char *)&MEDIATYPE_Audio)+4, sizeof(GUID)-4)) &&
- (IsEqualIID(&pmt->formattype, &FORMAT_WaveFormatEx)))
- {
- HACMSTREAM drv;
- WAVEFORMATEX *wfx = (WAVEFORMATEX*)pmt->pbFormat;
- AM_MEDIA_TYPE* outpmt = &This->tf.pmt;
-
- if (!wfx || wfx->wFormatTag == WAVE_FORMAT_PCM || wfx->wFormatTag == WAVE_FORMAT_EXTENSIBLE)
- return VFW_E_TYPE_NOT_ACCEPTED;
- FreeMediaType(outpmt);
-
- This->pWfIn = (LPWAVEFORMATEX)pmt->pbFormat;
-
- /* HACK */
- /* TRACE("ALIGN = %d\n", pACMWrapper->pWfIn->nBlockAlign); */
- /* pACMWrapper->pWfIn->nBlockAlign = 1; */
-
- /* Set output audio data to PCM */
- CopyMediaType(outpmt, pmt);
- outpmt->subtype.Data1 = WAVE_FORMAT_PCM;
- This->pWfOut = (WAVEFORMATEX*)outpmt->pbFormat;
- This->pWfOut->wFormatTag = WAVE_FORMAT_PCM;
- This->pWfOut->wBitsPerSample = 16;
- This->pWfOut->nBlockAlign = This->pWfOut->wBitsPerSample * This->pWfOut->nChannels / 8;
- This->pWfOut->cbSize = 0;
- This->pWfOut->nAvgBytesPerSec = This->pWfOut->nChannels * This->pWfOut->nSamplesPerSec
- * (This->pWfOut->wBitsPerSample/8);
-
- if (!(res = acmStreamOpen(&drv, NULL, This->pWfIn, This->pWfOut, NULL, 0, 0, 0)))
- {
- This->has = drv;
-
- TRACE("Connection accepted\n");
- return S_OK;
- }
- else
- FIXME("acmStreamOpen returned %d\n", res);
- FreeMediaType(outpmt);
- TRACE("Unable to find a suitable ACM decompressor\n");
- }
-
- TRACE("Connection refused\n");
- return VFW_E_TYPE_NOT_ACCEPTED;
+ return !memcmp(&guid->Data2, &MEDIATYPE_Audio.Data2, sizeof(GUID) - sizeof(int));
}
-static HRESULT WINAPI ACMWrapper_CompleteConnect(TransformFilter *tf, PIN_DIRECTION dir, IPin *pin)
+static HRESULT acm_wrapper_connect_sink(TransformFilter *iface, const AM_MEDIA_TYPE *mt)
{
- ACMWrapperImpl* This = impl_from_TransformFilter(tf);
- MMRESULT res;
+ ACMWrapperImpl *filter = impl_from_TransformFilter(iface);
+ const WAVEFORMATEX *wfx = (WAVEFORMATEX *)mt->pbFormat;
HACMSTREAM drv;
+ MMRESULT res;
- TRACE("(%p)\n", This);
-
- if (dir != PINDIR_INPUT)
- return S_OK;
-
- if (!(res = acmStreamOpen(&drv, NULL, This->pWfIn, This->pWfOut, NULL, 0, 0, 0)))
+ if (!IsEqualGUID(&mt->majortype, &MEDIATYPE_Audio) || !is_audio_subtype(&mt->subtype)
+ || !IsEqualGUID(&mt->formattype, &FORMAT_WaveFormatEx) || !wfx
+ || wfx->wFormatTag == WAVE_FORMAT_PCM || wfx->wFormatTag == WAVE_FORMAT_EXTENSIBLE)
+ return VFW_E_TYPE_NOT_ACCEPTED;
+
+ CopyMediaType(&filter->tf.pmt, mt);
+ filter->tf.pmt.subtype.Data1 = WAVE_FORMAT_PCM;
+ filter->pWfOut = (WAVEFORMATEX *)filter->tf.pmt.pbFormat;
+ filter->pWfOut->wFormatTag = WAVE_FORMAT_PCM;
+ filter->pWfOut->wBitsPerSample = 16;
+ filter->pWfOut->nBlockAlign = filter->pWfOut->wBitsPerSample * filter->pWfOut->nChannels / 8;
+ filter->pWfOut->cbSize = 0;
+ filter->pWfOut->nAvgBytesPerSec = filter->pWfOut->nChannels * filter->pWfOut->nSamplesPerSec
+ * (filter->pWfOut->wBitsPerSample / 8);
+
+ if ((res = acmStreamOpen(&drv, NULL, (WAVEFORMATEX *)wfx, filter->pWfOut, NULL, 0, 0, 0)))
{
- This->has = drv;
-
- TRACE("Connection accepted\n");
- return S_OK;
+ ERR("Failed to open stream, error %u.\n", res);
+ FreeMediaType(&filter->tf.pmt);
+ return VFW_E_TYPE_NOT_ACCEPTED;
}
- FIXME("acmStreamOpen returned %d\n", res);
- TRACE("Unable to find a suitable ACM decompressor\n");
- return VFW_E_TYPE_NOT_ACCEPTED;
+ filter->has = drv;
+
+ return S_OK;
}
static HRESULT WINAPI ACMWrapper_BreakConnect(TransformFilter *tf, PIN_DIRECTION dir)
@@ -341,18 +298,10 @@ static HRESULT WINAPI ACMWrapper_DecideBufferSize(TransformFilter *tf, IMemAlloc
}
static const TransformFilterFuncTable ACMWrapper_FuncsTable = {
- ACMWrapper_DecideBufferSize,
- NULL,
- ACMWrapper_Receive,
- NULL,
- NULL,
- ACMWrapper_SetMediaType,
- ACMWrapper_CompleteConnect,
- ACMWrapper_BreakConnect,
- NULL,
- NULL,
- NULL,
- NULL
+ .pfnDecideBufferSize = ACMWrapper_DecideBufferSize,
+ .pfnReceive = ACMWrapper_Receive,
+ .transform_connect_sink = acm_wrapper_connect_sink,
+ .pfnBreakConnect = ACMWrapper_BreakConnect,
};
HRESULT ACMWrapper_create(IUnknown *outer, void **out)
diff --git a/dlls/quartz/avidec.c b/dlls/quartz/avidec.c
index 32969a3473..abed957fa6 100644
--- a/dlls/quartz/avidec.c
+++ b/dlls/quartz/avidec.c
@@ -210,16 +210,11 @@ static HRESULT WINAPI AVIDec_StopStreaming(TransformFilter* pTransformFilter)
return S_OK;
}
-static HRESULT WINAPI AVIDec_SetMediaType(TransformFilter *tf, PIN_DIRECTION dir, const AM_MEDIA_TYPE * pmt)
+static HRESULT avi_dec_connect_sink(TransformFilter *tf, const AM_MEDIA_TYPE *pmt)
{
AVIDecImpl* This = impl_from_TransformFilter(tf);
HRESULT hr = VFW_E_TYPE_NOT_ACCEPTED;
- TRACE("(%p)->(%p)\n", This, pmt);
-
- if (dir != PINDIR_INPUT)
- return S_OK;
-
/* Check root (GUID w/o FOURCC) */
if ((IsEqualIID(&pmt->majortype, &MEDIATYPE_Video)) &&
(!memcmp(((const char *)&pmt->subtype)+4, ((const char *)&MEDIATYPE_Video)+4, sizeof(GUID)-4)))
@@ -310,15 +305,6 @@ failed:
return hr;
}
-static HRESULT WINAPI AVIDec_CompleteConnect(TransformFilter *tf, PIN_DIRECTION dir, IPin *pin)
-{
- AVIDecImpl* This = impl_from_TransformFilter(tf);
-
- TRACE("(%p)\n", This);
-
- return S_OK;
-}
-
static HRESULT WINAPI AVIDec_BreakConnect(TransformFilter *tf, PIN_DIRECTION dir)
{
AVIDecImpl *This = impl_from_TransformFilter(tf);
@@ -357,19 +343,14 @@ static HRESULT WINAPI AVIDec_DecideBufferSize(TransformFilter *tf, IMemAllocator
}
static const TransformFilterFuncTable AVIDec_FuncsTable = {
- AVIDec_DecideBufferSize,
- AVIDec_StartStreaming,
- AVIDec_Receive,
- AVIDec_StopStreaming,
- NULL,
- AVIDec_SetMediaType,
- AVIDec_CompleteConnect,
- AVIDec_BreakConnect,
- NULL,
- NULL,
- AVIDec_EndFlush,
- NULL,
- AVIDec_NotifyDrop
+ .pfnDecideBufferSize = AVIDec_DecideBufferSize,
+ .pfnStartStreaming = AVIDec_StartStreaming,
+ .pfnReceive = AVIDec_Receive,
+ .pfnStopStreaming = AVIDec_StopStreaming,
+ .transform_connect_sink = avi_dec_connect_sink,
+ .pfnBreakConnect = AVIDec_BreakConnect,
+ .pfnEndFlush = AVIDec_EndFlush,
+ .pfnNotify = AVIDec_NotifyDrop,
};
HRESULT AVIDec_create(IUnknown *outer, void **out)
diff --git a/dlls/strmbase/transform.c b/dlls/strmbase/transform.c
index 7a79f70905..30ed0006cb 100644
--- a/dlls/strmbase/transform.c
+++ b/dlls/strmbase/transform.c
@@ -405,11 +405,8 @@ static HRESULT WINAPI TransformFilter_InputPin_ReceiveConnection(IPin * iface, I
TRACE("(%p)->(%p, %p)\n", iface, pReceivePin, pmt);
strmbase_dump_media_type(pmt);
- if (pTransform->pFuncsTable->pfnSetMediaType)
- hr = pTransform->pFuncsTable->pfnSetMediaType(pTransform, PINDIR_INPUT, pmt);
-
- if (SUCCEEDED(hr) && pTransform->pFuncsTable->pfnCompleteConnect)
- hr = pTransform->pFuncsTable->pfnCompleteConnect(pTransform, PINDIR_INPUT, pReceivePin);
+ if (pTransform->pFuncsTable->transform_connect_sink)
+ hr = pTransform->pFuncsTable->transform_connect_sink(pTransform, pmt);
if (SUCCEEDED(hr))
{
diff --git a/dlls/winegstreamer/gsttffilter.c b/dlls/winegstreamer/gsttffilter.c
index ee1851dfdc..d44a6ae33a 100644
--- a/dlls/winegstreamer/gsttffilter.c
+++ b/dlls/winegstreamer/gsttffilter.c
@@ -516,7 +516,7 @@ static HRESULT WINAPI Gstreamer_Mp3_QueryConnect(TransformFilter *iface, const A
return S_OK;
}
-static HRESULT WINAPI Gstreamer_Mp3_SetMediaType(TransformFilter *tf, PIN_DIRECTION dir, const AM_MEDIA_TYPE *amt)
+static HRESULT mp3_decoder_connect_sink(TransformFilter *tf, const AM_MEDIA_TYPE *amt)
{
GstTfImpl *This = (GstTfImpl*)tf;
GstCaps *capsin, *capsout;
@@ -525,13 +525,8 @@ static HRESULT WINAPI Gstreamer_Mp3_SetMediaType(TransformFilter *tf, PIN_DIRECT
HRESULT hr;
int layer;
- TRACE("%p 0x%x %p\n", This, dir, amt);
-
mark_wine_thread();
- if (dir != PINDIR_INPUT)
- return S_OK;
-
if (Gstreamer_Mp3_QueryConnect(&This->tf, amt) == S_FALSE || !amt->pbFormat)
return VFW_E_TYPE_NOT_ACCEPTED;
@@ -588,26 +583,19 @@ static HRESULT WINAPI Gstreamer_Mp3_SetMediaType(TransformFilter *tf, PIN_DIRECT
return hr;
}
-static HRESULT WINAPI Gstreamer_Mp3_ConnectInput(TransformFilter *tf, PIN_DIRECTION dir, IPin *pin)
-{
- TRACE("%p 0x%x %p\n", tf, dir, pin);
- return S_OK;
-}
-
static const TransformFilterFuncTable Gstreamer_Mp3_vtbl = {
- Gstreamer_transform_DecideBufferSize,
- Gstreamer_transform_ProcessBegin,
- Gstreamer_transform_ProcessData,
- Gstreamer_transform_ProcessEnd,
- Gstreamer_Mp3_QueryConnect,
- Gstreamer_Mp3_SetMediaType,
- Gstreamer_Mp3_ConnectInput,
- Gstreamer_transform_Cleanup,
- Gstreamer_transform_EndOfStream,
- Gstreamer_transform_BeginFlush,
- Gstreamer_transform_EndFlush,
- Gstreamer_transform_NewSegment,
- Gstreamer_transform_QOS
+ .pfnDecideBufferSize = Gstreamer_transform_DecideBufferSize,
+ .pfnStartStreaming = Gstreamer_transform_ProcessBegin,
+ .pfnReceive = Gstreamer_transform_ProcessData,
+ .pfnStopStreaming = Gstreamer_transform_ProcessEnd,
+ .pfnCheckInputType = Gstreamer_Mp3_QueryConnect,
+ .transform_connect_sink = mp3_decoder_connect_sink,
+ .pfnBreakConnect = Gstreamer_transform_Cleanup,
+ .pfnEndOfStream = Gstreamer_transform_EndOfStream,
+ .pfnBeginFlush = Gstreamer_transform_BeginFlush,
+ .pfnEndFlush = Gstreamer_transform_EndFlush,
+ .pfnNewSegment = Gstreamer_transform_NewSegment,
+ .pfnNotify = Gstreamer_transform_QOS,
};
IUnknown * CALLBACK Gstreamer_Mp3_create(IUnknown *punkouter, HRESULT *phr)
@@ -664,13 +652,7 @@ static HRESULT WINAPI Gstreamer_YUV_QueryConnect(TransformFilter *iface, const A
}
}
-static HRESULT WINAPI Gstreamer_YUV_ConnectInput(TransformFilter *tf, PIN_DIRECTION dir, IPin *pin)
-{
- TRACE("%p 0x%x %p\n", tf, dir, pin);
- return S_OK;
-}
-
-static HRESULT WINAPI Gstreamer_YUV2RGB_SetMediaType(TransformFilter *tf, PIN_DIRECTION dir, const AM_MEDIA_TYPE *amt)
+static HRESULT yuv_to_rgb_connect_sink(TransformFilter *tf, const AM_MEDIA_TYPE *amt)
{
GstTfImpl *This = (GstTfImpl*)tf;
GstCaps *capsin, *capsout;
@@ -679,13 +661,8 @@ static HRESULT WINAPI Gstreamer_YUV2RGB_SetMediaType(TransformFilter *tf, PIN_DI
int avgtime;
LONG width, height;
- TRACE("%p 0x%x %p\n", This, dir, amt);
-
mark_wine_thread();
- if (dir != PINDIR_INPUT)
- return S_OK;
-
if (Gstreamer_YUV_QueryConnect(&This->tf, amt) == S_FALSE || !amt->pbFormat)
return E_FAIL;
@@ -738,19 +715,18 @@ static HRESULT WINAPI Gstreamer_YUV2RGB_SetMediaType(TransformFilter *tf, PIN_DI
}
static const TransformFilterFuncTable Gstreamer_YUV2RGB_vtbl = {
- Gstreamer_transform_DecideBufferSize,
- Gstreamer_transform_ProcessBegin,
- Gstreamer_transform_ProcessData,
- Gstreamer_transform_ProcessEnd,
- Gstreamer_YUV_QueryConnect,
- Gstreamer_YUV2RGB_SetMediaType,
- Gstreamer_YUV_ConnectInput,
- Gstreamer_transform_Cleanup,
- Gstreamer_transform_EndOfStream,
- Gstreamer_transform_BeginFlush,
- Gstreamer_transform_EndFlush,
- Gstreamer_transform_NewSegment,
- Gstreamer_transform_QOS
+ .pfnDecideBufferSize = Gstreamer_transform_DecideBufferSize,
+ .pfnStartStreaming = Gstreamer_transform_ProcessBegin,
+ .pfnReceive = Gstreamer_transform_ProcessData,
+ .pfnStopStreaming = Gstreamer_transform_ProcessEnd,
+ .pfnCheckInputType = Gstreamer_YUV_QueryConnect,
+ .transform_connect_sink = yuv_to_rgb_connect_sink,
+ .pfnBreakConnect = Gstreamer_transform_Cleanup,
+ .pfnEndOfStream = Gstreamer_transform_EndOfStream,
+ .pfnBeginFlush = Gstreamer_transform_BeginFlush,
+ .pfnEndFlush = Gstreamer_transform_EndFlush,
+ .pfnNewSegment = Gstreamer_transform_NewSegment,
+ .pfnNotify = Gstreamer_transform_QOS,
};
IUnknown * CALLBACK Gstreamer_YUV2RGB_create(IUnknown *punkouter, HRESULT *phr)
@@ -772,7 +748,7 @@ IUnknown * CALLBACK Gstreamer_YUV2RGB_create(IUnknown *punkouter, HRESULT *phr)
return obj;
}
-static HRESULT WINAPI Gstreamer_YUV2ARGB_SetMediaType(TransformFilter *tf, PIN_DIRECTION dir, const AM_MEDIA_TYPE *amt)
+static HRESULT yuv_to_argb_connect_sink(TransformFilter *tf, const AM_MEDIA_TYPE *amt)
{
GstTfImpl *This = (GstTfImpl*)tf;
GstCaps *capsin, *capsout;
@@ -781,13 +757,8 @@ static HRESULT WINAPI Gstreamer_YUV2ARGB_SetMediaType(TransformFilter *tf, PIN_D
int avgtime;
LONG width, height;
- TRACE("%p 0x%x %p\n", This, dir, amt);
-
mark_wine_thread();
- if (dir != PINDIR_INPUT)
- return S_OK;
-
if (Gstreamer_YUV_QueryConnect(&This->tf, amt) == S_FALSE || !amt->pbFormat)
return E_FAIL;
@@ -840,19 +811,18 @@ static HRESULT WINAPI Gstreamer_YUV2ARGB_SetMediaType(TransformFilter *tf, PIN_D
}
static const TransformFilterFuncTable Gstreamer_YUV2ARGB_vtbl = {
- Gstreamer_transform_DecideBufferSize,
- Gstreamer_transform_ProcessBegin,
- Gstreamer_transform_ProcessData,
- Gstreamer_transform_ProcessEnd,
- Gstreamer_YUV_QueryConnect,
- Gstreamer_YUV2ARGB_SetMediaType,
- Gstreamer_YUV_ConnectInput,
- Gstreamer_transform_Cleanup,
- Gstreamer_transform_EndOfStream,
- Gstreamer_transform_BeginFlush,
- Gstreamer_transform_EndFlush,
- Gstreamer_transform_NewSegment,
- Gstreamer_transform_QOS
+ .pfnDecideBufferSize = Gstreamer_transform_DecideBufferSize,
+ .pfnStartStreaming = Gstreamer_transform_ProcessBegin,
+ .pfnReceive = Gstreamer_transform_ProcessData,
+ .pfnStopStreaming = Gstreamer_transform_ProcessEnd,
+ .pfnCheckInputType = Gstreamer_YUV_QueryConnect,
+ .transform_connect_sink = yuv_to_argb_connect_sink,
+ .pfnBreakConnect = Gstreamer_transform_Cleanup,
+ .pfnEndOfStream = Gstreamer_transform_EndOfStream,
+ .pfnBeginFlush = Gstreamer_transform_BeginFlush,
+ .pfnEndFlush = Gstreamer_transform_EndFlush,
+ .pfnNewSegment = Gstreamer_transform_NewSegment,
+ .pfnNotify = Gstreamer_transform_QOS,
};
IUnknown * CALLBACK Gstreamer_YUV2ARGB_create(IUnknown *punkouter, HRESULT *phr)
@@ -886,13 +856,7 @@ static HRESULT WINAPI Gstreamer_AudioConvert_QueryConnect(TransformFilter *iface
return S_OK;
}
-static HRESULT WINAPI Gstreamer_AudioConvert_ConnectInput(TransformFilter *tf, PIN_DIRECTION dir, IPin *pin)
-{
- TRACE("%p 0x%x %p\n", tf, dir, pin);
- return S_OK;
-}
-
-static HRESULT WINAPI Gstreamer_AudioConvert_SetMediaType(TransformFilter *tf, PIN_DIRECTION dir, const AM_MEDIA_TYPE *amt)
+static HRESULT audio_converter_connect_sink(TransformFilter *tf, const AM_MEDIA_TYPE *amt)
{
GstTfImpl *This = (GstTfImpl*)tf;
GstCaps *capsin, *capsout;
@@ -905,13 +869,8 @@ static HRESULT WINAPI Gstreamer_AudioConvert_SetMediaType(TransformFilter *tf, P
BOOL inisfloat = FALSE;
int indepth;
- TRACE("%p 0x%x %p\n", This, dir, amt);
-
mark_wine_thread();
- if (dir != PINDIR_INPUT)
- return S_OK;
-
if (Gstreamer_AudioConvert_QueryConnect(&This->tf, amt) == S_FALSE || !amt->pbFormat)
return E_FAIL;
@@ -972,19 +931,18 @@ static HRESULT WINAPI Gstreamer_AudioConvert_SetMediaType(TransformFilter *tf, P
}
static const TransformFilterFuncTable Gstreamer_AudioConvert_vtbl = {
- Gstreamer_transform_DecideBufferSize,
- Gstreamer_transform_ProcessBegin,
- Gstreamer_transform_ProcessData,
- Gstreamer_transform_ProcessEnd,
- Gstreamer_AudioConvert_QueryConnect,
- Gstreamer_AudioConvert_SetMediaType,
- Gstreamer_AudioConvert_ConnectInput,
- Gstreamer_transform_Cleanup,
- Gstreamer_transform_EndOfStream,
- Gstreamer_transform_BeginFlush,
- Gstreamer_transform_EndFlush,
- Gstreamer_transform_NewSegment,
- Gstreamer_transform_QOS
+ .pfnDecideBufferSize = Gstreamer_transform_DecideBufferSize,
+ .pfnStartStreaming = Gstreamer_transform_ProcessBegin,
+ .pfnReceive = Gstreamer_transform_ProcessData,
+ .pfnStopStreaming = Gstreamer_transform_ProcessEnd,
+ .pfnCheckInputType = Gstreamer_AudioConvert_QueryConnect,
+ .transform_connect_sink = audio_converter_connect_sink,
+ .pfnBreakConnect = Gstreamer_transform_Cleanup,
+ .pfnEndOfStream = Gstreamer_transform_EndOfStream,
+ .pfnBeginFlush = Gstreamer_transform_BeginFlush,
+ .pfnEndFlush = Gstreamer_transform_EndFlush,
+ .pfnNewSegment = Gstreamer_transform_NewSegment,
+ .pfnNotify = Gstreamer_transform_QOS,
};
IUnknown * CALLBACK Gstreamer_AudioConvert_create(IUnknown *punkouter, HRESULT *phr)
diff --git a/dlls/wineqtdecoder/qtvdecoder.c b/dlls/wineqtdecoder/qtvdecoder.c
index 3da0738aec..4be654e5a1 100644
--- a/dlls/wineqtdecoder/qtvdecoder.c
+++ b/dlls/wineqtdecoder/qtvdecoder.c
@@ -336,7 +336,7 @@ static HRESULT WINAPI QTVDecoder_StopStreaming(TransformFilter* pTransformFilter
return S_OK;
}
-static HRESULT WINAPI QTVDecoder_SetMediaType(TransformFilter *tf, PIN_DIRECTION dir, const AM_MEDIA_TYPE * pmt)
+static HRESULT video_decoder_connect_sink(TransformFilter *tf, const AM_MEDIA_TYPE *pmt)
{
QTVDecoderImpl* This = impl_from_TransformFilter(tf);
HRESULT hr = VFW_E_TYPE_NOT_ACCEPTED;
@@ -344,11 +344,6 @@ static HRESULT WINAPI QTVDecoder_SetMediaType(TransformFilter *tf, PIN_DIRECTION
AM_MEDIA_TYPE *outpmt = &This->tf.pmt;
CFNumberRef n = NULL;
- TRACE("(%p)->(%p)\n", This, pmt);
-
- if (dir != PINDIR_INPUT)
- return S_OK;
-
FreeMediaType(outpmt);
CopyMediaType(outpmt, pmt);
@@ -502,18 +497,12 @@ static HRESULT WINAPI QTVDecoder_DecideBufferSize(TransformFilter *tf, IMemAlloc
}
static const TransformFilterFuncTable QTVDecoder_FuncsTable = {
- QTVDecoder_DecideBufferSize,
- QTVDecoder_StartStreaming,
- QTVDecoder_Receive,
- QTVDecoder_StopStreaming,
- NULL,
- QTVDecoder_SetMediaType,
- NULL,
- QTVDecoder_BreakConnect,
- NULL,
- NULL,
- NULL,
- NULL
+ .pfnDecideBufferSize = QTVDecoder_DecideBufferSize,
+ .pfnStartStreaming = QTVDecoder_StartStreaming,
+ .pfnReceive = QTVDecoder_Receive,
+ .pfnStopStreaming = QTVDecoder_StopStreaming,
+ .transform_connect_sink = video_decoder_connect_sink,
+ .pfnBreakConnect = QTVDecoder_BreakConnect,
};
IUnknown * CALLBACK QTVDecoder_create(IUnknown *outer, HRESULT* phr)
diff --git a/include/wine/strmbase.h b/include/wine/strmbase.h
index c3699f1925..7e3b38b49d 100644
--- a/include/wine/strmbase.h
+++ b/include/wine/strmbase.h
@@ -197,9 +197,7 @@ typedef HRESULT (WINAPI *TransformFilter_DecideBufferSize) (TransformFilter *ifa
typedef HRESULT (WINAPI *TransformFilter_StartStreaming) (TransformFilter *iface);
typedef HRESULT (WINAPI *TransformFilter_StopStreaming) (TransformFilter *iface);
typedef HRESULT (WINAPI *TransformFilter_Receive) (TransformFilter* iface, IMediaSample* pIn);
-typedef HRESULT (WINAPI *TransformFilter_CompleteConnect) (TransformFilter *iface, PIN_DIRECTION dir, IPin *pPin);
typedef HRESULT (WINAPI *TransformFilter_BreakConnect) (TransformFilter *iface, PIN_DIRECTION dir);
-typedef HRESULT (WINAPI *TransformFilter_SetMediaType) (TransformFilter *iface, PIN_DIRECTION dir, const AM_MEDIA_TYPE *pMediaType);
typedef HRESULT (WINAPI *TransformFilter_CheckInputType) (TransformFilter *iface, const AM_MEDIA_TYPE *pMediaType);
typedef HRESULT (WINAPI *TransformFilter_EndOfStream) (TransformFilter *iface);
typedef HRESULT (WINAPI *TransformFilter_BeginFlush) (TransformFilter *iface);
@@ -216,8 +214,7 @@ typedef struct TransformFilterFuncTable {
TransformFilter_Receive pfnReceive;
TransformFilter_StopStreaming pfnStopStreaming;
TransformFilter_CheckInputType pfnCheckInputType;
- TransformFilter_SetMediaType pfnSetMediaType;
- TransformFilter_CompleteConnect pfnCompleteConnect;
+ HRESULT (*transform_connect_sink)(TransformFilter *filter, const AM_MEDIA_TYPE *mt);
TransformFilter_BreakConnect pfnBreakConnect;
TransformFilter_EndOfStream pfnEndOfStream;
TransformFilter_BeginFlush pfnBeginFlush;
--
2.24.0
Dec. 10, 2019
Re: [PATCH] vbscript: Remove unused field.
by Jacek Caban
Signed-off-by: Jacek Caban <jacek(a)codeweavers.com>
Dec. 10, 2019
Re: [PATCH] jscript: Fix the spelling of a couple of comments.
by Jacek Caban
Signed-off-by: Jacek Caban <jacek(a)codeweavers.com>
Dec. 10, 2019
Re: [PATCH 04/14] vbscript: Implement ScriptTypeInfo_GetNames.
by Jacek Caban
On 12/9/19 4:29 PM, Gabriel Ivăncescu wrote:
> +enum memid_type {
> + memid_invalid,
> + memid_inherited,
> + memid_func,
> + memid_var
> +};
> +
> +static inline enum memid_type get_memid_type(const ScriptTypeInfo *typeinfo, MEMBERID memid)
> +{
> + if (memid <= 0) return memid_invalid;
> + if (memid & DISPID_FUNCTION_MASK)
> + {
> + memid &= ~DISPID_FUNCTION_MASK;
> + if (memid >= typeinfo->func_memid_map_cnt)
> + return memid_inherited;
> + if (typeinfo->func_memid_map[memid] == ~0)
> + return memid_invalid;
> + return memid_func;
> + }
> + if (memid > typeinfo->num_vars)
> + return memid_inherited;
> + return memid_var;
> +}
It seems that could let default ITypeInfo handle invalid IDs and you
could just forward all calls to unknown IDs to it. You don't need a new
map for that, you could just use a binary search on funcs.
Thanks,
Jacek
Dec. 10, 2019
[PATCH 3/3] chcp: Set the global codepage when called with an argument.
by Erich E. Hoover
MSDN does not seem to explicitly say anywhere what happens when
setting the "active" code page, but several other sources online state
that it sets both the input and output console code page (whereas
graftabl sets just the output console code page). This patch adds
that functionality so that applications that expect to be able to
change the "active" console code page can do so.
Best,
Erich
Dec. 10, 2019
[PATCH 2/3] chcp: Return the active code page when called without arguments.
by Erich E. Hoover
After doing some sleuthing on MSDN, chcp treats the input console code
page as the "active" code page (GetConsoleCP instead of GetACP). This
will appease applications that expect chcp to return the "active"
console code page.
Best,
Erich
Dec. 10, 2019
[PATCH v3 1/3] chcp: Add a stub application for changing the codepage.
by Erich E. Hoover
v3: Fix makefile mistake in v2
v2: The executable is called chcp.com even though it's a PE file (thanks Zeb!)
Anaconda expects to be able to call chcp to get/set the console codepage.
Adding a stub application is sufficient to appease it.
Best,
Erich
Dec. 10, 2019
Re: [PATCH] mshtml: Update to Wine Gecko 2.47.1.
by Marvin
Hi,
While running your changed tests, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at:
https://testbot.winehq.org/JobDetails.pl?Key=61794
Your paranoid android.
=== debian10 (32 bit report) ===
mshtml:
activex: Timeout
dom: Timeout
events: Timeout
htmldoc: Timeout
htmllocation: Timeout
=== debian10 (build log) ===
Task errors:
The task timed out
=== debian10 (32 bit WoW report) ===
mshtml:
activex: Timeout
dom: Timeout
events: Timeout
htmldoc: Timeout
htmllocation: Timeout
=== debian10 (build log) ===
Task errors:
The task timed out
Dec. 10, 2019
[PATCH vkd3d 5/5] vkd3d: Add cubic null resource.
by Conor McCarthy
Signed-off-by: Conor McCarthy <cmccarthy(a)codeweavers.com>
---
libs/vkd3d/resource.c | 21 +++++++++++++++++++--
1 file changed, 19 insertions(+), 2 deletions(-)
diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c
index cd181bc..62e8c44 100644
--- a/libs/vkd3d/resource.c
+++ b/libs/vkd3d/resource.c
@@ -2589,33 +2589,51 @@ static void vkd3d_create_null_srv(struct d3d12_desc *descriptor,
case D3D12_SRV_DIMENSION_TEXTURE1D:
vk_image = null_resources->vk_1d_image;
vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_1D;
+ vkd3d_desc.layer_count = 1;
break;
case D3D12_SRV_DIMENSION_TEXTURE1DARRAY:
vk_image = null_resources->vk_1d_image;
vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_1D_ARRAY;
+ vkd3d_desc.layer_count = 1;
break;
case D3D12_SRV_DIMENSION_TEXTURE2D:
vk_image = null_resources->vk_2d_image;
vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D;
+ vkd3d_desc.layer_count = 1;
break;
case D3D12_SRV_DIMENSION_TEXTURE2DARRAY:
vk_image = null_resources->vk_2d_image;
vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
+ vkd3d_desc.layer_count = 1;
break;
case D3D12_SRV_DIMENSION_TEXTURE2DMS:
vk_image = null_resources->vk_2dms_image;
vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D;
+ vkd3d_desc.layer_count = 1;
break;
case D3D12_SRV_DIMENSION_TEXTURE2DMSARRAY:
vk_image = null_resources->vk_2dms_image;
vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
+ vkd3d_desc.layer_count = 1;
break;
case D3D12_SRV_DIMENSION_TEXTURE3D:
vk_image = null_resources->vk_3d_image;
vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_3D;
+ vkd3d_desc.layer_count = 1;
+ break;
+
+ case D3D12_SRV_DIMENSION_TEXTURECUBE:
+ vk_image = null_resources->vk_2d_image;
+ vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_CUBE;
+ vkd3d_desc.layer_count = 6;
+ break;
+ case D3D12_SRV_DIMENSION_TEXTURECUBEARRAY:
+ vk_image = null_resources->vk_2d_image;
+ vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_CUBE_ARRAY;
+ vkd3d_desc.layer_count = 6;
break;
default:
@@ -2629,7 +2647,6 @@ static void vkd3d_create_null_srv(struct d3d12_desc *descriptor,
vkd3d_desc.miplevel_idx = 0;
vkd3d_desc.miplevel_count = 1;
vkd3d_desc.layer_idx = 0;
- vkd3d_desc.layer_count = 1;
vkd3d_desc.components.r = VK_COMPONENT_SWIZZLE_ZERO;
vkd3d_desc.components.g = VK_COMPONENT_SWIZZLE_ZERO;
vkd3d_desc.components.b = VK_COMPONENT_SWIZZLE_ZERO;
@@ -4134,7 +4151,7 @@ HRESULT vkd3d_init_null_resources(struct vkd3d_null_resources *null_resources,
goto fail;
/* 2D SRV */
- if (FAILED(hr = vkd3d_create_null_sr_texture(device, D3D12_RESOURCE_DIMENSION_TEXTURE2D, 1, false,
+ if (FAILED(hr = vkd3d_create_null_sr_texture(device, D3D12_RESOURCE_DIMENSION_TEXTURE2D, 6, false,
&null_resources->vk_2d_image, &null_resources->vk_2d_image_memory)))
goto fail;
--
2.24.0
Dec. 10, 2019
[PATCH vkd3d 4/5] vkd3d: Add 3D null resources.
by Conor McCarthy
Signed-off-by: Conor McCarthy <cmccarthy(a)codeweavers.com>
---
libs/vkd3d/resource.c | 36 ++++++++++++++++++++++++++++++++++++
libs/vkd3d/vkd3d_private.h | 6 ++++++
2 files changed, 42 insertions(+)
diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c
index 3ca29a2..cd181bc 100644
--- a/libs/vkd3d/resource.c
+++ b/libs/vkd3d/resource.c
@@ -2613,6 +2613,11 @@ static void vkd3d_create_null_srv(struct d3d12_desc *descriptor,
vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
break;
+ case D3D12_SRV_DIMENSION_TEXTURE3D:
+ vk_image = null_resources->vk_3d_image;
+ vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_3D;
+ break;
+
default:
FIXME("Unhandled view dimension %#x.\n", desc->ViewDimension);
return;
@@ -2829,6 +2834,11 @@ static void vkd3d_create_null_uav(struct d3d12_desc *descriptor,
vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
break;
+ case D3D12_UAV_DIMENSION_TEXTURE3D:
+ vk_image = null_resources->vk_3d_storage_image;
+ vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_3D;
+ break;
+
default:
FIXME("Unhandled view dimension %#x.\n", desc->ViewDimension);
return;
@@ -3950,6 +3960,10 @@ static HRESULT vkd3d_init_null_resources_data(struct vkd3d_null_resources *null_
vkd3d_transition_null_image(vk_command_buffer, null_resource->vk_2dms_image,
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, vk_procs);
+ /* transition 3D SRV image */
+ vkd3d_transition_null_image(vk_command_buffer, null_resource->vk_3d_image,
+ VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, vk_procs);
+
if ((vr = VK_CALL(vkEndCommandBuffer(vk_command_buffer))) < 0)
{
WARN("Failed to end command buffer, vr %d.\n", vr);
@@ -4134,6 +4148,16 @@ HRESULT vkd3d_init_null_resources(struct vkd3d_null_resources *null_resources,
&null_resources->vk_2d_storage_image, &null_resources->vk_2d_storage_image_memory)))
goto fail;
+ /* 3D SRV */
+ if (FAILED(hr = vkd3d_create_null_sr_texture(device, D3D12_RESOURCE_DIMENSION_TEXTURE3D, 1, false,
+ &null_resources->vk_3d_image, &null_resources->vk_3d_image_memory)))
+ goto fail;
+
+ /* 3D UAV */
+ if (FAILED(hr = vkd3d_create_null_ua_texture(device, D3D12_RESOURCE_DIMENSION_TEXTURE3D,
+ &null_resources->vk_3d_storage_image, &null_resources->vk_3d_storage_image_memory)))
+ goto fail;
+
/* set Vulkan object names */
vkd3d_set_vk_object_name_utf8(device, (uint64_t)null_resources->vk_buffer,
VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, "NULL buffer");
@@ -4157,6 +4181,12 @@ HRESULT vkd3d_init_null_resources(struct vkd3d_null_resources *null_resources,
VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, "NULL 2DMS SRV memory");
vkd3d_set_vk_object_name_utf8(device, (uint64_t)null_resources->vk_2d_storage_image,
VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, "NULL 2D UAV image");
+ vkd3d_set_vk_object_name_utf8(device, (uint64_t)null_resources->vk_3d_image,
+ VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, "NULL 3D SRV image");
+ vkd3d_set_vk_object_name_utf8(device, (uint64_t)null_resources->vk_3d_image_memory,
+ VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, "NULL 3D SRV memory");
+ vkd3d_set_vk_object_name_utf8(device, (uint64_t)null_resources->vk_3d_storage_image,
+ VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, "NULL 3D UAV image");
if (!use_sparse_resources)
{
vkd3d_set_vk_object_name_utf8(device, (uint64_t)null_resources->vk_storage_buffer_memory,
@@ -4199,5 +4229,11 @@ void vkd3d_destroy_null_resources(struct vkd3d_null_resources *null_resources,
VK_CALL(vkDestroyImage(device->vk_device, null_resources->vk_2d_storage_image, NULL));
VK_CALL(vkFreeMemory(device->vk_device, null_resources->vk_2d_storage_image_memory, NULL));
+ VK_CALL(vkDestroyImage(device->vk_device, null_resources->vk_3d_image, NULL));
+ VK_CALL(vkFreeMemory(device->vk_device, null_resources->vk_3d_image_memory, NULL));
+
+ VK_CALL(vkDestroyImage(device->vk_device, null_resources->vk_3d_storage_image, NULL));
+ VK_CALL(vkFreeMemory(device->vk_device, null_resources->vk_3d_storage_image_memory, NULL));
+
memset(null_resources, 0, sizeof(*null_resources));
}
diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h
index 58a9ce0..5b44a49 100644
--- a/libs/vkd3d/vkd3d_private.h
+++ b/libs/vkd3d/vkd3d_private.h
@@ -1071,6 +1071,12 @@ struct vkd3d_null_resources
VkImage vk_2dms_image;
VkDeviceMemory vk_2dms_image_memory;
+
+ VkImage vk_3d_image;
+ VkDeviceMemory vk_3d_image_memory;
+
+ VkImage vk_3d_storage_image;
+ VkDeviceMemory vk_3d_storage_image_memory;
};
HRESULT vkd3d_init_null_resources(struct vkd3d_null_resources *null_resources,
--
2.24.0
Dec. 10, 2019
[PATCH vkd3d 3/5] vkd3d: Add 2D multisampled null resources.
by Conor McCarthy
Signed-off-by: Conor McCarthy <cmccarthy(a)codeweavers.com>
---
libs/vkd3d/resource.c | 25 +++++++++++++++++++++++++
libs/vkd3d/vkd3d_private.h | 3 +++
2 files changed, 28 insertions(+)
diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c
index 271b881..3ca29a2 100644
--- a/libs/vkd3d/resource.c
+++ b/libs/vkd3d/resource.c
@@ -2604,6 +2604,15 @@ static void vkd3d_create_null_srv(struct d3d12_desc *descriptor,
vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
break;
+ case D3D12_SRV_DIMENSION_TEXTURE2DMS:
+ vk_image = null_resources->vk_2dms_image;
+ vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D;
+ break;
+ case D3D12_SRV_DIMENSION_TEXTURE2DMSARRAY:
+ vk_image = null_resources->vk_2dms_image;
+ vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
+ break;
+
default:
FIXME("Unhandled view dimension %#x.\n", desc->ViewDimension);
return;
@@ -3937,6 +3946,10 @@ static HRESULT vkd3d_init_null_resources_data(struct vkd3d_null_resources *null_
vkd3d_transition_null_image(vk_command_buffer, null_resource->vk_2d_image,
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, vk_procs);
+ /* transition 2DMS SRV image */
+ vkd3d_transition_null_image(vk_command_buffer, null_resource->vk_2dms_image,
+ VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, vk_procs);
+
if ((vr = VK_CALL(vkEndCommandBuffer(vk_command_buffer))) < 0)
{
WARN("Failed to end command buffer, vr %d.\n", vr);
@@ -4111,6 +4124,11 @@ HRESULT vkd3d_init_null_resources(struct vkd3d_null_resources *null_resources,
&null_resources->vk_2d_image, &null_resources->vk_2d_image_memory)))
goto fail;
+ /* 2DMS SRV */
+ if (FAILED(hr = vkd3d_create_null_sr_texture(device, D3D12_RESOURCE_DIMENSION_TEXTURE2D, 1, true,
+ &null_resources->vk_2dms_image, &null_resources->vk_2dms_image_memory)))
+ goto fail;
+
/* 2D UAV */
if (FAILED(hr = vkd3d_create_null_ua_texture(device, D3D12_RESOURCE_DIMENSION_TEXTURE2D,
&null_resources->vk_2d_storage_image, &null_resources->vk_2d_storage_image_memory)))
@@ -4133,6 +4151,10 @@ HRESULT vkd3d_init_null_resources(struct vkd3d_null_resources *null_resources,
VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, "NULL 2D SRV image");
vkd3d_set_vk_object_name_utf8(device, (uint64_t)null_resources->vk_2d_image_memory,
VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, "NULL 2D SRV memory");
+ vkd3d_set_vk_object_name_utf8(device, (uint64_t)null_resources->vk_2dms_image,
+ VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, "NULL 2DMS SRV image");
+ vkd3d_set_vk_object_name_utf8(device, (uint64_t)null_resources->vk_2dms_image_memory,
+ VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, "NULL 2DMS SRV memory");
vkd3d_set_vk_object_name_utf8(device, (uint64_t)null_resources->vk_2d_storage_image,
VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, "NULL 2D UAV image");
if (!use_sparse_resources)
@@ -4171,6 +4193,9 @@ void vkd3d_destroy_null_resources(struct vkd3d_null_resources *null_resources,
VK_CALL(vkDestroyImage(device->vk_device, null_resources->vk_2d_image, NULL));
VK_CALL(vkFreeMemory(device->vk_device, null_resources->vk_2d_image_memory, NULL));
+ VK_CALL(vkDestroyImage(device->vk_device, null_resources->vk_2dms_image, NULL));
+ VK_CALL(vkFreeMemory(device->vk_device, null_resources->vk_2dms_image_memory, NULL));
+
VK_CALL(vkDestroyImage(device->vk_device, null_resources->vk_2d_storage_image, NULL));
VK_CALL(vkFreeMemory(device->vk_device, null_resources->vk_2d_storage_image_memory, NULL));
diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h
index c23667d..58a9ce0 100644
--- a/libs/vkd3d/vkd3d_private.h
+++ b/libs/vkd3d/vkd3d_private.h
@@ -1068,6 +1068,9 @@ struct vkd3d_null_resources
VkImage vk_2d_storage_image;
VkDeviceMemory vk_2d_storage_image_memory;
+
+ VkImage vk_2dms_image;
+ VkDeviceMemory vk_2dms_image_memory;
};
HRESULT vkd3d_init_null_resources(struct vkd3d_null_resources *null_resources,
--
2.24.0
Dec. 10, 2019
[PATCH vkd3d 2/5] vkd3d: Add 1D null resources.
by Conor McCarthy
Signed-off-by: Conor McCarthy <cmccarthy(a)codeweavers.com>
---
libs/vkd3d/resource.c | 51 ++++++++++++++++++++++++++++++++++++++
libs/vkd3d/vkd3d_private.h | 6 +++++
2 files changed, 57 insertions(+)
diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c
index ab4df8e..271b881 100644
--- a/libs/vkd3d/resource.c
+++ b/libs/vkd3d/resource.c
@@ -2586,6 +2586,15 @@ static void vkd3d_create_null_srv(struct d3d12_desc *descriptor,
}
return;
+ case D3D12_SRV_DIMENSION_TEXTURE1D:
+ vk_image = null_resources->vk_1d_image;
+ vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_1D;
+ break;
+ case D3D12_SRV_DIMENSION_TEXTURE1DARRAY:
+ vk_image = null_resources->vk_1d_image;
+ vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_1D_ARRAY;
+ break;
+
case D3D12_SRV_DIMENSION_TEXTURE2D:
vk_image = null_resources->vk_2d_image;
vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D;
@@ -2793,6 +2802,15 @@ static void vkd3d_create_null_uav(struct d3d12_desc *descriptor,
}
return;
+ case D3D12_UAV_DIMENSION_TEXTURE1D:
+ vk_image = null_resources->vk_1d_storage_image;
+ vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_1D;
+ break;
+ case D3D12_UAV_DIMENSION_TEXTURE1DARRAY:
+ vk_image = null_resources->vk_1d_storage_image;
+ vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_1D_ARRAY;
+ break;
+
case D3D12_UAV_DIMENSION_TEXTURE2D:
vk_image = null_resources->vk_2d_storage_image;
vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D;
@@ -3890,6 +3908,10 @@ static HRESULT vkd3d_init_null_resources_data(struct vkd3d_null_resources *null_
if (use_sparse_resources)
{
+ /* transition 1D UAV image */
+ vkd3d_transition_null_image(vk_command_buffer, null_resource->vk_1d_storage_image,
+ VK_IMAGE_LAYOUT_GENERAL, vk_procs);
+
/* transition 2D UAV image */
vkd3d_transition_null_image(vk_command_buffer, null_resource->vk_2d_storage_image,
VK_IMAGE_LAYOUT_GENERAL, vk_procs);
@@ -3900,10 +3922,17 @@ static HRESULT vkd3d_init_null_resources_data(struct vkd3d_null_resources *null_
VK_CALL(vkCmdFillBuffer(vk_command_buffer,
null_resource->vk_storage_buffer, 0, VK_WHOLE_SIZE, 0x00000000));
+ /* clear 1D UAV image */
+ vkd3d_clear_null_ua_image(vk_command_buffer, null_resource->vk_1d_storage_image, vk_procs);
+
/* clear 2D UAV image */
vkd3d_clear_null_ua_image(vk_command_buffer, null_resource->vk_2d_storage_image, vk_procs);
}
+ /* transition 1D SRV image */
+ vkd3d_transition_null_image(vk_command_buffer, null_resource->vk_1d_image,
+ VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, vk_procs);
+
/* transition 2D SRV image */
vkd3d_transition_null_image(vk_command_buffer, null_resource->vk_2d_image,
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, vk_procs);
@@ -4067,6 +4096,16 @@ HRESULT vkd3d_init_null_resources(struct vkd3d_null_resources *null_resources,
&heap_properties, D3D12_HEAP_FLAG_NONE, &null_resources->vk_storage_buffer_memory, NULL, NULL)))
goto fail;
+ /* 1D SRV */
+ if (FAILED(hr = vkd3d_create_null_sr_texture(device, D3D12_RESOURCE_DIMENSION_TEXTURE1D, 1, false,
+ &null_resources->vk_1d_image, &null_resources->vk_1d_image_memory)))
+ goto fail;
+
+ /* 1D UAV */
+ if (FAILED(hr = vkd3d_create_null_ua_texture(device, D3D12_RESOURCE_DIMENSION_TEXTURE1D,
+ &null_resources->vk_1d_storage_image, &null_resources->vk_1d_storage_image_memory)))
+ goto fail;
+
/* 2D SRV */
if (FAILED(hr = vkd3d_create_null_sr_texture(device, D3D12_RESOURCE_DIMENSION_TEXTURE2D, 1, false,
&null_resources->vk_2d_image, &null_resources->vk_2d_image_memory)))
@@ -4084,6 +4123,12 @@ HRESULT vkd3d_init_null_resources(struct vkd3d_null_resources *null_resources,
VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, "NULL memory");
vkd3d_set_vk_object_name_utf8(device, (uint64_t)null_resources->vk_storage_buffer,
VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, "NULL UAV buffer");
+ vkd3d_set_vk_object_name_utf8(device, (uint64_t)null_resources->vk_1d_image,
+ VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, "NULL 1D SRV image");
+ vkd3d_set_vk_object_name_utf8(device, (uint64_t)null_resources->vk_1d_image_memory,
+ VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, "NULL 1D SRV memory");
+ vkd3d_set_vk_object_name_utf8(device, (uint64_t)null_resources->vk_1d_storage_image,
+ VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, "NULL 1D UAV image");
vkd3d_set_vk_object_name_utf8(device, (uint64_t)null_resources->vk_2d_image,
VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, "NULL 2D SRV image");
vkd3d_set_vk_object_name_utf8(device, (uint64_t)null_resources->vk_2d_image_memory,
@@ -4117,6 +4162,12 @@ void vkd3d_destroy_null_resources(struct vkd3d_null_resources *null_resources,
VK_CALL(vkDestroyBuffer(device->vk_device, null_resources->vk_storage_buffer, NULL));
VK_CALL(vkFreeMemory(device->vk_device, null_resources->vk_storage_buffer_memory, NULL));
+ VK_CALL(vkDestroyImage(device->vk_device, null_resources->vk_1d_image, NULL));
+ VK_CALL(vkFreeMemory(device->vk_device, null_resources->vk_1d_image_memory, NULL));
+
+ VK_CALL(vkDestroyImage(device->vk_device, null_resources->vk_1d_storage_image, NULL));
+ VK_CALL(vkFreeMemory(device->vk_device, null_resources->vk_1d_storage_image_memory, NULL));
+
VK_CALL(vkDestroyImage(device->vk_device, null_resources->vk_2d_image, NULL));
VK_CALL(vkFreeMemory(device->vk_device, null_resources->vk_2d_image_memory, NULL));
diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h
index 0c031d2..c23667d 100644
--- a/libs/vkd3d/vkd3d_private.h
+++ b/libs/vkd3d/vkd3d_private.h
@@ -1057,6 +1057,12 @@ struct vkd3d_null_resources
VkBuffer vk_storage_buffer;
VkDeviceMemory vk_storage_buffer_memory;
+ VkImage vk_1d_image;
+ VkDeviceMemory vk_1d_image_memory;
+
+ VkImage vk_1d_storage_image;
+ VkDeviceMemory vk_1d_storage_image_memory;
+
VkImage vk_2d_image;
VkDeviceMemory vk_2d_image_memory;
--
2.24.0
Dec. 10, 2019
[PATCH vkd3d 1/5] vkd3d: Use helper functions for null resource initialisation.
by Conor McCarthy
Signed-off-by: Conor McCarthy <cmccarthy(a)codeweavers.com>
---
libs/vkd3d/resource.c | 237 ++++++++++++++++++++++++------------------
1 file changed, 136 insertions(+), 101 deletions(-)
diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c
index f40d986..ab4df8e 100644
--- a/libs/vkd3d/resource.c
+++ b/libs/vkd3d/resource.c
@@ -3770,12 +3770,72 @@ HRESULT d3d12_query_heap_create(struct d3d12_device *device, const D3D12_QUERY_H
return S_OK;
}
+static void vkd3d_transition_null_image(VkCommandBuffer vk_command_buffer, VkImage vk_image,
+ VkImageLayout new_layout, const struct vkd3d_vk_device_procs *vk_procs)
+{
+ VkImageMemoryBarrier barrier;
+
+ barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
+ barrier.pNext = NULL;
+ barrier.srcAccessMask = 0;
+ barrier.dstAccessMask = 0;
+ barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
+ barrier.newLayout = new_layout;
+ barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+ barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+ barrier.image = vk_image;
+ barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+ barrier.subresourceRange.baseMipLevel = 0;
+ barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS;
+ barrier.subresourceRange.baseArrayLayer = 0;
+ barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS;
+
+ VK_CALL(vkCmdPipelineBarrier(vk_command_buffer,
+ VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 0,
+ 0, NULL, 0, NULL, 1, &barrier));
+}
+
+static void vkd3d_clear_null_ua_image(VkCommandBuffer vk_command_buffer, VkImage vk_image,
+ const struct vkd3d_vk_device_procs *vk_procs)
+{
+ static const VkClearColorValue clear_color = {{0}};
+ VkImageSubresourceRange range;
+ VkImageMemoryBarrier barrier;
+
+ barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
+ barrier.pNext = NULL;
+ barrier.srcAccessMask = 0;
+ barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+ barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
+ barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
+ barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+ barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+ barrier.image = vk_image;
+ barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+ barrier.subresourceRange.baseMipLevel = 0;
+ barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS;
+ barrier.subresourceRange.baseArrayLayer = 0;
+ barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS;
+
+ VK_CALL(vkCmdPipelineBarrier(vk_command_buffer,
+ VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0,
+ 0, NULL, 0, NULL, 1, &barrier));
+
+ range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+ range.baseMipLevel = 0;
+ range.levelCount = 1;
+ range.baseArrayLayer = 0;
+ range.layerCount = 1;
+
+ VK_CALL(vkCmdClearColorImage(vk_command_buffer, vk_image,
+ VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range));
+}
+
static HRESULT vkd3d_init_null_resources_data(struct vkd3d_null_resources *null_resource,
struct d3d12_device *device)
{
const bool use_sparse_resources = device->vk_info.sparse_properties.residencyNonResidentStrict;
const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs;
- static const VkClearColorValue clear_color = {{0}};
VkCommandBufferAllocateInfo command_buffer_info;
VkCommandPool vk_command_pool = VK_NULL_HANDLE;
VkCommandPoolCreateInfo command_pool_info;
@@ -3783,8 +3843,6 @@ static HRESULT vkd3d_init_null_resources_data(struct vkd3d_null_resources *null_
VkCommandBufferBeginInfo begin_info;
VkCommandBuffer vk_command_buffer;
VkFence vk_fence = VK_NULL_HANDLE;
- VkImageSubresourceRange range;
- VkImageMemoryBarrier barrier;
VkFenceCreateInfo fence_info;
struct vkd3d_queue *queue;
VkSubmitInfo submit_info;
@@ -3833,24 +3891,8 @@ static HRESULT vkd3d_init_null_resources_data(struct vkd3d_null_resources *null_
if (use_sparse_resources)
{
/* transition 2D UAV image */
- barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
- barrier.pNext = NULL;
- barrier.srcAccessMask = 0;
- barrier.dstAccessMask = 0;
- barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
- barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
- barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
- barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
- barrier.image = null_resource->vk_2d_storage_image;
- barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
- barrier.subresourceRange.baseMipLevel = 0;
- barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS;
- barrier.subresourceRange.baseArrayLayer = 0;
- barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS;
-
- VK_CALL(vkCmdPipelineBarrier(vk_command_buffer,
- VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 0,
- 0, NULL, 0, NULL, 1, &barrier));
+ vkd3d_transition_null_image(vk_command_buffer, null_resource->vk_2d_storage_image,
+ VK_IMAGE_LAYOUT_GENERAL, vk_procs);
}
else
{
@@ -3859,54 +3901,12 @@ static HRESULT vkd3d_init_null_resources_data(struct vkd3d_null_resources *null_
null_resource->vk_storage_buffer, 0, VK_WHOLE_SIZE, 0x00000000));
/* clear 2D UAV image */
- barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
- barrier.pNext = NULL;
- barrier.srcAccessMask = 0;
- barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
- barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
- barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
- barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
- barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
- barrier.image = null_resource->vk_2d_storage_image;
- barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
- barrier.subresourceRange.baseMipLevel = 0;
- barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS;
- barrier.subresourceRange.baseArrayLayer = 0;
- barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS;
-
- VK_CALL(vkCmdPipelineBarrier(vk_command_buffer,
- VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0,
- 0, NULL, 0, NULL, 1, &barrier));
-
- range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
- range.baseMipLevel = 0;
- range.levelCount = 1;
- range.baseArrayLayer = 0;
- range.layerCount = 1;
-
- VK_CALL(vkCmdClearColorImage(vk_command_buffer,
- null_resource->vk_2d_storage_image, VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range));
+ vkd3d_clear_null_ua_image(vk_command_buffer, null_resource->vk_2d_storage_image, vk_procs);
}
/* transition 2D SRV image */
- barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
- barrier.pNext = NULL;
- barrier.srcAccessMask = 0;
- barrier.dstAccessMask = 0;
- barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
- barrier.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
- barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
- barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
- barrier.image = null_resource->vk_2d_image;
- barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
- barrier.subresourceRange.baseMipLevel = 0;
- barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS;
- barrier.subresourceRange.baseArrayLayer = 0;
- barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS;
-
- VK_CALL(vkCmdPipelineBarrier(vk_command_buffer,
- VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 0,
- 0, NULL, 0, NULL, 1, &barrier));
+ vkd3d_transition_null_image(vk_command_buffer, null_resource->vk_2d_image,
+ VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, vk_procs);
if ((vr = VK_CALL(vkEndCommandBuffer(vk_command_buffer))) < 0)
{
@@ -3956,6 +3956,72 @@ done:
return hresult_from_vk_result(vr);
}
+static HRESULT vkd3d_create_null_sr_texture(struct d3d12_device *device, D3D12_RESOURCE_DIMENSION dimension,
+ unsigned int array_size, bool is_multisampled, VkImage *vk_image, VkDeviceMemory *vk_memory)
+{
+ D3D12_HEAP_PROPERTIES heap_properties;
+ D3D12_RESOURCE_DESC resource_desc;
+ HRESULT hr;
+
+ memset(&heap_properties, 0, sizeof(heap_properties));
+ heap_properties.Type = D3D12_HEAP_TYPE_DEFAULT;
+
+ resource_desc.Dimension = dimension;
+ resource_desc.Alignment = 0;
+ resource_desc.Width = 1;
+ resource_desc.Height = 1;
+ resource_desc.DepthOrArraySize = array_size;
+ resource_desc.MipLevels = 1;
+ resource_desc.Format = VKD3D_NULL_VIEW_FORMAT;
+ resource_desc.SampleDesc.Count = is_multisampled ? 4 : 1;
+ resource_desc.SampleDesc.Quality = 0;
+ resource_desc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN;
+ resource_desc.Flags = is_multisampled ? D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET : D3D12_RESOURCE_FLAG_NONE;
+
+ if (FAILED(hr = vkd3d_create_image(device, &heap_properties, D3D12_HEAP_FLAG_NONE,
+ &resource_desc, NULL, vk_image)))
+ return hr;
+ if (FAILED(hr = vkd3d_allocate_image_memory(device, *vk_image,
+ &heap_properties, D3D12_HEAP_FLAG_NONE, vk_memory, NULL, NULL)))
+ return hr;
+
+ return S_OK;
+}
+
+static HRESULT vkd3d_create_null_ua_texture(struct d3d12_device *device, D3D12_RESOURCE_DIMENSION dimension,
+ VkImage *vk_image, VkDeviceMemory *vk_memory)
+{
+ const bool use_sparse_resources = device->vk_info.sparse_properties.residencyNonResidentStrict;
+ D3D12_HEAP_PROPERTIES heap_properties;
+ D3D12_RESOURCE_DESC resource_desc;
+ HRESULT hr;
+
+ memset(&heap_properties, 0, sizeof(heap_properties));
+ heap_properties.Type = D3D12_HEAP_TYPE_DEFAULT;
+
+ resource_desc.Dimension = dimension;
+ resource_desc.Alignment = 0;
+ resource_desc.Width = 1;
+ resource_desc.Height = 1;
+ resource_desc.DepthOrArraySize = 1;
+ resource_desc.MipLevels = 1;
+ resource_desc.Format = VKD3D_NULL_VIEW_FORMAT;
+ resource_desc.SampleDesc.Count = 1;
+ resource_desc.SampleDesc.Quality = 0;
+ resource_desc.Layout = use_sparse_resources
+ ? D3D12_TEXTURE_LAYOUT_64KB_UNDEFINED_SWIZZLE : D3D12_TEXTURE_LAYOUT_UNKNOWN;
+ resource_desc.Flags = D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS;
+
+ if (FAILED(hr = vkd3d_create_image(device, use_sparse_resources ? NULL : &heap_properties, D3D12_HEAP_FLAG_NONE,
+ &resource_desc, NULL, vk_image)))
+ return hr;
+ if (!use_sparse_resources && FAILED(hr = vkd3d_allocate_image_memory(device, *vk_image,
+ &heap_properties, D3D12_HEAP_FLAG_NONE, vk_memory, NULL, NULL)))
+ return hr;
+
+ return S_OK;
+}
+
HRESULT vkd3d_init_null_resources(struct vkd3d_null_resources *null_resources,
struct d3d12_device *device)
{
@@ -4002,44 +4068,13 @@ HRESULT vkd3d_init_null_resources(struct vkd3d_null_resources *null_resources,
goto fail;
/* 2D SRV */
- resource_desc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D;
- resource_desc.Alignment = 0;
- resource_desc.Width = 1;
- resource_desc.Height = 1;
- resource_desc.DepthOrArraySize = 1;
- resource_desc.MipLevels = 1;
- resource_desc.Format = VKD3D_NULL_VIEW_FORMAT;
- resource_desc.SampleDesc.Count = 1;
- resource_desc.SampleDesc.Quality = 0;
- resource_desc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN;
- resource_desc.Flags = D3D12_RESOURCE_FLAG_NONE;
-
- if (FAILED(hr = vkd3d_create_image(device, &heap_properties, D3D12_HEAP_FLAG_NONE,
- &resource_desc, NULL, &null_resources->vk_2d_image)))
- goto fail;
- if (FAILED(hr = vkd3d_allocate_image_memory(device, null_resources->vk_2d_image,
- &heap_properties, D3D12_HEAP_FLAG_NONE, &null_resources->vk_2d_image_memory, NULL, NULL)))
+ if (FAILED(hr = vkd3d_create_null_sr_texture(device, D3D12_RESOURCE_DIMENSION_TEXTURE2D, 1, false,
+ &null_resources->vk_2d_image, &null_resources->vk_2d_image_memory)))
goto fail;
/* 2D UAV */
- resource_desc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D;
- resource_desc.Alignment = 0;
- resource_desc.Width = 1;
- resource_desc.Height = 1;
- resource_desc.DepthOrArraySize = 1;
- resource_desc.MipLevels = 1;
- resource_desc.Format = VKD3D_NULL_VIEW_FORMAT;
- resource_desc.SampleDesc.Count = 1;
- resource_desc.SampleDesc.Quality = 0;
- resource_desc.Layout = use_sparse_resources
- ? D3D12_TEXTURE_LAYOUT_64KB_UNDEFINED_SWIZZLE : D3D12_TEXTURE_LAYOUT_UNKNOWN;
- resource_desc.Flags = D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS;
-
- if (FAILED(hr = vkd3d_create_image(device, use_sparse_resources ? NULL : &heap_properties, D3D12_HEAP_FLAG_NONE,
- &resource_desc, NULL, &null_resources->vk_2d_storage_image)))
- goto fail;
- if (!use_sparse_resources && FAILED(hr = vkd3d_allocate_image_memory(device, null_resources->vk_2d_storage_image,
- &heap_properties, D3D12_HEAP_FLAG_NONE, &null_resources->vk_2d_storage_image_memory, NULL, NULL)))
+ if (FAILED(hr = vkd3d_create_null_ua_texture(device, D3D12_RESOURCE_DIMENSION_TEXTURE2D,
+ &null_resources->vk_2d_storage_image, &null_resources->vk_2d_storage_image_memory)))
goto fail;
/* set Vulkan object names */
--
2.24.0
Dec. 10, 2019
[PATCH vkd3d 0/5] vkd3d: Add more null resources.
by Conor McCarthy
An attempt to create a null resource view of an unsupported type leaves
the descriptor uninitialised without having any means of indicating
that an error occurred. Hitman 2 uses all of these view types.
Conor McCarthy (5):
vkd3d: Use helper functions for null resource initialisation.
vkd3d: Add 1D null resources.
vkd3d: Add 2D multisampled null resources.
vkd3d: Add 3D null resources.
vkd3d: Add cubic null resource.
libs/vkd3d/resource.c | 360 +++++++++++++++++++++++++++----------
libs/vkd3d/vkd3d_private.h | 15 ++
2 files changed, 277 insertions(+), 98 deletions(-)
--
2.24.0
Dec. 10, 2019
Re: [PATCH] mshtml: Update to Wine Gecko 2.47.1.
by Marvin
Hi,
While running your changed tests, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at:
https://testbot.winehq.org/JobDetails.pl?Key=61793
Your paranoid android.
=== debian10 (32 bit report) ===
mshtml:
activex: Timeout
dom: Timeout
events: Timeout
htmldoc: Timeout
htmllocation: Timeout
=== debian10 (build log) ===
Task errors:
The task timed out
=== debian10 (32 bit WoW report) ===
mshtml:
activex: Timeout
dom: Timeout
events: Timeout
htmldoc: Timeout
htmllocation: Timeout
=== debian10 (build log) ===
Task errors:
The task timed out
Dec. 10, 2019
Re: [PATCH 3/5] d3d9: Handle multisample depth resolve in d3d9_device_SetRenderState().
by Henri Verbeet
On Sat, 7 Dec 2019 at 19:41, Zebediah Figura <z.figura12(a)gmail.com> wrote:
> +static void resolve_depth_buffer(struct d3d9_device *device)
> +{
> + const struct wined3d_stateblock_state *state = wined3d_stateblock_get_state(device->state);
> + struct wined3d_rendertarget_view *wined3d_dsv;
> + struct wined3d_resource *dst_resource;
> + struct wined3d_texture *dst_texture;
> + struct wined3d_resource_desc desc;
> + struct d3d9_surface *d3d9_dsv;
> +
> + if (!(dst_texture = state->textures[0]))
> + return;
> + dst_resource = wined3d_texture_get_resource(dst_texture);
> + wined3d_resource_get_desc(dst_resource, &desc);
> + if (desc.format != WINED3DFMT_D24_UNORM_S8_UINT
> + && desc.format != WINED3DFMT_X8D24_UNORM
> + && desc.format != MAKEFOURCC('D','F','1','6')
> + && desc.format != MAKEFOURCC('D','F','2','4')
> + && desc.format != WINED3DFMT_INTZ)
> + return;
> +
> + if (!(wined3d_dsv = wined3d_device_get_depth_stencil_view(device->wined3d_device)))
> + return;
> + d3d9_dsv = wined3d_rendertarget_view_get_sub_resource_parent(wined3d_dsv);
> +
> + wined3d_device_resolve_sub_resource(device->wined3d_device, dst_resource, 0,
> + wined3d_rendertarget_view_get_resource(wined3d_dsv), d3d9_dsv->sub_resource_idx, desc.format);
> +}
If we're going to implement this in d3d9 (but note that the feature is
supported by d3d8 as well), it would be best to implement the
corresponding feature query in d3d9 instead of wined3d as well.
Note that you can't (currently) create DF16/24 resources. Checking for
those isn't necessarily an issue, but in that case please just add en
entry for them to the wined3d_format_id enumeration.
Dec. 10, 2019
[PATCH] mshtml: Update to Wine Gecko 2.47.1.
by Jacek Caban
Signed-off-by: Jacek Caban <jacek(a)codeweavers.com>
---
The new release is more of a refreshment, bringing compatibility with
modern build environments. The biggest change is build system port to
python3 by Vincent. This involved changes across the whole build system,
thanks Vincent!
It's packaged slightly differently. There are archives that contain Wine
Gecko build. It may be used for system-wide installations. Users may
just unpack the package into /usr/share/wine/gecko/, /opt/wine/gecko,
etc. and it should work without in-prefix installation as long as it has
a valid dos drive (we should be able to support non-mapped locations in
the future as well, but it needs Gecko fixes first). It's just like Wine
Mono does it for a while.
The release also brings improved compatibility with IE clipboard format.
Executable files are marked as nxcompat. It also contains a number of
portability fixes for recent GCC versions. It should work with both
winpthread and non-winpthread toolchains now.
I hoped to include a few more changes in this release, but I don't think
it's worth delaying it any more.
dlls/appwiz.cpl/addons.c | 8 ++++----
dlls/mshtml/nsiface.idl | 2 +-
2 files changed, 5 insertions(+), 5 deletions(-)
Dec. 10, 2019
[PATCH 4/4] oleaut32/tests: Add some more tests for GetRefTypeInfo() in case of dual interface.
by Nikolay Sivov
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/oleaut32/tests/typelib.c | 26 +++++++++++++++++++++++++-
1 file changed, 25 insertions(+), 1 deletion(-)
diff --git a/dlls/oleaut32/tests/typelib.c b/dlls/oleaut32/tests/typelib.c
index 0b2920dfe0..4ffbaa9e2d 100644
--- a/dlls/oleaut32/tests/typelib.c
+++ b/dlls/oleaut32/tests/typelib.c
@@ -76,6 +76,15 @@
#define ARCH "none"
#endif
+#define EXPECT_REF(obj,ref) _expect_ref((IUnknown*)obj, ref, __LINE__)
+static void _expect_ref(IUnknown* obj, ULONG ref, int line)
+{
+ ULONG rc;
+ IUnknown_AddRef(obj);
+ rc = IUnknown_Release(obj);
+ ok_(__FILE__,line)(rc == ref, "expected refcount %d, got %d\n", ref, rc);
+}
+
static HRESULT (WINAPI *pRegisterTypeLibForUser)(ITypeLib*,OLECHAR*,OLECHAR*);
static HRESULT (WINAPI *pUnRegisterTypeLibForUser)(REFGUID,WORD,WORD,LCID,SYSKIND);
@@ -1846,6 +1855,7 @@ static void test_CreateTypeLib(SYSKIND sys) {
static const GUID interfaceguid = {0x3b9ff02f,0x9675,0x4861,{0xb7,0x81,0xce,0xae,0xa4,0x78,0x2a,0xcc}};
static const GUID interface2guid = {0x3b9ff02f,0x9675,0x4861,{0xb7,0x81,0xce,0xae,0xa4,0x78,0x2a,0xcd}};
+ ITypeInfo *interface1, *interface2, *dual, *unknown, *dispatch, *ti, *ti_2;
char filename[MAX_PATH];
WCHAR filenameW[MAX_PATH];
ICreateTypeLib2 *createtl;
@@ -1853,7 +1863,6 @@ static void test_CreateTypeLib(SYSKIND sys) {
ICreateTypeInfo2 *createti2;
ITypeLib *tl, *stdole;
ITypeLib2 *tl2;
- ITypeInfo *interface1, *interface2, *dual, *unknown, *dispatch, *ti;
ITypeInfo *tinfos[2];
ITypeInfo2 *ti2;
ITypeComp *tcomp, *tcomp2;
@@ -2829,8 +2838,11 @@ static void test_CreateTypeLib(SYSKIND sys) {
ok(hres == S_OK, "got %08x\n", hres);
ok(hreftype == -2, "got %08x\n", hreftype);
+ EXPECT_REF(dual, 2);
hres = ITypeInfo_GetRefTypeInfo(dual, -2, &ti);
ok(hres == S_OK, "got %08x\n", hres);
+todo_wine
+ EXPECT_REF(dual, 3);
hres = ITypeInfo_GetTypeAttr(ti, &typeattr);
ok(hres == S_OK, "got %08x\n", hres);
@@ -2847,6 +2859,18 @@ static void test_CreateTypeLib(SYSKIND sys) {
ITypeInfo_ReleaseTypeAttr(ti, typeattr);
+ hres = ITypeInfo_GetRefTypeInfo(dual, -2, &ti_2);
+ ok(hres == S_OK, "Failed to get reference typeinfo, hr %#x.\n", hres);
+todo_wine {
+ ok(ti == ti_2, "Unexpected typeinfo instance.\n");
+ EXPECT_REF(dual, 4);
+}
+ ITypeInfo_AddRef(ti_2);
+todo_wine
+ EXPECT_REF(dual, 5);
+ ITypeInfo_Release(ti_2);
+
+ ITypeInfo_Release(ti_2);
ITypeInfo_Release(ti);
hres = ICreateTypeInfo_SetTypeDescAlias(createti, &typedesc1);
--
2.24.0
Dec. 10, 2019
[PATCH 3/4] oleaut32/tests: Use TYPEKIND values.
by Nikolay Sivov
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/oleaut32/tests/typelib.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/dlls/oleaut32/tests/typelib.c b/dlls/oleaut32/tests/typelib.c
index 053011d4be..0b2920dfe0 100644
--- a/dlls/oleaut32/tests/typelib.c
+++ b/dlls/oleaut32/tests/typelib.c
@@ -2813,7 +2813,7 @@ static void test_CreateTypeLib(SYSKIND sys) {
hres = ITypeInfo_GetTypeAttr(dual, &typeattr);
ok(hres == S_OK, "got %08x\n", hres);
ok(typeattr->cbSizeInstance == ptr_size, "cbSizeInstance = %d\n", typeattr->cbSizeInstance);
- ok(typeattr->typekind == 3, "typekind = %d\n", typeattr->typekind);
+ ok(typeattr->typekind == TKIND_INTERFACE, "typekind = %d\n", typeattr->typekind);
ok(typeattr->cFuncs == 1, "cFuncs = %d\n", typeattr->cFuncs);
ok(typeattr->cVars == 0, "cVars = %d\n", typeattr->cVars);
ok(typeattr->cImplTypes == 1, "cImplTypes = %d\n", typeattr->cImplTypes);
@@ -2835,7 +2835,7 @@ static void test_CreateTypeLib(SYSKIND sys) {
hres = ITypeInfo_GetTypeAttr(ti, &typeattr);
ok(hres == S_OK, "got %08x\n", hres);
ok(typeattr->cbSizeInstance == ptr_size, "cbSizeInstance = %d\n", typeattr->cbSizeInstance);
- ok(typeattr->typekind == 4, "typekind = %d\n", typeattr->typekind);
+ ok(typeattr->typekind == TKIND_DISPATCH, "typekind = %d\n", typeattr->typekind);
ok(typeattr->cFuncs == 8, "cFuncs = %d\n", typeattr->cFuncs);
ok(typeattr->cVars == 0, "cVars = %d\n", typeattr->cVars);
ok(typeattr->cImplTypes == 1, "cImplTypes = %d\n", typeattr->cImplTypes);
@@ -2857,7 +2857,7 @@ static void test_CreateTypeLib(SYSKIND sys) {
hres = ITypeInfo_GetTypeAttr(interface1, &typeattr);
ok(hres == S_OK, "got %08x\n", hres);
ok(typeattr->cbSizeInstance == ptr_size, "cbSizeInstance = %d\n", typeattr->cbSizeInstance);
- ok(typeattr->typekind == 3, "typekind = %d\n", typeattr->typekind);
+ ok(typeattr->typekind == TKIND_INTERFACE, "typekind = %d\n", typeattr->typekind);
ok(typeattr->cFuncs == 13, "cFuncs = %d\n", typeattr->cFuncs);
ok(typeattr->cVars == 0, "cVars = %d\n", typeattr->cVars);
ok(typeattr->cImplTypes == 1, "cImplTypes = %d\n", typeattr->cImplTypes);
@@ -2872,7 +2872,7 @@ static void test_CreateTypeLib(SYSKIND sys) {
hres = ITypeInfo_GetTypeAttr(interface2, &typeattr);
ok(hres == S_OK, "got %08x\n", hres);
ok(typeattr->cbSizeInstance == ptr_size, "cbSizeInstance = %d\n", typeattr->cbSizeInstance);
- ok(typeattr->typekind == 3, "typekind = %d\n", typeattr->typekind);
+ ok(typeattr->typekind == TKIND_INTERFACE, "typekind = %d\n", typeattr->typekind);
ok(typeattr->cFuncs == 2, "cFuncs = %d\n", typeattr->cFuncs);
ok(typeattr->cVars == 0, "cVars = %d\n", typeattr->cVars);
ok(typeattr->cImplTypes == 1, "cImplTypes = %d\n", typeattr->cImplTypes);
--
2.24.0
Dec. 10, 2019
[PATCH 2/4] oleaut32/typelib: Simplify variable and function description lookup helpers.
by Nikolay Sivov
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/oleaut32/typelib.c | 67 +++++++++++++++++++++--------------------
1 file changed, 35 insertions(+), 32 deletions(-)
diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c
index f490795cc7..528fe6372c 100644
--- a/dlls/oleaut32/typelib.c
+++ b/dlls/oleaut32/typelib.c
@@ -1679,39 +1679,42 @@ static BSTR TLB_MultiByteToBSTR(const char *ptr)
return ret;
}
-static inline TLBFuncDesc *TLB_get_funcdesc_by_memberid(TLBFuncDesc *funcdescs,
- UINT n, MEMBERID memid)
+static inline TLBFuncDesc *TLB_get_funcdesc_by_memberid(ITypeInfoImpl *typeinfo, MEMBERID memid)
{
- while(n){
- if(funcdescs->funcdesc.memid == memid)
- return funcdescs;
- ++funcdescs;
- --n;
+ int i;
+
+ for (i = 0; i < typeinfo->typeattr.cFuncs; ++i)
+ {
+ if (typeinfo->funcdescs[i].funcdesc.memid == memid)
+ return &typeinfo->funcdescs[i];
}
+
return NULL;
}
-static inline TLBVarDesc *TLB_get_vardesc_by_memberid(TLBVarDesc *vardescs,
- UINT n, MEMBERID memid)
+static inline TLBVarDesc *TLB_get_vardesc_by_memberid(ITypeInfoImpl *typeinfo, MEMBERID memid)
{
- while(n){
- if(vardescs->vardesc.memid == memid)
- return vardescs;
- ++vardescs;
- --n;
+ int i;
+
+ for (i = 0; i < typeinfo->typeattr.cVars; ++i)
+ {
+ if (typeinfo->vardescs[i].vardesc.memid == memid)
+ return &typeinfo->vardescs[i];
}
+
return NULL;
}
-static inline TLBVarDesc *TLB_get_vardesc_by_name(TLBVarDesc *vardescs,
- UINT n, const OLECHAR *name)
+static inline TLBVarDesc *TLB_get_vardesc_by_name(ITypeInfoImpl *typeinfo, const OLECHAR *name)
{
- while(n){
- if(!lstrcmpiW(TLB_get_bstr(vardescs->Name), name))
- return vardescs;
- ++vardescs;
- --n;
+ int i;
+
+ for (i = 0; i < typeinfo->typeattr.cVars; ++i)
+ {
+ if (!lstrcmpiW(TLB_get_bstr(typeinfo->vardescs[i].Name), name))
+ return &typeinfo->vardescs[i];
}
+
return NULL;
}
@@ -5128,7 +5131,7 @@ static HRESULT WINAPI ITypeLib2_fnFindName(
}
}
- var = TLB_get_vardesc_by_name(pTInfo->vardescs, pTInfo->typeattr.cVars, name);
+ var = TLB_get_vardesc_by_name(pTInfo, name);
if (var) {
memid[count] = var->vardesc.memid;
goto ITypeLib2_fnFindName_exit;
@@ -6117,7 +6120,7 @@ static HRESULT WINAPI ITypeInfo_fnGetNames( ITypeInfo2 *iface, MEMBERID memid,
*pcNames = 0;
- pFDesc = TLB_get_funcdesc_by_memberid(This->funcdescs, This->typeattr.cFuncs, memid);
+ pFDesc = TLB_get_funcdesc_by_memberid(This, memid);
if(pFDesc)
{
if(!cMaxNames || !pFDesc->Name)
@@ -6135,7 +6138,7 @@ static HRESULT WINAPI ITypeInfo_fnGetNames( ITypeInfo2 *iface, MEMBERID memid,
return S_OK;
}
- pVDesc = TLB_get_vardesc_by_memberid(This->vardescs, This->typeattr.cVars, memid);
+ pVDesc = TLB_get_vardesc_by_memberid(This, memid);
if(pVDesc)
{
*rgBstrNames=SysAllocString(TLB_get_bstr(pVDesc->Name));
@@ -6294,7 +6297,7 @@ static HRESULT WINAPI ITypeInfo_fnGetIDsOfNames( ITypeInfo2 *iface,
return ret;
}
}
- pVDesc = TLB_get_vardesc_by_name(This->vardescs, This->typeattr.cVars, *rgszNames);
+ pVDesc = TLB_get_vardesc_by_name(This, *rgszNames);
if(pVDesc){
if(cNames)
*pMemId = pVDesc->vardesc.memid;
@@ -7743,7 +7746,7 @@ static HRESULT WINAPI ITypeInfo_fnGetDocumentation( ITypeInfo2 *iface,
*pBstrHelpFile=SysAllocString(TLB_get_bstr(This->pTypeLib->HelpFile));
return S_OK;
}else {/* for a member */
- pFDesc = TLB_get_funcdesc_by_memberid(This->funcdescs, This->typeattr.cFuncs, memid);
+ pFDesc = TLB_get_funcdesc_by_memberid(This, memid);
if(pFDesc){
if(pBstrName)
*pBstrName = SysAllocString(TLB_get_bstr(pFDesc->Name));
@@ -7755,7 +7758,7 @@ static HRESULT WINAPI ITypeInfo_fnGetDocumentation( ITypeInfo2 *iface,
*pBstrHelpFile = SysAllocString(TLB_get_bstr(This->pTypeLib->HelpFile));
return S_OK;
}
- pVDesc = TLB_get_vardesc_by_memberid(This->vardescs, This->typeattr.cVars, memid);
+ pVDesc = TLB_get_vardesc_by_memberid(This, memid);
if(pVDesc){
if(pBstrName)
*pBstrName = SysAllocString(TLB_get_bstr(pVDesc->Name));
@@ -7809,7 +7812,7 @@ static HRESULT WINAPI ITypeInfo_fnGetDllEntry( ITypeInfo2 *iface, MEMBERID memid
if (This->typeattr.typekind != TKIND_MODULE)
return TYPE_E_BADMODULEKIND;
- pFDesc = TLB_get_funcdesc_by_memberid(This->funcdescs, This->typeattr.cFuncs, memid);
+ pFDesc = TLB_get_funcdesc_by_memberid(This, memid);
if(pFDesc){
dump_TypeInfo(This);
if (TRACE_ON(ole))
@@ -8317,7 +8320,7 @@ static HRESULT WINAPI ITypeInfo2_fnGetVarIndexOfMemId( ITypeInfo2 * iface,
TRACE("%p %d %p\n", iface, memid, pVarIndex);
- pVarInfo = TLB_get_vardesc_by_memberid(This->vardescs, This->typeattr.cVars, memid);
+ pVarInfo = TLB_get_vardesc_by_memberid(This, memid);
if(!pVarInfo)
return TYPE_E_ELEMENTNOTFOUND;
@@ -8510,7 +8513,7 @@ static HRESULT WINAPI ITypeInfo2_fnGetDocumentation2(
SysAllocString(TLB_get_bstr(This->pTypeLib->HelpStringDll));/* FIXME */
return S_OK;
}else {/* for a member */
- pFDesc = TLB_get_funcdesc_by_memberid(This->funcdescs, This->typeattr.cFuncs, memid);
+ pFDesc = TLB_get_funcdesc_by_memberid(This, memid);
if(pFDesc){
if(pbstrHelpString)
*pbstrHelpString=SysAllocString(TLB_get_bstr(pFDesc->HelpString));
@@ -8521,7 +8524,7 @@ static HRESULT WINAPI ITypeInfo2_fnGetDocumentation2(
SysAllocString(TLB_get_bstr(This->pTypeLib->HelpStringDll));/* FIXME */
return S_OK;
}
- pVDesc = TLB_get_vardesc_by_memberid(This->vardescs, This->typeattr.cVars, memid);
+ pVDesc = TLB_get_vardesc_by_memberid(This, memid);
if(pVDesc){
if(pbstrHelpString)
*pbstrHelpString=SysAllocString(TLB_get_bstr(pVDesc->HelpString));
@@ -8868,7 +8871,7 @@ static HRESULT WINAPI ITypeComp_fnBind(
ITypeInfo_AddRef(*ppTInfo);
return S_OK;
} else {
- pVDesc = TLB_get_vardesc_by_name(This->vardescs, This->typeattr.cVars, szName);
+ pVDesc = TLB_get_vardesc_by_name(This, szName);
if(pVDesc){
HRESULT hr = TLB_AllocAndInitVarDesc(&pVDesc->vardesc, &pBindPtr->lpvardesc);
if (FAILED(hr))
--
2.24.0
Dec. 10, 2019
[PATCH 1/4] oleaut32/typelib: Get rid of redundant argument in typeinfo lookup helper.
by Nikolay Sivov
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/oleaut32/typelib.c | 19 ++++++++++---------
1 file changed, 10 insertions(+), 9 deletions(-)
diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c
index 668ad8d582..f490795cc7 100644
--- a/dlls/oleaut32/typelib.c
+++ b/dlls/oleaut32/typelib.c
@@ -1724,15 +1724,16 @@ static inline TLBCustData *TLB_get_custdata_by_guid(struct list *custdata_list,
return NULL;
}
-static inline ITypeInfoImpl *TLB_get_typeinfo_by_name(ITypeInfoImpl **typeinfos,
- UINT n, const OLECHAR *name)
+static inline ITypeInfoImpl *TLB_get_typeinfo_by_name(ITypeLibImpl *typelib, const OLECHAR *name)
{
- while(n){
- if(!lstrcmpiW(TLB_get_bstr((*typeinfos)->Name), name))
- return *typeinfos;
- ++typeinfos;
- --n;
+ int i;
+
+ for (i = 0; i < typelib->TypeInfoCount; ++i)
+ {
+ if (!lstrcmpiW(TLB_get_bstr(typelib->typeinfos[i]->Name), name))
+ return typelib->typeinfos[i];
}
+
return NULL;
}
@@ -5507,7 +5508,7 @@ static HRESULT WINAPI ITypeLibComp_fnBindType(
if(!szName || !ppTInfo || !ppTComp)
return E_INVALIDARG;
- info = TLB_get_typeinfo_by_name(This->typeinfos, This->TypeInfoCount, szName);
+ info = TLB_get_typeinfo_by_name(This, szName);
if(!info){
*ppTInfo = NULL;
*ppTComp = NULL;
@@ -9007,7 +9008,7 @@ static HRESULT WINAPI ICreateTypeLib2_fnCreateTypeInfo(ICreateTypeLib2 *iface,
if (!ctinfo || !name)
return E_INVALIDARG;
- info = TLB_get_typeinfo_by_name(This->typeinfos, This->TypeInfoCount, name);
+ info = TLB_get_typeinfo_by_name(This, name);
if (info)
return TYPE_E_NAMECONFLICT;
--
2.24.0
Dec. 10, 2019
[PATCH] vbscript: Remove unused field.
by Gabriel Ivăncescu
Signed-off-by: Gabriel Ivăncescu <gabrielopcode(a)gmail.com>
---
dlls/vbscript/compile.c | 3 ---
dlls/vbscript/vbscript.h | 1 -
2 files changed, 4 deletions(-)
diff --git a/dlls/vbscript/compile.c b/dlls/vbscript/compile.c
index d8ae0fc..c76ba73 100644
--- a/dlls/vbscript/compile.c
+++ b/dlls/vbscript/compile.c
@@ -1980,9 +1980,6 @@ HRESULT compile_procedure(script_ctx_t *script, const WCHAR *src, const WCHAR *d
desc->func_cnt = 1;
desc->funcs->entries[VBDISP_CALLGET] = &code->main_code;
- desc->next = script->script_obj->procs;
- script->script_obj->procs = desc;
-
*ret = desc;
return S_OK;
}
diff --git a/dlls/vbscript/vbscript.h b/dlls/vbscript/vbscript.h
index d79be9e..19431e2 100644
--- a/dlls/vbscript/vbscript.h
+++ b/dlls/vbscript/vbscript.h
@@ -141,7 +141,6 @@ typedef struct {
size_t global_funcs_size;
class_desc_t *classes;
- class_desc_t *procs;
script_ctx_t *ctx;
heap_pool_t heap;
--
2.21.0
Dec. 10, 2019
[PATCH] ieframe: implement COM aggregation in WebBrowser
by Jacek Caban
From: Damjan Jovanovic <damjan.jov(a)gmail.com>
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=12406
Signed-off-by: Damjan Jovanovic <damjan.jov(a)gmail.com>
Signed-off-by: Jacek Caban <jacek(a)codeweavers.com>
---
dlls/ieframe/classinfo.c | 6 +--
dlls/ieframe/ieframe.h | 1 +
dlls/ieframe/oleobject.c | 30 ++++++-------
dlls/ieframe/persist.c | 18 ++++----
dlls/ieframe/tests/webbrowser.c | 60 +++++++++++++++++++++++++
dlls/ieframe/view.c | 12 ++---
dlls/ieframe/webbrowser.c | 78 ++++++++++++++++++++++++---------
7 files changed, 151 insertions(+), 54 deletions(-)
Dec. 10, 2019
Re: [PATCH 5/5] msado15: Implement _Stream_ReadText and _Stream_WriteText.
by Hans Leidekker
On Tue, 2019-12-10 at 04:59 -0600, Marvin wrote:
> While running your changed tests, I think I found new failures.
> Being a bot and all I'm not very good at pattern recognition, so I might be
> wrong, but could you please double-check?
>
> Full results can be found at:
> https://testbot.winehq.org/JobDetails.pl?Key=61781
>
> Your paranoid android.
>
>
> === build (build log) ===
>
> error: patch failed: dlls/msado15/stream.c:400
> Task: Patch failed to apply
It should apply after 175416.
Dec. 10, 2019
[PATCH] winhttp/tests: Show that WINHTTP_OPTION_SECURE_PROTOCOLS can't be set on connection handles.
by Hans Leidekker
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=48254
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
---
dlls/winhttp/tests/winhttp.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/dlls/winhttp/tests/winhttp.c b/dlls/winhttp/tests/winhttp.c
index e4c614cb10..3e0e8baeb9 100644
--- a/dlls/winhttp/tests/winhttp.c
+++ b/dlls/winhttp/tests/winhttp.c
@@ -1070,6 +1070,13 @@ static void test_secure_connection(void)
con = WinHttpConnect(ses, test_winehq, 443, 0);
ok(con != NULL, "failed to open a connection %u\n", GetLastError());
+ SetLastError( 0xdeadbeef );
+ protocols = WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_2;
+ ret = WinHttpSetOption(con, WINHTTP_OPTION_SECURE_PROTOCOLS, &protocols, sizeof(protocols));
+ err = GetLastError();
+ ok(!ret, "unexpected success\n");
+ ok(err == ERROR_WINHTTP_INCORRECT_HANDLE_TYPE, "got %u\n", err);
+
/* try without setting WINHTTP_FLAG_SECURE */
req = WinHttpOpenRequest(con, NULL, NULL, NULL, NULL, NULL, 0);
ok(req != NULL, "failed to open a request %u\n", GetLastError());
--
2.20.1
Dec. 10, 2019
Re: [PATCH 5/5] msado15: Implement _Stream_ReadText and _Stream_WriteText.
by Marvin
Hi,
While running your changed tests, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at:
https://testbot.winehq.org/JobDetails.pl?Key=61781
Your paranoid android.
=== build (build log) ===
error: patch failed: dlls/msado15/stream.c:400
Task: Patch failed to apply
=== debian10 (build log) ===
error: patch failed: dlls/msado15/stream.c:400
Task: Patch failed to apply
=== debian10 (build log) ===
error: patch failed: dlls/msado15/stream.c:400
Task: Patch failed to apply
Dec. 10, 2019
Re: [PATCH 2/5] msado15: Implement _Stream_get_LineSeparator and _Stream_put_LineSeparator.
by Marvin
Hi,
While running your changed tests, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at:
https://testbot.winehq.org/JobDetails.pl?Key=61778
Your paranoid android.
=== w864 (task log) ===
Task errors:
TestBot process got stuck or died unexpectedly
The previous 1 run(s) terminated abnormally
Dec. 10, 2019
[PATCH 2/2] msado15: Implement Connection get/put CommandTimeout
by Alistair Leslie-Hughes
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair(a)hotmail.com>
---
dlls/msado15/connection.c | 14 ++++++++++----
dlls/msado15/tests/msado15.c | 13 ++++++++++++-
2 files changed, 22 insertions(+), 5 deletions(-)
diff --git a/dlls/msado15/connection.c b/dlls/msado15/connection.c
index dbf0b03149..ef589ecb7d 100644
--- a/dlls/msado15/connection.c
+++ b/dlls/msado15/connection.c
@@ -36,6 +36,7 @@ struct connection
LONG refs;
ObjectStateEnum state;
+ LONG timeout;
};
static inline struct connection *impl_from_Connection( _Connection *iface )
@@ -126,14 +127,18 @@ static HRESULT WINAPI connection_put_ConnectionString( _Connection *iface, BSTR
static HRESULT WINAPI connection_get_CommandTimeout( _Connection *iface, LONG *timeout )
{
- FIXME( "%p, %p\n", iface, timeout );
- return E_NOTIMPL;
+ struct connection *connection = impl_from_Connection( iface );
+ TRACE( "%p, %p\n", connection, timeout );
+ *timeout = connection->timeout;
+ return S_OK;
}
static HRESULT WINAPI connection_put_CommandTimeout( _Connection *iface, LONG timeout )
{
- FIXME( "%p, %d\n", iface, timeout );
- return E_NOTIMPL;
+ struct connection *connection = impl_from_Connection( iface );
+ TRACE( "%p, %d\n", connection, timeout );
+ connection->timeout = timeout;
+ return S_OK;
}
static HRESULT WINAPI connection_get_ConnectionTimeout( _Connection *iface, LONG *timeout )
@@ -342,6 +347,7 @@ HRESULT Connection_create( void **obj )
connection->Connection_iface.lpVtbl = &connection_vtbl;
connection->refs = 1;
connection->state = adStateClosed;
+ connection->timeout = 30;
*obj = &connection->Connection_iface;
TRACE( "returning iface %p\n", *obj );
diff --git a/dlls/msado15/tests/msado15.c b/dlls/msado15/tests/msado15.c
index f2c9789576..bb356ae5a8 100644
--- a/dlls/msado15/tests/msado15.c
+++ b/dlls/msado15/tests/msado15.c
@@ -197,7 +197,7 @@ static void test_connection(void)
_Connection *connection;
IRunnableObject *runtime;
ISupportErrorInfo *errorinfo;
- LONG state;
+ LONG state, timeout;
hr = CoCreateInstance(&CLSID_Connection, NULL, CLSCTX_INPROC_SERVER, &IID__Connection, (void**)&connection);
ok( hr == S_OK, "got %08x\n", hr );
@@ -220,6 +220,17 @@ if (0) /* Crashes on windows */
ok(hr == S_OK, "Failed to get state, hr 0x%08x\n", hr);
ok(state == adStateClosed, "Unexpected state value 0x%08x\n", state);
+ hr = _Connection_get_CommandTimeout(connection, &timeout);
+ ok(hr == S_OK, "Failed to get state, hr 0x%08x\n", hr);
+ ok(timeout == 30, "Unexpected timeout value %d\n", timeout);
+
+ hr = _Connection_put_CommandTimeout(connection, 300);
+ ok(hr == S_OK, "Failed to get state, hr 0x%08x\n", hr);
+
+ hr = _Connection_get_CommandTimeout(connection, &timeout);
+ ok(hr == S_OK, "Failed to get state, hr 0x%08x\n", hr);
+ ok(timeout == 300, "Unexpected timeout value %d\n", timeout);
+
_Connection_Release(connection);
}
--
2.24.0
Dec. 10, 2019
[PATCH 1/2] msado15: Implement Connection.get_state
by Alistair Leslie-Hughes
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair(a)hotmail.com>
---
dlls/msado15/connection.c | 9 +++++++--
dlls/msado15/tests/msado15.c | 34 ++++++++++++++++++++++++++++++++++
2 files changed, 41 insertions(+), 2 deletions(-)
diff --git a/dlls/msado15/connection.c b/dlls/msado15/connection.c
index f33bc89a1a..dbf0b03149 100644
--- a/dlls/msado15/connection.c
+++ b/dlls/msado15/connection.c
@@ -34,6 +34,8 @@ struct connection
{
_Connection Connection_iface;
LONG refs;
+
+ ObjectStateEnum state;
};
static inline struct connection *impl_from_Connection( _Connection *iface )
@@ -271,8 +273,10 @@ static HRESULT WINAPI connection_put_Provider( _Connection *iface, BSTR str )
static HRESULT WINAPI connection_get_State( _Connection *iface, LONG *state )
{
- FIXME( "%p, %p\n", iface, state );
- return E_NOTIMPL;
+ struct connection *connection = impl_from_Connection( iface );
+ TRACE( "%p, %p\n", connection, state );
+ *state = connection->state;
+ return S_OK;
}
static HRESULT WINAPI connection_OpenSchema( _Connection *iface, SchemaEnum schema, VARIANT restrictions,
@@ -337,6 +341,7 @@ HRESULT Connection_create( void **obj )
if (!(connection = heap_alloc( sizeof(*connection) ))) return E_OUTOFMEMORY;
connection->Connection_iface.lpVtbl = &connection_vtbl;
connection->refs = 1;
+ connection->state = adStateClosed;
*obj = &connection->Connection_iface;
TRACE( "returning iface %p\n", *obj );
diff --git a/dlls/msado15/tests/msado15.c b/dlls/msado15/tests/msado15.c
index 1755a7f3da..f2c9789576 100644
--- a/dlls/msado15/tests/msado15.c
+++ b/dlls/msado15/tests/msado15.c
@@ -191,9 +191,43 @@ static void test_Stream(void)
ok( !refs, "got %d\n", refs );
}
+static void test_connection(void)
+{
+ HRESULT hr;
+ _Connection *connection;
+ IRunnableObject *runtime;
+ ISupportErrorInfo *errorinfo;
+ LONG state;
+
+ hr = CoCreateInstance(&CLSID_Connection, NULL, CLSCTX_INPROC_SERVER, &IID__Connection, (void**)&connection);
+ ok( hr == S_OK, "got %08x\n", hr );
+
+ hr = _Connection_QueryInterface(connection, &IID_IRunnableObject, (void**)&runtime);
+ ok(hr == E_NOINTERFACE, "Unexpected IRunnableObject interface\n");
+
+ hr = _Connection_QueryInterface(connection, &IID_ISupportErrorInfo, (void**)&errorinfo);
+ todo_wine ok(hr == S_OK, "Failed to get ISupportErrorInfo interface\n");
+ if (hr == S_OK)
+ ISupportErrorInfo_Release(errorinfo);
+
+if (0) /* Crashes on windows */
+{
+ hr = _Connection_get_State(connection, NULL);
+ ok(hr == E_INVALIDARG, "Unexpected hr 0x%08x\n", hr);
+}
+
+ hr = _Connection_get_State(connection, &state);
+ ok(hr == S_OK, "Failed to get state, hr 0x%08x\n", hr);
+ ok(state == adStateClosed, "Unexpected state value 0x%08x\n", state);
+
+ _Connection_Release(connection);
+}
+
START_TEST(msado15)
{
CoInitialize( NULL );
test_Stream();
+ test_connection();
+
CoUninitialize();
}
--
2.24.0
Dec. 10, 2019
[PATCH 5/5] msado15: Implement _Stream_ReadText and _Stream_WriteText.
by Hans Leidekker
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
---
dlls/msado15/stream.c | 58 +++++++++++++++++++++++++++++++++---
dlls/msado15/tests/msado15.c | 51 +++++++++++++++++++++++++++++++
2 files changed, 105 insertions(+), 4 deletions(-)
diff --git a/dlls/msado15/stream.c b/dlls/msado15/stream.c
index e2e404a620..52f35afe3c 100644
--- a/dlls/msado15/stream.c
+++ b/dlls/msado15/stream.c
@@ -400,14 +400,64 @@ static HRESULT WINAPI stream_LoadFromFile( _Stream *iface, BSTR filename )
static HRESULT WINAPI stream_ReadText( _Stream *iface, LONG len, BSTR *ret )
{
- FIXME( "%p, %d, %p\n", iface, len, ret );
- return E_NOTIMPL;
+ struct stream *stream = impl_from_Stream( iface );
+ BSTR str;
+
+ TRACE( "%p, %d, %p\n", stream, len, ret );
+ if (len == adReadLine)
+ {
+ FIXME( "adReadLine not supported\n" );
+ return E_NOTIMPL;
+ }
+ if (stream->charset && wcscmp( stream->charset, L"Unicode" ))
+ {
+ FIXME( "charset %s not supported\n", debugstr_w(stream->charset) );
+ return E_NOTIMPL;
+ }
+
+ if (stream->type != adTypeText) return MAKE_ADO_HRESULT( adErrIllegalOperation );
+ if (len < adReadLine) return MAKE_ADO_HRESULT( adErrInvalidArgument );
+
+ if (len == adReadAll) len = (stream->size - stream->pos) / sizeof(WCHAR);
+ else len = min( len, stream->size - stream->pos / sizeof(WCHAR) );
+
+ if (!(str = SysAllocStringLen( NULL, len ))) return E_OUTOFMEMORY;
+ memcpy( str, stream->buf + stream->pos, len * sizeof(WCHAR) );
+ str[len] = 0;
+
+ stream->pos += len * sizeof(WCHAR);
+
+ *ret = str;
+ return S_OK;
}
static HRESULT WINAPI stream_WriteText( _Stream *iface, BSTR data, StreamWriteEnum options )
{
- FIXME( "%p, %s, %u\n", iface, debugstr_w(data), options );
- return E_NOTIMPL;
+ struct stream *stream = impl_from_Stream( iface );
+ HRESULT hr;
+ LONG size;
+
+ TRACE( "%p, %s, %u\n", stream, debugstr_w(data), options );
+ if (options != adWriteChar)
+ {
+ FIXME( "options %u not supported\n", options );
+ return E_NOTIMPL;
+ }
+ if (stream->charset && wcscmp( stream->charset, L"Unicode" ))
+ {
+ FIXME( "charset %s not supported\n", debugstr_w(stream->charset) );
+ return E_NOTIMPL;
+ }
+
+ if (stream->type != adTypeText) return MAKE_ADO_HRESULT( adErrIllegalOperation );
+
+ size = (lstrlenW( data ) + 1) * sizeof(WCHAR);
+ if ((hr = resize_buffer( stream, stream->size + size )) != S_OK) return hr;
+
+ memcpy( stream->buf + stream->pos, data, size );
+ stream->pos += size;
+
+ return S_OK;
}
static HRESULT WINAPI stream_Cancel( _Stream *iface )
diff --git a/dlls/msado15/tests/msado15.c b/dlls/msado15/tests/msado15.c
index 2c75904837..079da0a103 100644
--- a/dlls/msado15/tests/msado15.c
+++ b/dlls/msado15/tests/msado15.c
@@ -162,11 +162,54 @@ static void test_Stream(void)
hr = _Stream_Read( stream, 2, &val );
ok( hr == MAKE_ADO_HRESULT( adErrIllegalOperation ), "got %08x\n", hr );
+ hr = _Stream_ReadText( stream, 2, &str );
+ ok( hr == S_OK, "got %08x\n", hr );
+ ok( !str[0], "got %s\n", wine_dbgstr_w(str) );
+ SysFreeString( str );
+
pos = -1;
hr = _Stream_get_Position( stream, &pos );
ok( hr == S_OK, "got %08x\n", hr );
ok( !pos, "got %d\n", pos );
+ str = SysAllocString( L"test" );
+ hr = _Stream_WriteText( stream, str, adWriteChar );
+ ok( hr == S_OK, "got %08x\n", hr );
+ SysFreeString( str );
+
+ hr = _Stream_ReadText( stream, adReadAll, &str );
+ ok( hr == S_OK, "got %08x\n", hr );
+ ok( !str[0], "got %s\n", wine_dbgstr_w(str) );
+ SysFreeString( str );
+
+ hr = _Stream_put_Position( stream, 0 );
+ ok( hr == S_OK, "got %08x\n", hr );
+ hr = _Stream_ReadText( stream, adReadAll, &str );
+ ok( hr == S_OK, "got %08x\n", hr );
+ ok( !lstrcmpW( str, L"test" ), "got %s\n", wine_dbgstr_w(str) );
+ SysFreeString( str );
+
+ pos = -1;
+ hr = _Stream_get_Position( stream, &pos );
+ ok( hr == S_OK, "got %08x\n", hr );
+ ok( pos == 10, "got %d\n", pos );
+
+ eos = VARIANT_FALSE;
+ hr = _Stream_get_EOS( stream, &eos );
+ ok( hr == S_OK, "got %08x\n", hr );
+ ok( eos == VARIANT_TRUE, "got %04x\n", eos );
+
+ hr = _Stream_put_Position( stream, 6 );
+ ok( hr == S_OK, "got %08x\n", hr );
+
+ size = -1;
+ hr = _Stream_get_Size( stream, &size );
+ ok( hr == S_OK, "got %08x\n", hr );
+ ok( size == 10, "got %d\n", size );
+
+ hr = _Stream_put_Position( stream, 2 );
+ ok( hr == S_OK, "got %08x\n", hr );
+
hr = _Stream_Close( stream );
ok( hr == S_OK, "got %08x\n", hr );
@@ -191,6 +234,14 @@ static void test_Stream(void)
hr = _Stream_Open( stream, missing, adModeUnknown, adOpenStreamUnspecified, NULL, NULL );
ok( hr == S_OK, "got %08x\n", hr );
+ hr = _Stream_ReadText( stream, adReadAll, &str );
+ ok( hr == MAKE_ADO_HRESULT( adErrIllegalOperation ), "got %08x\n", hr );
+
+ str = SysAllocString( L"test" );
+ hr = _Stream_WriteText( stream, str, adWriteChar );
+ ok( hr == MAKE_ADO_HRESULT( adErrIllegalOperation ), "got %08x\n", hr );
+ SysFreeString( str );
+
VariantInit( &val );
hr = _Stream_Read( stream, 1, &val );
ok( hr == S_OK, "got %08x\n", hr );
--
2.20.1
Dec. 10, 2019
[PATCH 4/5] msado15: Implement _Stream_get_Charset and _Stream_put_Charset.
by Hans Leidekker
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
---
dlls/msado15/msado15_private.h | 8 ++++++++
dlls/msado15/stream.c | 24 ++++++++++++++++++++----
dlls/msado15/tests/msado15.c | 11 +++++++++++
3 files changed, 39 insertions(+), 4 deletions(-)
diff --git a/dlls/msado15/msado15_private.h b/dlls/msado15/msado15_private.h
index 1078cbf64e..7239e48b53 100644
--- a/dlls/msado15/msado15_private.h
+++ b/dlls/msado15/msado15_private.h
@@ -31,4 +31,12 @@ static inline void *heap_realloc_zero( void *mem, SIZE_T len )
return HeapReAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, mem, len );
}
+static inline WCHAR *strdupW( const WCHAR *src )
+{
+ WCHAR *dst;
+ if (!src) return NULL;
+ if ((dst = heap_alloc( (lstrlenW( src ) + 1) * sizeof(*dst) ))) lstrcpyW( dst, src );
+ return dst;
+}
+
#endif /* _WINE_MSADO15_PRIVATE_H_ */
diff --git a/dlls/msado15/stream.c b/dlls/msado15/stream.c
index 9aa35d5831..e2e404a620 100644
--- a/dlls/msado15/stream.c
+++ b/dlls/msado15/stream.c
@@ -38,6 +38,7 @@ struct stream
ConnectModeEnum mode;
StreamTypeEnum type;
LineSeparatorEnum sep;
+ WCHAR *charset;
LONG size;
LONG allocated;
LONG pos;
@@ -62,6 +63,7 @@ static ULONG WINAPI stream_Release( _Stream *iface )
if (!refs)
{
TRACE( "destroying %p\n", stream );
+ heap_free( stream->charset );
heap_free( stream->buf );
heap_free( stream );
}
@@ -240,14 +242,28 @@ static HRESULT WINAPI stream_put_Mode( _Stream *iface, ConnectModeEnum mode )
static HRESULT WINAPI stream_get_Charset( _Stream *iface, BSTR *charset )
{
- FIXME( "%p, %p\n", iface, charset );
- return E_NOTIMPL;
+ struct stream *stream = impl_from_Stream( iface );
+ const WCHAR *src = stream->charset ? stream->charset : L"Unicode";
+ BSTR dst;
+
+ TRACE( "%p, %p\n", stream, charset );
+
+ if (!(dst = SysAllocString( src ))) return E_OUTOFMEMORY;
+ *charset = dst;
+ return S_OK;
}
static HRESULT WINAPI stream_put_Charset( _Stream *iface, BSTR charset )
{
- FIXME( "%p, %s\n", iface, debugstr_w(charset) );
- return E_NOTIMPL;
+ struct stream *stream = impl_from_Stream( iface );
+ WCHAR *str;
+
+ TRACE( "%p, %s\n", stream, debugstr_w(charset) );
+
+ if (!(str = strdupW( charset ))) return E_OUTOFMEMORY;
+ heap_free( stream->charset );
+ stream->charset = str;
+ return S_OK;
}
static HRESULT create_byte_array( BYTE *data, LONG len, VARIANT *ret )
diff --git a/dlls/msado15/tests/msado15.c b/dlls/msado15/tests/msado15.c
index 6aab518da9..2c75904837 100644
--- a/dlls/msado15/tests/msado15.c
+++ b/dlls/msado15/tests/msado15.c
@@ -55,6 +55,7 @@ static void test_Stream(void)
LONG refs, size, pos;
ObjectStateEnum state;
ConnectModeEnum mode;
+ BSTR charset, str;
VARIANT missing, val;
HRESULT hr;
@@ -112,6 +113,16 @@ static void test_Stream(void)
hr = _Stream_put_Mode( stream, adModeReadWrite );
ok( hr == S_OK, "got %08x\n", hr );
+ hr = _Stream_get_Charset( stream, &charset );
+ ok( hr == S_OK, "got %08x\n", hr );
+ ok( !lstrcmpW( charset, L"Unicode" ), "got %s\n", wine_dbgstr_w(charset) );
+ SysFreeString( charset );
+
+ str = SysAllocString( L"Unicode" );
+ hr = _Stream_put_Charset( stream, str );
+ ok( hr == S_OK, "got %08x\n", hr );
+ SysFreeString( str );
+
hr = _Stream_Read( stream, 2, &val );
ok( hr == MAKE_ADO_HRESULT( adErrObjectClosed ), "got %08x\n", hr );
--
2.20.1
Dec. 10, 2019
[PATCH 3/5] msado15: Implement _Stream_get_Mode and _Stream_put_Mode.
by Hans Leidekker
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
---
dlls/msado15/stream.c | 15 +++++++++++----
dlls/msado15/tests/msado15.c | 9 +++++++++
2 files changed, 20 insertions(+), 4 deletions(-)
diff --git a/dlls/msado15/stream.c b/dlls/msado15/stream.c
index 07027f3829..9aa35d5831 100644
--- a/dlls/msado15/stream.c
+++ b/dlls/msado15/stream.c
@@ -35,6 +35,7 @@ struct stream
_Stream Stream_iface;
LONG refs;
ObjectStateEnum state;
+ ConnectModeEnum mode;
StreamTypeEnum type;
LineSeparatorEnum sep;
LONG size;
@@ -221,14 +222,20 @@ static HRESULT WINAPI stream_get_State( _Stream *iface, ObjectStateEnum *state )
static HRESULT WINAPI stream_get_Mode( _Stream *iface, ConnectModeEnum *mode )
{
- FIXME( "%p, %p\n", iface, mode );
- return E_NOTIMPL;
+ struct stream *stream = impl_from_Stream( iface );
+ TRACE( "%p, %p\n", stream, mode );
+
+ *mode = stream->mode;
+ return S_OK;
}
static HRESULT WINAPI stream_put_Mode( _Stream *iface, ConnectModeEnum mode )
{
- FIXME( "%p, %u\n", iface, mode );
- return E_NOTIMPL;
+ struct stream *stream = impl_from_Stream( iface );
+ TRACE( "%p, %u\n", stream, mode );
+
+ stream->mode = mode;
+ return S_OK;
}
static HRESULT WINAPI stream_get_Charset( _Stream *iface, BSTR *charset )
diff --git a/dlls/msado15/tests/msado15.c b/dlls/msado15/tests/msado15.c
index a4de15932d..6aab518da9 100644
--- a/dlls/msado15/tests/msado15.c
+++ b/dlls/msado15/tests/msado15.c
@@ -54,6 +54,7 @@ static void test_Stream(void)
LineSeparatorEnum sep;
LONG refs, size, pos;
ObjectStateEnum state;
+ ConnectModeEnum mode;
VARIANT missing, val;
HRESULT hr;
@@ -103,6 +104,14 @@ static void test_Stream(void)
ok( hr == S_OK, "got %08x\n", hr );
ok( state == adStateClosed, "got %u\n", state );
+ mode = 0xdeadbeef;
+ hr = _Stream_get_Mode( stream, &mode );
+ ok( hr == S_OK, "got %08x\n", hr );
+ ok( mode == adModeUnknown, "got %u\n", mode );
+
+ hr = _Stream_put_Mode( stream, adModeReadWrite );
+ ok( hr == S_OK, "got %08x\n", hr );
+
hr = _Stream_Read( stream, 2, &val );
ok( hr == MAKE_ADO_HRESULT( adErrObjectClosed ), "got %08x\n", hr );
--
2.20.1
Dec. 10, 2019
[PATCH 2/5] msado15: Implement _Stream_get_LineSeparator and _Stream_put_LineSeparator.
by Hans Leidekker
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
---
dlls/msado15/stream.c | 32 ++++++++++++++++++++------------
dlls/msado15/tests/msado15.c | 9 +++++++++
2 files changed, 29 insertions(+), 12 deletions(-)
diff --git a/dlls/msado15/stream.c b/dlls/msado15/stream.c
index 9fb6007b57..07027f3829 100644
--- a/dlls/msado15/stream.c
+++ b/dlls/msado15/stream.c
@@ -32,14 +32,15 @@ WINE_DEFAULT_DEBUG_CHANNEL(msado15);
struct stream
{
- _Stream Stream_iface;
- LONG refs;
- ObjectStateEnum state;
- StreamTypeEnum type;
- LONG size;
- LONG allocated;
- LONG pos;
- BYTE *buf;
+ _Stream Stream_iface;
+ LONG refs;
+ ObjectStateEnum state;
+ StreamTypeEnum type;
+ LineSeparatorEnum sep;
+ LONG size;
+ LONG allocated;
+ LONG pos;
+ BYTE *buf;
};
static inline struct stream *impl_from_Stream( _Stream *iface )
@@ -193,14 +194,20 @@ static HRESULT WINAPI stream_put_Type( _Stream *iface, StreamTypeEnum type )
static HRESULT WINAPI stream_get_LineSeparator( _Stream *iface, LineSeparatorEnum *sep )
{
- FIXME( "%p, %p\n", iface, sep );
- return E_NOTIMPL;
+ struct stream *stream = impl_from_Stream( iface );
+ TRACE( "%p, %p\n", stream, sep );
+
+ *sep = stream->sep;
+ return S_OK;
}
static HRESULT WINAPI stream_put_LineSeparator( _Stream *iface, LineSeparatorEnum sep )
{
- FIXME( "%p, %d\n", iface, sep );
- return E_NOTIMPL;
+ struct stream *stream = impl_from_Stream( iface );
+ TRACE( "%p, %d\n", stream, sep );
+
+ stream->sep = sep;
+ return S_OK;
}
static HRESULT WINAPI stream_get_State( _Stream *iface, ObjectStateEnum *state )
@@ -431,6 +438,7 @@ HRESULT Stream_create( void **obj )
stream->Stream_iface.lpVtbl = &stream_vtbl;
stream->refs = 1;
stream->type = adTypeText;
+ stream->sep = adCRLF;
*obj = &stream->Stream_iface;
TRACE( "returning iface %p\n", *obj );
diff --git a/dlls/msado15/tests/msado15.c b/dlls/msado15/tests/msado15.c
index 0b10579905..a4de15932d 100644
--- a/dlls/msado15/tests/msado15.c
+++ b/dlls/msado15/tests/msado15.c
@@ -51,6 +51,7 @@ static void test_Stream(void)
_Stream *stream;
VARIANT_BOOL eos;
StreamTypeEnum type;
+ LineSeparatorEnum sep;
LONG refs, size, pos;
ObjectStateEnum state;
VARIANT missing, val;
@@ -89,6 +90,14 @@ static void test_Stream(void)
hr = _Stream_put_Type( stream, adTypeText );
ok( hr == S_OK, "got %08x\n", hr );
+ sep = 0;
+ hr = _Stream_get_LineSeparator( stream, &sep );
+ ok( hr == S_OK, "got %08x\n", hr );
+ ok( sep == adCRLF, "got %d\n", sep );
+
+ hr = _Stream_put_LineSeparator( stream, adLF );
+ ok( hr == S_OK, "got %08x\n", hr );
+
state = 0xdeadbeef;
hr = _Stream_get_State( stream, &state );
ok( hr == S_OK, "got %08x\n", hr );
--
2.20.1
Dec. 10, 2019
[PATCH 1/5] msado15: Implement _Stream_get_EOS.
by Hans Leidekker
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
---
dlls/msado15/stream.c | 9 +++++++--
dlls/msado15/tests/msado15.c | 9 +++++++++
2 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/dlls/msado15/stream.c b/dlls/msado15/stream.c
index 169be7319e..9fb6007b57 100644
--- a/dlls/msado15/stream.c
+++ b/dlls/msado15/stream.c
@@ -124,8 +124,13 @@ static HRESULT WINAPI stream_get_Size( _Stream *iface, LONG *size )
static HRESULT WINAPI stream_get_EOS( _Stream *iface, VARIANT_BOOL *eos )
{
- FIXME( "%p, %p\n", iface, eos );
- return E_NOTIMPL;
+ struct stream *stream = impl_from_Stream( iface );
+ TRACE( "%p, %p\n", stream, eos );
+
+ if (stream->state == adStateClosed) return MAKE_ADO_HRESULT( adErrObjectClosed );
+
+ *eos = (stream->pos >= stream->size) ? VARIANT_TRUE : VARIANT_FALSE;
+ return S_OK;
}
static HRESULT WINAPI stream_get_Position( _Stream *iface, LONG *pos )
diff --git a/dlls/msado15/tests/msado15.c b/dlls/msado15/tests/msado15.c
index 1755a7f3da..0b10579905 100644
--- a/dlls/msado15/tests/msado15.c
+++ b/dlls/msado15/tests/msado15.c
@@ -49,6 +49,7 @@ static HRESULT str_to_byte_array( const char *data, VARIANT *ret )
static void test_Stream(void)
{
_Stream *stream;
+ VARIANT_BOOL eos;
StreamTypeEnum type;
LONG refs, size, pos;
ObjectStateEnum state;
@@ -61,6 +62,9 @@ static void test_Stream(void)
hr = _Stream_get_Size( stream, &size );
ok( hr == MAKE_ADO_HRESULT( adErrObjectClosed ), "got %08x\n", hr );
+ hr = _Stream_get_EOS( stream, &eos );
+ ok( hr == MAKE_ADO_HRESULT( adErrObjectClosed ), "got %08x\n", hr );
+
hr = _Stream_get_Position( stream, &pos );
ok( hr == MAKE_ADO_HRESULT( adErrObjectClosed ), "got %08x\n", hr );
@@ -111,6 +115,11 @@ static void test_Stream(void)
ok( hr == S_OK, "got %08x\n", hr );
ok( !size, "got %d\n", size );
+ eos = VARIANT_FALSE;
+ hr = _Stream_get_EOS( stream, &eos );
+ ok( hr == S_OK, "got %08x\n", hr );
+ ok( eos == VARIANT_TRUE, "got %04x\n", eos );
+
pos = -1;
hr = _Stream_get_Position( stream, &pos );
ok( hr == S_OK, "got %08x\n", hr );
--
2.20.1
Dec. 10, 2019
Re: [PATCH] ws2_32/tests: Fix the spelling of a couple of ok() messages.
by Marvin
Hi,
While running your changed tests, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at:
https://testbot.winehq.org/JobDetails.pl?Key=61772
Your paranoid android.
=== wvistau64 (32 bit report) ===
ws2_32:
sock.c:11456: Test failed: got 0
sock.c:11457: Test failed: got 00000000
sock.c:11458: Test failed: got 0000
sock.c:11459: Test failed: got 00000000
sock.c:11460: Test failed: got 00000000
sock.c:11531: Test failed: got 00000002
=== w864 (32 bit report) ===
ws2_32:
sock.c:8704: Test failed: The wrong first client was accepted by acceptex: 2 != 1
=== w1064v1809 (64 bit report) ===
ws2_32:
sock.c:8743: Test failed: bytesReturned isn't supposed to be 1
sock.c:8767: Test failed: GetOverlappedResult failed, error 0
=== debian10 (32 bit WoW report) ===
ws2_32:
sock.c:3052: Test failed: Test[1]: expected 2, got 0
sock.c:3052: Test failed: Test[2]: expected 2, got 0
sock.c:3052: Test failed: Test[1]: expected 2, got 0
sock.c:3052: Test failed: Test[2]: expected 2, got 0
Dec. 10, 2019
[PATCH] testbot/WineSendLog: Skip checking for new errors if there are no errors.
by Francois Gouget
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/bin/WineSendLog.pl | 3 +++
1 file changed, 3 insertions(+)
diff --git a/testbot/bin/WineSendLog.pl b/testbot/bin/WineSendLog.pl
index 95cc036c9..98bfc4c0f 100755
--- a/testbot/bin/WineSendLog.pl
+++ b/testbot/bin/WineSendLog.pl
@@ -287,6 +287,9 @@ EOF
foreach my $LogName (@{$JobErrors->{$Key}->{LogNames}})
{
my $LogErrors = $JobErrors->{$Key}->{$LogName};
+ # Skip if there are no errors
+ next if (!$LogErrors->{Groups});
+
my $RefFileName = $StepTask->GetFullFileName($StepTask->VM->Name ."_$LogName");
my ($NewGroups, $NewErrors, $_NewIndices) = GetNewLogErrors($RefFileName, $LogErrors->{Groups}, $LogErrors->{Errors});
if (!$NewGroups)
--
2.20.1
Dec. 10, 2019
[PATCH] testbot: Keep the StepTask methods in sync with the Step/Task ones.
by Francois Gouget
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/lib/WineTestBot/StepsTasks.pm | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/testbot/lib/WineTestBot/StepsTasks.pm b/testbot/lib/WineTestBot/StepsTasks.pm
index 19bedaaf4..463f15078 100644
--- a/testbot/lib/WineTestBot/StepsTasks.pm
+++ b/testbot/lib/WineTestBot/StepsTasks.pm
@@ -33,6 +33,7 @@ use WineTestBot::Config;
use WineTestBot::Missions;
+# Keep in sync with WineTestBot::Step::GetDir()
sub GetStepDir($)
{
my ($self) = @_;
@@ -40,7 +41,7 @@ sub GetStepDir($)
return "$DataDir/jobs/$JobId/". $self->StepNo;
}
-# See WineTestBot::Step::GetFullFileName()
+# Keep in sync with WineTestBot::Step::GetFullFileName()
sub GetFullFileName($;$)
{
my ($self, $FileName) = @_;
@@ -59,6 +60,7 @@ sub GetFullFileName($;$)
return $Path . $FileName;
}
+# Keep in sync with WineTestBot::Task::GetDir()
sub GetTaskDir($)
{
my ($self) = @_;
--
2.20.1
Dec. 10, 2019
Re: [PATCH] wineqtdecoder: Fix macos compile error
by Matteo Bruni
On Sun, Dec 8, 2019 at 4:22 AM Mathew Hodson <mathew.hodson(a)gmail.com> wrote:
>
> On Sat, Dec 7, 2019 at 1:03 AM Alistair Leslie-Hughes
> <leslie_alistair(a)hotmail.com> wrote:
> >
> > Regression of 498179b4482026091bf7376c0d2ac9a036e7ca0e
> >
> > Signed-off-by: Alistair Leslie-Hughes <leslie_alistair(a)hotmail.com>
> > ---
> > dlls/wineqtdecoder/qtsplitter.c | 10 ++++------
> > 1 file changed, 4 insertions(+), 6 deletions(-)
> >
> > diff --git a/dlls/wineqtdecoder/qtsplitter.c b/dlls/wineqtdecoder/qtsplitter.c
> > index 5b1e82ebc9b..956dd0a7d0d 100644
> > --- a/dlls/wineqtdecoder/qtsplitter.c
> > +++ b/dlls/wineqtdecoder/qtsplitter.c
> > @@ -285,7 +285,7 @@ static HRESULT qt_splitter_start_stream(struct strmbase_filter *iface, REFERENCE
> > QTSplitter *filter = impl_from_strmbase_filter(iface);
> > HRESULT hr = VFW_E_NOT_CONNECTED, pin_hr;
> >
> > - EnterCriticalSection(&This->csReceive);
> > + EnterCriticalSection(&filter->csReceive);
>
> Wouldn't the original commit have failed to compile on all platforms?
>
> Where is the This variable defined?
wineqtdecoder is only built and used on macOS.
Dec. 10, 2019
Re: [PATCH] msado15: Fix the name of the GetString() delimiter parameters.
by Hans Leidekker
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
Dec. 10, 2019
[PATCH v2] msado15: Print the debug strings and not the pointers to them
by Hans Leidekker
From: Michael Stefaniuc <mstefani(a)winehq.org>
v2: Don't trace the password.
Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org>
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
---
dlls/msado15/connection.c | 2 +-
dlls/msado15/stream.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/dlls/msado15/connection.c b/dlls/msado15/connection.c
index f33bc89a1a..43497636a8 100644
--- a/dlls/msado15/connection.c
+++ b/dlls/msado15/connection.c
@@ -187,7 +187,7 @@ static HRESULT WINAPI connection_Open( _Connection *iface, BSTR connect_str, BST
LONG options )
{
FIXME( "%p, %s, %s, %p, %08x\n", iface, debugstr_w(connect_str), debugstr_w(userid),
- debugstr_w(password), options );
+ password, options );
return E_NOTIMPL;
}
diff --git a/dlls/msado15/stream.c b/dlls/msado15/stream.c
index 0c4d9ea425..169be7319e 100644
--- a/dlls/msado15/stream.c
+++ b/dlls/msado15/stream.c
@@ -371,7 +371,7 @@ static HRESULT WINAPI stream_ReadText( _Stream *iface, LONG len, BSTR *ret )
static HRESULT WINAPI stream_WriteText( _Stream *iface, BSTR data, StreamWriteEnum options )
{
- FIXME( "%p, %p, %u\n", iface, debugstr_w(data), options );
+ FIXME( "%p, %s, %u\n", iface, debugstr_w(data), options );
return E_NOTIMPL;
}
--
2.20.1
Dec. 10, 2019