[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [calligra/krita-testing-kazakov] krita: Fixed the last known bug of OCIO painting mode
From:       Dmitry Kazakov <dimula73 () gmail ! com>
Date:       2014-04-29 10:47:01
Message-ID: E1Wf5Yz-0002Xz-J9 () scm ! kde ! org
[Download RAW message or body]

Git commit 29fe3ddc51b4b296b07586febfe3a96a00caa492 by Dmitry Kazakov.
Committed on 29/04/2014 at 10:46.
Pushed by dkazakov into branch 'krita-testing-kazakov'.

Fixed the last known bug of OCIO painting mode

Now HQ filtering mode works even when OCIO is activated :)

M  +14   -3    krita/data/shaders/CMakeLists.txt
A  +8    -0    krita/data/shaders/highq_downscale_main.frag.inc
A  +13   -0    krita/data/shaders/highq_downscale_main_ocio.frag.inc
R  +0    -9    krita/data/shaders/highq_downscale_preface.frag.inc [from: \
krita/data/shaders/highq_downscale.frag - 091% similarity] A  +3    -0    \
krita/data/shaders/simple_texture_legacy_main.frag.inc A  +6    -0    \
krita/data/shaders/simple_texture_legacy_main_ocio.frag.inc R  +0    -3    \
krita/data/shaders/simple_texture_legacy_preface.frag.inc [from: \
krita/data/shaders/simple_texture_legacy.frag - 057% similarity] A  +3    -0    \
krita/data/shaders/simple_texture_main.frag.inc A  +6    -0    \
krita/data/shaders/simple_texture_main_ocio.frag.inc R  +0    -3    \
krita/data/shaders/simple_texture_preface.frag.inc [from: \
krita/data/shaders/simple_texture.frag - 062% similarity] M  +17   -17   \
krita/plugins/extensions/dockers/lut/ocio_display_filter.cpp M  +49   -14   \
krita/ui/opengl/kis_opengl_canvas2.cpp M  +1    -0    \
krita/ui/opengl/kis_opengl_canvas2.h

http://commits.kde.org/calligra/29fe3ddc51b4b296b07586febfe3a96a00caa492

diff --git a/krita/data/shaders/CMakeLists.txt b/krita/data/shaders/CMakeLists.txt
index 0750e05..89d7579 100644
--- a/krita/data/shaders/CMakeLists.txt
+++ b/krita/data/shaders/CMakeLists.txt
@@ -2,11 +2,22 @@ install( FILES
     bilinear_gradient.frag
     conical_gradient.frag
     conical_symetric_gradient.frag
-    highq_downscale.frag
+
     matrix_transform.vert
     matrix_transform_legacy.vert
-    simple_texture.frag
-    simple_texture_legacy.frag
+
+    highq_downscale_preface.frag.inc
+    highq_downscale_main.frag.inc
+    highq_downscale_main_ocio.frag.inc
+
+    simple_texture_preface.frag.inc
+    simple_texture_main.frag.inc
+    simple_texture_main_ocio.frag.inc
+
+    simple_texture_legacy_preface.frag.inc
+    simple_texture_legacy_main.frag.inc
+    simple_texture_legacy_main_ocio.frag.inc
+
     cursor.vert
     cursor.frag
     linear_gradient.frag
diff --git a/krita/data/shaders/highq_downscale_main.frag.inc \
b/krita/data/shaders/highq_downscale_main.frag.inc new file mode 100644
index 0000000..900c999
--- /dev/null
+++ b/krita/data/shaders/highq_downscale_main.frag.inc
@@ -0,0 +1,8 @@
+void main() {
+
+    if (viewportScale < 0.5 - eps) {
+        fragColor = filterPureLinear8(texture0, v_textureCoordinate.st);
+    } else {
+        fragColor = texture2D(texture0, v_textureCoordinate.st);
+    }
+}
diff --git a/krita/data/shaders/highq_downscale_main_ocio.frag.inc \
b/krita/data/shaders/highq_downscale_main_ocio.frag.inc new file mode 100644
index 0000000..3ce65d0
--- /dev/null
+++ b/krita/data/shaders/highq_downscale_main_ocio.frag.inc
@@ -0,0 +1,13 @@
+uniform sampler3D texture1;
+
+void main() {
+    vec4 col;
+
+    if (viewportScale < 0.5 - eps) {
+        col = filterPureLinear8(texture0, v_textureCoordinate.st);
+    } else {
+        col = texture2D(texture0, v_textureCoordinate.st);
+    }
+
+    fragColor = OCIODisplay(col, texture1);
+}
diff --git a/krita/data/shaders/highq_downscale.frag \
b/krita/data/shaders/highq_downscale_preface.frag.inc similarity index 91%
rename from krita/data/shaders/highq_downscale.frag
rename to krita/data/shaders/highq_downscale_preface.frag.inc
index 37c91c6..8236d36 100644
--- a/krita/data/shaders/highq_downscale.frag
+++ b/krita/data/shaders/highq_downscale_preface.frag.inc
@@ -61,12 +61,3 @@ vec4 filterPureLinear8(sampler2D texture, vec2 texcoord)
     return (p1 + p2 + p3 + p4 + p5 + p6) / vec4(11.0);
 
 }
-
-void main() {
-
-    if (viewportScale < 0.5 - eps) {
-        fragColor = filterPureLinear8(texture0, v_textureCoordinate.st);
-    } else {
-        fragColor = texture2D(texture0, v_textureCoordinate.st);
-    }
-}
diff --git a/krita/data/shaders/simple_texture_legacy_main.frag.inc \
b/krita/data/shaders/simple_texture_legacy_main.frag.inc new file mode 100644
index 0000000..7211255
--- /dev/null
+++ b/krita/data/shaders/simple_texture_legacy_main.frag.inc
@@ -0,0 +1,3 @@
+void main() {
+    gl_FragColor = texture2D(texture0, v_textureCoordinate.st);
+}
diff --git a/krita/data/shaders/simple_texture_legacy_main_ocio.frag.inc \
b/krita/data/shaders/simple_texture_legacy_main_ocio.frag.inc new file mode 100644
index 0000000..57b924c
--- /dev/null
+++ b/krita/data/shaders/simple_texture_legacy_main_ocio.frag.inc
@@ -0,0 +1,6 @@
+uniform sampler3D texture1;
+
+void main() {
+    vec4 col = texture2D(texture0, v_textureCoordinate.st);
+    gl_FragColor = OCIODisplay(col, texture1);
+}
diff --git a/krita/data/shaders/simple_texture_legacy.frag \
b/krita/data/shaders/simple_texture_legacy_preface.frag.inc similarity index 57%
rename from krita/data/shaders/simple_texture_legacy.frag
rename to krita/data/shaders/simple_texture_legacy_preface.frag.inc
index cd8462b..10f035e 100644
--- a/krita/data/shaders/simple_texture_legacy.frag
+++ b/krita/data/shaders/simple_texture_legacy_preface.frag.inc
@@ -5,6 +5,3 @@ uniform sampler2D texture0;
 
 varying mediump vec4 v_textureCoordinate;
 
-void main() {
-    gl_FragColor = texture2D(texture0, v_textureCoordinate.st);
-}
diff --git a/krita/data/shaders/simple_texture_main.frag.inc \
b/krita/data/shaders/simple_texture_main.frag.inc new file mode 100644
index 0000000..38eaa3f
--- /dev/null
+++ b/krita/data/shaders/simple_texture_main.frag.inc
@@ -0,0 +1,3 @@
+void main() {
+    fragColor = texture2D(texture0, v_textureCoordinate.st);
+}
diff --git a/krita/data/shaders/simple_texture_main_ocio.frag.inc \
b/krita/data/shaders/simple_texture_main_ocio.frag.inc new file mode 100644
index 0000000..4f873b5
--- /dev/null
+++ b/krita/data/shaders/simple_texture_main_ocio.frag.inc
@@ -0,0 +1,6 @@
+uniform sampler3D texture1;
+
+void main() {
+    vec4 col = texture2D(texture0, v_textureCoordinate.st);
+    fragColor = OCIODisplay(col, texture1);
+}
diff --git a/krita/data/shaders/simple_texture.frag \
b/krita/data/shaders/simple_texture_preface.frag.inc similarity index 62%
rename from krita/data/shaders/simple_texture.frag
rename to krita/data/shaders/simple_texture_preface.frag.inc
index 4800704..30a7259 100644
--- a/krita/data/shaders/simple_texture.frag
+++ b/krita/data/shaders/simple_texture_preface.frag.inc
@@ -7,6 +7,3 @@ uniform sampler2D texture0;
 in vec4 v_textureCoordinate;
 out vec4 fragColor;
 
-void main() {
-    fragColor = texture2D(texture0, v_textureCoordinate.st);
-}
diff --git a/krita/plugins/extensions/dockers/lut/ocio_display_filter.cpp \
b/krita/plugins/extensions/dockers/lut/ocio_display_filter.cpp index a981b3e..b2a9a4e \
                100644
--- a/krita/plugins/extensions/dockers/lut/ocio_display_filter.cpp
+++ b/krita/plugins/extensions/dockers/lut/ocio_display_filter.cpp
@@ -29,22 +29,11 @@
 
 #ifdef HAVE_OPENGL
 #include <opengl/kis_opengl.h>
+#include <QGLContext>
+#endif
 
-static const int LUT3D_EDGE_SIZE = 32;
-
-const char * m_fragShaderText = ""
-        "\n"
-        "uniform sampler2D texture0;\n"
-        "uniform sampler3D texture1;\n"
-        "varying mediump vec4 v_textureCoordinate;\n"
-        "\n"
-        "void main()\n"
-        "{\n"
-        "    vec4 col = texture2D(texture0, v_textureCoordinate.st);\n"
-        "    gl_FragColor = OCIODisplay(col, texture1);\n"
-        "}\n";
 
-#endif
+static const int LUT3D_EDGE_SIZE = 32;
 
 OcioDisplayFilter::OcioDisplayFilter(QObject *parent)
     : KisDisplayFilter(parent)
@@ -229,7 +218,14 @@ void OcioDisplayFilter::updateProcessor()
     KisConfig cfg;
     if (!cfg.useOpenGL()) return;
 
-    KisOpenGL::initialMakeContextCurrent();
+    if (!QGLContext::currentContext()) {
+        /**
+         * Force initialization of GL context when the filter is
+         * created before the openGL canvas. This might happen when
+         * switching from QPainter to openGL canvas for the first time.
+         */
+        KisOpenGL::initialMakeContextCurrent();
+    }
 
     if (m_lut3d.size() == 0) {
         //qDebug() << "generating lut";
@@ -253,7 +249,12 @@ void OcioDisplayFilter::updateProcessor()
 
     // Step 1: Create a GPU Shader Description
     OCIO::GpuShaderDesc shaderDesc;
-    shaderDesc.setLanguage(OCIO::GPU_LANGUAGE_GLSL_1_0);
+
+    if (KisOpenGL::supportsGLSL13()) {
+        shaderDesc.setLanguage(OCIO::GPU_LANGUAGE_GLSL_1_3);
+    } else {
+        shaderDesc.setLanguage(OCIO::GPU_LANGUAGE_GLSL_1_0);
+    }
     shaderDesc.setFunctionName("OCIODisplay");
     shaderDesc.setLut3DEdgeLen(LUT3D_EDGE_SIZE);
 
@@ -283,7 +284,6 @@ void OcioDisplayFilter::updateProcessor()
 
         std::ostringstream os;
         os << m_processor->getGpuShaderText(shaderDesc) << "\n";
-        os << m_fragShaderText;
 
         m_program = QString::fromLatin1(os.str().c_str());
     }
diff --git a/krita/ui/opengl/kis_opengl_canvas2.cpp \
b/krita/ui/opengl/kis_opengl_canvas2.cpp index 0064c9d..decbf4a 100644
--- a/krita/ui/opengl/kis_opengl_canvas2.cpp
+++ b/krita/ui/opengl/kis_opengl_canvas2.cpp
@@ -424,17 +424,17 @@ void KisOpenGLCanvas2::drawImage() const
             d->displayShader->enableAttributeArray(PROGRAM_TEXCOORD_ATTRIBUTE);
             d->displayShader->setAttributeArray(PROGRAM_TEXCOORD_ATTRIBUTE, \
texCoords.constData());  
-            glActiveTexture(GL_TEXTURE0);
-            tile->bindToActiveTexture();
-            d->displayShader->setUniformValue(d->displayUniformLocationTexture0, 0);
-
             if (d->displayFilter) {
                 glActiveTexture(GL_TEXTURE0 + 1);
                 glBindTexture(GL_TEXTURE_3D, d->displayFilter->lutTexture());
                 d->displayShader->setUniformValue(d->displayUniformLocationTexture1, \
1);  }
 
+            glActiveTexture(GL_TEXTURE0);
+            tile->bindToActiveTexture();
+            d->displayShader->setUniformValue(d->displayUniformLocationTexture0, 0);
             d->activateFilteringMode(scaleX, scaleY);
+
             glDrawArrays(GL_TRIANGLES, 0, 6);
         }
     }
@@ -507,24 +507,59 @@ void KisOpenGLCanvas2::initializeCheckerShader()
 
 }
 
+QByteArray KisOpenGLCanvas2::buildFragmentShader() const
+{
+    QByteArray shaderText;
+
+    bool haveDisplayFilter = d->displayFilter && \
!d->displayFilter->program().isEmpty(); +    bool useHiQualityFiltering = \
d->filterMode == KisTextureTile::HighQualityFiltering; +    bool haveGLSL13 = \
KisOpenGL::supportsGLSL13(); +
+    QString filename = haveGLSL13 && useHiQualityFiltering ?
+        "highq_downscale" : "simple_texture";
+
+    QString legacyPostfix = !haveGLSL13 ? "_legacy" : "";
+    QString filterPostfix = haveDisplayFilter ? "_ocio" : "";
+
+    QString prefaceKey = QString("krita/shaders/%1%2_preface.frag.inc")
+        .arg(filename)
+        .arg(legacyPostfix);
+
+    QString mainKey = QString("krita/shaders/%1%2_main%3.frag.inc")
+        .arg(filename)
+        .arg(legacyPostfix)
+        .arg(filterPostfix);
+
+    {
+        QFile prefaceFile(KGlobal::dirs()->findResource("data", prefaceKey));
+        prefaceFile.open(QIODevice::ReadOnly);
+        shaderText.append(prefaceFile.readAll());
+    }
+
+    if (haveDisplayFilter) {
+        shaderText.append(d->displayFilter->program().toLatin1());
+    }
+
+    {
+        QFile mainFile(KGlobal::dirs()->findResource("data", mainKey));
+        mainFile.open(QIODevice::ReadOnly);
+        shaderText.append(mainFile.readAll());
+    }
+
+    return shaderText;
+}
+
 void KisOpenGLCanvas2::initializeDisplayShader()
 {
     delete d->displayShader;
     d->displayShader = new QGLShaderProgram();
 
-    if (d->displayFilter && !d->displayFilter->program().isEmpty()) {
-        d->displayShader->addShaderFromSourceFile(QGLShader::Vertex, \
                KGlobal::dirs()->findResource("data", \
                "krita/shaders/matrix_transform_legacy.vert"));
-        d->displayShader->addShaderFromSourceCode(QGLShader::Fragment, \
                d->displayFilter->program().toLatin1());
-    } else if (KisOpenGL::supportsGLSL13()) {
+    d->displayShader->addShaderFromSourceCode(QGLShader::Fragment, \
buildFragmentShader()); +
+    if (KisOpenGL::supportsGLSL13()) {
         d->displayShader->addShaderFromSourceFile(QGLShader::Vertex, \
                KGlobal::dirs()->findResource("data", \
                "krita/shaders/matrix_transform.vert"));
-        if (d->filterMode == KisTextureTile::HighQualityFiltering) {
-            d->displayShader->addShaderFromSourceFile(QGLShader::Fragment, \
                KGlobal::dirs()->findResource("data", \
                "krita/shaders/highq_downscale.frag"));
-        } else {
-            d->displayShader->addShaderFromSourceFile(QGLShader::Fragment, \
                KGlobal::dirs()->findResource("data", \
                "krita/shaders/simple_texture.frag"));
-        }
     } else {
         d->displayShader->addShaderFromSourceFile(QGLShader::Vertex, \
                KGlobal::dirs()->findResource("data", \
                "krita/shaders/matrix_transform_legacy.vert"));
-        d->displayShader->addShaderFromSourceFile(QGLShader::Fragment, \
KGlobal::dirs()->findResource("data", "krita/shaders/simple_texture_legacy.frag"));  \
}  
     d->displayShader->bindAttributeLocation("a_vertexPosition", \
                PROGRAM_VERTEX_ATTRIBUTE);
diff --git a/krita/ui/opengl/kis_opengl_canvas2.h \
b/krita/ui/opengl/kis_opengl_canvas2.h index fe67e84..67b3c8b 100644
--- a/krita/ui/opengl/kis_opengl_canvas2.h
+++ b/krita/ui/opengl/kis_opengl_canvas2.h
@@ -103,6 +103,7 @@ private:
 
     void drawImage() const;
     void drawCheckers() const;
+    QByteArray buildFragmentShader() const;
 
 };
 


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic