[PATCH v2 4/6] wined3d: Set an array of rendertarget views as a single CS operation.
Henri Verbeet
hverbeet at gmail.com
Mon Jul 12 09:39:40 CDT 2021
On Fri, 9 Jul 2021 at 00:19, Zebediah Figura <zfigura at codeweavers.com> wrote:
> - if (prev)
> - {
> - wined3d_rtv_bind_count_dec(prev);
> - wined3d_rendertarget_view_decref(prev);
> + struct wined3d_rendertarget_view *prev = state->fb.render_targets[start_idx + i];
> + struct wined3d_rendertarget_view *view = views[i];
> +
> + if (view && !(view->resource->bind_flags & WINED3D_BIND_RENDER_TARGET))
> + {
> + WARN("View resource %p doesn't have render target bind flags.\n", views[i]->resource);
> + hr = WINED3DERR_INVALIDCALL;
> + continue;
> + }
> +
That mostly works, but you'd also need to skip the view in
wined3d_cs_exec_set_rendertarget_views(). Specifically, if you don't,
the command stream may store a pointer to the view, without us having
a reference to it, and a subsequent
wined3d_cs_exec_set_rendertarget_views() call may dereference an
already freed "prev" pointer.
More information about the wine-devel
mailing list