[Bf-blender-cvs] [1f453a8909] blender2.8: OpenColorIO: Update glsl implementation to be ready for ogl 3.3 core

Clément Foucault noreply at git.blender.org
Fri Feb 24 12:40:50 CET 2017


Commit: 1f453a8909527a95fedd597b4fdaab90c18712f9
Author: Clément Foucault
Date:   Fri Feb 24 12:38:35 2017 +0100
Branches: blender2.8
https://developer.blender.org/rB1f453a8909527a95fedd597b4fdaab90c18712f9

OpenColorIO: Update glsl implementation to be ready for ogl 3.3 core

===================================================================

M	intern/opencolorio/CMakeLists.txt
M	intern/opencolorio/gpu_shader_display_transform.glsl
A	intern/opencolorio/gpu_shader_display_transform_vertex.glsl
M	intern/opencolorio/ocio_impl_glsl.cc
M	source/blender/gpu/shaders/gpu_shader_2D_image_vert.glsl

===================================================================

diff --git a/intern/opencolorio/CMakeLists.txt b/intern/opencolorio/CMakeLists.txt
index 61a8d995f4..f7e8d909f2 100644
--- a/intern/opencolorio/CMakeLists.txt
+++ b/intern/opencolorio/CMakeLists.txt
@@ -66,6 +66,7 @@ if(WITH_OPENCOLORIO)
 	endif()
 
 	data_to_c_simple(gpu_shader_display_transform.glsl SRC)
+	data_to_c_simple(gpu_shader_display_transform_vertex.glsl SRC)
 endif()
 
 
diff --git a/intern/opencolorio/gpu_shader_display_transform.glsl b/intern/opencolorio/gpu_shader_display_transform.glsl
index 853bf57558..4a63405045 100644
--- a/intern/opencolorio/gpu_shader_display_transform.glsl
+++ b/intern/opencolorio/gpu_shader_display_transform.glsl
@@ -10,6 +10,15 @@ uniform float image_texture_width;
 uniform float image_texture_height;
 #endif
 
+#if __VERSION__ < 130
+  varying vec2 texCoord_interp;
+  #define fragColor gl_FragColor
+#else
+  in vec2 texCoord_interp;
+  out vec4 fragColor;
+  #define texture2D texture
+#endif
+
 #ifdef USE_CURVE_MAPPING
 /* Curve mapping parameters
  *
@@ -143,7 +152,7 @@ vec4 apply_dither(vec2 st, vec4 col)
 
 void main()
 {
-	vec4 col = texture2D(image_texture, gl_TexCoord[0].st);
+	vec4 col = texture2D(image_texture, texCoord_interp.st);
 #ifdef USE_CURVE_MAPPING
 	col = curvemapping_evaluate_premulRGBF(col);
 #endif
@@ -165,8 +174,8 @@ void main()
 	vec4 result = OCIODisplay(col, lut3d_texture);
 
 #ifdef USE_DITHER
-	result = apply_dither(gl_TexCoord[0].st, result);
+	result = apply_dither(texCoord_interp.st, result);
 #endif
 
-	gl_FragColor = result;
+	fragColor = result;
 }
diff --git a/source/blender/gpu/shaders/gpu_shader_2D_image_vert.glsl b/intern/opencolorio/gpu_shader_display_transform_vertex.glsl
similarity index 100%
copy from source/blender/gpu/shaders/gpu_shader_2D_image_vert.glsl
copy to intern/opencolorio/gpu_shader_display_transform_vertex.glsl
diff --git a/intern/opencolorio/ocio_impl_glsl.cc b/intern/opencolorio/ocio_impl_glsl.cc
index bf91ea143d..9dba37f27e 100644
--- a/intern/opencolorio/ocio_impl_glsl.cc
+++ b/intern/opencolorio/ocio_impl_glsl.cc
@@ -58,6 +58,7 @@ using namespace OCIO_NAMESPACE;
 static const int LUT3D_EDGE_SIZE = 64;
 
 extern "C" char datatoc_gpu_shader_display_transform_glsl[];
+extern "C" char datatoc_gpu_shader_display_transform_vertex_glsl[];
 
 /* **** OpenGL drawing routines using GLSL for color space transform ***** */
 
@@ -89,6 +90,7 @@ typedef struct OCIO_GLSLDrawState {
 
 	/* GLSL stuff */
 	GLuint ocio_shader;
+	GLuint vert_shader;
 	GLuint program;
 
 	/* Previous OpenGL state. */
@@ -116,14 +118,15 @@ static GLuint compileShaderText(GLenum shaderType, const char *text)
 	return shader;
 }
 
-static GLuint linkShaders(GLuint ocio_shader)
+static GLuint linkShaders(GLuint ocio_shader, GLuint vert_shader)
 {
-	if (!ocio_shader)
+	if (!ocio_shader || !vert_shader)
 		return 0;
 
 	GLuint program = glCreateProgram();
 
 	glAttachShader(program, ocio_shader);
+	glAttachShader(program, vert_shader);
 
 	glLinkProgram(program);
 
@@ -339,6 +342,25 @@ bool OCIOImpl::setupGLSLDraw(OCIO_GLSLDrawState **state_r, OCIO_ConstProcessorRc
 			glDeleteShader(state->ocio_shader);
 		}
 
+		if (state->vert_shader) {
+			glDeleteShader(state->vert_shader);
+		}
+
+		/* Vertex shader */
+		std::ostringstream osv;
+
+		if (supportGLSL13()) {
+			osv << "#version 130\n";
+		}
+		else {
+			osv << "#version 120\n";
+		}
+
+		osv << datatoc_gpu_shader_display_transform_vertex_glsl;
+
+		state->vert_shader = compileShaderText(GL_VERTEX_SHADER, osv.str().c_str());
+
+		/* Fragment shader */
 		std::ostringstream os;
 
 		if (supportGLSL13()) {
@@ -366,8 +388,8 @@ bool OCIOImpl::setupGLSLDraw(OCIO_GLSLDrawState **state_r, OCIO_ConstProcessorRc
 
 		state->ocio_shader = compileShaderText(GL_FRAGMENT_SHADER, os.str().c_str());
 
-		if (state->ocio_shader) {
-			state->program = linkShaders(state->ocio_shader);
+		if (state->ocio_shader && state->vert_shader) {
+			state->program = linkShaders(state->ocio_shader, state->vert_shader);
 		}
 
 		state->curve_mapping_used = use_curve_mapping;
diff --git a/source/blender/gpu/shaders/gpu_shader_2D_image_vert.glsl b/source/blender/gpu/shaders/gpu_shader_2D_image_vert.glsl
index a6c00b080b..f5217a9d23 100644
--- a/source/blender/gpu/shaders/gpu_shader_2D_image_vert.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_2D_image_vert.glsl
@@ -1,6 +1,7 @@
 
 uniform mat4 ModelViewProjectionMatrix;
 
+/* Keep in sync with intern/opencolorio/gpu_shader_display_transform_vertex.glsl */
 #if __VERSION__ == 120
   attribute vec2 texCoord;
   attribute vec2 pos;




More information about the Bf-blender-cvs mailing list