Index: third_party/mesa/chromium.patch |
=================================================================== |
--- third_party/mesa/chromium.patch (revision 0) |
+++ third_party/mesa/chromium.patch (revision 0) |
@@ -0,0 +1,1835 @@ |
+diff -c -r Mesa-7.9/include/GL/gl.h MesaLib/include/GL/gl.h |
+*** Mesa-7.9/include/GL/gl.h Tue Apr 27 14:41:21 2010 |
+--- MesaLib/include/GL/gl.h Thu Oct 14 14:41:53 2010 |
+*************** |
+*** 55,61 **** |
+ # if (defined(_MSC_VER) || defined(__MINGW32__)) && defined(BUILD_GL32) /* tag specify we're building mesa as a DLL */ |
+ # define GLAPI __declspec(dllexport) |
+ # elif (defined(_MSC_VER) || defined(__MINGW32__)) && defined(_DLL) /* tag specifying we're building for DLL runtime support */ |
+! # define GLAPI __declspec(dllimport) |
+ # else /* for use with static link lib build of Win32 edition only */ |
+ # define GLAPI extern |
+ # endif /* _STATIC_MESA support */ |
+--- 55,65 ---- |
+ # if (defined(_MSC_VER) || defined(__MINGW32__)) && defined(BUILD_GL32) /* tag specify we're building mesa as a DLL */ |
+ # define GLAPI __declspec(dllexport) |
+ # elif (defined(_MSC_VER) || defined(__MINGW32__)) && defined(_DLL) /* tag specifying we're building for DLL runtime support */ |
+! // We always retrieve the entry points dynamically via GetProcAddress or |
+! // OSMesaGetProcAddress. This works around an issue where using the MSVC |
+! // multi-threaded runtime library, which defines _DLL. |
+! //# define GLAPI __declspec(dllimport) |
+! # define GLAPI |
+ # else /* for use with static link lib build of Win32 edition only */ |
+ # define GLAPI extern |
+ # endif /* _STATIC_MESA support */ |
+*************** |
+*** 72,80 **** |
+ # define GLAPIENTRY |
+ #endif /* WIN32 && !CYGWIN */ |
+ |
+! #if (defined(__BEOS__) && defined(__POWERPC__)) || defined(__QUICKDRAW__) |
+! # define PRAGMA_EXPORT_SUPPORTED 1 |
+! #endif |
+ |
+ /* |
+ * WINDOWS: Include windows.h here to define APIENTRY. |
+--- 76,86 ---- |
+ # define GLAPIENTRY |
+ #endif /* WIN32 && !CYGWIN */ |
+ |
+! // Disabled this because __QUICKDRAW__ is defined on Mac and gcc does not |
+! // support the pragma. |
+! //#if (defined(__BEOS__) && defined(__POWERPC__)) || defined(__QUICKDRAW__) |
+! //# define PRAGMA_EXPORT_SUPPORTED 1 |
+! //#endif |
+ |
+ /* |
+ * WINDOWS: Include windows.h here to define APIENTRY. |
+diff -c -r Mesa-7.9/include/GL/glext.h MesaLib/include/GL/glext.h |
+*** Mesa-7.9/include/GL/glext.h Fri Oct 1 15:51:28 2010 |
+--- MesaLib/include/GL/glext.h Thu Oct 14 14:50:37 2010 |
+*************** |
+*** 5030,5043 **** |
+ |
+ #ifndef GL_VERSION_1_5 |
+ /* GL types for handling large vertex buffer objects */ |
+! typedef ptrdiff_t GLintptr; |
+! typedef ptrdiff_t GLsizeiptr; |
+ #endif |
+ |
+ #ifndef GL_ARB_vertex_buffer_object |
+ /* GL types for handling large vertex buffer objects */ |
+! typedef ptrdiff_t GLintptrARB; |
+! typedef ptrdiff_t GLsizeiptrARB; |
+ #endif |
+ |
+ #ifndef GL_ARB_shader_objects |
+--- 5030,5043 ---- |
+ |
+ #ifndef GL_VERSION_1_5 |
+ /* GL types for handling large vertex buffer objects */ |
+! typedef signed long int GLintptr; |
+! typedef signed long int GLsizeiptr; |
+ #endif |
+ |
+ #ifndef GL_ARB_vertex_buffer_object |
+ /* GL types for handling large vertex buffer objects */ |
+! typedef signed long int GLintptrARB; |
+! typedef signed long int GLsizeiptrARB; |
+ #endif |
+ |
+ #ifndef GL_ARB_shader_objects |
+diff -c -r Mesa-7.9/include/GL/osmesa.h MesaLib/include/GL/osmesa.h |
+*** Mesa-7.9/include/GL/osmesa.h Thu Feb 4 16:10:39 2010 |
+--- MesaLib/include/GL/osmesa.h Thu Oct 14 14:47:08 2010 |
+*************** |
+*** 101,109 **** |
+ typedef struct osmesa_context *OSMesaContext; |
+ |
+ |
+! #if defined(__BEOS__) || defined(__QUICKDRAW__) |
+! #pragma export on |
+! #endif |
+ |
+ |
+ /* |
+--- 101,111 ---- |
+ typedef struct osmesa_context *OSMesaContext; |
+ |
+ |
+! // Disabled this because __QUICKDRAW__ is defined on Mac and gcc does not |
+! // support the pragma. |
+! //#if defined(__BEOS__) || defined(__QUICKDRAW__) |
+! //#pragma export on |
+! //#endif |
+ |
+ |
+ /* |
+*************** |
+*** 276,284 **** |
+ OSMesaColorClamp(GLboolean enable); |
+ |
+ |
+! #if defined(__BEOS__) || defined(__QUICKDRAW__) |
+! #pragma export off |
+! #endif |
+ |
+ |
+ #ifdef __cplusplus |
+--- 278,288 ---- |
+ OSMesaColorClamp(GLboolean enable); |
+ |
+ |
+! // Disabled this because __QUICKDRAW__ is defined on Mac and gcc does not |
+! // support the pragma. |
+! //#if defined(__BEOS__) || defined(__QUICKDRAW__) |
+! //#pragma export off |
+! //#endif |
+ |
+ |
+ #ifdef __cplusplus |
+diff -c -r Mesa-7.9/src/glsl/ast_to_hir.cpp MesaLib/src/glsl/ast_to_hir.cpp |
+*** Mesa-7.9/src/glsl/ast_to_hir.cpp Fri Oct 1 15:51:28 2010 |
+--- MesaLib/src/glsl/ast_to_hir.cpp Fri Oct 22 15:28:47 2010 |
+*************** |
+*** 55,60 **** |
+--- 55,61 ---- |
+ #include "ast.h" |
+ #include "glsl_types.h" |
+ #include "ir.h" |
++ #include "safe_strcmp.h" |
+ |
+ void |
+ _mesa_ast_to_hir(exec_list *instructions, struct _mesa_glsl_parse_state *state) |
+*************** |
+*** 1615,1621 **** |
+ var->pixel_center_integer = qual->pixel_center_integer; |
+ var->origin_upper_left = qual->origin_upper_left; |
+ if ((qual->origin_upper_left || qual->pixel_center_integer) |
+! && (strcmp(var->name, "gl_FragCoord") != 0)) { |
+ const char *const qual_string = (qual->origin_upper_left) |
+ ? "origin_upper_left" : "pixel_center_integer"; |
+ |
+--- 1616,1622 ---- |
+ var->pixel_center_integer = qual->pixel_center_integer; |
+ var->origin_upper_left = qual->origin_upper_left; |
+ if ((qual->origin_upper_left || qual->pixel_center_integer) |
+! && (safe_strcmp(var->name, "gl_FragCoord") != 0)) { |
+ const char *const qual_string = (qual->origin_upper_left) |
+ ? "origin_upper_left" : "pixel_center_integer"; |
+ |
+*************** |
+*** 2003,2009 **** |
+ * gl_MaxTextureCoords." |
+ */ |
+ const unsigned size = unsigned(var->type->array_size()); |
+! if ((strcmp("gl_TexCoord", var->name) == 0) |
+ && (size > state->Const.MaxTextureCoords)) { |
+ YYLTYPE loc = this->get_location(); |
+ |
+--- 2004,2010 ---- |
+ * gl_MaxTextureCoords." |
+ */ |
+ const unsigned size = unsigned(var->type->array_size()); |
+! if ((safe_strcmp("gl_TexCoord", var->name) == 0) |
+ && (size > state->Const.MaxTextureCoords)) { |
+ YYLTYPE loc = this->get_location(); |
+ |
+*************** |
+*** 2022,2028 **** |
+ delete var; |
+ var = NULL; |
+ } else if (state->extensions->ARB_fragment_coord_conventions |
+! && strcmp(var->name, "gl_FragCoord") == 0 |
+ && earlier->type == var->type |
+ && earlier->mode == var->mode) { |
+ /* Allow redeclaration of gl_FragCoord for ARB_fcc layout |
+--- 2023,2029 ---- |
+ delete var; |
+ var = NULL; |
+ } else if (state->extensions->ARB_fragment_coord_conventions |
+! && safe_strcmp(var->name, "gl_FragCoord") == 0 |
+ && earlier->type == var->type |
+ && earlier->mode == var->mode) { |
+ /* Allow redeclaration of gl_FragCoord for ARB_fcc layout |
+*************** |
+*** 2336,2342 **** |
+ } |
+ |
+ /* Verify the return type of main() */ |
+! if (strcmp(name, "main") == 0) { |
+ if (! return_type->is_void()) { |
+ YYLTYPE loc = this->get_location(); |
+ |
+--- 2337,2343 ---- |
+ } |
+ |
+ /* Verify the return type of main() */ |
+! if (safe_strcmp(name, "main") == 0) { |
+ if (! return_type->is_void()) { |
+ YYLTYPE loc = this->get_location(); |
+ |
+diff -c -r Mesa-7.9/src/glsl/glcpp/glcpp-parse.c MesaLib/src/glsl/glcpp/glcpp-parse.c |
+*** Mesa-7.9/src/glsl/glcpp/glcpp-parse.c Fri Oct 1 15:51:28 2010 |
+--- MesaLib/src/glsl/glcpp/glcpp-parse.c Fri Oct 22 15:30:59 2010 |
+*************** |
+*** 96,106 **** |
+--- 96,114 ---- |
+ #include <stdlib.h> |
+ #include <string.h> |
+ #include <assert.h> |
++ /* The #include of inttypes.h causes problems on Windows */ |
++ #ifndef _MSC_VER |
+ #include <inttypes.h> |
++ #endif |
++ /* Windows headers do not define PRIiMAX */ |
++ #ifdef _MSC_VER |
++ #define PRIiMAX "I64i" |
++ #endif |
+ |
+ #include "glcpp.h" |
+ #include "main/core.h" /* for struct gl_extensions */ |
+ #include "main/mtypes.h" /* for gl_api enum */ |
++ #include "safe_strcmp.h" |
+ |
+ #define glcpp_print(stream, str) stream = talloc_strdup_append(stream, str) |
+ #define glcpp_printf(stream, fmt, args, ...) \ |
+*************** |
+*** 2915,2921 **** |
+ return 0; |
+ |
+ for (i = 0, node = list->head; node; i++, node = node->next) { |
+! if (strcmp (node->str, member) == 0) { |
+ if (index) |
+ *index = i; |
+ return 1; |
+--- 2923,2929 ---- |
+ return 0; |
+ |
+ for (i = 0, node = list->head; node; i++, node = node->next) { |
+! if (safe_strcmp (node->str, member) == 0) { |
+ if (index) |
+ *index = i; |
+ return 1; |
+*************** |
+*** 2955,2961 **** |
+ node_a && node_b; |
+ node_a = node_a->next, node_b = node_b->next) |
+ { |
+! if (strcmp (node_a->str, node_b->str)) |
+ return 0; |
+ } |
+ |
+--- 2963,2969 ---- |
+ node_a && node_b; |
+ node_a = node_a->next, node_b = node_b->next) |
+ { |
+! if (safe_strcmp (node_a->str, node_b->str)) |
+ return 0; |
+ } |
+ |
+*************** |
+*** 3182,3189 **** |
+ case IDENTIFIER: |
+ case INTEGER_STRING: |
+ case OTHER: |
+! if (strcmp (node_a->token->value.str, |
+! node_b->token->value.str)) |
+ { |
+ return 0; |
+ } |
+--- 3190,3197 ---- |
+ case IDENTIFIER: |
+ case INTEGER_STRING: |
+ case OTHER: |
+! if (safe_strcmp (node_a->token->value.str, |
+! node_b->token->value.str)) |
+ { |
+ return 0; |
+ } |
+*************** |
+*** 3832,3838 **** |
+ return 0; |
+ |
+ for (node = list; node; node = node->next) |
+! if (strcmp (node->identifier, identifier) == 0) |
+ return 1; |
+ |
+ return 0; |
+--- 3840,3846 ---- |
+ return 0; |
+ |
+ for (node = list; node; node = node->next) |
+! if (safe_strcmp (node->identifier, identifier) == 0) |
+ return 1; |
+ |
+ return 0; |
+diff -c -r Mesa-7.9/src/glsl/glcpp/glcpp-parse.y MesaLib/src/glsl/glcpp/glcpp-parse.y |
+*** Mesa-7.9/src/glsl/glcpp/glcpp-parse.y Fri Oct 1 15:51:28 2010 |
+--- MesaLib/src/glsl/glcpp/glcpp-parse.y Fri Oct 22 15:30:47 2010 |
+*************** |
+*** 26,36 **** |
+--- 26,44 ---- |
+ #include <stdlib.h> |
+ #include <string.h> |
+ #include <assert.h> |
++ /* The #include of inttypes.h causes problems on Windows */ |
++ #ifndef _MSC_VER |
+ #include <inttypes.h> |
++ #endif |
++ /* Windows headers do not define PRIiMAX */ |
++ #ifdef _MSC_VER |
++ #define PRIiMAX "I64i" |
++ #endif |
+ |
+ #include "glcpp.h" |
+ #include "main/core.h" /* for struct gl_extensions */ |
+ #include "main/mtypes.h" /* for gl_api enum */ |
++ #include "safe_strcmp.h" |
+ |
+ #define glcpp_print(stream, str) stream = talloc_strdup_append(stream, str) |
+ #define glcpp_printf(stream, fmt, args, ...) \ |
+*************** |
+*** 590,596 **** |
+ return 0; |
+ |
+ for (i = 0, node = list->head; node; i++, node = node->next) { |
+! if (strcmp (node->str, member) == 0) { |
+ if (index) |
+ *index = i; |
+ return 1; |
+--- 598,604 ---- |
+ return 0; |
+ |
+ for (i = 0, node = list->head; node; i++, node = node->next) { |
+! if (safe_strcmp (node->str, member) == 0) { |
+ if (index) |
+ *index = i; |
+ return 1; |
+*************** |
+*** 630,636 **** |
+ node_a && node_b; |
+ node_a = node_a->next, node_b = node_b->next) |
+ { |
+! if (strcmp (node_a->str, node_b->str)) |
+ return 0; |
+ } |
+ |
+--- 638,644 ---- |
+ node_a && node_b; |
+ node_a = node_a->next, node_b = node_b->next) |
+ { |
+! if (safe_strcmp (node_a->str, node_b->str)) |
+ return 0; |
+ } |
+ |
+*************** |
+*** 857,864 **** |
+ case IDENTIFIER: |
+ case INTEGER_STRING: |
+ case OTHER: |
+! if (strcmp (node_a->token->value.str, |
+! node_b->token->value.str)) |
+ { |
+ return 0; |
+ } |
+--- 865,872 ---- |
+ case IDENTIFIER: |
+ case INTEGER_STRING: |
+ case OTHER: |
+! if (safe_strcmp (node_a->token->value.str, |
+! node_b->token->value.str)) |
+ { |
+ return 0; |
+ } |
+*************** |
+*** 1507,1513 **** |
+ return 0; |
+ |
+ for (node = list; node; node = node->next) |
+! if (strcmp (node->identifier, identifier) == 0) |
+ return 1; |
+ |
+ return 0; |
+--- 1515,1521 ---- |
+ return 0; |
+ |
+ for (node = list; node; node = node->next) |
+! if (safe_strcmp (node->identifier, identifier) == 0) |
+ return 1; |
+ |
+ return 0; |
+diff -c -r Mesa-7.9/src/glsl/glcpp/glcpp.c MesaLib/src/glsl/glcpp/glcpp.c |
+*** Mesa-7.9/src/glsl/glcpp/glcpp.c Fri Oct 1 15:51:28 2010 |
+--- MesaLib/src/glsl/glcpp/glcpp.c Fri Oct 22 15:31:25 2010 |
+*************** |
+*** 29,34 **** |
+--- 29,35 ---- |
+ #include <errno.h> |
+ #include "glcpp.h" |
+ #include "main/mtypes.h" |
++ #include "safe_strcmp.h" |
+ |
+ extern int yydebug; |
+ |
+*************** |
+*** 78,84 **** |
+ char *text; |
+ int fd; |
+ |
+! if (filename == NULL || strcmp (filename, "-") == 0) |
+ return load_text_fd (ctx, STDIN_FILENO); |
+ |
+ fd = open (filename, O_RDONLY); |
+--- 79,85 ---- |
+ char *text; |
+ int fd; |
+ |
+! if (filename == NULL || safe_strcmp (filename, "-") == 0) |
+ return load_text_fd (ctx, STDIN_FILENO); |
+ |
+ fd = open (filename, O_RDONLY); |
+diff -c -r Mesa-7.9/src/glsl/glcpp/glcpp.h MesaLib/src/glsl/glcpp/glcpp.h |
+*** Mesa-7.9/src/glsl/glcpp/glcpp.h Fri Oct 1 15:51:28 2010 |
+--- MesaLib/src/glsl/glcpp/glcpp.h Fri Oct 22 15:32:43 2010 |
+*************** |
+*** 24,30 **** |
+--- 24,33 ---- |
+ #ifndef GLCPP_H |
+ #define GLCPP_H |
+ |
++ /* Windows does not currently have stdint.h. */ |
++ #ifndef _MSC_VER |
+ #include <stdint.h> |
++ #endif |
+ |
+ #include <talloc.h> |
+ |
+*************** |
+*** 49,55 **** |
+--- 52,62 ---- |
+ |
+ typedef union YYSTYPE |
+ { |
++ #ifndef _MSC_VER |
+ intmax_t ival; |
++ #else |
++ __int64 ival; |
++ #endif |
+ char *str; |
+ string_list_t *string_list; |
+ token_t *token; |
+diff -c -r Mesa-7.9/src/glsl/glsl_parser.cpp MesaLib/src/glsl/glsl_parser.cpp |
+*** Mesa-7.9/src/glsl/glsl_parser.cpp Fri Oct 1 15:51:28 2010 |
+--- MesaLib/src/glsl/glsl_parser.cpp Fri Oct 22 15:33:24 2010 |
+*************** |
+*** 107,112 **** |
+--- 107,113 ---- |
+ #include "ast.h" |
+ #include "glsl_parser_extras.h" |
+ #include "glsl_types.h" |
++ #include "safe_strcmp.h" |
+ |
+ #define YYLEX_PARAM state->scanner |
+ |
+*************** |
+*** 3966,3975 **** |
+ if (state->ARB_fragment_coord_conventions_enable) { |
+ bool got_one = false; |
+ |
+! if (strcmp((yyvsp[(1) - (1)].identifier), "origin_upper_left") == 0) { |
+ got_one = true; |
+ (yyval.type_qualifier).q.origin_upper_left = 1; |
+! } else if (strcmp((yyvsp[(1) - (1)].identifier), "pixel_center_integer") == 0) { |
+ got_one = true; |
+ (yyval.type_qualifier).q.pixel_center_integer = 1; |
+ } |
+--- 3967,3976 ---- |
+ if (state->ARB_fragment_coord_conventions_enable) { |
+ bool got_one = false; |
+ |
+! if (safe_strcmp((yyvsp[(1) - (1)].identifier), "origin_upper_left") == 0) { |
+ got_one = true; |
+ (yyval.type_qualifier).q.origin_upper_left = 1; |
+! } else if (safe_strcmp((yyvsp[(1) - (1)].identifier), "pixel_center_integer") == 0) { |
+ got_one = true; |
+ (yyval.type_qualifier).q.pixel_center_integer = 1; |
+ } |
+diff -c -r Mesa-7.9/src/glsl/glsl_parser_extras.cpp MesaLib/src/glsl/glsl_parser_extras.cpp |
+*** Mesa-7.9/src/glsl/glsl_parser_extras.cpp Fri Oct 1 15:51:28 2010 |
+--- MesaLib/src/glsl/glsl_parser_extras.cpp Fri Oct 22 15:33:37 2010 |
+*************** |
+*** 35,40 **** |
+--- 35,41 ---- |
+ #include "glsl_parser.h" |
+ #include "ir_optimization.h" |
+ #include "loop_analysis.h" |
++ #include "safe_strcmp.h" |
+ |
+ _mesa_glsl_parse_state::_mesa_glsl_parse_state(struct __GLcontextRec *ctx, |
+ GLenum target, void *mem_ctx) |
+*************** |
+*** 148,160 **** |
+ extension_warn |
+ } ext_mode; |
+ |
+! if (strcmp(behavior, "warn") == 0) { |
+ ext_mode = extension_warn; |
+! } else if (strcmp(behavior, "require") == 0) { |
+ ext_mode = extension_require; |
+! } else if (strcmp(behavior, "enable") == 0) { |
+ ext_mode = extension_enable; |
+! } else if (strcmp(behavior, "disable") == 0) { |
+ ext_mode = extension_disable; |
+ } else { |
+ _mesa_glsl_error(behavior_locp, state, |
+--- 149,161 ---- |
+ extension_warn |
+ } ext_mode; |
+ |
+! if (safe_strcmp(behavior, "warn") == 0) { |
+ ext_mode = extension_warn; |
+! } else if (safe_strcmp(behavior, "require") == 0) { |
+ ext_mode = extension_require; |
+! } else if (safe_strcmp(behavior, "enable") == 0) { |
+ ext_mode = extension_enable; |
+! } else if (safe_strcmp(behavior, "disable") == 0) { |
+ ext_mode = extension_disable; |
+ } else { |
+ _mesa_glsl_error(behavior_locp, state, |
+*************** |
+*** 165,178 **** |
+ |
+ bool unsupported = false; |
+ |
+! if (strcmp(name, "all") == 0) { |
+ if ((ext_mode == extension_enable) || (ext_mode == extension_require)) { |
+ _mesa_glsl_error(name_locp, state, "Cannot %s all extensions", |
+ (ext_mode == extension_enable) |
+ ? "enable" : "require"); |
+ return false; |
+ } |
+! } else if (strcmp(name, "GL_ARB_draw_buffers") == 0) { |
+ /* This extension is only supported in fragment shaders. |
+ */ |
+ if (state->target != fragment_shader) { |
+--- 166,179 ---- |
+ |
+ bool unsupported = false; |
+ |
+! if (safe_strcmp(name, "all") == 0) { |
+ if ((ext_mode == extension_enable) || (ext_mode == extension_require)) { |
+ _mesa_glsl_error(name_locp, state, "Cannot %s all extensions", |
+ (ext_mode == extension_enable) |
+ ? "enable" : "require"); |
+ return false; |
+ } |
+! } else if (safe_strcmp(name, "GL_ARB_draw_buffers") == 0) { |
+ /* This extension is only supported in fragment shaders. |
+ */ |
+ if (state->target != fragment_shader) { |
+*************** |
+*** 181,197 **** |
+ state->ARB_draw_buffers_enable = (ext_mode != extension_disable); |
+ state->ARB_draw_buffers_warn = (ext_mode == extension_warn); |
+ } |
+! } else if (strcmp(name, "GL_ARB_fragment_coord_conventions") == 0) { |
+ state->ARB_fragment_coord_conventions_enable = |
+ (ext_mode != extension_disable); |
+ state->ARB_fragment_coord_conventions_warn = |
+ (ext_mode == extension_warn); |
+ |
+ unsupported = !state->extensions->ARB_fragment_coord_conventions; |
+! } else if (strcmp(name, "GL_ARB_texture_rectangle") == 0) { |
+ state->ARB_texture_rectangle_enable = (ext_mode != extension_disable); |
+ state->ARB_texture_rectangle_warn = (ext_mode == extension_warn); |
+! } else if (strcmp(name, "GL_EXT_texture_array") == 0) { |
+ state->EXT_texture_array_enable = (ext_mode != extension_disable); |
+ state->EXT_texture_array_warn = (ext_mode == extension_warn); |
+ |
+--- 182,198 ---- |
+ state->ARB_draw_buffers_enable = (ext_mode != extension_disable); |
+ state->ARB_draw_buffers_warn = (ext_mode == extension_warn); |
+ } |
+! } else if (safe_strcmp(name, "GL_ARB_fragment_coord_conventions") == 0) { |
+ state->ARB_fragment_coord_conventions_enable = |
+ (ext_mode != extension_disable); |
+ state->ARB_fragment_coord_conventions_warn = |
+ (ext_mode == extension_warn); |
+ |
+ unsupported = !state->extensions->ARB_fragment_coord_conventions; |
+! } else if (safe_strcmp(name, "GL_ARB_texture_rectangle") == 0) { |
+ state->ARB_texture_rectangle_enable = (ext_mode != extension_disable); |
+ state->ARB_texture_rectangle_warn = (ext_mode == extension_warn); |
+! } else if (safe_strcmp(name, "GL_EXT_texture_array") == 0) { |
+ state->EXT_texture_array_enable = (ext_mode != extension_disable); |
+ state->EXT_texture_array_warn = (ext_mode == extension_warn); |
+ |
+diff -c -r Mesa-7.9/src/glsl/glsl_types.cpp MesaLib/src/glsl/glsl_types.cpp |
+*** Mesa-7.9/src/glsl/glsl_types.cpp Fri Oct 1 15:51:28 2010 |
+--- MesaLib/src/glsl/glsl_types.cpp Fri Oct 22 15:33:51 2010 |
+*************** |
+*** 27,32 **** |
+--- 27,33 ---- |
+ #include "glsl_symbol_table.h" |
+ #include "glsl_parser_extras.h" |
+ #include "glsl_types.h" |
++ #include "safe_strcmp.h" |
+ #include "builtin_types.h" |
+ extern "C" { |
+ #include "program/hash_table.h" |
+*************** |
+*** 374,380 **** |
+ /* Return zero is the types match (there is zero difference) or non-zero |
+ * otherwise. |
+ */ |
+! if (strcmp(key1->name, key2->name) != 0) |
+ return 1; |
+ |
+ if (key1->length != key2->length) |
+--- 375,381 ---- |
+ /* Return zero is the types match (there is zero difference) or non-zero |
+ * otherwise. |
+ */ |
+! if (safe_strcmp(key1->name, key2->name) != 0) |
+ return 1; |
+ |
+ if (key1->length != key2->length) |
+*************** |
+*** 383,389 **** |
+ for (unsigned i = 0; i < key1->length; i++) { |
+ if (key1->fields.structure[i].type != key2->fields.structure[i].type) |
+ return 1; |
+! if (strcmp(key1->fields.structure[i].name, |
+ key2->fields.structure[i].name) != 0) |
+ return 1; |
+ } |
+--- 384,390 ---- |
+ for (unsigned i = 0; i < key1->length; i++) { |
+ if (key1->fields.structure[i].type != key2->fields.structure[i].type) |
+ return 1; |
+! if (safe_strcmp(key1->fields.structure[i].name, |
+ key2->fields.structure[i].name) != 0) |
+ return 1; |
+ } |
+*************** |
+*** 433,439 **** |
+ |
+ assert(t->base_type == GLSL_TYPE_STRUCT); |
+ assert(t->length == num_fields); |
+! assert(strcmp(t->name, name) == 0); |
+ |
+ return t; |
+ } |
+--- 434,440 ---- |
+ |
+ assert(t->base_type == GLSL_TYPE_STRUCT); |
+ assert(t->length == num_fields); |
+! assert(safe_strcmp(t->name, name) == 0); |
+ |
+ return t; |
+ } |
+*************** |
+*** 446,452 **** |
+ return error_type; |
+ |
+ for (unsigned i = 0; i < this->length; i++) { |
+! if (strcmp(name, this->fields.structure[i].name) == 0) |
+ return this->fields.structure[i].type; |
+ } |
+ |
+--- 447,453 ---- |
+ return error_type; |
+ |
+ for (unsigned i = 0; i < this->length; i++) { |
+! if (safe_strcmp(name, this->fields.structure[i].name) == 0) |
+ return this->fields.structure[i].type; |
+ } |
+ |
+*************** |
+*** 461,467 **** |
+ return -1; |
+ |
+ for (unsigned i = 0; i < this->length; i++) { |
+! if (strcmp(name, this->fields.structure[i].name) == 0) |
+ return i; |
+ } |
+ |
+--- 462,468 ---- |
+ return -1; |
+ |
+ for (unsigned i = 0; i < this->length; i++) { |
+! if (safe_strcmp(name, this->fields.structure[i].name) == 0) |
+ return i; |
+ } |
+ |
+diff -c -r Mesa-7.9/src/glsl/hir_field_selection.cpp MesaLib/src/glsl/hir_field_selection.cpp |
+*** Mesa-7.9/src/glsl/hir_field_selection.cpp Fri Oct 1 15:51:28 2010 |
+--- MesaLib/src/glsl/hir_field_selection.cpp Fri Oct 22 15:34:11 2010 |
+*************** |
+*** 26,31 **** |
+--- 26,32 ---- |
+ #include "glsl_parser_extras.h" |
+ #include "ast.h" |
+ #include "glsl_types.h" |
++ #include "safe_strcmp.h" |
+ |
+ ir_rvalue * |
+ _mesa_ast_field_selection_to_hir(const ast_expression *expr, |
+*************** |
+*** 81,87 **** |
+ const char *method; |
+ method = call->subexpressions[0]->primary_expression.identifier; |
+ |
+! if (op->type->is_array() && strcmp(method, "length") == 0) { |
+ if (!call->expressions.is_empty()) |
+ _mesa_glsl_error(&loc, state, "length method takes no arguments."); |
+ |
+--- 82,88 ---- |
+ const char *method; |
+ method = call->subexpressions[0]->primary_expression.identifier; |
+ |
+! if (op->type->is_array() && safe_strcmp(method, "length") == 0) { |
+ if (!call->expressions.is_empty()) |
+ _mesa_glsl_error(&loc, state, "length method takes no arguments."); |
+ |
+diff -c -r Mesa-7.9/src/glsl/ir.cpp MesaLib/src/glsl/ir.cpp |
+*** Mesa-7.9/src/glsl/ir.cpp Fri Oct 1 15:51:28 2010 |
+--- MesaLib/src/glsl/ir.cpp Fri Oct 22 15:34:20 2010 |
+*************** |
+*** 25,30 **** |
+--- 25,31 ---- |
+ #include "ir.h" |
+ #include "ir_visitor.h" |
+ #include "glsl_types.h" |
++ #include "safe_strcmp.h" |
+ |
+ ir_rvalue::ir_rvalue() |
+ { |
+*************** |
+*** 338,344 **** |
+ { |
+ const int operator_count = sizeof(operator_strs) / sizeof(operator_strs[0]); |
+ for (int op = 0; op < operator_count; op++) { |
+! if (strcmp(str, operator_strs[op]) == 0) |
+ return (ir_expression_operation) op; |
+ } |
+ return (ir_expression_operation) -1; |
+--- 339,345 ---- |
+ { |
+ const int operator_count = sizeof(operator_strs) / sizeof(operator_strs[0]); |
+ for (int op = 0; op < operator_count; op++) { |
+! if (safe_strcmp(str, operator_strs[op]) == 0) |
+ return (ir_expression_operation) op; |
+ } |
+ return (ir_expression_operation) -1; |
+*************** |
+*** 878,884 **** |
+ { |
+ const int count = sizeof(tex_opcode_strs) / sizeof(tex_opcode_strs[0]); |
+ for (int op = 0; op < count; op++) { |
+! if (strcmp(str, tex_opcode_strs[op]) == 0) |
+ return (ir_texture_opcode) op; |
+ } |
+ return (ir_texture_opcode) -1; |
+--- 879,885 ---- |
+ { |
+ const int count = sizeof(tex_opcode_strs) / sizeof(tex_opcode_strs[0]); |
+ for (int op = 0; op < count; op++) { |
+! if (safe_strcmp(str, tex_opcode_strs[op]) == 0) |
+ return (ir_texture_opcode) op; |
+ } |
+ return (ir_texture_opcode) -1; |
+diff -c -r Mesa-7.9/src/glsl/ir_constant_expression.cpp MesaLib/src/glsl/ir_constant_expression.cpp |
+*** Mesa-7.9/src/glsl/ir_constant_expression.cpp Fri Oct 1 15:51:28 2010 |
+--- MesaLib/src/glsl/ir_constant_expression.cpp Fri Oct 22 15:34:40 2010 |
+*************** |
+*** 38,43 **** |
+--- 38,44 ---- |
+ #include "ir.h" |
+ #include "ir_visitor.h" |
+ #include "glsl_types.h" |
++ #include "safe_strcmp.h" |
+ |
+ static float |
+ dot(ir_constant *op0, ir_constant *op1) |
+*************** |
+*** 850,880 **** |
+ memset(&data, 0, sizeof(data)); |
+ |
+ const char *callee = this->callee_name(); |
+! if (strcmp(callee, "abs") == 0) { |
+ expr = new(mem_ctx) ir_expression(ir_unop_abs, type, op[0], NULL); |
+! } else if (strcmp(callee, "all") == 0) { |
+ assert(op[0]->type->is_boolean()); |
+ for (unsigned c = 0; c < op[0]->type->components(); c++) { |
+ if (!op[0]->value.b[c]) |
+ return new(mem_ctx) ir_constant(false); |
+ } |
+ return new(mem_ctx) ir_constant(true); |
+! } else if (strcmp(callee, "any") == 0) { |
+ assert(op[0]->type->is_boolean()); |
+ for (unsigned c = 0; c < op[0]->type->components(); c++) { |
+ if (op[0]->value.b[c]) |
+ return new(mem_ctx) ir_constant(true); |
+ } |
+ return new(mem_ctx) ir_constant(false); |
+! } else if (strcmp(callee, "acos") == 0) { |
+ assert(op[0]->type->is_float()); |
+ for (unsigned c = 0; c < op[0]->type->components(); c++) |
+ data.f[c] = acosf(op[0]->value.f[c]); |
+! } else if (strcmp(callee, "asin") == 0) { |
+ assert(op[0]->type->is_float()); |
+ for (unsigned c = 0; c < op[0]->type->components(); c++) |
+ data.f[c] = asinf(op[0]->value.f[c]); |
+! } else if (strcmp(callee, "atan") == 0) { |
+ assert(op[0]->type->is_float()); |
+ if (num_parameters == 2) { |
+ assert(op[1]->type->is_float()); |
+--- 851,881 ---- |
+ memset(&data, 0, sizeof(data)); |
+ |
+ const char *callee = this->callee_name(); |
+! if (safe_strcmp(callee, "abs") == 0) { |
+ expr = new(mem_ctx) ir_expression(ir_unop_abs, type, op[0], NULL); |
+! } else if (safe_strcmp(callee, "all") == 0) { |
+ assert(op[0]->type->is_boolean()); |
+ for (unsigned c = 0; c < op[0]->type->components(); c++) { |
+ if (!op[0]->value.b[c]) |
+ return new(mem_ctx) ir_constant(false); |
+ } |
+ return new(mem_ctx) ir_constant(true); |
+! } else if (safe_strcmp(callee, "any") == 0) { |
+ assert(op[0]->type->is_boolean()); |
+ for (unsigned c = 0; c < op[0]->type->components(); c++) { |
+ if (op[0]->value.b[c]) |
+ return new(mem_ctx) ir_constant(true); |
+ } |
+ return new(mem_ctx) ir_constant(false); |
+! } else if (safe_strcmp(callee, "acos") == 0) { |
+ assert(op[0]->type->is_float()); |
+ for (unsigned c = 0; c < op[0]->type->components(); c++) |
+ data.f[c] = acosf(op[0]->value.f[c]); |
+! } else if (safe_strcmp(callee, "asin") == 0) { |
+ assert(op[0]->type->is_float()); |
+ for (unsigned c = 0; c < op[0]->type->components(); c++) |
+ data.f[c] = asinf(op[0]->value.f[c]); |
+! } else if (safe_strcmp(callee, "atan") == 0) { |
+ assert(op[0]->type->is_float()); |
+ if (num_parameters == 2) { |
+ assert(op[1]->type->is_float()); |
+*************** |
+*** 884,894 **** |
+ for (unsigned c = 0; c < op[0]->type->components(); c++) |
+ data.f[c] = atanf(op[0]->value.f[c]); |
+ } |
+! } else if (strcmp(callee, "dFdx") == 0 || strcmp(callee, "dFdy") == 0) { |
+ return ir_constant::zero(mem_ctx, this->type); |
+! } else if (strcmp(callee, "ceil") == 0) { |
+ expr = new(mem_ctx) ir_expression(ir_unop_ceil, type, op[0], NULL); |
+! } else if (strcmp(callee, "clamp") == 0) { |
+ assert(num_parameters == 3); |
+ unsigned c1_inc = op[1]->type->is_scalar() ? 0 : 1; |
+ unsigned c2_inc = op[2]->type->is_scalar() ? 0 : 1; |
+--- 885,895 ---- |
+ for (unsigned c = 0; c < op[0]->type->components(); c++) |
+ data.f[c] = atanf(op[0]->value.f[c]); |
+ } |
+! } else if (safe_strcmp(callee, "dFdx") == 0 || safe_strcmp(callee, "dFdy") == 0) { |
+ return ir_constant::zero(mem_ctx, this->type); |
+! } else if (safe_strcmp(callee, "ceil") == 0) { |
+ expr = new(mem_ctx) ir_expression(ir_unop_ceil, type, op[0], NULL); |
+! } else if (safe_strcmp(callee, "clamp") == 0) { |
+ assert(num_parameters == 3); |
+ unsigned c1_inc = op[1]->type->is_scalar() ? 0 : 1; |
+ unsigned c2_inc = op[2]->type->is_scalar() ? 0 : 1; |
+*************** |
+*** 913,931 **** |
+ assert(!"Should not get here."); |
+ } |
+ } |
+! } else if (strcmp(callee, "cos") == 0) { |
+ expr = new(mem_ctx) ir_expression(ir_unop_cos, type, op[0], NULL); |
+! } else if (strcmp(callee, "cosh") == 0) { |
+ assert(op[0]->type->is_float()); |
+ for (unsigned c = 0; c < op[0]->type->components(); c++) |
+ data.f[c] = coshf(op[0]->value.f[c]); |
+! } else if (strcmp(callee, "cross") == 0) { |
+ expr = new(mem_ctx) ir_expression(ir_binop_cross, type, op[0], op[1]); |
+! } else if (strcmp(callee, "degrees") == 0) { |
+ assert(op[0]->type->is_float()); |
+ for (unsigned c = 0; c < op[0]->type->components(); c++) |
+ data.f[c] = 180.0/M_PI * op[0]->value.f[c]; |
+! } else if (strcmp(callee, "distance") == 0) { |
+ assert(op[0]->type->is_float() && op[1]->type->is_float()); |
+ float length_squared = 0.0; |
+ for (unsigned c = 0; c < op[0]->type->components(); c++) { |
+--- 914,932 ---- |
+ assert(!"Should not get here."); |
+ } |
+ } |
+! } else if (safe_strcmp(callee, "cos") == 0) { |
+ expr = new(mem_ctx) ir_expression(ir_unop_cos, type, op[0], NULL); |
+! } else if (safe_strcmp(callee, "cosh") == 0) { |
+ assert(op[0]->type->is_float()); |
+ for (unsigned c = 0; c < op[0]->type->components(); c++) |
+ data.f[c] = coshf(op[0]->value.f[c]); |
+! } else if (safe_strcmp(callee, "cross") == 0) { |
+ expr = new(mem_ctx) ir_expression(ir_binop_cross, type, op[0], op[1]); |
+! } else if (safe_strcmp(callee, "degrees") == 0) { |
+ assert(op[0]->type->is_float()); |
+ for (unsigned c = 0; c < op[0]->type->components(); c++) |
+ data.f[c] = 180.0/M_PI * op[0]->value.f[c]; |
+! } else if (safe_strcmp(callee, "distance") == 0) { |
+ assert(op[0]->type->is_float() && op[1]->type->is_float()); |
+ float length_squared = 0.0; |
+ for (unsigned c = 0; c < op[0]->type->components(); c++) { |
+*************** |
+*** 933,941 **** |
+ length_squared += t * t; |
+ } |
+ return new(mem_ctx) ir_constant(sqrtf(length_squared)); |
+! } else if (strcmp(callee, "dot") == 0) { |
+ return new(mem_ctx) ir_constant(dot(op[0], op[1])); |
+! } else if (strcmp(callee, "equal") == 0) { |
+ assert(op[0]->type->is_vector() && op[1] && op[1]->type->is_vector()); |
+ for (unsigned c = 0; c < op[0]->type->components(); c++) { |
+ switch (op[0]->type->base_type) { |
+--- 934,942 ---- |
+ length_squared += t * t; |
+ } |
+ return new(mem_ctx) ir_constant(sqrtf(length_squared)); |
+! } else if (safe_strcmp(callee, "dot") == 0) { |
+ return new(mem_ctx) ir_constant(dot(op[0], op[1])); |
+! } else if (safe_strcmp(callee, "equal") == 0) { |
+ assert(op[0]->type->is_vector() && op[1] && op[1]->type->is_vector()); |
+ for (unsigned c = 0; c < op[0]->type->components(); c++) { |
+ switch (op[0]->type->base_type) { |
+*************** |
+*** 955,976 **** |
+ assert(!"Should not get here."); |
+ } |
+ } |
+! } else if (strcmp(callee, "exp") == 0) { |
+ expr = new(mem_ctx) ir_expression(ir_unop_exp, type, op[0], NULL); |
+! } else if (strcmp(callee, "exp2") == 0) { |
+ expr = new(mem_ctx) ir_expression(ir_unop_exp2, type, op[0], NULL); |
+! } else if (strcmp(callee, "faceforward") == 0) { |
+ if (dot(op[2], op[1]) < 0) |
+ return op[0]; |
+ for (unsigned c = 0; c < op[0]->type->components(); c++) |
+ data.f[c] = -op[0]->value.f[c]; |
+! } else if (strcmp(callee, "floor") == 0) { |
+ expr = new(mem_ctx) ir_expression(ir_unop_floor, type, op[0], NULL); |
+! } else if (strcmp(callee, "fract") == 0) { |
+ expr = new(mem_ctx) ir_expression(ir_unop_fract, type, op[0], NULL); |
+! } else if (strcmp(callee, "fwidth") == 0) { |
+ return ir_constant::zero(mem_ctx, this->type); |
+! } else if (strcmp(callee, "greaterThan") == 0) { |
+ assert(op[0]->type->is_vector() && op[1] && op[1]->type->is_vector()); |
+ for (unsigned c = 0; c < op[0]->type->components(); c++) { |
+ switch (op[0]->type->base_type) { |
+--- 956,977 ---- |
+ assert(!"Should not get here."); |
+ } |
+ } |
+! } else if (safe_strcmp(callee, "exp") == 0) { |
+ expr = new(mem_ctx) ir_expression(ir_unop_exp, type, op[0], NULL); |
+! } else if (safe_strcmp(callee, "exp2") == 0) { |
+ expr = new(mem_ctx) ir_expression(ir_unop_exp2, type, op[0], NULL); |
+! } else if (safe_strcmp(callee, "faceforward") == 0) { |
+ if (dot(op[2], op[1]) < 0) |
+ return op[0]; |
+ for (unsigned c = 0; c < op[0]->type->components(); c++) |
+ data.f[c] = -op[0]->value.f[c]; |
+! } else if (safe_strcmp(callee, "floor") == 0) { |
+ expr = new(mem_ctx) ir_expression(ir_unop_floor, type, op[0], NULL); |
+! } else if (safe_strcmp(callee, "fract") == 0) { |
+ expr = new(mem_ctx) ir_expression(ir_unop_fract, type, op[0], NULL); |
+! } else if (safe_strcmp(callee, "fwidth") == 0) { |
+ return ir_constant::zero(mem_ctx, this->type); |
+! } else if (safe_strcmp(callee, "greaterThan") == 0) { |
+ assert(op[0]->type->is_vector() && op[1] && op[1]->type->is_vector()); |
+ for (unsigned c = 0; c < op[0]->type->components(); c++) { |
+ switch (op[0]->type->base_type) { |
+*************** |
+*** 987,993 **** |
+ assert(!"Should not get here."); |
+ } |
+ } |
+! } else if (strcmp(callee, "greaterThanEqual") == 0) { |
+ assert(op[0]->type->is_vector() && op[1] && op[1]->type->is_vector()); |
+ for (unsigned c = 0; c < op[0]->type->components(); c++) { |
+ switch (op[0]->type->base_type) { |
+--- 988,994 ---- |
+ assert(!"Should not get here."); |
+ } |
+ } |
+! } else if (safe_strcmp(callee, "greaterThanEqual") == 0) { |
+ assert(op[0]->type->is_vector() && op[1] && op[1]->type->is_vector()); |
+ for (unsigned c = 0; c < op[0]->type->components(); c++) { |
+ switch (op[0]->type->base_type) { |
+*************** |
+*** 1004,1014 **** |
+ assert(!"Should not get here."); |
+ } |
+ } |
+! } else if (strcmp(callee, "inversesqrt") == 0) { |
+ expr = new(mem_ctx) ir_expression(ir_unop_rsq, type, op[0], NULL); |
+! } else if (strcmp(callee, "length") == 0) { |
+ return new(mem_ctx) ir_constant(sqrtf(dot(op[0], op[0]))); |
+! } else if (strcmp(callee, "lessThan") == 0) { |
+ assert(op[0]->type->is_vector() && op[1] && op[1]->type->is_vector()); |
+ for (unsigned c = 0; c < op[0]->type->components(); c++) { |
+ switch (op[0]->type->base_type) { |
+--- 1005,1015 ---- |
+ assert(!"Should not get here."); |
+ } |
+ } |
+! } else if (safe_strcmp(callee, "inversesqrt") == 0) { |
+ expr = new(mem_ctx) ir_expression(ir_unop_rsq, type, op[0], NULL); |
+! } else if (safe_strcmp(callee, "length") == 0) { |
+ return new(mem_ctx) ir_constant(sqrtf(dot(op[0], op[0]))); |
+! } else if (safe_strcmp(callee, "lessThan") == 0) { |
+ assert(op[0]->type->is_vector() && op[1] && op[1]->type->is_vector()); |
+ for (unsigned c = 0; c < op[0]->type->components(); c++) { |
+ switch (op[0]->type->base_type) { |
+*************** |
+*** 1025,1031 **** |
+ assert(!"Should not get here."); |
+ } |
+ } |
+! } else if (strcmp(callee, "lessThanEqual") == 0) { |
+ assert(op[0]->type->is_vector() && op[1] && op[1]->type->is_vector()); |
+ for (unsigned c = 0; c < op[0]->type->components(); c++) { |
+ switch (op[0]->type->base_type) { |
+--- 1026,1032 ---- |
+ assert(!"Should not get here."); |
+ } |
+ } |
+! } else if (safe_strcmp(callee, "lessThanEqual") == 0) { |
+ assert(op[0]->type->is_vector() && op[1] && op[1]->type->is_vector()); |
+ for (unsigned c = 0; c < op[0]->type->components(); c++) { |
+ switch (op[0]->type->base_type) { |
+*************** |
+*** 1042,1060 **** |
+ assert(!"Should not get here."); |
+ } |
+ } |
+! } else if (strcmp(callee, "log") == 0) { |
+ expr = new(mem_ctx) ir_expression(ir_unop_log, type, op[0], NULL); |
+! } else if (strcmp(callee, "log2") == 0) { |
+ expr = new(mem_ctx) ir_expression(ir_unop_log2, type, op[0], NULL); |
+! } else if (strcmp(callee, "matrixCompMult") == 0) { |
+ assert(op[0]->type->is_float() && op[1]->type->is_float()); |
+ for (unsigned c = 0; c < op[0]->type->components(); c++) |
+ data.f[c] = op[0]->value.f[c] * op[1]->value.f[c]; |
+! } else if (strcmp(callee, "max") == 0) { |
+ expr = new(mem_ctx) ir_expression(ir_binop_max, type, op[0], op[1]); |
+! } else if (strcmp(callee, "min") == 0) { |
+ expr = new(mem_ctx) ir_expression(ir_binop_min, type, op[0], op[1]); |
+! } else if (strcmp(callee, "mix") == 0) { |
+ assert(op[0]->type->is_float() && op[1]->type->is_float()); |
+ if (op[2]->type->is_float()) { |
+ unsigned c2_inc = op[2]->type->is_scalar() ? 0 : 1; |
+--- 1043,1061 ---- |
+ assert(!"Should not get here."); |
+ } |
+ } |
+! } else if (safe_strcmp(callee, "log") == 0) { |
+ expr = new(mem_ctx) ir_expression(ir_unop_log, type, op[0], NULL); |
+! } else if (safe_strcmp(callee, "log2") == 0) { |
+ expr = new(mem_ctx) ir_expression(ir_unop_log2, type, op[0], NULL); |
+! } else if (safe_strcmp(callee, "matrixCompMult") == 0) { |
+ assert(op[0]->type->is_float() && op[1]->type->is_float()); |
+ for (unsigned c = 0; c < op[0]->type->components(); c++) |
+ data.f[c] = op[0]->value.f[c] * op[1]->value.f[c]; |
+! } else if (safe_strcmp(callee, "max") == 0) { |
+ expr = new(mem_ctx) ir_expression(ir_binop_max, type, op[0], op[1]); |
+! } else if (safe_strcmp(callee, "min") == 0) { |
+ expr = new(mem_ctx) ir_expression(ir_binop_min, type, op[0], op[1]); |
+! } else if (safe_strcmp(callee, "mix") == 0) { |
+ assert(op[0]->type->is_float() && op[1]->type->is_float()); |
+ if (op[2]->type->is_float()) { |
+ unsigned c2_inc = op[2]->type->is_scalar() ? 0 : 1; |
+*************** |
+*** 1068,1076 **** |
+ for (unsigned c = 0; c < op[0]->type->components(); c++) |
+ data.f[c] = op[op[2]->value.b[c] ? 1 : 0]->value.f[c]; |
+ } |
+! } else if (strcmp(callee, "mod") == 0) { |
+ expr = new(mem_ctx) ir_expression(ir_binop_mod, type, op[0], op[1]); |
+! } else if (strcmp(callee, "normalize") == 0) { |
+ assert(op[0]->type->is_float()); |
+ float length = sqrtf(dot(op[0], op[0])); |
+ |
+--- 1069,1077 ---- |
+ for (unsigned c = 0; c < op[0]->type->components(); c++) |
+ data.f[c] = op[op[2]->value.b[c] ? 1 : 0]->value.f[c]; |
+ } |
+! } else if (safe_strcmp(callee, "mod") == 0) { |
+ expr = new(mem_ctx) ir_expression(ir_binop_mod, type, op[0], op[1]); |
+! } else if (safe_strcmp(callee, "normalize") == 0) { |
+ assert(op[0]->type->is_float()); |
+ float length = sqrtf(dot(op[0], op[0])); |
+ |
+*************** |
+*** 1079,1087 **** |
+ |
+ for (unsigned c = 0; c < op[0]->type->components(); c++) |
+ data.f[c] = op[0]->value.f[c] / length; |
+! } else if (strcmp(callee, "not") == 0) { |
+ expr = new(mem_ctx) ir_expression(ir_unop_logic_not, type, op[0], NULL); |
+! } else if (strcmp(callee, "notEqual") == 0) { |
+ assert(op[0]->type->is_vector() && op[1] && op[1]->type->is_vector()); |
+ for (unsigned c = 0; c < op[0]->type->components(); c++) { |
+ switch (op[0]->type->base_type) { |
+--- 1080,1088 ---- |
+ |
+ for (unsigned c = 0; c < op[0]->type->components(); c++) |
+ data.f[c] = op[0]->value.f[c] / length; |
+! } else if (safe_strcmp(callee, "not") == 0) { |
+ expr = new(mem_ctx) ir_expression(ir_unop_logic_not, type, op[0], NULL); |
+! } else if (safe_strcmp(callee, "notEqual") == 0) { |
+ assert(op[0]->type->is_vector() && op[1] && op[1]->type->is_vector()); |
+ for (unsigned c = 0; c < op[0]->type->components(); c++) { |
+ switch (op[0]->type->base_type) { |
+*************** |
+*** 1101,1107 **** |
+ assert(!"Should not get here."); |
+ } |
+ } |
+! } else if (strcmp(callee, "outerProduct") == 0) { |
+ assert(op[0]->type->is_vector() && op[1]->type->is_vector()); |
+ const unsigned m = op[0]->type->vector_elements; |
+ const unsigned n = op[1]->type->vector_elements; |
+--- 1102,1108 ---- |
+ assert(!"Should not get here."); |
+ } |
+ } |
+! } else if (safe_strcmp(callee, "outerProduct") == 0) { |
+ assert(op[0]->type->is_vector() && op[1]->type->is_vector()); |
+ const unsigned m = op[0]->type->vector_elements; |
+ const unsigned n = op[1]->type->vector_elements; |
+*************** |
+*** 1110,1127 **** |
+ data.f[i+m*j] = op[0]->value.f[i] * op[1]->value.f[j]; |
+ } |
+ } |
+! } else if (strcmp(callee, "pow") == 0) { |
+ expr = new(mem_ctx) ir_expression(ir_binop_pow, type, op[0], op[1]); |
+! } else if (strcmp(callee, "radians") == 0) { |
+ assert(op[0]->type->is_float()); |
+ for (unsigned c = 0; c < op[0]->type->components(); c++) |
+ data.f[c] = M_PI/180.0 * op[0]->value.f[c]; |
+! } else if (strcmp(callee, "reflect") == 0) { |
+ assert(op[0]->type->is_float()); |
+ float dot_NI = dot(op[1], op[0]); |
+ for (unsigned c = 0; c < op[0]->type->components(); c++) |
+ data.f[c] = op[0]->value.f[c] - 2 * dot_NI * op[1]->value.f[c]; |
+! } else if (strcmp(callee, "refract") == 0) { |
+ const float eta = op[2]->value.f[0]; |
+ const float dot_NI = dot(op[1], op[0]); |
+ const float k = 1.0 - eta * eta * (1.0 - dot_NI * dot_NI); |
+--- 1111,1128 ---- |
+ data.f[i+m*j] = op[0]->value.f[i] * op[1]->value.f[j]; |
+ } |
+ } |
+! } else if (safe_strcmp(callee, "pow") == 0) { |
+ expr = new(mem_ctx) ir_expression(ir_binop_pow, type, op[0], op[1]); |
+! } else if (safe_strcmp(callee, "radians") == 0) { |
+ assert(op[0]->type->is_float()); |
+ for (unsigned c = 0; c < op[0]->type->components(); c++) |
+ data.f[c] = M_PI/180.0 * op[0]->value.f[c]; |
+! } else if (safe_strcmp(callee, "reflect") == 0) { |
+ assert(op[0]->type->is_float()); |
+ float dot_NI = dot(op[1], op[0]); |
+ for (unsigned c = 0; c < op[0]->type->components(); c++) |
+ data.f[c] = op[0]->value.f[c] - 2 * dot_NI * op[1]->value.f[c]; |
+! } else if (safe_strcmp(callee, "refract") == 0) { |
+ const float eta = op[2]->value.f[0]; |
+ const float dot_NI = dot(op[1], op[0]); |
+ const float k = 1.0 - eta * eta * (1.0 - dot_NI * dot_NI); |
+*************** |
+*** 1133,1147 **** |
+ * op[1]->value.f[c]; |
+ } |
+ } |
+! } else if (strcmp(callee, "sign") == 0) { |
+ expr = new(mem_ctx) ir_expression(ir_unop_sign, type, op[0], NULL); |
+! } else if (strcmp(callee, "sin") == 0) { |
+ expr = new(mem_ctx) ir_expression(ir_unop_sin, type, op[0], NULL); |
+! } else if (strcmp(callee, "sinh") == 0) { |
+ assert(op[0]->type->is_float()); |
+ for (unsigned c = 0; c < op[0]->type->components(); c++) |
+ data.f[c] = sinhf(op[0]->value.f[c]); |
+! } else if (strcmp(callee, "smoothstep") == 0) { |
+ assert(num_parameters == 3); |
+ assert(op[1]->type == op[0]->type); |
+ unsigned edge_inc = op[0]->type->is_scalar() ? 0 : 1; |
+--- 1134,1148 ---- |
+ * op[1]->value.f[c]; |
+ } |
+ } |
+! } else if (safe_strcmp(callee, "sign") == 0) { |
+ expr = new(mem_ctx) ir_expression(ir_unop_sign, type, op[0], NULL); |
+! } else if (safe_strcmp(callee, "sin") == 0) { |
+ expr = new(mem_ctx) ir_expression(ir_unop_sin, type, op[0], NULL); |
+! } else if (safe_strcmp(callee, "sinh") == 0) { |
+ assert(op[0]->type->is_float()); |
+ for (unsigned c = 0; c < op[0]->type->components(); c++) |
+ data.f[c] = sinhf(op[0]->value.f[c]); |
+! } else if (safe_strcmp(callee, "smoothstep") == 0) { |
+ assert(num_parameters == 3); |
+ assert(op[1]->type == op[0]->type); |
+ unsigned edge_inc = op[0]->type->is_scalar() ? 0 : 1; |
+*************** |
+*** 1157,1179 **** |
+ data.f[c] = t * t * (3 - 2 * t); |
+ } |
+ } |
+! } else if (strcmp(callee, "sqrt") == 0) { |
+ expr = new(mem_ctx) ir_expression(ir_unop_sqrt, type, op[0], NULL); |
+! } else if (strcmp(callee, "step") == 0) { |
+ assert(op[0]->type->is_float() && op[1]->type->is_float()); |
+ /* op[0] (edge) may be either a scalar or a vector */ |
+ const unsigned c0_inc = op[0]->type->is_scalar() ? 0 : 1; |
+ for (unsigned c = 0, c0 = 0; c < type->components(); c0 += c0_inc, c++) |
+ data.f[c] = (op[1]->value.f[c] < op[0]->value.f[c0]) ? 0.0 : 1.0; |
+! } else if (strcmp(callee, "tan") == 0) { |
+ assert(op[0]->type->is_float()); |
+ for (unsigned c = 0; c < op[0]->type->components(); c++) |
+ data.f[c] = tanf(op[0]->value.f[c]); |
+! } else if (strcmp(callee, "tanh") == 0) { |
+ assert(op[0]->type->is_float()); |
+ for (unsigned c = 0; c < op[0]->type->components(); c++) |
+ data.f[c] = tanhf(op[0]->value.f[c]); |
+! } else if (strcmp(callee, "transpose") == 0) { |
+ assert(op[0]->type->is_matrix()); |
+ const unsigned n = op[0]->type->vector_elements; |
+ const unsigned m = op[0]->type->matrix_columns; |
+--- 1158,1180 ---- |
+ data.f[c] = t * t * (3 - 2 * t); |
+ } |
+ } |
+! } else if (safe_strcmp(callee, "sqrt") == 0) { |
+ expr = new(mem_ctx) ir_expression(ir_unop_sqrt, type, op[0], NULL); |
+! } else if (safe_strcmp(callee, "step") == 0) { |
+ assert(op[0]->type->is_float() && op[1]->type->is_float()); |
+ /* op[0] (edge) may be either a scalar or a vector */ |
+ const unsigned c0_inc = op[0]->type->is_scalar() ? 0 : 1; |
+ for (unsigned c = 0, c0 = 0; c < type->components(); c0 += c0_inc, c++) |
+ data.f[c] = (op[1]->value.f[c] < op[0]->value.f[c0]) ? 0.0 : 1.0; |
+! } else if (safe_strcmp(callee, "tan") == 0) { |
+ assert(op[0]->type->is_float()); |
+ for (unsigned c = 0; c < op[0]->type->components(); c++) |
+ data.f[c] = tanf(op[0]->value.f[c]); |
+! } else if (safe_strcmp(callee, "tanh") == 0) { |
+ assert(op[0]->type->is_float()); |
+ for (unsigned c = 0; c < op[0]->type->components(); c++) |
+ data.f[c] = tanhf(op[0]->value.f[c]); |
+! } else if (safe_strcmp(callee, "transpose") == 0) { |
+ assert(op[0]->type->is_matrix()); |
+ const unsigned n = op[0]->type->vector_elements; |
+ const unsigned m = op[0]->type->matrix_columns; |
+diff -c -r Mesa-7.9/src/glsl/ir_dead_functions.cpp MesaLib/src/glsl/ir_dead_functions.cpp |
+*** Mesa-7.9/src/glsl/ir_dead_functions.cpp Fri Oct 1 15:51:28 2010 |
+--- MesaLib/src/glsl/ir_dead_functions.cpp Fri Oct 22 15:34:54 2010 |
+*************** |
+*** 31,36 **** |
+--- 31,37 ---- |
+ #include "ir_visitor.h" |
+ #include "ir_expression_flattening.h" |
+ #include "glsl_types.h" |
++ #include "safe_strcmp.h" |
+ |
+ class signature_entry : public exec_node |
+ { |
+*************** |
+*** 90,96 **** |
+ { |
+ signature_entry *entry = this->get_signature_entry(ir); |
+ |
+! if (strcmp(ir->function_name(), "main") == 0) { |
+ entry->used = true; |
+ } |
+ |
+--- 91,97 ---- |
+ { |
+ signature_entry *entry = this->get_signature_entry(ir); |
+ |
+! if (safe_strcmp(ir->function_name(), "main") == 0) { |
+ entry->used = true; |
+ } |
+ |
+diff -c -r Mesa-7.9/src/glsl/ir_function_inlining.cpp MesaLib/src/glsl/ir_function_inlining.cpp |
+*** Mesa-7.9/src/glsl/ir_function_inlining.cpp Fri Oct 1 15:51:28 2010 |
+--- MesaLib/src/glsl/ir_function_inlining.cpp Fri Oct 22 15:35:58 2010 |
+*************** |
+*** 27,33 **** |
+ * Replaces calls to functions with the body of the function. |
+ */ |
+ |
+! #include <inttypes.h> |
+ #include "ir.h" |
+ #include "ir_visitor.h" |
+ #include "ir_function_inlining.h" |
+--- 27,34 ---- |
+ * Replaces calls to functions with the body of the function. |
+ */ |
+ |
+! /* The use of inttypes.h seems to be unnecessary and causes problems on Windows. */ |
+! /* #include <inttypes.h> */ |
+ #include "ir.h" |
+ #include "ir_visitor.h" |
+ #include "ir_function_inlining.h" |
+diff -c -r Mesa-7.9/src/glsl/ir_lower_jumps.cpp MesaLib/src/glsl/ir_lower_jumps.cpp |
+*** Mesa-7.9/src/glsl/ir_lower_jumps.cpp Fri Oct 1 15:51:28 2010 |
+--- MesaLib/src/glsl/ir_lower_jumps.cpp Fri Oct 22 15:36:16 2010 |
+*************** |
+*** 28,33 **** |
+--- 28,34 ---- |
+ #include "glsl_types.h" |
+ #include <string.h> |
+ #include "ir.h" |
++ #include "safe_strcmp.h" |
+ |
+ enum jump_strength |
+ { |
+*************** |
+*** 125,131 **** |
+ this->return_flag = 0; |
+ this->return_value = 0; |
+ this->nesting_depth = 0; |
+! this->is_main = this->signature && (strcmp(this->signature->function_name(), "main") == 0); |
+ } |
+ |
+ ir_variable* get_return_flag() |
+--- 126,132 ---- |
+ this->return_flag = 0; |
+ this->return_value = 0; |
+ this->nesting_depth = 0; |
+! this->is_main = this->signature && (safe_strcmp(this->signature->function_name(), "main") == 0); |
+ } |
+ |
+ ir_variable* get_return_flag() |
+diff -c -r Mesa-7.9/src/glsl/ir_reader.cpp MesaLib/src/glsl/ir_reader.cpp |
+*** Mesa-7.9/src/glsl/ir_reader.cpp Fri Oct 1 15:51:28 2010 |
+--- MesaLib/src/glsl/ir_reader.cpp Fri Oct 22 15:36:27 2010 |
+*************** |
+*** 31,36 **** |
+--- 31,37 ---- |
+ #include "glsl_parser_extras.h" |
+ #include "glsl_types.h" |
+ #include "s_expression.h" |
++ #include "safe_strcmp.h" |
+ |
+ const static bool debug = false; |
+ |
+*************** |
+*** 128,134 **** |
+ ir_read_error(st, expr, "expected type (array ...) or (struct ...)"); |
+ return NULL; |
+ } |
+! if (strcmp(type_sym->value(), "array") == 0) { |
+ if (list->length() != 3) { |
+ ir_read_error(st, expr, "expected type (array <type> <int>)"); |
+ return NULL; |
+--- 129,135 ---- |
+ ir_read_error(st, expr, "expected type (array ...) or (struct ...)"); |
+ return NULL; |
+ } |
+! if (safe_strcmp(type_sym->value(), "array") == 0) { |
+ if (list->length() != 3) { |
+ ir_read_error(st, expr, "expected type (array <type> <int>)"); |
+ return NULL; |
+*************** |
+*** 150,156 **** |
+ } |
+ |
+ return glsl_type::get_array_instance(base_type, size->value()); |
+! } else if (strcmp(type_sym->value(), "struct") == 0) { |
+ assert(false); // FINISHME |
+ } else { |
+ ir_read_error(st, expr, "expected (array ...) or (struct ...); " |
+--- 151,157 ---- |
+ } |
+ |
+ return glsl_type::get_array_instance(base_type, size->value()); |
+! } else if (safe_strcmp(type_sym->value(), "struct") == 0) { |
+ assert(false); // FINISHME |
+ } else { |
+ ir_read_error(st, expr, "expected (array ...) or (struct ...); " |
+*************** |
+*** 189,195 **** |
+ continue; // not a (function ...); ignore it. |
+ |
+ s_symbol *tag = SX_AS_SYMBOL(sub->subexpressions.get_head()); |
+! if (tag == NULL || strcmp(tag->value(), "function") != 0) |
+ continue; // not a (function ...); ignore it. |
+ |
+ ir_function *f = read_function(st, sub, true); |
+--- 190,196 ---- |
+ continue; // not a (function ...); ignore it. |
+ |
+ s_symbol *tag = SX_AS_SYMBOL(sub->subexpressions.get_head()); |
+! if (tag == NULL || safe_strcmp(tag->value(), "function") != 0) |
+ continue; // not a (function ...); ignore it. |
+ |
+ ir_function *f = read_function(st, sub, true); |
+*************** |
+*** 233,239 **** |
+ } |
+ |
+ s_symbol *tag = SX_AS_SYMBOL(siglist->subexpressions.get_head()); |
+! if (tag == NULL || strcmp(tag->value(), "signature") != 0) { |
+ ir_read_error(st, siglist, "Expected (signature ...)"); |
+ return NULL; |
+ } |
+--- 234,240 ---- |
+ } |
+ |
+ s_symbol *tag = SX_AS_SYMBOL(siglist->subexpressions.get_head()); |
+! if (tag == NULL || safe_strcmp(tag->value(), "signature") != 0) { |
+ ir_read_error(st, siglist, "Expected (signature ...)"); |
+ return NULL; |
+ } |
+*************** |
+*** 267,273 **** |
+ return; |
+ } |
+ s_symbol *paramtag = SX_AS_SYMBOL(paramlist->subexpressions.get_head()); |
+! if (paramtag == NULL || strcmp(paramtag->value(), "parameters") != 0) { |
+ ir_read_error(st, paramlist, "Expected (parameters ...)"); |
+ return; |
+ } |
+--- 268,274 ---- |
+ return; |
+ } |
+ s_symbol *paramtag = SX_AS_SYMBOL(paramlist->subexpressions.get_head()); |
+! if (paramtag == NULL || safe_strcmp(paramtag->value(), "parameters") != 0) { |
+ ir_read_error(st, paramlist, "Expected (parameters ...)"); |
+ return; |
+ } |
+*************** |
+*** 364,372 **** |
+ void *ctx = st; |
+ s_symbol *symbol = SX_AS_SYMBOL(expr); |
+ if (symbol != NULL) { |
+! if (strcmp(symbol->value(), "break") == 0 && loop_ctx != NULL) |
+ return new(ctx) ir_loop_jump(ir_loop_jump::jump_break); |
+! if (strcmp(symbol->value(), "continue") == 0 && loop_ctx != NULL) |
+ return new(ctx) ir_loop_jump(ir_loop_jump::jump_continue); |
+ } |
+ |
+--- 365,373 ---- |
+ void *ctx = st; |
+ s_symbol *symbol = SX_AS_SYMBOL(expr); |
+ if (symbol != NULL) { |
+! if (safe_strcmp(symbol->value(), "break") == 0 && loop_ctx != NULL) |
+ return new(ctx) ir_loop_jump(ir_loop_jump::jump_break); |
+! if (safe_strcmp(symbol->value(), "continue") == 0 && loop_ctx != NULL) |
+ return new(ctx) ir_loop_jump(ir_loop_jump::jump_continue); |
+ } |
+ |
+*************** |
+*** 383,399 **** |
+ } |
+ |
+ ir_instruction *inst = NULL; |
+! if (strcmp(tag->value(), "declare") == 0) { |
+ inst = read_declaration(st, list); |
+! } else if (strcmp(tag->value(), "assign") == 0) { |
+ inst = read_assignment(st, list); |
+! } else if (strcmp(tag->value(), "if") == 0) { |
+ inst = read_if(st, list, loop_ctx); |
+! } else if (strcmp(tag->value(), "loop") == 0) { |
+ inst = read_loop(st, list); |
+! } else if (strcmp(tag->value(), "return") == 0) { |
+ inst = read_return(st, list); |
+! } else if (strcmp(tag->value(), "function") == 0) { |
+ inst = read_function(st, list, false); |
+ } else { |
+ inst = read_rvalue(st, list); |
+--- 384,400 ---- |
+ } |
+ |
+ ir_instruction *inst = NULL; |
+! if (safe_strcmp(tag->value(), "declare") == 0) { |
+ inst = read_declaration(st, list); |
+! } else if (safe_strcmp(tag->value(), "assign") == 0) { |
+ inst = read_assignment(st, list); |
+! } else if (safe_strcmp(tag->value(), "if") == 0) { |
+ inst = read_if(st, list, loop_ctx); |
+! } else if (safe_strcmp(tag->value(), "loop") == 0) { |
+ inst = read_loop(st, list); |
+! } else if (safe_strcmp(tag->value(), "return") == 0) { |
+ inst = read_return(st, list); |
+! } else if (safe_strcmp(tag->value(), "function") == 0) { |
+ inst = read_function(st, list, false); |
+ } else { |
+ inst = read_rvalue(st, list); |
+*************** |
+*** 443,467 **** |
+ } |
+ |
+ // FINISHME: Check for duplicate/conflicting qualifiers. |
+! if (strcmp(qualifier->value(), "centroid") == 0) { |
+ var->centroid = 1; |
+! } else if (strcmp(qualifier->value(), "invariant") == 0) { |
+ var->invariant = 1; |
+! } else if (strcmp(qualifier->value(), "uniform") == 0) { |
+ var->mode = ir_var_uniform; |
+! } else if (strcmp(qualifier->value(), "auto") == 0) { |
+ var->mode = ir_var_auto; |
+! } else if (strcmp(qualifier->value(), "in") == 0) { |
+ var->mode = ir_var_in; |
+! } else if (strcmp(qualifier->value(), "out") == 0) { |
+ var->mode = ir_var_out; |
+! } else if (strcmp(qualifier->value(), "inout") == 0) { |
+ var->mode = ir_var_inout; |
+! } else if (strcmp(qualifier->value(), "smooth") == 0) { |
+ var->interpolation = ir_var_smooth; |
+! } else if (strcmp(qualifier->value(), "flat") == 0) { |
+ var->interpolation = ir_var_flat; |
+! } else if (strcmp(qualifier->value(), "noperspective") == 0) { |
+ var->interpolation = ir_var_noperspective; |
+ } else { |
+ ir_read_error(st, list, "unknown qualifier: %s", qualifier->value()); |
+--- 444,468 ---- |
+ } |
+ |
+ // FINISHME: Check for duplicate/conflicting qualifiers. |
+! if (safe_strcmp(qualifier->value(), "centroid") == 0) { |
+ var->centroid = 1; |
+! } else if (safe_strcmp(qualifier->value(), "invariant") == 0) { |
+ var->invariant = 1; |
+! } else if (safe_strcmp(qualifier->value(), "uniform") == 0) { |
+ var->mode = ir_var_uniform; |
+! } else if (safe_strcmp(qualifier->value(), "auto") == 0) { |
+ var->mode = ir_var_auto; |
+! } else if (safe_strcmp(qualifier->value(), "in") == 0) { |
+ var->mode = ir_var_in; |
+! } else if (safe_strcmp(qualifier->value(), "out") == 0) { |
+ var->mode = ir_var_out; |
+! } else if (safe_strcmp(qualifier->value(), "inout") == 0) { |
+ var->mode = ir_var_inout; |
+! } else if (safe_strcmp(qualifier->value(), "smooth") == 0) { |
+ var->interpolation = ir_var_smooth; |
+! } else if (safe_strcmp(qualifier->value(), "flat") == 0) { |
+ var->interpolation = ir_var_flat; |
+! } else if (safe_strcmp(qualifier->value(), "noperspective") == 0) { |
+ var->interpolation = ir_var_noperspective; |
+ } else { |
+ ir_read_error(st, list, "unknown qualifier: %s", qualifier->value()); |
+*************** |
+*** 574,586 **** |
+ ir_rvalue *rvalue = read_dereference(st, list); |
+ if (rvalue != NULL || st->error) |
+ return rvalue; |
+! else if (strcmp(tag->value(), "swiz") == 0) { |
+ rvalue = read_swizzle(st, list); |
+! } else if (strcmp(tag->value(), "expression") == 0) { |
+ rvalue = read_expression(st, list); |
+! } else if (strcmp(tag->value(), "call") == 0) { |
+ rvalue = read_call(st, list); |
+! } else if (strcmp(tag->value(), "constant") == 0) { |
+ rvalue = read_constant(st, list); |
+ } else { |
+ rvalue = read_texture(st, list); |
+--- 575,587 ---- |
+ ir_rvalue *rvalue = read_dereference(st, list); |
+ if (rvalue != NULL || st->error) |
+ return rvalue; |
+! else if (safe_strcmp(tag->value(), "swiz") == 0) { |
+ rvalue = read_swizzle(st, list); |
+! } else if (safe_strcmp(tag->value(), "expression") == 0) { |
+ rvalue = read_expression(st, list); |
+! } else if (safe_strcmp(tag->value(), "call") == 0) { |
+ rvalue = read_call(st, list); |
+! } else if (safe_strcmp(tag->value(), "constant") == 0) { |
+ rvalue = read_constant(st, list); |
+ } else { |
+ rvalue = read_texture(st, list); |
+*************** |
+*** 921,931 **** |
+ s_symbol *tag = SX_AS_SYMBOL(list->subexpressions.head); |
+ assert(tag != NULL); |
+ |
+! if (strcmp(tag->value(), "var_ref") == 0) |
+ return read_var_ref(st, list); |
+! if (strcmp(tag->value(), "array_ref") == 0) |
+ return read_array_ref(st, list); |
+! if (strcmp(tag->value(), "record_ref") == 0) |
+ return read_record_ref(st, list); |
+ return NULL; |
+ } |
+--- 922,932 ---- |
+ s_symbol *tag = SX_AS_SYMBOL(list->subexpressions.head); |
+ assert(tag != NULL); |
+ |
+! if (safe_strcmp(tag->value(), "var_ref") == 0) |
+ return read_var_ref(st, list); |
+! if (safe_strcmp(tag->value(), "array_ref") == 0) |
+ return read_array_ref(st, list); |
+! if (safe_strcmp(tag->value(), "record_ref") == 0) |
+ return read_record_ref(st, list); |
+ return NULL; |
+ } |
+diff -c -r Mesa-7.9/src/glsl/ir_structure_splitting.cpp MesaLib/src/glsl/ir_structure_splitting.cpp |
+*** Mesa-7.9/src/glsl/ir_structure_splitting.cpp Fri Oct 1 15:51:28 2010 |
+--- MesaLib/src/glsl/ir_structure_splitting.cpp Fri Oct 22 15:36:52 2010 |
+*************** |
+*** 37,42 **** |
+--- 37,43 ---- |
+ #include "ir_print_visitor.h" |
+ #include "ir_rvalue_visitor.h" |
+ #include "glsl_types.h" |
++ #include "safe_strcmp.h" |
+ |
+ static bool debug = false; |
+ |
+*************** |
+*** 228,235 **** |
+ |
+ unsigned int i; |
+ for (i = 0; i < entry->var->type->length; i++) { |
+! if (strcmp(deref_record->field, |
+! entry->var->type->fields.structure[i].name) == 0) |
+ break; |
+ } |
+ assert(i != entry->var->type->length); |
+--- 229,236 ---- |
+ |
+ unsigned int i; |
+ for (i = 0; i < entry->var->type->length; i++) { |
+! if (safe_strcmp(deref_record->field, |
+! entry->var->type->fields.structure[i].name) == 0) |
+ break; |
+ } |
+ assert(i != entry->var->type->length); |
+diff -c -r Mesa-7.9/src/glsl/ir_validate.cpp MesaLib/src/glsl/ir_validate.cpp |
+*** Mesa-7.9/src/glsl/ir_validate.cpp Mon Oct 4 18:58:00 2010 |
+--- MesaLib/src/glsl/ir_validate.cpp Fri Oct 22 15:37:24 2010 |
+*************** |
+*** 33,39 **** |
+ * a dereference chain. |
+ */ |
+ |
+! #include <inttypes.h> |
+ #include "ir.h" |
+ #include "ir_hierarchical_visitor.h" |
+ #include "program/hash_table.h" |
+--- 33,40 ---- |
+ * a dereference chain. |
+ */ |
+ |
+! /* The use of inttypes.h seems to be unnecessary and causes problems on Windows. */ |
+! /* #include <inttypes.h> */ |
+ #include "ir.h" |
+ #include "ir_hierarchical_visitor.h" |
+ #include "program/hash_table.h" |
+diff -c -r Mesa-7.9/src/glsl/linker.cpp MesaLib/src/glsl/linker.cpp |
+*** Mesa-7.9/src/glsl/linker.cpp Fri Oct 1 15:51:28 2010 |
+--- MesaLib/src/glsl/linker.cpp Fri Oct 22 15:38:08 2010 |
+*************** |
+*** 79,84 **** |
+--- 79,85 ---- |
+ #include "program/hash_table.h" |
+ #include "linker.h" |
+ #include "ir_optimization.h" |
++ #include "safe_strcmp.h" |
+ |
+ /** |
+ * Visitor that determines whether or not a variable is ever written. |
+*************** |
+*** 95,101 **** |
+ { |
+ ir_variable *const var = ir->lhs->variable_referenced(); |
+ |
+! if (strcmp(name, var->name) == 0) { |
+ found = true; |
+ return visit_stop; |
+ } |
+--- 96,102 ---- |
+ { |
+ ir_variable *const var = ir->lhs->variable_referenced(); |
+ |
+! if (safe_strcmp(name, var->name) == 0) { |
+ found = true; |
+ return visit_stop; |
+ } |
+*************** |
+*** 113,119 **** |
+ if (sig_param->mode == ir_var_out || |
+ sig_param->mode == ir_var_inout) { |
+ ir_variable *var = param_rval->variable_referenced(); |
+! if (var && strcmp(name, var->name) == 0) { |
+ found = true; |
+ return visit_stop; |
+ } |
+--- 114,120 ---- |
+ if (sig_param->mode == ir_var_out || |
+ sig_param->mode == ir_var_inout) { |
+ ir_variable *var = param_rval->variable_referenced(); |
+! if (var && safe_strcmp(name, var->name) == 0) { |
+ found = true; |
+ return visit_stop; |
+ } |
+*************** |
+*** 148,154 **** |
+ |
+ virtual ir_visitor_status visit(ir_dereference_variable *ir) |
+ { |
+! if (strcmp(this->name, ir->var->name) == 0) { |
+ this->found = true; |
+ return visit_stop; |
+ } |
+--- 149,155 ---- |
+ |
+ virtual ir_visitor_status visit(ir_dereference_variable *ir) |
+ { |
+! if (safe_strcmp(this->name, ir->var->name) == 0) { |
+ this->found = true; |
+ return visit_stop; |
+ } |
+*************** |
+*** 876,882 **** |
+ if (!other_var) |
+ continue; |
+ |
+! if (strcmp(var->name, other_var->name) == 0 && |
+ other_var->max_array_access > size) { |
+ size = other_var->max_array_access; |
+ } |
+--- 877,883 ---- |
+ if (!other_var) |
+ continue; |
+ |
+! if (safe_strcmp(var->name, other_var->name) == 0 && |
+ other_var->max_array_access > size) { |
+ size = other_var->max_array_access; |
+ } |
+Only in MesaLib/src/glsl: safe_strcmp.c |
+Only in MesaLib/src/glsl: safe_strcmp.h |
+diff -c -r Mesa-7.9/src/mapi/glapi/glapi_nop.c MesaLib/src/mapi/glapi/glapi_nop.c |
+*** Mesa-7.9/src/mapi/glapi/glapi_nop.c Fri Oct 1 15:51:28 2010 |
+--- MesaLib/src/mapi/glapi/glapi_nop.c Fri Oct 22 15:41:35 2010 |
+*************** |
+*** 107,113 **** |
+ return 0; |
+ } |
+ |
+! #define TABLE_ENTRY(name) (_glapi_proc) NoOpGeneric |
+ |
+ #endif |
+ |
+--- 107,138 ---- |
+ return 0; |
+ } |
+ |
+! /** |
+! * This is called if the user somehow calls an unassigned GL dispatch function. |
+! */ |
+! static GLint |
+! NoOpUnused(void) |
+! { |
+! return NoOpGeneric(); |
+! } |
+! |
+! /* |
+! * It is necessary to generate custom no-op entry points at least on |
+! * Windows, where the __stdcall calling convention is used (callee |
+! * cleans the stack). This calling convention can not tolerate a |
+! * mismatch between the numbers of arguments in caller and callee. |
+! */ |
+! #define KEYWORD1 static |
+! #define KEYWORD1_ALT static |
+! #define KEYWORD2 GLAPIENTRY |
+! #define NAME(func) NoOp##func |
+! #define DISPATCH(func, args, msg) NoOpGeneric(); |
+! #define RETURN_DISPATCH(func, args, msg) return NoOpGeneric(); |
+! |
+! /* |
+! * Defines for the table of no-op entry points. |
+! */ |
+! #define TABLE_ENTRY(name) (_glapi_proc) NoOp##name |
+ |
+ #endif |
+ |
+diff -c -r Mesa-7.9/src/mesa/main/compiler.h MesaLib/src/mesa/main/compiler.h |
+*** Mesa-7.9/src/mesa/main/compiler.h Fri Oct 1 15:51:28 2010 |
+--- MesaLib/src/mesa/main/compiler.h Fri Oct 22 15:44:23 2010 |
+*************** |
+*** 175,181 **** |
+--- 175,183 ---- |
+ # define PUBLIC __attribute__((visibility("default"))) |
+ # define USED __attribute__((used)) |
+ #else |
++ # ifndef PUBLIC |
+ # define PUBLIC |
++ # endif |
+ # define USED |
+ #endif |
+ |
+diff -c -r Mesa-7.9/src/mesa/main/querymatrix.c MesaLib/src/mesa/main/querymatrix.c |
+*** Mesa-7.9/src/mesa/main/querymatrix.c Mon Oct 4 18:58:00 2010 |
+--- MesaLib/src/mesa/main/querymatrix.c Wed Oct 6 16:36:08 2010 |
+*************** |
+*** 73,79 **** |
+ #elif defined(__APPLE__) || defined(__CYGWIN__) || defined(__FreeBSD__) || \ |
+ defined(__OpenBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || \ |
+ (defined(__sun) && defined(__C99FEATURES__)) || defined(__MINGW32__) || \ |
+! (defined(__sun) && defined(__GNUC__)) |
+ |
+ /* fpclassify is available. */ |
+ |
+--- 73,80 ---- |
+ #elif defined(__APPLE__) || defined(__CYGWIN__) || defined(__FreeBSD__) || \ |
+ defined(__OpenBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || \ |
+ (defined(__sun) && defined(__C99FEATURES__)) || defined(__MINGW32__) || \ |
+! (defined(__sun) && defined(__GNUC__)) || \ |
+! (defined(__linux) && defined(__GNUC__)) |
+ |
+ /* fpclassify is available. */ |
+ |