[PATCH 2/5] d3d10/effect: Partially implement D3D10CreateEffectPoolFromMemory().
Nikolay Sivov
nsivov at codeweavers.com
Thu Sep 16 01:48:09 CDT 2021
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/d3d10_private.h b/dlls/d3d10/d3d10_private.h
index 4d73121d6ca..a230d0bcbe6 100644
--- a/dlls/d3d10/d3d10_private.h
+++ b/dlls/d3d10/d3d10_private.h
@@ -257,10 +257,10 @@ struct d3d10_effect_anonymous_shader
};
/* ID3D10Effect */
-extern const struct ID3D10EffectVtbl d3d10_effect_vtbl DECLSPEC_HIDDEN;
struct d3d10_effect
{
ID3D10Effect ID3D10Effect_iface;
+ ID3D10EffectPool ID3D10EffectPool_iface;
LONG refcount;
ID3D10Device *device;
diff --git a/dlls/d3d10/effect.c b/dlls/d3d10/effect.c
index 7342c2dbe23..10b8565c8d7 100644
--- a/dlls/d3d10/effect.c
+++ b/dlls/d3d10/effect.c
@@ -44,6 +44,13 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d10);
#define D3D10_FX10_TYPE_MATRIX_COLUMN_MAJOR_MASK 0x4000
+static inline struct d3d10_effect *impl_from_ID3D10EffectPool(ID3D10EffectPool *iface)
+{
+ return CONTAINING_RECORD(iface, struct d3d10_effect, ID3D10EffectPool_iface);
+}
+
+static const struct ID3D10EffectVtbl d3d10_effect_pool_effect_vtbl;
+
static const struct ID3D10EffectTechniqueVtbl d3d10_effect_technique_vtbl;
static const struct ID3D10EffectPassVtbl d3d10_effect_pass_vtbl;
static const struct ID3D10EffectVariableVtbl d3d10_effect_variable_vtbl;
@@ -3139,9 +3146,11 @@ static BOOL STDMETHODCALLTYPE d3d10_effect_IsValid(ID3D10Effect *iface)
static BOOL STDMETHODCALLTYPE d3d10_effect_IsPool(ID3D10Effect *iface)
{
- FIXME("iface %p stub!\n", iface);
+ struct d3d10_effect *effect = impl_from_ID3D10Effect(iface);
- return FALSE;
+ TRACE("iface %p.\n", iface);
+
+ return effect->ID3D10Effect_iface.lpVtbl == &d3d10_effect_pool_effect_vtbl;
}
static HRESULT STDMETHODCALLTYPE d3d10_effect_GetDevice(ID3D10Effect *iface, ID3D10Device **device)
@@ -8361,6 +8370,57 @@ static const struct ID3D10EffectTypeVtbl d3d10_effect_type_vtbl =
d3d10_effect_type_GetMemberSemantic,
};
+static HRESULT STDMETHODCALLTYPE d3d10_effect_pool_QueryInterface(ID3D10EffectPool *iface,
+ REFIID riid, void **object)
+{
+ TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object);
+
+ if (IsEqualGUID(riid, &IID_ID3D10EffectPool) ||
+ IsEqualGUID(riid, &IID_IUnknown))
+ {
+ IUnknown_AddRef(iface);
+ *object = iface;
+ return S_OK;
+ }
+
+ WARN("%s not implemented, returning E_NOINTERFACE\n", debugstr_guid(riid));
+
+ *object = NULL;
+ return E_NOINTERFACE;
+}
+
+static ULONG STDMETHODCALLTYPE d3d10_effect_pool_AddRef(ID3D10EffectPool *iface)
+{
+ struct d3d10_effect *effect = impl_from_ID3D10EffectPool(iface);
+ return d3d10_effect_AddRef(&effect->ID3D10Effect_iface);
+}
+
+static ULONG STDMETHODCALLTYPE d3d10_effect_pool_Release(ID3D10EffectPool *iface)
+{
+ struct d3d10_effect *effect = impl_from_ID3D10EffectPool(iface);
+ return d3d10_effect_Release(&effect->ID3D10Effect_iface);
+}
+
+static ID3D10Effect * STDMETHODCALLTYPE d3d10_effect_pool_AsEffect(ID3D10EffectPool *iface)
+{
+ struct d3d10_effect *effect = impl_from_ID3D10EffectPool(iface);
+
+ TRACE("%p.\n", iface);
+
+ return &effect->ID3D10Effect_iface;
+}
+
+const struct ID3D10EffectPoolVtbl d3d10_effect_pool_vtbl =
+{
+ /* IUnknown methods */
+ d3d10_effect_pool_QueryInterface,
+ d3d10_effect_pool_AddRef,
+ d3d10_effect_pool_Release,
+ /* ID3D10EffectPool methods */
+ d3d10_effect_pool_AsEffect,
+};
+
+
static int d3d10_effect_type_compare(const void *key, const struct wine_rb_entry *entry)
{
const struct d3d10_effect_type *t = WINE_RB_ENTRY_VALUE(entry, const struct d3d10_effect_type, entry);
@@ -8369,23 +8429,18 @@ static int d3d10_effect_type_compare(const void *key, const struct wine_rb_entry
return *id - t->id;
}
-HRESULT WINAPI D3D10CreateEffectFromMemory(void *data, SIZE_T data_size, UINT flags,
- ID3D10Device *device, ID3D10EffectPool *effect_pool, ID3D10Effect **effect)
+static HRESULT d3d10_create_effect(void *data, SIZE_T data_size, ID3D10Device *device,
+ const ID3D10EffectVtbl *vtbl, struct d3d10_effect **effect)
{
struct d3d10_effect *object;
HRESULT hr;
- FIXME("data %p, data_size %lu, flags %#x, device %p, effect_pool %p, effect %p stub!\n",
- data, data_size, flags, device, effect_pool, effect);
-
if (!(object = heap_alloc_zero(sizeof(*object))))
- {
- ERR("Failed to allocate D3D10 effect object memory\n");
return E_OUTOFMEMORY;
- }
wine_rb_init(&object->types, d3d10_effect_type_compare);
- object->ID3D10Effect_iface.lpVtbl = &d3d10_effect_vtbl;
+ object->ID3D10Effect_iface.lpVtbl = vtbl;
+ object->ID3D10EffectPool_iface.lpVtbl = &d3d10_effect_pool_vtbl;
object->refcount = 1;
ID3D10Device_AddRef(device);
object->device = device;
@@ -8398,18 +8453,83 @@ HRESULT WINAPI D3D10CreateEffectFromMemory(void *data, SIZE_T data_size, UINT fl
return hr;
}
+ *effect = object;
+
+ return S_OK;
+}
+
+HRESULT WINAPI D3D10CreateEffectFromMemory(void *data, SIZE_T data_size, UINT flags,
+ ID3D10Device *device, ID3D10EffectPool *effect_pool, ID3D10Effect **effect)
+{
+ struct d3d10_effect *object;
+ HRESULT hr;
+
+ FIXME("data %p, data_size %lu, flags %#x, device %p, effect_pool %p, effect %p stub!\n",
+ data, data_size, flags, device, effect_pool, effect);
+
+ if (FAILED(hr = d3d10_create_effect(data, data_size, device, &d3d10_effect_vtbl, &object)))
+ {
+ WARN("Failed to create an effect, hr %#x.\n", hr);
+ }
+
*effect = &object->ID3D10Effect_iface;
TRACE("Created effect %p\n", object);
- return S_OK;
+ return hr;
}
+static HRESULT STDMETHODCALLTYPE d3d10_effect_pool_effect_QueryInterface(ID3D10Effect *iface,
+ REFIID riid, void **object)
+{
+ struct d3d10_effect *effect = impl_from_ID3D10Effect(iface);
+
+ TRACE("iface %p, riid %s, obj %p.\n", iface, debugstr_guid(riid), object);
+
+ return IUnknown_QueryInterface(&effect->ID3D10EffectPool_iface, riid, object);
+}
+
+static const struct ID3D10EffectVtbl d3d10_effect_pool_effect_vtbl =
+{
+ /* IUnknown methods */
+ d3d10_effect_pool_effect_QueryInterface,
+ d3d10_effect_AddRef,
+ d3d10_effect_Release,
+ /* ID3D10Effect methods */
+ d3d10_effect_IsValid,
+ d3d10_effect_IsPool,
+ d3d10_effect_GetDevice,
+ d3d10_effect_GetDesc,
+ d3d10_effect_GetConstantBufferByIndex,
+ d3d10_effect_GetConstantBufferByName,
+ d3d10_effect_GetVariableByIndex,
+ d3d10_effect_GetVariableByName,
+ d3d10_effect_GetVariableBySemantic,
+ d3d10_effect_GetTechniqueByIndex,
+ d3d10_effect_GetTechniqueByName,
+ d3d10_effect_Optimize,
+ d3d10_effect_IsOptimized,
+};
+
HRESULT WINAPI D3D10CreateEffectPoolFromMemory(void *data, SIZE_T data_size, UINT fx_flags,
ID3D10Device *device, ID3D10EffectPool **effect_pool)
{
- FIXME("data %p, data_size %lu, fx_flags %#x, device %p, effect_pool %p stub.\n",
+ struct d3d10_effect *object;
+ HRESULT hr;
+
+ TRACE("data %p, data_size %lu, fx_flags %#x, device %p, effect_pool %p.\n",
data, data_size, fx_flags, device, effect_pool);
- return E_NOTIMPL;
+ if (FAILED(hr = d3d10_create_effect(data, data_size, device, &d3d10_effect_pool_effect_vtbl,
+ &object)))
+ {
+ WARN("Failed to create an effect, hr %#x.\n", hr);
+ return hr;
+ }
+
+ *effect_pool = &object->ID3D10EffectPool_iface;
+
+ TRACE("Created effect pool %p.\n", object);
+
+ return hr;
}
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);
+
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);
+
ret = effect2->lpVtbl->IsPool(effect2);
ok(!ret, "Unexpected pool.\n");
@@ -6505,24 +6545,33 @@ todo_wine
ID3D10Device_Release(device3);
cb = child_effect->lpVtbl->GetConstantBufferByName(child_effect, "s_cb");
+todo_wine
ok(cb->lpVtbl->IsValid(cb), "Expected valid constant buffer.\n");
hr = cb->lpVtbl->GetConstantBuffer(cb, &buffer);
+todo_wine
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
- ID3D10Buffer_GetDevice(buffer, &device3);
- ok(device3 == device2, "Unexpected device.\n");
- ID3D10Device_Release(device3);
- ID3D10Buffer_Release(buffer);
+ if (SUCCEEDED(hr))
+ {
+ ID3D10Buffer_GetDevice(buffer, &device3);
+ ok(device3 == device2, "Unexpected device.\n");
+ ID3D10Device_Release(device3);
+ ID3D10Buffer_Release(buffer);
+ }
child_effect->lpVtbl->Release(child_effect);
pool2->lpVtbl->Release(pool2);
/* When pool is specified, corresponding flag has to be set. */
hr = create_effect(fx_test_pool_child, 0, device, pool, &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_child, 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);
refcount = get_refcount(pool);
ok(refcount == 1, "Unexpected refcount %u.\n", refcount);
@@ -6531,15 +6580,19 @@ todo_wine
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
refcount = get_refcount(pool);
+todo_wine
ok(refcount == 2, "Unexpected refcount %u.\n", refcount);
hr = child_effect->lpVtbl->GetDesc(child_effect, &desc);
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+todo_wine
ok(desc.IsChildEffect, "Unexpected child flag.\n");
ok(desc.ConstantBuffers == 2, "Unexpected buffer count %u.\n", desc.ConstantBuffers);
+todo_wine
ok(desc.SharedConstantBuffers == 1, "Unexpected shared buffer count %u.\n",
desc.SharedConstantBuffers);
ok(desc.GlobalVariables == 2, "Unexpected variables count %u.\n", desc.GlobalVariables);
+todo_wine
ok(desc.SharedGlobalVariables == 5, "Unexpected shared variables count %u.\n",
desc.SharedGlobalVariables);
@@ -6564,12 +6617,17 @@ todo_wine
cb = child_effect->lpVtbl->GetConstantBufferByIndex(child_effect, 2);
ret = cb->lpVtbl->IsValid(cb);
+todo_wine
ok(ret, "Unexpected invalid variable.\n");
hr = cb->lpVtbl->GetDesc(cb, &var_desc);
+todo_wine
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
- ok(!strcmp(var_desc.Name, "s_cb"), "Unexpected name %s.\n", var_desc.Name);
- ok(var_desc.Flags == D3D10_EFFECT_VARIABLE_POOLED, "Unexpected flags %#x.\n", var_desc.Flags);
+ if (SUCCEEDED(hr))
+ {
+ ok(!strcmp(var_desc.Name, "s_cb"), "Unexpected name %s.\n", var_desc.Name);
+ ok(var_desc.Flags == D3D10_EFFECT_VARIABLE_POOLED, "Unexpected flags %#x.\n", var_desc.Flags);
+ }
/* Pool techniques are not accessible */
t = effect->lpVtbl->GetTechniqueByIndex(effect, 0);
@@ -6593,27 +6651,43 @@ todo_wine
v = child_effect->lpVtbl->GetVariableByIndex(child_effect, 2);
hr = v->lpVtbl->GetDesc(v, &var_desc);
+todo_wine
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
- ok(!strcmp(var_desc.Name, "f1"), "Unexpected name %s.\n", var_desc.Name);
- ok(var_desc.Flags == D3D10_EFFECT_VARIABLE_POOLED, "Unexpected flags %#x.\n", var_desc.Flags);
+ if (SUCCEEDED(hr))
+ {
+ ok(!strcmp(var_desc.Name, "f1"), "Unexpected name %s.\n", var_desc.Name);
+ ok(var_desc.Flags == D3D10_EFFECT_VARIABLE_POOLED, "Unexpected flags %#x.\n", var_desc.Flags);
+ }
v = child_effect->lpVtbl->GetVariableByIndex(child_effect, 3);
hr = v->lpVtbl->GetDesc(v, &var_desc);
+todo_wine
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
- ok(!strcmp(var_desc.Name, "f2"), "Unexpected name %s.\n", var_desc.Name);
- ok(var_desc.Flags == D3D10_EFFECT_VARIABLE_POOLED, "Unexpected flags %#x.\n", var_desc.Flags);
+ if (SUCCEEDED(hr))
+ {
+ ok(!strcmp(var_desc.Name, "f2"), "Unexpected name %s.\n", var_desc.Name);
+ ok(var_desc.Flags == D3D10_EFFECT_VARIABLE_POOLED, "Unexpected flags %#x.\n", var_desc.Flags);
+ }
v = child_effect->lpVtbl->GetVariableByIndex(child_effect, 4);
hr = v->lpVtbl->GetDesc(v, &var_desc);
+todo_wine
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
- ok(!strcmp(var_desc.Name, "s_blendstate"), "Unexpected name %s.\n", var_desc.Name);
- ok(var_desc.Flags == D3D10_EFFECT_VARIABLE_POOLED, "Unexpected flags %#x.\n", var_desc.Flags);
+ if (SUCCEEDED(hr))
+ {
+ ok(!strcmp(var_desc.Name, "s_blendstate"), "Unexpected name %s.\n", var_desc.Name);
+ ok(var_desc.Flags == D3D10_EFFECT_VARIABLE_POOLED, "Unexpected flags %#x.\n", var_desc.Flags);
+ }
v = child_effect->lpVtbl->GetVariableByName(child_effect, "s_texture");
hr = v->lpVtbl->GetDesc(v, &var_desc);
+todo_wine
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
- ok(!strcmp(var_desc.Name, "s_texture"), "Unexpected name %s.\n", var_desc.Name);
- ok(var_desc.Flags == D3D10_EFFECT_VARIABLE_POOLED, "Unexpected flags %#x.\n", var_desc.Flags);
+ if (SUCCEEDED(hr))
+ {
+ ok(!strcmp(var_desc.Name, "s_texture"), "Unexpected name %s.\n", var_desc.Name);
+ ok(var_desc.Flags == D3D10_EFFECT_VARIABLE_POOLED, "Unexpected flags %#x.\n", var_desc.Flags);
+ }
v = child_effect->lpVtbl->GetVariableBySemantic(child_effect, "COLOR0");
hr = v->lpVtbl->GetDesc(v, &var_desc);
@@ -6623,9 +6697,13 @@ todo_wine
v = child_effect->lpVtbl->GetVariableBySemantic(child_effect, "COLOR1");
hr = v->lpVtbl->GetDesc(v, &var_desc);
+todo_wine
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
- ok(!strcmp(var_desc.Name, "f2"), "Unexpected name %s.\n", var_desc.Name);
- ok(var_desc.Flags == D3D10_EFFECT_VARIABLE_POOLED, "Unexpected flags %#x.\n", var_desc.Flags);
+ if (SUCCEEDED(hr))
+ {
+ ok(!strcmp(var_desc.Name, "f2"), "Unexpected name %s.\n", var_desc.Name);
+ ok(var_desc.Flags == D3D10_EFFECT_VARIABLE_POOLED, "Unexpected flags %#x.\n", var_desc.Flags);
+ }
child_effect->lpVtbl->Release(child_effect);
--
2.33.0
More information about the wine-devel
mailing list