Found while refactoring FFP code; no known application is affected.
From: Elizabeth Figura zfigura@codeweavers.com
Show that it affects both the vertex and fragment FFP pipelines. --- dlls/d3d8/tests/visual.c | 195 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 195 insertions(+)
diff --git a/dlls/d3d8/tests/visual.c b/dlls/d3d8/tests/visual.c index 88bbaebb033..f6217e5f400 100644 --- a/dlls/d3d8/tests/visual.c +++ b/dlls/d3d8/tests/visual.c @@ -12188,6 +12188,200 @@ static void test_mipmap_upload(void) release_test_context(&context); }
+static void test_specular_shaders(void) +{ + struct d3d8_test_context context; + struct surface_readback rb; + IDirect3DDevice8 *device; + unsigned int color; + DWORD vs, ps; + HRESULT hr; + + static const DWORD vs_code[] = + { +#if 0 + vs_1_1 + mov oPos, v0 + mov oD0, v5 + mov oD1, v6 +#endif + 0xfffe0101, + 0x00000001, 0xc00f0000, 0x90e40000, + 0x00000001, 0xd00f0000, 0x90e40005, + 0x00000001, 0xd00f0001, 0x90e40006, + 0x0000ffff + }; + + static const DWORD ps_code[] = + { +#if 0 + ps_1_1 + mov r0, v1 +#endif + 0xffff0101, + 0x00000001, 0x800f0000, 0x90e40001, + 0x0000ffff + }; + + static const DWORD decl[] = + { + D3DVSD_STREAM(0), + D3DVSD_REG(D3DVSDE_POSITION, D3DVSDT_FLOAT3), + D3DVSD_REG(D3DVSDE_NORMAL, D3DVSDT_FLOAT3), + D3DVSD_REG(D3DVSDE_DIFFUSE, D3DVSDT_D3DCOLOR), + D3DVSD_REG(D3DVSDE_SPECULAR, D3DVSDT_D3DCOLOR), + D3DVSD_END() + }; + + static const struct + { + struct vec3 position; + struct vec3 normal; + unsigned int diffuse; + unsigned int specular; + } + quad[] = + { + {{-1.0f, -1.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, 0x0000003f, 0x00007f00}, + {{-1.0f, 1.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, 0x0000003f, 0x00007f00}, + {{ 1.0f, -1.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, 0x0000003f, 0x00007f00}, + {{ 1.0f, 1.0f, 0.0f}, {1.0f, 1.0f, 1.0f}, 0x0000003f, 0x00007f00}, + }; + + static const D3DMATERIAL8 material = + { + .Specular = {0.7f, 0.0f, 0.7f, 1.0f}, + .Power = 2.0f, + }; + + static const D3DLIGHT8 light = + { + .Type = D3DLIGHT_DIRECTIONAL, + .Diffuse = {0.0f, 0.1f, 0.1f, 0.0f}, + .Specular = {0.8f, 0.8f, 0.8f, 0.0f}, + .Direction = {0.0f, 0.0f, -1.0f}, + }; + + if (!init_test_context(&context)) + return; + device = context.device; + + /* Vertex shader only. */ + + hr = IDirect3DDevice8_CreateVertexShader(device, decl, vs_code, &vs, 0); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + + hr = IDirect3DDevice8_Clear(device, 0, NULL, D3DCLEAR_TARGET, 0xffff0000, 0.0, 0); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + + hr = IDirect3DDevice8_BeginScene(device); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + hr = IDirect3DDevice8_SetVertexShader(device, vs); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + hr = IDirect3DDevice8_SetRenderState(device, D3DRS_ZENABLE, FALSE); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + hr = IDirect3DDevice8_SetRenderState(device, D3DRS_SPECULARENABLE, TRUE); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + hr = IDirect3DDevice8_DrawPrimitiveUP(device, D3DPT_TRIANGLESTRIP, 2, quad, sizeof(*quad)); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + hr = IDirect3DDevice8_EndScene(device); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + check_rt_color(context.backbuffer, 0x00007f3f); + + hr = IDirect3DDevice8_BeginScene(device); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + hr = IDirect3DDevice8_SetRenderState(device, D3DRS_SPECULARENABLE, FALSE); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + hr = IDirect3DDevice8_DrawPrimitiveUP(device, D3DPT_TRIANGLESTRIP, 2, quad, sizeof(*quad)); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + hr = IDirect3DDevice8_EndScene(device); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + check_rt_color(context.backbuffer, 0x0000003f); + + hr = IDirect3DDevice8_CreatePixelShader(device, ps_code, &ps); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + + /* Pixel shader only. */ + + hr = IDirect3DDevice8_SetPixelShader(device, ps); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + hr = IDirect3DDevice8_SetVertexShader(device, D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE | D3DFVF_SPECULAR); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + + hr = IDirect3DDevice8_SetMaterial(device, &material); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + hr = IDirect3DDevice8_SetLight(device, 0, &light); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + hr = IDirect3DDevice8_LightEnable(device, 0, TRUE); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + + hr = IDirect3DDevice8_BeginScene(device); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + hr = IDirect3DDevice8_SetRenderState(device, D3DRS_SPECULARENABLE, TRUE); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + hr = IDirect3DDevice8_DrawPrimitiveUP(device, D3DPT_TRIANGLESTRIP, 2, quad, sizeof(*quad)); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + hr = IDirect3DDevice8_EndScene(device); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + get_surface_readback(context.backbuffer, &rb); + color = get_readback_color(&rb, 160, 120); + todo_wine ok(color_match(color, 0x003300, 1), "Got color %08x.\n", color); + color = get_readback_color(&rb, 480, 120); + todo_wine ok(color_match(color, 0x001900, 1), "Got color %08x.\n", color); + color = get_readback_color(&rb, 160, 360); + todo_wine ok(color_match(color, 0x009900, 1), "Got color %08x.\n", color); + color = get_readback_color(&rb, 480, 360); + todo_wine ok(color_match(color, 0x003300, 1), "Got color %08x.\n", color); + release_surface_readback(&rb); + + hr = IDirect3DDevice8_BeginScene(device); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + hr = IDirect3DDevice8_SetRenderState(device, D3DRS_SPECULARENABLE, FALSE); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + hr = IDirect3DDevice8_DrawPrimitiveUP(device, D3DPT_TRIANGLESTRIP, 2, quad, sizeof(*quad)); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + hr = IDirect3DDevice8_EndScene(device); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + check_rt_color_todo(context.backbuffer, 0x00007f00); + + hr = IDirect3DDevice8_BeginScene(device); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + hr = IDirect3DDevice8_SetRenderState(device, D3DRS_SPECULARMATERIALSOURCE, D3DMCS_MATERIAL); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + hr = IDirect3DDevice8_DrawPrimitiveUP(device, D3DPT_TRIANGLESTRIP, 2, quad, sizeof(*quad)); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + hr = IDirect3DDevice8_EndScene(device); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + check_rt_color_todo(context.backbuffer, 0x00007f00); + + /* Vertex shader and pixel shader. */ + + hr = IDirect3DDevice8_SetVertexShader(device, vs); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + + hr = IDirect3DDevice8_BeginScene(device); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + hr = IDirect3DDevice8_SetRenderState(device, D3DRS_SPECULARENABLE, TRUE); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + hr = IDirect3DDevice8_DrawPrimitiveUP(device, D3DPT_TRIANGLESTRIP, 2, quad, sizeof(*quad)); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + hr = IDirect3DDevice8_EndScene(device); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + check_rt_color(context.backbuffer, 0x00007f00); + + hr = IDirect3DDevice8_BeginScene(device); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + hr = IDirect3DDevice8_SetRenderState(device, D3DRS_SPECULARENABLE, FALSE); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + hr = IDirect3DDevice8_DrawPrimitiveUP(device, D3DPT_TRIANGLESTRIP, 2, quad, sizeof(*quad)); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + hr = IDirect3DDevice8_EndScene(device); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + check_rt_color(context.backbuffer, 0x00007f00); + + release_test_context(&context); +} + START_TEST(visual) { D3DADAPTER_IDENTIFIER8 identifier; @@ -12271,4 +12465,5 @@ START_TEST(visual) test_filling_convention(); test_managed_reset(); test_mipmap_upload(); + test_specular_shaders(); }
From: Elizabeth Figura zfigura@codeweavers.com
It is possible (if somewhat artificial) to use lighting without using ambient lighting. In this case ffp_light_ambient may not be an active uniform.
We could be more sophisticated here, and add lighting to the mask if we use any lighting uniform, but this is simpler and probably good enough. --- dlls/d3d8/tests/visual.c | 8 ++++---- dlls/wined3d/glsl_shader.c | 4 +--- 2 files changed, 5 insertions(+), 7 deletions(-)
diff --git a/dlls/d3d8/tests/visual.c b/dlls/d3d8/tests/visual.c index f6217e5f400..c605b53606c 100644 --- a/dlls/d3d8/tests/visual.c +++ b/dlls/d3d8/tests/visual.c @@ -12325,13 +12325,13 @@ static void test_specular_shaders(void) ok(hr == S_OK, "Got hr %#lx.\n", hr); get_surface_readback(context.backbuffer, &rb); color = get_readback_color(&rb, 160, 120); - todo_wine ok(color_match(color, 0x003300, 1), "Got color %08x.\n", color); + ok(color_match(color, 0x003300, 1), "Got color %08x.\n", color); color = get_readback_color(&rb, 480, 120); - todo_wine ok(color_match(color, 0x001900, 1), "Got color %08x.\n", color); + ok(color_match(color, 0x001900, 1), "Got color %08x.\n", color); color = get_readback_color(&rb, 160, 360); - todo_wine ok(color_match(color, 0x009900, 1), "Got color %08x.\n", color); + ok(color_match(color, 0x009900, 1), "Got color %08x.\n", color); color = get_readback_color(&rb, 480, 360); - todo_wine ok(color_match(color, 0x003300, 1), "Got color %08x.\n", color); + ok(color_match(color, 0x003300, 1), "Got color %08x.\n", color); release_surface_readback(&rb);
hr = IDirect3DDevice8_BeginScene(device); diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 5dfcbb689b7..018b949f41c 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -10583,7 +10583,7 @@ static void set_glsl_shader_program(const struct wined3d_context_gl *context_gl, else { entry->constant_update_mask |= WINED3D_SHADER_CONST_FFP_MODELVIEW - | WINED3D_SHADER_CONST_FFP_PROJ; + | WINED3D_SHADER_CONST_FFP_PROJ | WINED3D_SHADER_CONST_FFP_LIGHTS;
for (i = 1; i < MAX_VERTEX_BLENDS; ++i) { @@ -10607,8 +10607,6 @@ static void set_glsl_shader_program(const struct wined3d_context_gl *context_gl, || entry->vs.material_emissive_location != -1 || entry->vs.material_shininess_location != -1) entry->constant_update_mask |= WINED3D_SHADER_CONST_FFP_MATERIAL; - if (entry->vs.light_ambient_location != -1) - entry->constant_update_mask |= WINED3D_SHADER_CONST_FFP_LIGHTS; } if (entry->vs.clip_planes_location != -1) entry->constant_update_mask |= WINED3D_SHADER_CONST_VS_CLIP_PLANES;
From: Elizabeth Figura zfigura@codeweavers.com
--- dlls/d3d8/tests/visual.c | 4 ++-- dlls/wined3d/glsl_shader.c | 33 +++++++++++++++------------------ dlls/wined3d/utils.c | 1 + dlls/wined3d/wined3d_private.h | 3 ++- 4 files changed, 20 insertions(+), 21 deletions(-)
diff --git a/dlls/d3d8/tests/visual.c b/dlls/d3d8/tests/visual.c index c605b53606c..b40743f0cbb 100644 --- a/dlls/d3d8/tests/visual.c +++ b/dlls/d3d8/tests/visual.c @@ -12342,7 +12342,7 @@ static void test_specular_shaders(void) ok(hr == S_OK, "Got hr %#lx.\n", hr); hr = IDirect3DDevice8_EndScene(device); ok(hr == S_OK, "Got hr %#lx.\n", hr); - check_rt_color_todo(context.backbuffer, 0x00007f00); + check_rt_color(context.backbuffer, 0x00007f00);
hr = IDirect3DDevice8_BeginScene(device); ok(hr == S_OK, "Got hr %#lx.\n", hr); @@ -12352,7 +12352,7 @@ static void test_specular_shaders(void) ok(hr == S_OK, "Got hr %#lx.\n", hr); hr = IDirect3DDevice8_EndScene(device); ok(hr == S_OK, "Got hr %#lx.\n", hr); - check_rt_color_todo(context.backbuffer, 0x00007f00); + check_rt_color(context.backbuffer, 0x00007f00);
/* Vertex shader and pixel shader. */
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 018b949f41c..66c5a1eb4dc 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -1359,17 +1359,8 @@ static void shader_glsl_ffp_vertex_material_uniform(const struct wined3d_context { const struct wined3d_gl_info *gl_info = context_gl->gl_info;
- if (state->render_states[WINED3D_RS_SPECULARENABLE]) - { - GL_EXTCALL(glUniform4fv(prog->vs.material_specular_location, 1, &state->material.specular.r)); - GL_EXTCALL(glUniform1f(prog->vs.material_shininess_location, state->material.power)); - } - else - { - static const float black[] = {0.0f, 0.0f, 0.0f, 0.0f}; - - GL_EXTCALL(glUniform4fv(prog->vs.material_specular_location, 1, black)); - } + GL_EXTCALL(glUniform4fv(prog->vs.material_specular_location, 1, &state->material.specular.r)); + GL_EXTCALL(glUniform1f(prog->vs.material_shininess_location, state->material.power)); GL_EXTCALL(glUniform4fv(prog->vs.material_ambient_location, 1, &state->material.ambient.r)); GL_EXTCALL(glUniform4fv(prog->vs.material_diffuse_location, 1, &state->material.diffuse.r)); GL_EXTCALL(glUniform4fv(prog->vs.material_emissive_location, 1, &state->material.emissive.r)); @@ -8869,9 +8860,10 @@ static void shader_glsl_ffp_vertex_lighting_footer(struct wined3d_string_buffer shader_addline(buffer, "t = dot(normal, ffp_normalize(dir - ffp_normalize(ec_pos.xyz)));\n"); else shader_addline(buffer, "t = dot(normal, ffp_normalize(dir + vec3(0.0, 0.0, -1.0)));\n"); - shader_addline(buffer, "if (dot(dir, normal) > 0.0 && t > 0.0%s) specular +=" - " pow(t, ffp_material.shininess) * ffp_light[%u].specular * att;\n", - legacy_lighting ? " && ffp_material.shininess > 0.0" : "", idx); + if (settings->specular_enable) + shader_addline(buffer, "if (dot(dir, normal) > 0.0 && t > 0.0%s) specular +=" + " pow(t, ffp_material.shininess) * ffp_light[%u].specular * att;\n", + legacy_lighting ? " && ffp_material.shininess > 0.0" : "", idx); }
static void shader_glsl_ffp_vertex_lighting(struct wined3d_string_buffer *buffer, @@ -8889,10 +8881,12 @@ static void shader_glsl_ffp_vertex_lighting(struct wined3d_string_buffer *buffer
shader_addline(buffer, "vec3 ambient = ffp_light_ambient;\n"); shader_addline(buffer, "vec3 diffuse = vec3(0.0);\n"); - shader_addline(buffer, "vec4 specular = vec4(0.0);\n"); shader_addline(buffer, "vec3 dir, dst;\n"); shader_addline(buffer, "float att, t;\n");
+ if (settings->specular_enable) + shader_addline(buffer, "vec4 specular = vec4(0.0);\n"); + ambient = shader_glsl_ffp_mcs(settings->ambient_source, "ffp_material.ambient"); diffuse = shader_glsl_ffp_mcs(settings->diffuse_source, "ffp_material.diffuse"); specular = shader_glsl_ffp_mcs(settings->specular_source, "ffp_material.specular"); @@ -8994,7 +8988,10 @@ static void shader_glsl_ffp_vertex_lighting(struct wined3d_string_buffer *buffer shader_addline(buffer, "ffp_varying_diffuse.xyz = %s.xyz * ambient + %s.xyz * diffuse + %s.xyz;\n", ambient, diffuse, emissive); shader_addline(buffer, "ffp_varying_diffuse.w = %s.w;\n", diffuse); - shader_addline(buffer, "ffp_varying_specular = %s * specular;\n", specular); + if (settings->specular_enable) + shader_addline(buffer, "ffp_varying_specular = %s * specular;\n", specular); + else + shader_addline(buffer, "ffp_varying_specular = ffp_attrib_specular;\n"); }
/* Context activation is done by the caller. */ @@ -11905,8 +11902,7 @@ static const struct wined3d_state_entry_template glsl_vertex_pipe_vp_states[] = {STATE_SHADER(WINED3D_SHADER_TYPE_HULL), {STATE_SHADER(WINED3D_SHADER_TYPE_HULL), glsl_vertex_pipe_hs }, WINED3D_GL_EXT_NONE }, {STATE_SHADER(WINED3D_SHADER_TYPE_GEOMETRY), {STATE_SHADER(WINED3D_SHADER_TYPE_GEOMETRY), glsl_vertex_pipe_geometry_shader}, WINED3D_GL_EXT_NONE }, {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), glsl_vertex_pipe_pixel_shader}, WINED3D_GL_EXT_NONE }, - {STATE_MATERIAL, {STATE_RENDER(WINED3D_RS_SPECULARENABLE), NULL }, WINED3D_GL_EXT_NONE }, - {STATE_RENDER(WINED3D_RS_SPECULARENABLE), {STATE_RENDER(WINED3D_RS_SPECULARENABLE), glsl_vertex_pipe_material}, WINED3D_GL_EXT_NONE }, + {STATE_MATERIAL, {STATE_MATERIAL, glsl_vertex_pipe_material}, WINED3D_GL_EXT_NONE }, /* Clip planes */ {STATE_CLIPPLANE(0), {STATE_CLIPPLANE(0), glsl_vertex_pipe_clip_plane}, WINED3D_GLSL_130 }, {STATE_CLIPPLANE(0), {STATE_CLIPPLANE(0), clipplane }, WINED3D_GL_EXT_NONE }, @@ -11984,6 +11980,7 @@ static const struct wined3d_state_entry_template glsl_vertex_pipe_vp_states[] = {STATE_RENDER(WINED3D_RS_AMBIENTMATERIALSOURCE), {STATE_SHADER(WINED3D_SHADER_TYPE_VERTEX), NULL }, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_EMISSIVEMATERIALSOURCE), {STATE_SHADER(WINED3D_SHADER_TYPE_VERTEX), NULL }, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_VERTEXBLEND), {STATE_SHADER(WINED3D_SHADER_TYPE_VERTEX), NULL }, WINED3D_GL_EXT_NONE }, + {STATE_RENDER(WINED3D_RS_SPECULARENABLE), {STATE_SHADER(WINED3D_SHADER_TYPE_VERTEX), NULL }, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_POINTSIZE), {STATE_RENDER(WINED3D_RS_POINTSIZE_MIN), NULL }, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_POINTSIZE_MIN), {STATE_RENDER(WINED3D_RS_POINTSIZE_MIN), glsl_vertex_pipe_pointsize}, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_POINTSPRITEENABLE), {STATE_RENDER(WINED3D_RS_POINTSPRITEENABLE), state_pointsprite }, ARB_POINT_SPRITE }, diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c index a46a4c7257d..f21ded36bff 100644 --- a/dlls/wined3d/utils.c +++ b/dlls/wined3d/utils.c @@ -6884,6 +6884,7 @@ void wined3d_ffp_get_vs_settings(const struct wined3d_context *context, settings->normalize = settings->normal && state->render_states[WINED3D_RS_NORMALIZENORMALS]; settings->lighting = !!state->render_states[WINED3D_RS_LIGHTING]; settings->localviewer = !!state->render_states[WINED3D_RS_LOCALVIEWER]; + settings->specular_enable = !!state->render_states[WINED3D_RS_SPECULARENABLE]; settings->point_size = state->primitive_type == WINED3D_PT_POINTLIST; settings->per_vertex_point_size = !!(si->use_map & 1u << WINED3D_FFP_PSIZE);
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index ff08a7f837f..9495845b294 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -2759,7 +2759,8 @@ struct wined3d_ffp_vs_settings DWORD texcoords : 8; /* WINED3D_MAX_FFP_TEXTURES */ DWORD ortho_fog : 1; DWORD flatshading : 1; - DWORD padding : 18; + DWORD specular_enable : 1; + DWORD padding : 17;
DWORD swizzle_map; /* MAX_ATTRIBS, 32 */
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=142479
Your paranoid android.
=== debian11b (64 bit WoW report) ===
ddraw: ddraw2.c:4743: Test failed: Got unexpected color 0x000000ff, expected 0x008080ff, test 20. ddraw2.c:4743: Test failed: Got unexpected color 0x000000ff, expected 0x008080ff, test 21. ddraw2.c:4743: Test failed: Got unexpected color 0x000000ff, expected 0x008080ff, test 22. ddraw2.c:4743: Test failed: Got unexpected color 0x000000ff, expected 0x008080ff, test 23. ddraw4.c:5936: Test failed: Got unexpected color 0x000000ff, expected 0x008080ff, test 36. ddraw4.c:5936: Test failed: Got unexpected color 0x000000ff, expected 0x008080ff, test 37. ddraw4.c:5936: Test failed: Got unexpected color 0x000000ff, expected 0x008080ff, test 38. ddraw4.c:5936: Test failed: Got unexpected color 0x000000ff, expected 0x008080ff, test 39. ddraw7.c:5788: Test failed: Got unexpected color 0x000000ff, expected 0x008080ff, test 36. ddraw7.c:5788: Test failed: Got unexpected color 0x000000ff, expected 0x008080ff, test 37. ddraw7.c:5788: Test failed: Got unexpected color 0x000000ff, expected 0x008080ff, test 38. ddraw7.c:5788: Test failed: Got unexpected color 0x000000ff, expected 0x008080ff, test 39.
This is failing tests...
I'm getting a bunch of:
```plaintext 0144:fixme:d3d:compile_state_table State STATE_RENDER(WINED3D_RS_SPECULARENABLE) (0x1d) has different representatives in different pipeline parts. 0144:err:d3d:validate_state_table State STATE_RENDER(WINED3D_RS_SPECULARENABLE) (0x1d) has both a handler and representative. ```
when running the d3d11 tests.