Stefan Dösinger : wined3d: Use GL_EXT_gpu_program_parameters if available.
Alexandre Julliard
julliard at winehq.org
Tue Mar 4 14:31:41 CST 2008
Module: wine
Branch: master
Commit: 8b28ca720edd1b177bb04022e8767d67e0ae7c67
URL: http://source.winehq.org/git/wine.git/?a=commit;h=8b28ca720edd1b177bb04022e8767d67e0ae7c67
Author: Stefan Dösinger <stefan at 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
More information about the wine-cvs
mailing list