[PATCH 5/5] d3dcompiler: Partially implement D3DCompile function.

Matteo Bruni mbruni at codeweavers.com
Tue May 8 09:17:33 CDT 2012


---
 dlls/d3dcompiler_43/compiler.c            |  103 +++++++++++++++++++++++++++-
 dlls/d3dcompiler_43/d3dcompiler_private.h |    3 +
 2 files changed, 102 insertions(+), 4 deletions(-)

diff --git a/dlls/d3dcompiler_43/compiler.c b/dlls/d3dcompiler_43/compiler.c
index 7f4ebdb..96ebb56 100644
--- a/dlls/d3dcompiler_43/compiler.c
+++ b/dlls/d3dcompiler_43/compiler.c
@@ -492,21 +492,116 @@ HRESULT WINAPI D3DAssemble(const void *data, SIZE_T datasize, const char *filena
     return hr;
 }
 
+struct bwriter_shader *parse_hlsl_shader(const char *text, enum shader_type type, DWORD version,
+        const char *entrypoint, char **messages)
+{
+    FIXME("\n");
+    return NULL;
+}
+
+static HRESULT compile_shader(const char *preproc_shader, const char *target, const char *entrypoint,
+        ID3DBlob **shader_blob, ID3DBlob **error_messages)
+{
+    struct bwriter_shader *shader;
+    char *messages = NULL;
+    HRESULT hr;
+    DWORD *res;
+    LPD3DBLOB buffer;
+    int size;
+    char *pos;
+
+    FIXME("Parse compilation target.\n");
+    shader = parse_hlsl_shader(preproc_shader, ST_VERTEX, 2, entrypoint, &messages);
+
+    if (messages)
+    {
+        TRACE("Compiler messages:\n");
+        TRACE("%s", messages);
+
+        TRACE("Shader source:\n");
+        TRACE("%s\n", debugstr_a(preproc_shader));
+
+        if (error_messages)
+        {
+            const char *preproc_messages = *error_messages ? ID3D10Blob_GetBufferPointer(*error_messages) : NULL;
+
+            size = strlen(messages) + (preproc_messages ? strlen(preproc_messages) : 0) + 1;
+            hr = D3DCreateBlob(size, &buffer);
+            if (FAILED(hr))
+            {
+                HeapFree(GetProcessHeap(), 0, messages);
+                if (shader) SlDeleteShader(shader);
+                return hr;
+            }
+            pos = ID3D10Blob_GetBufferPointer(buffer);
+            if (preproc_messages)
+            {
+                CopyMemory(pos, preproc_messages, strlen(preproc_messages) + 1);
+                pos += strlen(preproc_messages);
+            }
+            CopyMemory(pos, messages, strlen(messages) + 1);
+
+            if (*error_messages) ID3D10Blob_Release(*error_messages);
+            *error_messages = buffer;
+        }
+        HeapFree(GetProcessHeap(), 0, messages);
+    }
+
+    if (shader == NULL)
+    {
+        ERR("HLSL shader parsing failed.\n");
+        return D3DXERR_INVALIDDATA;
+    }
+
+    hr = SlWriteBytecode(shader, 9, &res);
+    SlDeleteShader(shader);
+    if (FAILED(hr))
+    {
+        ERR("SlWriteBytecode failed with error 0x%08x.\n", hr);
+        return D3DXERR_INVALIDDATA;
+    }
+
+    if (shader_blob)
+    {
+        size = HeapSize(GetProcessHeap(), 0, res);
+        hr = D3DCreateBlob(size, &buffer);
+        if (FAILED(hr))
+        {
+            HeapFree(GetProcessHeap(), 0, res);
+            return hr;
+        }
+        CopyMemory(ID3D10Blob_GetBufferPointer(buffer), res, size);
+        *shader_blob = buffer;
+    }
+
+    HeapFree(GetProcessHeap(), 0, res);
+
+    return S_OK;
+}
+
 HRESULT WINAPI D3DCompile(const void *data, SIZE_T data_size, const char *filename,
         const D3D_SHADER_MACRO *defines, ID3DInclude *include, const char *entrypoint,
         const char *target, UINT sflags, UINT eflags, ID3DBlob **shader, ID3DBlob **error_messages)
 {
+    HRESULT hr;
+
     FIXME("data %p, data_size %lu, filename %s, defines %p, include %p, entrypoint %s,\n"
             "target %s, sflags %#x, eflags %#x, shader %p, error_messages %p stub!\n",
             data, data_size, debugstr_a(filename), defines, include, debugstr_a(entrypoint),
             debugstr_a(target), sflags, eflags, shader, error_messages);
 
-    TRACE("Shader source:\n%s\n", debugstr_an(data, data_size));
+    if (shader) *shader = NULL;
+    if (error_messages) *error_messages = NULL;
 
-    if (error_messages)
-        D3DCreateBlob(1, error_messages); /* zero fill used as string end */
+    EnterCriticalSection(&wpp_mutex);
 
-    return D3DERR_INVALIDCALL;
+    hr = preprocess_shader(data, data_size, defines, include, error_messages);
+    if (SUCCEEDED(hr))
+        hr = compile_shader(wpp_output, target, entrypoint, shader, error_messages);
+
+    HeapFree(GetProcessHeap(), 0, wpp_output);
+    LeaveCriticalSection(&wpp_mutex);
+    return hr;
 }
 
 HRESULT WINAPI D3DPreprocess(const void *data, SIZE_T size, const char *filename,
diff --git a/dlls/d3dcompiler_43/d3dcompiler_private.h b/dlls/d3dcompiler_43/d3dcompiler_private.h
index d719021..474d8fb 100644
--- a/dlls/d3dcompiler_43/d3dcompiler_private.h
+++ b/dlls/d3dcompiler_43/d3dcompiler_private.h
@@ -573,6 +573,9 @@ struct bwriter_shader *SlAssembleShader(const char *text, char **messages) DECLS
 DWORD SlWriteBytecode(const struct bwriter_shader *shader, int dxversion, DWORD **result) DECLSPEC_HIDDEN;
 void SlDeleteShader(struct bwriter_shader *shader) DECLSPEC_HIDDEN;
 
+struct bwriter_shader *parse_hlsl_shader(const char *text, enum shader_type type, DWORD version,
+        const char *entrypoint, char **messages) DECLSPEC_HIDDEN;
+
 #define MAKE_TAG(ch0, ch1, ch2, ch3) \
     ((DWORD)(ch0) | ((DWORD)(ch1) << 8) | \
     ((DWORD)(ch2) << 16) | ((DWORD)(ch3) << 24 ))
-- 
1.7.3.4




More information about the wine-patches mailing list