Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/wined3d/cs.c | 9 +++++---- dlls/wined3d/device.c | 5 +++-- dlls/wined3d/wined3d_private.h | 6 +++--- 3 files changed, 11 insertions(+), 9 deletions(-)
diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c index 8afa298b905..dbc242f1ba0 100644 --- a/dlls/wined3d/cs.c +++ b/dlls/wined3d/cs.c @@ -1579,19 +1579,20 @@ static void wined3d_cs_exec_set_unordered_access_view(struct wined3d_cs *cs, con device_invalidate_state(cs->c.device, STATE_UNORDERED_ACCESS_VIEW_BINDING(op->pipeline)); }
-void wined3d_cs_emit_set_unordered_access_view(struct wined3d_cs *cs, enum wined3d_pipeline pipeline, - unsigned int view_idx, struct wined3d_unordered_access_view *view, unsigned int initial_count) +void wined3d_device_context_emit_set_unordered_access_view(struct wined3d_device_context *context, + enum wined3d_pipeline pipeline, unsigned int view_idx, struct wined3d_unordered_access_view *view, + unsigned int initial_count) { struct wined3d_cs_set_unordered_access_view *op;
- op = wined3d_device_context_require_space(&cs->c, sizeof(*op), WINED3D_CS_QUEUE_DEFAULT); + op = wined3d_device_context_require_space(context, sizeof(*op), WINED3D_CS_QUEUE_DEFAULT); op->opcode = WINED3D_CS_OP_SET_UNORDERED_ACCESS_VIEW; op->pipeline = pipeline; op->view_idx = view_idx; op->view = view; op->initial_count = initial_count;
- wined3d_device_context_submit(&cs->c, WINED3D_CS_QUEUE_DEFAULT); + wined3d_device_context_submit(context, WINED3D_CS_QUEUE_DEFAULT); }
static void wined3d_cs_exec_set_sampler(struct wined3d_cs *cs, const void *data) diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index c4700d2dc65..14a68b4f3b1 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -1915,7 +1915,8 @@ void CDECL wined3d_device_set_state(struct wined3d_device *device, struct wined3 { for (j = 0; j < MAX_UNORDERED_ACCESS_VIEWS; ++j) { - wined3d_cs_emit_set_unordered_access_view(device->cs, i, j, state->unordered_access_view[i][j], ~0); + wined3d_device_context_emit_set_unordered_access_view(context, i, j, + state->unordered_access_view[i][j], ~0); } }
@@ -2697,7 +2698,7 @@ static void wined3d_device_set_pipeline_unordered_access_view(struct wined3d_dev if (uav) wined3d_unordered_access_view_incref(uav); state->unordered_access_view[pipeline][idx] = uav; - wined3d_cs_emit_set_unordered_access_view(device->cs, pipeline, idx, uav, initial_count); + wined3d_device_context_emit_set_unordered_access_view(&device->cs->c, pipeline, idx, uav, initial_count); if (prev) wined3d_unordered_access_view_decref(prev); } diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 19ef894021b..781d21a91c2 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -4783,9 +4783,6 @@ void wined3d_cs_emit_set_texture_state(struct wined3d_cs *cs, UINT stage, enum wined3d_texture_stage_state state, DWORD value) DECLSPEC_HIDDEN; void wined3d_cs_emit_set_transform(struct wined3d_cs *cs, enum wined3d_transform_state state, const struct wined3d_matrix *matrix) DECLSPEC_HIDDEN; -void wined3d_cs_emit_set_unordered_access_view(struct wined3d_cs *cs, enum wined3d_pipeline pipeline, - unsigned int view_idx, struct wined3d_unordered_access_view *view, - unsigned int initial_count) DECLSPEC_HIDDEN; void wined3d_cs_emit_set_vertex_declaration(struct wined3d_cs *cs, struct wined3d_vertex_declaration *declaration) DECLSPEC_HIDDEN; void wined3d_cs_emit_unload_resource(struct wined3d_cs *cs, struct wined3d_resource *resource) DECLSPEC_HIDDEN; @@ -4828,6 +4825,9 @@ void wined3d_device_context_emit_set_shader(struct wined3d_device_context *conte void wined3d_device_context_emit_set_shader_resource_view(struct wined3d_device_context *context, enum wined3d_shader_type type, unsigned int view_idx, struct wined3d_shader_resource_view *view) DECLSPEC_HIDDEN; +void wined3d_device_context_emit_set_unordered_access_view(struct wined3d_device_context *context, + enum wined3d_pipeline pipeline, unsigned int view_idx, struct wined3d_unordered_access_view *view, + unsigned int initial_count) DECLSPEC_HIDDEN; void wined3d_device_context_emit_set_viewports(struct wined3d_device_context *context, unsigned int viewport_count, const struct wined3d_viewport *viewports) DECLSPEC_HIDDEN;
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/wined3d/device.c | 56 ++++++++++++++++++---------------- dlls/wined3d/wined3d.spec | 1 + dlls/wined3d/wined3d_private.h | 7 ----- include/wine/wined3d.h | 10 ++++++ 4 files changed, 40 insertions(+), 34 deletions(-)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index 14a68b4f3b1..d8073ef52f0 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -2257,6 +2257,33 @@ void CDECL wined3d_device_context_set_sampler(struct wined3d_device_context *con wined3d_sampler_decref(prev); }
+void CDECL wined3d_device_context_set_unordered_access_view(struct wined3d_device_context *context, + enum wined3d_pipeline pipeline, unsigned int idx, struct wined3d_unordered_access_view *uav, + unsigned int initial_count) +{ + struct wined3d_state *state = context->state; + struct wined3d_unordered_access_view *prev; + + TRACE("context %p, pipeline %#x, idx %u, uav %p, initial_count %u.\n", context, pipeline, idx, uav, initial_count); + + if (idx >= MAX_UNORDERED_ACCESS_VIEWS) + { + WARN("Invalid UAV index %u.\n", idx); + return; + } + + prev = state->unordered_access_view[pipeline][idx]; + if (uav == prev && initial_count == ~0u) + return; + + if (uav) + wined3d_unordered_access_view_incref(uav); + state->unordered_access_view[pipeline][idx] = uav; + wined3d_device_context_emit_set_unordered_access_view(context, pipeline, idx, uav, initial_count); + if (prev) + wined3d_unordered_access_view_decref(prev); +} + void CDECL wined3d_device_set_vertex_shader(struct wined3d_device *device, struct wined3d_shader *shader) { TRACE("device %p, shader %p.\n", device, shader); @@ -2678,31 +2705,6 @@ struct wined3d_sampler * CDECL wined3d_device_get_cs_sampler(const struct wined3 return wined3d_device_get_sampler(device, WINED3D_SHADER_TYPE_COMPUTE, idx); }
-static void wined3d_device_set_pipeline_unordered_access_view(struct wined3d_device *device, - enum wined3d_pipeline pipeline, unsigned int idx, struct wined3d_unordered_access_view *uav, - unsigned int initial_count) -{ - struct wined3d_state *state = device->cs->c.state; - struct wined3d_unordered_access_view *prev; - - if (idx >= MAX_UNORDERED_ACCESS_VIEWS) - { - WARN("Invalid UAV index %u.\n", idx); - return; - } - - prev = state->unordered_access_view[pipeline][idx]; - if (uav == prev && initial_count == ~0u) - return; - - if (uav) - wined3d_unordered_access_view_incref(uav); - state->unordered_access_view[pipeline][idx] = uav; - wined3d_device_context_emit_set_unordered_access_view(&device->cs->c, pipeline, idx, uav, initial_count); - if (prev) - wined3d_unordered_access_view_decref(prev); -} - static struct wined3d_unordered_access_view *wined3d_device_get_pipeline_unordered_access_view( const struct wined3d_device *device, enum wined3d_pipeline pipeline, unsigned int idx) { @@ -2720,7 +2722,7 @@ void CDECL wined3d_device_set_cs_uav(struct wined3d_device *device, unsigned int { TRACE("device %p, idx %u, uav %p, initial_count %#x.\n", device, idx, uav, initial_count);
- wined3d_device_set_pipeline_unordered_access_view(device, WINED3D_PIPELINE_COMPUTE, idx, uav, initial_count); + wined3d_device_context_set_unordered_access_view(&device->cs->c, WINED3D_PIPELINE_COMPUTE, idx, uav, initial_count); }
struct wined3d_unordered_access_view * CDECL wined3d_device_get_cs_uav(const struct wined3d_device *device, @@ -2736,7 +2738,7 @@ void CDECL wined3d_device_set_unordered_access_view(struct wined3d_device *devic { TRACE("device %p, idx %u, uav %p, initial_count %#x.\n", device, idx, uav, initial_count);
- wined3d_device_set_pipeline_unordered_access_view(device, WINED3D_PIPELINE_GRAPHICS, idx, uav, initial_count); + wined3d_device_context_set_unordered_access_view(&device->cs->c, WINED3D_PIPELINE_GRAPHICS, idx, uav, initial_count); }
struct wined3d_unordered_access_view * CDECL wined3d_device_get_unordered_access_view( diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec index 7c39295c256..9655c1a65f2 100644 --- a/dlls/wined3d/wined3d.spec +++ b/dlls/wined3d/wined3d.spec @@ -174,6 +174,7 @@ @ cdecl wined3d_device_context_set_scissor_rects(ptr long ptr) @ cdecl wined3d_device_context_set_shader(ptr long ptr) @ cdecl wined3d_device_context_set_shader_resource_view(ptr long long ptr) +@ cdecl wined3d_device_context_set_unordered_access_view(ptr long long ptr long) @ cdecl wined3d_device_context_set_viewports(ptr long ptr)
@ cdecl wined3d_output_find_closest_matching_mode(ptr ptr) diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 781d21a91c2..6f413ae472f 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -1730,13 +1730,6 @@ void dispatch_compute(struct wined3d_device *device, const struct wined3d_state #define GET_TEXCOORD_SIZE_FROM_FVF(d3dvtVertexType, tex_num) \ (((((d3dvtVertexType) >> (16 + (2 * (tex_num)))) + 1) & 0x03) + 1)
-enum wined3d_pipeline -{ - WINED3D_PIPELINE_GRAPHICS, - WINED3D_PIPELINE_COMPUTE, - WINED3D_PIPELINE_COUNT, -}; - /* Routines and structures related to state management */
#define STATE_RENDER(a) (a) diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index 760e1ebcc80..38b4d8d792d 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -868,6 +868,13 @@ enum wined3d_shader_type WINED3D_SHADER_TYPE_INVALID = WINED3D_SHADER_TYPE_COUNT, };
+enum wined3d_pipeline +{ + WINED3D_PIPELINE_GRAPHICS, + WINED3D_PIPELINE_COMPUTE, + WINED3D_PIPELINE_COUNT, +}; + #define WINED3DCOLORWRITEENABLE_RED (1u << 0) #define WINED3DCOLORWRITEENABLE_GREEN (1u << 1) #define WINED3DCOLORWRITEENABLE_BLUE (1u << 2) @@ -2564,6 +2571,9 @@ void __cdecl wined3d_device_context_set_shader(struct wined3d_device_context *co enum wined3d_shader_type type, struct wined3d_shader *shader); void __cdecl wined3d_device_context_set_shader_resource_view(struct wined3d_device_context *context, enum wined3d_shader_type type, unsigned int idx, struct wined3d_shader_resource_view *view); +void __cdecl wined3d_device_context_set_unordered_access_view(struct wined3d_device_context *context, + enum wined3d_pipeline pipeline, unsigned int idx, struct wined3d_unordered_access_view *uav, + unsigned int initial_count); void __cdecl wined3d_device_context_set_viewports(struct wined3d_device_context *context, unsigned int viewport_count, const struct wined3d_viewport *viewports);
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/d3d11/device.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-)
diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c index 7dc6f441185..0ceae50ce4c 100644 --- a/dlls/d3d11/device.c +++ b/dlls/d3d11/device.c @@ -963,7 +963,7 @@ static void STDMETHODCALLTYPE d3d11_immediate_context_OMSetRenderTargetsAndUnord UINT unordered_access_view_start_slot, UINT unordered_access_view_count, ID3D11UnorderedAccessView *const *unordered_access_views, const UINT *initial_counts) { - struct d3d_device *device = device_from_immediate_ID3D11DeviceContext1(iface); + struct d3d11_immediate_context *context = impl_from_ID3D11DeviceContext1(iface); unsigned int i;
TRACE("iface %p, render_target_view_count %u, render_target_views %p, depth_stencil_view %p, " @@ -984,21 +984,22 @@ static void STDMETHODCALLTYPE d3d11_immediate_context_OMSetRenderTargetsAndUnord wined3d_mutex_lock(); for (i = 0; i < unordered_access_view_start_slot; ++i) { - wined3d_device_set_unordered_access_view(device->wined3d_device, i, NULL, ~0u); + wined3d_device_context_set_unordered_access_view(context->wined3d_context, + WINED3D_PIPELINE_GRAPHICS, i, NULL, ~0u); } for (i = 0; i < unordered_access_view_count; ++i) { struct d3d11_unordered_access_view *view = unsafe_impl_from_ID3D11UnorderedAccessView(unordered_access_views[i]);
- wined3d_device_set_unordered_access_view(device->wined3d_device, - unordered_access_view_start_slot + i, + wined3d_device_context_set_unordered_access_view(context->wined3d_context, + WINED3D_PIPELINE_GRAPHICS, unordered_access_view_start_slot + i, view ? view->wined3d_view : NULL, initial_counts ? initial_counts[i] : ~0u); } for (; unordered_access_view_start_slot + i < D3D11_PS_CS_UAV_REGISTER_COUNT; ++i) { - wined3d_device_set_unordered_access_view(device->wined3d_device, - unordered_access_view_start_slot + i, NULL, ~0u); + wined3d_device_context_set_unordered_access_view(context->wined3d_context, + WINED3D_PIPELINE_GRAPHICS, unordered_access_view_start_slot + i, NULL, ~0u); } wined3d_mutex_unlock(); } @@ -2621,10 +2622,10 @@ static void STDMETHODCALLTYPE d3d11_immediate_context_ClearState(ID3D11DeviceCon wined3d_device_set_rendertarget_view(device->wined3d_device, i, NULL, FALSE); } wined3d_device_set_depth_stencil_view(device->wined3d_device, NULL); - for (i = 0; i < D3D11_PS_CS_UAV_REGISTER_COUNT; ++i) + for (i = 0; i < WINED3D_PIPELINE_COUNT; ++i) { - wined3d_device_set_unordered_access_view(device->wined3d_device, i, NULL, ~0u); - wined3d_device_set_cs_uav(device->wined3d_device, i, NULL, ~0u); + for (j = 0; j < D3D11_PS_CS_UAV_REGISTER_COUNT; ++j) + wined3d_device_context_set_unordered_access_view(context->wined3d_context, i, j, NULL, ~0u); } ID3D11DeviceContext1_OMSetDepthStencilState(iface, NULL, 0); ID3D11DeviceContext1_OMSetBlendState(iface, NULL, blend_factor, D3D11_DEFAULT_SAMPLE_MASK);
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com
On Thu, 18 Mar 2021 at 01:45, Zebediah Figura z.figura12@gmail.com wrote:
@@ -2621,10 +2622,10 @@ static void STDMETHODCALLTYPE d3d11_immediate_context_ClearState(ID3D11DeviceCon wined3d_device_set_rendertarget_view(device->wined3d_device, i, NULL, FALSE); } wined3d_device_set_depth_stencil_view(device->wined3d_device, NULL);
- for (i = 0; i < D3D11_PS_CS_UAV_REGISTER_COUNT; ++i)
- for (i = 0; i < WINED3D_PIPELINE_COUNT; ++i) {
wined3d_device_set_unordered_access_view(device->wined3d_device, i, NULL, ~0u);
wined3d_device_set_cs_uav(device->wined3d_device, i, NULL, ~0u);
for (j = 0; j < D3D11_PS_CS_UAV_REGISTER_COUNT; ++j)
wined3d_device_context_set_unordered_access_view(context->wined3d_context, i, j, NULL, ~0u);
Note that there's another instance of wined3d_device_set_cs_uav() in d3d11_immediate_context_CSSetUnorderedAccessViews().
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/wined3d/cs.c | 6 +++--- dlls/wined3d/device.c | 4 ++-- dlls/wined3d/wined3d_private.h | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c index dbc242f1ba0..4dbf95cc9f7 100644 --- a/dlls/wined3d/cs.c +++ b/dlls/wined3d/cs.c @@ -1203,17 +1203,17 @@ static void wined3d_cs_exec_set_rendertarget_view(struct wined3d_cs *cs, const v device_invalidate_state(cs->c.device, STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL)); }
-void wined3d_cs_emit_set_rendertarget_view(struct wined3d_cs *cs, unsigned int view_idx, +void wined3d_device_context_emit_set_rendertarget_view(struct wined3d_device_context *context, unsigned int view_idx, struct wined3d_rendertarget_view *view) { struct wined3d_cs_set_rendertarget_view *op;
- op = wined3d_device_context_require_space(&cs->c, sizeof(*op), WINED3D_CS_QUEUE_DEFAULT); + op = wined3d_device_context_require_space(context, sizeof(*op), WINED3D_CS_QUEUE_DEFAULT); op->opcode = WINED3D_CS_OP_SET_RENDERTARGET_VIEW; op->view_idx = view_idx; op->view = view;
- wined3d_device_context_submit(&cs->c, WINED3D_CS_QUEUE_DEFAULT); + wined3d_device_context_submit(context, WINED3D_CS_QUEUE_DEFAULT); }
static void wined3d_cs_exec_set_depth_stencil_view(struct wined3d_cs *cs, const void *data) diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index d8073ef52f0..382e72055a4 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -1874,7 +1874,7 @@ void CDECL wined3d_device_set_state(struct wined3d_device *device, struct wined3
for (i = 0; i < WINED3D_MAX_RENDER_TARGETS; ++i) { - wined3d_cs_emit_set_rendertarget_view(device->cs, i, state->fb.render_targets[i]); + wined3d_device_context_emit_set_rendertarget_view(context, i, state->fb.render_targets[i]); }
wined3d_cs_emit_set_depth_stencil_view(device->cs, state->fb.depth_stencil); @@ -5246,7 +5246,7 @@ HRESULT CDECL wined3d_device_set_rendertarget_view(struct wined3d_device *device wined3d_rtv_bind_count_inc(view); } state->fb.render_targets[view_idx] = view; - wined3d_cs_emit_set_rendertarget_view(device->cs, view_idx, view); + wined3d_device_context_emit_set_rendertarget_view(&device->cs->c, view_idx, view); /* Release after the assignment, to prevent device_resource_released() * from seeing the surface as still in use. */ if (prev) diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 6f413ae472f..8f500475751 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -4761,8 +4761,6 @@ void wined3d_cs_emit_set_predication(struct wined3d_cs *cs, struct wined3d_query *predicate, BOOL value) DECLSPEC_HIDDEN; void wined3d_cs_emit_set_render_state(struct wined3d_cs *cs, enum wined3d_render_state state, DWORD value) DECLSPEC_HIDDEN; -void wined3d_cs_emit_set_rendertarget_view(struct wined3d_cs *cs, unsigned int view_idx, - struct wined3d_rendertarget_view *view) DECLSPEC_HIDDEN; void wined3d_cs_emit_set_sampler_state(struct wined3d_cs *cs, UINT sampler_idx, enum wined3d_sampler_state state, DWORD value) DECLSPEC_HIDDEN; void wined3d_cs_emit_set_stream_output(struct wined3d_cs *cs, UINT stream_idx, @@ -4809,6 +4807,8 @@ void wined3d_device_context_emit_set_depth_stencil_state(struct wined3d_device_c struct wined3d_depth_stencil_state *state, unsigned int stencil_ref) DECLSPEC_HIDDEN; void wined3d_device_context_emit_set_rasterizer_state(struct wined3d_device_context *context, struct wined3d_rasterizer_state *rasterizer_state) DECLSPEC_HIDDEN; +void wined3d_device_context_emit_set_rendertarget_view(struct wined3d_device_context *context, unsigned int view_idx, + struct wined3d_rendertarget_view *view) DECLSPEC_HIDDEN; void wined3d_device_context_emit_set_sampler(struct wined3d_device_context *context, enum wined3d_shader_type type, unsigned int sampler_idx, struct wined3d_sampler *sampler) DECLSPEC_HIDDEN; void wined3d_device_context_emit_set_scissor_rects(struct wined3d_device_context *context,
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/wined3d/device.c | 171 ++++++++++++++++++++------------------ dlls/wined3d/wined3d.spec | 1 + include/wine/wined3d.h | 2 + 3 files changed, 93 insertions(+), 81 deletions(-)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index 382e72055a4..e7b57a34595 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -2284,6 +2284,94 @@ void CDECL wined3d_device_context_set_unordered_access_view(struct wined3d_devic wined3d_unordered_access_view_decref(prev); }
+static void wined3d_device_context_unbind_srv_for_rtv(struct wined3d_device_context *context, + const struct wined3d_rendertarget_view *view, BOOL dsv) +{ + struct wined3d_state *state = context->state; + + if (view && wined3d_is_rtv_srv_bound(view)) + { + const struct wined3d_resource *resource = view->resource; + const struct wined3d_shader_resource_view *srv; + unsigned int i, j; + + WARN("Application sets bound resource as render target.\n"); + + for (i = 0; i < WINED3D_SHADER_TYPE_COUNT; ++i) + for (j = 0; j < MAX_SHADER_RESOURCE_VIEWS; ++j) + if ((srv = state->shader_resource_view[i][j]) && srv->resource == resource + && ((!dsv && wined3d_is_srv_rtv_bound(srv)) + || (dsv && wined3d_dsv_srv_conflict(view, srv->format)))) + wined3d_device_context_set_shader_resource_view(context, i, j, NULL); + } +} + +HRESULT CDECL wined3d_device_context_set_rendertarget_view(struct wined3d_device_context *context, + unsigned int view_idx, struct wined3d_rendertarget_view *view, BOOL set_viewport) +{ + struct wined3d_state *state = context->state; + struct wined3d_rendertarget_view *prev; + unsigned int max_rt_count; + + TRACE("context %p, view_idx %u, view %p, set_viewport %#x.\n", + context, view_idx, view, set_viewport); + + max_rt_count = context->device->adapter->d3d_info.limits.max_rt_count; + if (view_idx >= max_rt_count) + { + WARN("Only %u render targets are supported.\n", max_rt_count); + return WINED3DERR_INVALIDCALL; + } + + if (view && !(view->resource->bind_flags & WINED3D_BIND_RENDER_TARGET)) + { + WARN("View resource %p doesn't have render target bind flags.\n", view->resource); + return WINED3DERR_INVALIDCALL; + } + + /* Set the viewport and scissor rectangles, if requested. Tests show that + * stateblock recording is ignored, the change goes directly into the + * primary stateblock. */ + if (!view_idx && set_viewport) + { + state->viewports[0].x = 0; + state->viewports[0].y = 0; + state->viewports[0].width = view->width; + state->viewports[0].height = view->height; + state->viewports[0].min_z = 0.0f; + state->viewports[0].max_z = 1.0f; + state->viewport_count = 1; + wined3d_device_context_emit_set_viewports(context, 1, state->viewports); + + SetRect(&state->scissor_rects[0], 0, 0, view->width, view->height); + state->scissor_rect_count = 1; + wined3d_device_context_emit_set_scissor_rects(context, 1, state->scissor_rects); + } + + prev = state->fb.render_targets[view_idx]; + if (view == prev) + return WINED3D_OK; + + if (view) + { + wined3d_rendertarget_view_incref(view); + wined3d_rtv_bind_count_inc(view); + } + state->fb.render_targets[view_idx] = view; + wined3d_device_context_emit_set_rendertarget_view(context, view_idx, view); + /* 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); + } + + wined3d_device_context_unbind_srv_for_rtv(context, view, FALSE); + + return WINED3D_OK; +} + void CDECL wined3d_device_set_vertex_shader(struct wined3d_device *device, struct wined3d_shader *shader) { TRACE("device %p, shader %p.\n", device, shader); @@ -5172,92 +5260,13 @@ struct wined3d_rendertarget_view * CDECL wined3d_device_get_depth_stencil_view(c return device->cs->c.state->fb.depth_stencil; }
-static void wined3d_unbind_srv_for_rtv(struct wined3d_device *device, - const struct wined3d_rendertarget_view *view, BOOL dsv) -{ - struct wined3d_state *state = device->cs->c.state; - - if (view && wined3d_is_rtv_srv_bound(view)) - { - const struct wined3d_resource *resource = view->resource; - const struct wined3d_shader_resource_view *srv; - unsigned int i, j; - - WARN("Application sets bound resource as render target.\n"); - - for (i = 0; i < WINED3D_SHADER_TYPE_COUNT; ++i) - for (j = 0; j < MAX_SHADER_RESOURCE_VIEWS; ++j) - if ((srv = state->shader_resource_view[i][j]) && srv->resource == resource - && ((!dsv && wined3d_is_srv_rtv_bound(srv)) - || (dsv && wined3d_dsv_srv_conflict(view, srv->format)))) - wined3d_device_context_set_shader_resource_view(&device->cs->c, i, j, NULL); - } -} - HRESULT CDECL wined3d_device_set_rendertarget_view(struct wined3d_device *device, unsigned int view_idx, struct wined3d_rendertarget_view *view, BOOL set_viewport) { - struct wined3d_state *state = device->cs->c.state; - struct wined3d_rendertarget_view *prev; - unsigned int max_rt_count; - TRACE("device %p, view_idx %u, view %p, set_viewport %#x.\n", device, view_idx, view, set_viewport);
- max_rt_count = device->adapter->d3d_info.limits.max_rt_count; - if (view_idx >= max_rt_count) - { - WARN("Only %u render targets are supported.\n", max_rt_count); - return WINED3DERR_INVALIDCALL; - } - - if (view && !(view->resource->bind_flags & WINED3D_BIND_RENDER_TARGET)) - { - WARN("View resource %p doesn't have render target bind flags.\n", view->resource); - return WINED3DERR_INVALIDCALL; - } - - /* Set the viewport and scissor rectangles, if requested. Tests show that - * stateblock recording is ignored, the change goes directly into the - * primary stateblock. */ - if (!view_idx && set_viewport) - { - state->viewports[0].x = 0; - state->viewports[0].y = 0; - state->viewports[0].width = view->width; - state->viewports[0].height = view->height; - state->viewports[0].min_z = 0.0f; - state->viewports[0].max_z = 1.0f; - state->viewport_count = 1; - wined3d_device_context_emit_set_viewports(&device->cs->c, 1, state->viewports); - - SetRect(&state->scissor_rects[0], 0, 0, view->width, view->height); - state->scissor_rect_count = 1; - wined3d_device_context_emit_set_scissor_rects(&device->cs->c, 1, state->scissor_rects); - } - - prev = state->fb.render_targets[view_idx]; - if (view == prev) - return WINED3D_OK; - - if (view) - { - wined3d_rendertarget_view_incref(view); - wined3d_rtv_bind_count_inc(view); - } - state->fb.render_targets[view_idx] = view; - wined3d_device_context_emit_set_rendertarget_view(&device->cs->c, view_idx, view); - /* 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); - } - - wined3d_unbind_srv_for_rtv(device, view, FALSE); - - return WINED3D_OK; + return wined3d_device_context_set_rendertarget_view(&device->cs->c, view_idx, view, set_viewport); }
HRESULT CDECL wined3d_device_set_depth_stencil_view(struct wined3d_device *device, @@ -5287,7 +5296,7 @@ HRESULT CDECL wined3d_device_set_depth_stencil_view(struct wined3d_device *devic wined3d_cs_emit_set_depth_stencil_view(device->cs, view); if (prev) wined3d_rendertarget_view_decref(prev); - wined3d_unbind_srv_for_rtv(device, view, TRUE); + wined3d_device_context_unbind_srv_for_rtv(&device->cs->c, view, TRUE);
return WINED3D_OK; } diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec index 9655c1a65f2..ad66cef0f9c 100644 --- a/dlls/wined3d/wined3d.spec +++ b/dlls/wined3d/wined3d.spec @@ -170,6 +170,7 @@ @ cdecl wined3d_device_context_set_constant_buffer(ptr long long ptr) @ cdecl wined3d_device_context_set_depth_stencil_state(ptr ptr long) @ cdecl wined3d_device_context_set_rasterizer_state(ptr ptr) +@ cdecl wined3d_device_context_set_rendertarget_view(ptr long ptr long) @ cdecl wined3d_device_context_set_sampler(ptr long long ptr) @ cdecl wined3d_device_context_set_scissor_rects(ptr long ptr) @ cdecl wined3d_device_context_set_shader(ptr long ptr) diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index 38b4d8d792d..e066e688125 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -2563,6 +2563,8 @@ void __cdecl wined3d_device_context_set_depth_stencil_state(struct wined3d_devic struct wined3d_depth_stencil_state *depth_stencil_state, unsigned int stencil_ref); void __cdecl wined3d_device_context_set_rasterizer_state(struct wined3d_device_context *context, struct wined3d_rasterizer_state *rasterizer_state); +HRESULT __cdecl wined3d_device_context_set_rendertarget_view(struct wined3d_device_context *context, + unsigned int view_idx, struct wined3d_rendertarget_view *view, BOOL set_viewport); void __cdecl wined3d_device_context_set_sampler(struct wined3d_device_context *context, enum wined3d_shader_type type, unsigned int idx, struct wined3d_sampler *sampler); void __cdecl wined3d_device_context_set_scissor_rects(struct wined3d_device_context *context, unsigned int rect_count,
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/d3d11/device.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c index 0ceae50ce4c..cab5ebefcc2 100644 --- a/dlls/d3d11/device.c +++ b/dlls/d3d11/device.c @@ -934,6 +934,7 @@ static void STDMETHODCALLTYPE d3d11_immediate_context_OMSetRenderTargets(ID3D11D UINT render_target_view_count, ID3D11RenderTargetView *const *render_target_views, ID3D11DepthStencilView *depth_stencil_view) { + struct d3d11_immediate_context *context = impl_from_ID3D11DeviceContext1(iface); struct d3d_device *device = device_from_immediate_ID3D11DeviceContext1(iface); struct d3d_depthstencil_view *dsv; unsigned int i; @@ -945,11 +946,12 @@ static void STDMETHODCALLTYPE d3d11_immediate_context_OMSetRenderTargets(ID3D11D for (i = 0; i < render_target_view_count; ++i) { struct d3d_rendertarget_view *rtv = unsafe_impl_from_ID3D11RenderTargetView(render_target_views[i]); - wined3d_device_set_rendertarget_view(device->wined3d_device, i, rtv ? rtv->wined3d_view : NULL, FALSE); + 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_set_rendertarget_view(device->wined3d_device, i, NULL, FALSE); + wined3d_device_context_set_rendertarget_view(context->wined3d_context, i, NULL, FALSE); }
dsv = unsafe_impl_from_ID3D11DepthStencilView(depth_stencil_view); @@ -2619,7 +2621,7 @@ static void STDMETHODCALLTYPE d3d11_immediate_context_ClearState(ID3D11DeviceCon wined3d_device_set_primitive_type(device->wined3d_device, WINED3D_PT_UNDEFINED, 0); for (i = 0; i < D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT; ++i) { - wined3d_device_set_rendertarget_view(device->wined3d_device, i, NULL, FALSE); + wined3d_device_context_set_rendertarget_view(context->wined3d_context, i, NULL, FALSE); } wined3d_device_set_depth_stencil_view(device->wined3d_device, NULL); for (i = 0; i < WINED3D_PIPELINE_COUNT; ++i)
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com