Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@gmail.com>2013-12-14 18:24:20 +0400
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2013-12-14 19:01:48 +0400
commitcccd06ea447f8418b03b5bec79f6f0230d793952 (patch)
tree794e04dee8dfde6b1ae36dc6890012ad13e45917 /intern/opencolorio/ocio_impl_glsl.cc
parent05fe9a435af75239439c853906425b54eea42fb5 (diff)
Fix T37810: GLSL dither shader not working on OS X.
The GLSL function textureSize() is not supported here, only when we start using OpenGL core profile will this work. For now check the supported GLSL version and use a somewhat slower replacement.
Diffstat (limited to 'intern/opencolorio/ocio_impl_glsl.cc')
-rw-r--r--intern/opencolorio/ocio_impl_glsl.cc44
1 files changed, 41 insertions, 3 deletions
diff --git a/intern/opencolorio/ocio_impl_glsl.cc b/intern/opencolorio/ocio_impl_glsl.cc
index 3a23c266345..677be0bf9ed 100644
--- a/intern/opencolorio/ocio_impl_glsl.cc
+++ b/intern/opencolorio/ocio_impl_glsl.cc
@@ -71,6 +71,10 @@ typedef struct OCIO_GLSLDrawState {
GLuint curve_mapping_texture;
size_t curve_mapping_cache_id;
+ bool predivide_used;
+
+ bool texture_size_used;
+
/* Cache */
std::string lut3dcacheid;
std::string shadercacheid;
@@ -221,6 +225,17 @@ bool OCIOImpl::supportGLSLDraw()
return GLEW_VERSION_2_0 && (GLEW_VERSION_3_0 || GLEW_ARB_texture_float);
}
+static bool supportGLSL13()
+{
+ const char *version = (const char*)glGetString(GL_SHADING_LANGUAGE_VERSION);
+ int major = 1, minor = 0;
+
+ if (version && sscanf(version, "%d.%d", &major, &minor) == 2)
+ return (major > 1 || (major == 1 && minor >= 30));
+
+ return false;
+}
+
/**
* Setup OpenGL contexts for a transform defined by processor using GLSL
* All LUT allocating baking and shader compilation happens here.
@@ -233,7 +248,7 @@ bool OCIOImpl::supportGLSLDraw()
*/
bool OCIOImpl::setupGLSLDraw(OCIO_GLSLDrawState **state_r, OCIO_ConstProcessorRcPtr *processor,
OCIO_CurveMappingSettings *curve_mapping_settings,
- float dither, bool predivide)
+ float dither, bool use_predivide)
{
ConstProcessorRcPtr ocio_processor = *(ConstProcessorRcPtr *) processor;
bool use_curve_mapping = curve_mapping_settings != NULL;
@@ -302,6 +317,7 @@ bool OCIOImpl::setupGLSLDraw(OCIO_GLSLDrawState **state_r, OCIO_ConstProcessorRc
std::string shaderCacheID = ocio_processor->getGpuShaderTextCacheID(shaderDesc);
if (state->program == 0 ||
shaderCacheID != state->shadercacheid ||
+ use_predivide != state->predivide_used ||
use_curve_mapping != state->curve_mapping_used ||
use_dither != state->dither_used)
{
@@ -317,7 +333,17 @@ bool OCIOImpl::setupGLSLDraw(OCIO_GLSLDrawState **state_r, OCIO_ConstProcessorRc
std::ostringstream os;
- os << "#version 130\n";
+ if (supportGLSL13()) {
+ os << "#version 130\n";
+ }
+ else {
+ os << "#define USE_TEXTURE_SIZE\n";
+ state->texture_size_used = use_dither;
+ }
+
+ if (use_predivide) {
+ os << "#define USE_PREDIVIDE\n";
+ }
if (use_dither) {
os << "#define USE_DITHER\n";
@@ -338,6 +364,7 @@ bool OCIOImpl::setupGLSLDraw(OCIO_GLSLDrawState **state_r, OCIO_ConstProcessorRc
state->curve_mapping_used = use_curve_mapping;
state->dither_used = use_dither;
+ state->predivide_used = use_predivide;
}
if (state->program) {
@@ -355,7 +382,18 @@ bool OCIOImpl::setupGLSLDraw(OCIO_GLSLDrawState **state_r, OCIO_ConstProcessorRc
glUniform1i(glGetUniformLocation(state->program, "image_texture"), 0);
glUniform1i(glGetUniformLocation(state->program, "lut3d_texture"), 1);
- glUniform1i(glGetUniformLocation(state->program, "predivide"), predivide);
+
+ if (state->texture_size_used) {
+ /* we use textureSize() if possible for best performance, if not
+ * supported we query the size and pass it as uniform variables */
+ GLint width, height;
+
+ glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width);
+ glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &height);
+
+ glUniform1f(glGetUniformLocation(state->program, "image_texture_width"), (float)width);
+ glUniform1f(glGetUniformLocation(state->program, "image_texture_height"), (float)height);
+ }
if (use_dither) {
glUniform1f(glGetUniformLocation(state->program, "dither"), dither);