Commit 198042e1 authored by Henri Verbeet's avatar Henri Verbeet Committed by Alexandre Julliard

wined3d: Require a valid rectangle pointer if rect_count is non-zero in…

wined3d: Require a valid rectangle pointer if rect_count is non-zero in device_clear_render_targets(). Signed-off-by: 's avatarHenri Verbeet <hverbeet@codeweavers.com> Signed-off-by: 's avatarAlexandre Julliard <julliard@winehq.org>
parent cb9704a9
...@@ -1332,6 +1332,12 @@ static HRESULT WINAPI d3d8_device_Clear(IDirect3DDevice8 *iface, DWORD rect_coun ...@@ -1332,6 +1332,12 @@ static HRESULT WINAPI d3d8_device_Clear(IDirect3DDevice8 *iface, DWORD rect_coun
TRACE("iface %p, rect_count %u, rects %p, flags %#x, color 0x%08x, z %.8e, stencil %u.\n", TRACE("iface %p, rect_count %u, rects %p, flags %#x, color 0x%08x, z %.8e, stencil %u.\n",
iface, rect_count, rects, flags, color, z, stencil); iface, rect_count, rects, flags, color, z, stencil);
if (rect_count && !rects)
{
WARN("count %u with NULL rects.\n", rect_count);
rect_count = 0;
}
wined3d_mutex_lock(); wined3d_mutex_lock();
hr = wined3d_device_clear(device->wined3d_device, rect_count, (const RECT *)rects, flags, &c, z, stencil); hr = wined3d_device_clear(device->wined3d_device, rect_count, (const RECT *)rects, flags, &c, z, stencil);
wined3d_mutex_unlock(); wined3d_mutex_unlock();
......
...@@ -1660,6 +1660,12 @@ static HRESULT WINAPI d3d9_device_Clear(IDirect3DDevice9Ex *iface, DWORD rect_co ...@@ -1660,6 +1660,12 @@ static HRESULT WINAPI d3d9_device_Clear(IDirect3DDevice9Ex *iface, DWORD rect_co
TRACE("iface %p, rect_count %u, rects %p, flags %#x, color 0x%08x, z %.8e, stencil %u.\n", TRACE("iface %p, rect_count %u, rects %p, flags %#x, color 0x%08x, z %.8e, stencil %u.\n",
iface, rect_count, rects, flags, color, z, stencil); iface, rect_count, rects, flags, color, z, stencil);
if (rect_count && !rects)
{
WARN("count %u with NULL rects.\n", rect_count);
rect_count = 0;
}
wined3d_mutex_lock(); wined3d_mutex_lock();
hr = wined3d_device_clear(device->wined3d_device, rect_count, (const RECT *)rects, flags, &c, z, stencil); hr = wined3d_device_clear(device->wined3d_device, rect_count, (const RECT *)rects, flags, &c, z, stencil);
wined3d_mutex_unlock(); wined3d_mutex_unlock();
......
...@@ -5157,6 +5157,12 @@ static HRESULT d3d_device7_Clear(IDirect3DDevice7 *iface, DWORD count, ...@@ -5157,6 +5157,12 @@ static HRESULT d3d_device7_Clear(IDirect3DDevice7 *iface, DWORD count,
TRACE("iface %p, count %u, rects %p, flags %#x, color 0x%08x, z %.8e, stencil %#x.\n", TRACE("iface %p, count %u, rects %p, flags %#x, color 0x%08x, z %.8e, stencil %#x.\n",
iface, count, rects, flags, color, z, stencil); iface, count, rects, flags, color, z, stencil);
if (count && !rects)
{
WARN("count %u with NULL rects.\n", count);
count = 0;
}
wined3d_mutex_lock(); wined3d_mutex_lock();
hr = wined3d_device_clear(This->wined3d_device, count, (RECT *)rects, flags, &c, z, stencil); hr = wined3d_device_clear(This->wined3d_device, count, (RECT *)rects, flags, &c, z, stencil);
wined3d_mutex_unlock(); wined3d_mutex_unlock();
......
...@@ -263,7 +263,7 @@ static void prepare_ds_clear(struct wined3d_surface *ds, struct wined3d_context ...@@ -263,7 +263,7 @@ static void prepare_ds_clear(struct wined3d_surface *ds, struct wined3d_context
{ {
/* draw_rect ⊇ current_rect, test if we're doing a full clear. */ /* draw_rect ⊇ current_rect, test if we're doing a full clear. */
if (!clear_rect) if (!rect_count)
{ {
/* Full clear, modify only. */ /* Full clear, modify only. */
*out_rect = *draw_rect; *out_rect = *draw_rect;
...@@ -285,13 +285,12 @@ static void prepare_ds_clear(struct wined3d_surface *ds, struct wined3d_context ...@@ -285,13 +285,12 @@ static void prepare_ds_clear(struct wined3d_surface *ds, struct wined3d_context
} }
void device_clear_render_targets(struct wined3d_device *device, UINT rt_count, const struct wined3d_fb_state *fb, void device_clear_render_targets(struct wined3d_device *device, UINT rt_count, const struct wined3d_fb_state *fb,
UINT rect_count, const RECT *rects, const RECT *draw_rect, DWORD flags, const struct wined3d_color *color, UINT rect_count, const RECT *clear_rect, const RECT *draw_rect, DWORD flags, const struct wined3d_color *color,
float depth, DWORD stencil) float depth, DWORD stencil)
{ {
struct wined3d_surface *target = rt_count ? wined3d_rendertarget_view_get_surface(fb->render_targets[0]) : NULL; struct wined3d_surface *target = rt_count ? wined3d_rendertarget_view_get_surface(fb->render_targets[0]) : NULL;
struct wined3d_surface *depth_stencil = fb->depth_stencil struct wined3d_surface *depth_stencil = fb->depth_stencil
? wined3d_rendertarget_view_get_surface(fb->depth_stencil) : NULL; ? wined3d_rendertarget_view_get_surface(fb->depth_stencil) : NULL;
const RECT *clear_rect = (rect_count > 0 && rects) ? (const RECT *)rects : NULL;
const struct wined3d_gl_info *gl_info; const struct wined3d_gl_info *gl_info;
UINT drawable_width, drawable_height; UINT drawable_width, drawable_height;
struct wined3d_color corrected_color; struct wined3d_color corrected_color;
...@@ -325,7 +324,7 @@ void device_clear_render_targets(struct wined3d_device *device, UINT rt_count, c ...@@ -325,7 +324,7 @@ void device_clear_render_targets(struct wined3d_device *device, UINT rt_count, c
if (rt && rtv->format->id != WINED3DFMT_NULL) if (rt && rtv->format->id != WINED3DFMT_NULL)
{ {
if (flags & WINED3DCLEAR_TARGET && !is_full_clear(target, draw_rect, clear_rect)) if (flags & WINED3DCLEAR_TARGET && !is_full_clear(target, draw_rect, rect_count ? clear_rect : NULL))
surface_load_location(rt, context, rtv->resource->draw_binding); surface_load_location(rt, context, rtv->resource->draw_binding);
else else
wined3d_surface_prepare(rt, context, rtv->resource->draw_binding); wined3d_surface_prepare(rt, context, rtv->resource->draw_binding);
...@@ -440,7 +439,7 @@ void device_clear_render_targets(struct wined3d_device *device, UINT rt_count, c ...@@ -440,7 +439,7 @@ void device_clear_render_targets(struct wined3d_device *device, UINT rt_count, c
clear_mask = clear_mask | GL_COLOR_BUFFER_BIT; clear_mask = clear_mask | GL_COLOR_BUFFER_BIT;
} }
if (!clear_rect) if (!rect_count)
{ {
if (render_offscreen) if (render_offscreen)
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment