[PATCH 1/5] d3dcompiler: Make SlWriteBytecode return the shader size.
Matteo Bruni
mbruni at codeweavers.com
Mon May 14 10:24:01 CDT 2012
---
dlls/d3dcompiler_43/bytecodewriter.c | 26 ++++----------------------
dlls/d3dcompiler_43/compiler.c | 16 +++++++---------
dlls/d3dcompiler_43/d3dcompiler_private.h | 2 +-
3 files changed, 12 insertions(+), 32 deletions(-)
diff --git a/dlls/d3dcompiler_43/bytecodewriter.c b/dlls/d3dcompiler_43/bytecodewriter.c
index 54321ed..5a3e7f2 100644
--- a/dlls/d3dcompiler_43/bytecodewriter.c
+++ b/dlls/d3dcompiler_43/bytecodewriter.c
@@ -2543,22 +2543,8 @@ static HRESULT call_instr_handler(struct bc_writer *writer,
return E_INVALIDARG;
}
-/* SlWriteBytecode (wineshader.@)
- *
- * Writes shader version specific bytecode from the shader passed in.
- * The returned bytecode can be passed to the Direct3D runtime like
- * IDirect3DDevice9::Create*Shader.
- *
- * Parameters:
- * shader: Shader to translate into bytecode
- * version: Shader version to generate(d3d version token)
- * dxversion: DirectX version the code targets
- * result: the resulting shader bytecode
- *
- * Return values:
- * S_OK on success
- */
-DWORD SlWriteBytecode(const struct bwriter_shader *shader, int dxversion, DWORD **result) {
+HRESULT SlWriteBytecode(const struct bwriter_shader *shader, int dxversion, DWORD **result, DWORD *size)
+{
struct bc_writer *writer;
struct bytecode_buffer *buffer = NULL;
HRESULT hr;
@@ -2610,12 +2596,8 @@ DWORD SlWriteBytecode(const struct bwriter_shader *shader, int dxversion, DWORD
goto error;
}
- /* Cut off unneeded memory from the result buffer */
- *result = d3dcompiler_realloc(buffer->data,
- sizeof(DWORD) * buffer->size);
- if(!*result) {
- *result = buffer->data;
- }
+ *size = buffer->size * sizeof(DWORD);
+ *result = buffer->data;
buffer->data = NULL;
hr = S_OK;
diff --git a/dlls/d3dcompiler_43/compiler.c b/dlls/d3dcompiler_43/compiler.c
index 7f4ebdb..a05f00e 100644
--- a/dlls/d3dcompiler_43/compiler.c
+++ b/dlls/d3dcompiler_43/compiler.c
@@ -396,9 +396,8 @@ static HRESULT assemble_shader(const char *preproc_shader,
struct bwriter_shader *shader;
char *messages = NULL;
HRESULT hr;
- DWORD *res;
- LPD3DBLOB buffer;
- int size;
+ DWORD *res, size;
+ ID3DBlob *buffer;
char *pos;
shader = SlAssembleShader(preproc_shader, &messages);
@@ -426,10 +425,10 @@ static HRESULT assemble_shader(const char *preproc_shader,
pos = ID3D10Blob_GetBufferPointer(buffer);
if (preproc_messages)
{
- CopyMemory(pos, preproc_messages, strlen(preproc_messages) + 1);
+ memcpy(pos, preproc_messages, strlen(preproc_messages) + 1);
pos += strlen(preproc_messages);
}
- CopyMemory(pos, messages, strlen(messages) + 1);
+ memcpy(pos, messages, strlen(messages) + 1);
if (*error_messages) ID3D10Blob_Release(*error_messages);
*error_messages = buffer;
@@ -437,13 +436,13 @@ static HRESULT assemble_shader(const char *preproc_shader,
HeapFree(GetProcessHeap(), 0, messages);
}
- if (shader == NULL)
+ if (!shader)
{
ERR("Asm reading failed\n");
return D3DXERR_INVALIDDATA;
}
- hr = SlWriteBytecode(shader, 9, &res);
+ hr = SlWriteBytecode(shader, 9, &res, &size);
SlDeleteShader(shader);
if (FAILED(hr))
{
@@ -453,14 +452,13 @@ static HRESULT assemble_shader(const char *preproc_shader,
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);
+ memcpy(ID3D10Blob_GetBufferPointer(buffer), res, size);
*shader_blob = buffer;
}
diff --git a/dlls/d3dcompiler_43/d3dcompiler_private.h b/dlls/d3dcompiler_43/d3dcompiler_private.h
index d719021..e64f4cf 100644
--- a/dlls/d3dcompiler_43/d3dcompiler_private.h
+++ b/dlls/d3dcompiler_43/d3dcompiler_private.h
@@ -570,7 +570,7 @@ typedef enum _BWRITERDECLUSAGE {
#define T3_REG 5
struct bwriter_shader *SlAssembleShader(const char *text, char **messages) DECLSPEC_HIDDEN;
-DWORD SlWriteBytecode(const struct bwriter_shader *shader, int dxversion, DWORD **result) DECLSPEC_HIDDEN;
+HRESULT SlWriteBytecode(const struct bwriter_shader *shader, int dxversion, DWORD **result, DWORD *size) DECLSPEC_HIDDEN;
void SlDeleteShader(struct bwriter_shader *shader) DECLSPEC_HIDDEN;
#define MAKE_TAG(ch0, ch1, ch2, ch3) \
--
1.7.3.4
More information about the wine-patches
mailing list