d3dx9: Call D3DCompile() for ASCII effects.

This commit is contained in:
Matteo Bruni 2014-02-24 19:18:46 +01:00 committed by Alexandre Julliard
parent b86b3dfa40
commit 62288d02be
2 changed files with 67 additions and 23 deletions

View File

@ -26,6 +26,7 @@
#include "windef.h"
#include "wingdi.h"
#include "d3dx9_36_private.h"
#include "d3dcompiler.h"
/* Constants for special INT/FLOAT conversation */
#define INT_FLOAT_MULTI 255.0f
@ -5188,11 +5189,13 @@ err_out:
}
static HRESULT d3dx9_base_effect_init(struct d3dx9_base_effect *base,
const char *data, SIZE_T data_size, struct ID3DXEffectImpl *effect)
const char *data, SIZE_T data_size, const D3D_SHADER_MACRO *defines, ID3DInclude *include,
UINT eflags, ID3DBlob **errors, struct ID3DXEffectImpl *effect)
{
DWORD tag, offset;
const char *ptr = data;
HRESULT hr;
ID3DBlob *bytecode = NULL, *temp_errors = NULL;
TRACE("base %p, data %p, data_size %lu, effect %p\n", base, data, data_size, effect);
@ -5203,30 +5206,55 @@ static HRESULT d3dx9_base_effect_init(struct d3dx9_base_effect *base,
if (tag != d3dx9_effect_version(9, 1))
{
/* todo: compile hlsl ascii code */
FIXME("HLSL ascii effects not supported, yet\n");
/* Show the start of the shader for debugging info. */
TRACE("effect:\n%s\n", debugstr_an(data, data_size > 40 ? 40 : data_size));
}
else
{
read_dword(&ptr, &offset);
TRACE("Offset: %x\n", offset);
hr = d3dx9_parse_effect(base, ptr, data_size, offset);
if (hr != D3D_OK)
TRACE("HLSL ASCII effect, trying to compile it.\n");
hr = D3DCompile(data, data_size, NULL, defines, include,
"main", "fx_2_0", 0, eflags, &bytecode, &temp_errors);
if (FAILED(hr))
{
FIXME("Failed to parse effect.\n");
WARN("Failed to compile ASCII effect.\n");
if (bytecode)
ID3D10Blob_Release(bytecode);
if (temp_errors)
TRACE("%s\n", (char *)ID3D10Blob_GetBufferPointer(temp_errors));
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);
}
read_dword(&ptr, &offset);
TRACE("Offset: %x\n", offset);
hr = d3dx9_parse_effect(base, ptr, data_size, offset);
if (bytecode)
ID3D10Blob_Release(bytecode);
if (hr != D3D_OK)
{
FIXME("Failed to parse effect.\n");
return hr;
}
return D3D_OK;
}
static HRESULT d3dx9_effect_init(struct ID3DXEffectImpl *effect, struct IDirect3DDevice9 *device,
const char *data, SIZE_T data_size, struct ID3DXEffectPool *pool)
const char *data, SIZE_T data_size, const D3D_SHADER_MACRO *defines, ID3DInclude *include,
UINT eflags, ID3DBlob **error_messages, struct ID3DXEffectPool *pool)
{
HRESULT hr;
@ -5241,7 +5269,8 @@ static HRESULT d3dx9_effect_init(struct ID3DXEffectImpl *effect, struct IDirect3
IDirect3DDevice9_AddRef(device);
effect->device = device;
if (FAILED(hr = d3dx9_base_effect_init(&effect->base_effect, data, data_size, effect)))
if (FAILED(hr = d3dx9_base_effect_init(&effect->base_effect, data, data_size, defines, include,
eflags, error_messages, effect)))
{
FIXME("Failed to parse effect, hr %#x.\n", hr);
free_effect(effect);
@ -5285,7 +5314,8 @@ HRESULT WINAPI D3DXCreateEffectEx(struct IDirect3DDevice9 *device, const void *s
if (!object)
return E_OUTOFMEMORY;
hr = d3dx9_effect_init(object, device, srcdata, srcdatalen, pool);
hr = d3dx9_effect_init(object, device, srcdata, srcdatalen, (const D3D_SHADER_MACRO *)defines,
(ID3DInclude *)include, flags, (ID3DBlob **)compilation_errors, pool);
if (FAILED(hr))
{
WARN("Failed to initialize shader reflection\n");
@ -5310,7 +5340,9 @@ HRESULT WINAPI D3DXCreateEffect(struct IDirect3DDevice9 *device, const void *src
return D3DXCreateEffectEx(device, srcdata, srcdatalen, defines, include, NULL, flags, pool, effect, compilation_errors);
}
static HRESULT d3dx9_effect_compiler_init(struct ID3DXEffectCompilerImpl *compiler, const char *data, SIZE_T data_size)
static HRESULT d3dx9_effect_compiler_init(struct ID3DXEffectCompilerImpl *compiler,
const char *data, SIZE_T data_size, const D3D_SHADER_MACRO *defines, ID3DInclude *include,
UINT eflags, ID3DBlob **error_messages)
{
HRESULT hr;
@ -5319,7 +5351,8 @@ static HRESULT d3dx9_effect_compiler_init(struct ID3DXEffectCompilerImpl *compil
compiler->ID3DXEffectCompiler_iface.lpVtbl = &ID3DXEffectCompiler_Vtbl;
compiler->ref = 1;
if (FAILED(hr = d3dx9_base_effect_init(&compiler->base_effect, data, data_size, NULL)))
if (FAILED(hr = d3dx9_base_effect_init(&compiler->base_effect, data, data_size, defines,
include, eflags, error_messages, NULL)))
{
FIXME("Failed to parse effect, hr %#x.\n", hr);
free_effect_compiler(compiler);
@ -5348,7 +5381,8 @@ HRESULT WINAPI D3DXCreateEffectCompiler(const char *srcdata, UINT srcdatalen, co
if (!object)
return E_OUTOFMEMORY;
hr = d3dx9_effect_compiler_init(object, srcdata, srcdatalen);
hr = d3dx9_effect_compiler_init(object, srcdata, srcdatalen, (const D3D_SHADER_MACRO *)defines,
(ID3DInclude *)include, flags, (ID3DBlob **)parse_errors);
if (FAILED(hr))
{
WARN("Failed to initialize effect compiler\n");

View File

@ -156,7 +156,12 @@ static void test_create_effect_and_pool(IDirect3DDevice9 *device)
ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
hr = D3DXCreateEffect(device, effect_desc, sizeof(effect_desc), NULL, NULL, 0, NULL, &effect, NULL);
ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
todo_wine ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr);
if (FAILED(hr))
{
skip("Failed to compile effect, skipping test.\n");
return;
}
hr = effect->lpVtbl->QueryInterface(effect, &IID_ID3DXBaseEffect, (void **)&base);
ok(hr == E_NOINTERFACE, "QueryInterface failed, got %x, expected %x (E_NOINTERFACE)\n", hr, E_NOINTERFACE);
@ -265,7 +270,12 @@ static void test_create_effect_compiler(void)
ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3D_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL);
hr = D3DXCreateEffectCompiler(effect_desc, 0, NULL, NULL, 0, &compiler, NULL);
ok(hr == D3D_OK, "Got result %x, expected %x (D3D_OK)\n", hr, D3D_OK);
todo_wine ok(hr == D3D_OK, "Got result %x, expected %x (D3D_OK)\n", hr, D3D_OK);
if (FAILED(hr))
{
skip("D3DXCreateEffectCompiler failed, skipping test.\n");
return;
}
count = compiler->lpVtbl->Release(compiler);
ok(count == 0, "Release failed %u\n", count);