Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/wined3d/device.c | 93 +++++++++++++++++++++++++++++++++++++++ dlls/wined3d/wined3d.spec | 1 + include/wine/wined3d.h | 1 + 3 files changed, 95 insertions(+)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index 0ae841d4e35..50029dfbec2 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -3829,6 +3829,99 @@ struct wined3d_texture * CDECL wined3d_device_get_texture(const struct wined3d_d return device->state.textures[stage]; }
+void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device, + struct wined3d_stateblock *stateblock) +{ + const struct wined3d_d3d_info *d3d_info = &stateblock->device->adapter->d3d_info; + const struct wined3d_stateblock_state *state = &stateblock->stateblock_state; + unsigned int i, j; + + TRACE("device %p, stateblock %p.\n", device, stateblock); + + wined3d_stateblock_init_contained_states(stateblock); + + wined3d_device_set_vertex_shader(device, state->vs); + wined3d_device_set_pixel_shader(device, state->ps); + + for (i = 0; i < d3d_info->limits.vs_uniform_count; ++i) + wined3d_device_set_vs_consts_f(device, i, 1, &state->vs_consts_f[i]); + for (i = 0; i < ARRAY_SIZE(state->vs_consts_i); ++i) + wined3d_device_set_vs_consts_i(device, i, 1, &state->vs_consts_i[i]); + for (i = 0; i < ARRAY_SIZE(state->vs_consts_b); ++i) + wined3d_device_set_vs_consts_b(device, i, 1, &state->vs_consts_b[i]); + + for (i = 0; i < ARRAY_SIZE(state->ps_consts_f); ++i) + wined3d_device_set_ps_consts_f(device, i, 1, &state->ps_consts_f[i]); + for (i = 0; i < ARRAY_SIZE(state->ps_consts_i); ++i) + wined3d_device_set_ps_consts_i(device, i, 1, &state->ps_consts_i[i]); + for (i = 0; i < ARRAY_SIZE(state->ps_consts_b); ++i) + wined3d_device_set_ps_consts_b(device, i, 1, &state->ps_consts_b[i]); + + for (i = 0; i < ARRAY_SIZE(state->light_state->light_map); ++i) + { + const struct wined3d_light_info *light; + + LIST_FOR_EACH_ENTRY(light, &state->light_state->light_map[i], struct wined3d_light_info, entry) + { + wined3d_device_set_light(device, light->OriginalIndex, &light->OriginalParms); + wined3d_device_set_light_enable(device, light->OriginalIndex, light->glIndex != -1); + } + } + + for (i = 0; i < ARRAY_SIZE(state->rs); ++i) + { + if (i == WINED3D_RS_BLENDFACTOR) + { + struct wined3d_color color; + wined3d_color_from_d3dcolor(&color, state->rs[i]); + wined3d_device_set_blend_state(device, NULL, &color); + } + else + wined3d_device_set_render_state(device, i, state->rs[i]); + } + + for (i = 0; i < ARRAY_SIZE(state->texture_states); ++i) + { + for (j = 0; j < ARRAY_SIZE(state->texture_states[i]); ++j) + wined3d_device_set_texture_stage_state(device, i, j, state->texture_states[i][j]); + } + + for (i = 0; i < ARRAY_SIZE(state->sampler_states); ++i) + { + DWORD stage = i; + if (stage >= WINED3D_MAX_FRAGMENT_SAMPLERS) stage += WINED3DVERTEXTEXTURESAMPLER0 - WINED3D_MAX_FRAGMENT_SAMPLERS; + for (j = 0; j < ARRAY_SIZE(state->sampler_states[j]); ++j) + wined3d_device_set_sampler_state(device, stage, j, state->sampler_states[i][j]); + } + + for (i = 0; i < ARRAY_SIZE(state->transforms); ++i) + wined3d_device_set_transform(device, i, &state->transforms[i]); + + wined3d_device_set_index_buffer(device, state->index_buffer, state->index_format, 0); + wined3d_device_set_base_vertex_index(device, state->base_vertex_index); + wined3d_device_set_vertex_declaration(device, state->vertex_declaration); + wined3d_device_set_material(device, &state->material); + wined3d_device_set_viewports(device, 1, &state->viewport); + wined3d_device_set_scissor_rects(device, 1, &state->scissor_rect); + + for (i = 0; i < ARRAY_SIZE(state->streams); ++i) + { + wined3d_device_set_stream_source(device, i, state->streams[i].buffer, + state->streams[i].offset, state->streams[i].stride); + wined3d_device_set_stream_source_freq(device, i, + state->streams[i].frequency | state->streams[i].flags); + } + + for (i = 0; i < ARRAY_SIZE(state->textures); ++i) + wined3d_device_set_texture(device, i < WINED3D_MAX_FRAGMENT_SAMPLERS ? i + : WINED3DVERTEXTEXTURESAMPLER0 + i - WINED3D_MAX_FRAGMENT_SAMPLERS, state->textures[i]); + + for (i = 0; i < ARRAY_SIZE(state->clip_planes); ++i) + wined3d_device_set_clip_plane(device, i, &state->clip_planes[i]); + + TRACE("Applied stateblock %p.\n", stateblock); +} + HRESULT CDECL wined3d_device_get_device_caps(const struct wined3d_device *device, struct wined3d_caps *caps) { TRACE("device %p, caps %p.\n", device, caps); diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec index e03c57055b7..c8ef442c72d 100644 --- a/dlls/wined3d/wined3d.spec +++ b/dlls/wined3d/wined3d.spec @@ -37,6 +37,7 @@ @ cdecl wined3d_buffer_incref(ptr)
@ cdecl wined3d_device_acquire_focus_window(ptr ptr) +@ cdecl wined3d_device_apply_stateblock(ptr ptr) @ cdecl wined3d_device_begin_scene(ptr) @ cdecl wined3d_device_clear(ptr long ptr long ptr float long) @ cdecl wined3d_device_clear_rendertarget_view(ptr ptr ptr long ptr float long) diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index 4b5d4e02f9b..a6eaaca468c 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -2287,6 +2287,7 @@ struct wined3d_resource * __cdecl wined3d_buffer_get_resource(struct wined3d_buf ULONG __cdecl wined3d_buffer_incref(struct wined3d_buffer *buffer);
HRESULT __cdecl wined3d_device_acquire_focus_window(struct wined3d_device *device, HWND window); +void __cdecl wined3d_device_apply_stateblock(struct wined3d_device *device, struct wined3d_stateblock *stateblock); HRESULT __cdecl wined3d_device_begin_scene(struct wined3d_device *device); HRESULT __cdecl wined3d_device_clear(struct wined3d_device *device, DWORD rect_count, const RECT *rects, DWORD flags, const struct wined3d_color *color, float z, DWORD stencil);
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/d3d9/device.c | 9 +++++++++ 1 file changed, 9 insertions(+)
diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c index 82fba25ce73..be9c2a9d5a1 100644 --- a/dlls/d3d9/device.c +++ b/dlls/d3d9/device.c @@ -1821,6 +1821,7 @@ static HRESULT WINAPI d3d9_device_ColorFill(IDirect3DDevice9Ex *iface, return D3DERR_INVALIDCALL; }
+ wined3d_device_apply_stateblock(device->wined3d_device, device->state); rtv = d3d9_surface_acquire_rendertarget_view(surface_impl); hr = wined3d_device_clear_rendertarget_view(device->wined3d_device, rtv, rect, WINED3DCLEAR_TARGET, &c, 0.0f, 0); @@ -2071,6 +2072,7 @@ static HRESULT WINAPI d3d9_device_Clear(IDirect3DDevice9Ex *iface, DWORD rect_co
wined3d_color_from_d3dcolor(&c, color); wined3d_mutex_lock(); + wined3d_device_apply_stateblock(device->wined3d_device, device->state); hr = wined3d_device_clear(device->wined3d_device, rect_count, (const RECT *)rects, flags, &c, z, stencil); if (SUCCEEDED(hr)) d3d9_rts_flag_auto_gen_mipmap(device); @@ -2654,6 +2656,7 @@ static HRESULT WINAPI d3d9_device_ValidateDevice(IDirect3DDevice9Ex *iface, DWOR TRACE("iface %p, pass_count %p.\n", iface, pass_count);
wined3d_mutex_lock(); + wined3d_device_apply_stateblock(device->wined3d_device, device->state); hr = wined3d_device_validate_device(device->wined3d_device, pass_count); wined3d_mutex_unlock();
@@ -2885,6 +2888,7 @@ static HRESULT WINAPI d3d9_device_DrawPrimitive(IDirect3DDevice9Ex *iface, WARN("Called without a valid vertex declaration set.\n"); return D3DERR_INVALIDCALL; } + wined3d_device_apply_stateblock(device->wined3d_device, device->state); vertex_count = vertex_count_from_primitive_count(primitive_type, primitive_count); d3d9_device_upload_sysmem_vertex_buffers(device, 0, start_vertex, vertex_count); d3d9_generate_auto_mipmaps(device); @@ -2917,6 +2921,7 @@ static HRESULT WINAPI d3d9_device_DrawIndexedPrimitive(IDirect3DDevice9Ex *iface WARN("Called without a valid vertex declaration set.\n"); return D3DERR_INVALIDCALL; } + wined3d_device_apply_stateblock(device->wined3d_device, device->state); index_count = vertex_count_from_primitive_count(primitive_type, primitive_count); d3d9_device_upload_sysmem_vertex_buffers(device, base_vertex_idx, min_vertex_idx, vertex_count); d3d9_device_upload_sysmem_index_buffer(device, start_idx, index_count); @@ -3003,6 +3008,7 @@ static HRESULT WINAPI d3d9_device_DrawPrimitiveUP(IDirect3DDevice9Ex *iface, return D3DERR_INVALIDCALL; }
+ wined3d_device_apply_stateblock(device->wined3d_device, device->state); hr = d3d9_device_prepare_vertex_buffer(device, size); if (FAILED(hr)) goto done; @@ -3119,6 +3125,7 @@ static HRESULT WINAPI d3d9_device_DrawIndexedPrimitiveUP(IDirect3DDevice9Ex *ifa return D3DERR_INVALIDCALL; }
+ wined3d_device_apply_stateblock(device->wined3d_device, device->state); hr = d3d9_device_prepare_vertex_buffer(device, vtx_size); if (FAILED(hr)) goto done; @@ -3203,6 +3210,8 @@ static HRESULT WINAPI d3d9_device_ProcessVertices(IDirect3DDevice9Ex *iface,
wined3d_mutex_lock();
+ wined3d_device_apply_stateblock(device->wined3d_device, device->state); + /* Note that an alternative approach would be to simply create these * buffers with WINED3D_RESOURCE_ACCESS_MAP_R and update them here like we * do for draws. In some regards that would be easier, but it seems less
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=61571
Your paranoid android.
=== debian10 (32 bit report) ===
d3d9: Unhandled exception: page fault on read access to 0x00000000 in 32-bit code (0x7e8611a4).
Report errors: d3d9:visual crashed (c0000005)
=== debian10 (32 bit Chinese:China report) ===
d3d9: Unhandled exception: page fault on read access to 0x00000000 in 32-bit code (0x7eadb1a4).
Report errors: d3d9:visual crashed (c0000005)
=== debian10 (32 bit WoW report) ===
d3d9: Unhandled exception: page fault on read access to 0x00000000 in 32-bit code (0x7e8611a4).
Report errors: d3d9:visual crashed (c0000005)
=== debian10 (64 bit WoW report) ===
d3d9: Unhandled exception: page fault on read access to 0x00000000 in 32-bit code (0x7e85e738).
Report errors: d3d9:visual crashed (c0000005)
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/d3d9/device.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+)
diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c index be9c2a9d5a1..35364046936 100644 --- a/dlls/d3d9/device.c +++ b/dlls/d3d9/device.c @@ -2299,6 +2299,34 @@ static HRESULT WINAPI d3d9_device_GetClipPlane(IDirect3DDevice9Ex *iface, DWORD return hr; }
+static void resolve_depth_buffer(struct d3d9_device *device) +{ + const struct wined3d_stateblock_state *state = wined3d_stateblock_get_state(device->state); + struct wined3d_rendertarget_view *wined3d_dsv; + struct wined3d_resource *dst_resource; + struct wined3d_texture *dst_texture; + struct wined3d_resource_desc desc; + struct d3d9_surface *d3d9_dsv; + + if (!(dst_texture = state->textures[0])) + return; + dst_resource = wined3d_texture_get_resource(dst_texture); + wined3d_resource_get_desc(dst_resource, &desc); + if (desc.format != WINED3DFMT_D24_UNORM_S8_UINT + && desc.format != WINED3DFMT_X8D24_UNORM + && desc.format != MAKEFOURCC('D','F','1','6') + && desc.format != MAKEFOURCC('D','F','2','4') + && desc.format != WINED3DFMT_INTZ) + return; + + if (!(wined3d_dsv = wined3d_device_get_depth_stencil_view(device->wined3d_device))) + return; + d3d9_dsv = wined3d_rendertarget_view_get_sub_resource_parent(wined3d_dsv); + + wined3d_device_resolve_sub_resource(device->wined3d_device, dst_resource, 0, + wined3d_rendertarget_view_get_resource(wined3d_dsv), d3d9_dsv->sub_resource_idx, desc.format); +} + static HRESULT WINAPI DECLSPEC_HOTPATCH d3d9_device_SetRenderState(IDirect3DDevice9Ex *iface, D3DRENDERSTATETYPE state, DWORD value) { @@ -2319,6 +2347,8 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH d3d9_device_SetRenderState(IDirect3DDevi else wined3d_device_set_render_state(device->wined3d_device, state, value); } + if (state == D3DRS_POINTSIZE && value == WINED3D_RESZ_CODE) + resolve_depth_buffer(device); wined3d_mutex_unlock();
return D3D_OK;
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=61572
Your paranoid android.
=== debian10 (32 bit report) ===
d3d9: Unhandled exception: page fault on read access to 0x00000000 in 32-bit code (0x7e8611a4).
Report errors: d3d9:visual crashed (c0000005)
=== debian10 (32 bit Chinese:China report) ===
d3d9: Unhandled exception: page fault on read access to 0x00000000 in 32-bit code (0x7ead8738).
Report errors: d3d9:visual crashed (c0000005)
=== debian10 (32 bit WoW report) ===
d3d9: Unhandled exception: page fault on read access to 0x00000000 in 32-bit code (0x7e8611a4).
Report errors: d3d9:visual crashed (c0000005)
=== debian10 (64 bit WoW report) ===
d3d9: Unhandled exception: page fault on read access to 0x00000000 in 32-bit code (0x7e85e738).
Report errors: d3d9:visual crashed (c0000005)
On Sat, 7 Dec 2019 at 19:41, Zebediah Figura z.figura12@gmail.com wrote:
+static void resolve_depth_buffer(struct d3d9_device *device) +{
- const struct wined3d_stateblock_state *state = wined3d_stateblock_get_state(device->state);
- struct wined3d_rendertarget_view *wined3d_dsv;
- struct wined3d_resource *dst_resource;
- struct wined3d_texture *dst_texture;
- struct wined3d_resource_desc desc;
- struct d3d9_surface *d3d9_dsv;
- if (!(dst_texture = state->textures[0]))
return;
- dst_resource = wined3d_texture_get_resource(dst_texture);
- wined3d_resource_get_desc(dst_resource, &desc);
- if (desc.format != WINED3DFMT_D24_UNORM_S8_UINT
&& desc.format != WINED3DFMT_X8D24_UNORM
&& desc.format != MAKEFOURCC('D','F','1','6')
&& desc.format != MAKEFOURCC('D','F','2','4')
&& desc.format != WINED3DFMT_INTZ)
return;
- if (!(wined3d_dsv = wined3d_device_get_depth_stencil_view(device->wined3d_device)))
return;
- d3d9_dsv = wined3d_rendertarget_view_get_sub_resource_parent(wined3d_dsv);
- wined3d_device_resolve_sub_resource(device->wined3d_device, dst_resource, 0,
wined3d_rendertarget_view_get_resource(wined3d_dsv), d3d9_dsv->sub_resource_idx, desc.format);
+}
If we're going to implement this in d3d9 (but note that the feature is supported by d3d8 as well), it would be best to implement the corresponding feature query in d3d9 instead of wined3d as well.
Note that you can't (currently) create DF16/24 resources. Checking for those isn't necessarily an issue, but in that case please just add en entry for them to the wined3d_format_id enumeration.
On 12/10/19 8:38 AM, Henri Verbeet wrote:
On Sat, 7 Dec 2019 at 19:41, Zebediah Figura z.figura12@gmail.com wrote:
+static void resolve_depth_buffer(struct d3d9_device *device) +{
- const struct wined3d_stateblock_state *state = wined3d_stateblock_get_state(device->state);
- struct wined3d_rendertarget_view *wined3d_dsv;
- struct wined3d_resource *dst_resource;
- struct wined3d_texture *dst_texture;
- struct wined3d_resource_desc desc;
- struct d3d9_surface *d3d9_dsv;
- if (!(dst_texture = state->textures[0]))
return;
- dst_resource = wined3d_texture_get_resource(dst_texture);
- wined3d_resource_get_desc(dst_resource, &desc);
- if (desc.format != WINED3DFMT_D24_UNORM_S8_UINT
&& desc.format != WINED3DFMT_X8D24_UNORM
&& desc.format != MAKEFOURCC('D','F','1','6')
&& desc.format != MAKEFOURCC('D','F','2','4')
&& desc.format != WINED3DFMT_INTZ)
return;
- if (!(wined3d_dsv = wined3d_device_get_depth_stencil_view(device->wined3d_device)))
return;
- d3d9_dsv = wined3d_rendertarget_view_get_sub_resource_parent(wined3d_dsv);
- wined3d_device_resolve_sub_resource(device->wined3d_device, dst_resource, 0,
wined3d_rendertarget_view_get_resource(wined3d_dsv), d3d9_dsv->sub_resource_idx, desc.format);
+}
If we're going to implement this in d3d9 (but note that the feature is supported by d3d8 as well), it would be best to implement the corresponding feature query in d3d9 instead of wined3d as well.
Right, I have patches for d3d8 too; I was just taking care of one module at a time.
Anyway, I'll move the feature query too, thanks.
On the other hand, if exposing a single helper from wined3d is preferable, I'm happy to take that approach instead. (Or doing it in wined3d_stateblock_set_render_state(), but that feels a little awkward to me.)
Note that you can't (currently) create DF16/24 resources. Checking for those isn't necessarily an issue, but in that case please just add en entry for them to the wined3d_format_id enumeration.
Sure, will do.
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/d3d9/device.c | 11 ----------- 1 file changed, 11 deletions(-)
diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c index 35364046936..54271240e11 100644 --- a/dlls/d3d9/device.c +++ b/dlls/d3d9/device.c @@ -2331,22 +2331,11 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH d3d9_device_SetRenderState(IDirect3DDevi D3DRENDERSTATETYPE state, DWORD value) { struct d3d9_device *device = impl_from_IDirect3DDevice9Ex(iface); - struct wined3d_color factor;
TRACE("iface %p, state %#x, value %#x.\n", iface, state, value);
wined3d_mutex_lock(); wined3d_stateblock_set_render_state(device->update_state, state, value); - if (!device->recording) - { - if (state == D3DRS_BLENDFACTOR) - { - wined3d_color_from_d3dcolor(&factor, value); - wined3d_device_set_blend_state(device->wined3d_device, NULL, &factor); - } - else - wined3d_device_set_render_state(device->wined3d_device, state, value); - } if (state == D3DRS_POINTSIZE && value == WINED3D_RESZ_CODE) resolve_depth_buffer(device); wined3d_mutex_unlock();
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=61573
Your paranoid android.
=== debian10 (32 bit report) ===
d3d9: Unhandled exception: page fault on read access to 0x00000000 in 32-bit code (0x7e85e738).
Report errors: d3d9:visual crashed (c0000005)
=== debian10 (32 bit Chinese:China report) ===
d3d9: Unhandled exception: page fault on read access to 0x00000000 in 32-bit code (0x7ead8738).
Report errors: d3d9:visual crashed (c0000005)
=== debian10 (32 bit WoW report) ===
d3d9: Unhandled exception: page fault on read access to 0x00000000 in 32-bit code (0x7e85e738).
Report errors: d3d9:visual crashed (c0000005)
=== debian10 (64 bit WoW report) ===
d3d9: Unhandled exception: page fault on read access to 0x00000000 in 32-bit code (0x7e8e4c70).
Report errors: d3d9:visual crashed (c0000005)
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/d3d9/device.c | 4 ---- 1 file changed, 4 deletions(-)
diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c index 54271240e11..a45f4baa21b 100644 --- a/dlls/d3d9/device.c +++ b/dlls/d3d9/device.c @@ -1020,8 +1020,6 @@ static HRESULT d3d9_device_reset(struct d3d9_device *device, device->auto_mipmaps = 0; wined3d_stateblock_set_render_state(device->state, WINED3D_RS_ZENABLE, !!swapchain_desc.enable_auto_depth_stencil); - wined3d_device_set_render_state(device->wined3d_device, WINED3D_RS_ZENABLE, - !!swapchain_desc.enable_auto_depth_stencil); device_reset_viewport_state(device); }
@@ -4673,8 +4671,6 @@ HRESULT device_init(struct d3d9_device *device, struct d3d9 *parent, struct wine
wined3d_stateblock_set_render_state(device->state, WINED3D_RS_ZENABLE, !!swapchain_desc->enable_auto_depth_stencil); - wined3d_device_set_render_state(device->wined3d_device, - WINED3D_RS_ZENABLE, !!swapchain_desc->enable_auto_depth_stencil); device_reset_viewport_state(device);
if (FAILED(hr = d3d9_device_get_swapchains(device)))
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=61574
Your paranoid android.
=== debian10 (32 bit report) ===
d3d9: Unhandled exception: page fault on read access to 0x00000000 in 32-bit code (0x7e8611a4).
Report errors: d3d9:visual crashed (c0000005)
=== debian10 (32 bit Chinese:China report) ===
d3d9: Unhandled exception: page fault on read access to 0x00000000 in 32-bit code (0x7ead8738).
Report errors: d3d9:visual crashed (c0000005)
=== debian10 (32 bit WoW report) ===
d3d9: Unhandled exception: page fault on read access to 0x00000000 in 32-bit code (0x7e85e738).
Report errors: d3d9:visual crashed (c0000005)
=== debian10 (64 bit WoW report) ===
d3d9: Unhandled exception: page fault on read access to 0x00000000 in 32-bit code (0x7e85e738).
Report errors: d3d9:visual crashed (c0000005)
On Sat, Dec 7, 2019 at 5:11 PM Zebediah Figura z.figura12@gmail.com wrote:
Signed-off-by: Zebediah Figura z.figura12@gmail.com
dlls/wined3d/device.c | 93 +++++++++++++++++++++++++++++++++++++++ dlls/wined3d/wined3d.spec | 1 + include/wine/wined3d.h | 1 + 3 files changed, 95 insertions(+)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index 0ae841d4e35..50029dfbec2 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -3829,6 +3829,99 @@ struct wined3d_texture * CDECL wined3d_device_get_texture(const struct wined3d_d return device->state.textures[stage]; }
+void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device,
struct wined3d_stateblock *stateblock)
+{
- const struct wined3d_d3d_info *d3d_info = &stateblock->device->adapter->d3d_info;
- const struct wined3d_stateblock_state *state = &stateblock->stateblock_state;
- unsigned int i, j;
- TRACE("device %p, stateblock %p.\n", device, stateblock);
- wined3d_stateblock_init_contained_states(stateblock);
- wined3d_device_set_vertex_shader(device, state->vs);
- wined3d_device_set_pixel_shader(device, state->ps);
Can we make use of the stateblock flags to only update the changed states instead of all of them?
- for (i = 0; i < d3d_info->limits.vs_uniform_count; ++i)
wined3d_device_set_vs_consts_f(device, i, 1, &state->vs_consts_f[i]);
Either only update the changed constants or set all of them in one go, IMO.
Somewhat related, I have a few patches optimizing / improving our handling of those flags but I don't expect them to be ready before code freeze (and I don't want to conflict with your patches, especially now).
On 12/10/19 2:39 AM, Matteo Bruni wrote:
On Sat, Dec 7, 2019 at 5:11 PM Zebediah Figura z.figura12@gmail.com wrote:
Signed-off-by: Zebediah Figura z.figura12@gmail.com
dlls/wined3d/device.c | 93 +++++++++++++++++++++++++++++++++++++++ dlls/wined3d/wined3d.spec | 1 + include/wine/wined3d.h | 1 + 3 files changed, 95 insertions(+)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index 0ae841d4e35..50029dfbec2 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -3829,6 +3829,99 @@ struct wined3d_texture * CDECL wined3d_device_get_texture(const struct wined3d_d return device->state.textures[stage]; }
+void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device,
struct wined3d_stateblock *stateblock)
+{
- const struct wined3d_d3d_info *d3d_info = &stateblock->device->adapter->d3d_info;
- const struct wined3d_stateblock_state *state = &stateblock->stateblock_state;
- unsigned int i, j;
- TRACE("device %p, stateblock %p.\n", device, stateblock);
- wined3d_stateblock_init_contained_states(stateblock);
- wined3d_device_set_vertex_shader(device, state->vs);
- wined3d_device_set_pixel_shader(device, state->ps);
Can we make use of the stateblock flags to only update the changed states instead of all of them?
I think so. I mostly didn't do it because it was less code, but it's probably worth not making lots of redundant calls to wined3d_device_set_*().
- for (i = 0; i < d3d_info->limits.vs_uniform_count; ++i)
wined3d_device_set_vs_consts_f(device, i, 1, &state->vs_consts_f[i]);
Either only update the changed constants or set all of them in one go, IMO.
...good point :D
Somewhat related, I have a few patches optimizing / improving our handling of those flags but I don't expect them to be ready before code freeze (and I don't want to conflict with your patches, especially now).