From: Elizabeth Figura zfigura@codeweavers.com
Historically we used a 0-255 scale in cases where the fog coordinate attribute was passed through directly, apparently in order to avoid doing float division on the value passed to glFogCoordfEXT(). This benefit was probably always dubious, and now is simply unnecessary as we no longer use GL FFP fog nor immediate mode draws. Get rid of the GLSL equivalent code to scale fog up to the 0-255 range and then back down to 0-1. --- dlls/wined3d/glsl_shader.c | 7 +++---- dlls/wined3d/utils.c | 5 ----- dlls/wined3d/wined3d_private.h | 1 - 3 files changed, 3 insertions(+), 10 deletions(-)
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index b4bfbe1c55b..2cbd22657a9 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -9297,7 +9297,7 @@ static GLuint shader_glsl_generate_ffp_vertex_shader(struct shader_glsl_priv *pr break;
case WINED3D_FFP_VS_FOG_FOGCOORD: - shader_addline(buffer, "ffp_varying_fogcoord = ffp_attrib_specular.w * 255.0;\n"); + shader_addline(buffer, "ffp_varying_fogcoord = ffp_attrib_specular.w;\n"); break;
case WINED3D_FFP_VS_FOG_RANGE: @@ -12240,10 +12240,9 @@ static void glsl_fragment_pipe_fog(struct wined3d_context *context,
if (state->render_states[WINED3D_RS_FOGTABLEMODE] == WINED3D_FOG_NONE) { - if (use_vshader) + if (use_vshader || state->render_states[WINED3D_RS_FOGVERTEXMODE] == WINED3D_FOG_NONE + || context->stream_info.position_transformed) new_source = FOGSOURCE_VS; - else if (state->render_states[WINED3D_RS_FOGVERTEXMODE] == WINED3D_FOG_NONE || context->stream_info.position_transformed) - new_source = FOGSOURCE_COORD; else new_source = FOGSOURCE_FFP; } diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c index 8c90908ec76..779af782b6c 100644 --- a/dlls/wined3d/utils.c +++ b/dlls/wined3d/utils.c @@ -5834,11 +5834,6 @@ void get_fog_start_end(const struct wined3d_context *context, const struct wined *end = 0.0f; break;
- case FOGSOURCE_COORD: - *start = 255.0f; - *end = 0.0f; - break; - case FOGSOURCE_FFP: tmpvalue.d = state->render_states[WINED3D_RS_FOGSTART]; *start = tmpvalue.f; diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index abdb97f9d9f..f49a604422d 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -1827,7 +1827,6 @@ void dispatch_compute(struct wined3d_device *device, const struct wined3d_state enum fogsource { FOGSOURCE_FFP, FOGSOURCE_VS, - FOGSOURCE_COORD, };
/* Direct3D terminology with little modifications. We do not have an issued
From: Elizabeth Figura zfigura@codeweavers.com
They may not have a VkImage yet, and if we are delaying their clear we will not have ensured that they have one. --- dlls/wined3d/texture.c | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-)
diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c index 688dc35de98..eeb2ea3a7cc 100644 --- a/dlls/wined3d/texture.c +++ b/dlls/wined3d/texture.c @@ -6254,12 +6254,13 @@ static void vk_blitter_clear_rendertargets(struct wined3d_context_vk *context_vk const struct wined3d_fb_state *fb, unsigned int rect_count, const RECT *clear_rects, const RECT *draw_rect, uint32_t flags, const struct wined3d_color *colour, float depth, unsigned int stencil) { + unsigned int i, attachment_count, immediate_rt_count = 0, delay_count = 0; VkClearValue clear_values[WINED3D_MAX_RENDER_TARGETS + 1]; VkImageView views[WINED3D_MAX_RENDER_TARGETS + 1]; - unsigned int i, attachment_count, delay_count = 0; struct wined3d_rendertarget_view_vk *rtv_vk; struct wined3d_rendertarget_view *view; const struct wined3d_vk_info *vk_info; + struct wined3d_fb_state immediate_fb; struct wined3d_device_vk *device_vk; VkCommandBuffer vk_command_buffer; VkRenderPassBeginInfo begin_desc; @@ -6313,6 +6314,7 @@ static void vk_blitter_clear_rendertargets(struct wined3d_context_vk *context_vk wined3d_rendertarget_view_validate_location(view, view->resource->draw_binding); wined3d_rendertarget_view_invalidate_location(view, ~view->resource->draw_binding);
+ immediate_fb.render_targets[immediate_rt_count++] = view; rtv_vk = wined3d_rendertarget_view_vk(view); views[attachment_count] = wined3d_rendertarget_view_vk_get_image_view(rtv_vk, context_vk); wined3d_rendertarget_view_vk_barrier(rtv_vk, context_vk, WINED3D_BIND_RENDER_TARGET); @@ -6349,6 +6351,7 @@ static void vk_blitter_clear_rendertargets(struct wined3d_context_vk *context_vk wined3d_rendertarget_view_validate_location(view, view->resource->draw_binding); wined3d_rendertarget_view_invalidate_location(view, ~view->resource->draw_binding);
+ immediate_fb.depth_stencil = view; rtv_vk = wined3d_rendertarget_view_vk(view); views[attachment_count] = wined3d_rendertarget_view_vk_get_image_view(rtv_vk, context_vk); wined3d_rendertarget_view_vk_barrier(rtv_vk, context_vk, WINED3D_BIND_DEPTH_STENCIL); @@ -6384,8 +6387,8 @@ static void vk_blitter_clear_rendertargets(struct wined3d_context_vk *context_vk if (delay_count) TRACE_(d3d_perf)("Partial clear: %u immediate, %u delayed.\n", attachment_count, delay_count);
- if (!(vk_render_pass = wined3d_context_vk_get_render_pass(context_vk, fb, - rt_count, flags & (WINED3DCLEAR_ZBUFFER | WINED3DCLEAR_STENCIL), flags))) + if (!(vk_render_pass = wined3d_context_vk_get_render_pass(context_vk, &immediate_fb, + immediate_rt_count, flags & (WINED3DCLEAR_ZBUFFER | WINED3DCLEAR_STENCIL), flags))) { ERR("Failed to get render pass.\n"); return; @@ -6441,19 +6444,13 @@ static void vk_blitter_clear_rendertargets(struct wined3d_context_vk *context_vk
wined3d_context_vk_destroy_vk_framebuffer(context_vk, vk_framebuffer, context_vk->current_command_buffer.id);
- for (i = 0; i < rt_count; ++i) - { - if (!(view = fb->render_targets[i])) - continue; - - wined3d_context_vk_reference_rendertarget_view(context_vk, wined3d_rendertarget_view_vk(view)); - } + for (i = 0; i < immediate_rt_count; ++i) + wined3d_context_vk_reference_rendertarget_view(context_vk, + wined3d_rendertarget_view_vk(immediate_fb.render_targets[i]));
if (depth_stencil) - { - view = fb->depth_stencil; - wined3d_context_vk_reference_rendertarget_view(context_vk, wined3d_rendertarget_view_vk(view)); - } + wined3d_context_vk_reference_rendertarget_view(context_vk, + wined3d_rendertarget_view_vk(immediate_fb.depth_stencil)); }
static void vk_blitter_clear(struct wined3d_blitter *blitter, struct wined3d_device *device,
From: Elizabeth Figura zfigura@codeweavers.com
--- dlls/wined3d/shader.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-)
diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c index 09ecc51b608..252046f0a39 100644 --- a/dlls/wined3d/shader.c +++ b/dlls/wined3d/shader.c @@ -1478,7 +1478,7 @@ static HRESULT shader_get_registers_used(struct wined3d_shader *shader, DWORD co
case 2: /* oPts */ reg_maps->output_registers |= 1u << 11; - shader_signature_from_usage(&output_signature_elements[11], + shader_signature_from_usage(&output_signature_elements[12], WINED3D_DECL_USAGE_PSIZE, 0, 11, WINED3DSP_WRITEMASK_1); break; } @@ -1822,8 +1822,14 @@ static HRESULT shader_get_registers_used(struct wined3d_shader *shader, DWORD co } else if (reg_maps->output_registers) { - unsigned int count = wined3d_popcount(reg_maps->output_registers); struct wined3d_shader_signature_element *e; + unsigned int count = 0; + + for (i = 0; i < ARRAY_SIZE(output_signature_elements); ++i) + { + if (output_signature_elements[i].semantic_name) + ++count; + }
if (!(output_signature->elements = calloc(count, sizeof(*output_signature->elements)))) return E_OUTOFMEMORY; @@ -1832,9 +1838,8 @@ static HRESULT shader_get_registers_used(struct wined3d_shader *shader, DWORD co e = output_signature->elements; for (i = 0; i < ARRAY_SIZE(output_signature_elements); ++i) { - if (!(reg_maps->output_registers & (1u << i))) - continue; - *e++ = output_signature_elements[i]; + if (output_signature_elements[i].semantic_name) + *e++ = output_signature_elements[i]; } }