Zebediah Figura : d3dx9: Separate out d3dx9_effect_init_from_dxbc().
Alexandre Julliard
julliard at winehq.org
Mon Feb 14 15:41:32 CST 2022
Module: wine
Branch: master
Commit: f170677724843a5537c12412f9b3d23fd07bfaec
URL: https://source.winehq.org/git/wine.git/?a=commit;h=f170677724843a5537c12412f9b3d23fd07bfaec
Author: Zebediah Figura <zfigura at codeweavers.com>
Date: Mon Feb 14 00:27:25 2022 -0600
d3dx9: Separate out d3dx9_effect_init_from_dxbc().
Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
Signed-off-by: Matteo Bruni <mbruni at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/d3dx9_36/effect.c | 144 +++++++++++++++++++++++++------------------------
1 file changed, 75 insertions(+), 69 deletions(-)
diff --git a/dlls/d3dx9_36/effect.c b/dlls/d3dx9_36/effect.c
index 6ea138e632f..ccc8da5a9e8 100644
--- a/dlls/d3dx9_36/effect.c
+++ b/dlls/d3dx9_36/effect.c
@@ -6396,16 +6396,10 @@ static const char **parse_skip_constants_string(char *skip_constants_string, uns
return new_alloc;
}
-static HRESULT d3dx9_effect_init(struct d3dx_effect *effect, struct IDirect3DDevice9 *device,
- const char *data, SIZE_T data_size, const D3D_SHADER_MACRO *defines, ID3DInclude *include,
- UINT flags, ID3DBlob **errors, struct ID3DXEffectPool *pool, const char *skip_constants_string)
+static HRESULT d3dx9_effect_init_from_dxbc(struct d3dx_effect *effect,
+ struct IDirect3DDevice9 *device, const char *data, SIZE_T data_size,
+ unsigned int flags, struct ID3DXEffectPool *pool, const char *skip_constants_string)
{
-#if D3DX_SDK_VERSION <= 36
- UINT compile_flags = D3DCOMPILE_ENABLE_BACKWARDS_COMPATIBILITY;
-#else
- UINT compile_flags = 0;
-#endif
- ID3DBlob *bytecode = NULL, *temp_errors = NULL;
unsigned int skip_constants_count = 0;
char *skip_constants_buffer = NULL;
const char **skip_constants = NULL;
@@ -6414,11 +6408,6 @@ static HRESULT d3dx9_effect_init(struct d3dx_effect *effect, struct IDirect3DDev
unsigned int i, j;
HRESULT hr;
- TRACE("effect %p, device %p, data %p, data_size %lu, defines %p, include %p, flags %#x, errors %p, "
- "pool %p, skip_constants %s.\n",
- effect, device, data, data_size, defines, include, flags, errors, pool,
- debugstr_a(skip_constants_string));
-
effect->ID3DXEffect_iface.lpVtbl = &ID3DXEffect_Vtbl;
effect->ref = 1;
@@ -6429,55 +6418,6 @@ static HRESULT d3dx9_effect_init(struct d3dx_effect *effect, struct IDirect3DDev
read_dword(&ptr, &tag);
TRACE("Tag: %x\n", tag);
- if (tag != d3dx9_effect_version(9, 1))
- {
- TRACE("HLSL ASCII effect, trying to compile it.\n");
- compile_flags |= flags & ~(D3DXFX_NOT_CLONEABLE | D3DXFX_LARGEADDRESSAWARE);
- hr = D3DCompile(data, data_size, NULL, defines, include,
- NULL, "fx_2_0", compile_flags, 0, &bytecode, &temp_errors);
- if (FAILED(hr))
- {
- WARN("Failed to compile ASCII effect.\n");
- if (bytecode)
- ID3D10Blob_Release(bytecode);
- if (temp_errors)
- {
- const char *error_string = ID3D10Blob_GetBufferPointer(temp_errors);
- const char *string_ptr;
-
- while (*error_string)
- {
- string_ptr = error_string;
- while (*string_ptr && *string_ptr != '\n' && *string_ptr != '\r'
- && string_ptr - error_string < 80)
- ++string_ptr;
- TRACE("%s\n", debugstr_an(error_string, string_ptr - error_string));
- error_string = string_ptr;
- while (*error_string == '\n' || *error_string == '\r')
- ++error_string;
- }
- }
- if (errors)
- *errors = temp_errors;
- else if (temp_errors)
- ID3D10Blob_Release(temp_errors);
- return hr;
- }
- if (!bytecode)
- {
- FIXME("No output from effect compilation.\n");
- return D3DERR_INVALIDCALL;
- }
- if (errors)
- *errors = temp_errors;
- else if (temp_errors)
- ID3D10Blob_Release(temp_errors);
-
- ptr = ID3D10Blob_GetBufferPointer(bytecode);
- read_dword(&ptr, &tag);
- TRACE("Tag: %x\n", tag);
- }
-
if (pool)
{
effect->pool = unsafe_impl_from_ID3DXEffectPool(pool);
@@ -6493,8 +6433,6 @@ static HRESULT d3dx9_effect_init(struct d3dx_effect *effect, struct IDirect3DDev
sizeof(*skip_constants_buffer) * (strlen(skip_constants_string) + 1));
if (!skip_constants_buffer)
{
- if (bytecode)
- ID3D10Blob_Release(bytecode);
hr = E_OUTOFMEMORY;
goto fail;
}
@@ -6503,8 +6441,6 @@ static HRESULT d3dx9_effect_init(struct d3dx_effect *effect, struct IDirect3DDev
if (!(skip_constants = parse_skip_constants_string(skip_constants_buffer, &skip_constants_count)))
{
HeapFree(GetProcessHeap(), 0, skip_constants_buffer);
- if (bytecode)
- ID3D10Blob_Release(bytecode);
hr = E_OUTOFMEMORY;
goto fail;
}
@@ -6513,8 +6449,6 @@ static HRESULT d3dx9_effect_init(struct d3dx_effect *effect, struct IDirect3DDev
TRACE("Offset: %x\n", offset);
hr = d3dx_parse_effect(effect, ptr, data_size, offset, skip_constants, skip_constants_count);
- if (bytecode)
- ID3D10Blob_Release(bytecode);
if (hr != D3D_OK)
{
FIXME("Failed to parse effect.\n");
@@ -6589,6 +6523,78 @@ fail:
return hr;
}
+static HRESULT d3dx9_effect_init(struct d3dx_effect *effect, struct IDirect3DDevice9 *device,
+ const char *data, SIZE_T data_size, const D3D_SHADER_MACRO *defines, ID3DInclude *include,
+ UINT flags, ID3DBlob **errors, struct ID3DXEffectPool *pool, const char *skip_constants_string)
+{
+#if D3DX_SDK_VERSION <= 36
+ UINT compile_flags = D3DCOMPILE_ENABLE_BACKWARDS_COMPATIBILITY;
+#else
+ UINT compile_flags = 0;
+#endif
+ ID3DBlob *bytecode = NULL, *temp_errors = NULL;
+ const char *ptr = data;
+ HRESULT hr;
+ DWORD tag;
+
+ TRACE("effect %p, device %p, data %p, data_size %lu, defines %p, include %p, flags %#x, errors %p, "
+ "pool %p, skip_constants %s.\n",
+ effect, device, data, data_size, defines, include, flags, errors, pool,
+ debugstr_a(skip_constants_string));
+
+ read_dword(&ptr, &tag);
+
+ if (tag == d3dx9_effect_version(9, 1))
+ return d3dx9_effect_init_from_dxbc(effect, device, data, data_size, flags, pool, skip_constants_string);
+
+ TRACE("HLSL ASCII effect, trying to compile it.\n");
+ compile_flags |= flags & ~(D3DXFX_NOT_CLONEABLE | D3DXFX_LARGEADDRESSAWARE);
+ hr = D3DCompile(data, data_size, NULL, defines, include,
+ NULL, "fx_2_0", compile_flags, 0, &bytecode, &temp_errors);
+ if (FAILED(hr))
+ {
+ WARN("Failed to compile ASCII effect.\n");
+ if (bytecode)
+ ID3D10Blob_Release(bytecode);
+ if (temp_errors)
+ {
+ const char *error_string = ID3D10Blob_GetBufferPointer(temp_errors);
+ const char *string_ptr;
+
+ while (*error_string)
+ {
+ string_ptr = error_string;
+ while (*string_ptr && *string_ptr != '\n' && *string_ptr != '\r'
+ && string_ptr - error_string < 80)
+ ++string_ptr;
+ TRACE("%s\n", debugstr_an(error_string, string_ptr - error_string));
+ error_string = string_ptr;
+ while (*error_string == '\n' || *error_string == '\r')
+ ++error_string;
+ }
+ }
+ if (errors)
+ *errors = temp_errors;
+ else if (temp_errors)
+ ID3D10Blob_Release(temp_errors);
+ return hr;
+ }
+ if (!bytecode)
+ {
+ FIXME("No output from effect compilation.\n");
+ return D3DERR_INVALIDCALL;
+ }
+ if (errors)
+ *errors = temp_errors;
+ else if (temp_errors)
+ ID3D10Blob_Release(temp_errors);
+
+ hr = d3dx9_effect_init_from_dxbc(effect, device, ID3D10Blob_GetBufferPointer(bytecode),
+ ID3D10Blob_GetBufferSize(bytecode), flags, pool, skip_constants_string);
+ ID3D10Blob_Release(bytecode);
+ return hr;
+}
+
HRESULT WINAPI D3DXCreateEffectEx(struct IDirect3DDevice9 *device, const void *srcdata, UINT srcdatalen,
const D3DXMACRO *defines, struct ID3DXInclude *include, const char *skip_constants, DWORD flags,
struct ID3DXEffectPool *pool, struct ID3DXEffect **effect, struct ID3DXBuffer **compilation_errors)
More information about the wine-cvs
mailing list