From 1d0c67239311d5b3cca4a49175b627d22e66c700 Mon Sep 17 00:00:00 2001 From: Ivan Gyurdiev Date: Tue, 9 May 2006 07:57:36 -0400 Subject: [PATCH] wined3d: Share get_opcode. --- dlls/wined3d/baseshader.c | 24 ++++++++++++++++++++++++ dlls/wined3d/pixelshader.c | 25 +++---------------------- dlls/wined3d/vertexshader.c | 23 ++++------------------- dlls/wined3d/wined3d_private.h | 4 ++++ 4 files changed, 35 insertions(+), 41 deletions(-) diff --git a/dlls/wined3d/baseshader.c b/dlls/wined3d/baseshader.c index 5b39e9aeee3..7f34bfd614b 100644 --- a/dlls/wined3d/baseshader.c +++ b/dlls/wined3d/baseshader.c @@ -54,4 +54,28 @@ int shader_addline( 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 */ diff --git a/dlls/wined3d/pixelshader.c b/dlls/wined3d/pixelshader.c index f52c98c52ca..4265f0c07dc 100644 --- a/dlls/wined3d/pixelshader.c +++ b/dlls/wined3d/pixelshader.c @@ -719,25 +719,6 @@ CONST SHADER_OPCODE IWineD3DPixelShaderImpl_shader_ins[] = { {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) { return 0xFFFF0000 == (token & 0xFFFF0000); } @@ -945,7 +926,7 @@ inline static void pshader_program_get_registers_used( } /* Fetch opcode */ - curOpcode = pshader_program_get_opcode(This, *pToken); + curOpcode = shader_get_opcode((IWineD3DBaseShader*) This, *pToken); ++pToken; /* Skip declarations (for now) */ @@ -1134,7 +1115,7 @@ inline static VOID IWineD3DPixelShaderImpl_GenerateProgramArbHW(IWineD3DPixelSha code = *pToken; #endif pInstr = pToken; - curOpcode = pshader_program_get_opcode(This, *pToken); + curOpcode = shader_get_opcode((IWineD3DBaseShader*) This, *pToken); ++pToken; if (NULL == curOpcode) { /* unknown current opcode ... (shouldn't be any!) */ @@ -1779,7 +1760,7 @@ HRESULT WINAPI IWineD3DPixelShaderImpl_SetFunction(IWineD3DPixelShader *iface, C if (!This->baseShader.version) { 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; ++len; if (NULL == curOpcode) { diff --git a/dlls/wined3d/vertexshader.c b/dlls/wined3d/vertexshader.c index 382700b35ac..56d322a8e43 100644 --- a/dlls/wined3d/vertexshader.c +++ b/dlls/wined3d/vertexshader.c @@ -554,21 +554,6 @@ CONST SHADER_OPCODE IWineD3DVertexShaderImpl_shader_ins[] = { {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) { static const char* rastout_reg_names[] = { "oPos", "oFog", "oPts" }; static const char swizzle_reg_chars[] = "xyzw"; @@ -1147,7 +1132,7 @@ inline static VOID IWineD3DVertexShaderImpl_GenerateProgramArbHW(IWineD3DVertexS pToken += comment_len; continue; } - curOpcode = vshader_program_get_opcode(This, *pToken); + curOpcode = shader_get_opcode((IWineD3DBaseShader*) This, *pToken); ++pToken; /* TODO: dcl's */ /* TODO: Consts */ @@ -1274,7 +1259,7 @@ inline static VOID IWineD3DVertexShaderImpl_GenerateProgramArbHW(IWineD3DVertexS continue; } - curOpcode = vshader_program_get_opcode(This, *pToken); + curOpcode = shader_get_opcode((IWineD3DBaseShader*) This, *pToken); ++pToken; if (NULL == curOpcode) { /* unknown current opcode ... (shouldn't be any!) */ @@ -1557,7 +1542,7 @@ HRESULT WINAPI IWineD3DVertexShaderImpl_ExecuteSW(IWineD3DVertexShader* iface, W pToken += comment_len; continue ; } - curOpcode = vshader_program_get_opcode(This, *pToken); + curOpcode = shader_get_opcode((IWineD3DBaseShader*) This, *pToken); ++pToken; if (NULL == curOpcode) { i = 0; @@ -1907,7 +1892,7 @@ HRESULT WINAPI IWineD3DVertexShaderImpl_SetFunction(IWineD3DVertexShader *iface, len += comment_len + 1; continue; } - curOpcode = vshader_program_get_opcode(This, *pToken); + curOpcode = shader_get_opcode((IWineD3DBaseShader*) This, *pToken); ++pToken; ++len; if (NULL == curOpcode) { diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index de303c5de91..238d5ac648b 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -1220,6 +1220,10 @@ extern int shader_addline( SHADER_BUFFER* buffer, const char* fmt, ...); +extern const SHADER_OPCODE* shader_get_opcode( + IWineD3DBaseShader *iface, + const DWORD code); + /***************************************************************************** * IDirect3DBaseShader implementation structure */