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.
This commit is contained in:
@@ -489,7 +489,7 @@ static void init_internal_icons()
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* we only use a texture for cards with non-power of two */
|
/* 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);
|
glGenTextures(1, &icongltex.id);
|
||||||
|
|
||||||
if(icongltex.id) {
|
if(icongltex.id) {
|
||||||
|
@@ -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)
|
int draw_glsl_material(Scene *scene, Object *ob, View3D *v3d, int dt)
|
||||||
{
|
{
|
||||||
if(!GPU_extensions_minimum_support())
|
if(!GPU_glsl_support())
|
||||||
return 0;
|
return 0;
|
||||||
if(G.f & G_PICKSEL)
|
if(G.f & G_PICKSEL)
|
||||||
return 0;
|
return 0;
|
||||||
|
@@ -349,7 +349,7 @@ void draw_volume(Scene *scene, ARegion *ar, View3D *v3d, Base *base, GPUTexture
|
|||||||
else
|
else
|
||||||
printf("No volume shadow\n");
|
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[0] = (float)res[0]/(float)larger_pow2(res[0]);
|
||||||
cor[1] = (float)res[1]/(float)larger_pow2(res[1]);
|
cor[1] = (float)res[1]/(float)larger_pow2(res[1]);
|
||||||
cor[2] = (float)res[2]/(float)larger_pow2(res[2]);
|
cor[2] = (float)res[2]/(float)larger_pow2(res[2]);
|
||||||
|
@@ -54,7 +54,8 @@ typedef struct GPUShader GPUShader;
|
|||||||
void GPU_extensions_disable(void);
|
void GPU_extensions_disable(void);
|
||||||
void GPU_extensions_init(void); /* call this before running any of the functions below */
|
void GPU_extensions_init(void); /* call this before running any of the functions below */
|
||||||
void GPU_extensions_exit(void);
|
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);
|
int GPU_print_error(char *str);
|
||||||
|
|
||||||
/* GPU Texture
|
/* GPU Texture
|
||||||
|
@@ -69,7 +69,7 @@
|
|||||||
static struct GPUGlobal {
|
static struct GPUGlobal {
|
||||||
GLint maxtextures;
|
GLint maxtextures;
|
||||||
GLuint currentfb;
|
GLuint currentfb;
|
||||||
int minimumsupport;
|
int glslsupport;
|
||||||
int extdisabled;
|
int extdisabled;
|
||||||
} GG = {1, 0, 0, 0};
|
} GG = {1, 0, 0, 0};
|
||||||
|
|
||||||
@@ -87,15 +87,27 @@ void GPU_extensions_init()
|
|||||||
if (GLEW_ARB_multitexture)
|
if (GLEW_ARB_multitexture)
|
||||||
glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS_ARB, &GG.maxtextures);
|
glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS_ARB, &GG.maxtextures);
|
||||||
|
|
||||||
GG.minimumsupport = 1;
|
GG.glslsupport = 1;
|
||||||
if (!GLEW_ARB_multitexture) GG.minimumsupport = 0;
|
if (!GLEW_ARB_multitexture) GG.glslsupport = 0;
|
||||||
if (!GLEW_ARB_vertex_shader) GG.minimumsupport = 0;
|
if (!GLEW_ARB_vertex_shader) GG.glslsupport = 0;
|
||||||
if (!GLEW_ARB_fragment_shader) GG.minimumsupport = 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)
|
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;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!GLEW_ARB_texture_non_power_of_two) {
|
if (!GPU_non_power_of_two_support()) {
|
||||||
tex->w = larger_pow2(tex->w);
|
tex->w = larger_pow2(tex->w);
|
||||||
tex->h = larger_pow2(tex->h);
|
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;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!GLEW_ARB_texture_non_power_of_two) {
|
if (!GPU_non_power_of_two_support()) {
|
||||||
tex->w = larger_pow2(tex->w);
|
tex->w = larger_pow2(tex->w);
|
||||||
tex->h = larger_pow2(tex->h);
|
tex->h = larger_pow2(tex->h);
|
||||||
tex->depth = larger_pow2(tex->depth);
|
tex->depth = larger_pow2(tex->depth);
|
||||||
|
@@ -376,7 +376,7 @@ static int wm_triple_gen_textures(wmWindow *win, wmDrawTriple *triple)
|
|||||||
triple->x[0]= win->sizex;
|
triple->x[0]= win->sizex;
|
||||||
triple->y[0]= win->sizey;
|
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->target= GL_TEXTURE_2D;
|
||||||
triple->nx= 1;
|
triple->nx= 1;
|
||||||
triple->ny= 1;
|
triple->ny= 1;
|
||||||
|
@@ -356,7 +356,7 @@ extern "C" void StartKetsjiShell(struct bContext *C, struct ARegion *ar, int alw
|
|||||||
if(GLEW_ARB_multitexture && GLEW_VERSION_1_1)
|
if(GLEW_ARB_multitexture && GLEW_VERSION_1_1)
|
||||||
usemat = true;
|
usemat = true;
|
||||||
|
|
||||||
if(GPU_extensions_minimum_support())
|
if(GPU_glsl_support())
|
||||||
useglslmat = true;
|
useglslmat = true;
|
||||||
else if(blscene->gm.matmode == GAME_MAT_GLSL)
|
else if(blscene->gm.matmode == GAME_MAT_GLSL)
|
||||||
usemat = false;
|
usemat = false;
|
||||||
|
@@ -539,7 +539,7 @@ bool GPG_Application::initEngine(GHOST_IWindow* window, const int stereoMode)
|
|||||||
if(GLEW_ARB_multitexture && GLEW_VERSION_1_1)
|
if(GLEW_ARB_multitexture && GLEW_VERSION_1_1)
|
||||||
m_blendermat = (SYS_GetCommandLineInt(syshandle, "blender_material", 1) != 0);
|
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);
|
m_blenderglslmat = (SYS_GetCommandLineInt(syshandle, "blender_glsl_material", 1) != 0);
|
||||||
else if(gm->matmode == GAME_MAT_GLSL)
|
else if(gm->matmode == GAME_MAT_GLSL)
|
||||||
m_blendermat = false;
|
m_blendermat = false;
|
||||||
|
Reference in New Issue
Block a user