From 07d0804603d385b4a3d0d0b8f14137b9e38e7a1a Mon Sep 17 00:00:00 2001 From: Aaryaman Vasishta Date: Sat, 21 May 2016 02:37:41 +0530 Subject: [PATCH] d3drm: Implement IDirect3DRM*_CreateTexture. Signed-off-by: Aaryaman Vasishta Signed-off-by: Henri Verbeet Signed-off-by: Alexandre Julliard --- dlls/d3drm/d3drm.c | 47 +++++++++++++---- dlls/d3drm/tests/d3drm.c | 108 ++++++++++++++++++++++++++++++++++++--- 2 files changed, 136 insertions(+), 19 deletions(-) diff --git a/dlls/d3drm/d3drm.c b/dlls/d3drm/d3drm.c index 4376aa6cff0..14fed3a92c3 100644 --- a/dlls/d3drm/d3drm.c +++ b/dlls/d3drm/d3drm.c @@ -195,17 +195,25 @@ static HRESULT WINAPI d3drm1_CreateAnimationSet(IDirect3DRM *iface, IDirect3DRMA static HRESULT WINAPI d3drm1_CreateTexture(IDirect3DRM *iface, D3DRMIMAGE *image, IDirect3DRMTexture **texture) { - struct d3drm_texture *object; + struct d3drm *d3drm = impl_from_IDirect3DRM(iface); + IDirect3DRMTexture3 *texture3; HRESULT hr; - FIXME("iface %p, image %p, texture %p partial stub.\n", iface, image, texture); + TRACE("iface %p, image %p, texture %p.\n", iface, image, texture); - if (FAILED(hr = d3drm_texture_create(&object, iface))) + if (!texture) + return D3DRMERR_BADVALUE; + + if (FAILED(hr = IDirect3DRM3_CreateTexture(&d3drm->IDirect3DRM3_iface, image, &texture3))) + { + *texture = NULL; return hr; + } - *texture = &object->IDirect3DRMTexture_iface; + hr = IDirect3DRMTexture3_QueryInterface(texture3, &IID_IDirect3DRMTexture, (void **)texture); + IDirect3DRMTexture3_Release(texture3); - return D3DRM_OK; + return hr; } static HRESULT WINAPI d3drm1_CreateLight(IDirect3DRM *iface, @@ -662,17 +670,24 @@ static HRESULT WINAPI d3drm2_CreateTexture(IDirect3DRM2 *iface, D3DRMIMAGE *image, IDirect3DRMTexture2 **texture) { struct d3drm *d3drm = impl_from_IDirect3DRM2(iface); - struct d3drm_texture *object; + IDirect3DRMTexture3 *texture3; HRESULT hr; - FIXME("iface %p, image %p, texture %p partial stub.\n", iface, image, texture); + TRACE("iface %p, image %p, texture %p.\n", iface, image, texture); - if (FAILED(hr = d3drm_texture_create(&object, &d3drm->IDirect3DRM_iface))) + if (!texture) + return D3DRMERR_BADVALUE; + + if (FAILED(hr = IDirect3DRM3_CreateTexture(&d3drm->IDirect3DRM3_iface, image, &texture3))) + { + *texture = NULL; return hr; + } - *texture = &object->IDirect3DRMTexture2_iface; + hr = IDirect3DRMTexture3_QueryInterface(texture3, &IID_IDirect3DRMTexture2, (void **)texture); + IDirect3DRMTexture3_Release(texture3); - return D3DRM_OK; + return hr; } static HRESULT WINAPI d3drm2_CreateLight(IDirect3DRM2 *iface, @@ -1158,13 +1173,23 @@ static HRESULT WINAPI d3drm3_CreateTexture(IDirect3DRM3 *iface, struct d3drm_texture *object; HRESULT hr; - FIXME("iface %p, image %p, texture %p partial stub.\n", iface, image, texture); + TRACE("iface %p, image %p, texture %p.\n", iface, image, texture); + + if (!texture) + return D3DRMERR_BADVALUE; if (FAILED(hr = d3drm_texture_create(&object, &d3drm->IDirect3DRM_iface))) return hr; *texture = &object->IDirect3DRMTexture3_iface; + if (FAILED(IDirect3DRMTexture3_InitFromImage(*texture, image))) + { + IDirect3DRMTexture3_Release(*texture); + *texture = NULL; + return D3DRMERR_BADVALUE; + } + return D3DRM_OK; } diff --git a/dlls/d3drm/tests/d3drm.c b/dlls/d3drm/tests/d3drm.c index c910457bfbb..1123cd279b2 100644 --- a/dlls/d3drm/tests/d3drm.c +++ b/dlls/d3drm/tests/d3drm.c @@ -1730,27 +1730,119 @@ static void test_Texture(void) hr = IDirect3DRM_QueryInterface(d3drm1, &IID_IDirect3DRM3, (void **)&d3drm3); ok(SUCCEEDED(hr), "Cannot get IDirect3DRM3 interface (hr = %x).\n", hr); + /* Test NULL params */ + texture1 = (IDirect3DRMTexture *)0xdeadbeef; + hr = IDirect3DRM_CreateTexture(d3drm1, NULL, &texture1); + ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr); + ok(!texture1, "Expected texture returned == NULL, got %p.\n", texture1); + hr = IDirect3DRM_CreateTexture(d3drm1, NULL, NULL); + ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr); + + texture2 = (IDirect3DRMTexture2 *)0xdeadbeef; + hr = IDirect3DRM2_CreateTexture(d3drm2, NULL, &texture2); + ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr); + ok(!texture2, "Expected texture returned == NULL, got %p.\n", texture2); + hr = IDirect3DRM2_CreateTexture(d3drm2, NULL, NULL); + ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr); + + texture3 = (IDirect3DRMTexture3 *)0xdeadbeef; + hr = IDirect3DRM3_CreateTexture(d3drm3, NULL, &texture3); + ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr); + ok(!texture3, "Expected texture returned == NULL, got %p.\n", texture3); + hr = IDirect3DRM3_CreateTexture(d3drm3, NULL, NULL); + ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr); + + /* Tests for validation of D3DRMIMAGE struct */ + hr = IDirect3DRM_CreateTexture(d3drm1, &testimg, &texture1); + ok(SUCCEEDED(hr), "Cannot get IDirect3DRMTexture interface (hr = %#x)\n", hr); + hr = IDirect3DRM2_CreateTexture(d3drm2, &testimg, &texture2); + ok(SUCCEEDED(hr), "Cannot get IDirect3DRMTexture2 interface (hr = %#x)\n", hr); + hr = IDirect3DRM3_CreateTexture(d3drm3, &testimg, &texture3); + ok(SUCCEEDED(hr), "Cannot get IDirect3DRMTexture3 interface (hr = %#x)\n", hr); + IDirect3DRMTexture_Release(texture1); + IDirect3DRMTexture2_Release(texture2); + IDirect3DRMTexture3_Release(texture3); + + testimg.rgb = 0; + testimg.palette = (void *)0xdeadbeef; + testimg.palette_size = 0x39; + hr = IDirect3DRM_CreateTexture(d3drm1, &testimg, &texture1); + ok(SUCCEEDED(hr), "Cannot get IDirect3DRMTexture interface (hr = %#x)\n", hr); + hr = IDirect3DRM2_CreateTexture(d3drm2, &testimg, &texture2); + ok(SUCCEEDED(hr), "Cannot get IDirect3DRMTexture2 interface (hr = %#x)\n", hr); + hr = IDirect3DRM3_CreateTexture(d3drm3, &testimg, &texture3); + ok(SUCCEEDED(hr), "Cannot get IDirect3DRMTexture3 interface (hr = %#x)\n", hr); + IDirect3DRMTexture_Release(texture1); + IDirect3DRMTexture2_Release(texture2); + IDirect3DRMTexture3_Release(texture3); + + initimg.rgb = 0; + texture1 = (IDirect3DRMTexture *)0xdeadbeef; + hr = IDirect3DRM_CreateTexture(d3drm1, &initimg, &texture1); + ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr); + ok(!texture1, "Expected texture == NULL, got %p.\n", texture1); + texture2 = (IDirect3DRMTexture2 *)0xdeadbeef; + hr = IDirect3DRM2_CreateTexture(d3drm2, &initimg, &texture2); + ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr); + ok(!texture2, "Expected texture == NULL, got %p.\n", texture2); + texture3 = (IDirect3DRMTexture3 *)0xdeadbeef; + hr = IDirect3DRM3_CreateTexture(d3drm3, &initimg, &texture3); + ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr); + ok(!texture3, "Expected texture == NULL, got %p.\n", texture3); + initimg.rgb = 1; + initimg.red_mask = 0; + hr = IDirect3DRM_CreateTexture(d3drm1, &initimg, &texture1); + ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr); + hr = IDirect3DRM2_CreateTexture(d3drm2, &initimg, &texture2); + ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr); + hr = IDirect3DRM3_CreateTexture(d3drm3, &initimg, &texture3); + ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr); + initimg.red_mask = 0x000000ff; + initimg.green_mask = 0; + hr = IDirect3DRM_CreateTexture(d3drm1, &initimg, &texture1); + ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr); + hr = IDirect3DRM2_CreateTexture(d3drm2, &initimg, &texture2); + ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr); + hr = IDirect3DRM3_CreateTexture(d3drm3, &initimg, &texture3); + ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr); + initimg.green_mask = 0x0000ff00; + initimg.blue_mask = 0; + hr = IDirect3DRM_CreateTexture(d3drm1, &initimg, &texture1); + ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr); + hr = IDirect3DRM2_CreateTexture(d3drm2, &initimg, &texture2); + ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr); + hr = IDirect3DRM3_CreateTexture(d3drm3, &initimg, &texture3); + ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr); + initimg.blue_mask = 0x00ff0000; + initimg.buffer1 = NULL; + hr = IDirect3DRM_CreateTexture(d3drm1, &initimg, &texture1); + ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr); + hr = IDirect3DRM2_CreateTexture(d3drm2, &initimg, &texture2); + ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr); + hr = IDirect3DRM3_CreateTexture(d3drm3, &initimg, &texture3); + ok(hr == D3DRMERR_BADVALUE, "Expected hr == D3DRMERR_BADVALUE, got %#x.\n", hr); + initimg.buffer1 = &pixel; hr = IDirect3DRM_CreateTexture(d3drm1, &initimg, &texture1); - ok(SUCCEEDED(hr), "Cannot get IDirect3DRMTexture interface (hr = %x)\n", hr); + ok(SUCCEEDED(hr), "Cannot get IDirect3DRMTexture interface (hr = %#x)\n", hr); ref2 = get_refcount((IUnknown *)d3drm1); - todo_wine ok(ref2 > ref1, "expected ref2 > ref1, got ref1 = %u , ref2 = %u.\n", ref1, ref2); + ok(ref2 > ref1, "expected ref2 > ref1, got ref1 = %u , ref2 = %u.\n", ref1, ref2); ref3 = get_refcount((IUnknown *)d3drm2); ok(ref3 == ref1, "expected ref3 == ref1, got ref1 = %u , ref3 = %u.\n", ref1, ref3); ref4 = get_refcount((IUnknown *)d3drm3); ok(ref4 == ref1, "expected ref4 == ref1, got ref1 = %u , ref4 = %u.\n", ref1, ref4); hr = IDirect3DRM2_CreateTexture(d3drm2, &initimg, &texture2); - ok(SUCCEEDED(hr), "Cannot get IDirect3DRMTexture2 interface (hr = %x)\n", hr); + ok(SUCCEEDED(hr), "Cannot get IDirect3DRMTexture2 interface (hr = %#x)\n", hr); ref2 = get_refcount((IUnknown *)d3drm1); - todo_wine ok(ref2 > ref1 + 1, "expected ref2 > ref1, got ref1 = %u , ref2 = %u.\n", ref1, ref2); + ok(ref2 > ref1 + 1, "expected ref2 > (ref1 + 1), got ref1 = %u , ref2 = %u.\n", ref1, ref2); ref3 = get_refcount((IUnknown *)d3drm2); ok(ref3 == ref1, "expected ref3 == ref1, got ref1 = %u , ref3 = %u.\n", ref1, ref3); ref4 = get_refcount((IUnknown *)d3drm3); ok(ref4 == ref1, "expected ref4 == ref1, got ref1 = %u , ref4 = %u.\n", ref1, ref4); hr = IDirect3DRM3_CreateTexture(d3drm3, &initimg, &texture3); - ok(SUCCEEDED(hr), "Cannot get IDirect3DRMTexture3 interface (hr = %x)\n", hr); + ok(SUCCEEDED(hr), "Cannot get IDirect3DRMTexture3 interface (hr = %#x)\n", hr); ref2 = get_refcount((IUnknown *)d3drm1); - todo_wine ok(ref2 > ref1 + 2, "expected ref2 > ref1, got ref1 = %u , ref2 = %u.\n", ref1, ref2); + ok(ref2 > ref1 + 2, "expected ref2 > (ref1 + 2), got ref1 = %u , ref2 = %u.\n", ref1, ref2); ref3 = get_refcount((IUnknown *)d3drm2); ok(ref3 == ref1, "expected ref3 == ref1, got ref1 = %u , ref3 = %u.\n", ref1, ref3); ref4 = get_refcount((IUnknown *)d3drm3); @@ -1808,7 +1900,7 @@ static void test_Texture(void) IDirect3DRMTexture_Release(texture1); ref2 = get_refcount((IUnknown *)d3drm1); - todo_wine ok(ref2 - 2 == ref1, "expected ref2 == ref1, got ref1 = %u, ref2 = %u.\n", ref1, ref2); + ok(ref2 - 2 == ref1, "expected (ref2 - 2) == ref1, got ref1 = %u, ref2 = %u.\n", ref1, ref2); ref3 = get_refcount((IUnknown *)d3drm2); ok(ref3 == ref1, "expected ref3 == ref1, got ref1 = %u, ref3 = %u.\n", ref1, ref3); ref4 = get_refcount((IUnknown *)d3drm3); @@ -1832,7 +1924,7 @@ static void test_Texture(void) IDirect3DRMTexture2_Release(texture2); ref2 = get_refcount((IUnknown *)d3drm1); - todo_wine ok(ref2 - 1 == ref1, "expected ref2 == ref1, got ref1 = %u, ref2 = %u.\n", ref1, ref2); + ok(ref2 - 1 == ref1, "expected (ref2 - 1) == ref1, got ref1 = %u, ref2 = %u.\n", ref1, ref2); ref3 = get_refcount((IUnknown *)d3drm2); ok(ref3 == ref1, "expected ref3 == ref1, got ref1 = %u, ref3 = %u.\n", ref1, ref3); ref4 = get_refcount((IUnknown *)d3drm3);