[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