Signed-off-by: Zebediah Figura z.figura12@gmail.com --- v2: Push all shader constants in one call, and make use of stateblock changed-state tracking for all other states, as per Matteo's suggestion.
dlls/wined3d/device.c | 116 ++++++++++++++++++++++++++++++++++++++ dlls/wined3d/wined3d.spec | 1 + include/wine/wined3d.h | 1 + 3 files changed, 118 insertions(+)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index 8913420724..acc915eb55 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -3829,6 +3829,122 @@ 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); + + if (stateblock->changed.vertexShader) + wined3d_device_set_vertex_shader(device, state->vs); + if (stateblock->changed.pixelShader) + wined3d_device_set_pixel_shader(device, state->ps); + + wined3d_device_set_vs_consts_f(device, 0, d3d_info->limits.vs_uniform_count, state->vs_consts_f); + wined3d_device_set_vs_consts_b(device, 0, WINED3D_MAX_CONSTS_B, state->vs_consts_b); + wined3d_device_set_vs_consts_i(device, 0, WINED3D_MAX_CONSTS_I, state->vs_consts_i); + wined3d_device_set_ps_consts_f(device, 0, d3d_info->limits.ps_uniform_count, state->ps_consts_f); + wined3d_device_set_ps_consts_b(device, 0, WINED3D_MAX_CONSTS_B, state->ps_consts_b); + wined3d_device_set_ps_consts_i(device, 0, WINED3D_MAX_CONSTS_I, state->ps_consts_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 (stateblock->changed.renderState[i >> 5] & (1u << (i & 0x1f))) + { + 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) + { + if (stateblock->changed.textureState[i] & (1u << 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) + { + if (stateblock->changed.samplerState[i] & (1 << j)) + wined3d_device_set_sampler_state(device, stage, j, state->sampler_states[i][j]); + } + } + + for (i = 0; i < ARRAY_SIZE(state->transforms); ++i) + { + if (stateblock->changed.transform[i >> 5] & (1u << (i & 0x1f))) + wined3d_device_set_transform(device, i, &state->transforms[i]); + } + + if (stateblock->changed.indices) + wined3d_device_set_index_buffer(device, state->index_buffer, state->index_format, 0); + wined3d_device_set_base_vertex_index(device, state->base_vertex_index); + if (stateblock->changed.vertexDecl) + wined3d_device_set_vertex_declaration(device, state->vertex_declaration); + if (stateblock->changed.material) + wined3d_device_set_material(device, &state->material); + if (stateblock->changed.viewport) + wined3d_device_set_viewports(device, 1, &state->viewport); + if (stateblock->changed.scissorRect) + wined3d_device_set_scissor_rects(device, 1, &state->scissor_rect); + + for (i = 0; i < ARRAY_SIZE(state->streams); ++i) + { + if (stateblock->changed.streamSource & (1u << i)) + wined3d_device_set_stream_source(device, i, state->streams[i].buffer, + state->streams[i].offset, state->streams[i].stride); + if (stateblock->changed.streamFreq & (1u << i)) + 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) + { + DWORD stage = i; + if (stage >= WINED3D_MAX_FRAGMENT_SAMPLERS) + stage += WINED3DVERTEXTEXTURESAMPLER0 - WINED3D_MAX_FRAGMENT_SAMPLERS; + if (stateblock->changed.textures & (1u << i)) + wined3d_device_set_texture(device, stage, state->textures[i]); + } + + for (i = 0; i < ARRAY_SIZE(state->clip_planes); ++i) + { + if (stateblock->changed.clipplane & (1u << i)) + wined3d_device_set_clip_plane(device, i, &state->clip_planes[i]); + } + + memset(&stateblock->changed, 0, sizeof(stateblock->changed)); + + 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 e03c57055b..c8ef442c72 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 db88e11032..8951f92d14 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -2288,6 +2288,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 82fba25ce7..be9c2a9d5a 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
On Wed, Dec 11, 2019 at 4:46 AM Zebediah Figura z.figura12@gmail.com wrote:
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 82fba25ce7..be9c2a9d5a 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
-- 2.24.0
FWIW, this looks more like it. We might want to improve wined3d_device_apply_stateblock() before switching to it for all the <= d3d9 applications to avoid performance regressions (if there are). As an added benefit it might also help applications explicitly using stateblocks. I have some WIP patches in the area.
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- v2: Expose a common helper in wined3d to be used for d3d9 and d3d8, and also move the check for format support to d3d9_CheckDeviceFormat().
dlls/d3d9/device.c | 2 ++ dlls/d3d9/directx.c | 14 ++++++++++++-- dlls/wined3d/device.c | 4 ++-- dlls/wined3d/wined3d.spec | 1 + include/wine/wined3d.h | 1 + 5 files changed, 18 insertions(+), 4 deletions(-)
diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c index be9c2a9d5a..d949fd89b2 100644 --- a/dlls/d3d9/device.c +++ b/dlls/d3d9/device.c @@ -2319,6 +2319,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) + wined3d_device_resolve_depth_buffer(device->wined3d_device); wined3d_mutex_unlock();
return D3D_OK; diff --git a/dlls/d3d9/directx.c b/dlls/d3d9/directx.c index 1d3754adf8..d7fb30729d 100644 --- a/dlls/d3d9/directx.c +++ b/dlls/d3d9/directx.c @@ -289,8 +289,18 @@ static HRESULT WINAPI d3d9_CheckDeviceFormat(IDirect3D9Ex *iface, UINT adapter, }
wined3d_mutex_lock(); - hr = wined3d_check_device_format(d3d9->wined3d, adapter, device_type, wined3dformat_from_d3dformat(adapter_format), - usage, bind_flags, wined3d_rtype, wined3dformat_from_d3dformat(format)); + if ((enum wined3d_format_id)format == WINED3DFMT_RESZ) + { + DWORD levels; + hr = wined3d_check_device_multisample_type(d3d9->wined3d, adapter, device_type, + WINED3DFMT_D24_UNORM_S8_UINT, FALSE, WINED3D_MULTISAMPLE_NONE, &levels); + if (SUCCEEDED(hr) && !levels) + hr = D3DERR_NOTAVAILABLE; + } + else + hr = wined3d_check_device_format(d3d9->wined3d, adapter, device_type, + wined3dformat_from_d3dformat(adapter_format), usage, bind_flags, + wined3d_rtype, wined3dformat_from_d3dformat(format)); wined3d_mutex_unlock();
return hr; diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index acc915eb55..74dc21046b 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -1784,7 +1784,7 @@ void CDECL wined3d_device_get_viewports(const struct wined3d_device *device, uns *viewport_count = device->state.viewport_count; }
-static void resolve_depth_buffer(struct wined3d_device *device) +void CDECL wined3d_device_resolve_depth_buffer(struct wined3d_device *device) { const struct wined3d_state *state = &device->state; struct wined3d_rendertarget_view *src_view; @@ -1883,7 +1883,7 @@ void CDECL wined3d_device_set_render_state(struct wined3d_device *device, if (state == WINED3D_RS_POINTSIZE && value == WINED3D_RESZ_CODE) { TRACE("RESZ multisampled depth buffer resolve triggered.\n"); - resolve_depth_buffer(device); + wined3d_device_resolve_depth_buffer(device); } }
diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec index c8ef442c72..f42d2762c5 100644 --- a/dlls/wined3d/wined3d.spec +++ b/dlls/wined3d/wined3d.spec @@ -126,6 +126,7 @@ @ cdecl wined3d_device_process_vertices(ptr long long long ptr ptr long long) @ cdecl wined3d_device_release_focus_window(ptr) @ cdecl wined3d_device_reset(ptr ptr ptr ptr long) +@ cdecl wined3d_device_resolve_depth_buffer(ptr) @ cdecl wined3d_device_resolve_sub_resource(ptr ptr long ptr long long) @ cdecl wined3d_device_set_base_vertex_index(ptr long) @ cdecl wined3d_device_set_blend_state(ptr ptr ptr) diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index 8951f92d14..218e5e99f1 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -2435,6 +2435,7 @@ void __cdecl wined3d_device_release_focus_window(struct wined3d_device *device); HRESULT __cdecl wined3d_device_reset(struct wined3d_device *device, const struct wined3d_swapchain_desc *swapchain_desc, const struct wined3d_display_mode *mode, wined3d_device_reset_cb callback, BOOL reset_state); +void __cdecl wined3d_device_resolve_depth_buffer(struct wined3d_device *device); void __cdecl wined3d_device_resolve_sub_resource(struct wined3d_device *device, struct wined3d_resource *dst_resource, unsigned int dst_sub_resource_idx, struct wined3d_resource *src_resource, unsigned int src_sub_resource_idx,
On Wed, 11 Dec 2019 at 07:16, Zebediah Figura z.figura12@gmail.com wrote:
@@ -289,8 +289,18 @@ static HRESULT WINAPI d3d9_CheckDeviceFormat(IDirect3D9Ex *iface, UINT adapter, }
wined3d_mutex_lock();
- hr = wined3d_check_device_format(d3d9->wined3d, adapter, device_type, wined3dformat_from_d3dformat(adapter_format),
usage, bind_flags, wined3d_rtype, wined3dformat_from_d3dformat(format));
- if ((enum wined3d_format_id)format == WINED3DFMT_RESZ)
- {
DWORD levels;
hr = wined3d_check_device_multisample_type(d3d9->wined3d, adapter, device_type,
WINED3DFMT_D24_UNORM_S8_UINT, FALSE, WINED3D_MULTISAMPLE_NONE, &levels);
Did you intend to use WINED3D_MULTISAMPLE_NON_MASKABLE here?
It seems a little superfluous to export wined3d_device_resolve_depth_buffer(); the implementation on top of wined3d_device_resolve_sub_resource() wasn't that complicated.
On 12/12/19 7:44 AM, Henri Verbeet wrote:
On Wed, 11 Dec 2019 at 07:16, Zebediah Figura z.figura12@gmail.com wrote:
@@ -289,8 +289,18 @@ static HRESULT WINAPI d3d9_CheckDeviceFormat(IDirect3D9Ex *iface, UINT adapter, }
wined3d_mutex_lock();
- hr = wined3d_check_device_format(d3d9->wined3d, adapter, device_type, wined3dformat_from_d3dformat(adapter_format),
usage, bind_flags, wined3d_rtype, wined3dformat_from_d3dformat(format));
- if ((enum wined3d_format_id)format == WINED3DFMT_RESZ)
- {
DWORD levels;
hr = wined3d_check_device_multisample_type(d3d9->wined3d, adapter, device_type,
WINED3DFMT_D24_UNORM_S8_UINT, FALSE, WINED3D_MULTISAMPLE_NONE, &levels);
Did you intend to use WINED3D_MULTISAMPLE_NON_MASKABLE here?
Yes, on further examination I did mean to do that. Thanks.
It seems a little superfluous to export wined3d_device_resolve_depth_buffer(); the implementation on top of wined3d_device_resolve_sub_resource() wasn't that complicated.
Okay, I'll revert back to that implementation. I misread your earlier response to imply that duplicating between d3d8 and d3d9 would be dispreferred.
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 d949fd89b2..48c40f9969 100644 --- a/dlls/d3d9/device.c +++ b/dlls/d3d9/device.c @@ -2303,22 +2303,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) wined3d_device_resolve_depth_buffer(device->wined3d_device); wined3d_mutex_unlock();
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 48c40f9969..65330deeaf 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); }
@@ -4645,8 +4643,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)))
On Wed, 11 Dec 2019 at 07:16, Zebediah Figura z.figura12@gmail.com wrote:
- wined3d_device_set_vs_consts_f(device, 0, d3d_info->limits.vs_uniform_count, state->vs_consts_f);
- wined3d_device_set_vs_consts_b(device, 0, WINED3D_MAX_CONSTS_B, state->vs_consts_b);
- wined3d_device_set_vs_consts_i(device, 0, WINED3D_MAX_CONSTS_I, state->vs_consts_i);
- wined3d_device_set_ps_consts_f(device, 0, d3d_info->limits.ps_uniform_count, state->ps_consts_f);
- wined3d_device_set_ps_consts_b(device, 0, WINED3D_MAX_CONSTS_B, state->ps_consts_b);
- wined3d_device_set_ps_consts_i(device, 0, WINED3D_MAX_CONSTS_I, state->ps_consts_i);
That's going to invalidate every constant on every draw, even if none of them changed, which seems undesirable. It shouldn't be too hard to extract ranges from the "changed" info, although ideally changed float constants would be stored in a proper bitmap first.
On 12/12/19 7:22 AM, Henri Verbeet wrote:
On Wed, 11 Dec 2019 at 07:16, Zebediah Figura z.figura12@gmail.com wrote:
- wined3d_device_set_vs_consts_f(device, 0, d3d_info->limits.vs_uniform_count, state->vs_consts_f);
- wined3d_device_set_vs_consts_b(device, 0, WINED3D_MAX_CONSTS_B, state->vs_consts_b);
- wined3d_device_set_vs_consts_i(device, 0, WINED3D_MAX_CONSTS_I, state->vs_consts_i);
- wined3d_device_set_ps_consts_f(device, 0, d3d_info->limits.ps_uniform_count, state->ps_consts_f);
- wined3d_device_set_ps_consts_b(device, 0, WINED3D_MAX_CONSTS_B, state->ps_consts_b);
- wined3d_device_set_ps_consts_i(device, 0, WINED3D_MAX_CONSTS_I, state->ps_consts_i);
That's going to invalidate every constant on every draw, even if none of them changed, which seems undesirable. It shouldn't be too hard to extract ranges from the "changed" info, although ideally changed float constants would be stored in a proper bitmap first.
Sure, I can try for that. I admittedly don't have a great idea of the tradeoffs and bottlenecks involved here, so a bit of clarification would also be appreciated.