From: Zebediah Figura z.figura12@gmail.com
Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- dlls/d3d11/device.c | 38 +++++++++++++++------ dlls/ntoskrnl.exe/tests/Makefile.in | 4 +-- dlls/wined3d/cs.c | 53 +++++++++++++++++------------ dlls/wined3d/device.c | 37 +++++++++++--------- dlls/wined3d/wined3d.spec | 2 +- dlls/wined3d/wined3d_private.h | 5 +-- include/wine/wined3d.h | 5 +-- 7 files changed, 89 insertions(+), 55 deletions(-)
diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c index f8bd8578cdc..0385db9c138 100644 --- a/dlls/d3d11/device.c +++ b/dlls/d3d11/device.c @@ -560,20 +560,29 @@ static void d3d11_device_context_get_constant_buffers(ID3D11DeviceContext1 *ifac wined3d_mutex_unlock(); }
-static void d3d11_device_context_set_constant_buffers(ID3D11DeviceContext1 *iface, - enum wined3d_shader_type type, UINT start_slot, UINT buffer_count, ID3D11Buffer *const *buffers) +static void d3d11_device_context_set_constant_buffers(ID3D11DeviceContext1 *iface, enum wined3d_shader_type type, + unsigned int start_slot, unsigned int buffer_count, ID3D11Buffer *const *buffers) { + struct wined3d_buffer *wined3d_buffers[D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT]; struct d3d11_device_context *context = impl_from_ID3D11DeviceContext1(iface); unsigned int i;
- wined3d_mutex_lock(); + if (buffer_count > ARRAY_SIZE(wined3d_buffers)) + { + WARN("Buffer count %u exceeds limit; ignoring call.\n", buffer_count); + return; + } + for (i = 0; i < buffer_count; ++i) { struct d3d_buffer *buffer = unsafe_impl_from_ID3D11Buffer(buffers[i]);
- wined3d_device_context_set_constant_buffer(context->wined3d_context, type, start_slot + i, - buffer ? buffer->wined3d_buffer : NULL); + wined3d_buffers[i] = buffer ? buffer->wined3d_buffer : NULL; } + + wined3d_mutex_lock(); + wined3d_device_context_set_constant_buffers(context->wined3d_context, + type, start_slot, buffer_count, wined3d_buffers); wined3d_mutex_unlock(); }
@@ -4571,20 +4580,29 @@ static void d3d10_device_get_constant_buffers(ID3D10Device1 *iface, wined3d_mutex_unlock(); }
-static void d3d10_device_set_constant_buffers(ID3D10Device1 *iface, - enum wined3d_shader_type type, UINT start_slot, UINT buffer_count, ID3D10Buffer *const *buffers) +static void d3d10_device_set_constant_buffers(ID3D10Device1 *iface, enum wined3d_shader_type type, + unsigned int start_slot, unsigned int buffer_count, ID3D10Buffer *const *buffers) { + struct wined3d_buffer *wined3d_buffers[D3D10_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT]; struct d3d_device *device = impl_from_ID3D10Device(iface); unsigned int i;
- wined3d_mutex_lock(); + if (buffer_count > ARRAY_SIZE(wined3d_buffers)) + { + WARN("Buffer count %u exceeds limit; ignoring call.\n", buffer_count); + return; + } + for (i = 0; i < buffer_count; ++i) { struct d3d_buffer *buffer = unsafe_impl_from_ID3D10Buffer(buffers[i]);
- wined3d_device_context_set_constant_buffer(device->immediate_context.wined3d_context, type, start_slot + i, - buffer ? buffer->wined3d_buffer : NULL); + wined3d_buffers[i] = buffer ? buffer->wined3d_buffer : NULL; } + + wined3d_mutex_lock(); + wined3d_device_context_set_constant_buffers(device->immediate_context.wined3d_context, + type, start_slot, buffer_count, wined3d_buffers); wined3d_mutex_unlock(); }
diff --git a/dlls/ntoskrnl.exe/tests/Makefile.in b/dlls/ntoskrnl.exe/tests/Makefile.in index aa3a714d3df..d6f12bdf90a 100644 --- a/dlls/ntoskrnl.exe/tests/Makefile.in +++ b/dlls/ntoskrnl.exe/tests/Makefile.in @@ -13,9 +13,9 @@ driver_netio_IMPORTS = winecrt0 ntoskrnl hal netio driver_netio_EXTRADLLFLAGS = -nodefaultlibs -nostartfiles -Wl,--subsystem,native driver_pnp_IMPORTS = winecrt0 ntoskrnl hal driver_pnp_EXTRADLLFLAGS = -nodefaultlibs -nostartfiles -Wl,--subsystem,native -driver_wdf_IMPORTS = winecrt0 ntoskrnl wdfldr +driver_wdf_IMPORTS = winecrt0 ntoskrnl hal wdfldr driver_wdf_EXTRADLLFLAGS = -nodefaultlibs -nostartfiles -Wl,--subsystem,native -driver_wdf_pnp_IMPORTS = winecrt0 ntoskrnl wdfldr +driver_wdf_pnp_IMPORTS = winecrt0 ntoskrnl hal wdfldr driver_wdf_pnp_EXTRADLLFLAGS = -nodefaultlibs -nostartfiles -Wl,--subsystem,native
SOURCES = \ diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c index ce0417c9f71..05adb32ae64 100644 --- a/dlls/wined3d/cs.c +++ b/dlls/wined3d/cs.c @@ -120,7 +120,7 @@ enum wined3d_cs_op WINED3D_CS_OP_SET_STREAM_SOURCE_FREQ, WINED3D_CS_OP_SET_STREAM_OUTPUT, WINED3D_CS_OP_SET_INDEX_BUFFER, - WINED3D_CS_OP_SET_CONSTANT_BUFFER, + WINED3D_CS_OP_SET_CONSTANT_BUFFERS, WINED3D_CS_OP_SET_TEXTURE, WINED3D_CS_OP_SET_SHADER_RESOURCE_VIEW, WINED3D_CS_OP_SET_UNORDERED_ACCESS_VIEW, @@ -285,12 +285,13 @@ struct wined3d_cs_set_index_buffer unsigned int offset; };
-struct wined3d_cs_set_constant_buffer +struct wined3d_cs_set_constant_buffers { enum wined3d_cs_op opcode; enum wined3d_shader_type type; - UINT cb_idx; - struct wined3d_buffer *buffer; + unsigned int start_idx; + unsigned int count; + struct wined3d_buffer *buffers[1]; };
struct wined3d_cs_set_texture @@ -598,7 +599,7 @@ static const char *debug_cs_op(enum wined3d_cs_op op) WINED3D_TO_STR(WINED3D_CS_OP_SET_STREAM_SOURCE_FREQ); WINED3D_TO_STR(WINED3D_CS_OP_SET_STREAM_OUTPUT); WINED3D_TO_STR(WINED3D_CS_OP_SET_INDEX_BUFFER); - WINED3D_TO_STR(WINED3D_CS_OP_SET_CONSTANT_BUFFER); + WINED3D_TO_STR(WINED3D_CS_OP_SET_CONSTANT_BUFFERS); WINED3D_TO_STR(WINED3D_CS_OP_SET_TEXTURE); WINED3D_TO_STR(WINED3D_CS_OP_SET_SHADER_RESOURCE_VIEW); WINED3D_TO_STR(WINED3D_CS_OP_SET_UNORDERED_ACCESS_VIEW); @@ -1529,32 +1530,40 @@ void wined3d_device_context_emit_set_index_buffer(struct wined3d_device_context wined3d_device_context_submit(context, WINED3D_CS_QUEUE_DEFAULT); }
-static void wined3d_cs_exec_set_constant_buffer(struct wined3d_cs *cs, const void *data) +static void wined3d_cs_exec_set_constant_buffers(struct wined3d_cs *cs, const void *data) { - const struct wined3d_cs_set_constant_buffer *op = data; - struct wined3d_buffer *prev; + const struct wined3d_cs_set_constant_buffers *op = data; + unsigned int i;
- prev = cs->state.cb[op->type][op->cb_idx]; - cs->state.cb[op->type][op->cb_idx] = op->buffer; + for (i = 0; i < op->count; ++i) + { + struct wined3d_buffer *prev = cs->state.cb[op->type][op->start_idx + i]; + struct wined3d_buffer *buffer = op->buffers[i];
- if (op->buffer) - InterlockedIncrement(&op->buffer->resource.bind_count); - if (prev) - InterlockedDecrement(&prev->resource.bind_count); + cs->state.cb[op->type][op->start_idx + i] = buffer; + + if (buffer) + InterlockedIncrement(&buffer->resource.bind_count); + if (prev) + InterlockedDecrement(&prev->resource.bind_count); + }
device_invalidate_state(cs->c.device, STATE_CONSTANT_BUFFER(op->type)); }
-void wined3d_device_context_emit_set_constant_buffer(struct wined3d_device_context *context, - enum wined3d_shader_type type, UINT cb_idx, struct wined3d_buffer *buffer) +void wined3d_device_context_emit_set_constant_buffers(struct wined3d_device_context *context, + enum wined3d_shader_type type, unsigned int start_idx, unsigned int count, + struct wined3d_buffer *const *buffers) { - struct wined3d_cs_set_constant_buffer *op; + struct wined3d_cs_set_constant_buffers *op;
- op = wined3d_device_context_require_space(context, sizeof(*op), WINED3D_CS_QUEUE_DEFAULT); - op->opcode = WINED3D_CS_OP_SET_CONSTANT_BUFFER; + op = wined3d_device_context_require_space(context, offsetof(struct wined3d_cs_set_constant_buffers, buffers[count]), + WINED3D_CS_QUEUE_DEFAULT); + op->opcode = WINED3D_CS_OP_SET_CONSTANT_BUFFERS; op->type = type; - op->cb_idx = cb_idx; - op->buffer = buffer; + op->start_idx = start_idx; + op->count = count; + memcpy(op->buffers, buffers, count * sizeof(*buffers));
wined3d_device_context_submit(context, WINED3D_CS_QUEUE_DEFAULT); } @@ -2903,7 +2912,7 @@ static void (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void /* WINED3D_CS_OP_SET_STREAM_SOURCE_FREQ */ wined3d_cs_exec_set_stream_source_freq, /* WINED3D_CS_OP_SET_STREAM_OUTPUT */ wined3d_cs_exec_set_stream_output, /* WINED3D_CS_OP_SET_INDEX_BUFFER */ wined3d_cs_exec_set_index_buffer, - /* WINED3D_CS_OP_SET_CONSTANT_BUFFER */ wined3d_cs_exec_set_constant_buffer, + /* WINED3D_CS_OP_SET_CONSTANT_BUFFERS */ wined3d_cs_exec_set_constant_buffers, /* WINED3D_CS_OP_SET_TEXTURE */ wined3d_cs_exec_set_texture, /* WINED3D_CS_OP_SET_SHADER_RESOURCE_VIEW */ wined3d_cs_exec_set_shader_resource_view, /* WINED3D_CS_OP_SET_UNORDERED_ACCESS_VIEW */ wined3d_cs_exec_set_unordered_access_view, diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index 5a2a95ebe96..e123afea96d 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -1696,8 +1696,7 @@ void CDECL wined3d_device_context_set_state(struct wined3d_device_context *conte for (i = 0; i < WINED3D_SHADER_TYPE_COUNT; ++i) { wined3d_device_context_emit_set_shader(context, i, state->shader[i]); - for (j = 0; j < MAX_CONSTANT_BUFFERS; ++j) - wined3d_device_context_emit_set_constant_buffer(context, i, j, state->cb[i][j]); + wined3d_device_context_emit_set_constant_buffers(context, i, 0, MAX_CONSTANT_BUFFERS, state->cb[i]); for (j = 0; j < MAX_SAMPLER_OBJECTS; ++j) { wined3d_device_context_emit_set_sampler(context, i, j, state->sampler[i][j]); @@ -1834,30 +1833,36 @@ struct wined3d_shader * CDECL wined3d_device_context_get_shader(const struct win return context->state->shader[type]; }
-void CDECL wined3d_device_context_set_constant_buffer(struct wined3d_device_context *context, - enum wined3d_shader_type type, unsigned int idx, struct wined3d_buffer *buffer) +void CDECL wined3d_device_context_set_constant_buffers(struct wined3d_device_context *context, + enum wined3d_shader_type type, unsigned int start_idx, unsigned int count, + struct wined3d_buffer *const *buffers) { struct wined3d_state *state = context->state; - struct wined3d_buffer *prev; + unsigned int i;
- TRACE("context %p, type %#x, idx %u, buffer %p.\n", context, type, idx, buffer); + TRACE("context %p, type %#x, start_idx %u, count %u, buffers %p.\n", context, type, start_idx, count, buffers);
- if (idx >= MAX_CONSTANT_BUFFERS) + if (start_idx >= MAX_CONSTANT_BUFFERS || count > MAX_CONSTANT_BUFFERS - start_idx) { - WARN("Invalid constant buffer index %u.\n", idx); + WARN("Invalid constant buffer index %u, count %u.\n", start_idx, count); return; }
- prev = state->cb[type][idx]; - if (buffer == prev) + if (!memcmp(buffers, &state->cb[type][start_idx], count * sizeof(*buffers))) return;
- if (buffer) - wined3d_buffer_incref(buffer); - state->cb[type][idx] = buffer; - wined3d_device_context_emit_set_constant_buffer(context, type, idx, buffer); - if (prev) - wined3d_buffer_decref(prev); + wined3d_device_context_emit_set_constant_buffers(context, type, start_idx, count, buffers); + for (i = 0; i < count; ++i) + { + struct wined3d_buffer *prev = state->cb[type][start_idx + i]; + struct wined3d_buffer *buffer = buffers[i]; + + if (buffer) + wined3d_buffer_incref(buffer); + state->cb[type][start_idx + i] = buffer; + if (prev) + wined3d_buffer_decref(prev); + } }
void CDECL wined3d_device_context_set_blend_state(struct wined3d_device_context *context, diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec index 11351b60a7f..a3f7f4ba405 100644 --- a/dlls/wined3d/wined3d.spec +++ b/dlls/wined3d/wined3d.spec @@ -123,7 +123,7 @@ @ cdecl wined3d_device_context_reset_state(ptr) @ cdecl wined3d_device_context_resolve_sub_resource(ptr ptr long ptr long long) @ cdecl wined3d_device_context_set_blend_state(ptr ptr ptr long) -@ cdecl wined3d_device_context_set_constant_buffer(ptr long long ptr) +@ cdecl wined3d_device_context_set_constant_buffers(ptr long long long ptr) @ cdecl wined3d_device_context_set_depth_stencil_state(ptr ptr long) @ cdecl wined3d_device_context_set_depth_stencil_view(ptr ptr) @ cdecl wined3d_device_context_set_index_buffer(ptr ptr long long) diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 80e03ad9212..f03c7130c53 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -4809,8 +4809,9 @@ void wined3d_device_context_emit_set_blend_state(struct wined3d_device_context * unsigned int sample_mask) DECLSPEC_HIDDEN; void wined3d_device_context_emit_set_clip_plane(struct wined3d_device_context *context, unsigned int plane_idx, const struct wined3d_vec4 *plane) DECLSPEC_HIDDEN; -void wined3d_device_context_emit_set_constant_buffer(struct wined3d_device_context *context, - enum wined3d_shader_type type, UINT cb_idx, struct wined3d_buffer *buffer) DECLSPEC_HIDDEN; +void wined3d_device_context_emit_set_constant_buffers(struct wined3d_device_context *context, + enum wined3d_shader_type type, unsigned int start_idx, unsigned int count, + struct wined3d_buffer *const *buffers) DECLSPEC_HIDDEN; void wined3d_device_context_emit_set_depth_stencil_state(struct wined3d_device_context *context, struct wined3d_depth_stencil_state *state, unsigned int stencil_ref) DECLSPEC_HIDDEN; void wined3d_device_context_emit_set_depth_stencil_view(struct wined3d_device_context *context, diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index 53ae13b7df5..8994a78e99f 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -2496,8 +2496,9 @@ void __cdecl wined3d_device_context_resolve_sub_resource(struct wined3d_device_c struct wined3d_resource *src_resource, unsigned int src_sub_resource_idx, enum wined3d_format_id format_id); void __cdecl wined3d_device_context_set_blend_state(struct wined3d_device_context *context, struct wined3d_blend_state *state, const struct wined3d_color *blend_factor, unsigned int sample_mask); -void __cdecl wined3d_device_context_set_constant_buffer(struct wined3d_device_context *context, - enum wined3d_shader_type type, unsigned int idx, struct wined3d_buffer *buffer); +void __cdecl wined3d_device_context_set_constant_buffers(struct wined3d_device_context *context, + enum wined3d_shader_type type, unsigned int start_idx, unsigned int count, + struct wined3d_buffer *const *buffers); void __cdecl wined3d_device_context_set_depth_stencil_state(struct wined3d_device_context *context, struct wined3d_depth_stencil_state *depth_stencil_state, unsigned int stencil_ref); HRESULT __cdecl wined3d_device_context_set_depth_stencil_view(struct wined3d_device_context *context,
From: Zebediah Figura z.figura12@gmail.com
Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- dlls/d3d11/device.c | 169 ++++++++++++--------------------- dlls/wined3d/cs.c | 53 ++++++----- dlls/wined3d/device.c | 71 ++++++++------ dlls/wined3d/wined3d.spec | 2 +- dlls/wined3d/wined3d_private.h | 6 +- include/wine/wined3d.h | 5 +- 6 files changed, 141 insertions(+), 165 deletions(-)
diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c index 0385db9c138..56578fb37fb 100644 --- a/dlls/d3d11/device.c +++ b/dlls/d3d11/device.c @@ -586,6 +586,32 @@ static void d3d11_device_context_set_constant_buffers(ID3D11DeviceContext1 *ifac wined3d_mutex_unlock(); }
+static void d3d11_device_context_set_shader_resource_views(ID3D11DeviceContext1 *iface, enum wined3d_shader_type type, + unsigned int start_slot, unsigned int count, ID3D11ShaderResourceView *const *views) +{ + struct wined3d_shader_resource_view *wined3d_views[D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT]; + struct d3d11_device_context *context = impl_from_ID3D11DeviceContext1(iface); + unsigned int i; + + if (count > ARRAY_SIZE(wined3d_views)) + { + WARN("View count %u exceeds limit; ignoring call.\n", count); + return; + } + + for (i = 0; i < count; ++i) + { + struct d3d_shader_resource_view *view = unsafe_impl_from_ID3D11ShaderResourceView(views[i]); + + wined3d_views[i] = view ? view->wined3d_view : NULL; + } + + wined3d_mutex_lock(); + wined3d_device_context_set_shader_resource_views(context->wined3d_context, + type, start_slot, count, wined3d_views); + wined3d_mutex_unlock(); +} + static void STDMETHODCALLTYPE d3d11_device_context_GetDevice(ID3D11DeviceContext1 *iface, ID3D11Device **device) { struct d3d11_device_context *context = impl_from_ID3D11DeviceContext1(iface); @@ -639,21 +665,10 @@ static void STDMETHODCALLTYPE d3d11_device_context_VSSetConstantBuffers(ID3D11De static void STDMETHODCALLTYPE d3d11_device_context_PSSetShaderResources(ID3D11DeviceContext1 *iface, UINT start_slot, UINT view_count, ID3D11ShaderResourceView *const *views) { - struct d3d11_device_context *context = impl_from_ID3D11DeviceContext1(iface); - unsigned int i; - TRACE("iface %p, start_slot %u, view_count %u, views %p.\n", iface, start_slot, view_count, views);
- wined3d_mutex_lock(); - for (i = 0; i < view_count; ++i) - { - struct d3d_shader_resource_view *view = unsafe_impl_from_ID3D11ShaderResourceView(views[i]); - - wined3d_device_context_set_shader_resource_view(context->wined3d_context, WINED3D_SHADER_TYPE_PIXEL, - start_slot + i, view ? view->wined3d_view : NULL); - } - wined3d_mutex_unlock(); + d3d11_device_context_set_shader_resource_views(iface, WINED3D_SHADER_TYPE_PIXEL, start_slot, view_count, views); }
static void STDMETHODCALLTYPE d3d11_device_context_PSSetShader(ID3D11DeviceContext1 *iface, @@ -925,20 +940,9 @@ static void STDMETHODCALLTYPE d3d11_device_context_IASetPrimitiveTopology(ID3D11 static void STDMETHODCALLTYPE d3d11_device_context_VSSetShaderResources(ID3D11DeviceContext1 *iface, UINT start_slot, UINT view_count, ID3D11ShaderResourceView *const *views) { - struct d3d11_device_context *context = impl_from_ID3D11DeviceContext1(iface); - unsigned int i; - TRACE("iface %p, start_slot %u, view_count %u, views %p.\n", iface, start_slot, view_count, views);
- wined3d_mutex_lock(); - for (i = 0; i < view_count; ++i) - { - struct d3d_shader_resource_view *view = unsafe_impl_from_ID3D11ShaderResourceView(views[i]); - - wined3d_device_context_set_shader_resource_view(context->wined3d_context, WINED3D_SHADER_TYPE_VERTEX, - start_slot + i, view ? view->wined3d_view : NULL); - } - wined3d_mutex_unlock(); + d3d11_device_context_set_shader_resource_views(iface, WINED3D_SHADER_TYPE_VERTEX, start_slot, view_count, views); }
static void STDMETHODCALLTYPE d3d11_device_context_VSSetSamplers(ID3D11DeviceContext1 *iface, @@ -1037,20 +1041,9 @@ static void STDMETHODCALLTYPE d3d11_device_context_SetPredication(ID3D11DeviceCo static void STDMETHODCALLTYPE d3d11_device_context_GSSetShaderResources(ID3D11DeviceContext1 *iface, UINT start_slot, UINT view_count, ID3D11ShaderResourceView *const *views) { - struct d3d11_device_context *context = impl_from_ID3D11DeviceContext1(iface); - unsigned int i; - TRACE("iface %p, start_slot %u, view_count %u, views %p.\n", iface, start_slot, view_count, views);
- wined3d_mutex_lock(); - for (i = 0; i < view_count; ++i) - { - struct d3d_shader_resource_view *view = unsafe_impl_from_ID3D11ShaderResourceView(views[i]); - - wined3d_device_context_set_shader_resource_view(context->wined3d_context, WINED3D_SHADER_TYPE_GEOMETRY, - start_slot + i, view ? view->wined3d_view : NULL); - } - wined3d_mutex_unlock(); + d3d11_device_context_set_shader_resource_views(iface, WINED3D_SHADER_TYPE_GEOMETRY, start_slot, view_count, views); }
static void STDMETHODCALLTYPE d3d11_device_context_GSSetSamplers(ID3D11DeviceContext1 *iface, @@ -1564,21 +1557,10 @@ static void STDMETHODCALLTYPE d3d11_device_context_ExecuteCommandList(ID3D11Devi static void STDMETHODCALLTYPE d3d11_device_context_HSSetShaderResources(ID3D11DeviceContext1 *iface, UINT start_slot, UINT view_count, ID3D11ShaderResourceView *const *views) { - struct d3d11_device_context *context = impl_from_ID3D11DeviceContext1(iface); - unsigned int i; - TRACE("iface %p, start_slot %u, view_count %u, views %p.\n", iface, start_slot, view_count, views);
- wined3d_mutex_lock(); - for (i = 0; i < view_count; ++i) - { - struct d3d_shader_resource_view *view = unsafe_impl_from_ID3D11ShaderResourceView(views[i]); - - wined3d_device_context_set_shader_resource_view(context->wined3d_context, WINED3D_SHADER_TYPE_HULL, - start_slot + i, view ? view->wined3d_view : NULL); - } - wined3d_mutex_unlock(); + d3d11_device_context_set_shader_resource_views(iface, WINED3D_SHADER_TYPE_HULL, start_slot, view_count, views); }
static void STDMETHODCALLTYPE d3d11_device_context_HSSetShader(ID3D11DeviceContext1 *iface, @@ -1632,21 +1614,10 @@ static void STDMETHODCALLTYPE d3d11_device_context_HSSetConstantBuffers(ID3D11De static void STDMETHODCALLTYPE d3d11_device_context_DSSetShaderResources(ID3D11DeviceContext1 *iface, UINT start_slot, UINT view_count, ID3D11ShaderResourceView *const *views) { - struct d3d11_device_context *context = impl_from_ID3D11DeviceContext1(iface); - unsigned int i; - TRACE("iface %p, start_slot %u, view_count %u, views %p.\n", iface, start_slot, view_count, views);
- wined3d_mutex_lock(); - for (i = 0; i < view_count; ++i) - { - struct d3d_shader_resource_view *view = unsafe_impl_from_ID3D11ShaderResourceView(views[i]); - - wined3d_device_context_set_shader_resource_view(context->wined3d_context, WINED3D_SHADER_TYPE_DOMAIN, - start_slot + i, view ? view->wined3d_view : NULL); - } - wined3d_mutex_unlock(); + d3d11_device_context_set_shader_resource_views(iface, WINED3D_SHADER_TYPE_DOMAIN, start_slot, view_count, views); }
static void STDMETHODCALLTYPE d3d11_device_context_DSSetShader(ID3D11DeviceContext1 *iface, @@ -1700,21 +1671,10 @@ static void STDMETHODCALLTYPE d3d11_device_context_DSSetConstantBuffers(ID3D11De static void STDMETHODCALLTYPE d3d11_device_context_CSSetShaderResources(ID3D11DeviceContext1 *iface, UINT start_slot, UINT view_count, ID3D11ShaderResourceView *const *views) { - struct d3d11_device_context *context = impl_from_ID3D11DeviceContext1(iface); - unsigned int i; - TRACE("iface %p, start_slot %u, view_count %u, views %p.\n", iface, start_slot, view_count, views);
- wined3d_mutex_lock(); - for (i = 0; i < view_count; ++i) - { - struct d3d_shader_resource_view *view = unsafe_impl_from_ID3D11ShaderResourceView(views[i]); - - wined3d_device_context_set_shader_resource_view(context->wined3d_context, WINED3D_SHADER_TYPE_COMPUTE, - start_slot + i, view ? view->wined3d_view : NULL); - } - wined3d_mutex_unlock(); + d3d11_device_context_set_shader_resource_views(iface, WINED3D_SHADER_TYPE_COMPUTE, start_slot, view_count, views); }
static void STDMETHODCALLTYPE d3d11_device_context_CSSetUnorderedAccessViews(ID3D11DeviceContext1 *iface, @@ -4606,6 +4566,32 @@ static void d3d10_device_set_constant_buffers(ID3D10Device1 *iface, enum wined3d wined3d_mutex_unlock(); }
+static void d3d10_device_set_shader_resource_views(ID3D10Device1 *iface, enum wined3d_shader_type type, + unsigned int start_slot, unsigned int count, ID3D10ShaderResourceView *const *views) +{ + struct wined3d_shader_resource_view *wined3d_views[D3D10_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT]; + struct d3d_device *device = impl_from_ID3D10Device(iface); + unsigned int i; + + if (count > ARRAY_SIZE(wined3d_views)) + { + WARN("View count %u exceeds limit; ignoring call.\n", count); + return; + } + + for (i = 0; i < count; ++i) + { + struct d3d_shader_resource_view *view = unsafe_impl_from_ID3D10ShaderResourceView(views[i]); + + wined3d_views[i] = view ? view->wined3d_view : NULL; + } + + wined3d_mutex_lock(); + wined3d_device_context_set_shader_resource_views(device->immediate_context.wined3d_context, + type, start_slot, count, wined3d_views); + wined3d_mutex_unlock(); +} + static void STDMETHODCALLTYPE d3d10_device_VSSetConstantBuffers(ID3D10Device1 *iface, UINT start_slot, UINT buffer_count, ID3D10Buffer *const *buffers) { @@ -4619,21 +4605,10 @@ static void STDMETHODCALLTYPE d3d10_device_VSSetConstantBuffers(ID3D10Device1 *i static void STDMETHODCALLTYPE d3d10_device_PSSetShaderResources(ID3D10Device1 *iface, UINT start_slot, UINT view_count, ID3D10ShaderResourceView *const *views) { - struct d3d_device *device = impl_from_ID3D10Device(iface); - unsigned int i; - TRACE("iface %p, start_slot %u, view_count %u, views %p.\n", iface, start_slot, view_count, views);
- wined3d_mutex_lock(); - for (i = 0; i < view_count; ++i) - { - struct d3d_shader_resource_view *view = unsafe_impl_from_ID3D10ShaderResourceView(views[i]); - - wined3d_device_context_set_shader_resource_view(device->immediate_context.wined3d_context, - WINED3D_SHADER_TYPE_PIXEL, start_slot + i, view ? view->wined3d_view : NULL); - } - wined3d_mutex_unlock(); + d3d10_device_set_shader_resource_views(iface, WINED3D_SHADER_TYPE_PIXEL, start_slot, view_count, views); }
static void STDMETHODCALLTYPE d3d10_device_PSSetShader(ID3D10Device1 *iface, @@ -4843,21 +4818,10 @@ static void STDMETHODCALLTYPE d3d10_device_IASetPrimitiveTopology(ID3D10Device1 static void STDMETHODCALLTYPE d3d10_device_VSSetShaderResources(ID3D10Device1 *iface, UINT start_slot, UINT view_count, ID3D10ShaderResourceView *const *views) { - struct d3d_device *device = impl_from_ID3D10Device(iface); - unsigned int i; - TRACE("iface %p, start_slot %u, view_count %u, views %p.\n", iface, start_slot, view_count, views);
- wined3d_mutex_lock(); - for (i = 0; i < view_count; ++i) - { - struct d3d_shader_resource_view *view = unsafe_impl_from_ID3D10ShaderResourceView(views[i]); - - wined3d_device_context_set_shader_resource_view(device->immediate_context.wined3d_context, - WINED3D_SHADER_TYPE_VERTEX, start_slot + i, view ? view->wined3d_view : NULL); - } - wined3d_mutex_unlock(); + d3d10_device_set_shader_resource_views(iface, WINED3D_SHADER_TYPE_VERTEX, start_slot, view_count, views); }
static void STDMETHODCALLTYPE d3d10_device_VSSetSamplers(ID3D10Device1 *iface, @@ -4897,21 +4861,10 @@ static void STDMETHODCALLTYPE d3d10_device_SetPredication(ID3D10Device1 *iface, static void STDMETHODCALLTYPE d3d10_device_GSSetShaderResources(ID3D10Device1 *iface, UINT start_slot, UINT view_count, ID3D10ShaderResourceView *const *views) { - struct d3d_device *device = impl_from_ID3D10Device(iface); - unsigned int i; - TRACE("iface %p, start_slot %u, view_count %u, views %p.\n", iface, start_slot, view_count, views);
- wined3d_mutex_lock(); - for (i = 0; i < view_count; ++i) - { - struct d3d_shader_resource_view *view = unsafe_impl_from_ID3D10ShaderResourceView(views[i]); - - wined3d_device_context_set_shader_resource_view(device->immediate_context.wined3d_context, - WINED3D_SHADER_TYPE_GEOMETRY, start_slot + i, view ? view->wined3d_view : NULL); - } - wined3d_mutex_unlock(); + d3d10_device_set_shader_resource_views(iface, WINED3D_SHADER_TYPE_GEOMETRY, start_slot, view_count, views); }
static void STDMETHODCALLTYPE d3d10_device_GSSetSamplers(ID3D10Device1 *iface, diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c index 05adb32ae64..1f1a589ad04 100644 --- a/dlls/wined3d/cs.c +++ b/dlls/wined3d/cs.c @@ -122,7 +122,7 @@ enum wined3d_cs_op WINED3D_CS_OP_SET_INDEX_BUFFER, WINED3D_CS_OP_SET_CONSTANT_BUFFERS, WINED3D_CS_OP_SET_TEXTURE, - WINED3D_CS_OP_SET_SHADER_RESOURCE_VIEW, + WINED3D_CS_OP_SET_SHADER_RESOURCE_VIEWS, WINED3D_CS_OP_SET_UNORDERED_ACCESS_VIEW, WINED3D_CS_OP_SET_SAMPLER, WINED3D_CS_OP_SET_SHADER, @@ -310,12 +310,13 @@ struct wined3d_cs_set_color_key struct wined3d_color_key color_key; };
-struct wined3d_cs_set_shader_resource_view +struct wined3d_cs_set_shader_resource_views { enum wined3d_cs_op opcode; enum wined3d_shader_type type; - UINT view_idx; - struct wined3d_shader_resource_view *view; + unsigned int start_idx; + unsigned int count; + struct wined3d_shader_resource_view *views[1]; };
struct wined3d_cs_set_unordered_access_view @@ -601,7 +602,7 @@ static const char *debug_cs_op(enum wined3d_cs_op op) WINED3D_TO_STR(WINED3D_CS_OP_SET_INDEX_BUFFER); WINED3D_TO_STR(WINED3D_CS_OP_SET_CONSTANT_BUFFERS); WINED3D_TO_STR(WINED3D_CS_OP_SET_TEXTURE); - WINED3D_TO_STR(WINED3D_CS_OP_SET_SHADER_RESOURCE_VIEW); + WINED3D_TO_STR(WINED3D_CS_OP_SET_SHADER_RESOURCE_VIEWS); WINED3D_TO_STR(WINED3D_CS_OP_SET_UNORDERED_ACCESS_VIEW); WINED3D_TO_STR(WINED3D_CS_OP_SET_SAMPLER); WINED3D_TO_STR(WINED3D_CS_OP_SET_SHADER); @@ -1659,18 +1660,23 @@ void wined3d_device_context_emit_set_texture(struct wined3d_device_context *cont wined3d_device_context_submit(context, WINED3D_CS_QUEUE_DEFAULT); }
-static void wined3d_cs_exec_set_shader_resource_view(struct wined3d_cs *cs, const void *data) +static void wined3d_cs_exec_set_shader_resource_views(struct wined3d_cs *cs, const void *data) { - const struct wined3d_cs_set_shader_resource_view *op = data; - struct wined3d_shader_resource_view *prev; + const struct wined3d_cs_set_shader_resource_views *op = data; + unsigned int i;
- prev = cs->state.shader_resource_view[op->type][op->view_idx]; - cs->state.shader_resource_view[op->type][op->view_idx] = op->view; + for (i = 0; i < op->count; ++i) + { + struct wined3d_shader_resource_view *prev = cs->state.shader_resource_view[op->type][op->start_idx + i]; + struct wined3d_shader_resource_view *view = op->views[i];
- if (op->view) - InterlockedIncrement(&op->view->resource->bind_count); - if (prev) - InterlockedDecrement(&prev->resource->bind_count); + cs->state.shader_resource_view[op->type][op->start_idx + i] = view; + + if (view) + InterlockedIncrement(&view->resource->bind_count); + if (prev) + InterlockedDecrement(&prev->resource->bind_count); + }
if (op->type != WINED3D_SHADER_TYPE_COMPUTE) device_invalidate_state(cs->c.device, STATE_GRAPHICS_SHADER_RESOURCE_BINDING); @@ -1678,16 +1684,19 @@ static void wined3d_cs_exec_set_shader_resource_view(struct wined3d_cs *cs, cons device_invalidate_state(cs->c.device, STATE_COMPUTE_SHADER_RESOURCE_BINDING); }
-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) +void wined3d_device_context_emit_set_shader_resource_views(struct wined3d_device_context *context, + enum wined3d_shader_type type, unsigned int start_idx, unsigned int count, + struct wined3d_shader_resource_view *const *views) { - struct wined3d_cs_set_shader_resource_view *op; + struct wined3d_cs_set_shader_resource_views *op;
- op = wined3d_device_context_require_space(context, sizeof(*op), WINED3D_CS_QUEUE_DEFAULT); - op->opcode = WINED3D_CS_OP_SET_SHADER_RESOURCE_VIEW; + op = wined3d_device_context_require_space(context, + offsetof(struct wined3d_cs_set_shader_resource_views, views[count]), WINED3D_CS_QUEUE_DEFAULT); + op->opcode = WINED3D_CS_OP_SET_SHADER_RESOURCE_VIEWS; op->type = type; - op->view_idx = view_idx; - op->view = view; + op->start_idx = start_idx; + op->count = count; + memcpy(op->views, views, count * sizeof(*views));
wined3d_device_context_submit(context, WINED3D_CS_QUEUE_DEFAULT); } @@ -2914,7 +2923,7 @@ static void (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void /* WINED3D_CS_OP_SET_INDEX_BUFFER */ wined3d_cs_exec_set_index_buffer, /* WINED3D_CS_OP_SET_CONSTANT_BUFFERS */ wined3d_cs_exec_set_constant_buffers, /* WINED3D_CS_OP_SET_TEXTURE */ wined3d_cs_exec_set_texture, - /* WINED3D_CS_OP_SET_SHADER_RESOURCE_VIEW */ wined3d_cs_exec_set_shader_resource_view, + /* WINED3D_CS_OP_SET_SHADER_RESOURCE_VIEWS */ wined3d_cs_exec_set_shader_resource_views, /* WINED3D_CS_OP_SET_UNORDERED_ACCESS_VIEW */ wined3d_cs_exec_set_unordered_access_view, /* WINED3D_CS_OP_SET_SAMPLER */ wined3d_cs_exec_set_sampler, /* WINED3D_CS_OP_SET_SHADER */ wined3d_cs_exec_set_shader, diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index e123afea96d..3ed32fbf80c 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -1701,10 +1701,8 @@ void CDECL wined3d_device_context_set_state(struct wined3d_device_context *conte { wined3d_device_context_emit_set_sampler(context, i, j, state->sampler[i][j]); } - for (j = 0; j < MAX_SHADER_RESOURCE_VIEWS; ++j) - { - wined3d_device_context_emit_set_shader_resource_view(context, i, j, state->shader_resource_view[i][j]); - } + wined3d_device_context_emit_set_shader_resource_views(context, i, 0, + MAX_SHADER_RESOURCE_VIEWS, state->shader_resource_view[i]); }
for (i = 0; i < WINED3D_PIPELINE_COUNT; ++i) @@ -1982,45 +1980,58 @@ void CDECL wined3d_device_context_set_scissor_rects(struct wined3d_device_contex wined3d_device_context_emit_set_scissor_rects(context, rect_count, rects); }
-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_shader_resource_views(struct wined3d_device_context *context, + enum wined3d_shader_type type, unsigned int start_idx, unsigned int count, + struct wined3d_shader_resource_view *const *const views) { + struct wined3d_shader_resource_view *real_views[MAX_SHADER_RESOURCE_VIEWS]; struct wined3d_state *state = context->state; - const struct wined3d_rendertarget_view *dsv; - struct wined3d_shader_resource_view *prev; + const struct wined3d_rendertarget_view *dsv = state->fb.depth_stencil; + unsigned int i;
- TRACE("context %p, type %#x, idx %u, view %p.\n", context, type, idx, view); + TRACE("context %p, type %#x, start_idx %u, count %u, views %p.\n", context, type, start_idx, count, views);
- if (idx >= MAX_SHADER_RESOURCE_VIEWS) + if (start_idx >= MAX_SHADER_RESOURCE_VIEWS || count > MAX_SHADER_RESOURCE_VIEWS - start_idx) { - WARN("Invalid view index %u.\n", idx); + WARN("Invalid view index %u, count %u.\n", start_idx, count); return; }
- prev = state->shader_resource_view[type][idx]; - if (view == prev) + if (!memcmp(views, &state->shader_resource_view[type][start_idx], count * sizeof(*views))) return;
- if (view && (wined3d_is_srv_rtv_bound(state, view) - || ((dsv = state->fb.depth_stencil) - && dsv->resource == view->resource && wined3d_dsv_srv_conflict(dsv, view->format)))) + memcpy(real_views, views, count * sizeof(*views)); + + for (i = 0; i < count; ++i) { - WARN("Application is trying to bind resource which is attached as render target.\n"); - view = NULL; + struct wined3d_shader_resource_view *view = real_views[i]; + + if (view && (wined3d_is_srv_rtv_bound(state, view) + || (dsv && dsv->resource == view->resource && wined3d_dsv_srv_conflict(dsv, view->format)))) + { + WARN("Application is trying to bind resource which is attached as render target.\n"); + real_views[i] = NULL; + } }
- if (view) + wined3d_device_context_emit_set_shader_resource_views(context, type, start_idx, count, real_views); + for (i = 0; i < count; ++i) { - wined3d_shader_resource_view_incref(view); - wined3d_srv_bind_count_inc(view); - } + struct wined3d_shader_resource_view *prev = state->shader_resource_view[type][start_idx + i]; + struct wined3d_shader_resource_view *view = real_views[i];
- state->shader_resource_view[type][idx] = view; - wined3d_device_context_emit_set_shader_resource_view(context, type, idx, view); - if (prev) - { - wined3d_srv_bind_count_dec(prev); - wined3d_shader_resource_view_decref(prev); + if (view) + { + wined3d_shader_resource_view_incref(view); + wined3d_srv_bind_count_inc(view); + } + + state->shader_resource_view[type][start_idx + i] = view; + if (prev) + { + wined3d_srv_bind_count_dec(prev); + wined3d_shader_resource_view_decref(prev); + } } }
@@ -2100,8 +2111,10 @@ static void wined3d_device_context_unbind_srv_for_rtv(struct wined3d_device_cont && ((!dsv && wined3d_is_srv_rtv_bound(state, srv)) || (dsv && wined3d_dsv_srv_conflict(view, srv->format)))) { + static struct wined3d_shader_resource_view *const null_srv; + WARN("Application sets bound resource as render target.\n"); - wined3d_device_context_set_shader_resource_view(context, i, j, NULL); + wined3d_device_context_set_shader_resource_views(context, i, j, 1, &null_srv); } } } diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec index a3f7f4ba405..55ebdd62a5a 100644 --- a/dlls/wined3d/wined3d.spec +++ b/dlls/wined3d/wined3d.spec @@ -134,7 +134,7 @@ @ 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) -@ cdecl wined3d_device_context_set_shader_resource_view(ptr long long ptr) +@ cdecl wined3d_device_context_set_shader_resource_views(ptr long long long ptr) @ cdecl wined3d_device_context_set_state(ptr ptr) @ cdecl wined3d_device_context_set_stream_output(ptr long ptr long) @ cdecl wined3d_device_context_set_stream_source(ptr long ptr long long) diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index f03c7130c53..61eaf390436 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -4842,9 +4842,9 @@ void wined3d_device_context_emit_set_scissor_rects(struct wined3d_device_context unsigned int rect_count, const RECT *rects) DECLSPEC_HIDDEN; void wined3d_device_context_emit_set_shader(struct wined3d_device_context *context, enum wined3d_shader_type type, struct wined3d_shader *shader) DECLSPEC_HIDDEN; -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_shader_resource_views(struct wined3d_device_context *context, + enum wined3d_shader_type type, unsigned int start_idx, unsigned int count, + struct wined3d_shader_resource_view *const *views) DECLSPEC_HIDDEN; void wined3d_device_context_emit_set_stream_output(struct wined3d_device_context *context, unsigned int stream_idx, struct wined3d_buffer *buffer, unsigned int offset) DECLSPEC_HIDDEN; void wined3d_device_context_emit_set_stream_source(struct wined3d_device_context *context, unsigned int stream_idx, diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index 8994a78e99f..cd4cdf55409 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -2519,8 +2519,9 @@ void __cdecl wined3d_device_context_set_scissor_rects(struct wined3d_device_cont const RECT *rects); void __cdecl wined3d_device_context_set_shader(struct wined3d_device_context *context, 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_shader_resource_views(struct wined3d_device_context *context, + enum wined3d_shader_type type, unsigned int start_idx, unsigned int count, + struct wined3d_shader_resource_view *const *views); void __cdecl wined3d_device_context_set_state(struct wined3d_device_context *context, struct wined3d_state *state); void __cdecl wined3d_device_context_set_stream_output(struct wined3d_device_context *context, unsigned int idx, struct wined3d_buffer *buffer, unsigned int offset);
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=93668
Your paranoid android.
=== debiant2 (build log) ===
error: patch failed: dlls/ntoskrnl.exe/tests/Makefile.in:13 Task: Patch failed to apply
=== debiant2 (build log) ===
error: patch failed: dlls/ntoskrnl.exe/tests/Makefile.in:13 Task: Patch failed to apply
From: Zebediah Figura z.figura12@gmail.com
Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- dlls/d3d11/device.c | 168 ++++++++++++--------------------- dlls/wined3d/cs.c | 38 ++++---- dlls/wined3d/device.c | 38 ++++---- dlls/wined3d/wined3d.spec | 2 +- dlls/wined3d/wined3d_private.h | 4 +- include/wine/wined3d.h | 4 +- 6 files changed, 107 insertions(+), 147 deletions(-)
diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c index 56578fb37fb..ec2447b3c4e 100644 --- a/dlls/d3d11/device.c +++ b/dlls/d3d11/device.c @@ -612,6 +612,31 @@ static void d3d11_device_context_set_shader_resource_views(ID3D11DeviceContext1 wined3d_mutex_unlock(); }
+static void d3d11_device_context_set_samplers(ID3D11DeviceContext1 *iface, enum wined3d_shader_type type, + unsigned int start_slot, unsigned int count, ID3D11SamplerState *const *samplers) +{ + struct wined3d_sampler *wined3d_samplers[D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT]; + struct d3d11_device_context *context = impl_from_ID3D11DeviceContext1(iface); + unsigned int i; + + if (count > ARRAY_SIZE(wined3d_samplers)) + { + WARN("Sampler count %u exceeds limit; ignoring call.\n", count); + return; + } + + for (i = 0; i < count; ++i) + { + struct d3d_sampler_state *sampler = unsafe_impl_from_ID3D11SamplerState(samplers[i]); + + wined3d_samplers[i] = sampler ? sampler->wined3d_sampler : NULL; + } + + wined3d_mutex_lock(); + wined3d_device_context_set_samplers(context->wined3d_context, type, start_slot, count, wined3d_samplers); + wined3d_mutex_unlock(); +} + static void STDMETHODCALLTYPE d3d11_device_context_GetDevice(ID3D11DeviceContext1 *iface, ID3D11Device **device) { struct d3d11_device_context *context = impl_from_ID3D11DeviceContext1(iface); @@ -692,21 +717,10 @@ static void STDMETHODCALLTYPE d3d11_device_context_PSSetShader(ID3D11DeviceConte static void STDMETHODCALLTYPE d3d11_device_context_PSSetSamplers(ID3D11DeviceContext1 *iface, UINT start_slot, UINT sampler_count, ID3D11SamplerState *const *samplers) { - struct d3d11_device_context *context = impl_from_ID3D11DeviceContext1(iface); - unsigned int i; - TRACE("iface %p, start_slot %u, sampler_count %u, samplers %p.\n", iface, start_slot, sampler_count, samplers);
- wined3d_mutex_lock(); - for (i = 0; i < sampler_count; ++i) - { - struct d3d_sampler_state *sampler = unsafe_impl_from_ID3D11SamplerState(samplers[i]); - - wined3d_device_context_set_sampler(context->wined3d_context, WINED3D_SHADER_TYPE_PIXEL, start_slot + i, - sampler ? sampler->wined3d_sampler : NULL); - } - wined3d_mutex_unlock(); + d3d11_device_context_set_samplers(iface, WINED3D_SHADER_TYPE_PIXEL, start_slot, sampler_count, samplers); }
static void STDMETHODCALLTYPE d3d11_device_context_VSSetShader(ID3D11DeviceContext1 *iface, @@ -948,21 +962,10 @@ static void STDMETHODCALLTYPE d3d11_device_context_VSSetShaderResources(ID3D11De static void STDMETHODCALLTYPE d3d11_device_context_VSSetSamplers(ID3D11DeviceContext1 *iface, UINT start_slot, UINT sampler_count, ID3D11SamplerState *const *samplers) { - struct d3d11_device_context *context = impl_from_ID3D11DeviceContext1(iface); - unsigned int i; - TRACE("iface %p, start_slot %u, sampler_count %u, samplers %p.\n", iface, start_slot, sampler_count, samplers);
- wined3d_mutex_lock(); - for (i = 0; i < sampler_count; ++i) - { - struct d3d_sampler_state *sampler = unsafe_impl_from_ID3D11SamplerState(samplers[i]); - - wined3d_device_context_set_sampler(context->wined3d_context, WINED3D_SHADER_TYPE_VERTEX, start_slot + i, - sampler ? sampler->wined3d_sampler : NULL); - } - wined3d_mutex_unlock(); + d3d11_device_context_set_samplers(iface, WINED3D_SHADER_TYPE_VERTEX, start_slot, sampler_count, samplers); }
static void STDMETHODCALLTYPE d3d11_device_context_Begin(ID3D11DeviceContext1 *iface, @@ -1049,21 +1052,10 @@ static void STDMETHODCALLTYPE d3d11_device_context_GSSetShaderResources(ID3D11De static void STDMETHODCALLTYPE d3d11_device_context_GSSetSamplers(ID3D11DeviceContext1 *iface, UINT start_slot, UINT sampler_count, ID3D11SamplerState *const *samplers) { - struct d3d11_device_context *context = impl_from_ID3D11DeviceContext1(iface); - unsigned int i; - TRACE("iface %p, start_slot %u, sampler_count %u, samplers %p.\n", iface, start_slot, sampler_count, samplers);
- wined3d_mutex_lock(); - for (i = 0; i < sampler_count; ++i) - { - struct d3d_sampler_state *sampler = unsafe_impl_from_ID3D11SamplerState(samplers[i]); - - wined3d_device_context_set_sampler(context->wined3d_context, WINED3D_SHADER_TYPE_GEOMETRY, start_slot + i, - sampler ? sampler->wined3d_sampler : NULL); - } - wined3d_mutex_unlock(); + d3d11_device_context_set_samplers(iface, WINED3D_SHADER_TYPE_GEOMETRY, start_slot, sampler_count, samplers); }
static void STDMETHODCALLTYPE d3d11_device_context_OMSetRenderTargets(ID3D11DeviceContext1 *iface, @@ -1584,21 +1576,10 @@ static void STDMETHODCALLTYPE d3d11_device_context_HSSetShader(ID3D11DeviceConte static void STDMETHODCALLTYPE d3d11_device_context_HSSetSamplers(ID3D11DeviceContext1 *iface, UINT start_slot, UINT sampler_count, ID3D11SamplerState *const *samplers) { - struct d3d11_device_context *context = impl_from_ID3D11DeviceContext1(iface); - unsigned int i; - TRACE("iface %p, start_slot %u, sampler_count %u, samplers %p.\n", iface, start_slot, sampler_count, samplers);
- wined3d_mutex_lock(); - for (i = 0; i < sampler_count; ++i) - { - struct d3d_sampler_state *sampler = unsafe_impl_from_ID3D11SamplerState(samplers[i]); - - wined3d_device_context_set_sampler(context->wined3d_context, WINED3D_SHADER_TYPE_HULL, start_slot + i, - sampler ? sampler->wined3d_sampler : NULL); - } - wined3d_mutex_unlock(); + d3d11_device_context_set_samplers(iface, WINED3D_SHADER_TYPE_HULL, start_slot, sampler_count, samplers); }
static void STDMETHODCALLTYPE d3d11_device_context_HSSetConstantBuffers(ID3D11DeviceContext1 *iface, @@ -1641,21 +1622,10 @@ static void STDMETHODCALLTYPE d3d11_device_context_DSSetShader(ID3D11DeviceConte static void STDMETHODCALLTYPE d3d11_device_context_DSSetSamplers(ID3D11DeviceContext1 *iface, UINT start_slot, UINT sampler_count, ID3D11SamplerState *const *samplers) { - struct d3d11_device_context *context = impl_from_ID3D11DeviceContext1(iface); - unsigned int i; - TRACE("iface %p, start_slot %u, sampler_count %u, samplers %p.\n", iface, start_slot, sampler_count, samplers);
- wined3d_mutex_lock(); - for (i = 0; i < sampler_count; ++i) - { - struct d3d_sampler_state *sampler = unsafe_impl_from_ID3D11SamplerState(samplers[i]); - - wined3d_device_context_set_sampler(context->wined3d_context, WINED3D_SHADER_TYPE_DOMAIN, start_slot + i, - sampler ? sampler->wined3d_sampler : NULL); - } - wined3d_mutex_unlock(); + d3d11_device_context_set_samplers(iface, WINED3D_SHADER_TYPE_DOMAIN, start_slot, sampler_count, samplers); }
static void STDMETHODCALLTYPE d3d11_device_context_DSSetConstantBuffers(ID3D11DeviceContext1 *iface, @@ -1718,21 +1688,10 @@ static void STDMETHODCALLTYPE d3d11_device_context_CSSetShader(ID3D11DeviceConte static void STDMETHODCALLTYPE d3d11_device_context_CSSetSamplers(ID3D11DeviceContext1 *iface, UINT start_slot, UINT sampler_count, ID3D11SamplerState *const *samplers) { - struct d3d11_device_context *context = impl_from_ID3D11DeviceContext1(iface); - unsigned int i; - TRACE("iface %p, start_slot %u, sampler_count %u, samplers %p.\n", iface, start_slot, sampler_count, samplers);
- wined3d_mutex_lock(); - for (i = 0; i < sampler_count; ++i) - { - struct d3d_sampler_state *sampler = unsafe_impl_from_ID3D11SamplerState(samplers[i]); - - wined3d_device_context_set_sampler(context->wined3d_context, WINED3D_SHADER_TYPE_COMPUTE, start_slot + i, - sampler ? sampler->wined3d_sampler : NULL); - } - wined3d_mutex_unlock(); + d3d11_device_context_set_samplers(iface, WINED3D_SHADER_TYPE_COMPUTE, start_slot, sampler_count, samplers); }
static void STDMETHODCALLTYPE d3d11_device_context_CSSetConstantBuffers(ID3D11DeviceContext1 *iface, @@ -4592,6 +4551,32 @@ static void d3d10_device_set_shader_resource_views(ID3D10Device1 *iface, enum wi wined3d_mutex_unlock(); }
+static void d3d10_device_set_samplers(ID3D10Device1 *iface, enum wined3d_shader_type type, + unsigned int start_slot, unsigned int count, ID3D10SamplerState *const *samplers) +{ + struct wined3d_sampler *wined3d_samplers[D3D10_COMMONSHADER_SAMPLER_SLOT_COUNT]; + struct d3d_device *device = impl_from_ID3D10Device(iface); + unsigned int i; + + if (count > ARRAY_SIZE(wined3d_samplers)) + { + WARN("Sampler count %u exceeds limit; ignoring call.\n", count); + return; + } + + for (i = 0; i < count; ++i) + { + struct d3d_sampler_state *sampler = unsafe_impl_from_ID3D10SamplerState(samplers[i]); + + wined3d_samplers[i] = sampler ? sampler->wined3d_sampler : NULL; + } + + wined3d_mutex_lock(); + wined3d_device_context_set_samplers(device->immediate_context.wined3d_context, + type, start_slot, count, wined3d_samplers); + wined3d_mutex_unlock(); +} + static void STDMETHODCALLTYPE d3d10_device_VSSetConstantBuffers(ID3D10Device1 *iface, UINT start_slot, UINT buffer_count, ID3D10Buffer *const *buffers) { @@ -4628,21 +4613,10 @@ static void STDMETHODCALLTYPE d3d10_device_PSSetShader(ID3D10Device1 *iface, static void STDMETHODCALLTYPE d3d10_device_PSSetSamplers(ID3D10Device1 *iface, UINT start_slot, UINT sampler_count, ID3D10SamplerState *const *samplers) { - struct d3d_device *device = impl_from_ID3D10Device(iface); - unsigned int i; - TRACE("iface %p, start_slot %u, sampler_count %u, samplers %p.\n", iface, start_slot, sampler_count, samplers);
- wined3d_mutex_lock(); - for (i = 0; i < sampler_count; ++i) - { - struct d3d_sampler_state *sampler = unsafe_impl_from_ID3D10SamplerState(samplers[i]); - - wined3d_device_context_set_sampler(device->immediate_context.wined3d_context, - WINED3D_SHADER_TYPE_PIXEL, start_slot + i, sampler ? sampler->wined3d_sampler : NULL); - } - wined3d_mutex_unlock(); + d3d10_device_set_samplers(iface, WINED3D_SHADER_TYPE_PIXEL, start_slot, sampler_count, samplers); }
static void STDMETHODCALLTYPE d3d10_device_VSSetShader(ID3D10Device1 *iface, @@ -4827,21 +4801,10 @@ static void STDMETHODCALLTYPE d3d10_device_VSSetShaderResources(ID3D10Device1 *i static void STDMETHODCALLTYPE d3d10_device_VSSetSamplers(ID3D10Device1 *iface, UINT start_slot, UINT sampler_count, ID3D10SamplerState *const *samplers) { - struct d3d_device *device = impl_from_ID3D10Device(iface); - unsigned int i; - TRACE("iface %p, start_slot %u, sampler_count %u, samplers %p.\n", iface, start_slot, sampler_count, samplers);
- wined3d_mutex_lock(); - for (i = 0; i < sampler_count; ++i) - { - struct d3d_sampler_state *sampler = unsafe_impl_from_ID3D10SamplerState(samplers[i]); - - wined3d_device_context_set_sampler(device->immediate_context.wined3d_context, - WINED3D_SHADER_TYPE_VERTEX, start_slot + i, sampler ? sampler->wined3d_sampler : NULL); - } - wined3d_mutex_unlock(); + d3d10_device_set_samplers(iface, WINED3D_SHADER_TYPE_VERTEX, start_slot, sampler_count, samplers); }
static void STDMETHODCALLTYPE d3d10_device_SetPredication(ID3D10Device1 *iface, ID3D10Predicate *predicate, BOOL value) @@ -4870,21 +4833,10 @@ static void STDMETHODCALLTYPE d3d10_device_GSSetShaderResources(ID3D10Device1 *i static void STDMETHODCALLTYPE d3d10_device_GSSetSamplers(ID3D10Device1 *iface, UINT start_slot, UINT sampler_count, ID3D10SamplerState *const *samplers) { - struct d3d_device *device = impl_from_ID3D10Device(iface); - unsigned int i; - TRACE("iface %p, start_slot %u, sampler_count %u, samplers %p.\n", iface, start_slot, sampler_count, samplers);
- wined3d_mutex_lock(); - for (i = 0; i < sampler_count; ++i) - { - struct d3d_sampler_state *sampler = unsafe_impl_from_ID3D10SamplerState(samplers[i]); - - wined3d_device_context_set_sampler(device->immediate_context.wined3d_context, WINED3D_SHADER_TYPE_GEOMETRY, - start_slot + i, sampler ? sampler->wined3d_sampler : NULL); - } - wined3d_mutex_unlock(); + d3d10_device_set_samplers(iface, WINED3D_SHADER_TYPE_GEOMETRY, start_slot, sampler_count, samplers); }
static void STDMETHODCALLTYPE d3d10_device_OMSetRenderTargets(ID3D10Device1 *iface, diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c index 1f1a589ad04..726bbe113f4 100644 --- a/dlls/wined3d/cs.c +++ b/dlls/wined3d/cs.c @@ -124,7 +124,7 @@ enum wined3d_cs_op WINED3D_CS_OP_SET_TEXTURE, WINED3D_CS_OP_SET_SHADER_RESOURCE_VIEWS, WINED3D_CS_OP_SET_UNORDERED_ACCESS_VIEW, - WINED3D_CS_OP_SET_SAMPLER, + WINED3D_CS_OP_SET_SAMPLERS, WINED3D_CS_OP_SET_SHADER, WINED3D_CS_OP_SET_BLEND_STATE, WINED3D_CS_OP_SET_DEPTH_STENCIL_STATE, @@ -328,12 +328,13 @@ struct wined3d_cs_set_unordered_access_view unsigned int initial_count; };
-struct wined3d_cs_set_sampler +struct wined3d_cs_set_samplers { enum wined3d_cs_op opcode; enum wined3d_shader_type type; - UINT sampler_idx; - struct wined3d_sampler *sampler; + unsigned int start_idx; + unsigned int count; + struct wined3d_sampler *samplers[1]; };
struct wined3d_cs_set_shader @@ -604,7 +605,7 @@ static const char *debug_cs_op(enum wined3d_cs_op op) WINED3D_TO_STR(WINED3D_CS_OP_SET_TEXTURE); WINED3D_TO_STR(WINED3D_CS_OP_SET_SHADER_RESOURCE_VIEWS); WINED3D_TO_STR(WINED3D_CS_OP_SET_UNORDERED_ACCESS_VIEW); - WINED3D_TO_STR(WINED3D_CS_OP_SET_SAMPLER); + WINED3D_TO_STR(WINED3D_CS_OP_SET_SAMPLERS); WINED3D_TO_STR(WINED3D_CS_OP_SET_SHADER); WINED3D_TO_STR(WINED3D_CS_OP_SET_BLEND_STATE); WINED3D_TO_STR(WINED3D_CS_OP_SET_DEPTH_STENCIL_STATE); @@ -1736,27 +1737,32 @@ void wined3d_device_context_emit_set_unordered_access_view(struct wined3d_device wined3d_device_context_submit(context, WINED3D_CS_QUEUE_DEFAULT); }
-static void wined3d_cs_exec_set_sampler(struct wined3d_cs *cs, const void *data) +static void wined3d_cs_exec_set_samplers(struct wined3d_cs *cs, const void *data) { - const struct wined3d_cs_set_sampler *op = data; + const struct wined3d_cs_set_samplers *op = data; + unsigned int i; + + for (i = 0; i < op->count; ++i) + cs->state.sampler[op->type][op->start_idx + i] = op->samplers[i];
- cs->state.sampler[op->type][op->sampler_idx] = op->sampler; if (op->type != WINED3D_SHADER_TYPE_COMPUTE) device_invalidate_state(cs->c.device, STATE_GRAPHICS_SHADER_RESOURCE_BINDING); else device_invalidate_state(cs->c.device, STATE_COMPUTE_SHADER_RESOURCE_BINDING); }
-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) +void wined3d_device_context_emit_set_samplers(struct wined3d_device_context *context, enum wined3d_shader_type type, + unsigned int start_idx, unsigned int count, struct wined3d_sampler *const *samplers) { - struct wined3d_cs_set_sampler *op; + struct wined3d_cs_set_samplers *op;
- op = wined3d_device_context_require_space(context, sizeof(*op), WINED3D_CS_QUEUE_DEFAULT); - op->opcode = WINED3D_CS_OP_SET_SAMPLER; + op = wined3d_device_context_require_space(context, offsetof(struct wined3d_cs_set_samplers, samplers[count]), + WINED3D_CS_QUEUE_DEFAULT); + op->opcode = WINED3D_CS_OP_SET_SAMPLERS; op->type = type; - op->sampler_idx = sampler_idx; - op->sampler = sampler; + op->start_idx = start_idx; + op->count = count; + memcpy(op->samplers, samplers, count * sizeof(*samplers));
wined3d_device_context_submit(context, WINED3D_CS_QUEUE_DEFAULT); } @@ -2925,7 +2931,7 @@ static void (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void /* WINED3D_CS_OP_SET_TEXTURE */ wined3d_cs_exec_set_texture, /* WINED3D_CS_OP_SET_SHADER_RESOURCE_VIEWS */ wined3d_cs_exec_set_shader_resource_views, /* WINED3D_CS_OP_SET_UNORDERED_ACCESS_VIEW */ wined3d_cs_exec_set_unordered_access_view, - /* WINED3D_CS_OP_SET_SAMPLER */ wined3d_cs_exec_set_sampler, + /* WINED3D_CS_OP_SET_SAMPLERS */ wined3d_cs_exec_set_samplers, /* WINED3D_CS_OP_SET_SHADER */ wined3d_cs_exec_set_shader, /* WINED3D_CS_OP_SET_BLEND_STATE */ wined3d_cs_exec_set_blend_state, /* WINED3D_CS_OP_SET_DEPTH_STENCIL_STATE */ wined3d_cs_exec_set_depth_stencil_state, diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index 3ed32fbf80c..a667f5b9266 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -1697,10 +1697,7 @@ void CDECL wined3d_device_context_set_state(struct wined3d_device_context *conte { wined3d_device_context_emit_set_shader(context, i, state->shader[i]); wined3d_device_context_emit_set_constant_buffers(context, i, 0, MAX_CONSTANT_BUFFERS, state->cb[i]); - for (j = 0; j < MAX_SAMPLER_OBJECTS; ++j) - { - wined3d_device_context_emit_set_sampler(context, i, j, state->sampler[i][j]); - } + wined3d_device_context_emit_set_samplers(context, i, 0, MAX_SAMPLER_OBJECTS, state->sampler[i]); wined3d_device_context_emit_set_shader_resource_views(context, i, 0, MAX_SHADER_RESOURCE_VIEWS, state->shader_resource_view[i]); } @@ -2035,30 +2032,35 @@ void CDECL wined3d_device_context_set_shader_resource_views(struct wined3d_devic } }
-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_samplers(struct wined3d_device_context *context, enum wined3d_shader_type type, + unsigned int start_idx, unsigned int count, struct wined3d_sampler *const *samplers) { struct wined3d_state *state = context->state; - struct wined3d_sampler *prev; + unsigned int i;
- TRACE("context %p, type %#x, idx %u, sampler %p.\n", context, type, idx, sampler); + TRACE("context %p, type %#x, start_idx %u, count %u, samplers %p.\n", context, type, start_idx, count, samplers);
- if (idx >= MAX_SAMPLER_OBJECTS) + if (start_idx >= MAX_SAMPLER_OBJECTS || count > MAX_SAMPLER_OBJECTS - start_idx) { - WARN("Invalid sampler index %u.\n", idx); + WARN("Invalid sampler index %u, count %u.\n", start_idx, count); return; }
- prev = state->sampler[type][idx]; - if (sampler == prev) + if (!memcmp(samplers, &state->sampler[type][start_idx], count * sizeof(*samplers))) return;
- if (sampler) - wined3d_sampler_incref(sampler); - state->sampler[type][idx] = sampler; - wined3d_device_context_emit_set_sampler(context, type, idx, sampler); - if (prev) - wined3d_sampler_decref(prev); + wined3d_device_context_emit_set_samplers(context, type, start_idx, count, samplers); + for (i = 0; i < count; ++i) + { + struct wined3d_sampler *prev = state->sampler[type][start_idx + i]; + struct wined3d_sampler *sampler = samplers[i]; + + if (sampler) + wined3d_sampler_incref(sampler); + state->sampler[type][start_idx + i] = sampler; + if (prev) + wined3d_sampler_decref(prev); + } }
void CDECL wined3d_device_context_set_unordered_access_view(struct wined3d_device_context *context, diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec index 55ebdd62a5a..4d4f34f8d6a 100644 --- a/dlls/wined3d/wined3d.spec +++ b/dlls/wined3d/wined3d.spec @@ -131,7 +131,7 @@ @ cdecl wined3d_device_context_set_primitive_type(ptr long 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_samplers(ptr long long long ptr) @ 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_views(ptr long long long ptr) diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 61eaf390436..48d32b15d05 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -4834,8 +4834,8 @@ void wined3d_device_context_emit_set_render_state(struct wined3d_device_context enum wined3d_render_state state, unsigned int value) 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_samplers(struct wined3d_device_context *context, enum wined3d_shader_type type, + unsigned int start_idx, unsigned int count, struct wined3d_sampler *const *samplers) DECLSPEC_HIDDEN; void wined3d_device_context_emit_set_sampler_state(struct wined3d_device_context *context, unsigned int sampler_idx, enum wined3d_sampler_state state, unsigned int value) DECLSPEC_HIDDEN; void wined3d_device_context_emit_set_scissor_rects(struct wined3d_device_context *context, diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index cd4cdf55409..80a636edc9f 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -2513,8 +2513,8 @@ void __cdecl wined3d_device_context_set_rasterizer_state(struct wined3d_device_c 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_samplers(struct wined3d_device_context *context, enum wined3d_shader_type type, + unsigned int start_idx, unsigned int count, struct wined3d_sampler *const *samplers); void __cdecl wined3d_device_context_set_scissor_rects(struct wined3d_device_context *context, unsigned int rect_count, const RECT *rects); void __cdecl wined3d_device_context_set_shader(struct wined3d_device_context *context,
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=93669
Your paranoid android.
=== debiant2 (build log) ===
error: patch failed: dlls/ntoskrnl.exe/tests/Makefile.in:13 Task: Patch failed to apply
=== debiant2 (build log) ===
error: patch failed: dlls/ntoskrnl.exe/tests/Makefile.in:13 Task: Patch failed to apply
From: Zebediah Figura z.figura12@gmail.com
Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- dlls/d3d11/device.c | 46 +++++++++++++--------- dlls/wined3d/cs.c | 70 +++++++++++++++++++++------------- dlls/wined3d/device.c | 45 +++++++++++----------- dlls/wined3d/wined3d.spec | 2 +- dlls/wined3d/wined3d_private.h | 6 +-- include/wine/wined3d.h | 6 +-- 6 files changed, 102 insertions(+), 73 deletions(-)
diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c index ec2447b3c4e..0179e61a3a3 100644 --- a/dlls/d3d11/device.c +++ b/dlls/d3d11/device.c @@ -1110,26 +1110,29 @@ static void STDMETHODCALLTYPE d3d11_device_context_OMSetRenderTargetsAndUnordere
if (unordered_access_view_count != D3D11_KEEP_UNORDERED_ACCESS_VIEWS) { - wined3d_mutex_lock(); - for (i = 0; i < unordered_access_view_start_slot; ++i) + struct wined3d_unordered_access_view *wined3d_views[D3D11_PS_CS_UAV_REGISTER_COUNT] = {0}; + unsigned int wined3d_initial_counts[D3D11_PS_CS_UAV_REGISTER_COUNT]; + + if (unordered_access_view_start_slot + unordered_access_view_count > ARRAY_SIZE(wined3d_views)) { - wined3d_device_context_set_unordered_access_view(context->wined3d_context, - WINED3D_PIPELINE_GRAPHICS, i, NULL, ~0u); + WARN("View count %u exceeds limit; ignoring call.\n", unordered_access_view_count); + return; } + + memset(wined3d_initial_counts, 0xff, sizeof(wined3d_initial_counts)); + for (i = 0; i < unordered_access_view_count; ++i) { - struct d3d11_unordered_access_view *view - = unsafe_impl_from_ID3D11UnorderedAccessView(unordered_access_views[i]); + struct d3d11_unordered_access_view *view = + unsafe_impl_from_ID3D11UnorderedAccessView(unordered_access_views[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_context_set_unordered_access_view(context->wined3d_context, - WINED3D_PIPELINE_GRAPHICS, unordered_access_view_start_slot + i, NULL, ~0u); + wined3d_views[unordered_access_view_start_slot + i] = view ? view->wined3d_view : NULL; + wined3d_initial_counts[unordered_access_view_start_slot + i] = initial_counts ? initial_counts[i] : ~0u; } + + wined3d_mutex_lock(); + wined3d_device_context_set_unordered_access_views(context->wined3d_context, WINED3D_PIPELINE_GRAPHICS, + 0, ARRAY_SIZE(wined3d_views), wined3d_views, wined3d_initial_counts); wined3d_mutex_unlock(); } } @@ -1651,19 +1654,28 @@ static void STDMETHODCALLTYPE d3d11_device_context_CSSetUnorderedAccessViews(ID3 UINT start_slot, UINT view_count, ID3D11UnorderedAccessView *const *views, const UINT *initial_counts) { struct d3d11_device_context *context = impl_from_ID3D11DeviceContext1(iface); + struct wined3d_unordered_access_view *wined3d_views[D3D11_PS_CS_UAV_REGISTER_COUNT]; unsigned int i;
TRACE("iface %p, start_slot %u, view_count %u, views %p, initial_counts %p.\n", iface, start_slot, view_count, views, initial_counts);
- wined3d_mutex_lock(); + if (view_count > ARRAY_SIZE(wined3d_views)) + { + WARN("View count %u exceeds limit; ignoring call.\n", view_count); + return; + } + for (i = 0; i < view_count; ++i) { struct d3d11_unordered_access_view *view = unsafe_impl_from_ID3D11UnorderedAccessView(views[i]);
- wined3d_device_context_set_unordered_access_view(context->wined3d_context, WINED3D_PIPELINE_COMPUTE, - start_slot + i, view ? view->wined3d_view : NULL, initial_counts ? initial_counts[i] : ~0u); + wined3d_views[i] = view ? view->wined3d_view : NULL; } + + wined3d_mutex_lock(); + wined3d_device_context_set_unordered_access_views(context->wined3d_context, WINED3D_PIPELINE_COMPUTE, + start_slot, view_count, wined3d_views, initial_counts); wined3d_mutex_unlock(); }
diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c index 726bbe113f4..5309484d3ed 100644 --- a/dlls/wined3d/cs.c +++ b/dlls/wined3d/cs.c @@ -123,7 +123,7 @@ enum wined3d_cs_op WINED3D_CS_OP_SET_CONSTANT_BUFFERS, WINED3D_CS_OP_SET_TEXTURE, WINED3D_CS_OP_SET_SHADER_RESOURCE_VIEWS, - WINED3D_CS_OP_SET_UNORDERED_ACCESS_VIEW, + WINED3D_CS_OP_SET_UNORDERED_ACCESS_VIEWS, WINED3D_CS_OP_SET_SAMPLERS, WINED3D_CS_OP_SET_SHADER, WINED3D_CS_OP_SET_BLEND_STATE, @@ -319,13 +319,17 @@ struct wined3d_cs_set_shader_resource_views struct wined3d_shader_resource_view *views[1]; };
-struct wined3d_cs_set_unordered_access_view +struct wined3d_cs_set_unordered_access_views { enum wined3d_cs_op opcode; enum wined3d_pipeline pipeline; - unsigned int view_idx; - struct wined3d_unordered_access_view *view; - unsigned int initial_count; + unsigned int start_idx; + unsigned int count; + struct + { + struct wined3d_unordered_access_view *view; + unsigned int initial_count; + } uavs[1]; };
struct wined3d_cs_set_samplers @@ -604,7 +608,7 @@ static const char *debug_cs_op(enum wined3d_cs_op op) WINED3D_TO_STR(WINED3D_CS_OP_SET_CONSTANT_BUFFERS); WINED3D_TO_STR(WINED3D_CS_OP_SET_TEXTURE); WINED3D_TO_STR(WINED3D_CS_OP_SET_SHADER_RESOURCE_VIEWS); - WINED3D_TO_STR(WINED3D_CS_OP_SET_UNORDERED_ACCESS_VIEW); + WINED3D_TO_STR(WINED3D_CS_OP_SET_UNORDERED_ACCESS_VIEWS); WINED3D_TO_STR(WINED3D_CS_OP_SET_SAMPLERS); WINED3D_TO_STR(WINED3D_CS_OP_SET_SHADER); WINED3D_TO_STR(WINED3D_CS_OP_SET_BLEND_STATE); @@ -1702,37 +1706,49 @@ void wined3d_device_context_emit_set_shader_resource_views(struct wined3d_device wined3d_device_context_submit(context, WINED3D_CS_QUEUE_DEFAULT); }
-static void wined3d_cs_exec_set_unordered_access_view(struct wined3d_cs *cs, const void *data) +static void wined3d_cs_exec_set_unordered_access_views(struct wined3d_cs *cs, const void *data) { - const struct wined3d_cs_set_unordered_access_view *op = data; - struct wined3d_unordered_access_view *prev; + const struct wined3d_cs_set_unordered_access_views *op = data; + unsigned int i;
- prev = cs->state.unordered_access_view[op->pipeline][op->view_idx]; - cs->state.unordered_access_view[op->pipeline][op->view_idx] = op->view; + for (i = 0; i < op->count; ++i) + { + struct wined3d_unordered_access_view *prev = cs->state.unordered_access_view[op->pipeline][op->start_idx + i]; + struct wined3d_unordered_access_view *view = op->uavs[i].view; + unsigned int initial_count = op->uavs[i].initial_count;
- if (op->view) - InterlockedIncrement(&op->view->resource->bind_count); - if (prev) - InterlockedDecrement(&prev->resource->bind_count); + cs->state.unordered_access_view[op->pipeline][op->start_idx + i] = view;
- if (op->view && op->initial_count != ~0u) - wined3d_unordered_access_view_set_counter(op->view, op->initial_count); + if (view) + InterlockedIncrement(&view->resource->bind_count); + if (prev) + InterlockedDecrement(&prev->resource->bind_count); + + if (view && initial_count != ~0u) + wined3d_unordered_access_view_set_counter(view, initial_count); + }
device_invalidate_state(cs->c.device, STATE_UNORDERED_ACCESS_VIEW_BINDING(op->pipeline)); }
-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) +void wined3d_device_context_emit_set_unordered_access_views(struct wined3d_device_context *context, + enum wined3d_pipeline pipeline, unsigned int start_idx, unsigned int count, + struct wined3d_unordered_access_view *const *views, const unsigned int *initial_counts) { - struct wined3d_cs_set_unordered_access_view *op; + struct wined3d_cs_set_unordered_access_views *op; + unsigned int i;
- op = wined3d_device_context_require_space(context, sizeof(*op), WINED3D_CS_QUEUE_DEFAULT); - op->opcode = WINED3D_CS_OP_SET_UNORDERED_ACCESS_VIEW; + op = wined3d_device_context_require_space(context, + offsetof(struct wined3d_cs_set_unordered_access_views, uavs[count]), WINED3D_CS_QUEUE_DEFAULT); + op->opcode = WINED3D_CS_OP_SET_UNORDERED_ACCESS_VIEWS; op->pipeline = pipeline; - op->view_idx = view_idx; - op->view = view; - op->initial_count = initial_count; + op->start_idx = start_idx; + op->count = count; + for (i = 0; i < count; ++i) + { + op->uavs[i].view = views[i]; + op->uavs[i].initial_count = initial_counts ? initial_counts[i] : ~0u; + }
wined3d_device_context_submit(context, WINED3D_CS_QUEUE_DEFAULT); } @@ -2930,7 +2946,7 @@ static void (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void /* WINED3D_CS_OP_SET_CONSTANT_BUFFERS */ wined3d_cs_exec_set_constant_buffers, /* WINED3D_CS_OP_SET_TEXTURE */ wined3d_cs_exec_set_texture, /* WINED3D_CS_OP_SET_SHADER_RESOURCE_VIEWS */ wined3d_cs_exec_set_shader_resource_views, - /* WINED3D_CS_OP_SET_UNORDERED_ACCESS_VIEW */ wined3d_cs_exec_set_unordered_access_view, + /* WINED3D_CS_OP_SET_UNORDERED_ACCESS_VIEWS */ wined3d_cs_exec_set_unordered_access_views, /* WINED3D_CS_OP_SET_SAMPLERS */ wined3d_cs_exec_set_samplers, /* WINED3D_CS_OP_SET_SHADER */ wined3d_cs_exec_set_shader, /* WINED3D_CS_OP_SET_BLEND_STATE */ wined3d_cs_exec_set_blend_state, diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index a667f5b9266..dc75dbb3702 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -1703,13 +1703,8 @@ void CDECL wined3d_device_context_set_state(struct wined3d_device_context *conte }
for (i = 0; i < WINED3D_PIPELINE_COUNT; ++i) - { - for (j = 0; j < MAX_UNORDERED_ACCESS_VIEWS; ++j) - { - wined3d_device_context_emit_set_unordered_access_view(context, i, j, - state->unordered_access_view[i][j], ~0); - } - } + wined3d_device_context_emit_set_unordered_access_views(context, i, 0, MAX_UNORDERED_ACCESS_VIEWS, + state->unordered_access_view[i], NULL);
wined3d_device_context_push_constants(context, WINED3D_PUSH_CONSTANTS_VS_F, 0, WINED3D_MAX_VS_CONSTS_F, state->vs_consts_f); @@ -2063,31 +2058,37 @@ void CDECL wined3d_device_context_set_samplers(struct wined3d_device_context *co } }
-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_unordered_access_views(struct wined3d_device_context *context, + enum wined3d_pipeline pipeline, unsigned int start_idx, unsigned int count, + struct wined3d_unordered_access_view *const *uavs, const unsigned int *initial_counts) { struct wined3d_state *state = context->state; - struct wined3d_unordered_access_view *prev; + unsigned int i;
- TRACE("context %p, pipeline %#x, idx %u, uav %p, initial_count %u.\n", context, pipeline, idx, uav, initial_count); + TRACE("context %p, pipeline %#x, start_idx %u, count %u, uavs %p, initial_counts %p.\n", + context, pipeline, start_idx, count, uavs, initial_counts);
- if (idx >= MAX_UNORDERED_ACCESS_VIEWS) + if (start_idx >= MAX_UNORDERED_ACCESS_VIEWS || count > MAX_UNORDERED_ACCESS_VIEWS - start_idx) { - WARN("Invalid UAV index %u.\n", idx); + WARN("Invalid UAV index %u, count %u.\n", start_idx, count); return; }
- prev = state->unordered_access_view[pipeline][idx]; - if (uav == prev && initial_count == ~0u) + if (!memcmp(uavs, &state->unordered_access_view[pipeline][start_idx], count * sizeof(*uavs)) && !initial_counts) 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); + wined3d_device_context_emit_set_unordered_access_views(context, pipeline, start_idx, count, uavs, initial_counts); + for (i = 0; i < count; ++i) + { + struct wined3d_unordered_access_view *prev = state->unordered_access_view[pipeline][start_idx + i]; + struct wined3d_unordered_access_view *uav = uavs[i]; + + if (uav) + wined3d_unordered_access_view_incref(uav); + state->unordered_access_view[pipeline][start_idx + i] = uav; + if (prev) + wined3d_unordered_access_view_decref(prev); + } }
static void wined3d_device_context_unbind_srv_for_rtv(struct wined3d_device_context *context, diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec index 4d4f34f8d6a..13c8b218b65 100644 --- a/dlls/wined3d/wined3d.spec +++ b/dlls/wined3d/wined3d.spec @@ -138,7 +138,7 @@ @ cdecl wined3d_device_context_set_state(ptr ptr) @ cdecl wined3d_device_context_set_stream_output(ptr long ptr long) @ cdecl wined3d_device_context_set_stream_source(ptr long ptr long long) -@ cdecl wined3d_device_context_set_unordered_access_view(ptr long long ptr long) +@ cdecl wined3d_device_context_set_unordered_access_views(ptr long long long ptr ptr) @ cdecl wined3d_device_context_set_vertex_declaration(ptr ptr) @ cdecl wined3d_device_context_set_viewports(ptr long ptr) @ cdecl wined3d_device_context_unmap(ptr ptr long) diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 48d32b15d05..f08785be646 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -4855,9 +4855,9 @@ void wined3d_device_context_emit_set_texture_state(struct wined3d_device_context enum wined3d_texture_stage_state state, unsigned int value) DECLSPEC_HIDDEN; void wined3d_device_context_emit_set_transform(struct wined3d_device_context *context, enum wined3d_transform_state state, const struct wined3d_matrix *matrix) 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_unordered_access_views(struct wined3d_device_context *context, + enum wined3d_pipeline pipeline, unsigned int start_idx, unsigned int count, + struct wined3d_unordered_access_view *const *views, const unsigned int *initial_count) DECLSPEC_HIDDEN; void wined3d_device_context_emit_set_vertex_declaration(struct wined3d_device_context *context, struct wined3d_vertex_declaration *declaration) DECLSPEC_HIDDEN; void wined3d_device_context_emit_set_viewports(struct wined3d_device_context *context, unsigned int viewport_count, diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index 80a636edc9f..ac197782f72 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -2527,9 +2527,9 @@ void __cdecl wined3d_device_context_set_stream_output(struct wined3d_device_cont struct wined3d_buffer *buffer, unsigned int offset); HRESULT __cdecl wined3d_device_context_set_stream_source(struct wined3d_device_context *context, unsigned int stream_idx, struct wined3d_buffer *buffer, unsigned int offset, unsigned int stride); -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_unordered_access_views(struct wined3d_device_context *context, + enum wined3d_pipeline pipeline, unsigned int start_idx, unsigned int count, + struct wined3d_unordered_access_view *const *uavs, const unsigned int *initial_counts); void __cdecl wined3d_device_context_set_vertex_declaration(struct wined3d_device_context *context, struct wined3d_vertex_declaration *declaration); void __cdecl wined3d_device_context_set_viewports(struct wined3d_device_context *context, unsigned int viewport_count,
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=93670
Your paranoid android.
=== debiant2 (build log) ===
error: patch failed: dlls/ntoskrnl.exe/tests/Makefile.in:13 Task: Patch failed to apply
=== debiant2 (build log) ===
error: patch failed: dlls/ntoskrnl.exe/tests/Makefile.in:13 Task: Patch failed to apply
From: Zebediah Figura z.figura12@gmail.com
Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- dlls/d3d11/device.c | 35 +++++++++++------------- dlls/wined3d/cs.c | 49 ++++++++++++++++------------------ dlls/wined3d/device.c | 40 +++++++++++---------------- dlls/wined3d/wined3d.spec | 2 +- dlls/wined3d/wined3d_private.h | 10 ++----- include/wine/wined3d.h | 10 +++++-- 6 files changed, 65 insertions(+), 81 deletions(-)
diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c index 0179e61a3a3..91eaf87fa50 100644 --- a/dlls/d3d11/device.c +++ b/dlls/d3d11/device.c @@ -1184,24 +1184,22 @@ static void STDMETHODCALLTYPE d3d11_device_context_OMSetDepthStencilState(ID3D11 static void STDMETHODCALLTYPE d3d11_device_context_SOSetTargets(ID3D11DeviceContext1 *iface, UINT buffer_count, ID3D11Buffer *const *buffers, const UINT *offsets) { + struct wined3d_stream_output outputs[WINED3D_MAX_STREAM_OUTPUT_BUFFERS] = {0}; struct d3d11_device_context *context = impl_from_ID3D11DeviceContext1(iface); - unsigned int count, i; + unsigned int i;
TRACE("iface %p, buffer_count %u, buffers %p, offsets %p.\n", iface, buffer_count, buffers, offsets);
- count = min(buffer_count, D3D11_SO_BUFFER_SLOT_COUNT); - wined3d_mutex_lock(); - for (i = 0; i < count; ++i) + for (i = 0; i < buffer_count; ++i) { struct d3d_buffer *buffer = unsafe_impl_from_ID3D11Buffer(buffers[i]);
- wined3d_device_context_set_stream_output(context->wined3d_context, i, - buffer ? buffer->wined3d_buffer : NULL, offsets ? offsets[i] : 0); - } - for (; i < D3D11_SO_BUFFER_SLOT_COUNT; ++i) - { - wined3d_device_context_set_stream_output(context->wined3d_context, i, NULL, 0); + outputs[i].buffer = buffer ? buffer->wined3d_buffer : NULL; + outputs[i].offset = offsets ? offsets[i] : 0; } + + wined3d_mutex_lock(); + wined3d_device_context_set_stream_outputs(context->wined3d_context, outputs); wined3d_mutex_unlock(); }
@@ -4912,25 +4910,22 @@ static void STDMETHODCALLTYPE d3d10_device_OMSetDepthStencilState(ID3D10Device1 static void STDMETHODCALLTYPE d3d10_device_SOSetTargets(ID3D10Device1 *iface, UINT target_count, ID3D10Buffer *const *targets, const UINT *offsets) { + struct wined3d_stream_output outputs[WINED3D_MAX_STREAM_OUTPUT_BUFFERS] = {0}; struct d3d_device *device = impl_from_ID3D10Device(iface); - unsigned int count, i; + unsigned int i;
TRACE("iface %p, target_count %u, targets %p, offsets %p.\n", iface, target_count, targets, offsets);
- count = min(target_count, D3D10_SO_BUFFER_SLOT_COUNT); - wined3d_mutex_lock(); - for (i = 0; i < count; ++i) + for (i = 0; i < target_count; ++i) { struct d3d_buffer *buffer = unsafe_impl_from_ID3D10Buffer(targets[i]);
- wined3d_device_context_set_stream_output(device->immediate_context.wined3d_context, i, - buffer ? buffer->wined3d_buffer : NULL, offsets[i]); + outputs[i].buffer = buffer ? buffer->wined3d_buffer : NULL; + outputs[i].offset = offsets ? offsets[i] : 0; }
- for (i = count; i < D3D10_SO_BUFFER_SLOT_COUNT; ++i) - { - wined3d_device_context_set_stream_output(device->immediate_context.wined3d_context, i, NULL, 0); - } + wined3d_mutex_lock(); + wined3d_device_context_set_stream_outputs(device->immediate_context.wined3d_context, outputs); wined3d_mutex_unlock(); }
diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c index 5309484d3ed..76d8da4d2be 100644 --- a/dlls/wined3d/cs.c +++ b/dlls/wined3d/cs.c @@ -118,7 +118,7 @@ enum wined3d_cs_op WINED3D_CS_OP_SET_VERTEX_DECLARATION, WINED3D_CS_OP_SET_STREAM_SOURCE, WINED3D_CS_OP_SET_STREAM_SOURCE_FREQ, - WINED3D_CS_OP_SET_STREAM_OUTPUT, + WINED3D_CS_OP_SET_STREAM_OUTPUTS, WINED3D_CS_OP_SET_INDEX_BUFFER, WINED3D_CS_OP_SET_CONSTANT_BUFFERS, WINED3D_CS_OP_SET_TEXTURE, @@ -269,12 +269,10 @@ struct wined3d_cs_set_stream_source_freq UINT flags; };
-struct wined3d_cs_set_stream_output +struct wined3d_cs_set_stream_outputs { enum wined3d_cs_op opcode; - UINT stream_idx; - struct wined3d_buffer *buffer; - UINT offset; + struct wined3d_stream_output outputs[WINED3D_MAX_STREAM_OUTPUT_BUFFERS]; };
struct wined3d_cs_set_index_buffer @@ -603,7 +601,7 @@ static const char *debug_cs_op(enum wined3d_cs_op op) WINED3D_TO_STR(WINED3D_CS_OP_SET_VERTEX_DECLARATION); WINED3D_TO_STR(WINED3D_CS_OP_SET_STREAM_SOURCE); WINED3D_TO_STR(WINED3D_CS_OP_SET_STREAM_SOURCE_FREQ); - WINED3D_TO_STR(WINED3D_CS_OP_SET_STREAM_OUTPUT); + WINED3D_TO_STR(WINED3D_CS_OP_SET_STREAM_OUTPUTS); WINED3D_TO_STR(WINED3D_CS_OP_SET_INDEX_BUFFER); WINED3D_TO_STR(WINED3D_CS_OP_SET_CONSTANT_BUFFERS); WINED3D_TO_STR(WINED3D_CS_OP_SET_TEXTURE); @@ -1471,35 +1469,34 @@ void wined3d_cs_emit_set_stream_source_freq(struct wined3d_cs *cs, UINT stream_i wined3d_device_context_submit(&cs->c, WINED3D_CS_QUEUE_DEFAULT); }
-static void wined3d_cs_exec_set_stream_output(struct wined3d_cs *cs, const void *data) +static void wined3d_cs_exec_set_stream_outputs(struct wined3d_cs *cs, const void *data) { - const struct wined3d_cs_set_stream_output *op = data; - struct wined3d_stream_output *stream; - struct wined3d_buffer *prev; + const struct wined3d_cs_set_stream_outputs *op = data; + unsigned int i;
- stream = &cs->state.stream_output[op->stream_idx]; - prev = stream->buffer; - stream->buffer = op->buffer; - stream->offset = op->offset; + for (i = 0; i < WINED3D_MAX_STREAM_OUTPUT_BUFFERS; ++i) + { + struct wined3d_buffer *prev = cs->state.stream_output[i].buffer; + struct wined3d_buffer *buffer = op->outputs[i].buffer;
- if (op->buffer) - InterlockedIncrement(&op->buffer->resource.bind_count); - if (prev) - InterlockedDecrement(&prev->resource.bind_count); + if (buffer) + InterlockedIncrement(&buffer->resource.bind_count); + if (prev) + InterlockedDecrement(&prev->resource.bind_count); + }
+ memcpy(cs->state.stream_output, op->outputs, sizeof(op->outputs)); device_invalidate_state(cs->c.device, STATE_STREAM_OUTPUT); }
-void wined3d_device_context_emit_set_stream_output(struct wined3d_device_context *context, unsigned int stream_idx, - struct wined3d_buffer *buffer, unsigned int offset) +void wined3d_device_context_emit_set_stream_outputs(struct wined3d_device_context *context, + const struct wined3d_stream_output outputs[WINED3D_MAX_STREAM_OUTPUT_BUFFERS]) { - struct wined3d_cs_set_stream_output *op; + struct wined3d_cs_set_stream_outputs *op;
op = wined3d_device_context_require_space(context, sizeof(*op), WINED3D_CS_QUEUE_DEFAULT); - op->opcode = WINED3D_CS_OP_SET_STREAM_OUTPUT; - op->stream_idx = stream_idx; - op->buffer = buffer; - op->offset = offset; + op->opcode = WINED3D_CS_OP_SET_STREAM_OUTPUTS; + memcpy(op->outputs, outputs, sizeof(op->outputs));
wined3d_device_context_submit(context, WINED3D_CS_QUEUE_DEFAULT); } @@ -2941,7 +2938,7 @@ static void (* const wined3d_cs_op_handlers[])(struct wined3d_cs *cs, const void /* WINED3D_CS_OP_SET_VERTEX_DECLARATION */ wined3d_cs_exec_set_vertex_declaration, /* WINED3D_CS_OP_SET_STREAM_SOURCE */ wined3d_cs_exec_set_stream_source, /* WINED3D_CS_OP_SET_STREAM_SOURCE_FREQ */ wined3d_cs_exec_set_stream_source_freq, - /* WINED3D_CS_OP_SET_STREAM_OUTPUT */ wined3d_cs_exec_set_stream_output, + /* WINED3D_CS_OP_SET_STREAM_OUTPUTS */ wined3d_cs_exec_set_stream_outputs, /* WINED3D_CS_OP_SET_INDEX_BUFFER */ wined3d_cs_exec_set_index_buffer, /* WINED3D_CS_OP_SET_CONSTANT_BUFFERS */ wined3d_cs_exec_set_constant_buffers, /* WINED3D_CS_OP_SET_TEXTURE */ wined3d_cs_exec_set_texture, diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index dc75dbb3702..4e144c23900 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -1676,11 +1676,7 @@ void CDECL wined3d_device_context_set_state(struct wined3d_device_context *conte wined3d_device_context_emit_set_depth_stencil_view(context, state->fb.depth_stencil); wined3d_device_context_emit_set_vertex_declaration(context, state->vertex_declaration);
- for (i = 0; i < WINED3D_MAX_STREAM_OUTPUT_BUFFERS; ++i) - { - wined3d_device_context_emit_set_stream_output(context, i, - state->stream_output[i].buffer, state->stream_output[i].offset); - } + wined3d_device_context_emit_set_stream_outputs(context, state->stream_output);
for (i = 0; i < WINED3D_MAX_STREAMS; ++i) { @@ -2334,30 +2330,26 @@ void CDECL wined3d_device_context_set_vertex_declaration(struct wined3d_device_c wined3d_vertex_declaration_decref(prev); }
-void CDECL wined3d_device_context_set_stream_output(struct wined3d_device_context *context, unsigned int idx, - struct wined3d_buffer *buffer, unsigned int offset) +void CDECL wined3d_device_context_set_stream_outputs(struct wined3d_device_context *context, + const struct wined3d_stream_output outputs[WINED3D_MAX_STREAM_OUTPUT_BUFFERS]) { - struct wined3d_stream_output *stream; - struct wined3d_buffer *prev_buffer; + struct wined3d_state *state = context->state; + unsigned int i;
- TRACE("context %p, idx %u, buffer %p, offset %u.\n", context, idx, buffer, offset); + TRACE("context %p, outputs %p.\n", context, outputs);
- if (idx >= WINED3D_MAX_STREAM_OUTPUT_BUFFERS) + wined3d_device_context_emit_set_stream_outputs(context, outputs); + for (i = 0; i < WINED3D_MAX_STREAM_OUTPUT_BUFFERS; ++i) { - WARN("Invalid stream output %u.\n", idx); - return; + struct wined3d_buffer *prev_buffer = state->stream_output[i].buffer; + struct wined3d_buffer *buffer = outputs[i].buffer; + + if (buffer) + wined3d_buffer_incref(buffer); + state->stream_output[i] = outputs[i]; + if (prev_buffer) + wined3d_buffer_decref(prev_buffer); } - - stream = &context->state->stream_output[idx]; - prev_buffer = stream->buffer; - - if (buffer) - wined3d_buffer_incref(buffer); - stream->buffer = buffer; - stream->offset = offset; - wined3d_device_context_emit_set_stream_output(context, idx, buffer, offset); - if (prev_buffer) - wined3d_buffer_decref(prev_buffer); }
void CDECL wined3d_device_context_draw(struct wined3d_device_context *context, unsigned int start_vertex, diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec index 13c8b218b65..ccd941af7a7 100644 --- a/dlls/wined3d/wined3d.spec +++ b/dlls/wined3d/wined3d.spec @@ -136,7 +136,7 @@ @ cdecl wined3d_device_context_set_shader(ptr long ptr) @ cdecl wined3d_device_context_set_shader_resource_views(ptr long long long ptr) @ cdecl wined3d_device_context_set_state(ptr ptr) -@ cdecl wined3d_device_context_set_stream_output(ptr long ptr long) +@ cdecl wined3d_device_context_set_stream_outputs(ptr ptr) @ cdecl wined3d_device_context_set_stream_source(ptr long ptr long long) @ cdecl wined3d_device_context_set_unordered_access_views(ptr long long long ptr ptr) @ cdecl wined3d_device_context_set_vertex_declaration(ptr ptr) diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index f08785be646..85a7cd5a1b3 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -3660,12 +3660,6 @@ struct wined3d_rasterizer_state struct wine_rb_entry entry; };
-struct wined3d_stream_output -{ - struct wined3d_buffer *buffer; - UINT offset; -}; - #define LIGHTMAP_SIZE 43 #define LIGHTMAP_HASHFUNC(x) ((x) % LIGHTMAP_SIZE)
@@ -4845,8 +4839,8 @@ void wined3d_device_context_emit_set_shader(struct wined3d_device_context *conte void wined3d_device_context_emit_set_shader_resource_views(struct wined3d_device_context *context, enum wined3d_shader_type type, unsigned int start_idx, unsigned int count, struct wined3d_shader_resource_view *const *views) DECLSPEC_HIDDEN; -void wined3d_device_context_emit_set_stream_output(struct wined3d_device_context *context, unsigned int stream_idx, - struct wined3d_buffer *buffer, unsigned int offset) DECLSPEC_HIDDEN; +void wined3d_device_context_emit_set_stream_outputs(struct wined3d_device_context *context, + const struct wined3d_stream_output outputs[WINED3D_MAX_STREAM_OUTPUT_BUFFERS]) DECLSPEC_HIDDEN; void wined3d_device_context_emit_set_stream_source(struct wined3d_device_context *context, unsigned int stream_idx, struct wined3d_buffer *buffer, unsigned int offset, unsigned int stride) DECLSPEC_HIDDEN; void wined3d_device_context_emit_set_texture(struct wined3d_device_context *context, unsigned int stage, diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index ac197782f72..06e1cf74d08 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -2212,6 +2212,12 @@ struct wined3d_stateblock_state struct wined3d_light_state *light_state; };
+struct wined3d_stream_output +{ + struct wined3d_buffer *buffer; + unsigned int offset; +}; + struct wined3d_parent_ops { void (__stdcall *wined3d_object_destroyed)(void *parent); @@ -2523,8 +2529,8 @@ void __cdecl wined3d_device_context_set_shader_resource_views(struct wined3d_dev enum wined3d_shader_type type, unsigned int start_idx, unsigned int count, struct wined3d_shader_resource_view *const *views); void __cdecl wined3d_device_context_set_state(struct wined3d_device_context *context, struct wined3d_state *state); -void __cdecl wined3d_device_context_set_stream_output(struct wined3d_device_context *context, unsigned int idx, - struct wined3d_buffer *buffer, unsigned int offset); +void __cdecl wined3d_device_context_set_stream_outputs(struct wined3d_device_context *context, + const struct wined3d_stream_output outputs[WINED3D_MAX_STREAM_OUTPUT_BUFFERS]); HRESULT __cdecl wined3d_device_context_set_stream_source(struct wined3d_device_context *context, unsigned int stream_idx, struct wined3d_buffer *buffer, unsigned int offset, unsigned int stride); void __cdecl wined3d_device_context_set_unordered_access_views(struct wined3d_device_context *context,
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=93671
Your paranoid android.
=== debiant2 (build log) ===
error: patch failed: dlls/ntoskrnl.exe/tests/Makefile.in:13 Task: Patch failed to apply
=== debiant2 (build log) ===
error: patch failed: dlls/ntoskrnl.exe/tests/Makefile.in:13 Task: Patch failed to apply
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=93667
Your paranoid android.
=== build (build log) ===
error: patch failed: dlls/ntoskrnl.exe/tests/Makefile.in:13 Task: Patch failed to apply
=== debiant2 (build log) ===
error: patch failed: dlls/ntoskrnl.exe/tests/Makefile.in:13 Task: Patch failed to apply
=== debiant2 (build log) ===
error: patch failed: dlls/ntoskrnl.exe/tests/Makefile.in:13 Task: Patch failed to apply