From 1f453a8909527a95fedd597b4fdaab90c18712f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Fri, 24 Feb 2017 12:38:35 +0100 Subject: OpenColorIO: Update glsl implementation to be ready for ogl 3.3 core --- intern/opencolorio/CMakeLists.txt | 1 + .../opencolorio/gpu_shader_display_transform.glsl | 15 ++++++++--- .../gpu_shader_display_transform_vertex.glsl | 18 +++++++++++++ intern/opencolorio/ocio_impl_glsl.cc | 30 +++++++++++++++++++--- 4 files changed, 57 insertions(+), 7 deletions(-) create mode 100644 intern/opencolorio/gpu_shader_display_transform_vertex.glsl (limited to 'intern/opencolorio') diff --git a/intern/opencolorio/CMakeLists.txt b/intern/opencolorio/CMakeLists.txt index 61a8d995f40..f7e8d909f2c 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 853bf575582..4a63405045d 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/intern/opencolorio/gpu_shader_display_transform_vertex.glsl b/intern/opencolorio/gpu_shader_display_transform_vertex.glsl new file mode 100644 index 00000000000..a6c00b080b2 --- /dev/null +++ b/intern/opencolorio/gpu_shader_display_transform_vertex.glsl @@ -0,0 +1,18 @@ + +uniform mat4 ModelViewProjectionMatrix; + +#if __VERSION__ == 120 + attribute vec2 texCoord; + attribute vec2 pos; + varying vec2 texCoord_interp; +#else + in vec2 texCoord; + in vec2 pos; + out vec2 texCoord_interp; +#endif + +void main() +{ + gl_Position = ModelViewProjectionMatrix * vec4(pos.xy, 0.0f, 1.0f); + texCoord_interp = texCoord; +} diff --git a/intern/opencolorio/ocio_impl_glsl.cc b/intern/opencolorio/ocio_impl_glsl.cc index bf91ea143da..9dba37f27eb 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; -- cgit v1.2.3