From: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> --- dlls/d3dx10_43/sprite.c | 17 +++++++++++++++++ dlls/d3dx10_43/tests/d3dx10.c | 3 +-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/dlls/d3dx10_43/sprite.c b/dlls/d3dx10_43/sprite.c index 125ca2a14a7..7dfe224b3e0 100644 --- a/dlls/d3dx10_43/sprite.c +++ b/dlls/d3dx10_43/sprite.c @@ -34,6 +34,7 @@ struct d3dx10_sprite D3DXMATRIX projection; ID3D10Device *device; + ID3D10StateBlock *state_block; unsigned int flags; }; @@ -80,6 +81,8 @@ static ULONG WINAPI d3dx10_sprite_Release(ID3DX10Sprite *iface) if (!refcount) { ID3D10Device_Release(sprite->device); + if (sprite->state_block) + IUnknown_Release(sprite->state_block); free(sprite); } @@ -96,6 +99,8 @@ static HRESULT WINAPI d3dx10_sprite_Begin(ID3DX10Sprite *iface, UINT flags) return E_FAIL; sprite->flags = flags | D3DX10_SPRITE_READY; + if (sprite->flags & D3DX10_SPRITE_SAVE_STATE) + sprite->state_block->lpVtbl->Capture(sprite->state_block); return S_OK; } @@ -148,6 +153,8 @@ static HRESULT WINAPI d3dx10_sprite_End(ID3DX10Sprite *iface) if (!(sprite->flags & D3DX10_SPRITE_READY)) return E_FAIL; + if (sprite->flags & D3DX10_SPRITE_SAVE_STATE) + sprite->state_block->lpVtbl->Apply(sprite->state_block); sprite->flags = 0; return S_OK; @@ -231,6 +238,8 @@ static const ID3DX10SpriteVtbl d3dx10_sprite_vtbl = HRESULT WINAPI D3DX10CreateSprite(ID3D10Device *device, UINT size, ID3DX10Sprite **sprite) { struct d3dx10_sprite *object; + D3D10_STATE_BLOCK_MASK mask; + HRESULT hr; TRACE("device %p, size %u, sprite %p.\n", device, size, sprite); @@ -251,6 +260,14 @@ HRESULT WINAPI D3DX10CreateSprite(ID3D10Device *device, UINT size, ID3DX10Sprite object->projection._33 = 1.0f; object->projection._44 = 1.0f; + /* TODO: we shouldn't be capturing entire state */ + D3D10StateBlockMaskEnableAll(&mask); + if (FAILED(hr = D3D10CreateStateBlock(device, &mask, &object->state_block))) + { + ID3DX10Sprite_Release(&object->ID3DX10Sprite_iface); + return hr; + } + *sprite = &object->ID3DX10Sprite_iface; return S_OK; diff --git a/dlls/d3dx10_43/tests/d3dx10.c b/dlls/d3dx10_43/tests/d3dx10.c index 645ce527ee1..721c2d6df51 100644 --- a/dlls/d3dx10_43/tests/d3dx10.c +++ b/dlls/d3dx10_43/tests/d3dx10.c @@ -7868,15 +7868,14 @@ static void test_sprite_save_state(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ID3D10Device_OMGetBlendState(device, NULL, blend_factor, NULL); + todo_wine ok(blend_factor[0] == 0.5f && blend_factor[1] == 0.6f && blend_factor[2] == 0.7f && blend_factor[3] == 0.8f, "Got unexpected blend factor {%.8e, %.8e, %.8e, %.8e}.\n", blend_factor[0], blend_factor[1], blend_factor[2], blend_factor[3]); ID3D10Device_IAGetPrimitiveTopology(device, &topology); - todo_wine ok(topology == D3D10_PRIMITIVE_TOPOLOGY_POINTLIST, "Unexpected topology %d.\n", topology); ID3D10Device_VSGetShader(device, &tmp_vs); - todo_wine ok(vs == tmp_vs, "Unexpected shader.\n"); ID3D10VertexShader_Release(tmp_vs); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11674