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:
Nikolay Sivov 2021-10-26 23:25:11 +02:00 committed by Alexandre Julliard
parent 5b9407db48
commit 48759a68bb
2 changed files with 66 additions and 10 deletions

View File

@ -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;
}

View File

@ -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);