From 164dcc79738b60061a6565521f0b6eb797ec99fc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Rico=20Sch=C3=BCller?= <kgbricola@web.de>
Date: Sun, 3 Oct 2010 15:12:06 +0200
Subject: [PATCH] d3dcompiler: Implement D3DGetOutputSignatureBlob().

---
 dlls/d3dcompiler_43/blob.c                | 5 +++++
 dlls/d3dcompiler_43/d3dcompiler_43.spec   | 2 +-
 dlls/d3dcompiler_43/d3dcompiler_43_main.c | 7 +++++++
 dlls/d3dcompiler_43/d3dcompiler_private.h | 1 +
 include/d3dcompiler.h                     | 1 +
 5 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/dlls/d3dcompiler_43/blob.c b/dlls/d3dcompiler_43/blob.c
index d6740905ff2..b7b47249dcc 100644
--- a/dlls/d3dcompiler_43/blob.c
+++ b/dlls/d3dcompiler_43/blob.c
@@ -129,6 +129,10 @@ static BOOL check_blob_part(DWORD tag, D3D_BLOB_PART part)
             if (tag == TAG_ISGN) add = TRUE;
             break;
 
+        case D3D_BLOB_OUTPUT_SIGNATURE_BLOB:
+            if (tag == TAG_OSGN) add = TRUE;
+            break;
+
         default:
             FIXME("Unhandled D3D_BLOB_PART %s.\n", debug_d3dcompiler_d3d_blob_part(part));
             break;
@@ -195,6 +199,7 @@ HRESULT d3dcompiler_get_blob_part(const void *data, SIZE_T data_size, D3D_BLOB_P
     switch(part)
     {
         case D3D_BLOB_INPUT_SIGNATURE_BLOB:
+        case D3D_BLOB_OUTPUT_SIGNATURE_BLOB:
             if (count != 1) count = 0;
             break;
 
diff --git a/dlls/d3dcompiler_43/d3dcompiler_43.spec b/dlls/d3dcompiler_43/d3dcompiler_43.spec
index 41f104981b1..8f7b6db3edf 100644
--- a/dlls/d3dcompiler_43/d3dcompiler_43.spec
+++ b/dlls/d3dcompiler_43/d3dcompiler_43.spec
@@ -10,7 +10,7 @@
 @ stub D3DGetDebugInfo
 @ stub D3DGetInputAndOutputSignatureBlob
 @ stdcall D3DGetInputSignatureBlob(ptr long ptr)
-@ stub D3DGetOutputSignatureBlob
+@ stdcall D3DGetOutputSignatureBlob(ptr long ptr)
 @ stdcall D3DPreprocess(ptr long str ptr ptr ptr ptr)
 @ stub D3DReflect
 @ stub D3DReturnFailure1
diff --git a/dlls/d3dcompiler_43/d3dcompiler_43_main.c b/dlls/d3dcompiler_43/d3dcompiler_43_main.c
index 88af168a98d..bc4cac089d3 100644
--- a/dlls/d3dcompiler_43/d3dcompiler_43_main.c
+++ b/dlls/d3dcompiler_43/d3dcompiler_43_main.c
@@ -95,3 +95,10 @@ HRESULT WINAPI D3DGetInputSignatureBlob(const void *data, SIZE_T data_size, ID3D
 
     return d3dcompiler_get_blob_part(data, data_size, D3D_BLOB_INPUT_SIGNATURE_BLOB, 0, blob);
 }
+
+HRESULT WINAPI D3DGetOutputSignatureBlob(const void *data, SIZE_T data_size, ID3DBlob **blob)
+{
+    TRACE("data %p, data_size %lu, blob %p\n", data, data_size, blob);
+
+    return d3dcompiler_get_blob_part(data, data_size, D3D_BLOB_OUTPUT_SIGNATURE_BLOB, 0, blob);
+}
diff --git a/dlls/d3dcompiler_43/d3dcompiler_private.h b/dlls/d3dcompiler_43/d3dcompiler_private.h
index eb7674fe4b3..41c4f5a92d7 100644
--- a/dlls/d3dcompiler_43/d3dcompiler_private.h
+++ b/dlls/d3dcompiler_43/d3dcompiler_private.h
@@ -582,6 +582,7 @@ void SlDeleteShader(struct bwriter_shader *shader);
     ((DWORD)(ch2) << 16) | ((DWORD)(ch3) << 24 ))
 #define TAG_DXBC MAKE_TAG('D', 'X', 'B', 'C')
 #define TAG_ISGN MAKE_TAG('I', 'S', 'G', 'N')
+#define TAG_OSGN MAKE_TAG('O', 'S', 'G', 'N')
 
 struct dxbc_section
 {
diff --git a/include/d3dcompiler.h b/include/d3dcompiler.h
index 0dfe9ff65ab..08c3d01d833 100644
--- a/include/d3dcompiler.h
+++ b/include/d3dcompiler.h
@@ -63,6 +63,7 @@ typedef enum D3D_BLOB_PART
 
 HRESULT WINAPI D3DGetBlobPart(const void *data, SIZE_T data_size, D3D_BLOB_PART part, UINT flags, ID3DBlob **blob);
 HRESULT WINAPI D3DGetInputSignatureBlob(const void *data, SIZE_T data_size, ID3DBlob **blob);
+HRESULT WINAPI D3DGetOutputSignatureBlob(const void *data, SIZE_T data_size, ID3DBlob **blob);
 
 HRESULT WINAPI D3DCreateBlob(SIZE_T data_size, ID3DBlob **blob);
 
-- 
GitLab