On Thu, 8 Jul 2021 at 01:13, Zebediah Figura <zfigura(a)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.