Module: wine Branch: master Commit: 2173fde722ca979d1cff245ac7421e3651d54bed URL: http://source.winehq.org/git/wine.git/?a=commit;h=2173fde722ca979d1cff245ac7...
Author: Stefan Dösinger stefan@codeweavers.com Date: Fri Jun 6 01:07:23 2008 +0200
wined3d: Avoid float->string conversion in arb shaders.
---
dlls/wined3d/arb_program_shader.c | 28 ++++++++++++++++++++++++---- include/wine/wined3d_gl.h | 1 + 2 files changed, 25 insertions(+), 4 deletions(-)
diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c index bc55712..bd633f6 100644 --- a/dlls/wined3d/arb_program_shader.c +++ b/dlls/wined3d/arb_program_shader.c @@ -354,12 +354,13 @@ void shader_generate_arb_declarations( ps_impl->srgb_mode_hardcoded = 1; }
- /* Hardcodable local constants */ + /* Load local constants using the program-local space, + * this avoids reloading them each time the shader is used + */ if(!This->baseShader.load_local_constsF) { LIST_FOR_EACH_ENTRY(lconst, &This->baseShader.constantsF, local_constant, entry) { - float *value = (float *) lconst->value; - shader_addline(buffer, "PARAM C%u = {%f, %f, %f, %f};\n", lconst->idx, - value[0], value[1], value[2], value[3]); + shader_addline(buffer, "PARAM C%u = program.local[%u];\n", lconst->idx, + lconst->idx); } }
@@ -1873,6 +1874,7 @@ static void shader_arb_generate_pshader(IWineD3DPixelShader *iface, SHADER_BUFFE CONST DWORD *function = This->baseShader.function; const char *fragcolor; WineD3D_GL_Info *gl_info = &((IWineD3DDeviceImpl *)This->baseShader.device)->adapter->gl_info; + local_constant* lconst;
/* Create the hw ARB shader */ shader_addline(buffer, "!!ARBfp1.0\n"); @@ -1954,6 +1956,15 @@ static void shader_arb_generate_pshader(IWineD3DPixelShader *iface, SHADER_BUFFE errPos, debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB))); This->baseShader.prgId = -1; } + + /* Load immediate constants */ + if(!This->baseShader.load_local_constsF) { + LIST_FOR_EACH_ENTRY(lconst, &This->baseShader.constantsF, local_constant, entry) { + float *value = (float *) lconst->value; + GL_EXTCALL(glProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, lconst->idx, value)); + checkGLcall("glProgramLocalParameter4fvARB"); + } + } }
static void shader_arb_generate_vshader(IWineD3DVertexShader *iface, SHADER_BUFFER *buffer) { @@ -1961,6 +1972,7 @@ static void shader_arb_generate_vshader(IWineD3DVertexShader *iface, SHADER_BUFF shader_reg_maps* reg_maps = &This->baseShader.reg_maps; CONST DWORD *function = This->baseShader.function; WineD3D_GL_Info *gl_info = &((IWineD3DDeviceImpl *)This->baseShader.device)->adapter->gl_info; + local_constant* lconst;
/* Create the hw ARB shader */ shader_addline(buffer, "!!ARBvp1.0\n"); @@ -2049,6 +2061,14 @@ static void shader_arb_generate_vshader(IWineD3DVertexShader *iface, SHADER_BUFF errPos, debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB))); This->baseShader.prgId = -1; } + + /* Load immediate constants */ + if(!This->baseShader.load_local_constsF) { + LIST_FOR_EACH_ENTRY(lconst, &This->baseShader.constantsF, local_constant, entry) { + float *value = (float *) lconst->value; + GL_EXTCALL(glProgramLocalParameter4fvARB(GL_VERTEX_PROGRAM_ARB, lconst->idx, value)); + } + } }
static void shader_arb_get_caps(WINED3DDEVTYPE devtype, WineD3D_GL_Info *gl_info, struct shader_caps *pCaps) { diff --git a/include/wine/wined3d_gl.h b/include/wine/wined3d_gl.h index 9bd5a44..86be618 100644 --- a/include/wine/wined3d_gl.h +++ b/include/wine/wined3d_gl.h @@ -3487,6 +3487,7 @@ typedef enum _GL_SupportedExt { USE_GL_FUNC(PGLFNPROGRAMSTRINGARBPROC, glProgramStringARB, ARB_VERTEX_PROGRAM, NULL );\ USE_GL_FUNC(PGLFNDELETEPROGRAMSARBPROC, glDeleteProgramsARB, ARB_VERTEX_PROGRAM, NULL );\ USE_GL_FUNC(PGLFNPROGRAMENVPARAMETER4FVARBPROC, glProgramEnvParameter4fvARB, ARB_VERTEX_PROGRAM, NULL );\ + USE_GL_FUNC(PGLFNPROGRAMLOCALPARAMETER4FVARBPROC, glProgramLocalParameter4fvARB, ARB_VERTEX_PROGRAM, NULL );\ USE_GL_FUNC(PGLFNVERTEXATTRIBPOINTERARBPROC, glVertexAttribPointerARB, ARB_VERTEX_PROGRAM, NULL );\ USE_GL_FUNC(PGLFNENABLEVERTEXATTRIBARRAYARBPROC, glEnableVertexAttribArrayARB, ARB_VERTEX_PROGRAM, NULL );\ USE_GL_FUNC(PGLFNDISABLEVERTEXATTRIBARRAYARBPROC, glDisableVertexAttribArrayARB, ARB_VERTEX_PROGRAM, NULL );\