Home | History | Annotate | Download | only in GLcommon
      1 /*
      2 * Copyright 2011 The Android Open Source Project
      3 *
      4 * Licensed under the Apache License, Version 2.0 (the "License");
      5 * you may not use this file except in compliance with the License.
      6 * You may obtain a copy of the License at
      7 *
      8 * http://www.apache.org/licenses/LICENSE-2.0
      9 *
     10 * Unless required by applicable law or agreed to in writing, software
     11 * distributed under the License is distributed on an "AS IS" BASIS,
     12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 * See the License for the specific language governing permissions and
     14 * limitations under the License.
     15 */
     16 
     17 #ifndef GLES_CONTEXT_H
     18 #define GLES_CONTEXT_H
     19 
     20 #include "GLDispatch.h"
     21 #include "GLESpointer.h"
     22 #include "objectNameManager.h"
     23 #include "emugl/common/mutex.h"
     24 #include <string>
     25 
     26 typedef std::map<GLenum,GLESpointer*>  ArraysMap;
     27 
     28 enum TextureTarget {
     29 TEXTURE_2D,
     30 TEXTURE_CUBE_MAP,
     31 NUM_TEXTURE_TARGETS
     32 };
     33 
     34 typedef struct _textureTargetState {
     35     GLuint texture;
     36     GLboolean enabled;
     37 } textureTargetState;
     38 
     39 typedef textureTargetState textureUnitState[NUM_TEXTURE_TARGETS];
     40 
     41 class Version{
     42 public:
     43     Version();
     44     Version(int major,int minor,int release);
     45     Version(const char* versionString);
     46     Version(const Version& ver);
     47     bool operator<(const Version& ver) const;
     48     Version& operator=(const Version& ver);
     49 private:
     50     int m_major;
     51     int m_minor;
     52     int m_release;
     53 };
     54 
     55 struct GLSupport {
     56     GLSupport():maxLights(0),maxVertexAttribs(0),maxClipPlane(0),maxTexUnits(0), \
     57                 maxTexImageUnits(0),maxTexSize(0) , \
     58                 GL_EXT_TEXTURE_FORMAT_BGRA8888(false), GL_EXT_FRAMEBUFFER_OBJECT(false), \
     59                 GL_ARB_VERTEX_BLEND(false), GL_ARB_MATRIX_PALETTE(false), \
     60                 GL_EXT_PACKED_DEPTH_STENCIL(false) , GL_OES_READ_FORMAT(false), \
     61                 GL_ARB_HALF_FLOAT_PIXEL(false), GL_NV_HALF_FLOAT(false), \
     62                 GL_ARB_HALF_FLOAT_VERTEX(false),GL_SGIS_GENERATE_MIPMAP(false),
     63                 GL_ARB_ES2_COMPATIBILITY(false),GL_OES_STANDARD_DERIVATIVES(false) {} ;
     64     int  maxLights;
     65     int  maxVertexAttribs;
     66     int  maxClipPlane;
     67     int  maxTexUnits;
     68     int  maxTexImageUnits;
     69     int  maxTexSize;
     70     Version glslVersion;
     71     bool GL_EXT_TEXTURE_FORMAT_BGRA8888;
     72     bool GL_EXT_FRAMEBUFFER_OBJECT;
     73     bool GL_ARB_VERTEX_BLEND;
     74     bool GL_ARB_MATRIX_PALETTE;
     75     bool GL_EXT_PACKED_DEPTH_STENCIL;
     76     bool GL_OES_READ_FORMAT;
     77     bool GL_ARB_HALF_FLOAT_PIXEL;
     78     bool GL_NV_HALF_FLOAT;
     79     bool GL_ARB_HALF_FLOAT_VERTEX;
     80     bool GL_SGIS_GENERATE_MIPMAP;
     81     bool GL_ARB_ES2_COMPATIBILITY;
     82     bool GL_OES_STANDARD_DERIVATIVES;
     83 
     84 };
     85 
     86 struct ArrayData{
     87     ArrayData():data(NULL),
     88                 type(0),
     89                 stride(0),
     90                 allocated(false){};
     91 
     92     void*        data;
     93     GLenum       type;
     94     unsigned int stride;
     95     bool         allocated;
     96 };
     97 
     98 class GLESConversionArrays
     99 {
    100 public:
    101     GLESConversionArrays():m_current(0){};
    102     void setArr(void* data,unsigned int stride,GLenum type);
    103     void allocArr(unsigned int size,GLenum type);
    104     ArrayData& operator[](int i);
    105     void* getCurrentData();
    106     ArrayData& getCurrentArray();
    107     unsigned int getCurrentIndex();
    108     void operator++();
    109 
    110     ~GLESConversionArrays();
    111 private:
    112     std::map<GLenum,ArrayData> m_arrays;
    113     unsigned int m_current;
    114 };
    115 
    116 class GLEScontext{
    117 public:
    118     virtual void init();
    119     GLEScontext();
    120     GLenum getGLerror();
    121     void setGLerror(GLenum err);
    122     void setShareGroup(ShareGroupPtr grp){m_shareGroup = grp;};
    123     ShareGroupPtr shareGroup() const { return m_shareGroup; }
    124     virtual void setActiveTexture(GLenum tex);
    125     unsigned int getBindedTexture(GLenum target);
    126     unsigned int getBindedTexture(GLenum unit,GLenum target);
    127     void setBindedTexture(GLenum target,unsigned int tex);
    128     bool isTextureUnitEnabled(GLenum unit);
    129     void setTextureEnabled(GLenum target, GLenum enable);
    130     ObjectLocalName getDefaultTextureName(GLenum target);
    131     bool isInitialized() { return m_initialized; };
    132     void setUnpackAlignment(GLint param){ m_unpackAlignment = param; };
    133     GLint getUnpackAlignment(){ return m_unpackAlignment; };
    134 
    135     bool  isArrEnabled(GLenum);
    136     void  enableArr(GLenum arr,bool enable);
    137     const GLvoid* setPointer(GLenum arrType,GLint size,GLenum type,GLsizei stride,const GLvoid* data,bool normalize = false);
    138     virtual const GLESpointer* getPointer(GLenum arrType);
    139     virtual void setupArraysPointers(GLESConversionArrays& fArrs,GLint first,GLsizei count,GLenum type,const GLvoid* indices,bool direct) = 0;
    140     void bindBuffer(GLenum target,GLuint buffer);
    141     void unbindBuffer(GLuint buffer);
    142     bool isBuffer(GLuint buffer);
    143     bool isBindedBuffer(GLenum target);
    144     GLvoid* getBindedBuffer(GLenum target);
    145     void getBufferSize(GLenum target,GLint* param);
    146     void getBufferUsage(GLenum target,GLint* param);
    147     bool setBufferData(GLenum target,GLsizeiptr size,const GLvoid* data,GLenum usage);
    148     bool setBufferSubData(GLenum target,GLintptr offset,GLsizeiptr size,const GLvoid* data);
    149     const char * getExtensionString();
    150     const char * getVendorString() const;
    151     const char * getRendererString() const;
    152     const char * getVersionString() const;
    153     void getGlobalLock();
    154     void releaseGlobalLock();
    155     virtual GLSupport*  getCaps(){return &s_glSupport;};
    156     virtual ~GLEScontext();
    157     virtual int getMaxTexUnits() = 0;
    158     virtual void drawValidate(void);
    159 
    160     void setRenderbufferBinding(GLuint rb) { m_renderbuffer = rb; }
    161     GLuint getRenderbufferBinding() const { return m_renderbuffer; }
    162     void setFramebufferBinding(GLuint fb) { m_framebuffer = fb; }
    163     GLuint getFramebufferBinding() const { return m_framebuffer; }
    164 
    165     static GLDispatch& dispatcher(){return s_glDispatch;};
    166 
    167     static int getMaxLights(){return s_glSupport.maxLights;}
    168     static int getMaxClipPlanes(){return s_glSupport.maxClipPlane;}
    169     static int getMaxTexSize(){return s_glSupport.maxTexSize;}
    170     static Version glslVersion(){return s_glSupport.glslVersion;}
    171     static bool isAutoMipmapSupported(){return s_glSupport.GL_SGIS_GENERATE_MIPMAP;}
    172     static TextureTarget GLTextureTargetToLocal(GLenum target);
    173     static int findMaxIndex(GLsizei count,GLenum type,const GLvoid* indices);
    174 
    175     virtual bool glGetIntegerv(GLenum pname, GLint *params);
    176     virtual bool glGetBooleanv(GLenum pname, GLboolean *params);
    177     virtual bool glGetFloatv(GLenum pname, GLfloat *params);
    178     virtual bool glGetFixedv(GLenum pname, GLfixed *params);
    179 
    180 protected:
    181     static void buildStrings(const char* baseVendor, const char* baseRenderer, const char* baseVersion, const char* version);
    182     virtual bool needConvert(GLESConversionArrays& fArrs,GLint first,GLsizei count,GLenum type,const GLvoid* indices,bool direct,GLESpointer* p,GLenum array_id) = 0;
    183     void convertDirect(GLESConversionArrays& fArrs,GLint first,GLsizei count,GLenum array_id,GLESpointer* p);
    184     void convertDirectVBO(GLESConversionArrays& fArrs,GLint first,GLsizei count,GLenum array_id,GLESpointer* p);
    185     void convertIndirect(GLESConversionArrays& fArrs,GLsizei count,GLenum type,const GLvoid* indices,GLenum array_id,GLESpointer* p);
    186     void convertIndirectVBO(GLESConversionArrays& fArrs,GLsizei count,GLenum indices_type,const GLvoid* indices,GLenum array_id,GLESpointer* p);
    187     void initCapsLocked(const GLubyte * extensionString);
    188     virtual void initExtensionString() =0;
    189 
    190     static emugl::Mutex   s_lock;
    191     static GLDispatch     s_glDispatch;
    192     bool                  m_initialized;
    193     unsigned int          m_activeTexture;
    194     GLint                 m_unpackAlignment;
    195     ArraysMap             m_map;
    196     static std::string*   s_glExtensions;
    197     static GLSupport      s_glSupport;
    198 
    199 private:
    200 
    201     virtual void setupArr(const GLvoid* arr,GLenum arrayType,GLenum dataType,GLint size,GLsizei stride, GLboolean normalized, int pointsIndex = -1) = 0 ;
    202     GLuint getBuffer(GLenum target);
    203 
    204     ShareGroupPtr         m_shareGroup;
    205     GLenum                m_glError;
    206     textureUnitState*     m_texState;
    207     unsigned int          m_arrayBuffer;
    208     unsigned int          m_elementBuffer;
    209     GLuint                m_renderbuffer;
    210     GLuint                m_framebuffer;
    211 
    212     static std::string    s_glVendor;
    213     static std::string    s_glRenderer;
    214     static std::string    s_glVersion;
    215 };
    216 
    217 #endif
    218 
    219