From: Michael Stefaniuc Subject: d3d9: Don't assert for shaders with the wrong vtbl. Message-Id: <20141216085709.GA8143@redhat.com> Date: Tue, 16 Dec 2014 09:57:09 +0100 The Elevated demo creates both shaders normally but then sets the lpVtbl of the shader interfaces to NULL. --- Last fix for the regressions from https://bugs.winehq.org/show_bug.cgi?id=37723 Supersedes patch #108241 Henri, only the w8 WTB box is not skipping the tests. dlls/d3d9/shader.c | 6 ++++-- dlls/d3d9/tests/device.c | 22 ++++++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/dlls/d3d9/shader.c b/dlls/d3d9/shader.c index 0c2c881..9430afd 100644 --- a/dlls/d3d9/shader.c +++ b/dlls/d3d9/shader.c @@ -167,7 +167,8 @@ struct d3d9_vertexshader *unsafe_impl_from_IDirect3DVertexShader9(IDirect3DVerte { if (!iface) return NULL; - assert(iface->lpVtbl == &d3d9_vertexshader_vtbl); + if (iface->lpVtbl != &d3d9_vertexshader_vtbl) + WARN("Vertex shader %p with the wrong vtbl %p\n", iface, iface->lpVtbl); return impl_from_IDirect3DVertexShader9(iface); } @@ -317,7 +318,8 @@ struct d3d9_pixelshader *unsafe_impl_from_IDirect3DPixelShader9(IDirect3DPixelSh { if (!iface) return NULL; - assert(iface->lpVtbl == &d3d9_pixelshader_vtbl); + if (iface->lpVtbl != &d3d9_pixelshader_vtbl) + WARN("Pixel shader %p with the wrong vtbl %p\n", iface, iface->lpVtbl); return impl_from_IDirect3DPixelShader9(iface); } diff --git a/dlls/d3d9/tests/device.c b/dlls/d3d9/tests/device.c index 3206e57..eb72505 100644 --- a/dlls/d3d9/tests/device.c +++ b/dlls/d3d9/tests/device.c @@ -5518,6 +5518,7 @@ static void test_get_set_vertex_shader(void) { IDirect3DVertexShader9 *current_shader = NULL; IDirect3DVertexShader9 *shader = NULL; + const IDirect3DVertexShader9Vtbl *shader_vtbl; IDirect3DDevice9 *device; ULONG refcount, i; IDirect3D9 *d3d; @@ -5568,6 +5569,16 @@ static void test_get_set_vertex_shader(void) ok(current_shader == shader, "Got unexpected shader %p, expected %p.\n", current_shader, shader); IDirect3DVertexShader9_Release(current_shader); + /* SetVertexShader() with a bogus shader vtbl */ + shader_vtbl = shader->lpVtbl; + shader->lpVtbl = (IDirect3DVertexShader9Vtbl *)0xdeadbeef; + hr = IDirect3DDevice9_SetVertexShader(device, shader); + ok(SUCCEEDED(hr), "Failed to set vertex shader, hr %#x.\n", hr); + shader->lpVtbl = NULL; + hr = IDirect3DDevice9_SetVertexShader(device, shader); + ok(SUCCEEDED(hr), "Failed to set vertex shader, hr %#x.\n", hr); + shader->lpVtbl = shader_vtbl; + IDirect3DVertexShader9_Release(shader); refcount = IDirect3DDevice9_Release(device); ok(!refcount, "Device has %u references left.\n", refcount); @@ -5640,6 +5651,7 @@ static void test_get_set_pixel_shader(void) { IDirect3DPixelShader9 *current_shader = NULL; IDirect3DPixelShader9 *shader = NULL; + const IDirect3DPixelShader9Vtbl *shader_vtbl; IDirect3DDevice9 *device; ULONG refcount, i; IDirect3D9 *d3d; @@ -5690,6 +5702,16 @@ static void test_get_set_pixel_shader(void) ok(current_shader == shader, "Got unexpected shader %p, expected %p.\n", current_shader, shader); IDirect3DPixelShader9_Release(current_shader); + /* SetPixelShader() with a bogus shader vtbl */ + shader_vtbl = shader->lpVtbl; + shader->lpVtbl = (IDirect3DPixelShader9Vtbl *)0xdeadbeef; + hr = IDirect3DDevice9_SetPixelShader(device, shader); + ok(SUCCEEDED(hr), "Failed to set pixel shader, hr %#x.\n", hr); + shader->lpVtbl = NULL; + hr = IDirect3DDevice9_SetPixelShader(device, shader); + ok(SUCCEEDED(hr), "Failed to set pixel shader, hr %#x.\n", hr); + shader->lpVtbl = shader_vtbl; + IDirect3DPixelShader9_Release(shader); refcount = IDirect3DDevice9_Release(device); ok(!refcount, "Device has %u references left.\n", refcount); -- 1.8.3.1