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
February 2018
- 74 participants
- 1541 messages
[PATCH 4/8] wined3d: Fix draw calls when first render target is NULL.
by Józef Kucia
In Direct3D 10+, the render target at index 0 can be set to NULL.
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
Also, a more complex logic may be needed for acquiring context
for no attachments draw calls.
There is a potential issue in the code: the assumption that the render
target is a texture, but it is a bug in the current code.
---
dlls/wined3d/context.c | 53 ++++++++++++++++++++++++++++++++++++--------------
1 file changed, 38 insertions(+), 15 deletions(-)
diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index 4282cfb94d01..534f05a9f0bd 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -3157,6 +3157,7 @@ void context_state_fb(struct wined3d_context *context, const struct wined3d_stat
{
DWORD rt_mask = find_draw_buffers_mask(context, state);
const struct wined3d_fb_state *fb = state->fb;
+ DWORD color_location = 0;
DWORD *cur_mask;
if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
@@ -3173,18 +3174,20 @@ void context_state_fb(struct wined3d_context *context, const struct wined3d_stat
memset(context->blit_targets, 0, sizeof(context->blit_targets));
for (i = 0; i < context->gl_info->limits.buffers; ++i)
{
- if (fb->render_targets[i])
- {
- context->blit_targets[i].gl_view = fb->render_targets[i]->gl_view;
- context->blit_targets[i].resource = fb->render_targets[i]->resource;
- context->blit_targets[i].sub_resource_idx = fb->render_targets[i]->sub_resource_idx;
- context->blit_targets[i].layer_count = fb->render_targets[i]->layer_count;
- }
+ if (!fb->render_targets[i])
+ continue;
+
+ context->blit_targets[i].gl_view = fb->render_targets[i]->gl_view;
+ context->blit_targets[i].resource = fb->render_targets[i]->resource;
+ context->blit_targets[i].sub_resource_idx = fb->render_targets[i]->sub_resource_idx;
+ context->blit_targets[i].layer_count = fb->render_targets[i]->layer_count;
+
+ if (!color_location)
+ color_location = fb->render_targets[i]->resource->draw_binding;
}
context_apply_fbo_state(context, GL_FRAMEBUFFER, context->blit_targets,
wined3d_rendertarget_view_get_surface(fb->depth_stencil),
- fb->render_targets[0] ? fb->render_targets[0]->resource->draw_binding : 0,
- fb->depth_stencil ? fb->depth_stencil->resource->draw_binding : 0);
+ color_location, fb->depth_stencil ? fb->depth_stencil->resource->draw_binding : 0);
}
}
@@ -4774,6 +4777,31 @@ static GLenum gl_tfb_primitive_type_from_d3d(enum wined3d_primitive_type primiti
}
}
+static struct wined3d_context *context_acquire_for_draw_call(const struct wined3d_device *device,
+ const struct wined3d_fb_state *fb)
+{
+ struct wined3d_texture *texture = NULL;
+ struct wined3d_rendertarget_view *rtv;
+ unsigned int sub_resource_idx = 0;
+ unsigned int i;
+
+ for (i = 0; i < ARRAY_SIZE(fb->render_targets); ++i)
+ {
+ if ((rtv = fb->render_targets[i]))
+ break;
+ }
+ if (!rtv)
+ rtv = fb->depth_stencil;
+
+ if (rtv)
+ {
+ texture = wined3d_texture_from_resource(rtv->resource);
+ sub_resource_idx = rtv->sub_resource_idx;
+ }
+
+ return context_acquire(device, texture, sub_resource_idx);
+}
+
/* Routine common to the draw primitive and draw indexed primitive routines */
void draw_primitive(struct wined3d_device *device, const struct wined3d_state *state,
const struct wined3d_draw_parameters *parameters)
@@ -4792,12 +4820,7 @@ void draw_primitive(struct wined3d_device *device, const struct wined3d_state *s
if (!parameters->indirect && !parameters->u.direct.index_count)
return;
- if (!(rtv = fb->render_targets[0]))
- rtv = fb->depth_stencil;
- if (rtv)
- context = context_acquire(device, wined3d_texture_from_resource(rtv->resource), rtv->sub_resource_idx);
- else
- context = context_acquire(device, NULL, 0);
+ context = context_acquire_for_draw_call(device, fb);
if (!context->valid)
{
context_release(context);
--
2.16.1
Feb. 28, 2018
[PATCH 3/8] wined3d: Do not call context_validate_onscreen_formats() in context_apply_blit_state().
by Józef Kucia
It does nothing when depth_stencil is NULL.
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
dlls/wined3d/context.c | 2 --
1 file changed, 2 deletions(-)
diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index 32126b7dc078..4282cfb94d01 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -2956,8 +2956,6 @@ void context_apply_blit_state(struct wined3d_context *context, const struct wine
if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
{
- context_validate_onscreen_formats(context, NULL);
-
if (context->render_offscreen)
{
wined3d_texture_load(rt, context, FALSE);
--
2.16.1
Feb. 28, 2018
[PATCH 2/8] dxgi/tests: Add basic test for sync intervals.
by Józef Kucia
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
dlls/dxgi/tests/device.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 58 insertions(+)
diff --git a/dlls/dxgi/tests/device.c b/dlls/dxgi/tests/device.c
index 8351a32e596d..d265978ba4b1 100644
--- a/dlls/dxgi/tests/device.c
+++ b/dlls/dxgi/tests/device.c
@@ -3353,6 +3353,63 @@ static void test_swapchain_parameters(void)
DestroyWindow(window);
}
+static void test_swapchain_present(void)
+{
+ DXGI_SWAP_CHAIN_DESC swapchain_desc;
+ IDXGISwapChain *swapchain;
+ IDXGIAdapter *adapter;
+ IDXGIFactory *factory;
+ IDXGIDevice *device;
+ unsigned int i;
+ ULONG refcount;
+ HRESULT hr;
+
+ if (!(device = create_device(0)))
+ {
+ skip("Failed to create device.\n");
+ return;
+ }
+
+ hr = IDXGIDevice_GetAdapter(device, &adapter);
+ ok(SUCCEEDED(hr), "GetAdapter failed, hr %#x.\n", hr);
+ hr = IDXGIAdapter_GetParent(adapter, &IID_IDXGIFactory, (void **)&factory);
+ ok(SUCCEEDED(hr), "GetParent failed, hr %#x.\n", hr);
+ IDXGIAdapter_Release(adapter);
+
+ swapchain_desc.BufferDesc.Width = 800;
+ swapchain_desc.BufferDesc.Height = 600;
+ swapchain_desc.BufferDesc.RefreshRate.Numerator = 60;
+ swapchain_desc.BufferDesc.RefreshRate.Denominator = 60;
+ swapchain_desc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
+ swapchain_desc.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
+ swapchain_desc.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
+ swapchain_desc.SampleDesc.Count = 1;
+ swapchain_desc.SampleDesc.Quality = 0;
+ swapchain_desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
+ swapchain_desc.BufferCount = 1;
+ swapchain_desc.OutputWindow = CreateWindowA("static", "dxgi_test", 0, 0, 0, 400, 200, 0, 0, 0, 0);
+ swapchain_desc.Windowed = TRUE;
+ swapchain_desc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
+ swapchain_desc.Flags = 0;
+
+ hr = IDXGIFactory_CreateSwapChain(factory, (IUnknown *)device, &swapchain_desc, &swapchain);
+ ok(SUCCEEDED(hr), "CreateSwapChain failed, hr %#x.\n", hr);
+
+ for (i = 0; i < 10; ++i)
+ {
+ hr = IDXGISwapChain_Present(swapchain, i, 0);
+ ok(hr == (i <= 4 ? S_OK : DXGI_ERROR_INVALID_CALL),
+ "Got unexpected hr %#x for sync interval %u.\n", hr, i);
+ }
+ hr = IDXGISwapChain_Present(swapchain, 0, 0);
+ ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
+
+ IDXGISwapChain_Release(swapchain);
+ refcount = IDXGIDevice_Release(device);
+ ok(!refcount, "Device has %u references left.\n", refcount);
+ DestroyWindow(swapchain_desc.OutputWindow);
+}
+
static void test_maximum_frame_latency(void)
{
IDXGIDevice1 *device1;
@@ -3654,6 +3711,7 @@ START_TEST(device)
test_private_data();
test_swapchain_resize();
test_swapchain_parameters();
+ test_swapchain_present();
test_maximum_frame_latency();
test_output_desc();
test_object_wrapping();
--
2.16.1
Feb. 28, 2018
[PATCH 1/8] wined3d: Implement updating swap interval through wined3d_swapchain_present().
by Józef Kucia
From: Michael Müller <michael(a)fds-team.de>
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
dlls/d3d8/swapchain.c | 2 +-
dlls/d3d9/device.c | 4 ++--
dlls/d3d9/swapchain.c | 2 +-
dlls/dxgi/swapchain.c | 27 ++++++++++++++++++++++++---
dlls/wined3d/cs.c | 11 ++++++++++-
dlls/wined3d/surface.c | 2 +-
dlls/wined3d/swapchain.c | 5 +++--
dlls/wined3d/wined3d.spec | 2 +-
dlls/wined3d/wined3d_private.h | 4 ++--
include/wine/wined3d.h | 2 +-
10 files changed, 46 insertions(+), 15 deletions(-)
diff --git a/dlls/d3d8/swapchain.c b/dlls/d3d8/swapchain.c
index 7003aa32dbcb..3a588b5e8c2b 100644
--- a/dlls/d3d8/swapchain.c
+++ b/dlls/d3d8/swapchain.c
@@ -105,7 +105,7 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH d3d8_swapchain_Present(IDirect3DSwapChai
wined3d_mutex_lock();
hr = wined3d_swapchain_present(swapchain->wined3d_swapchain,
- src_rect, dst_rect, dst_window_override, 0);
+ src_rect, dst_rect, dst_window_override, 0, 0);
wined3d_mutex_unlock();
return hr;
diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c
index aac0961d559e..bc73699e5251 100644
--- a/dlls/d3d9/device.c
+++ b/dlls/d3d9/device.c
@@ -992,7 +992,7 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH d3d9_device_Present(IDirect3DDevice9Ex *
for (i = 0; i < device->implicit_swapchain_count; ++i)
{
if (FAILED(hr = wined3d_swapchain_present(device->implicit_swapchains[i]->wined3d_swapchain,
- src_rect, dst_rect, dst_window_override, 0)))
+ src_rect, dst_rect, dst_window_override, 0, 0)))
{
wined3d_mutex_unlock();
return hr;
@@ -3684,7 +3684,7 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH d3d9_device_PresentEx(IDirect3DDevice9Ex
for (i = 0; i < device->implicit_swapchain_count; ++i)
{
if (FAILED(hr = wined3d_swapchain_present(device->implicit_swapchains[i]->wined3d_swapchain,
- src_rect, dst_rect, dst_window_override, flags)))
+ src_rect, dst_rect, dst_window_override, 0, flags)))
{
wined3d_mutex_unlock();
return hr;
diff --git a/dlls/d3d9/swapchain.c b/dlls/d3d9/swapchain.c
index 411040ad66df..dbb3f45b91d5 100644
--- a/dlls/d3d9/swapchain.c
+++ b/dlls/d3d9/swapchain.c
@@ -137,7 +137,7 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH d3d9_swapchain_Present(IDirect3DSwapChai
wined3d_mutex_lock();
hr = wined3d_swapchain_present(swapchain->wined3d_swapchain,
- src_rect, dst_rect, dst_window_override, flags);
+ src_rect, dst_rect, dst_window_override, 0, flags);
wined3d_mutex_unlock();
return hr;
diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c
index 1f88d71b77a7..7ddf51c0d5c9 100644
--- a/dlls/dxgi/swapchain.c
+++ b/dlls/dxgi/swapchain.c
@@ -528,11 +528,34 @@ static HRESULT STDMETHODCALLTYPE dxgi_swapchain_Present1(IDXGISwapChain1 *iface,
UINT sync_interval, UINT flags, const DXGI_PRESENT_PARAMETERS *present_parameters)
{
struct dxgi_swapchain *swapchain = impl_from_IDXGISwapChain1(iface);
+ DWORD swap_interval;
HRESULT hr;
TRACE("iface %p, sync_interval %u, flags %#x, present_parameters %p.\n",
iface, sync_interval, flags, present_parameters);
+ switch (sync_interval)
+ {
+ case 0:
+ swap_interval = WINED3DPRESENT_INTERVAL_IMMEDIATE;
+ break;
+ case 1:
+ swap_interval = WINED3DPRESENT_INTERVAL_ONE;
+ break;
+ case 2:
+ swap_interval = WINED3DPRESENT_INTERVAL_TWO;
+ break;
+ case 3:
+ swap_interval = WINED3DPRESENT_INTERVAL_THREE;
+ break;
+ case 4:
+ swap_interval = WINED3DPRESENT_INTERVAL_FOUR;
+ break;
+ default:
+ WARN("Invalid sync interval %u.\n", sync_interval);
+ return DXGI_ERROR_INVALID_CALL;
+ }
+
if (flags & ~DXGI_PRESENT_TEST)
FIXME("Unimplemented flags %#x.\n", flags);
if (flags & DXGI_PRESENT_TEST)
@@ -541,13 +564,11 @@ static HRESULT STDMETHODCALLTYPE dxgi_swapchain_Present1(IDXGISwapChain1 *iface,
return S_OK;
}
- if (sync_interval)
- FIXME("Unimplemented sync interval %u.\n", sync_interval);
if (present_parameters)
FIXME("Ignored present parameters %p.\n", present_parameters);
wined3d_mutex_lock();
- hr = wined3d_swapchain_present(swapchain->wined3d_swapchain, NULL, NULL, NULL, 0);
+ hr = wined3d_swapchain_present(swapchain->wined3d_swapchain, NULL, NULL, NULL, swap_interval, 0);
wined3d_mutex_unlock();
return hr;
diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c
index 9f3ff4691d1a..d16a8997e931 100644
--- a/dlls/wined3d/cs.c
+++ b/dlls/wined3d/cs.c
@@ -94,6 +94,7 @@ struct wined3d_cs_present
struct wined3d_swapchain *swapchain;
RECT src_rect;
RECT dst_rect;
+ DWORD swap_interval;
DWORD flags;
};
@@ -453,6 +454,12 @@ static void wined3d_cs_exec_present(struct wined3d_cs *cs, const void *data)
swapchain = op->swapchain;
wined3d_swapchain_set_window(swapchain, op->dst_window_override);
+ if (op->swap_interval && swapchain->desc.swap_interval != op->swap_interval)
+ {
+ swapchain->desc.swap_interval = op->swap_interval;
+ swapchain_update_swap_interval(swapchain);
+ }
+
swapchain->swapchain_ops->swapchain_present(swapchain, &op->src_rect, &op->dst_rect, op->flags);
wined3d_resource_release(&swapchain->front_buffer->resource);
@@ -465,7 +472,8 @@ static void wined3d_cs_exec_present(struct wined3d_cs *cs, const void *data)
}
void wined3d_cs_emit_present(struct wined3d_cs *cs, struct wined3d_swapchain *swapchain,
- const RECT *src_rect, const RECT *dst_rect, HWND dst_window_override, DWORD flags)
+ const RECT *src_rect, const RECT *dst_rect, HWND dst_window_override,
+ DWORD swap_interval, DWORD flags)
{
struct wined3d_cs_present *op;
unsigned int i;
@@ -477,6 +485,7 @@ void wined3d_cs_emit_present(struct wined3d_cs *cs, struct wined3d_swapchain *sw
op->swapchain = swapchain;
op->src_rect = *src_rect;
op->dst_rect = *dst_rect;
+ op->swap_interval = swap_interval;
op->flags = flags;
pending = InterlockedIncrement(&cs->pending_presents);
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index ada71938da52..d7f5fcab7d52 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -4007,7 +4007,7 @@ HRESULT wined3d_surface_blt(struct wined3d_surface *dst_surface, const RECT *dst
/* Set the swap effect to COPY, we don't want the backbuffer to become
* undefined. */
dst_swapchain->desc.swap_effect = WINED3D_SWAP_EFFECT_COPY;
- wined3d_swapchain_present(dst_swapchain, NULL, NULL, dst_swapchain->win_handle, 0);
+ wined3d_swapchain_present(dst_swapchain, NULL, NULL, dst_swapchain->win_handle, 0, 0);
dst_swapchain->desc.swap_effect = swap_effect;
return WINED3D_OK;
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index 0d76b671717e..c7e9bf12d0b2 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -146,7 +146,8 @@ void CDECL wined3d_swapchain_set_window(struct wined3d_swapchain *swapchain, HWN
}
HRESULT CDECL wined3d_swapchain_present(struct wined3d_swapchain *swapchain,
- const RECT *src_rect, const RECT *dst_rect, HWND dst_window_override, DWORD flags)
+ const RECT *src_rect, const RECT *dst_rect, HWND dst_window_override,
+ DWORD swap_interval, DWORD flags)
{
RECT s, d;
@@ -177,7 +178,7 @@ HRESULT CDECL wined3d_swapchain_present(struct wined3d_swapchain *swapchain,
}
wined3d_cs_emit_present(swapchain->device->cs, swapchain, src_rect,
- dst_rect, dst_window_override, flags);
+ dst_rect, dst_window_override, swap_interval, flags);
return WINED3D_OK;
}
diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec
index d2b6bef36340..16d22f5263ac 100644
--- a/dlls/wined3d/wined3d.spec
+++ b/dlls/wined3d/wined3d.spec
@@ -281,7 +281,7 @@
@ cdecl wined3d_swapchain_get_desc(ptr ptr)
@ cdecl wined3d_swapchain_get_raster_status(ptr ptr)
@ cdecl wined3d_swapchain_incref(ptr)
-@ cdecl wined3d_swapchain_present(ptr ptr ptr ptr long)
+@ cdecl wined3d_swapchain_present(ptr ptr ptr ptr long long)
@ cdecl wined3d_swapchain_resize_buffers(ptr long long long long long long)
@ cdecl wined3d_swapchain_resize_target(ptr ptr)
@ cdecl wined3d_swapchain_set_fullscreen(ptr ptr ptr)
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index f085f2d8b85e..bba80df35cfd 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -3548,8 +3548,8 @@ void wined3d_cs_emit_draw_indirect(struct wined3d_cs *cs, GLenum primitive_type,
void wined3d_cs_emit_flush(struct wined3d_cs *cs) DECLSPEC_HIDDEN;
void wined3d_cs_emit_generate_mipmaps(struct wined3d_cs *cs, struct wined3d_shader_resource_view *view) DECLSPEC_HIDDEN;
void wined3d_cs_emit_preload_resource(struct wined3d_cs *cs, struct wined3d_resource *resource) DECLSPEC_HIDDEN;
-void wined3d_cs_emit_present(struct wined3d_cs *cs, struct wined3d_swapchain *swapchain,
- const RECT *src_rect, const RECT *dst_rect, HWND dst_window_override, DWORD flags) DECLSPEC_HIDDEN;
+void wined3d_cs_emit_present(struct wined3d_cs *cs, struct wined3d_swapchain *swapchain, const RECT *src_rect,
+ const RECT *dst_rect, HWND dst_window_override, DWORD swap_interval, DWORD flags) DECLSPEC_HIDDEN;
void wined3d_cs_emit_query_issue(struct wined3d_cs *cs, struct wined3d_query *query, DWORD flags) DECLSPEC_HIDDEN;
void wined3d_cs_emit_reset_state(struct wined3d_cs *cs) DECLSPEC_HIDDEN;
void wined3d_cs_emit_set_blend_state(struct wined3d_cs *cs, struct wined3d_blend_state *state) DECLSPEC_HIDDEN;
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index b6a2ec38a004..96c1c25bf07c 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -2656,7 +2656,7 @@ HRESULT __cdecl wined3d_swapchain_get_raster_status(const struct wined3d_swapcha
struct wined3d_raster_status *raster_status);
ULONG __cdecl wined3d_swapchain_incref(struct wined3d_swapchain *swapchain);
HRESULT __cdecl wined3d_swapchain_present(struct wined3d_swapchain *swapchain,
- const RECT *src_rect, const RECT *dst_rect, HWND dst_window_override, DWORD flags);
+ const RECT *src_rect, const RECT *dst_rect, HWND dst_window_override, DWORD swap_interval, DWORD flags);
HRESULT __cdecl wined3d_swapchain_resize_buffers(struct wined3d_swapchain *swapchain, unsigned int buffer_count,
unsigned int width, unsigned int height, enum wined3d_format_id format_id,
enum wined3d_multisample_type multisample_type, unsigned int multisample_quality);
--
2.16.1
Feb. 28, 2018
Re: [PATCH 2/2] kernelbase/tests: Add some tests for PathCchCombineEx()
by Marvin
Hi,
While running your changed tests on Windows, 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=36272
Your paranoid android.
=== build (build) ===
Recreation of tests/Makefile failed
Feb. 28, 2018
[PATCH 2/2] kernelbase/tests: Add some tests for PathCchCombineEx()
by Nikolay Sivov
From: Michael Müller <michael(a)fds-team.de>
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
configure.ac | 1 +
dlls/kernelbase/tests/Makefile.in | 4 ++
dlls/kernelbase/tests/path.c | 123 ++++++++++++++++++++++++++++++++++++++
3 files changed, 128 insertions(+)
create mode 100644 dlls/kernelbase/tests/Makefile.in
create mode 100644 dlls/kernelbase/tests/path.c
diff --git a/configure.ac b/configure.ac
index 02937cab5d..b014ef7cf1 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3308,6 +3308,7 @@ WINE_CONFIG_DLL(kerberos)
WINE_CONFIG_DLL(kernel32)
WINE_CONFIG_TEST(dlls/kernel32/tests)
WINE_CONFIG_DLL(kernelbase)
+WINE_CONFIG_TEST(dlls/kernelbase/tests)
WINE_CONFIG_DLL(keyboard.drv16,enable_win16)
WINE_CONFIG_DLL(krnl386.exe16,enable_win16)
WINE_CONFIG_DLL(ksuser)
diff --git a/dlls/kernelbase/tests/Makefile.in b/dlls/kernelbase/tests/Makefile.in
new file mode 100644
index 0000000000..ac8e1fcaa6
--- /dev/null
+++ b/dlls/kernelbase/tests/Makefile.in
@@ -0,0 +1,4 @@
+TESTDLL = kernelbase.dll
+
+C_SRCS = \
+ path.c
diff --git a/dlls/kernelbase/tests/path.c b/dlls/kernelbase/tests/path.c
new file mode 100644
index 0000000000..fbe1d3be2f
--- /dev/null
+++ b/dlls/kernelbase/tests/path.c
@@ -0,0 +1,123 @@
+/*
+ * Path tests for kernelbase.dll
+ *
+ * Copyright 2017 Michael Müller
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <stdarg.h>
+#include <windef.h>
+#include <winbase.h>
+#include <stdlib.h>
+#include <winerror.h>
+#include <winnls.h>
+#include <pathcch.h>
+#include <strsafe.h>
+
+#include "wine/test.h"
+
+HRESULT (WINAPI *pPathCchCombineEx)(WCHAR *out, SIZE_T size, const WCHAR *path1, const WCHAR *path2, DWORD flags);
+
+static const struct
+{
+ const char *path1;
+ const char *path2;
+ const char *result;
+}
+combine_test[] =
+{
+ /* normal paths */
+ {"C:\\", "a", "C:\\a" },
+ {"C:\\b", "..\\a", "C:\\a" },
+ {"C:", "a", "C:\\a" },
+ {"C:\\", ".", "C:\\" },
+ {"C:\\", "..", "C:\\" },
+ {"\\a", "b", "\\a\\b" },
+
+ /* normal UNC paths */
+ {"\\\\192.168.1.1\\test", "a", "\\\\192.168.1.1\\test\\a" },
+ {"\\\\192.168.1.1\\test", "..", "\\\\192.168.1.1" },
+
+ /* NT paths */
+ {"\\\\?\\C:\\", "a", "C:\\a" },
+ {"\\\\?\\C:\\", "..", "C:\\" },
+
+ /* NT UNC path */
+ {"\\\\?\\UNC\\192.168.1.1\\test", "a", "\\\\192.168.1.1\\test\\a" },
+ {"\\\\?\\UNC\\192.168.1.1\\test", "..", "\\\\192.168.1.1" },
+};
+
+static void test_PathCchCombineEx(void)
+{
+ WCHAR expected[MAX_PATH] = {'C',':','\\','a',0};
+ WCHAR p1[MAX_PATH] = {'C',':','\\',0};
+ WCHAR p2[MAX_PATH] = {'a',0};
+ WCHAR output[MAX_PATH];
+ HRESULT hr;
+ int i;
+
+ if (!pPathCchCombineEx)
+ {
+ skip("PathCchCombineEx() is not available.\n");
+ return;
+ }
+
+ hr = pPathCchCombineEx(NULL, 2, p1, p2, 0);
+ ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr);
+
+ memset(output, 0xff, sizeof(output));
+ hr = pPathCchCombineEx(output, 0, p1, p2, 0);
+ ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", hr);
+ ok(output[0] == 0xffff, "Expected output buffer to be unchanged\n");
+
+ memset(output, 0xff, sizeof(output));
+ hr = pPathCchCombineEx(output, 1, p1, p2, 0);
+ ok(hr == STRSAFE_E_INSUFFICIENT_BUFFER, "Expected STRSAFE_E_INSUFFICIENT_BUFFER, got %08x\n", hr);
+ ok(output[0] == 0, "Expected output buffer to contain NULL string\n");
+
+ memset(output, 0xff, sizeof(output));
+ hr = pPathCchCombineEx(output, 4, p1, p2, 0);
+ ok(hr == STRSAFE_E_INSUFFICIENT_BUFFER, "Expected STRSAFE_E_INSUFFICIENT_BUFFER, got %08x\n", hr);
+ ok(output[0] == 0x0, "Expected output buffer to contain NULL string\n");
+
+ memset(output, 0xff, sizeof(output));
+ hr = pPathCchCombineEx(output, 5, p1, p2, 0);
+ ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
+ ok(!lstrcmpW(output, expected),
+ "Combination of %s + %s returned %s, expected %s\n",
+ wine_dbgstr_w(p1), wine_dbgstr_w(p2), wine_dbgstr_w(output), wine_dbgstr_w(expected));
+
+ for (i = 0; i < sizeof(combine_test)/sizeof(combine_test[0]); i++)
+ {
+ MultiByteToWideChar(CP_ACP, 0, combine_test[i].path1, -1, p1, MAX_PATH);
+ MultiByteToWideChar(CP_ACP, 0, combine_test[i].path2, -1, p2, MAX_PATH);
+ MultiByteToWideChar(CP_ACP, 0, combine_test[i].result, -1, expected, MAX_PATH);
+
+ hr = pPathCchCombineEx(output, MAX_PATH, p1, p2, 0);
+ ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
+ ok(!lstrcmpW(output, expected), "Combining %s with %s returned %s, expected %s\n",
+ wine_dbgstr_w(p1), wine_dbgstr_w(p2), wine_dbgstr_w(output), wine_dbgstr_w(expected));
+ }
+}
+
+START_TEST(path)
+{
+ HMODULE hmod = LoadLibraryA("kernelbase.dll");
+
+ pPathCchCombineEx = (void *)GetProcAddress(hmod, "PathCchCombineEx");
+
+ test_PathCchCombineEx();
+}
--
2.16.1
Feb. 28, 2018
[PATCH 1/2] include: Add PathCchCombineEx() definition
by Nikolay Sivov
From: Michael Müller <michael(a)fds-team.de>
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
include/Makefile.in | 1 +
include/pathcch.h | 26 ++++++++++++++++++++++++++
2 files changed, 27 insertions(+)
create mode 100644 include/pathcch.h
diff --git a/include/Makefile.in b/include/Makefile.in
index f1bcba35ed..72304d6f91 100644
--- a/include/Makefile.in
+++ b/include/Makefile.in
@@ -494,6 +494,7 @@ SOURCES = \
opnrst.idl \
optary.idl \
patchapi.h \
+ pathcch.h \
pdh.h \
pdhmsg.h \
perflib.h \
diff --git a/include/pathcch.h b/include/pathcch.h
new file mode 100644
index 0000000000..8831c5238d
--- /dev/null
+++ b/include/pathcch.h
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2017 Michael Müller
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#define PATHCCH_NONE 0x00
+#define PATHCCH_ALLOW_LONG_PATHS 0x01
+#define PATHCCH_FORCE_ENABLE_LONG_NAME_PROCESS 0x02
+#define PATHCCH_FORCE_DISABLE_LONG_NAME_PROCESS 0x04
+#define PATHCCH_DO_NOT_NORMALIZE_SEGMENTS 0x08
+#define PATHCCH_ENSURE_IS_EXTENDED_LENGTH_PATH 0x10
+
+HRESULT WINAPI PathCchCombineEx(WCHAR *out, SIZE_T size, const WCHAR *path1, const WCHAR *path2, DWORD flags);
--
2.16.1
Feb. 28, 2018
Re: [PATCH] bcrypt/tests: Correctly check the size in BCryptGetProperty.
by Hans Leidekker
Subject prefix should be bcrypt, not bcrypt/tests.
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
Feb. 28, 2018
[PATCH] dwmapi: Add DwmSetIconicThumbnail() stub
by Nikolay Sivov
From: Michael Müller <michael(a)fds-team.de>
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
For https://bugs.winehq.org/show_bug.cgi?id=44628
dlls/dwmapi/dwmapi.spec | 2 +-
dlls/dwmapi/dwmapi_main.c | 9 +++++++++
2 files changed, 10 insertions(+), 1 deletion(-)
diff --git a/dlls/dwmapi/dwmapi.spec b/dlls/dwmapi/dwmapi.spec
index d81df3d841..697cefc071 100644
--- a/dlls/dwmapi/dwmapi.spec
+++ b/dlls/dwmapi/dwmapi.spec
@@ -81,7 +81,7 @@
# @ stub DwmRenderGesture
@ stub DwmSetDxFrameDuration
@ stub DwmSetIconicLivePreviewBitmap
-@ stub DwmSetIconicThumbnail
+@ stdcall DwmSetIconicThumbnail(long long long)
@ stdcall DwmSetPresentParameters(ptr ptr)
@ stdcall DwmSetWindowAttribute(long long ptr long)
# @ stub DwmShowContact
diff --git a/dlls/dwmapi/dwmapi_main.c b/dlls/dwmapi/dwmapi_main.c
index 8c3472a529..7ac0b2b790 100644
--- a/dlls/dwmapi/dwmapi_main.c
+++ b/dlls/dwmapi/dwmapi_main.c
@@ -268,3 +268,12 @@ HRESULT WINAPI DwmSetPresentParameters(HWND hwnd, DWM_PRESENT_PARAMETERS *params
FIXME("(%p %p) stub\n", hwnd, params);
return S_OK;
};
+
+/**********************************************************************
+ * DwmSetIconicThumbnail (DWMAPI.@)
+ */
+HRESULT WINAPI DwmSetIconicThumbnail(HWND hwnd, HBITMAP hbmp, DWORD flags)
+{
+ FIXME("(%p %p %x) stub\n", hwnd, hbmp, flags);
+ return S_OK;
+};
--
2.16.1
Feb. 28, 2018
[PATCH 2/2] gdiplus/tests: Add some invalid arguments tests for GdipLoadImageFromStream()
by Nikolay Sivov
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/gdiplus/tests/image.c | 32 ++++++++++++++++++++++++++++++++
1 file changed, 32 insertions(+)
diff --git a/dlls/gdiplus/tests/image.c b/dlls/gdiplus/tests/image.c
index 28f0fcec93..34222e7ce0 100644
--- a/dlls/gdiplus/tests/image.c
+++ b/dlls/gdiplus/tests/image.c
@@ -5161,6 +5161,37 @@ static void test_png_color_formats(void)
}
}
+static void test_GdipLoadImageFromStream(void)
+{
+ IStream *stream;
+ GpStatus status;
+ GpImage *image;
+ HGLOBAL hglob;
+ BYTE *data;
+ HRESULT hr;
+
+ status = GdipLoadImageFromStream(NULL, NULL);
+ ok(status == InvalidParameter, "Unexected return value %d.\n", status);
+
+ image = (void *)0xdeadbeef;
+ status = GdipLoadImageFromStream(NULL, &image);
+ ok(status == InvalidParameter, "Unexected return value %d.\n", status);
+ ok(image == (void *)0xdeadbeef, "Unexpected image pointer.\n");
+
+ hglob = GlobalAlloc(0, sizeof(pngimage));
+ data = GlobalLock (hglob);
+ memcpy(data, pngimage, sizeof(pngimage));
+ GlobalUnlock(hglob);
+
+ hr = CreateStreamOnHGlobal(hglob, TRUE, &stream);
+ ok(hr == S_OK, "Failed to create a stream.\n");
+
+ status = GdipLoadImageFromStream(stream, NULL);
+ ok(status == InvalidParameter, "Unexpected return value %d.\n", status);
+
+ IStream_Release(stream);
+}
+
START_TEST(image)
{
HMODULE mod = GetModuleHandleA("gdiplus.dll");
@@ -5234,6 +5265,7 @@ START_TEST(image)
test_getadjustedpalette();
test_histogram();
test_imageabort();
+ test_GdipLoadImageFromStream();
GdiplusShutdown(gdiplusToken);
}
--
2.16.1
Feb. 28, 2018