summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.agocs@digia.com>2014-03-20 15:47:22 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-03-24 22:27:21 +0100
commit76dd99c448ae69cb12a0465facc5dd743b94e624 (patch)
tree785288589e8645a42be240960e75a6ff718faf64
parent51156e412b2f91dbbf8c0b6055e6ab4c29370d8a (diff)
downloadqtquickcontrols-76dd99c448ae69cb12a0465facc5dd743b94e624.tar.gz
Fix shaders for OpenGL core profiles
Add also a --coreprofile command-line parameter to the gallery and systemdialogs examples to allow testing Quick Controls with an OpenGL 3.2+ core profile. This depends on the new features introduced to qtdeclarative in I75a47182 and I41b513e9. Change-Id: I408263a108a71df221943915849a4c3e18e0d3e4 Reviewed-by: Gunnar Sletta <gunnar.sletta@jollamobile.com>
-rw-r--r--examples/quick/controls/gallery/src/main.cpp8
-rw-r--r--examples/quick/dialogs/systemdialogs/main.cpp8
-rw-r--r--src/controls/Private/FastGlow.qml71
-rw-r--r--src/dialogs/DefaultColorDialog.qml49
-rw-r--r--tests/auto/controls/data/tst_applicationwindow.qml1
5 files changed, 132 insertions, 5 deletions
diff --git a/examples/quick/controls/gallery/src/main.cpp b/examples/quick/controls/gallery/src/main.cpp
index a757f485..b0d12b85 100644
--- a/examples/quick/controls/gallery/src/main.cpp
+++ b/examples/quick/controls/gallery/src/main.cpp
@@ -40,10 +40,18 @@
#include "qtquickcontrolsapplication.h"
#include <QtQml/QQmlApplicationEngine>
+#include <QtGui/QSurfaceFormat>
+#include <QtQuick/QQuickWindow>
int main(int argc, char *argv[])
{
QtQuickControlsApplication app(argc, argv);
+ if (QCoreApplication::arguments().contains(QLatin1String("--coreprofile"))) {
+ QSurfaceFormat fmt = QQuickWindow::defaultFormat();
+ fmt.setVersion(4, 4);
+ fmt.setProfile(QSurfaceFormat::CoreProfile);
+ QQuickWindow::setDefaultFormat(fmt);
+ }
QQmlApplicationEngine engine(QUrl("qrc:/main.qml"));
return app.exec();
}
diff --git a/examples/quick/dialogs/systemdialogs/main.cpp b/examples/quick/dialogs/systemdialogs/main.cpp
index fd882200..6d0fef3c 100644
--- a/examples/quick/dialogs/systemdialogs/main.cpp
+++ b/examples/quick/dialogs/systemdialogs/main.cpp
@@ -40,10 +40,18 @@
#include "qtquickcontrolsapplication.h"
#include <QtQml/QQmlApplicationEngine>
+#include <QtGui/QSurfaceFormat>
+#include <QtQuick/QQuickWindow>
int main(int argc, char *argv[])
{
QtQuickControlsApplication app(argc, argv);
+ if (QCoreApplication::arguments().contains(QLatin1String("--coreprofile"))) {
+ QSurfaceFormat fmt = QQuickWindow::defaultFormat();
+ fmt.setVersion(4, 4);
+ fmt.setProfile(QSurfaceFormat::CoreProfile);
+ QQuickWindow::setDefaultFormat(fmt);
+ }
QQmlApplicationEngine engine(QUrl("qrc:/dialogs/systemdialogs/systemdialogs.qml"));
return app.exec();
}
diff --git a/src/controls/Private/FastGlow.qml b/src/controls/Private/FastGlow.qml
index f4bd2c74..e008dad4 100644
--- a/src/controls/Private/FastGlow.qml
+++ b/src/controls/Private/FastGlow.qml
@@ -64,7 +64,25 @@ Item {
hideSource: visible
}
- property string __internalBlurVertexShader: "
+ property string __internalBlurVertexShader: rootItem.window.glslIsCoreProfile ? "#version 150
+ in vec4 qt_Vertex;
+ in vec2 qt_MultiTexCoord0;
+ uniform mat4 qt_Matrix;
+ uniform float yStep;
+ uniform float xStep;
+ out vec2 qt_TexCoord0;
+ out vec2 qt_TexCoord1;
+ out vec2 qt_TexCoord2;
+ out vec2 qt_TexCoord3;
+
+ void main() {
+ qt_TexCoord0 = vec2(qt_MultiTexCoord0.x + xStep, qt_MultiTexCoord0.y + yStep * 0.36);
+ qt_TexCoord1 = vec2(qt_MultiTexCoord0.x + xStep * 0.36, qt_MultiTexCoord0.y - yStep);
+ qt_TexCoord2 = vec2(qt_MultiTexCoord0.x - xStep * 0.36, qt_MultiTexCoord0.y + yStep);
+ qt_TexCoord3 = vec2(qt_MultiTexCoord0.x - xStep, qt_MultiTexCoord0.y - yStep * 0.36);
+ gl_Position = qt_Matrix * qt_Vertex;
+ }
+ " : "
attribute highp vec4 qt_Vertex;
attribute highp vec2 qt_MultiTexCoord0;
uniform highp mat4 qt_Matrix;
@@ -83,8 +101,23 @@ Item {
gl_Position = qt_Matrix * qt_Vertex;
}
"
+ property string __internalBlurFragmentShader: rootItem.window.glslIsCoreProfile ? "#version 150
+ uniform sampler2D source;
+ uniform float qt_Opacity;
+ in vec2 qt_TexCoord0;
+ in vec2 qt_TexCoord1;
+ in vec2 qt_TexCoord2;
+ in vec2 qt_TexCoord3;
+ out vec4 fragColor;
- property string __internalBlurFragmentShader: "
+ void main() {
+ vec4 sourceColor = (texture(source, qt_TexCoord0) +
+ texture(source, qt_TexCoord1) +
+ texture(source, qt_TexCoord2) +
+ texture(source, qt_TexCoord3)) * 0.25;
+ fragColor = sourceColor * qt_Opacity;
+ }
+ " : "
uniform lowp sampler2D source;
uniform lowp float qt_Opacity;
varying highp vec2 qt_TexCoord0;
@@ -99,7 +132,7 @@ Item {
texture2D(source, qt_TexCoord3)) * 0.25;
gl_FragColor = sourceColor * qt_Opacity;
}
- "
+ "
ShaderEffect {
id: level0
@@ -359,7 +392,37 @@ Item {
onLodChanged: calculateWeights()
- fragmentShader: "
+ fragmentShader: rootItem.window.glslIsCoreProfile ? "#version 150
+ uniform sampler2D source1;
+ uniform sampler2D source2;
+ uniform sampler2D source3;
+ uniform sampler2D source4;
+ uniform sampler2D source5;
+ uniform float weight1;
+ uniform float weight2;
+ uniform float weight3;
+ uniform float weight4;
+ uniform float weight5;
+ uniform vec4 color;
+ uniform float spread;
+ uniform float qt_Opacity;
+ in vec2 qt_TexCoord0;
+ out vec4 fragColor;
+
+ float linearstep(float e0, float e1, float x) {
+ return clamp((x - e0) / (e1 - e0), 0.0, 1.0);
+ }
+
+ void main() {
+ vec4 sourceColor = texture(source1, qt_TexCoord0) * weight1;
+ sourceColor += texture(source2, qt_TexCoord0) * weight2;
+ sourceColor += texture(source3, qt_TexCoord0) * weight3;
+ sourceColor += texture(source4, qt_TexCoord0) * weight4;
+ sourceColor += texture(source5, qt_TexCoord0) * weight5;
+ sourceColor = mix(vec4(0), color, linearstep(0.0, spread, sourceColor.a));
+ fragColor = sourceColor * qt_Opacity;
+ }
+ " : "
uniform lowp sampler2D source1;
uniform lowp sampler2D source2;
uniform lowp sampler2D source3;
diff --git a/src/dialogs/DefaultColorDialog.qml b/src/dialogs/DefaultColorDialog.qml
index 1b5f7485..7880de49 100644
--- a/src/dialogs/DefaultColorDialog.qml
+++ b/src/dialogs/DefaultColorDialog.qml
@@ -136,7 +136,54 @@ AbstractColorDialog {
anchors.centerIn: parent
property real hue: hueSlider.value
- fragmentShader: "
+ fragmentShader: root.window.glslIsCoreProfile ? "#version 150
+ in vec2 qt_TexCoord0;
+ uniform float qt_Opacity;
+ uniform float hue;
+ out vec4 fragColor;
+
+ float hueToIntensity(float v1, float v2, float h) {
+ h = fract(h);
+ if (h < 1.0 / 6.0)
+ return v1 + (v2 - v1) * 6.0 * h;
+ else if (h < 1.0 / 2.0)
+ return v2;
+ else if (h < 2.0 / 3.0)
+ return v1 + (v2 - v1) * 6.0 * (2.0 / 3.0 - h);
+
+ return v1;
+ }
+
+ vec3 HSLtoRGB(vec3 color) {
+ float h = color.x;
+ float l = color.z;
+ float s = color.y;
+
+ if (s < 1.0 / 256.0)
+ return vec3(l, l, l);
+
+ float v1;
+ float v2;
+ if (l < 0.5)
+ v2 = l * (1.0 + s);
+ else
+ v2 = (l + s) - (s * l);
+
+ v1 = 2.0 * l - v2;
+
+ float d = 1.0 / 3.0;
+ float r = hueToIntensity(v1, v2, h + d);
+ float g = hueToIntensity(v1, v2, h);
+ float b = hueToIntensity(v1, v2, h - d);
+ return vec3(r, g, b);
+ }
+
+ void main() {
+ vec4 c = vec4(1.0);
+ c.rgb = HSLtoRGB(vec3(hue, 1.0 - qt_TexCoord0.t, qt_TexCoord0.s));
+ fragColor = c * qt_Opacity;
+ }
+ " : "
varying mediump vec2 qt_TexCoord0;
uniform highp float qt_Opacity;
uniform highp float hue;
diff --git a/tests/auto/controls/data/tst_applicationwindow.qml b/tests/auto/controls/data/tst_applicationwindow.qml
index a428fe97..8695d59e 100644
--- a/tests/auto/controls/data/tst_applicationwindow.qml
+++ b/tests/auto/controls/data/tst_applicationwindow.qml
@@ -41,6 +41,7 @@
import QtQuick 2.1
import QtTest 1.0
import QtQuickControlsTests 1.0
+import QtQuick.Window 2.1
Item {
id: container