Commit 1d0c6723 authored by Ivan Gyurdiev's avatar Ivan Gyurdiev Committed by Alexandre Julliard

wined3d: Share get_opcode.

parent 9ff27bf6
...@@ -54,4 +54,28 @@ int shader_addline( ...@@ -54,4 +54,28 @@ int shader_addline(
return 0; return 0;
} }
const SHADER_OPCODE* shader_get_opcode(
IWineD3DBaseShader *iface, const DWORD code) {
IWineD3DBaseShaderImpl *This = (IWineD3DBaseShaderImpl*) iface;
DWORD i = 0;
DWORD version = This->baseShader.version;
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 & D3DSI_OPCODE_MASK) == shader_ins[i].opcode) &&
(((hex_version >= shader_ins[i].min_version) && (hex_version <= shader_ins[i].max_version)) ||
((shader_ins[i].min_version == 0) && (shader_ins[i].max_version == 0)))) {
return &shader_ins[i];
}
++i;
}
FIXME("Unsupported opcode %lx(%ld) masked %lx version %ld\n",
code, code, code & D3DSI_OPCODE_MASK, version);
return NULL;
}
/* TODO: Move other shared code here */ /* TODO: Move other shared code here */
...@@ -719,25 +719,6 @@ CONST SHADER_OPCODE IWineD3DPixelShaderImpl_shader_ins[] = { ...@@ -719,25 +719,6 @@ CONST SHADER_OPCODE IWineD3DPixelShaderImpl_shader_ins[] = {
{0, NULL, NULL, 0, NULL, 0, 0} {0, NULL, NULL, 0, NULL, 0, 0}
}; };
inline static const SHADER_OPCODE* pshader_program_get_opcode(IWineD3DPixelShaderImpl *This, const DWORD code) {
DWORD i = 0;
DWORD version = This->baseShader.version;
DWORD hex_version = D3DPS_VERSION(version/10, version%10);
const SHADER_OPCODE *shader_ins = This->baseShader.shader_ins;
/** TODO: use dichotomic search */
while (NULL != shader_ins[i].name) {
if (((code & D3DSI_OPCODE_MASK) == shader_ins[i].opcode) &&
(((hex_version >= shader_ins[i].min_version) && (hex_version <= shader_ins[i].max_version)) ||
((shader_ins[i].min_version == 0) && (shader_ins[i].max_version == 0)))) {
return &shader_ins[i];
}
++i;
}
FIXME("Unsupported opcode %lx(%ld) masked %lx version %ld\n", code, code, code & D3DSI_OPCODE_MASK, version);
return NULL;
}
inline static BOOL pshader_is_version_token(DWORD token) { inline static BOOL pshader_is_version_token(DWORD token) {
return 0xFFFF0000 == (token & 0xFFFF0000); return 0xFFFF0000 == (token & 0xFFFF0000);
} }
...@@ -945,7 +926,7 @@ inline static void pshader_program_get_registers_used( ...@@ -945,7 +926,7 @@ inline static void pshader_program_get_registers_used(
} }
/* Fetch opcode */ /* Fetch opcode */
curOpcode = pshader_program_get_opcode(This, *pToken); curOpcode = shader_get_opcode((IWineD3DBaseShader*) This, *pToken);
++pToken; ++pToken;
/* Skip declarations (for now) */ /* Skip declarations (for now) */
...@@ -1134,7 +1115,7 @@ inline static VOID IWineD3DPixelShaderImpl_GenerateProgramArbHW(IWineD3DPixelSha ...@@ -1134,7 +1115,7 @@ inline static VOID IWineD3DPixelShaderImpl_GenerateProgramArbHW(IWineD3DPixelSha
code = *pToken; code = *pToken;
#endif #endif
pInstr = pToken; pInstr = pToken;
curOpcode = pshader_program_get_opcode(This, *pToken); curOpcode = shader_get_opcode((IWineD3DBaseShader*) This, *pToken);
++pToken; ++pToken;
if (NULL == curOpcode) { if (NULL == curOpcode) {
/* unknown current opcode ... (shouldn't be any!) */ /* unknown current opcode ... (shouldn't be any!) */
...@@ -1779,7 +1760,7 @@ HRESULT WINAPI IWineD3DPixelShaderImpl_SetFunction(IWineD3DPixelShader *iface, C ...@@ -1779,7 +1760,7 @@ HRESULT WINAPI IWineD3DPixelShaderImpl_SetFunction(IWineD3DPixelShader *iface, C
if (!This->baseShader.version) { if (!This->baseShader.version) {
WARN("(%p) : pixel shader doesn't have a valid version identifier\n", This); WARN("(%p) : pixel shader doesn't have a valid version identifier\n", This);
} }
curOpcode = pshader_program_get_opcode(This, *pToken); curOpcode = shader_get_opcode((IWineD3DBaseShader*) This, *pToken);
++pToken; ++pToken;
++len; ++len;
if (NULL == curOpcode) { if (NULL == curOpcode) {
......
...@@ -554,21 +554,6 @@ CONST SHADER_OPCODE IWineD3DVertexShaderImpl_shader_ins[] = { ...@@ -554,21 +554,6 @@ CONST SHADER_OPCODE IWineD3DVertexShaderImpl_shader_ins[] = {
{0, NULL, NULL, 0, NULL, 0, 0} {0, NULL, NULL, 0, NULL, 0, 0}
}; };
inline static const SHADER_OPCODE* vshader_program_get_opcode(IWineD3DVertexShaderImpl *This, const DWORD code) {
DWORD i = 0;
const SHADER_OPCODE *shader_ins = This->baseShader.shader_ins;
/** TODO: use dichotomic search or hash table */
while (NULL != shader_ins[i].name) {
if ((code & D3DSI_OPCODE_MASK) == shader_ins[i].opcode) {
return &shader_ins[i];
}
++i;
}
FIXME("Unsupported opcode %lx\n",code);
return NULL;
}
inline static void vshader_program_dump_vs_param(const DWORD param, int input) { inline static void vshader_program_dump_vs_param(const DWORD param, int input) {
static const char* rastout_reg_names[] = { "oPos", "oFog", "oPts" }; static const char* rastout_reg_names[] = { "oPos", "oFog", "oPts" };
static const char swizzle_reg_chars[] = "xyzw"; static const char swizzle_reg_chars[] = "xyzw";
...@@ -1147,7 +1132,7 @@ inline static VOID IWineD3DVertexShaderImpl_GenerateProgramArbHW(IWineD3DVertexS ...@@ -1147,7 +1132,7 @@ inline static VOID IWineD3DVertexShaderImpl_GenerateProgramArbHW(IWineD3DVertexS
pToken += comment_len; pToken += comment_len;
continue; continue;
} }
curOpcode = vshader_program_get_opcode(This, *pToken); curOpcode = shader_get_opcode((IWineD3DBaseShader*) This, *pToken);
++pToken; ++pToken;
/* TODO: dcl's */ /* TODO: dcl's */
/* TODO: Consts */ /* TODO: Consts */
...@@ -1274,7 +1259,7 @@ inline static VOID IWineD3DVertexShaderImpl_GenerateProgramArbHW(IWineD3DVertexS ...@@ -1274,7 +1259,7 @@ inline static VOID IWineD3DVertexShaderImpl_GenerateProgramArbHW(IWineD3DVertexS
continue; continue;
} }
curOpcode = vshader_program_get_opcode(This, *pToken); curOpcode = shader_get_opcode((IWineD3DBaseShader*) This, *pToken);
++pToken; ++pToken;
if (NULL == curOpcode) { if (NULL == curOpcode) {
/* unknown current opcode ... (shouldn't be any!) */ /* unknown current opcode ... (shouldn't be any!) */
...@@ -1557,7 +1542,7 @@ HRESULT WINAPI IWineD3DVertexShaderImpl_ExecuteSW(IWineD3DVertexShader* iface, W ...@@ -1557,7 +1542,7 @@ HRESULT WINAPI IWineD3DVertexShaderImpl_ExecuteSW(IWineD3DVertexShader* iface, W
pToken += comment_len; pToken += comment_len;
continue ; continue ;
} }
curOpcode = vshader_program_get_opcode(This, *pToken); curOpcode = shader_get_opcode((IWineD3DBaseShader*) This, *pToken);
++pToken; ++pToken;
if (NULL == curOpcode) { if (NULL == curOpcode) {
i = 0; i = 0;
...@@ -1907,7 +1892,7 @@ HRESULT WINAPI IWineD3DVertexShaderImpl_SetFunction(IWineD3DVertexShader *iface, ...@@ -1907,7 +1892,7 @@ HRESULT WINAPI IWineD3DVertexShaderImpl_SetFunction(IWineD3DVertexShader *iface,
len += comment_len + 1; len += comment_len + 1;
continue; continue;
} }
curOpcode = vshader_program_get_opcode(This, *pToken); curOpcode = shader_get_opcode((IWineD3DBaseShader*) This, *pToken);
++pToken; ++pToken;
++len; ++len;
if (NULL == curOpcode) { if (NULL == curOpcode) {
......
...@@ -1220,6 +1220,10 @@ extern int shader_addline( ...@@ -1220,6 +1220,10 @@ extern int shader_addline(
SHADER_BUFFER* buffer, SHADER_BUFFER* buffer,
const char* fmt, ...); const char* fmt, ...);
extern const SHADER_OPCODE* shader_get_opcode(
IWineD3DBaseShader *iface,
const DWORD code);
/***************************************************************************** /*****************************************************************************
* IDirect3DBaseShader implementation structure * IDirect3DBaseShader implementation structure
*/ */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment