Matteo Bruni : d3dcompiler: D3DPreprocess implementation.

Alexandre Julliard julliard at winehq.org
Mon Sep 13 17:14:45 CDT 2010


Module: wine
Branch: master
Commit: 5504395697e3e7986e63cea22ee53f5fe0698d1d
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=5504395697e3e7986e63cea22ee53f5fe0698d1d

Author: Matteo Bruni <matteo.mystral at gmail.com>
Date:   Thu Sep  9 18:41:39 2010 +0200

d3dcompiler: D3DPreprocess implementation.

---

 dlls/d3dcompiler_43/compiler.c          |  210 +++++++++++++++++++------------
 dlls/d3dcompiler_43/d3dcompiler_43.spec |    2 +-
 include/d3dcompiler.h                   |    4 +
 3 files changed, 132 insertions(+), 84 deletions(-)

diff --git a/dlls/d3dcompiler_43/compiler.c b/dlls/d3dcompiler_43/compiler.c
index 43a5a3a..45f85ad 100644
--- a/dlls/d3dcompiler_43/compiler.c
+++ b/dlls/d3dcompiler_43/compiler.c
@@ -309,6 +309,86 @@ static int wpp_close_output(void)
     return 1;
 }
 
+static HRESULT preprocess_shader(const void *data, SIZE_T data_size,
+        const D3D_SHADER_MACRO *defines, ID3DInclude *include, ID3DBlob **error_messages)
+{
+    int ret;
+    HRESULT hr = S_OK;
+    const D3D_SHADER_MACRO *def = defines;
+
+    static const struct wpp_callbacks wpp_callbacks =
+    {
+        wpp_lookup_mem,
+        wpp_open_mem,
+        wpp_close_mem,
+        wpp_read_mem,
+        wpp_write_mem,
+        wpp_error,
+        wpp_warning,
+    };
+
+    if (def != NULL)
+    {
+        while (def->Name != NULL)
+        {
+            wpp_add_define(def->Name, def->Definition);
+            def++;
+        }
+    }
+    current_include = include;
+    includes_size = 0;
+
+    wpp_output_size = wpp_output_capacity = 0;
+    wpp_output = NULL;
+
+    wpp_set_callbacks(&wpp_callbacks);
+    wpp_messages_size = wpp_messages_capacity = 0;
+    wpp_messages = NULL;
+    current_shader.buffer = data;
+    current_shader.size = data_size;
+
+    ret = wpp_parse("", NULL);
+    if (!wpp_close_output())
+        ret = 1;
+    if (ret)
+    {
+        TRACE("Error during shader preprocessing\n");
+        if (wpp_messages)
+        {
+            int size;
+            ID3DBlob *buffer;
+
+            TRACE("Preprocessor messages:\n%s", wpp_messages);
+
+            if (error_messages)
+            {
+                size = strlen(wpp_messages) + 1;
+                hr = D3DCreateBlob(size, &buffer);
+                if (FAILED(hr))
+                    goto cleanup;
+                CopyMemory(ID3D10Blob_GetBufferPointer(buffer), wpp_messages, size);
+                *error_messages = buffer;
+            }
+        }
+        if (data)
+            TRACE("Shader source:\n%s\n", debugstr_an(data, data_size));
+        hr = E_FAIL;
+    }
+
+cleanup:
+    /* Remove the previously added defines */
+    if (defines != NULL)
+    {
+        while (defines->Name != NULL)
+        {
+            wpp_del_define(defines->Name);
+            defines++;
+        }
+    }
+    HeapFree(GetProcessHeap(), 0, wpp_messages);
+    return hr;
+}
+
 static HRESULT assemble_shader(const char *preprocShader, const char *preprocMessages,
                                LPD3DBLOB* ppShader, LPD3DBLOB* ppErrorMsgs)
 {
@@ -396,97 +476,24 @@ static HRESULT assemble_shader(const char *preprocShader, const char *preprocMes
     return S_OK;
 }
 
-HRESULT WINAPI D3DAssemble(LPCVOID data, SIZE_T datasize, LPCSTR filename,
-                           const D3D_SHADER_MACRO *defines, ID3DInclude *include,
-                           UINT flags,
-                           ID3DBlob **shader, ID3DBlob **error_messages){
-    int ret;
+HRESULT WINAPI D3DAssemble(const void *data, SIZE_T datasize, const char *filename,
+        const D3D_SHADER_MACRO *defines, ID3DInclude *include, UINT flags,
+        ID3DBlob **shader, ID3DBlob **error_messages)
+{
     HRESULT hr;
-    CONST D3D_SHADER_MACRO* def = defines;
-
-    static const struct wpp_callbacks wpp_callbacks = {
-        wpp_lookup_mem,
-        wpp_open_mem,
-        wpp_close_mem,
-        wpp_read_mem,
-        wpp_write_mem,
-        wpp_error,
-        wpp_warning,
-    };
 
     EnterCriticalSection(&wpp_mutex);
 
     /* TODO: flags */
-    if(flags) FIXME("flags: %x\n", flags);
-
-    if(def != NULL)
-    {
-        while(def->Name != NULL)
-        {
-            wpp_add_define(def->Name, def->Definition);
-            def++;
-        }
-    }
-    current_include = include;
-    includes_size = 0;
-
-    if(shader) *shader = NULL;
-    if(error_messages) *error_messages = NULL;
-    wpp_output_size = wpp_output_capacity = 0;
-    wpp_output = NULL;
-
-    /* Preprocess shader */
-    wpp_set_callbacks(&wpp_callbacks);
-    wpp_messages_size = wpp_messages_capacity = 0;
-    wpp_messages = NULL;
-    current_shader.buffer = data;
-    current_shader.size = datasize;
+    if (flags) FIXME("flags %x\n", flags);
 
-    ret = wpp_parse("", NULL);
-    if(!wpp_close_output())
-        ret = 1;
-    if(ret)
-    {
-        TRACE("Error during shader preprocessing\n");
-        if(wpp_messages)
-        {
-            int size;
-            LPD3DBLOB buffer;
+    if (shader) *shader = NULL;
+    if (error_messages) *error_messages = NULL;
 
-            TRACE("Preprocessor messages:\n");
-            TRACE("%s", wpp_messages);
+    hr = preprocess_shader(data, datasize, defines, include, error_messages);
+    if (SUCCEEDED(hr))
+        hr = assemble_shader(wpp_output, wpp_messages, shader, error_messages);
 
-            if(error_messages)
-            {
-                size = strlen(wpp_messages) + 1;
-                hr = D3DCreateBlob(size, &buffer);
-                if(FAILED(hr)) goto cleanup;
-                CopyMemory(ID3D10Blob_GetBufferPointer(buffer), wpp_messages, size);
-                *error_messages = buffer;
-            }
-        }
-        if(data)
-        {
-            TRACE("Shader source:\n");
-            TRACE("%s\n", debugstr_an(data, datasize));
-        }
-        hr = D3DXERR_INVALIDDATA;
-        goto cleanup;
-    }
-
-    hr = assemble_shader(wpp_output, wpp_messages, shader, error_messages);
-
-cleanup:
-    /* Remove the previously added defines */
-    if(defines != NULL)
-    {
-        while(defines->Name != NULL)
-        {
-            wpp_del_define(defines->Name);
-            defines++;
-        }
-    }
-    HeapFree(GetProcessHeap(), 0, wpp_messages);
     HeapFree(GetProcessHeap(), 0, wpp_output);
     LeaveCriticalSection(&wpp_mutex);
     return hr;
@@ -508,3 +515,40 @@ HRESULT WINAPI D3DCompile(const void *data, SIZE_T data_size, const char *filena
 
     return D3DERR_INVALIDCALL;
 }
+
+HRESULT WINAPI D3DPreprocess(const void *data, SIZE_T size, const char *filename,
+        const D3D_SHADER_MACRO *defines, ID3DInclude *include,
+        ID3DBlob **shader, ID3DBlob **error_messages)
+{
+    HRESULT hr;
+    ID3DBlob *buffer;
+
+    if (!data)
+        return E_INVALIDARG;
+
+    EnterCriticalSection(&wpp_mutex);
+
+    if (shader) *shader = NULL;
+    if (error_messages) *error_messages = NULL;
+
+    hr = preprocess_shader(data, size, defines, include, error_messages);
+
+    if (SUCCEEDED(hr))
+    {
+        if (shader)
+        {
+            hr = D3DCreateBlob(wpp_output_size, &buffer);
+            if (FAILED(hr))
+                goto cleanup;
+            CopyMemory(ID3D10Blob_GetBufferPointer(buffer), wpp_output, wpp_output_size);
+            *shader = buffer;
+        }
+        else
+            hr = E_INVALIDARG;
+    }
+
+cleanup:
+    HeapFree(GetProcessHeap(), 0, wpp_output);
+    LeaveCriticalSection(&wpp_mutex);
+    return hr;
+}
diff --git a/dlls/d3dcompiler_43/d3dcompiler_43.spec b/dlls/d3dcompiler_43/d3dcompiler_43.spec
index ef57d52..ecd2d04 100644
--- a/dlls/d3dcompiler_43/d3dcompiler_43.spec
+++ b/dlls/d3dcompiler_43/d3dcompiler_43.spec
@@ -11,7 +11,7 @@
 @ stub D3DGetInputAndOutputSignatureBlob
 @ stub D3DGetInputSignatureBlob
 @ stub D3DGetOutputSignatureBlob
-@ stub D3DPreprocess
+@ stdcall D3DPreprocess(ptr long str ptr ptr ptr ptr)
 @ stub D3DReflect
 @ stub D3DReturnFailure1
 @ stub D3DStripShader
diff --git a/include/d3dcompiler.h b/include/d3dcompiler.h
index 9929cba..3a44d7f 100644
--- a/include/d3dcompiler.h
+++ b/include/d3dcompiler.h
@@ -47,4 +47,8 @@ HRESULT WINAPI D3DCompile(const void *data, SIZE_T data_size, const char *filena
 
 HRESULT WINAPI D3DCreateBlob(SIZE_T data_size, ID3DBlob **blob);
 
+HRESULT WINAPI D3DPreprocess(const void *data, SIZE_T size, const char *filename,
+        const D3D_SHADER_MACRO *defines, ID3DInclude *include,
+        ID3DBlob **shader, ID3DBlob **error_messages);
+
 #endif




More information about the wine-cvs mailing list