d3d10/effect: Implement GetConstantBuffer().
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Matteo Bruni <mbruni@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
5b9407db48
commit
48759a68bb
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue