[PATCH 4/6] wined3d: Set an array of rendertarget views as a single CS operation.
Henri Verbeet
hverbeet at gmail.com
Thu Jul 8 08:32:02 CDT 2021
On Thu, 8 Jul 2021 at 01:13, Zebediah Figura <zfigura at codeweavers.com> wrote:
> @@ -1068,6 +1068,7 @@ static void STDMETHODCALLTYPE d3d11_device_context_OMSetRenderTargets(ID3D11Devi
> UINT render_target_view_count, ID3D11RenderTargetView *const *render_target_views,
> ID3D11DepthStencilView *depth_stencil_view)
> {
> + struct wined3d_rendertarget_view *wined3d_rtvs[D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT] = {0};
> struct d3d11_device_context *context = impl_from_ID3D11DeviceContext1(iface);
> struct d3d_depthstencil_view *dsv;
> unsigned int i;
> @@ -1075,19 +1076,18 @@ static void STDMETHODCALLTYPE d3d11_device_context_OMSetRenderTargets(ID3D11Devi
> TRACE("iface %p, render_target_view_count %u, render_target_views %p, depth_stencil_view %p.\n",
> iface, render_target_view_count, render_target_views, depth_stencil_view);
>
> - wined3d_mutex_lock();
> for (i = 0; i < render_target_view_count; ++i)
> {
> struct d3d_rendertarget_view *rtv = unsafe_impl_from_ID3D11RenderTargetView(render_target_views[i]);
> - wined3d_device_context_set_rendertarget_view(context->wined3d_context, i,
> - rtv ? rtv->wined3d_view : NULL, FALSE);
> - }
> - for (; i < D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT; ++i)
> - {
> - wined3d_device_context_set_rendertarget_view(context->wined3d_context, i, NULL, FALSE);
> +
> + wined3d_rtvs[i] = rtv ? rtv->wined3d_view : NULL;
> }
>
> dsv = unsafe_impl_from_ID3D11DepthStencilView(depth_stencil_view);
> +
> + wined3d_mutex_lock();
> + wined3d_device_context_set_rendertarget_views(context->wined3d_context, 0,
> + ARRAY_SIZE(wined3d_rtvs), wined3d_rtvs, FALSE);
> wined3d_device_context_set_depth_stencil_view(context->wined3d_context, dsv ? dsv->wined3d_view : NULL);
> wined3d_mutex_unlock();
> }
Like 1/6 and 3/6.
> - /* Release after the assignment, to prevent device_resource_released()
> - * from seeing the surface as still in use. */
> - 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];
>
> - wined3d_device_context_unbind_srv_for_rtv(context, view, FALSE);
> + if (view)
> + {
> + wined3d_rendertarget_view_incref(view);
> + wined3d_rtv_bind_count_inc(view);
> + }
> + state->fb.render_targets[start_idx + i] = view;
> + /* Release after the assignment, to prevent device_resource_released()
> + * from seeing the surface as still in use. */
Since we're touching it, "resource" instead of "surface", these days.
More information about the wine-devel
mailing list