[PATCH 2/5] d3d10/effect: Partially implement D3D10CreateEffectPoolFromMemory().

Nikolay Sivov nsivov at codeweavers.com
Sun Sep 19 13:29:23 CDT 2021



On 9/19/21 9:03 PM, Matteo Bruni wrote:
> On Thu, Sep 16, 2021 at 8:48 AM Nikolay Sivov <nsivov at codeweavers.com> wrote:
>> Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
>> ---
>>  dlls/d3d10/d3d10_private.h |   2 +-
>>  dlls/d3d10/effect.c        | 148 +++++++++++++++++++++++++++++++++----
>>  dlls/d3d10/tests/effect.c  | 122 ++++++++++++++++++++++++------
>>  3 files changed, 235 insertions(+), 37 deletions(-)
>> diff --git a/dlls/d3d10/tests/effect.c b/dlls/d3d10/tests/effect.c
>> index 9223fdf51ef..97331c2135e 100644
>> --- a/dlls/d3d10/tests/effect.c
>> +++ b/dlls/d3d10/tests/effect.c
>> @@ -6377,6 +6377,7 @@ static void test_effect_pool(void)
>>      D3D10_EFFECT_DESC desc;
>>      ID3D10Buffer *buffer;
>>      ULONG refcount;
>> +    IUnknown *unk;
>>      HRESULT hr;
>>      BOOL ret;
>>
>> @@ -6394,13 +6395,7 @@ todo_wine
>>      ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
>>
>>      hr = create_effect_pool(fx_test_pool, device, &pool);
>> -todo_wine
>>      ok(hr == S_OK, "Failed to create effect pool, hr %#x.\n", hr);
>> -    if (FAILED(hr))
>> -    {
>> -        ID3D10Device_Release(device);
>> -        return;
>> -    }
>>
>>      refcount = get_refcount(pool);
>>      ok(refcount == 1, "Unexpected refcount %u.\n", refcount);
>> @@ -6412,6 +6407,27 @@ todo_wine
>>      ok(refcount == 2, "Unexpected refcount %u.\n", refcount);
>>      effect->lpVtbl->Release(effect);
>>
>> +    hr = pool->lpVtbl->QueryInterface(pool, &IID_IUnknown, (void **)&unk);
>> +todo_wine
>> +    ok(hr == E_NOINTERFACE, "Unexpected hr %#x.\n", hr);
>> +    if (SUCCEEDED(hr)) IUnknown_Release(unk);
>> +
>> +    hr = pool->lpVtbl->QueryInterface(pool, &IID_ID3D10Effect, (void **)&unk);
>> +    ok(hr == E_NOINTERFACE, "Unexpected hr %#x.\n", hr);
>> +
>> +    hr = pool->lpVtbl->QueryInterface(pool, &IID_ID3D10EffectPool, (void **)&unk);
>> +    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
>> +    ok(unk == (IUnknown *)pool, "Unexpected pointer.\n");
>> +    IUnknown_Release(unk);
>> +
>> +    hr = effect->lpVtbl->QueryInterface(effect, &IID_IUnknown, (void **)&unk);
>> +todo_wine
>> +    ok(hr == E_NOINTERFACE, "Unexpected hr %#x.\n", hr);
>> +    if (SUCCEEDED(hr)) IUnknown_Release(unk);
>> +
>> +    hr = effect->lpVtbl->QueryInterface(effect, &IID_ID3D10Effect, (void **)&unk);
>> +    ok(hr == E_NOINTERFACE, "Unexpected hr %#x.\n", hr);
>> +
> I guess we could fix those two todo_wine by not accepting IID_IUnknown
> in d3d10_effect_pool_QueryInterface(). Any reason not to?
>
> Especially given the last test above, this isn't standard COM by any means...
Yes, it is entirely broken. I wasn't planning to break ours too, it's
just something that I found while testing.
>
>>      hr = effect->lpVtbl->QueryInterface(effect, &IID_ID3D10EffectPool, (void **)&pool2);
>>      ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
>>      ok(pool2 == pool, "Unexpected pool pointer.\n");
>> @@ -6434,24 +6450,28 @@ todo_wine
>>      hr = cb->lpVtbl->GetDesc(cb, &var_desc);
>>      ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
>>      ok(!strcmp(var_desc.Name, "s_cb"), "Unexpected name %s.\n", var_desc.Name);
>> +todo_wine
>>      ok(var_desc.Flags == D3D10_EFFECT_VARIABLE_POOLED, "Unexpected flags %#x.\n", var_desc.Flags);
>>
>>      v = effect->lpVtbl->GetVariableByName(effect, "s_blendstate");
>>      hr = v->lpVtbl->GetDesc(v, &var_desc);
>>      ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
>>      ok(!strcmp(var_desc.Name, "s_blendstate"), "Unexpected name %s.\n", var_desc.Name);
>> +todo_wine
>>      ok(var_desc.Flags == D3D10_EFFECT_VARIABLE_POOLED, "Unexpected flags %#x.\n", var_desc.Flags);
>>
>>      v = effect->lpVtbl->GetVariableByName(effect, "s_texture");
>>      hr = v->lpVtbl->GetDesc(v, &var_desc);
>>      ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
>>      ok(!strcmp(var_desc.Name, "s_texture"), "Unexpected name %s.\n", var_desc.Name);
>> +todo_wine
>>      ok(var_desc.Flags == D3D10_EFFECT_VARIABLE_POOLED, "Unexpected flags %#x.\n", var_desc.Flags);
>>
>>      v = effect->lpVtbl->GetVariableByName(effect, "ps");
>>      hr = v->lpVtbl->GetDesc(v, &var_desc);
>>      ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
>>      ok(!strcmp(var_desc.Name, "ps"), "Unexpected name %s.\n", var_desc.Name);
>> +todo_wine
>>      ok(var_desc.Flags == D3D10_EFFECT_VARIABLE_POOLED, "Unexpected flags %#x.\n", var_desc.Flags);
>>
>>      t = effect->lpVtbl->GetTechniqueByIndex(effect, 0);
>> @@ -6466,11 +6486,31 @@ todo_wine
>>
>>      /* Create standalone effect from the same blob used for pool,  */
>>      hr = create_effect(fx_test_pool, D3D10_EFFECT_COMPILE_CHILD_EFFECT, device, NULL, &child_effect);
>> +todo_wine
>>      ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
>> +    if (SUCCEEDED(hr)) child_effect->lpVtbl->Release(child_effect);
>>
>>      hr = create_effect(fx_test_pool, 0, device, NULL, &effect2);
>>      ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
>>
>> +    hr = effect2->lpVtbl->QueryInterface(effect2, &IID_IUnknown, (void **)&unk);
>> +todo_wine
>> +    ok(hr == E_NOINTERFACE, "Unexpected hr %#x.\n", hr);
>> +    if (SUCCEEDED(hr)) IUnknown_Release(unk);
>> +
>> +    hr = effect2->lpVtbl->QueryInterface(effect2, &IID_ID3D10Effect, (void **)&unk);
>> +todo_wine
>> +    ok(hr == E_NOINTERFACE, "Unexpected hr %#x.\n", hr);
>> +    if (SUCCEEDED(hr)) IUnknown_Release(unk);
>> +
>> +    /* For regular effects querying for ID3D10EffectPool is broken */
>> +    hr = effect2->lpVtbl->QueryInterface(effect2, &IID_ID3D10EffectPool, (void **)&unk);
>> +todo_wine {
>> +    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
>> +    ok(unk == (IUnknown *)effect2, "Unexpected pointer.\n");
>> +}
>> +    if (SUCCEEDED(hr)) IUnknown_Release(unk);
>> +
> I guess this one can remain todo_wine. Not that I see any trouble in
> just making d3d10_effect_QueryInterface() match this behavior.
> Somewhat relatedly, we should probably implement IsValid(), IsPool(),
> IsOptimized() sooner rather than later.
I agree about keeping it as todo, I was thinking doing the same for
broken QI cases above too, but if you want that in, sure.



More information about the wine-devel mailing list