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