From f7ef80130852d1889502f0a3fe07c1c0bf71be75 Mon Sep 17 00:00:00 2001
From: Miikka Heikkinen <miikka.heikkinen@theqtcompany.com>
Date: Mon, 18 May 2015 15:41:02 +0300
Subject: [PATCH] Fix Canvas3D_conformance_gl_get_calls related conformance
 issues
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Change-Id: I7a244c2d30ed6683ac131a5254e0c280182a77af
Task-number: QTBUG-45844
Task-number: QTBUG-45845
Task-number: QTBUG-45846
Task-number: QTBUG-45847
Task-number: QTBUG-45848
Reviewed-by: Pasi Keränen <pasi.keranen@digia.com>
---
 src/imports/qtcanvas3d/canvas3d.cpp  |  6 +++++
 src/imports/qtcanvas3d/context3d.cpp | 37 ++++++++++++++++------------
 2 files changed, 27 insertions(+), 16 deletions(-)

diff --git a/src/imports/qtcanvas3d/canvas3d.cpp b/src/imports/qtcanvas3d/canvas3d.cpp
index 0dd3d74..ec5dbb5 100644
--- a/src/imports/qtcanvas3d/canvas3d.cpp
+++ b/src/imports/qtcanvas3d/canvas3d.cpp
@@ -407,10 +407,16 @@ QJSValue Canvas::getContext(const QString &type, const QVariantMap &options)
         glViewport(0, 0,
                    m_fboSize.width(),
                    m_fboSize.height());
+        glScissor(0, 0,
+                  m_fboSize.width(),
+                  m_fboSize.height());
         m_renderFbo->bind();
         glViewport(0, 0,
                    m_fboSize.width(),
                    m_fboSize.height());
+        glScissor(0, 0,
+                  m_fboSize.width(),
+                  m_fboSize.height());
 
         // Verify that width and height are not initially too large, in case width and height
         // were set before getting GL_MAX_VIEWPORT_DIMS
diff --git a/src/imports/qtcanvas3d/context3d.cpp b/src/imports/qtcanvas3d/context3d.cpp
index 9dd2a33..56e9412 100644
--- a/src/imports/qtcanvas3d/context3d.cpp
+++ b/src/imports/qtcanvas3d/context3d.cpp
@@ -4686,10 +4686,10 @@ QJSValue CanvasContext::getParameter(glEnums pname)
         glGetBooleanv(COLOR_WRITEMASK, values);
         logAllGLErrors(__FUNCTION__);
         QJSValue arrayValue = m_engine->newArray(4);
-        arrayValue.setProperty(0, values[0]);
-        arrayValue.setProperty(1, values[1]);
-        arrayValue.setProperty(2, values[2]);
-        arrayValue.setProperty(3, values[3]);
+        arrayValue.setProperty(0, bool(values[0]));
+        arrayValue.setProperty(1, bool(values[1]));
+        arrayValue.setProperty(2, bool(values[2]));
+        arrayValue.setProperty(3, bool(values[3]));
         return arrayValue;
     }
 
@@ -4746,7 +4746,7 @@ QJSValue CanvasContext::getParameter(glEnums pname)
 
             QV4::ScopedFunctionObject constructor(scope,
                                                   m_v4engine->typedArrayCtors[
-                                                  QV4::Heap::TypedArray::Int32Array]);
+                                                  QV4::Heap::TypedArray::UInt32Array]);
             QV4::ScopedCallData callData(scope, 1);
             callData->args[0] = buffer;
             return QJSValue(m_v4engine, constructor->construct(callData));
@@ -5803,7 +5803,7 @@ uint CanvasContext::getVertexAttribOffset(uint index, glEnums pname)
  *   \li \c{boolean}
  * \row
  *   \li \c{Context3D.CURRENT_VERTEX_ATTRIB}
- *   \li \c{sequence<float>} (with 4 elements)
+ *   \li \c{Float32Array} (with 4 elements)
  *  \endtable
  */
 /*!
@@ -5828,7 +5828,7 @@ QJSValue CanvasContext::getVertexAttrib(uint index, glEnums pname)
             glGetVertexAttribiv(index, GLenum(pname), &value);
             logAllGLErrors(__FUNCTION__);
             if (value == 0 || !m_idToCanvasBufferMap.contains(value))
-                return m_engine->newObject();
+                return QJSValue(QJSValue::NullValue);
 
             return m_engine->newQObject(m_idToCanvasBufferMap[value]);
         }
@@ -5867,17 +5867,22 @@ QJSValue CanvasContext::getVertexAttrib(uint index, glEnums pname)
             return QJSValue(bool(value));
         }
         case CURRENT_VERTEX_ATTRIB: {
-            // TODO: Should be Float32Array
-            GLfloat values[4];
-            glGetVertexAttribfv(index, GLenum(pname), values);
+            QV4::Scope scope(m_v4engine);
+            QV4::Scoped<QV4::ArrayBuffer> buffer(scope,
+                                                 m_v4engine->memoryManager->alloc<QV4::ArrayBuffer>(
+                                                     m_v4engine,
+                                                     sizeof(float) * 4));
+
+            glGetVertexAttribfv(index, GLenum(pname), (float *) buffer->data());
             logAllGLErrors(__FUNCTION__);
 
-            QJSValue array = m_engine->newArray(4);
-            array.setProperty(0, values[0]);
-            array.setProperty(1, values[1]);
-            array.setProperty(2, values[2]);
-            array.setProperty(3, values[3]);
-            return array;
+
+            QV4::ScopedFunctionObject constructor(scope,
+                                                  m_v4engine->typedArrayCtors[
+                                                  QV4::Heap::TypedArray::Float32Array]);
+            QV4::ScopedCallData callData(scope, 1);
+            callData->args[0] = buffer;
+            return QJSValue(m_v4engine, constructor->construct(callData));
         }
         default:
             qCWarning(canvas3drendering).nospace() << "Context3D::" << __FUNCTION__
-- 
GitLab