diff options
Diffstat (limited to 'distrib/android-emugl/host/libs/Translator/include/GLcommon/GLEScontext.h')
-rw-r--r-- | distrib/android-emugl/host/libs/Translator/include/GLcommon/GLEScontext.h | 218 |
1 files changed, 218 insertions, 0 deletions
diff --git a/distrib/android-emugl/host/libs/Translator/include/GLcommon/GLEScontext.h b/distrib/android-emugl/host/libs/Translator/include/GLcommon/GLEScontext.h new file mode 100644 index 000000000..5aed0adb9 --- /dev/null +++ b/distrib/android-emugl/host/libs/Translator/include/GLcommon/GLEScontext.h @@ -0,0 +1,218 @@ +/* +* Copyright 2011 The Android Open Source Project +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +#ifndef GLES_CONTEXT_H +#define GLES_CONTEXT_H + +#include "GLDispatch.h" +#include "GLESpointer.h" +#include "objectNameManager.h" +#include "emugl/common/mutex.h" +#include <string> + +typedef std::map<GLenum,GLESpointer*> ArraysMap; + +enum TextureTarget { +TEXTURE_2D, +TEXTURE_CUBE_MAP, +NUM_TEXTURE_TARGETS +}; + +typedef struct _textureTargetState { + GLuint texture; + GLboolean enabled; +} textureTargetState; + +typedef textureTargetState textureUnitState[NUM_TEXTURE_TARGETS]; + +class Version{ +public: + Version(); + Version(int major,int minor,int release); + Version(const char* versionString); + Version(const Version& ver); + bool operator<(const Version& ver) const; + Version& operator=(const Version& ver); +private: + int m_major; + int m_minor; + int m_release; +}; + +struct GLSupport { + GLSupport():maxLights(0),maxVertexAttribs(0),maxClipPlane(0),maxTexUnits(0), \ + maxTexImageUnits(0),maxTexSize(0) , \ + GL_EXT_TEXTURE_FORMAT_BGRA8888(false), GL_EXT_FRAMEBUFFER_OBJECT(false), \ + GL_ARB_VERTEX_BLEND(false), GL_ARB_MATRIX_PALETTE(false), \ + GL_EXT_PACKED_DEPTH_STENCIL(false) , GL_OES_READ_FORMAT(false), \ + GL_ARB_HALF_FLOAT_PIXEL(false), GL_NV_HALF_FLOAT(false), \ + GL_ARB_HALF_FLOAT_VERTEX(false),GL_SGIS_GENERATE_MIPMAP(false), + GL_ARB_ES2_COMPATIBILITY(false),GL_OES_STANDARD_DERIVATIVES(false) {} ; + int maxLights; + int maxVertexAttribs; + int maxClipPlane; + int maxTexUnits; + int maxTexImageUnits; + int maxTexSize; + Version glslVersion; + bool GL_EXT_TEXTURE_FORMAT_BGRA8888; + bool GL_EXT_FRAMEBUFFER_OBJECT; + bool GL_ARB_VERTEX_BLEND; + bool GL_ARB_MATRIX_PALETTE; + bool GL_EXT_PACKED_DEPTH_STENCIL; + bool GL_OES_READ_FORMAT; + bool GL_ARB_HALF_FLOAT_PIXEL; + bool GL_NV_HALF_FLOAT; + bool GL_ARB_HALF_FLOAT_VERTEX; + bool GL_SGIS_GENERATE_MIPMAP; + bool GL_ARB_ES2_COMPATIBILITY; + bool GL_OES_STANDARD_DERIVATIVES; + +}; + +struct ArrayData{ + ArrayData():data(NULL), + type(0), + stride(0), + allocated(false){}; + + void* data; + GLenum type; + unsigned int stride; + bool allocated; +}; + +class GLESConversionArrays +{ +public: + GLESConversionArrays():m_current(0){}; + void setArr(void* data,unsigned int stride,GLenum type); + void allocArr(unsigned int size,GLenum type); + ArrayData& operator[](int i); + void* getCurrentData(); + ArrayData& getCurrentArray(); + unsigned int getCurrentIndex(); + void operator++(); + + ~GLESConversionArrays(); +private: + std::map<GLenum,ArrayData> m_arrays; + unsigned int m_current; +}; + +class GLEScontext{ +public: + virtual void init(); + GLEScontext(); + GLenum getGLerror(); + void setGLerror(GLenum err); + void setShareGroup(ShareGroupPtr grp){m_shareGroup = grp;}; + ShareGroupPtr shareGroup() const { return m_shareGroup; } + virtual void setActiveTexture(GLenum tex); + unsigned int getBindedTexture(GLenum target); + unsigned int getBindedTexture(GLenum unit,GLenum target); + void setBindedTexture(GLenum target,unsigned int tex); + bool isTextureUnitEnabled(GLenum unit); + void setTextureEnabled(GLenum target, GLenum enable); + ObjectLocalName getDefaultTextureName(GLenum target); + bool isInitialized() { return m_initialized; }; + void setUnpackAlignment(GLint param){ m_unpackAlignment = param; }; + GLint getUnpackAlignment(){ return m_unpackAlignment; }; + + bool isArrEnabled(GLenum); + void enableArr(GLenum arr,bool enable); + const GLvoid* setPointer(GLenum arrType,GLint size,GLenum type,GLsizei stride,const GLvoid* data,bool normalize = false); + virtual const GLESpointer* getPointer(GLenum arrType); + virtual void setupArraysPointers(GLESConversionArrays& fArrs,GLint first,GLsizei count,GLenum type,const GLvoid* indices,bool direct) = 0; + void bindBuffer(GLenum target,GLuint buffer); + void unbindBuffer(GLuint buffer); + bool isBuffer(GLuint buffer); + bool isBindedBuffer(GLenum target); + GLvoid* getBindedBuffer(GLenum target); + void getBufferSize(GLenum target,GLint* param); + void getBufferUsage(GLenum target,GLint* param); + bool setBufferData(GLenum target,GLsizeiptr size,const GLvoid* data,GLenum usage); + bool setBufferSubData(GLenum target,GLintptr offset,GLsizeiptr size,const GLvoid* data); + const char * getExtensionString(); + const char * getVendorString() const; + const char * getRendererString() const; + const char * getVersionString() const; + void getGlobalLock(); + void releaseGlobalLock(); + virtual GLSupport* getCaps(){return &s_glSupport;}; + virtual ~GLEScontext(); + virtual int getMaxTexUnits() = 0; + virtual void drawValidate(void); + + void setRenderbufferBinding(GLuint rb) { m_renderbuffer = rb; } + GLuint getRenderbufferBinding() const { return m_renderbuffer; } + void setFramebufferBinding(GLuint fb) { m_framebuffer = fb; } + GLuint getFramebufferBinding() const { return m_framebuffer; } + + static GLDispatch& dispatcher(){return s_glDispatch;}; + + static int getMaxLights(){return s_glSupport.maxLights;} + static int getMaxClipPlanes(){return s_glSupport.maxClipPlane;} + static int getMaxTexSize(){return s_glSupport.maxTexSize;} + static Version glslVersion(){return s_glSupport.glslVersion;} + static bool isAutoMipmapSupported(){return s_glSupport.GL_SGIS_GENERATE_MIPMAP;} + static TextureTarget GLTextureTargetToLocal(GLenum target); + static int findMaxIndex(GLsizei count,GLenum type,const GLvoid* indices); + + virtual bool glGetIntegerv(GLenum pname, GLint *params); + virtual bool glGetBooleanv(GLenum pname, GLboolean *params); + virtual bool glGetFloatv(GLenum pname, GLfloat *params); + virtual bool glGetFixedv(GLenum pname, GLfixed *params); + +protected: + static void buildStrings(const char* baseVendor, const char* baseRenderer, const char* baseVersion, const char* version); + virtual bool needConvert(GLESConversionArrays& fArrs,GLint first,GLsizei count,GLenum type,const GLvoid* indices,bool direct,GLESpointer* p,GLenum array_id) = 0; + void convertDirect(GLESConversionArrays& fArrs,GLint first,GLsizei count,GLenum array_id,GLESpointer* p); + void convertDirectVBO(GLESConversionArrays& fArrs,GLint first,GLsizei count,GLenum array_id,GLESpointer* p); + void convertIndirect(GLESConversionArrays& fArrs,GLsizei count,GLenum type,const GLvoid* indices,GLenum array_id,GLESpointer* p); + void convertIndirectVBO(GLESConversionArrays& fArrs,GLsizei count,GLenum indices_type,const GLvoid* indices,GLenum array_id,GLESpointer* p); + void initCapsLocked(const GLubyte * extensionString); + virtual void initExtensionString() =0; + + static emugl::Mutex s_lock; + static GLDispatch s_glDispatch; + bool m_initialized; + unsigned int m_activeTexture; + GLint m_unpackAlignment; + ArraysMap m_map; + static std::string* s_glExtensions; + static GLSupport s_glSupport; + +private: + + virtual void setupArr(const GLvoid* arr,GLenum arrayType,GLenum dataType,GLint size,GLsizei stride, GLboolean normalized, int pointsIndex = -1) = 0 ; + GLuint getBuffer(GLenum target); + + ShareGroupPtr m_shareGroup; + GLenum m_glError; + textureUnitState* m_texState; + unsigned int m_arrayBuffer; + unsigned int m_elementBuffer; + GLuint m_renderbuffer; + GLuint m_framebuffer; + + static std::string s_glVendor; + static std::string s_glRenderer; + static std::string s_glVersion; +}; + +#endif + |