Module: wine Branch: master Commit: 8b28ca720edd1b177bb04022e8767d67e0ae7c67 URL: http://source.winehq.org/git/wine.git/?a=commit;h=8b28ca720edd1b177bb04022e8...
Author: Stefan Dösinger stefan@codeweavers.com Date: Thu Feb 14 15:30:29 2008 +0100
wined3d: Use GL_EXT_gpu_program_parameters if available.
---
dlls/wined3d/arb_program_shader.c | 25 +++++++++++++++++++++---- dlls/wined3d/directx.c | 1 + include/wine/wined3d_gl.h | 13 ++++++++++++- 3 files changed, 34 insertions(+), 5 deletions(-)
diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c index fbcc7aa..75899e7 100644 --- a/dlls/wined3d/arb_program_shader.c +++ b/dlls/wined3d/arb_program_shader.c @@ -90,10 +90,27 @@ static unsigned int shader_arb_load_constantsF(IWineD3DBaseShaderImpl* This, Win GL_EXTCALL(glProgramEnvParameter4fvARB(target_type, i, lcl_const)); } } else { - for(i = 0; i < max_constants; i++) { - if(dirty_consts[i]) { - dirty_consts[i] = 0; - GL_EXTCALL(glProgramEnvParameter4fvARB(target_type, i, constants + (i * 4))); + if(GL_SUPPORT(EXT_GPU_PROGRAM_PARAMETERS)) { + /* TODO: Benchmark if we're better of with finding the dirty constants ourselves, + * or just reloading *all* constants at once + * + GL_EXTCALL(glProgramEnvParameters4fvEXT(target_type, 0, max_constants, constants)); + */ + for(i = 0; i < max_constants; i++) { + if(!dirty_consts[i]) continue; + + /* Find the next block of dirty constants */ + j = i; + for(i++; (i < max_constants) && dirty_consts[i]; i++); + + GL_EXTCALL(glProgramEnvParameters4fvEXT(target_type, j, i - j, constants + (j * 4))); + } + } else { + for(i = 0; i < max_constants; i++) { + if(dirty_consts[i]) { + dirty_consts[i] = 0; + GL_EXTCALL(glProgramEnvParameter4fvARB(target_type, i, constants + (i * 4))); + } } } } diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c index f4557ba..3d819f1 100644 --- a/dlls/wined3d/directx.c +++ b/dlls/wined3d/directx.c @@ -107,6 +107,7 @@ static const struct { {"GL_EXT_texture_lod_bias", EXT_TEXTURE_LOD_BIAS, 0 }, {"GL_EXT_vertex_shader", EXT_VERTEX_SHADER, 0 }, {"GL_EXT_vertex_weighting", EXT_VERTEX_WEIGHTING, 0 }, + {"GL_EXT_gpu_program_parameters", EXT_GPU_PROGRAM_PARAMETERS, 0 },
/* NV */ {"GL_NV_half_float", NV_HALF_FLOAT, 0 }, diff --git a/include/wine/wined3d_gl.h b/include/wine/wined3d_gl.h index 66bfad8..ac1457f 100644 --- a/include/wine/wined3d_gl.h +++ b/include/wine/wined3d_gl.h @@ -2906,6 +2906,13 @@ typedef void (WINE_GLAPI * PGLFNFINISHRENDERAPPLEPROC) (void); #define GL_LUMINANCE_ALPHA_FLOAT16_APPLE 0x881F #endif
+/* GL_EXT_gpu_program_parameters */ +#ifndef GL_EXT_gpu_program_parameters +#define GL_EXT_gpu_program_parameters +typedef void (WINE_GLAPI * PGLFNPROGRAMENVPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const float *params); +typedef void (WINE_GLAPI * PGLFNPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const float *params); +#endif + /* GL_VERSION_2_0 */ #ifndef GL_VERSION_2_0 #define GL_VERSION_2_0 1 @@ -3240,6 +3247,7 @@ typedef enum _GL_SupportedExt { EXT_TEXTURE_ENV_DOT3, EXT_TEXTURE_SRGB, EXT_VERTEX_WEIGHTING, + EXT_GPU_PROGRAM_PARAMETERS, /* NVIDIA */ NV_HALF_FLOAT, NV_FOG_DISTANCE, @@ -3559,7 +3567,10 @@ typedef enum _GL_SupportedExt { USE_GL_FUNC(PGLXFNWAITVIDEOSYNCSGIPROC, glXWaitVideoSyncSGI, SGI_VIDEO_SYNC, NULL );\ /* GL_APPLE_flush_render */ \ USE_GL_FUNC(PGLFNFLUSHRENDERAPPLEPROC, glFlushRenderApple, APPLE_FLUSH_RENDER, NULL );\ - USE_GL_FUNC(PGLFNFINISHRENDERAPPLEPROC, glFinishRenderApple, APPLE_FLUSH_RENDER, NULL ); + USE_GL_FUNC(PGLFNFINISHRENDERAPPLEPROC, glFinishRenderApple, APPLE_FLUSH_RENDER, NULL );\ + /* GL_EXT_gpu_program_parameters */ \ + USE_GL_FUNC(PGLFNPROGRAMENVPARAMETERS4FVEXTPROC, glProgramEnvParameters4fvEXT, EXT_GPU_PROGRAM_PARAMETERS,NULL );\ + USE_GL_FUNC(PGLFNPROGRAMLOCALPARAMETERS4FVEXTPROC, glProgramLocalParameters4fvEXT, EXT_GPU_PROGRAM_PARAMETERS,NULL );
/**************************************************** * OpenGL WGL defines and functions pointer