hostsupport/hostopengles11/src/glesGet.cpp
author Matt Plumtree <matt.plumtree@nokia.com>
Wed, 06 Oct 2010 17:59:01 +0100
branchbug235_bringup_0
changeset 53 c2ef9095503a
permissions -rw-r--r--
Copy code from the holdingarea into the target locations. Some initial rework of CMakeLists.txt files, but not yet tested.

/* 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;
}