summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@theqtcompany.com>2015-06-01 13:42:55 +0300
committerPasi Keränen <pasi.keranen@digia.com>2015-06-01 11:52:55 +0000
commitf12f84d21900c5c33fc213b26b0b3e11ac4f99c7 (patch)
tree2486bd2e0561990701ac5bb56c5656b7b6e1e52c
parent7a1e51de2f6d19ea00ca1c69b02573e48ffed663 (diff)
Fix getShaderPrecisionFormat on desktop
Task-number: QTBUG-46410 Change-Id: I0f221ff495f9d7910e8c2f8f88aa639556e8cc96 Reviewed-by: Tomi Korpipää <tomi.korpipaa@theqtcompany.com> Reviewed-by: Pasi Keränen <pasi.keranen@digia.com>
-rw-r--r--src/imports/qtcanvas3d/context3d.cpp37
-rw-r--r--tests/auto/qmltest/canvas3d/tst_program.js60
2 files changed, 61 insertions, 36 deletions
diff --git a/src/imports/qtcanvas3d/context3d.cpp b/src/imports/qtcanvas3d/context3d.cpp
index 8a3e0b2..a34d8f9 100644
--- a/src/imports/qtcanvas3d/context3d.cpp
+++ b/src/imports/qtcanvas3d/context3d.cpp
@@ -312,11 +312,40 @@ QJSValue CanvasContext::getShaderPrecisionFormat(glEnums shadertype,
qCDebug(canvas3drendering).nospace() << "Context3D::" << str;
GLint range[2];
- range[0] = 1;
- range[1] = 1;
- GLint precision = 1;
+ GLint precision;
+
+ // Default values from OpenGL ES2 spec
+ switch (precisiontype) {
+ case LOW_INT:
+ case MEDIUM_INT:
+ case HIGH_INT:
+ // 32-bit twos-complement integer format
+ range[0] = 31;
+ range[1] = 30;
+ precision = 0;
+ break;
+ case LOW_FLOAT:
+ case MEDIUM_FLOAT:
+ case HIGH_FLOAT:
+ // IEEE single-precision floating-point format
+ range[0] = 127;
+ range[1] = 127;
+ precision = 23;
+ break;
+ default:
+ range[0] = 1;
+ range[1] = 1;
+ precision = 1;
+ m_error |= CANVAS_INVALID_ENUM;
+ break;
+ }
- glGetShaderPrecisionFormat((GLenum)(shadertype), (GLenum)(precisiontype), range, &precision);
+ // On desktop envs glGetShaderPrecisionFormat is part of OpenGL 4.x, so it is not necessarily
+ // available. Let's just return the default values if not ES2.
+ if (m_isOpenGLES2) {
+ glGetShaderPrecisionFormat((GLenum)(shadertype), (GLenum)(precisiontype),
+ range, &precision);
+ }
logAllGLErrors(str);
CanvasShaderPrecisionFormat *format = new CanvasShaderPrecisionFormat();
diff --git a/tests/auto/qmltest/canvas3d/tst_program.js b/tests/auto/qmltest/canvas3d/tst_program.js
index eb7903c..7555c24 100644
--- a/tests/auto/qmltest/canvas3d/tst_program.js
+++ b/tests/auto/qmltest/canvas3d/tst_program.js
@@ -304,38 +304,34 @@ function initializeGL(canvas) {
canvas.width * canvas.devicePixelRatio,
canvas.height * canvas.devicePixelRatio);
- // Skipping getShaderPrecisionFormat as on OS X these will
- // fail as the method doesn't work, it produces INVALID_OPERATION error.
- // TODO: Uncomment once QTBUG-46410 has been fixed
-
-// if (!getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.LOW_FLOAT, false))
-// return 20;
-// if (!getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.MEDIUM_FLOAT, false))
-// return 21;
-// if (!getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.HIGH_FLOAT, false))
-// return 22;
-// if (!getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.LOW_INT, false))
-// return 23;
-// if (!getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.MEDIUM_INT, false))
-// return 24;
-// if (!getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.HIGH_INT, false))
-// return 25;
-// if (!getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.LOW_FLOAT, false))
-// return 26;
-// if (!getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT, false))
-// return 27;
-// if (!getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT, false))
-// return 28;
-// if (!getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.LOW_INT, false))
-// return 29;
-// if (!getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_INT, false))
-// return 30;
-// if (!getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_INT, false))
-// return 31;
-// if (!getShaderPrecisionFormat(77, gl.LOW_INT, true))
-// return 32;
-// if (!getShaderPrecisionFormat(gl.FRAGMENT_SHADER, 77, true))
-// return 33;
+ if (!getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.LOW_FLOAT, false))
+ return 20;
+ if (!getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.MEDIUM_FLOAT, false))
+ return 21;
+ if (!getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.HIGH_FLOAT, false))
+ return 22;
+ if (!getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.LOW_INT, false))
+ return 23;
+ if (!getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.MEDIUM_INT, false))
+ return 24;
+ if (!getShaderPrecisionFormat(gl.VERTEX_SHADER, gl.HIGH_INT, false))
+ return 25;
+ if (!getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.LOW_FLOAT, false))
+ return 26;
+ if (!getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT, false))
+ return 27;
+ if (!getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT, false))
+ return 28;
+ if (!getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.LOW_INT, false))
+ return 29;
+ if (!getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_INT, false))
+ return 30;
+ if (!getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_INT, false))
+ return 31;
+ if (!getShaderPrecisionFormat(77, gl.LOW_INT, true))
+ return 32;
+ if (!getShaderPrecisionFormat(gl.FRAGMENT_SHADER, 77, true))
+ return 33;
if (!isProgram(shaderProgram, true))
return 40;