From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/d3dx10_43/sprite.c | 37 ++++++++++++++++++++++++++++++++--- dlls/d3dx10_43/tests/d3dx10.c | 14 +++---------- 2 files changed, 37 insertions(+), 14 deletions(-) diff --git a/dlls/d3dx10_43/sprite.c b/dlls/d3dx10_43/sprite.c index 6feae868a44..125ca2a14a7 100644 --- a/dlls/d3dx10_43/sprite.c +++ b/dlls/d3dx10_43/sprite.c @@ -25,6 +25,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3dx); #define D3DERR_INVALIDCALL 0x8876086c +#define D3DX10_SPRITE_READY 0x10000000 struct d3dx10_sprite { @@ -33,6 +34,7 @@ struct d3dx10_sprite D3DXMATRIX projection; ID3D10Device *device; + unsigned int flags; }; static inline struct d3dx10_sprite *impl_from_ID3DX10Sprite(ID3DX10Sprite *iface) @@ -86,40 +88,69 @@ static ULONG WINAPI d3dx10_sprite_Release(ID3DX10Sprite *iface) static HRESULT WINAPI d3dx10_sprite_Begin(ID3DX10Sprite *iface, UINT flags) { - FIXME("iface %p, flags %#x stub!\n", iface, flags); + struct d3dx10_sprite *sprite = impl_from_ID3DX10Sprite(iface); - return E_NOTIMPL; + TRACE("iface %p, flags %#x.\n", iface, flags); + + if (sprite->flags & D3DX10_SPRITE_READY) + return E_FAIL; + + sprite->flags = flags | D3DX10_SPRITE_READY; + + return S_OK; } static HRESULT WINAPI d3dx10_sprite_DrawSpritesBuffered(ID3DX10Sprite *iface, D3DX10_SPRITE *sprites, UINT count) { + struct d3dx10_sprite *sprite = impl_from_ID3DX10Sprite(iface); + FIXME("iface %p, sprites %p, count %u stub!\n", iface, sprites, count); + if (!(sprite->flags & D3DX10_SPRITE_READY)) + return E_FAIL; + return E_NOTIMPL; } static HRESULT WINAPI d3dx10_sprite_Flush(ID3DX10Sprite *iface) { + struct d3dx10_sprite *sprite = impl_from_ID3DX10Sprite(iface); + FIXME("iface %p stub!\n", iface); + if (!(sprite->flags & D3DX10_SPRITE_READY)) + return E_FAIL; + return E_NOTIMPL; } static HRESULT WINAPI d3dx10_sprite_DrawSpritesImmediate(ID3DX10Sprite *iface, D3DX10_SPRITE *sprites, UINT count, UINT size, UINT flags) { + struct d3dx10_sprite *sprite = impl_from_ID3DX10Sprite(iface); + FIXME("iface %p, sprites %p, count %u, size %u, flags %#x stub!\n", iface, sprites, count, size, flags); + if (!(sprite->flags & D3DX10_SPRITE_READY)) + return E_FAIL; + return E_NOTIMPL; } static HRESULT WINAPI d3dx10_sprite_End(ID3DX10Sprite *iface) { + struct d3dx10_sprite *sprite = impl_from_ID3DX10Sprite(iface); + FIXME("iface %p stub!\n", iface); - return E_NOTIMPL; + if (!(sprite->flags & D3DX10_SPRITE_READY)) + return E_FAIL; + + sprite->flags = 0; + + return S_OK; } static HRESULT WINAPI d3dx10_sprite_GetViewTransform(ID3DX10Sprite *iface, D3DXMATRIX *transform) diff --git a/dlls/d3dx10_43/tests/d3dx10.c b/dlls/d3dx10_43/tests/d3dx10.c index 0008a995ff8..f194f7d378d 100644 --- a/dlls/d3dx10_43/tests/d3dx10.c +++ b/dlls/d3dx10_43/tests/d3dx10.c @@ -7734,42 +7734,37 @@ static void test_sprite(void) /* Begin */ hr = ID3DX10Sprite_Begin(sprite, 0); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = ID3DX10Sprite_Begin(sprite, 0); + ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr); + /* Flush/End */ hr = ID3DX10Sprite_Flush(sprite); todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = ID3DX10Sprite_End(sprite); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); /* May not be called before next Begin */ hr = ID3DX10Sprite_Flush(sprite); - todo_wine ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr); hr = ID3DX10Sprite_End(sprite); - todo_wine ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr); /* Draw */ hr = ID3DX10Sprite_DrawSpritesBuffered(sprite, NULL, 0); - todo_wine ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr); memset(&sprite_desc, 0, sizeof(sprite_desc)); hr = ID3DX10Sprite_DrawSpritesBuffered(sprite, &sprite_desc, 0); - todo_wine ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr); hr = ID3DX10Sprite_DrawSpritesBuffered(sprite, &sprite_desc, 1); - todo_wine ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr); hr = ID3DX10Sprite_Begin(sprite, 0); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); memset(&sprite_desc, 0, sizeof(sprite_desc)); @@ -7791,12 +7786,10 @@ static void test_sprite(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = ID3DX10Sprite_End(sprite); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); /* D3DX10_SPRITE_ADDREF_TEXTURES */ hr = ID3DX10Sprite_Begin(sprite, D3DX10_SPRITE_ADDREF_TEXTURES); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); memset(&sprite_desc, 0, sizeof(sprite_desc)); @@ -7815,7 +7808,6 @@ todo_wine { ok(get_refcount(srv1) == refcount, "Unexpected refcount.\n"); hr = ID3DX10Sprite_End(sprite); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ID3DX10Sprite_Release(sprite); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11674