Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2009-10-19 14:10:05 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2009-10-19 14:10:05 +0400
commite2fa58f7f3cceb89fd248d5361d875224e62de38 (patch)
tree93e12f3b08ff272b48addd54d207e75a4f47b2c0 /source/blender
parent2c985dee976eb5b3ee6729312f046a344cb9947c (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.
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/editors/interface/interface_icons.c2
-rw-r--r--source/blender/editors/space_view3d/drawobject.c2
-rw-r--r--source/blender/editors/space_view3d/drawvolume.c2
-rw-r--r--source/blender/gpu/GPU_extensions.h3
-rw-r--r--source/blender/gpu/intern/gpu_extensions.c30
-rw-r--r--source/blender/windowmanager/intern/wm_draw.c2
6 files changed, 27 insertions, 14 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;