hostsupport/hostopengles11/src/glesGet.cpp
branchbug235_bringup_0
changeset 53 c2ef9095503a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hostsupport/hostopengles11/src/glesGet.cpp	Wed Oct 06 17:59:01 2010 +0100
@@ -0,0 +1,492 @@
+/* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and /or associated documentation files
+ * (the "Materials "), to deal in the Materials without restriction,
+ * including without limitation the rights to use, copy, modify, merge,
+ * publish, distribute, sublicense, and/or sell copies of the Materials,
+ * and to permit persons to whom the Materials are furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Materials.
+ *
+ * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR
+ * THE USE OR OTHER DEALINGS IN THE MATERIALS.
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+
+#include "glesGet.h"
+#include <GLES/glext.h>
+#include "GLESContext.h"
+#include "GLESDesktopGL.h"
+
+// UINT_MAX
+#include <limits.h>
+
+bool glesGetParameter(const GLESContext& context, const GLESDesktopGL &dgl, GLenum pname, GLESGetType dstType, void* params)
+{
+    GLESGetType srcType;
+    GLboolean b[4];
+    GLint i[16];
+    GLdouble d[16];
+    int n = 1;
+
+    switch(pname)
+    {
+    case GL_MAX_TEXTURE_UNITS:
+        i[0] = context.MaxTextureUnits();
+        srcType = GLES_TYPE_INTEGER;
+        break;
+
+    case GL_MAX_CLIP_PLANES:
+        i[0] = context.MaxClipPlanes();
+        srcType = GLES_TYPE_INTEGER;
+        break;
+
+    case GL_MAX_LIGHTS:
+        i[0] = context.MaxLights();
+        srcType = GLES_TYPE_INTEGER;
+        break;
+
+    case GL_CLIENT_ACTIVE_TEXTURE:
+        i[0] = GL_TEXTURE0 + context.ClientActiveTexture();
+        srcType = GLES_TYPE_ENUM;
+        break;
+
+    case GL_VERTEX_ARRAY:
+        i[0] = context.IsArrayEnabled(GLES_VERTEX_ARRAY);
+        srcType = GLES_TYPE_BOOLEAN;
+        break;
+
+    case GL_VERTEX_ARRAY_SIZE:
+        i[0] = context.VertexArray().Size();
+        srcType = GLES_TYPE_INTEGER;
+        break;
+
+    case GL_VERTEX_ARRAY_TYPE:
+        i[0] = context.VertexArray().Type();
+        srcType = GLES_TYPE_ENUM;
+        break;
+
+    case GL_VERTEX_ARRAY_STRIDE:
+        i[0] = context.VertexArray().Stride();
+        srcType = GLES_TYPE_INTEGER;
+        break;
+
+    case GL_NORMAL_ARRAY:
+        i[0] = context.IsArrayEnabled(GLES_NORMAL_ARRAY);
+        srcType = GLES_TYPE_BOOLEAN;
+        break;
+
+    case GL_NORMAL_ARRAY_TYPE:
+        i[0] = context.NormalArray().Type();
+        srcType = GLES_TYPE_ENUM;
+        break;
+
+    case GL_NORMAL_ARRAY_STRIDE:
+        i[0] = context.NormalArray().Stride();
+        srcType = GLES_TYPE_INTEGER;
+        break;
+
+    case GL_COLOR_ARRAY:
+        i[0] = context.IsArrayEnabled(GLES_COLOR_ARRAY);
+        srcType = GLES_TYPE_BOOLEAN;
+        break;
+
+    case GL_COLOR_ARRAY_SIZE:
+        i[0] = context.ColorArray().Size();
+        srcType = GLES_TYPE_INTEGER;
+        break;
+
+    case GL_COLOR_ARRAY_TYPE:
+        i[0] = context.ColorArray().Type();
+        srcType = GLES_TYPE_ENUM;
+        break;
+
+    case GL_COLOR_ARRAY_STRIDE:
+        i[0] = context.ColorArray().Stride();
+        srcType = GLES_TYPE_INTEGER;
+        break;
+
+    case GL_POINT_SIZE_ARRAY_OES:
+        i[0] = context.IsArrayEnabled(GLES_POINT_SIZE_ARRAY);
+        srcType = GLES_TYPE_BOOLEAN;
+        break;
+
+    case GL_POINT_SIZE_ARRAY_TYPE_OES:
+        i[0] = context.PointSizeArray().Type();
+        srcType = GLES_TYPE_ENUM;
+        break;
+
+    case GL_POINT_SIZE_ARRAY_STRIDE_OES:
+        i[0] = context.PointSizeArray().Stride();
+        srcType = GLES_TYPE_INTEGER;
+        break;
+
+    case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
+        i[0] = context.PointSizeArray().BufferName();
+        srcType = GLES_TYPE_INTEGER;
+        break;
+
+    case GL_TEXTURE_COORD_ARRAY:
+        i[0] = context.IsArrayEnabled(static_cast<GLESArrayFlag>(GLES_TEXTURE_COORD_ARRAY << context.ClientActiveTexture()));
+        srcType = GLES_TYPE_BOOLEAN;
+        break;
+
+    case GL_TEXTURE_COORD_ARRAY_SIZE:
+        i[0] = context.TexCoordArray().Size();
+        srcType = GLES_TYPE_INTEGER;
+        break;
+
+    case GL_TEXTURE_COORD_ARRAY_TYPE:
+        i[0] = context.TexCoordArray().Type();
+        srcType = GLES_TYPE_ENUM;
+        break;
+
+    case GL_TEXTURE_COORD_ARRAY_STRIDE:
+        i[0] = context.TexCoordArray().Stride();
+        srcType = GLES_TYPE_INTEGER;
+        break;
+
+    case GL_VERTEX_ARRAY_BUFFER_BINDING:
+        i[0] = context.VertexArray().BufferName();
+        srcType = GLES_TYPE_INTEGER;
+        break;
+
+    case GL_NORMAL_ARRAY_BUFFER_BINDING:
+        i[0] = context.NormalArray().BufferName();
+        srcType = GLES_TYPE_INTEGER;
+        break;
+
+    case GL_COLOR_ARRAY_BUFFER_BINDING:
+        i[0] = context.ColorArray().BufferName();
+        srcType = GLES_TYPE_INTEGER;
+        break;
+
+    case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
+        i[0] = context.TexCoordArray().BufferName();
+        srcType = GLES_TYPE_INTEGER;
+        break;
+
+    case GL_ARRAY_BUFFER_BINDING:
+        i[0] = context.ArrayBufferBinding();
+        srcType = GLES_TYPE_INTEGER;
+        break;
+
+    case GL_ELEMENT_ARRAY_BUFFER_BINDING:
+        i[0] = context.ElementArrayBufferBinding();
+        srcType = GLES_TYPE_INTEGER;
+        break;
+
+    case GL_MODELVIEW_MATRIX_FLOAT_AS_INT_BITS_OES:
+        if(dstType != GLES_TYPE_INTEGER)
+        {
+            return false;
+        }
+        dgl.glGetDoublev(GL_MODELVIEW_MATRIX, d);
+        n = 16;
+        for(int j = 0; j < n; j++)
+        {
+            static_cast<GLint*>(params)[j] = *reinterpret_cast<GLint*>(&d[j]);
+        }
+        break;
+
+    case GL_PROJECTION_MATRIX_FLOAT_AS_INT_BITS_OES:
+        if(dstType != GLES_TYPE_INTEGER)
+        {
+            return false;
+        }
+        dgl.glGetDoublev(GL_PROJECTION_MATRIX, d);
+        n = 16;
+        for(int j = 0; j < n; j++)
+        {
+            static_cast<GLint*>(params)[j] = *reinterpret_cast<GLint*>(&d[j]);
+        }
+        break;
+
+    case GL_TEXTURE_MATRIX_FLOAT_AS_INT_BITS_OES:
+        if(dstType != GLES_TYPE_INTEGER)
+        {
+            return false;
+        }
+        dgl.glGetDoublev(GL_TEXTURE_MATRIX, d);
+        n = 16;
+        for(int j = 0; j < n; j++)
+        {
+            static_cast<GLint*>(params)[j] = *reinterpret_cast<GLint*>(&d[j]);
+        }
+        break;
+
+    case GL_POINT_SPRITE_OES:
+        b[0] = dgl.glIsEnabled(GL_POINT_SPRITE);
+        srcType = GLES_TYPE_BOOLEAN;
+        break;
+
+    case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
+        i[0] = 10;
+        srcType = GLES_TYPE_INTEGER;
+        break;
+
+    case GL_COMPRESSED_TEXTURE_FORMATS:
+        i[0] = GL_PALETTE4_RGB8_OES;
+        i[1] = GL_PALETTE4_RGBA8_OES;
+        i[2] = GL_PALETTE4_R5_G6_B5_OES;
+        i[3] = GL_PALETTE4_RGBA4_OES;
+        i[4] = GL_PALETTE4_RGB5_A1_OES;
+        i[5] = GL_PALETTE8_RGB8_OES;
+        i[6] = GL_PALETTE8_RGBA8_OES;
+        i[7] = GL_PALETTE8_R5_G6_B5_OES;
+        i[8] = GL_PALETTE8_RGBA4_OES;
+        i[9] = GL_PALETTE8_RGB5_A1_OES;
+        srcType = GLES_TYPE_ENUM;
+        n = 10;
+        break;
+
+    case GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES:
+        i[0] = GL_RGBA;
+        srcType = GLES_TYPE_ENUM;
+        break;
+
+    case GL_IMPLEMENTATION_COLOR_READ_TYPE_OES:
+        i[0] = GL_UNSIGNED_BYTE;
+        srcType = GLES_TYPE_ENUM;
+        break;
+
+    case GL_ALIASED_POINT_SIZE_RANGE:
+    case GL_ALIASED_LINE_WIDTH_RANGE:
+    case GL_DEPTH_RANGE:
+    case GL_SMOOTH_LINE_WIDTH_RANGE:
+    case GL_SMOOTH_POINT_SIZE_RANGE:
+        dgl.glGetDoublev(pname, d);
+        srcType = GLES_TYPE_DOUBLE;
+        n = 2;
+        break;
+    case GL_ALPHA_TEST_FUNC:
+    case GL_STENCIL_FAIL:
+    case GL_STENCIL_FUNC:
+    case GL_STENCIL_PASS_DEPTH_FAIL:
+    case GL_STENCIL_PASS_DEPTH_PASS:
+    case GL_BLEND_DST:
+    case GL_BLEND_SRC:
+    case GL_LOGIC_OP_MODE:
+    case GL_CULL_FACE:
+    case GL_DEPTH_FUNC:
+    case GL_FOG_HINT:
+    case GL_FOG_MODE:
+    case GL_FRONT_FACE:
+    case GL_LINE_SMOOTH_HINT:
+    case GL_MATRIX_MODE:
+    case GL_PERSPECTIVE_CORRECTION_HINT:
+    case GL_POINT_SMOOTH_HINT:
+    case GL_SHADE_MODEL:
+    case GL_GENERATE_MIPMAP_HINT:
+    case GL_CULL_FACE_MODE:
+    case GL_ACTIVE_TEXTURE:
+        dgl.glGetIntegerv(pname, i);
+        srcType = GLES_TYPE_ENUM;
+        break;
+    case GL_ALPHA_BITS:
+    case GL_RED_BITS:
+    case GL_GREEN_BITS:
+    case GL_BLUE_BITS:
+    case GL_DEPTH_BITS:
+    case GL_STENCIL_BITS:
+    case GL_STENCIL_VALUE_MASK:
+    case GL_STENCIL_WRITEMASK:
+    case GL_MODELVIEW_STACK_DEPTH:
+    case GL_PROJECTION_STACK_DEPTH:
+    case GL_TEXTURE_STACK_DEPTH:
+    case GL_PACK_ALIGNMENT:
+    case GL_UNPACK_ALIGNMENT:
+    case GL_TEXTURE_BINDING_2D:
+    case GL_SUBPIXEL_BITS:
+    case GL_SAMPLE_BUFFERS:
+    case GL_SAMPLES:
+    case GL_BUFFER_SIZE:
+    case GL_STENCIL_CLEAR_VALUE:
+    case GL_MAX_MODELVIEW_STACK_DEPTH:
+    case GL_MAX_PROJECTION_STACK_DEPTH:
+    case GL_MAX_TEXTURE_STACK_DEPTH:
+    case GL_MAX_TEXTURE_SIZE:
+        dgl.glGetIntegerv(pname, i);
+        srcType = GLES_TYPE_INTEGER;
+        break;
+    case GL_ALPHA_TEST_REF:
+    case GL_STENCIL_REF:
+    case GL_DEPTH_CLEAR_VALUE:
+    case GL_FOG_DENSITY:
+    case GL_FOG_START:
+    case GL_FOG_END:
+    case GL_LINE_WIDTH:
+    case GL_POINT_SIZE:
+    case GL_POINT_SIZE_MIN:
+    case GL_POINT_SIZE_MAX:
+    case GL_POLYGON_OFFSET_FACTOR:
+    case GL_POLYGON_OFFSET_UNITS:
+    case GL_POINT_FADE_THRESHOLD_SIZE:
+        dgl.glGetDoublev(pname, d);
+        srcType = GLES_TYPE_DOUBLE;
+        break;
+    case GL_CURRENT_NORMAL:
+    case GL_POINT_DISTANCE_ATTENUATION:
+        dgl.glGetDoublev(pname, d);
+        srcType = GLES_TYPE_DOUBLE;
+        n = 3;
+        break;
+    case GL_COLOR_CLEAR_VALUE:
+    case GL_CURRENT_TEXTURE_COORDS:
+    case GL_CURRENT_COLOR:
+    case GL_FOG_COLOR:
+    case GL_LIGHT_MODEL_AMBIENT:
+    case GL_AMBIENT:
+    case GL_DIFFUSE:
+    case GL_SPECULAR:
+    case GL_EMISSION:
+        dgl.glGetDoublev(pname, d);
+        srcType = GLES_TYPE_DOUBLE;
+        n = 4;
+        break;
+    case GL_COLOR_WRITEMASK:
+        dgl.glGetBooleanv(pname, b);
+        srcType = GLES_TYPE_BOOLEAN;
+        n = 4;
+        break;
+    case GL_DEPTH_WRITEMASK:
+    case GL_LIGHT_MODEL_TWO_SIDE:
+        dgl.glGetBooleanv(pname, b);
+        srcType = GLES_TYPE_BOOLEAN;
+        break;
+    case GL_PROJECTION_MATRIX:
+    case GL_MODELVIEW_MATRIX:
+    case GL_TEXTURE_MATRIX:
+        dgl.glGetDoublev(pname, d);
+        srcType = GLES_TYPE_DOUBLE;
+        n = 16;
+        break;
+    case GL_VIEWPORT:
+    case GL_SCISSOR_BOX:
+        dgl.glGetIntegerv(pname, i);
+        srcType = GLES_TYPE_INTEGER;
+        n = 4;
+        break;
+    case GL_MAX_VIEWPORT_DIMS:
+        dgl.glGetIntegerv(pname, i);
+        srcType = GLES_TYPE_INTEGER;
+        n = 2;
+        break;
+
+    default:
+        return false;
+    }
+
+    // Type conversions
+
+    // Special cases
+    if(dstType == GLES_TYPE_INTEGER &&
+       (pname == GL_CURRENT_COLOR || pname == GL_ALPHA_TEST_REF || pname == GL_DEPTH_CLEAR_VALUE))
+    {
+        for(int j = 0; j < n; j++)
+        {
+            static_cast<GLint*>(params)[j] = static_cast<GLint>((UINT_MAX * d[j] - 1) / 2);
+        }
+        return true;
+    }
+
+    for(int j = 0; j < n; j++)
+    {
+        switch(dstType)
+        {
+        case GLES_TYPE_BOOLEAN:
+            switch(srcType)
+            {
+            case GLES_TYPE_BOOLEAN:
+                static_cast<GLboolean*>(params)[j] = b[j];
+                break;
+            case GLES_TYPE_INTEGER:
+            case GLES_TYPE_ENUM:
+                static_cast<GLboolean*>(params)[j] = i[j] ? GL_TRUE : GL_FALSE;
+                break;
+            case GLES_TYPE_DOUBLE:
+                static_cast<GLboolean*>(params)[j] = d[j] ? GL_TRUE : GL_FALSE;
+                break;
+            default:
+                GLES_ASSERT(false);
+            }
+            break;
+
+        case GLES_TYPE_INTEGER:
+            switch(srcType)
+            {
+            case GLES_TYPE_BOOLEAN:
+                static_cast<GLint*>(params)[j] = b[j];
+                break;
+            case GLES_TYPE_INTEGER:
+            case GLES_TYPE_ENUM:
+                static_cast<GLint*>(params)[j] = i[j];
+                break;
+            case GLES_TYPE_DOUBLE:
+                static_cast<GLint*>(params)[j] = static_cast<GLint>(d[j]);
+                break;
+            default:
+                GLES_ASSERT(false);
+            }
+            break;
+
+        case GLES_TYPE_FLOAT:
+            switch(srcType)
+            {
+            case GLES_TYPE_BOOLEAN:
+                static_cast<GLfloat*>(params)[j] = b[j];
+                break;
+            case GLES_TYPE_INTEGER:
+            case GLES_TYPE_ENUM:
+                static_cast<GLfloat*>(params)[j] = static_cast<GLfloat>(i[j]);
+                break;
+            case GLES_TYPE_DOUBLE:
+                static_cast<GLfloat*>(params)[j] = static_cast<GLfloat>(d[j]);
+                break;
+            default:
+                GLES_ASSERT(false);
+            }
+            break;
+
+        case GLES_TYPE_FIXED:
+            switch(srcType)
+            {
+            case GLES_TYPE_BOOLEAN:
+                static_cast<GLfixed*>(params)[j] = F_TO_X(b[j] ? 1.f : 0.f);
+                break;
+            case GLES_TYPE_INTEGER:
+                static_cast<GLfixed*>(params)[j] = I_TO_X(i[j]);
+                break;
+            case GLES_TYPE_ENUM:
+                static_cast<GLfixed*>(params)[j] = i[j];
+                break;
+            case GLES_TYPE_DOUBLE:
+                static_cast<GLfixed*>(params)[j] = D_TO_X(d[j]);
+                break;
+            default:
+                GLES_ASSERT(false);
+            }
+            break;
+
+        default:
+            GLES_ASSERT(false);
+        }
+    }
+
+    return true;
+}