Module: wine Branch: master Commit: a13df0e4ef3cbcb59f8df1ad6222bdea346c0bfd URL: http://source.winehq.org/git/wine.git/?a=commit;h=a13df0e4ef3cbcb59f8df1ad62...
Author: Henri Verbeet hverbeet@codeweavers.com Date: Thu Dec 4 17:41:31 2008 +0100
wined3d: Explicitly pass the version and instruction table to shader_get_opcode().
---
dlls/wined3d/arb_program_shader.c | 13 ++++++++----- dlls/wined3d/baseshader.c | 36 +++++++++++++++++++----------------- dlls/wined3d/glsl_shader.c | 13 ++++++++----- dlls/wined3d/wined3d_private.h | 4 +--- 4 files changed, 36 insertions(+), 30 deletions(-)
diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c index 8ec1a3b..9d51250 100644 --- a/dlls/wined3d/arb_program_shader.c +++ b/dlls/wined3d/arb_program_shader.c @@ -1485,6 +1485,9 @@ static void shader_hw_mnxn(const SHADER_OPCODE_ARG *arg) int i; int nComponents = 0; SHADER_OPCODE_ARG tmpArg; + IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)arg->shader; + const SHADER_OPCODE *opcode_table = shader->baseShader.shader_ins; + DWORD shader_version = shader->baseShader.hex_version;
memset(&tmpArg, 0, sizeof(SHADER_OPCODE_ARG));
@@ -1499,23 +1502,23 @@ static void shader_hw_mnxn(const SHADER_OPCODE_ARG *arg) switch(arg->opcode->opcode) { case WINED3DSIO_M4x4: nComponents = 4; - tmpArg.opcode = shader_get_opcode(arg->shader, WINED3DSIO_DP4); + tmpArg.opcode = shader_get_opcode(opcode_table, shader_version, WINED3DSIO_DP4); break; case WINED3DSIO_M4x3: nComponents = 3; - tmpArg.opcode = shader_get_opcode(arg->shader, WINED3DSIO_DP4); + tmpArg.opcode = shader_get_opcode(opcode_table, shader_version, WINED3DSIO_DP4); break; case WINED3DSIO_M3x4: nComponents = 4; - tmpArg.opcode = shader_get_opcode(arg->shader, WINED3DSIO_DP3); + tmpArg.opcode = shader_get_opcode(opcode_table, shader_version, WINED3DSIO_DP3); break; case WINED3DSIO_M3x3: nComponents = 3; - tmpArg.opcode = shader_get_opcode(arg->shader, WINED3DSIO_DP3); + tmpArg.opcode = shader_get_opcode(opcode_table, shader_version, WINED3DSIO_DP3); break; case WINED3DSIO_M3x2: nComponents = 2; - tmpArg.opcode = shader_get_opcode(arg->shader, WINED3DSIO_DP3); + tmpArg.opcode = shader_get_opcode(opcode_table, shader_version, WINED3DSIO_DP3); break; default: break; diff --git a/dlls/wined3d/baseshader.c b/dlls/wined3d/baseshader.c index c9301d5..5cc992f 100644 --- a/dlls/wined3d/baseshader.c +++ b/dlls/wined3d/baseshader.c @@ -76,27 +76,25 @@ int shader_addline( return 0; }
-const SHADER_OPCODE* shader_get_opcode( - IWineD3DBaseShader *iface, const DWORD code) { - - IWineD3DBaseShaderImpl *This = (IWineD3DBaseShaderImpl*) iface; - +const SHADER_OPCODE *shader_get_opcode(const SHADER_OPCODE *opcode_table, DWORD shader_version, DWORD code) +{ DWORD i = 0; - DWORD hex_version = This->baseShader.hex_version; - const SHADER_OPCODE *shader_ins = This->baseShader.shader_ins;
/** TODO: use dichotomic search */ - while (NULL != shader_ins[i].name) { - if ((code & WINED3DSI_OPCODE_MASK) == shader_ins[i].opcode - && hex_version >= shader_ins[i].min_version - && (!shader_ins[i].max_version || hex_version <= shader_ins[i].max_version)) + while (opcode_table[i].name) + { + if ((code & WINED3DSI_OPCODE_MASK) == opcode_table[i].opcode + && shader_version >= opcode_table[i].min_version + && (!opcode_table[i].max_version || shader_version <= opcode_table[i].max_version)) { - return &shader_ins[i]; + return &opcode_table[i]; } ++i; } - FIXME("Unsupported opcode %#x(%d) masked %#x, shader version %#x\n", - code, code, code & WINED3DSI_OPCODE_MASK, hex_version); + + FIXME("Unsupported opcode %#x(%d) masked %#x, shader version %#x\n", + code, code, code & WINED3DSI_OPCODE_MASK, shader_version); + return NULL; }
@@ -204,6 +202,8 @@ HRESULT shader_get_registers_used( IWineD3DStateBlockImpl *stateBlock) {
IWineD3DBaseShaderImpl* This = (IWineD3DBaseShaderImpl*) iface; + const SHADER_OPCODE *shader_ins = This->baseShader.shader_ins; + DWORD shader_version = This->baseShader.hex_version; unsigned int cur_loop_depth = 0, max_loop_depth = 0;
/* There are some minor differences between pixel and vertex shaders */ @@ -241,7 +241,7 @@ HRESULT shader_get_registers_used(
/* Fetch opcode */ opcode_token = *pToken++; - curOpcode = shader_get_opcode(iface, opcode_token); + curOpcode = shader_get_opcode(shader_ins, shader_version, opcode_token);
/* Unhandled opcode, and its parameters */ if (NULL == curOpcode) { @@ -840,7 +840,9 @@ void shader_generate_main(IWineD3DBaseShader *iface, SHADER_BUFFER* buffer, { IWineD3DBaseShaderImpl* This = (IWineD3DBaseShaderImpl*) iface; IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *) This->baseShader.device; /* To access shader backend callbacks */ + const SHADER_OPCODE *opcode_table = This->baseShader.shader_ins; const SHADER_HANDLER *handler_table = device->shader_backend->shader_instruction_handler_table; + DWORD shader_version = This->baseShader.hex_version; const DWORD *pToken = pFunction; const SHADER_OPCODE *curOpcode = NULL; SHADER_HANDLER hw_fct = NULL; @@ -874,7 +876,7 @@ void shader_generate_main(IWineD3DBaseShader *iface, SHADER_BUFFER* buffer,
/* Read opcode */ hw_arg.opcode_token = *pToken++; - curOpcode = shader_get_opcode(iface, hw_arg.opcode_token); + curOpcode = shader_get_opcode(opcode_table, shader_version, hw_arg.opcode_token);
/* Select handler */ if (curOpcode == NULL) @@ -1009,7 +1011,7 @@ void shader_trace_init( continue; } opcode_token = *pToken++; - curOpcode = shader_get_opcode(iface, opcode_token); + curOpcode = shader_get_opcode(This->baseShader.shader_ins, This->baseShader.hex_version, opcode_token); len++;
if (NULL == curOpcode) { diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index f8c5869..4c1d223 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -1747,6 +1747,9 @@ static void shader_glsl_mad(const SHADER_OPCODE_ARG *arg) Vertex shaders to GLSL codes */ static void shader_glsl_mnxn(const SHADER_OPCODE_ARG *arg) { + IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)arg->shader; + const SHADER_OPCODE *opcode_table = shader->baseShader.shader_ins; + DWORD shader_version = shader->baseShader.hex_version; int i; int nComponents = 0; SHADER_OPCODE_ARG tmpArg; @@ -1764,23 +1767,23 @@ static void shader_glsl_mnxn(const SHADER_OPCODE_ARG *arg) switch(arg->opcode->opcode) { case WINED3DSIO_M4x4: nComponents = 4; - tmpArg.opcode = shader_get_opcode(arg->shader, WINED3DSIO_DP4); + tmpArg.opcode = shader_get_opcode(opcode_table, shader_version, WINED3DSIO_DP4); break; case WINED3DSIO_M4x3: nComponents = 3; - tmpArg.opcode = shader_get_opcode(arg->shader, WINED3DSIO_DP4); + tmpArg.opcode = shader_get_opcode(opcode_table, shader_version, WINED3DSIO_DP4); break; case WINED3DSIO_M3x4: nComponents = 4; - tmpArg.opcode = shader_get_opcode(arg->shader, WINED3DSIO_DP3); + tmpArg.opcode = shader_get_opcode(opcode_table, shader_version, WINED3DSIO_DP3); break; case WINED3DSIO_M3x3: nComponents = 3; - tmpArg.opcode = shader_get_opcode(arg->shader, WINED3DSIO_DP3); + tmpArg.opcode = shader_get_opcode(opcode_table, shader_version, WINED3DSIO_DP3); break; case WINED3DSIO_M3x2: nComponents = 2; - tmpArg.opcode = shader_get_opcode(arg->shader, WINED3DSIO_DP3); + tmpArg.opcode = shader_get_opcode(opcode_table, shader_version, WINED3DSIO_DP3); break; default: break; diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index a672864..db19c19 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -2161,9 +2161,7 @@ extern int shader_addline( SHADER_BUFFER* buffer, const char* fmt, ...) PRINTF_ATTR(2,3);
-extern const SHADER_OPCODE* shader_get_opcode( - IWineD3DBaseShader *iface, - const DWORD code); +const SHADER_OPCODE *shader_get_opcode(const SHADER_OPCODE *shader_ins, DWORD shader_version, DWORD code);
/* Vertex shader utility functions */ extern BOOL vshader_get_input(