[PATCH 2/5] d3dcompiler: Partially implement D3DCompile function. (resend)

Matteo Bruni mbruni at codeweavers.com
Tue May 15 09:12:54 CDT 2012


---
 dlls/d3dcompiler_43/compiler.c |  101 ++++++++++++++++++++++++++++++++++++++--
 1 files changed, 97 insertions(+), 4 deletions(-)

diff --git a/dlls/d3dcompiler_43/compiler.c b/dlls/d3dcompiler_43/compiler.c
index e273d6b..8ed7be1 100644
--- a/dlls/d3dcompiler_43/compiler.c
+++ b/dlls/d3dcompiler_43/compiler.c
@@ -490,21 +490,114 @@ HRESULT WINAPI D3DAssemble(const void *data, SIZE_T datasize, const char *filena
     return hr;
 }
 
+static 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, size;
+    ID3DBlob *buffer;
+    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)
+            {
+                memcpy(pos, preproc_messages, strlen(preproc_messages) + 1);
+                pos += strlen(preproc_messages);
+            }
+            memcpy(pos, messages, strlen(messages) + 1);
+
+            if (*error_messages) ID3D10Blob_Release(*error_messages);
+            *error_messages = buffer;
+        }
+        HeapFree(GetProcessHeap(), 0, messages);
+    }
+
+    if (!shader)
+    {
+        ERR("HLSL shader parsing failed.\n");
+        return D3DXERR_INVALIDDATA;
+    }
+
+    hr = SlWriteBytecode(shader, 9, &res, &size);
+    SlDeleteShader(shader);
+    if (FAILED(hr))
+    {
+        ERR("SlWriteBytecode failed with error 0x%08x.\n", hr);
+        return D3DXERR_INVALIDDATA;
+    }
+
+    if (shader_blob)
+    {
+        hr = D3DCreateBlob(size, &buffer);
+        if (FAILED(hr))
+        {
+            HeapFree(GetProcessHeap(), 0, res);
+            return hr;
+        }
+        memcpy(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;
+
+    EnterCriticalSection(&wpp_mutex);
 
-    if (error_messages)
-        D3DCreateBlob(1, error_messages); /* zero fill used as string end */
+    hr = preprocess_shader(data, data_size, defines, include, error_messages);
+    if (SUCCEEDED(hr))
+        hr = compile_shader(wpp_output, target, entrypoint, shader, error_messages);
 
-    return D3DERR_INVALIDCALL;
+    HeapFree(GetProcessHeap(), 0, wpp_output);
+    LeaveCriticalSection(&wpp_mutex);
+    return hr;
 }
 
 HRESULT WINAPI D3DPreprocess(const void *data, SIZE_T size, const char *filename,
-- 
1.7.3.4




More information about the wine-patches mailing list