diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2009-10-19 14:10:05 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2009-10-19 14:10:05 +0400 |
commit | e2fa58f7f3cceb89fd248d5361d875224e62de38 (patch) | |
tree | 93e12f3b08ff272b48addd54d207e75a4f47b2c0 | |
parent | 2c985dee976eb5b3ee6729312f046a344cb9947c (diff) |
Fix #19669 and other: triple buffer & icon texture drawing could cause
a system crash and other issues on ATI/Apple, due to a buggy driver
(similar issues reported for other OpenGL applications). For now, work
around it by not using non-power-of-two textures on this combination.
-rw-r--r-- | source/blender/editors/interface/interface_icons.c | 2 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/drawobject.c | 2 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/drawvolume.c | 2 | ||||
-rw-r--r-- | source/blender/gpu/GPU_extensions.h | 3 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_extensions.c | 30 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_draw.c | 2 | ||||
-rw-r--r-- | source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp | 2 | ||||
-rw-r--r-- | source/gameengine/GamePlayer/ghost/GPG_Application.cpp | 2 |
8 files changed, 29 insertions, 16 deletions
diff --git a/source/blender/editors/interface/interface_icons.c b/source/blender/editors/interface/interface_icons.c index 1153c475339..7648c9412b7 100644 --- a/source/blender/editors/interface/interface_icons.c +++ b/source/blender/editors/interface/interface_icons.c @@ -489,7 +489,7 @@ static void init_internal_icons() } /* we only use a texture for cards with non-power of two */ - if(GLEW_ARB_texture_non_power_of_two) { + if(GPU_non_power_of_two_support()) { glGenTextures(1, &icongltex.id); if(icongltex.id) { diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c index d2988772abe..0688f9b5e0e 100644 --- a/source/blender/editors/space_view3d/drawobject.c +++ b/source/blender/editors/space_view3d/drawobject.c @@ -212,7 +212,7 @@ static void view3d_project_short_noclip(ARegion *ar, float *vec, short *adr) int draw_glsl_material(Scene *scene, Object *ob, View3D *v3d, int dt) { - if(!GPU_extensions_minimum_support()) + if(!GPU_glsl_support()) return 0; if(G.f & G_PICKSEL) return 0; diff --git a/source/blender/editors/space_view3d/drawvolume.c b/source/blender/editors/space_view3d/drawvolume.c index ef3627e2b12..ea022d1b670 100644 --- a/source/blender/editors/space_view3d/drawvolume.c +++ b/source/blender/editors/space_view3d/drawvolume.c @@ -349,7 +349,7 @@ void draw_volume(Scene *scene, ARegion *ar, View3D *v3d, Base *base, GPUTexture else printf("No volume shadow\n"); - if (!GLEW_ARB_texture_non_power_of_two) { + if (!GPU_non_power_of_two_support()) { cor[0] = (float)res[0]/(float)larger_pow2(res[0]); cor[1] = (float)res[1]/(float)larger_pow2(res[1]); cor[2] = (float)res[2]/(float)larger_pow2(res[2]); diff --git a/source/blender/gpu/GPU_extensions.h b/source/blender/gpu/GPU_extensions.h index e00cab79ce0..a910ff9c3e7 100644 --- a/source/blender/gpu/GPU_extensions.h +++ b/source/blender/gpu/GPU_extensions.h @@ -54,7 +54,8 @@ typedef struct GPUShader GPUShader; void GPU_extensions_disable(void); void GPU_extensions_init(void); /* call this before running any of the functions below */ void GPU_extensions_exit(void); -int GPU_extensions_minimum_support(void); +int GPU_glsl_support(void); +int GPU_non_power_of_two_support(void); int GPU_print_error(char *str); /* GPU Texture diff --git a/source/blender/gpu/intern/gpu_extensions.c b/source/blender/gpu/intern/gpu_extensions.c index 55e4b337a77..52a6b0dd1e8 100644 --- a/source/blender/gpu/intern/gpu_extensions.c +++ b/source/blender/gpu/intern/gpu_extensions.c @@ -69,7 +69,7 @@ static struct GPUGlobal { GLint maxtextures; GLuint currentfb; - int minimumsupport; + int glslsupport; int extdisabled; } GG = {1, 0, 0, 0}; @@ -87,15 +87,27 @@ void GPU_extensions_init() if (GLEW_ARB_multitexture) glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS_ARB, &GG.maxtextures); - GG.minimumsupport = 1; - if (!GLEW_ARB_multitexture) GG.minimumsupport = 0; - if (!GLEW_ARB_vertex_shader) GG.minimumsupport = 0; - if (!GLEW_ARB_fragment_shader) GG.minimumsupport = 0; + GG.glslsupport = 1; + if (!GLEW_ARB_multitexture) GG.glslsupport = 0; + if (!GLEW_ARB_vertex_shader) GG.glslsupport = 0; + if (!GLEW_ARB_fragment_shader) GG.glslsupport = 0; } -int GPU_extensions_minimum_support() +int GPU_glsl_support() { - return !GG.extdisabled && GG.minimumsupport; + return !GG.extdisabled && GG.glslsupport; +} + +int GPU_non_power_of_two_support() +{ + /* Exception for buggy ATI/Apple driver in Mac OS X 10.5/10.6, + * they claim to support this but can cause system freeze */ +#ifdef __APPLE__ + if(strcmp(glGetString(GL_VENDOR), "ATI Technologies Inc.") == 0) + return 0; +#endif + + return GLEW_ARB_texture_non_power_of_two; } int GPU_print_error(char *str) @@ -231,7 +243,7 @@ static GPUTexture *GPU_texture_create_nD(int w, int h, int n, float *fpixels, in return NULL; } - if (!GLEW_ARB_texture_non_power_of_two) { + if (!GPU_non_power_of_two_support()) { tex->w = larger_pow2(tex->w); tex->h = larger_pow2(tex->h); } @@ -337,7 +349,7 @@ GPUTexture *GPU_texture_create_3D(int w, int h, int depth, float *fpixels) return NULL; } - if (!GLEW_ARB_texture_non_power_of_two) { + if (!GPU_non_power_of_two_support()) { tex->w = larger_pow2(tex->w); tex->h = larger_pow2(tex->h); tex->depth = larger_pow2(tex->depth); diff --git a/source/blender/windowmanager/intern/wm_draw.c b/source/blender/windowmanager/intern/wm_draw.c index 1df567e3c92..93ecd4076a3 100644 --- a/source/blender/windowmanager/intern/wm_draw.c +++ b/source/blender/windowmanager/intern/wm_draw.c @@ -376,7 +376,7 @@ static int wm_triple_gen_textures(wmWindow *win, wmDrawTriple *triple) triple->x[0]= win->sizex; triple->y[0]= win->sizey; } - else if(GLEW_ARB_texture_non_power_of_two) { + else if(GPU_non_power_of_two_support()) { triple->target= GL_TEXTURE_2D; triple->nx= 1; triple->ny= 1; diff --git a/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp b/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp index df7f35d7773..ca5faf00bb6 100644 --- a/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp +++ b/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp @@ -356,7 +356,7 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, int alw if(GLEW_ARB_multitexture && GLEW_VERSION_1_1) usemat = true; - if(GPU_extensions_minimum_support()) + if(GPU_glsl_support()) useglslmat = true; else if(blscene->gm.matmode == GAME_MAT_GLSL) usemat = false; diff --git a/source/gameengine/GamePlayer/ghost/GPG_Application.cpp b/source/gameengine/GamePlayer/ghost/GPG_Application.cpp index 3c989293c94..e771d12988c 100644 --- a/source/gameengine/GamePlayer/ghost/GPG_Application.cpp +++ b/source/gameengine/GamePlayer/ghost/GPG_Application.cpp @@ -539,7 +539,7 @@ bool GPG_Application::initEngine(GHOST_IWindow* window, const int stereoMode) if(GLEW_ARB_multitexture && GLEW_VERSION_1_1) m_blendermat = (SYS_GetCommandLineInt(syshandle, "blender_material", 1) != 0); - if(GPU_extensions_minimum_support()) + if(GPU_glsl_support()) m_blenderglslmat = (SYS_GetCommandLineInt(syshandle, "blender_glsl_material", 1) != 0); else if(gm->matmode == GAME_MAT_GLSL) m_blendermat = false; |