Stefan Dösinger : wined3d: Avoid float-> string conversion in arb shaders.
Alexandre Julliard
julliard at winehq.org
Fri Jun 6 06:51:54 CDT 2008
Module: wine
Branch: master
Commit: 2173fde722ca979d1cff245ac7421e3651d54bed
URL: http://source.winehq.org/git/wine.git/?a=commit;h=2173fde722ca979d1cff245ac7421e3651d54bed
Author: Stefan Dösinger <stefan at 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 );\
More information about the wine-cvs
mailing list