wined3d: Explicitly pass the version and instruction table to shader_get_opcode().
This commit is contained in:
parent
af1bc3d9ed
commit
a13df0e4ef
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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(
|
||||
|
|
Loading…
Reference in New Issue