From 03b67e3030092f4fb33548b95b200da1cf08e80d Mon Sep 17 00:00:00 2001 From: Ivan Gyurdiev Date: Wed, 17 May 2006 02:04:30 -0400 Subject: [PATCH] wined3d: Use shader_get_param() in trace pass, reg. count pass, generation pass. Change the trace pass, the register counting pass, and the hw generator pass to take into account the new get_params() function. For hw generation, store the address tokens into the SHADER_OPCODE_ARG structure, so they're available to generator functions. --- dlls/wined3d/baseshader.c | 42 +++++++++++++++++++++++++++++++++--------- dlls/wined3d/pixelshader.c | 28 +++++++++++++++++++++------- dlls/wined3d/vertexshader.c | 28 +++++++++++++++++++++------- dlls/wined3d/wined3d_private.h | 2 ++ 4 files changed, 77 insertions(+), 23 deletions(-) diff --git a/dlls/wined3d/baseshader.c b/dlls/wined3d/baseshader.c index abf5019fe22..f69f0abf1bd 100644 --- a/dlls/wined3d/baseshader.c +++ b/dlls/wined3d/baseshader.c @@ -4,6 +4,7 @@ * Copyright 2002-2003 Jason Edmeades * Copyright 2002-2003 Raphael Junqueira * Copyright 2005 Oliver Stieber + * Copyright 2006 Ivan Gyurdiev * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -214,13 +215,17 @@ void shader_get_registers_used( int i; for (i = 0; i < curOpcode->num_params; ++i) { - DWORD regtype = (((*pToken) & D3DSP_REGTYPE_MASK) >> D3DSP_REGTYPE_SHIFT); - DWORD reg = (*pToken) & D3DSP_REGNUM_MASK; + + DWORD param, addr_token, reg, regtype; + pToken += shader_get_param(iface, pToken, ¶m, &addr_token); + + regtype = (param & D3DSP_REGTYPE_MASK) >> D3DSP_REGTYPE_SHIFT; + reg = param & D3DSP_REGNUM_MASK; + if (D3DSPR_TEXTURE == regtype) *texUsed |= (1 << reg); if (D3DSPR_TEMP == regtype) *tempsUsed |= (1 << reg); - ++pToken; } } } @@ -563,12 +568,33 @@ void generate_base_shader( hw_arg.shader = iface; hw_arg.opcode = curOpcode; hw_arg.buffer = buffer; + if (curOpcode->num_params > 0) { - hw_arg.dst = *pToken; - /* FIXME: this does not account for relative address tokens */ - for (i = 1; i < curOpcode->num_params; i++) - hw_arg.src[i-1] = *(pToken + i); + DWORD param, addr_token = 0; + + /* DCL instruction has usage dst parameter, not register */ + if (curOpcode->opcode == D3DSIO_DCL) + param = *pToken++; + else + pToken += shader_get_param(iface, pToken, ¶m, &addr_token); + + hw_arg.dst = param; + hw_arg.dst_addr = addr_token; + + for (i = 1; i < curOpcode->num_params; i++) { + /* DEF* instructions have constant src parameters, not registers */ + if (curOpcode->opcode == D3DSIO_DEF || + curOpcode->opcode == D3DSIO_DEFI || + curOpcode->opcode == D3DSIO_DEFB) { + param = *pToken++; + + } else + pToken += shader_get_param(iface, pToken, ¶m, &addr_token); + + hw_arg.src[i-1] = param; + hw_arg.src_addr[i-1] = addr_token; + } } /* Call appropriate function for output target */ @@ -577,8 +603,6 @@ void generate_base_shader( else curOpcode->hw_fct(&hw_arg); - pToken += curOpcode->num_params; - } else { /* Unless we encounter a no-op command, this opcode is unrecognized */ diff --git a/dlls/wined3d/pixelshader.c b/dlls/wined3d/pixelshader.c index 4c109e24c50..afee2fd068c 100644 --- a/dlls/wined3d/pixelshader.c +++ b/dlls/wined3d/pixelshader.c @@ -4,6 +4,7 @@ * Copyright 2002-2003 Jason Edmeades * Copyright 2002-2003 Raphael Junqueira * Copyright 2005 Oliver Stieber + * Copyright 2006 Ivan Gyurdiev * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -1448,18 +1449,31 @@ HRESULT WINAPI IWineD3DPixelShaderImpl_SetFunction(IWineD3DPixelShader *iface, C ++pToken; ++len; } else { + + DWORD param, addr_token; + int tokens_read; + TRACE("%s", curOpcode->name); if (curOpcode->num_params > 0) { - shader_dump_ins_modifiers(*pToken); + + tokens_read = shader_get_param((IWineD3DBaseShader*) This, + pToken, ¶m, &addr_token); + pToken += tokens_read; + len += tokens_read; + + shader_dump_ins_modifiers(param); TRACE(" "); - shader_dump_param((IWineD3DBaseShader*) This, *pToken, 0); - ++pToken; - ++len; + shader_dump_param((IWineD3DBaseShader*) This, param, 0); + for (i = 1; i < curOpcode->num_params; ++i) { + + tokens_read = shader_get_param((IWineD3DBaseShader*) This, + pToken, ¶m, &addr_token); + pToken += tokens_read; + len += tokens_read; + TRACE(", "); - shader_dump_param((IWineD3DBaseShader*) This, *pToken, 1); - ++pToken; - ++len; + shader_dump_param((IWineD3DBaseShader*) This, param, 1); } } } diff --git a/dlls/wined3d/vertexshader.c b/dlls/wined3d/vertexshader.c index fc68c71ea8f..9b46866b4f2 100644 --- a/dlls/wined3d/vertexshader.c +++ b/dlls/wined3d/vertexshader.c @@ -4,6 +4,7 @@ * Copyright 2002-2003 Jason Edmeades * Copyright 2002-2003 Raphael Junqueira * Copyright 2005 Oliver Stieber + * Copyright 2006 Ivan Gyurdiev * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -1570,18 +1571,31 @@ HRESULT WINAPI IWineD3DVertexShaderImpl_SetFunction(IWineD3DVertexShader *iface, ++pToken; ++len; } else { + + DWORD param, addr_token; + int tokens_read; + TRACE("%s", curOpcode->name); if (curOpcode->num_params > 0) { - shader_dump_ins_modifiers(*pToken); + + tokens_read = shader_get_param((IWineD3DBaseShader*) This, + pToken, ¶m, &addr_token); + pToken += tokens_read; + len += tokens_read; + + shader_dump_ins_modifiers(param); TRACE(" "); - shader_dump_param((IWineD3DBaseShader*) This, *pToken, 0); - ++pToken; - ++len; + shader_dump_param((IWineD3DBaseShader*) This, param, 0); + for (i = 1; i < curOpcode->num_params; ++i) { + + tokens_read = shader_get_param((IWineD3DBaseShader*) This, + pToken, ¶m, &addr_token); + pToken += tokens_read; + len += tokens_read; + TRACE(", "); - shader_dump_param((IWineD3DBaseShader*) This, *pToken, 1); - ++pToken; - ++len; + shader_dump_param((IWineD3DBaseShader*) This, param, 1); } } } diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 34d512e00ec..1227b3f07a2 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -1295,7 +1295,9 @@ typedef struct SHADER_OPCODE_ARG { IWineD3DBaseShader* shader; CONST SHADER_OPCODE* opcode; DWORD dst; + DWORD dst_addr; DWORD src[4]; + DWORD src_addr[4]; SHADER_BUFFER* buffer; } SHADER_OPCODE_ARG; -- 2.11.4.GIT