[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