diff options
author | Miikka Heikkinen <miikka.heikkinen@theqtcompany.com> | 2015-06-01 13:42:55 +0300 |
---|---|---|
committer | Pasi Keränen <pasi.keranen@digia.com> | 2015-06-01 11:52:55 +0000 |
commit | f12f84d21900c5c33fc213b26b0b3e11ac4f99c7 (patch) | |
tree | 2486bd2e0561990701ac5bb56c5656b7b6e1e52c | |
parent | 7a1e51de2f6d19ea00ca1c69b02573e48ffed663 (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.cpp | 37 | ||||
-rw-r--r-- | tests/auto/qmltest/canvas3d/tst_program.js | 60 |
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; |