[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [55804] trunk/blender: Fix #34872: Every images are displayed as black in UV/image editor

Sergey Sharybin sergey.vfx at gmail.com
Fri Apr 5 13:01:36 CEST 2013


Revision: 55804
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=55804
Author:   nazgul
Date:     2013-04-05 11:01:35 +0000 (Fri, 05 Apr 2013)
Log Message:
-----------
Fix #34872: Every images are displayed as black in UV/image editor

Issue was caused by some mesa drivers does not support GL_RGBA16F.

Now added check around glTexImage2D to verify whether requested
internal format is actually supported. If not blender will fall
back to non-GLSL image display.

Modified Paths:
--------------
    trunk/blender/intern/opencolorio/ocio_impl_glsl.cc
    trunk/blender/source/blender/editors/screen/glutil.c

Modified: trunk/blender/intern/opencolorio/ocio_impl_glsl.cc
===================================================================
--- trunk/blender/intern/opencolorio/ocio_impl_glsl.cc	2013-04-05 09:23:20 UTC (rev 55803)
+++ trunk/blender/intern/opencolorio/ocio_impl_glsl.cc	2013-04-05 11:01:35 UTC (rev 55804)
@@ -60,6 +60,7 @@
 	bool lut3d_texture_allocated;  /* boolean flag indicating whether
 	                                * lut texture is allocated
 	                                */
+	bool lut3d_texture_valid;
 
 	GLuint lut3d_texture;  /* OGL texture ID for 3D LUT */
 
@@ -170,12 +171,12 @@
 }
 
 /* Ensure LUT texture and array are allocated */
-static void ensureLUT3DAllocated(OCIO_GLSLDrawState *state)
+static bool ensureLUT3DAllocated(OCIO_GLSLDrawState *state)
 {
 	int num_3d_entries = 3 * LUT3D_EDGE_SIZE * LUT3D_EDGE_SIZE * LUT3D_EDGE_SIZE;
 
 	if (state->lut3d_texture_allocated)
-		return;
+		return state->lut3d_texture_valid;
 
 	glGenTextures(1, &state->lut3d_texture);
 
@@ -188,11 +189,22 @@
 	glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
 	glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
 	glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
+
+	/* clean glError buffer */
+	while (glGetError() != GL_NO_ERROR) {}
+
 	glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB16F_ARB,
 	             LUT3D_EDGE_SIZE, LUT3D_EDGE_SIZE, LUT3D_EDGE_SIZE,
 	             0, GL_RGB,GL_FLOAT, &state->lut3d);
 
 	state->lut3d_texture_allocated = true;
+
+	/* GL_RGB16F_ARB could be not supported at some drivers
+	 * in this case we could not use GLSL display
+	 */
+	state->lut3d_texture_valid = glGetError() == GL_NO_ERROR;
+
+	return state->lut3d_texture_valid;
 }
 
 /**
@@ -218,8 +230,13 @@
 	glGetIntegerv(GL_TEXTURE_2D, &state->last_texture);
 	glGetIntegerv(GL_ACTIVE_TEXTURE, &state->last_texture_unit);
 
-	ensureLUT3DAllocated(state);
+	if (!ensureLUT3DAllocated(state)) {
+		glActiveTexture(state->last_texture_unit);
+		glBindTexture(GL_TEXTURE_2D, state->last_texture);
 
+		return false;
+	}
+
 	/* Step 1: Create a GPU Shader Description */
 	GpuShaderDesc shaderDesc;
 	shaderDesc.setLanguage(GPU_LANGUAGE_GLSL_1_0);

Modified: trunk/blender/source/blender/editors/screen/glutil.c
===================================================================
--- trunk/blender/source/blender/editors/screen/glutil.c	2013-04-05 09:23:20 UTC (rev 55803)
+++ trunk/blender/source/blender/editors/screen/glutil.c	2013-04-05 11:01:35 UTC (rev 55804)
@@ -540,6 +540,13 @@
 
 	if (type == GL_FLOAT) {
 		/* need to set internal format to higher range float */
+
+		/* NOTE: this could fail on some drivers, like mesa,
+		 *       but currently this code is only used by color
+		 *       management stuff which already checks on whether
+		 *       it's possible to use GL_RGBA16F_ARB
+		 */
+
 		glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F_ARB, tex_w, tex_h, 0, format, GL_FLOAT, NULL);
 	}
 	else {




More information about the Bf-blender-cvs mailing list