diff -r 39e5f73667ba -r c2ef9095503a hostsupport/hostopengles11/inc/GLESContext.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hostsupport/hostopengles11/inc/GLESContext.h Wed Oct 06 17:59:01 2010 +0100 @@ -0,0 +1,205 @@ +/* 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: + * + */ + +#ifndef _GLESCONTEXT_H_ +#define _GLESCONTEXT_H_ + +#include +#include +#include +#include "GLESArray.h" +#include "glesInternal.h" +#include "GLESDesktopGL.h" +#include "glesOS.h" +#include "EGLInterface.h" + +struct GLESBuffer; +class GLESTexture; +struct GLESTextureLevel; + +namespace +{ +typedef std::map BufferMap; +typedef std::map TextureMap; +} + +enum GLESArrayFlag +{ + GLES_INVALID_ARRAY = 0, + GLES_VERTEX_ARRAY = 1 << 0, + GLES_NORMAL_ARRAY = 1 << 1, + GLES_COLOR_ARRAY = 1 << 2, + GLES_POINT_SIZE_ARRAY = 1 << 3, + GLES_TEXTURE_COORD_ARRAY = 1 << 4 +}; + +class GLESContext { +public: + GLESContext(void* nativeContext); + ~GLESContext(); + + bool Initialize(); + + bool IsInitialized() const { return m_initialized; } + const GLESDesktopGL& DGL() const { return m_dgl; } + void* NativeContext() const { return m_nativeContext; } + GLenum Error() const { return m_error; } + GLenum GetHostError(); + unsigned int MaxTextureLevel() const { return m_maxTextureLevel; } + unsigned int MaxTextureUnits() const { return m_maxTextureUnits; } + unsigned int MaxClipPlanes() const { return m_maxClipPlanes; } + unsigned int MaxLights() const { return m_maxLights; } + int ClientActiveTexture() const { return m_clientActiveTexture; } + GLESArray& VertexArray() { return m_vertexArray; } + const GLESArray& VertexArray() const { return m_vertexArray; } + GLESArray& NormalArray() { return m_normalArray; } + const GLESArray& NormalArray() const { return m_normalArray; } + GLESArray& ColorArray() { return m_colorArray; } + const GLESArray& ColorArray() const { return m_colorArray; } + const GLESArray& PointSizeArray() const { return m_pointSizeArray; } + GLESArray& TexCoordArray(unsigned int texture); + GLESArray& TexCoordArray(); + const GLESArray& TexCoordArray(unsigned int texture) const; + const GLESArray& TexCoordArray() const; + unsigned int ArrayBufferBinding() const { return m_arrayBufferBinding; } + GLESBuffer* ArrayBuffer(); + unsigned int ElementArrayBufferBinding() const { return m_elementArrayBufferBinding; } + GLESBuffer* ElementArrayBuffer(); + const GLESBuffer* Buffer(unsigned int buffer) const; + unsigned int TextureBinding() const { return m_textureBinding; } + GLESTexture* Texture(unsigned int name); + const GLESTextureLevel* TextureLevel(GLint level) const; + + bool IsArrayEnabled(GLESArrayFlag array) const { return !!(m_enabledArrays & array); } + + void SetError(GLenum error) { m_error = error; } + void SetClientActiveTexture(int texture) { m_clientActiveTexture = texture; } + void SetVertexArray(int size, GLenum type, int stride, const void *pointer); + void SetNormalArray(GLenum type, int stride, const void *pointer); + void SetColorArray(int size, GLenum type, int stride, const void *pointer); + void SetPointerSizeArray(GLenum type, int stride, const void *pointer); + void SetTexCoordArray(int size, GLenum type, int stride, const void *pointer); + + void EnableArray(GLESArrayFlag array) { m_enabledArrays |= array; } + void DisableArray(GLESArrayFlag array) { m_enabledArrays &= ~array; } + + void ReserveBufferNames(int num, unsigned int* names); + void DeleteBuffer(unsigned int buffer); + + bool BindArrayBuffer(unsigned int buffer); + bool BindElementArrayBuffer(unsigned int buffer); + + void DeleteTexture(unsigned int texture); + bool BindTexture(unsigned int texture); + +private: + bool m_initialized; + void* m_nativeContext; + GLESDesktopGL m_dgl; + GLenum m_error; + unsigned int m_maxTextureLevel; + unsigned int m_maxTextureUnits; + unsigned int m_maxClipPlanes; + unsigned int m_maxLights; + int m_clientActiveTexture; + GLESArray m_vertexArray; + GLESArray m_normalArray; + GLESArray m_colorArray; + GLESArray m_pointSizeArray; + GLESArray* m_texCoordArray; + unsigned int m_enabledArrays; + unsigned int m_arrayBufferBinding; + unsigned int m_elementArrayBufferBinding; + unsigned int m_textureBinding; + BufferMap m_buffers; + TextureMap m_textures; +}; + +void* glesGetCurrentGLESContext(); + +#define GLES_ENTER_RET(RETVAL) \ + GLESContext* ctx; \ + do \ + { \ + glesGetLock(); \ + ctx = (GLESContext*)glesGetCurrentGLESContext(); \ + if(!ctx) \ + { \ + glesReleaseLock(); \ + return RETVAL; \ + } \ + if(!ctx->IsInitialized()) \ + { \ + if(!ctx->Initialize()) \ + { \ + std::cerr << "Failed to initialize context" << std::endl; \ + exit(1); \ + } \ + } \ + } while(0) + +#define GLES_ENTER() GLES_ENTER_RET(GLES_NO_RETVAL) + +// Check the host error after every API function call so that the error flag +// in the wrapper always contains the latest error. +#define GLES_LEAVE_RET(RETVAL) \ + do \ + { \ + ctx->GetHostError(); \ + glesReleaseLock(); \ + return RETVAL; \ + } while(0) + +#define GLES_LEAVE() GLES_LEAVE_RET(GLES_NO_RETVAL) + +#define GLES_LEAVE_NO_ERROR_CHECK_RET(RETVAL) \ + do \ + { \ + glesReleaseLock(); \ + return RETVAL; \ + } while(0) + +#define GLES_LEAVE_NO_ERROR_CHECK() GLES_LEAVE_NO_ERROR_CHECK_RET(GLES_NO_RETVAL) + +#define GLES_ERROR_IF_RET(COND, ERROR, RETVAL) \ + do \ + { \ + if(COND) \ + { \ + ctx->SetError(ERROR); \ + return RETVAL; \ + } \ + } while(0) + +#define GLES_ERROR_IF(COND, ERROR) GLES_ERROR_IF_RET(COND, ERROR, GLES_NO_RETVAL) +#define GLES_ERROR_RET(ERROR, RETVAL) GLES_ERROR_IF_RET(true, ERROR, RETVAL) +#define GLES_ERROR(ERROR) GLES_ERROR_IF(true, ERROR) + +#endif // _GLESCONTEXT_H_ \ No newline at end of file