Module: wine Branch: master Commit: 51406b471aa81a56dc38e4b266b51e09646987c7 URL: http://source.winehq.org/git/wine.git/?a=commit;h=51406b471aa81a56dc38e4b266...
Author: Michael Stefaniuc mstefani@redhat.de Date: Tue Dec 16 09:57:09 2014 +0100
d3d9: Don't assert for shaders with the wrong vtbl.
---
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..ffd3c11 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);