Henri Verbeet : wined3d: Explicitly pass the version and instruction table to shader_get_opcode().
Alexandre Julliard
julliard at winehq.org
Fri Dec 5 07:42:47 CST 2008
Module: wine
Branch: master
Commit: a13df0e4ef3cbcb59f8df1ad6222bdea346c0bfd
URL: http://source.winehq.org/git/wine.git/?a=commit;h=a13df0e4ef3cbcb59f8df1ad6222bdea346c0bfd
Author: Henri Verbeet <hverbeet at 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(
More information about the wine-cvs
mailing list