Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/d3d10/effect.c | 40 +++++++++++++++++++++++++++++++++++++-- dlls/d3d10/tests/effect.c | 36 +++++++++++++++++++++++++++-------- 2 files changed, 66 insertions(+), 10 deletions(-)
diff --git a/dlls/d3d10/effect.c b/dlls/d3d10/effect.c index dcfb09211bb..b11dfc9489a 100644 --- a/dlls/d3d10/effect.c +++ b/dlls/d3d10/effect.c @@ -4488,6 +4488,11 @@ static const struct ID3D10EffectVariableVtbl d3d10_effect_variable_vtbl = };
/* ID3D10EffectVariable methods */ +static inline struct d3d10_effect_variable *impl_from_ID3D10EffectConstantBuffer(ID3D10EffectConstantBuffer *iface) +{ + return CONTAINING_RECORD(iface, struct d3d10_effect_variable, ID3D10EffectVariable_iface); +} + static BOOL STDMETHODCALLTYPE d3d10_effect_constant_buffer_IsValid(ID3D10EffectConstantBuffer *iface) { TRACE("iface %p\n", iface); @@ -4649,9 +4654,26 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_constant_buffer_SetConstantBuffer( static HRESULT STDMETHODCALLTYPE d3d10_effect_constant_buffer_GetConstantBuffer(ID3D10EffectConstantBuffer *iface, ID3D10Buffer **buffer) { - FIXME("iface %p, buffer %p stub!\n", iface, buffer); + struct d3d10_effect_variable *v = impl_from_ID3D10EffectConstantBuffer(iface);
- return E_NOTIMPL; + TRACE("iface %p, buffer %p.\n", iface, buffer); + + if (!iface->lpVtbl->IsValid(iface)) + { + WARN("Null variable specified\n"); + return E_FAIL; + } + + if (v->type->basetype != D3D10_SVT_CBUFFER) + { + WARN("Wrong variable type %s.\n", debug_d3d10_shader_variable_type(v->type->basetype)); + return D3DERR_INVALIDCALL; + } + + *buffer = v->u.buffer.buffer; + ID3D10Buffer_AddRef(*buffer); + + return S_OK; }
static HRESULT STDMETHODCALLTYPE d3d10_effect_constant_buffer_SetTextureBuffer(ID3D10EffectConstantBuffer *iface, @@ -4665,8 +4687,22 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_constant_buffer_SetTextureBuffer(I static HRESULT STDMETHODCALLTYPE d3d10_effect_constant_buffer_GetTextureBuffer(ID3D10EffectConstantBuffer *iface, ID3D10ShaderResourceView **view) { + struct d3d10_effect_variable *v = impl_from_ID3D10EffectConstantBuffer(iface); + FIXME("iface %p, view %p stub!\n", iface, view);
+ if (!iface->lpVtbl->IsValid(iface)) + { + WARN("Null variable specified\n"); + return E_FAIL; + } + + if (v->type->basetype != D3D10_SVT_TBUFFER) + { + WARN("Wrong variable type %s.\n", debug_d3d10_shader_variable_type(v->type->basetype)); + return D3DERR_INVALIDCALL; + } + return E_NOTIMPL; }
diff --git a/dlls/d3d10/tests/effect.c b/dlls/d3d10/tests/effect.c index 2844386ef51..ab3cdc71d9c 100644 --- a/dlls/d3d10/tests/effect.c +++ b/dlls/d3d10/tests/effect.c @@ -101,9 +101,12 @@ static void test_effect_constant_buffer_type(void) ID3D10EffectType *type, *type2, *null_type; D3D10_EFFECT_VARIABLE_DESC var_desc; D3D10_EFFECT_TYPE_DESC type_desc; + D3D10_BUFFER_DESC buffer_desc; + ID3D10ShaderResourceView *srv; ID3D10EffectVariable *v; D3D10_EFFECT_DESC desc; ID3D10Device *device; + ID3D10Buffer *buffer; ULONG refcount; HRESULT hr; LPCSTR string; @@ -155,6 +158,20 @@ static void test_effect_constant_buffer_type(void) ok(type_desc.UnpackedSize == 0x10, "UnpackedSize is %#x, expected 0x10\n", type_desc.UnpackedSize); ok(type_desc.Stride == 0x10, "Stride is %#x, expected 0x10\n", type_desc.Stride);
+ hr = constantbuffer->lpVtbl->GetConstantBuffer(constantbuffer, &buffer); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + ID3D10Buffer_GetDesc(buffer, &buffer_desc); + ok(buffer_desc.ByteWidth == type_desc.UnpackedSize, "Unexpected buffer size %u.\n", buffer_desc.ByteWidth); + ok(!buffer_desc.Usage, "Unexpected buffer usage %u.\n", buffer_desc.Usage); + ok(buffer_desc.BindFlags == D3D10_BIND_CONSTANT_BUFFER, "Unexpected bind flags %#x.\n", + buffer_desc.BindFlags); + ok(!buffer_desc.CPUAccessFlags, "Unexpected CPU access flags %#x.\n", buffer_desc.CPUAccessFlags); + ok(!buffer_desc.MiscFlags, "Unexpected misc flags %#x.\n", buffer_desc.MiscFlags); + ID3D10Buffer_Release(buffer); + + hr = constantbuffer->lpVtbl->GetTextureBuffer(constantbuffer, &srv); + ok(hr == D3DERR_INVALIDCALL, "Unexpected hr %#x.\n", hr); + string = type->lpVtbl->GetMemberName(type, 0); ok(strcmp(string, "f1") == 0, "GetMemberName is "%s", expected "f1"\n", string);
@@ -244,6 +261,13 @@ static void test_effect_constant_buffer_type(void) ok(var_desc.BufferOffset == 0x20, "Unexpected buffer offset %#x.\n", var_desc.BufferOffset); ok(var_desc.ExplicitBindPoint == 0x20, "Unexpected bind point %#x.\n", var_desc.ExplicitBindPoint);
+ /* Invalid buffer variable */ + constantbuffer = effect->lpVtbl->GetConstantBufferByIndex(effect, 100); + hr = constantbuffer->lpVtbl->GetConstantBuffer(constantbuffer, &buffer); + ok(hr == E_FAIL, "Unexpected hr %#x.\n", hr); + hr = constantbuffer->lpVtbl->GetTextureBuffer(constantbuffer, &srv); + ok(hr == E_FAIL, "Unexpected hr %#x.\n", hr); + effect->lpVtbl->Release(effect);
refcount = ID3D10Device_Release(device); @@ -7160,15 +7184,11 @@ 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); - if (SUCCEEDED(hr)) - { - ID3D10Buffer_GetDevice(buffer, &device3); - ok(device3 == device2, "Unexpected device.\n"); - ID3D10Device_Release(device3); - ID3D10Buffer_Release(buffer); - } + 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);