Nikolay Sivov : d3d10/effect: Implement GetConstantBuffer().
Alexandre Julliard
julliard at winehq.org
Wed Oct 27 16:26:02 CDT 2021
Module: wine
Branch: master
Commit: 48759a68bbf8fdc4737bccd3631af04ec5fe41e5
URL: https://source.winehq.org/git/wine.git/?a=commit;h=48759a68bbf8fdc4737bccd3631af04ec5fe41e5
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Tue Oct 26 23:25:11 2021 +0200
d3d10/effect: Implement GetConstantBuffer().
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Matteo Bruni <mbruni at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
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..de2be971c9f 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);
More information about the wine-cvs
mailing list