Fix T40498 invalid textures flickering.

Issue here is most likely sampler uniforms and textures not being
updated properly when zero binding is created. Solution for now is to
allow zero binding but when this happens use sexy pink invalid texture
instead :p.
This commit is contained in:
Antonis Ryakiotakis 2014-06-10 01:36:53 +03:00
parent 131d388d81
commit e8c63caf77
Notes: blender-bot 2023-02-14 10:34:07 +01:00
Referenced by issue #40633, 2.71 crashes when I try to duplicate a bone
Referenced by issue #40631, Crash when trying to exture single bone
Referenced by issue #40604, Linked objects flicker randomly
Referenced by issue #40605, Multires performance issues
Referenced by issue #40561, Cycles: Refraction Node return Black (Sharp mode)
Referenced by issue #40498, 3D-View Error: Backface-Culling shown with 'Textured Solid' when disabled
Referenced by issue #40450, Regression: speed of creating objects (MSVC2013)
2 changed files with 51 additions and 15 deletions

View File

@ -117,6 +117,9 @@ GPUTexture *GPU_texture_create_vsm_shadow_map(int size, char err_out[256]);
GPUTexture *GPU_texture_from_blender(struct Image *ima,
struct ImageUser *iuser, bool is_data, double time, int mipmap);
GPUTexture *GPU_texture_from_preview(struct PreviewImage *prv, int mipmap);
void GPU_invalid_tex_init(void);
void GPU_invalid_tex_bind(int mode);
void GPU_invalid_tex_free(void);
void GPU_texture_free(GPUTexture *tex);

View File

@ -94,6 +94,9 @@ static struct GPUGlobal {
GPUOSType os;
GPUDriverType driver;
GPUShaders shaders;
GPUTexture *invalid_tex_1D; /* texture used in place of invalid textures (not loaded correctly, missing) */
GPUTexture *invalid_tex_2D;
GPUTexture *invalid_tex_3D;
} GG = {1, 0};
/* GPU Types */
@ -223,6 +226,8 @@ void GPU_extensions_init(void)
GG.os = GPU_OS_UNIX;
#endif
GPU_invalid_tex_init();
GPU_simple_shaders_init();
}
@ -231,6 +236,7 @@ void GPU_extensions_exit(void)
gpu_extensions_init = 0;
GPU_codegen_exit();
GPU_simple_shaders_exit();
GPU_invalid_tex_free();
}
int GPU_glsl_support(void)
@ -572,11 +578,6 @@ GPUTexture *GPU_texture_from_blender(Image *ima, ImageUser *iuser, bool is_data,
return ima->gputexture;
}
if (!bindcode) {
glBindTexture(GL_TEXTURE_2D, lastbindcode);
return NULL;
}
tex = MEM_callocN(sizeof(GPUTexture), "GPUTexture");
tex->bindcode = bindcode;
tex->number = -1;
@ -587,7 +588,7 @@ GPUTexture *GPU_texture_from_blender(Image *ima, ImageUser *iuser, bool is_data,
ima->gputexture= tex;
if (!glIsTexture(tex->bindcode)) {
GPU_print_error("Blender Texture");
GPU_print_error("Blender Texture Not Loaded");
}
else {
glBindTexture(GL_TEXTURE_2D, tex->bindcode);
@ -625,12 +626,6 @@ GPUTexture *GPU_texture_from_preview(PreviewImage *prv, int mipmap)
return tex;
}
/* error binding anything */
if (!bindcode) {
glBindTexture(GL_TEXTURE_2D, lastbindcode);
return NULL;
}
tex = MEM_callocN(sizeof(GPUTexture), "GPUTexture");
tex->bindcode = bindcode;
tex->number = -1;
@ -640,7 +635,7 @@ GPUTexture *GPU_texture_from_preview(PreviewImage *prv, int mipmap)
prv->gputexture[0]= tex;
if (!glIsTexture(tex->bindcode)) {
GPU_print_error("Blender Texture");
GPU_print_error("Blender Texture Not Loaded");
}
else {
glBindTexture(GL_TEXTURE_2D, tex->bindcode);
@ -706,6 +701,37 @@ GPUTexture *GPU_texture_create_vsm_shadow_map(int size, char err_out[256])
return tex;
}
void GPU_invalid_tex_init(void)
{
float color[4] = {1.0f, 0.0f, 1.0f, 1.0};
GG.invalid_tex_1D = GPU_texture_create_1D(1, color, NULL);
GG.invalid_tex_2D = GPU_texture_create_2D(1, 1, color, NULL);
GG.invalid_tex_3D = GPU_texture_create_3D(1, 1, 1, 4, color);
}
void GPU_invalid_tex_bind(int mode)
{
switch(mode) {
case GL_TEXTURE_1D:
glBindTexture(GL_TEXTURE_1D, GG.invalid_tex_1D->bindcode);
break;
case GL_TEXTURE_2D:
glBindTexture(GL_TEXTURE_2D, GG.invalid_tex_2D->bindcode);
break;
case GL_TEXTURE_3D:
glBindTexture(GL_TEXTURE_3D, GG.invalid_tex_3D->bindcode);
break;
}
}
void GPU_invalid_tex_free(void)
{
GPU_texture_free(GG.invalid_tex_1D);
GPU_texture_free(GG.invalid_tex_2D);
GPU_texture_free(GG.invalid_tex_3D);
}
void GPU_texture_bind(GPUTexture *tex, int number)
{
GLenum arbnumber;
@ -722,7 +748,11 @@ void GPU_texture_bind(GPUTexture *tex, int number)
arbnumber = (GLenum)((GLuint)GL_TEXTURE0_ARB + number);
if (number != 0) glActiveTextureARB(arbnumber);
glBindTexture(tex->target, tex->bindcode);
if (tex->bindcode != 0) {
glBindTexture(tex->target, tex->bindcode);
}
else
GPU_invalid_tex_bind(tex->target);
glEnable(tex->target);
if (number != 0) glActiveTextureARB(GL_TEXTURE0_ARB);
@ -1397,7 +1427,10 @@ void GPU_shader_uniform_texture(GPUShader *UNUSED(shader), int location, GPUText
arbnumber = (GLenum)((GLuint)GL_TEXTURE0_ARB + tex->number);
if (tex->number != 0) glActiveTextureARB(arbnumber);
glBindTexture(tex->target, tex->bindcode);
if (tex->bindcode != 0)
glBindTexture(tex->target, tex->bindcode);
else
GPU_invalid_tex_bind(tex->target);
glUniform1iARB(location, tex->number);
glEnable(tex->target);
if (tex->number != 0) glActiveTextureARB(GL_TEXTURE0_ARB);