[PATCH 5/5] d3dx9_36: Find, store and enable retreival of CTAB comment data in shader (based on code from Luis Busquets)

Christian Costa titan.costa at wanadoo.fr
Sun Feb 21 15:30:51 CST 2010


---

 dlls/d3dx9_36/shader.c |   30 ++++++++++++++++++++++++++----
 1 files changed, 26 insertions(+), 4 deletions(-)
-------------- next part --------------
diff --git a/dlls/d3dx9_36/shader.c b/dlls/d3dx9_36/shader.c
index 09306f0..456409a 100644
--- a/dlls/d3dx9_36/shader.c
+++ b/dlls/d3dx9_36/shader.c
@@ -273,6 +273,8 @@ static const struct ID3DXConstantTableVtbl ID3DXConstantTable_Vtbl;
 typedef struct ID3DXConstantTableImpl {
     const ID3DXConstantTableVtbl *lpVtbl;
     LONG ref;
+    LPVOID ctab;
+    DWORD size;
 } ID3DXConstantTableImpl;
 
 /*** IUnknown methods ***/
@@ -312,7 +314,10 @@ static ULONG WINAPI ID3DXConstantTableImpl_Release(ID3DXConstantTable* iface)
     TRACE("(%p)->(): Release from %d\n", This, ref + 1);
 
     if (!ref)
+    {
+        HeapFree(GetProcessHeap(), 0, This->ctab);
         HeapFree(GetProcessHeap(), 0, This);
+    }
 
     return ref;
 }
@@ -322,18 +327,18 @@ static LPVOID WINAPI ID3DXConstantTableImpl_GetBufferPointer(ID3DXConstantTable*
 {
     ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
 
-    FIXME("(%p)->(): stub\n", This);
+    TRACE("(%p)->()\n", This);
 
-    return NULL;
+    return This->ctab;
 }
 
 static DWORD WINAPI ID3DXConstantTableImpl_GetBufferSize(ID3DXConstantTable* iface)
 {
     ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface;
 
-    FIXME("(%p)->(): stub\n", This);
+    TRACE("(%p)->()\n", This);
 
-    return 0;
+    return This->size;
 }
 
 /*** ID3DXConstantTable methods ***/
@@ -579,12 +584,19 @@ HRESULT WINAPI D3DXGetShaderConstantTableEx(CONST DWORD* pFunction,
                                             LPD3DXCONSTANTTABLE* ppConstantTable)
 {
     ID3DXConstantTableImpl* object;
+    HRESULT hr;
+    LPCVOID pData;
+    UINT size;
 
     FIXME("(%p, %x, %p): semi-stub\n", pFunction, flags, ppConstantTable);
 
     if (!pFunction || !ppConstantTable)
         return D3DERR_INVALIDCALL;
 
+    hr = D3DXFindShaderComment(pFunction, MAKEFOURCC('C','T','A','B'), &pData, &size);
+    if (hr != D3D_OK)
+        return D3DXERR_INVALIDDATA;
+
     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(ID3DXConstantTableImpl));
     if (!object)
     {
@@ -595,6 +607,16 @@ HRESULT WINAPI D3DXGetShaderConstantTableEx(CONST DWORD* pFunction,
     object->lpVtbl = &ID3DXConstantTable_Vtbl;
     object->ref = 1;
 
+    object->ctab = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size);
+    if (!object->ctab)
+    {
+        HeapFree(GetProcessHeap(), 0, object);
+        ERR("Out of memory\n");
+        return E_OUTOFMEMORY;
+    }
+    object->size = size;
+    memcpy(object->ctab, pData, object->size);
+
     *ppConstantTable = (LPD3DXCONSTANTTABLE)object;
 
     return D3D_OK;


More information about the wine-patches mailing list