• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include <GLcommon/GLEScontext.h>
2 #include <GLcommon/GLconversion_macros.h>
3 #include <GLcommon/GLESmacros.h>
4 #include <GLES/gl.h>
5 #include <GLES/glext.h>
6 #include <GLcommon/GLESvalidate.h>
7 #include <GLcommon/TextureUtils.h>
8 #include <GLcommon/FramebufferData.h>
9 #include <strings.h>
10 
11 //decleration
12 static void convertFixedDirectLoop(const char* dataIn,unsigned int strideIn,void* dataOut,unsigned int nBytes,unsigned int strideOut,int attribSize);
13 static void convertFixedIndirectLoop(const char* dataIn,unsigned int strideIn,void* dataOut,GLsizei count,GLenum indices_type,const GLvoid* indices,unsigned int strideOut,int attribSize);
14 static void convertByteDirectLoop(const char* dataIn,unsigned int strideIn,void* dataOut,unsigned int nBytes,unsigned int strideOut,int attribSize);
15 static void convertByteIndirectLoop(const char* dataIn,unsigned int strideIn,void* dataOut,GLsizei count,GLenum indices_type,const GLvoid* indices,unsigned int strideOut,int attribSize);
16 
~GLESConversionArrays()17 GLESConversionArrays::~GLESConversionArrays() {
18     for(std::map<GLenum,ArrayData>::iterator it = m_arrays.begin(); it != m_arrays.end();it++) {
19         if((*it).second.allocated){
20             if((*it).second.type == GL_FLOAT){
21                 GLfloat* p = (GLfloat *)((*it).second.data);
22                 if(p) delete[] p;
23             } else if((*it).second.type == GL_SHORT){
24                 GLshort* p = (GLshort *)((*it).second.data);
25                 if(p) delete[] p;
26             }
27         }
28     }
29 }
30 
allocArr(unsigned int size,GLenum type)31 void GLESConversionArrays::allocArr(unsigned int size,GLenum type){
32     if(type == GL_FIXED){
33         m_arrays[m_current].data = new GLfloat[size];
34         m_arrays[m_current].type = GL_FLOAT;
35     } else if(type == GL_BYTE){
36         m_arrays[m_current].data = new GLshort[size];
37         m_arrays[m_current].type = GL_SHORT;
38     }
39     m_arrays[m_current].stride = 0;
40     m_arrays[m_current].allocated = true;
41 }
42 
setArr(void * data,unsigned int stride,GLenum type)43 void GLESConversionArrays::setArr(void* data,unsigned int stride,GLenum type){
44    m_arrays[m_current].type = type;
45    m_arrays[m_current].data = data;
46    m_arrays[m_current].stride = stride;
47    m_arrays[m_current].allocated = false;
48 }
49 
getCurrentData()50 void* GLESConversionArrays::getCurrentData(){
51     return m_arrays[m_current].data;
52 }
53 
getCurrentArray()54 ArrayData& GLESConversionArrays::getCurrentArray(){
55     return m_arrays[m_current];
56 }
57 
getCurrentIndex()58 unsigned int GLESConversionArrays::getCurrentIndex(){
59     return m_current;
60 }
61 
operator [](int i)62 ArrayData& GLESConversionArrays::operator[](int i){
63     return m_arrays[i];
64 }
65 
operator ++()66 void GLESConversionArrays::operator++(){
67     m_current++;
68 }
69 
70 GLDispatch     GLEScontext::s_glDispatch;
71 android::Mutex GLEScontext::s_lock;
72 std::string*   GLEScontext::s_glExtensions= NULL;
73 GLSupport      GLEScontext::s_glSupport;
74 
Version()75 Version::Version():m_major(0),
76                    m_minor(0),
77                    m_release(0){};
78 
Version(int major,int minor,int release)79 Version::Version(int major,int minor,int release):m_major(major),
80                                                   m_minor(minor),
81                                                   m_release(release){};
82 
Version(const Version & ver)83 Version::Version(const Version& ver):m_major(ver.m_major),
84                                      m_minor(ver.m_minor),
85                                      m_release(ver.m_release){}
86 
Version(const char * versionString)87 Version::Version(const char* versionString){
88     m_release = 0;
89     if((!versionString) ||
90       ((!(sscanf(versionString,"%d.%d"   ,&m_major,&m_minor) == 2)) &&
91        (!(sscanf(versionString,"%d.%d.%d",&m_major,&m_minor,&m_release) == 3)))){
92         m_major = m_minor = 0; // the version is not in the right format
93     }
94 }
95 
operator =(const Version & ver)96 Version& Version::operator=(const Version& ver){
97     m_major   = ver.m_major;
98     m_minor   = ver.m_minor;
99     m_release = ver.m_release;
100     return *this;
101 }
102 
operator <(const Version & ver) const103 bool Version::operator<(const Version& ver) const{
104     if(m_major < ver.m_major) return true;
105     if(m_major == ver.m_major){
106         if(m_minor < ver.m_minor) return true;
107         if(m_minor == ver.m_minor){
108            return m_release < ver.m_release;
109         }
110     }
111     return false;
112 }
113 
init()114 void GLEScontext::init() {
115 
116     if (!s_glExtensions) {
117         initCapsLocked(s_glDispatch.glGetString(GL_EXTENSIONS));
118         s_glExtensions = new std::string("");
119     }
120 
121     if (!m_initialized) {
122         initExtensionString();
123 
124         int maxTexUnits = getMaxTexUnits();
125         m_texState = new textureUnitState[maxTexUnits];
126         for (int i=0;i<maxTexUnits;++i) {
127             for (int j=0;j<NUM_TEXTURE_TARGETS;++j)
128             {
129                 m_texState[i][j].texture = 0;
130                 m_texState[i][j].enabled = GL_FALSE;
131             }
132         }
133     }
134 }
135 
GLEScontext()136 GLEScontext::GLEScontext():
137                            m_initialized(false)    ,
138                            m_activeTexture(0)      ,
139                            m_unpackAlignment(4)    ,
140                            m_glError(GL_NO_ERROR)  ,
141                            m_texState(0)          ,
142                            m_arrayBuffer(0)        ,
143                            m_elementBuffer(0),
144                            m_renderbuffer(0),
145                            m_framebuffer(0)
146 {
147 };
148 
getGLerror()149 GLenum GLEScontext::getGLerror() {
150     return m_glError;
151 }
152 
setGLerror(GLenum err)153 void GLEScontext::setGLerror(GLenum err) {
154     m_glError = err;
155 }
156 
setActiveTexture(GLenum tex)157 void GLEScontext::setActiveTexture(GLenum tex) {
158    m_activeTexture = tex - GL_TEXTURE0;
159 }
160 
~GLEScontext()161 GLEScontext::~GLEScontext() {
162     for(ArraysMap::iterator it = m_map.begin(); it != m_map.end();it++) {
163         GLESpointer* p = (*it).second;
164         if(p) {
165             delete p;
166         }
167     }
168     delete[] m_texState;
169     m_texState = NULL;
170 }
171 
setPointer(GLenum arrType,GLint size,GLenum type,GLsizei stride,const GLvoid * data,bool normalize)172 const GLvoid* GLEScontext::setPointer(GLenum arrType,GLint size,GLenum type,GLsizei stride,const GLvoid* data,bool normalize) {
173     GLuint bufferName = m_arrayBuffer;
174     if(bufferName) {
175         unsigned int offset = reinterpret_cast<unsigned int>(data);
176         GLESbuffer* vbo = static_cast<GLESbuffer*>(m_shareGroup->getObjectData(VERTEXBUFFER,bufferName).Ptr());
177         m_map[arrType]->setBuffer(size,type,stride,vbo,bufferName,offset,normalize);
178         return  static_cast<const unsigned char*>(vbo->getData()) +  offset;
179     }
180     m_map[arrType]->setArray(size,type,stride,data,normalize);
181     return data;
182 }
183 
enableArr(GLenum arr,bool enable)184 void GLEScontext::enableArr(GLenum arr,bool enable) {
185     m_map[arr]->enable(enable);
186 }
187 
isArrEnabled(GLenum arr)188 bool GLEScontext::isArrEnabled(GLenum arr) {
189     return m_map[arr]->isEnable();
190 }
191 
getPointer(GLenum arrType)192 const GLESpointer* GLEScontext::getPointer(GLenum arrType) {
193     if (m_map.find(arrType) != m_map.end()) return m_map[arrType];
194     return NULL;
195 }
196 
convertFixedDirectLoop(const char * dataIn,unsigned int strideIn,void * dataOut,unsigned int nBytes,unsigned int strideOut,int attribSize)197 static void convertFixedDirectLoop(const char* dataIn,unsigned int strideIn,void* dataOut,unsigned int nBytes,unsigned int strideOut,int attribSize) {
198 
199     for(unsigned int i = 0; i < nBytes;i+=strideOut) {
200         const GLfixed* fixed_data = (const GLfixed *)dataIn;
201         //filling attrib
202         for(int j=0;j<attribSize;j++) {
203             reinterpret_cast<GLfloat*>(&static_cast<unsigned char*>(dataOut)[i])[j] = X2F(fixed_data[j]);
204         }
205         dataIn += strideIn;
206     }
207 }
208 
convertFixedIndirectLoop(const char * dataIn,unsigned int strideIn,void * dataOut,GLsizei count,GLenum indices_type,const GLvoid * indices,unsigned int strideOut,int attribSize)209 static void convertFixedIndirectLoop(const char* dataIn,unsigned int strideIn,void* dataOut,GLsizei count,GLenum indices_type,const GLvoid* indices,unsigned int strideOut,int attribSize) {
210     for(int i = 0 ;i < count ;i++) {
211         unsigned short index = indices_type == GL_UNSIGNED_BYTE? ((GLubyte *)indices)[i]:
212                                                              ((GLushort *)indices)[i];
213         const GLfixed* fixed_data = (GLfixed *)(dataIn  + index*strideIn);
214         GLfloat* float_data = reinterpret_cast<GLfloat*>(static_cast<unsigned char*>(dataOut) + index*strideOut);
215 
216         for(int j=0;j<attribSize;j++) {
217             float_data[j] = X2F(fixed_data[j]);
218          }
219     }
220 }
221 
convertByteDirectLoop(const char * dataIn,unsigned int strideIn,void * dataOut,unsigned int nBytes,unsigned int strideOut,int attribSize)222 static void convertByteDirectLoop(const char* dataIn,unsigned int strideIn,void* dataOut,unsigned int nBytes,unsigned int strideOut,int attribSize) {
223 
224     for(unsigned int i = 0; i < nBytes;i+=strideOut) {
225         const GLbyte* byte_data = (const GLbyte *)dataIn;
226         //filling attrib
227         for(int j=0;j<attribSize;j++) {
228             reinterpret_cast<GLshort*>(&static_cast<unsigned char*>(dataOut)[i])[j] = B2S(byte_data[j]);
229         }
230         dataIn += strideIn;
231     }
232 }
233 
convertByteIndirectLoop(const char * dataIn,unsigned int strideIn,void * dataOut,GLsizei count,GLenum indices_type,const GLvoid * indices,unsigned int strideOut,int attribSize)234 static void convertByteIndirectLoop(const char* dataIn,unsigned int strideIn,void* dataOut,GLsizei count,GLenum indices_type,const GLvoid* indices,unsigned int strideOut,int attribSize) {
235     for(int i = 0 ;i < count ;i++) {
236         unsigned short index = indices_type == GL_UNSIGNED_BYTE? ((GLubyte *)indices)[i]:
237                                                              ((GLushort *)indices)[i];
238         const GLbyte* bytes_data = (GLbyte *)(dataIn  + index*strideIn);
239         GLshort* short_data = reinterpret_cast<GLshort*>(static_cast<unsigned char*>(dataOut) + index*strideOut);
240 
241         for(int j=0;j<attribSize;j++) {
242             short_data[j] = B2S(bytes_data[j]);
243          }
244     }
245 }
directToBytesRanges(GLint first,GLsizei count,GLESpointer * p,RangeList & list)246 static void directToBytesRanges(GLint first,GLsizei count,GLESpointer* p,RangeList& list) {
247 
248     int attribSize = p->getSize()*4; //4 is the sizeof GLfixed or GLfloat in bytes
249     int stride = p->getStride()?p->getStride():attribSize;
250     int start  = p->getBufferOffset()+first*attribSize;
251     if(!p->getStride()) {
252         list.addRange(Range(start,count*attribSize));
253     } else {
254         for(int i = 0 ;i < count; i++,start+=stride) {
255             list.addRange(Range(start,attribSize));
256         }
257     }
258 }
259 
indirectToBytesRanges(const GLvoid * indices,GLenum indices_type,GLsizei count,GLESpointer * p,RangeList & list)260 static void indirectToBytesRanges(const GLvoid* indices,GLenum indices_type,GLsizei count,GLESpointer* p,RangeList& list) {
261 
262     int attribSize = p->getSize() * 4; //4 is the sizeof GLfixed or GLfloat in bytes
263     int stride = p->getStride()?p->getStride():attribSize;
264     int start  = p->getBufferOffset();
265     for(int i=0 ; i < count; i++) {
266         GLushort index = (indices_type == GL_UNSIGNED_SHORT?
267                          static_cast<const GLushort*>(indices)[i]:
268                          static_cast<const GLubyte*>(indices)[i]);
269         list.addRange(Range(start+index*stride,attribSize));
270 
271     }
272 }
273 
bytesRangesToIndices(RangeList & ranges,GLESpointer * p,GLushort * indices)274 int bytesRangesToIndices(RangeList& ranges,GLESpointer* p,GLushort* indices) {
275 
276     int attribSize = p->getSize() * 4; //4 is the sizeof GLfixed or GLfloat in bytes
277     int stride = p->getStride()?p->getStride():attribSize;
278     int offset = p->getBufferOffset();
279 
280     int n = 0;
281     for(int i=0;i<ranges.size();i++) {
282         int startIndex = (ranges[i].getStart() - offset) / stride;
283         int nElements = ranges[i].getSize()/attribSize;
284         for(int j=0;j<nElements;j++) {
285             indices[n++] = startIndex+j;
286         }
287     }
288     return n;
289 }
290 
convertDirect(GLESConversionArrays & cArrs,GLint first,GLsizei count,GLenum array_id,GLESpointer * p)291 void GLEScontext::convertDirect(GLESConversionArrays& cArrs,GLint first,GLsizei count,GLenum array_id,GLESpointer* p) {
292 
293     GLenum type    = p->getType();
294     int attribSize = p->getSize();
295     unsigned int size = attribSize*count + first;
296     unsigned int bytes = type == GL_FIXED ? sizeof(GLfixed):sizeof(GLbyte);
297     cArrs.allocArr(size,type);
298     int stride = p->getStride()?p->getStride():bytes*attribSize;
299     const char* data = (const char*)p->getArrayData() + (first*stride);
300 
301     if(type == GL_FIXED) {
302         convertFixedDirectLoop(data,stride,cArrs.getCurrentData(),size*sizeof(GLfloat),attribSize*sizeof(GLfloat),attribSize);
303     } else if(type == GL_BYTE) {
304         convertByteDirectLoop(data,stride,cArrs.getCurrentData(),size*sizeof(GLshort),attribSize*sizeof(GLshort),attribSize);
305     }
306 }
307 
convertDirectVBO(GLESConversionArrays & cArrs,GLint first,GLsizei count,GLenum array_id,GLESpointer * p)308 void GLEScontext::convertDirectVBO(GLESConversionArrays& cArrs,GLint first,GLsizei count,GLenum array_id,GLESpointer* p) {
309 
310     RangeList ranges;
311     RangeList conversions;
312     GLushort* indices = NULL;
313     GLenum type    = p->getType();
314     int attribSize = p->getSize();
315     int stride = p->getStride()?p->getStride():sizeof(GLfixed)*attribSize;
316     unsigned int size = p->getStride()?p->getStride()*count:attribSize*count*sizeof(GLfixed);
317     char* data = (char*)p->getBufferData() + (first*stride);
318 
319     if(p->bufferNeedConversion()) {
320         directToBytesRanges(first,count,p,ranges); //converting indices range to buffer bytes ranges by offset
321         p->getBufferConversions(ranges,conversions); // getting from the buffer the relevant ranges that still needs to be converted
322 
323         if(conversions.size()) { // there are some elements to convert
324            indices = new GLushort[count];
325            int nIndices = bytesRangesToIndices(conversions,p,indices); //converting bytes ranges by offset to indices in this array
326            convertFixedIndirectLoop(data,stride,data,nIndices,GL_UNSIGNED_SHORT,indices,stride,attribSize);
327         }
328     }
329     if(indices) delete[] indices;
330     cArrs.setArr(data,p->getStride(),GL_FLOAT);
331 }
332 
findMaxIndex(GLsizei count,GLenum type,const GLvoid * indices)333 int GLEScontext::findMaxIndex(GLsizei count,GLenum type,const GLvoid* indices) {
334     //finding max index
335     int max = 0;
336     if(type == GL_UNSIGNED_BYTE) {
337         GLubyte*  b_indices  =(GLubyte *)indices;
338         for(int i=0;i<count;i++) {
339             if(b_indices[i] > max) max = b_indices[i];
340         }
341     } else {
342         GLushort* us_indices =(GLushort *)indices;
343         for(int i=0;i<count;i++) {
344             if(us_indices[i] > max) max = us_indices[i];
345         }
346     }
347     return max;
348 }
349 
convertIndirect(GLESConversionArrays & cArrs,GLsizei count,GLenum indices_type,const GLvoid * indices,GLenum array_id,GLESpointer * p)350 void GLEScontext::convertIndirect(GLESConversionArrays& cArrs,GLsizei count,GLenum indices_type,const GLvoid* indices,GLenum array_id,GLESpointer* p) {
351     GLenum type    = p->getType();
352     int maxElements = findMaxIndex(count,type,indices) + 1;
353 
354     int attribSize = p->getSize();
355     int size = attribSize * maxElements;
356     unsigned int bytes = type == GL_FIXED ? sizeof(GLfixed):sizeof(GLbyte);
357     cArrs.allocArr(size,type);
358     int stride = p->getStride()?p->getStride():bytes*attribSize;
359 
360     const char* data = (const char*)p->getArrayData();
361     if(type == GL_FIXED) {
362         convertFixedIndirectLoop(data,stride,cArrs.getCurrentData(),count,indices_type,indices,attribSize*sizeof(GLfloat),attribSize);
363     } else if(type == GL_BYTE){
364         convertByteIndirectLoop(data,stride,cArrs.getCurrentData(),count,indices_type,indices,attribSize*sizeof(GLshort),attribSize);
365     }
366 }
367 
convertIndirectVBO(GLESConversionArrays & cArrs,GLsizei count,GLenum indices_type,const GLvoid * indices,GLenum array_id,GLESpointer * p)368 void GLEScontext::convertIndirectVBO(GLESConversionArrays& cArrs,GLsizei count,GLenum indices_type,const GLvoid* indices,GLenum array_id,GLESpointer* p) {
369     RangeList ranges;
370     RangeList conversions;
371     GLushort* conversionIndices = NULL;
372     GLenum type    = p->getType();
373     int attribSize = p->getSize();
374     int stride = p->getStride()?p->getStride():sizeof(GLfixed)*attribSize;
375     char* data = static_cast<char*>(p->getBufferData());
376     if(p->bufferNeedConversion()) {
377         indirectToBytesRanges(indices,indices_type,count,p,ranges); //converting indices range to buffer bytes ranges by offset
378         p->getBufferConversions(ranges,conversions); // getting from the buffer the relevant ranges that still needs to be converted
379         if(conversions.size()) { // there are some elements to convert
380             conversionIndices = new GLushort[count];
381             int nIndices = bytesRangesToIndices(conversions,p,conversionIndices); //converting bytes ranges by offset to indices in this array
382             convertFixedIndirectLoop(data,stride,data,nIndices,GL_UNSIGNED_SHORT,conversionIndices,stride,attribSize);
383         }
384     }
385     if(conversionIndices) delete[] conversionIndices;
386     cArrs.setArr(data,p->getStride(),GL_FLOAT);
387 }
388 
389 
390 
bindBuffer(GLenum target,GLuint buffer)391 void GLEScontext::bindBuffer(GLenum target,GLuint buffer) {
392     if(target == GL_ARRAY_BUFFER) {
393         m_arrayBuffer = buffer;
394     } else {
395        m_elementBuffer = buffer;
396     }
397 }
398 
unbindBuffer(GLuint buffer)399 void GLEScontext::unbindBuffer(GLuint buffer) {
400     if(m_arrayBuffer == buffer)
401     {
402         m_arrayBuffer = 0;
403     }
404     if(m_elementBuffer == buffer)
405     {
406         m_elementBuffer = 0;
407     }
408 }
409 
410 //checks if any buffer is binded to target
isBindedBuffer(GLenum target)411 bool GLEScontext::isBindedBuffer(GLenum target) {
412     if(target == GL_ARRAY_BUFFER) {
413         return m_arrayBuffer != 0;
414     } else {
415         return m_elementBuffer != 0;
416     }
417 }
418 
getBuffer(GLenum target)419 GLuint GLEScontext::getBuffer(GLenum target) {
420     return target == GL_ARRAY_BUFFER ? m_arrayBuffer:m_elementBuffer;
421 }
422 
getBindedBuffer(GLenum target)423 GLvoid* GLEScontext::getBindedBuffer(GLenum target) {
424     GLuint bufferName = getBuffer(target);
425     if(!bufferName) return NULL;
426 
427     GLESbuffer* vbo = static_cast<GLESbuffer*>(m_shareGroup->getObjectData(VERTEXBUFFER,bufferName).Ptr());
428     return vbo->getData();
429 }
430 
getBufferSize(GLenum target,GLint * param)431 void GLEScontext::getBufferSize(GLenum target,GLint* param) {
432     GLuint bufferName = getBuffer(target);
433     GLESbuffer* vbo = static_cast<GLESbuffer*>(m_shareGroup->getObjectData(VERTEXBUFFER,bufferName).Ptr());
434     *param = vbo->getSize();
435 }
436 
getBufferUsage(GLenum target,GLint * param)437 void GLEScontext::getBufferUsage(GLenum target,GLint* param) {
438     GLuint bufferName = getBuffer(target);
439     GLESbuffer* vbo = static_cast<GLESbuffer*>(m_shareGroup->getObjectData(VERTEXBUFFER,bufferName).Ptr());
440     *param = vbo->getUsage();
441 }
442 
setBufferData(GLenum target,GLsizeiptr size,const GLvoid * data,GLenum usage)443 bool GLEScontext::setBufferData(GLenum target,GLsizeiptr size,const GLvoid* data,GLenum usage) {
444     GLuint bufferName = getBuffer(target);
445     if(!bufferName) return false;
446     GLESbuffer* vbo = static_cast<GLESbuffer*>(m_shareGroup->getObjectData(VERTEXBUFFER,bufferName).Ptr());
447     return vbo->setBuffer(size,usage,data);
448 }
449 
setBufferSubData(GLenum target,GLintptr offset,GLsizeiptr size,const GLvoid * data)450 bool GLEScontext::setBufferSubData(GLenum target,GLintptr offset,GLsizeiptr size,const GLvoid* data) {
451 
452     GLuint bufferName = getBuffer(target);
453     if(!bufferName) return false;
454     GLESbuffer* vbo = static_cast<GLESbuffer*>(m_shareGroup->getObjectData(VERTEXBUFFER,bufferName).Ptr());
455     return vbo->setSubBuffer(offset,size,data);
456 }
457 
getExtensionString()458 const char * GLEScontext::getExtensionString() {
459     const char * ret;
460     s_lock.lock();
461     if (s_glExtensions)
462         ret = s_glExtensions->c_str();
463     else
464         ret="";
465     s_lock.unlock();
466     return ret;
467 }
468 
getGlobalLock()469 void GLEScontext::getGlobalLock() {
470     s_lock.lock();
471 }
472 
releaseGlobalLock()473 void GLEScontext::releaseGlobalLock() {
474     s_lock.unlock();
475 }
476 
477 
initCapsLocked(const GLubyte * extensionString)478 void GLEScontext::initCapsLocked(const GLubyte * extensionString)
479 {
480     const char* cstring = (const char*)extensionString;
481 
482     s_glDispatch.glGetIntegerv(GL_MAX_VERTEX_ATTRIBS,&s_glSupport.maxVertexAttribs);
483     s_glDispatch.glGetIntegerv(GL_MAX_CLIP_PLANES,&s_glSupport.maxClipPlane);
484     s_glDispatch.glGetIntegerv(GL_MAX_LIGHTS,&s_glSupport.maxLights);
485     s_glDispatch.glGetIntegerv(GL_MAX_TEXTURE_SIZE,&s_glSupport.maxTexSize);
486     s_glDispatch.glGetIntegerv(GL_MAX_TEXTURE_UNITS,&s_glSupport.maxTexUnits);
487     s_glDispatch.glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS,&s_glSupport.maxTexImageUnits);
488     const GLubyte* glslVersion = s_glDispatch.glGetString(GL_SHADING_LANGUAGE_VERSION);
489     s_glSupport.glslVersion = Version((const  char*)(glslVersion));
490 
491     if (strstr(cstring,"GL_EXT_bgra ")!=NULL)
492         s_glSupport.GL_EXT_TEXTURE_FORMAT_BGRA8888 = true;
493 
494     if (strstr(cstring,"GL_EXT_framebuffer_object ")!=NULL)
495         s_glSupport.GL_EXT_FRAMEBUFFER_OBJECT = true;
496 
497     if (strstr(cstring,"GL_ARB_vertex_blend ")!=NULL)
498         s_glSupport.GL_ARB_VERTEX_BLEND = true;
499 
500     if (strstr(cstring,"GL_ARB_matrix_palette ")!=NULL)
501         s_glSupport.GL_ARB_MATRIX_PALETTE = true;
502 
503     if (strstr(cstring,"GL_EXT_packed_depth_stencil ")!=NULL )
504         s_glSupport.GL_EXT_PACKED_DEPTH_STENCIL = true;
505 
506     if (strstr(cstring,"GL_OES_read_format ")!=NULL)
507         s_glSupport.GL_OES_READ_FORMAT = true;
508 
509     if (strstr(cstring,"GL_ARB_half_float_pixel ")!=NULL)
510         s_glSupport.GL_ARB_HALF_FLOAT_PIXEL = true;
511 
512     if (strstr(cstring,"GL_NV_half_float ")!=NULL)
513         s_glSupport.GL_NV_HALF_FLOAT = true;
514 
515     if (strstr(cstring,"GL_ARB_half_float_vertex ")!=NULL)
516         s_glSupport.GL_ARB_HALF_FLOAT_VERTEX = true;
517 
518     if (strstr(cstring,"GL_SGIS_generate_mipmap ")!=NULL)
519         s_glSupport.GL_SGIS_GENERATE_MIPMAP = true;
520 
521     if (strstr(cstring,"GL_ARB_ES2_compatibility ")!=NULL)
522         s_glSupport.GL_ARB_ES2_COMPATIBILITY = true;
523 
524     if (strstr(cstring,"GL_OES_standard_derivatives ")!=NULL)
525         s_glSupport.GL_OES_STANDARD_DERIVATIVES = true;
526 
527 }
528 
isTextureUnitEnabled(GLenum unit)529 bool GLEScontext::isTextureUnitEnabled(GLenum unit) {
530     for (int i=0;i<NUM_TEXTURE_TARGETS;++i) {
531         if (m_texState[unit-GL_TEXTURE0][i].enabled)
532             return true;
533     }
534     return false;
535 }
536 
glGetBooleanv(GLenum pname,GLboolean * params)537 bool GLEScontext::glGetBooleanv(GLenum pname, GLboolean *params)
538 {
539     GLint iParam;
540 
541     if(glGetIntegerv(pname, &iParam))
542     {
543         *params = (iParam != 0);
544         return true;
545     }
546 
547     return false;
548 }
549 
glGetFixedv(GLenum pname,GLfixed * params)550 bool GLEScontext::glGetFixedv(GLenum pname, GLfixed *params)
551 {
552     bool result = false;
553     GLint numParams = 1;
554 
555     GLint* iParams = new GLint[numParams];
556     if (numParams>0 && glGetIntegerv(pname,iParams)) {
557         while(numParams >= 0)
558         {
559             params[numParams] = I2X(iParams[numParams]);
560             numParams--;
561         }
562         result = true;
563     }
564     delete [] iParams;
565 
566     return result;
567 }
568 
glGetFloatv(GLenum pname,GLfloat * params)569 bool GLEScontext::glGetFloatv(GLenum pname, GLfloat *params)
570 {
571     bool result = false;
572     GLint numParams = 1;
573 
574     GLint* iParams = new GLint[numParams];
575     if (numParams>0 && glGetIntegerv(pname,iParams)) {
576         while(numParams >= 0)
577         {
578             params[numParams] = (GLfloat)iParams[numParams];
579             numParams--;
580         }
581         result = true;
582     }
583     delete [] iParams;
584 
585     return result;
586 }
587 
glGetIntegerv(GLenum pname,GLint * params)588 bool GLEScontext::glGetIntegerv(GLenum pname, GLint *params)
589 {
590     switch(pname)
591     {
592         case GL_ARRAY_BUFFER_BINDING:
593             *params = m_arrayBuffer;
594             break;
595 
596         case GL_ELEMENT_ARRAY_BUFFER_BINDING:
597             *params = m_elementBuffer;
598             break;
599 
600         case GL_TEXTURE_BINDING_CUBE_MAP:
601             *params = m_texState[m_activeTexture][TEXTURE_CUBE_MAP].texture;
602             break;
603 
604         case GL_TEXTURE_BINDING_2D:
605             *params = m_texState[m_activeTexture][TEXTURE_2D].texture;
606             break;
607 
608         case GL_ACTIVE_TEXTURE:
609             *params = m_activeTexture+GL_TEXTURE0;
610             break;
611 
612         case GL_IMPLEMENTATION_COLOR_READ_TYPE_OES:
613             *params = GL_UNSIGNED_BYTE;
614             break;
615 
616         case GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES:
617             *params = GL_RGBA;
618             break;
619         default:
620             return false;
621     }
622 
623     return true;
624 }
625 
GLTextureTargetToLocal(GLenum target)626 TextureTarget GLEScontext::GLTextureTargetToLocal(GLenum target) {
627     TextureTarget value=TEXTURE_2D;
628     switch (target) {
629     case GL_TEXTURE_CUBE_MAP:
630     case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
631     case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
632     case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
633     case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
634     case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
635     case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
636         value = TEXTURE_CUBE_MAP;
637         break;
638     case GL_TEXTURE_2D:
639         value = TEXTURE_2D;
640         break;
641     }
642     return value;
643 }
644 
getBindedTexture(GLenum target)645 unsigned int GLEScontext::getBindedTexture(GLenum target) {
646     TextureTarget pos = GLTextureTargetToLocal(target);
647     return m_texState[m_activeTexture][pos].texture;
648 }
649 
getBindedTexture(GLenum unit,GLenum target)650 unsigned int GLEScontext::getBindedTexture(GLenum unit, GLenum target) {
651     TextureTarget pos = GLTextureTargetToLocal(target);
652     return m_texState[unit-GL_TEXTURE0][pos].texture;
653 }
654 
setBindedTexture(GLenum target,unsigned int tex)655 void GLEScontext::setBindedTexture(GLenum target, unsigned int tex) {
656     TextureTarget pos = GLTextureTargetToLocal(target);
657     m_texState[m_activeTexture][pos].texture = tex;
658 }
659 
setTextureEnabled(GLenum target,GLenum enable)660 void GLEScontext::setTextureEnabled(GLenum target, GLenum enable) {
661     TextureTarget pos = GLTextureTargetToLocal(target);
662     m_texState[m_activeTexture][pos].enabled = enable;
663 }
664 
665 #define INTERNAL_NAME(x) (x +0x100000000ll);
666 
getDefaultTextureName(GLenum target)667 ObjectLocalName GLEScontext::getDefaultTextureName(GLenum target) {
668     ObjectLocalName name = 0;
669     switch (GLTextureTargetToLocal(target)) {
670     case TEXTURE_2D:
671         name = INTERNAL_NAME(0);
672         break;
673     case TEXTURE_CUBE_MAP:
674         name = INTERNAL_NAME(1);
675         break;
676     default:
677         name = 0;
678         break;
679     }
680     return name;
681 }
682 
drawValidate(void)683 void GLEScontext::drawValidate(void)
684 {
685     if(m_framebuffer == 0)
686         return;
687 
688     ObjectDataPtr fbObj = m_shareGroup->getObjectData(FRAMEBUFFER,m_framebuffer);
689     if (fbObj.Ptr() == NULL)
690         return;
691 
692     FramebufferData *fbData = (FramebufferData *)fbObj.Ptr();
693 
694     fbData->validate(this);
695 }
696