Update CGuestEGL::eglCreateWindowSurface to save iSurfaceId and get offesets to buffers that lower layers require
/* 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;
}