wined3d: Use GL_EXT_gpu_program_parameters if available.
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 @@ 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 @@ {"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 @@ #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 @@ 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 @@ 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