From 772de2eddea9eb84f50464ea98988996603ae8c1 Mon Sep 17 00:00:00 2001 From: Amit Feller Date: Mon, 13 Jun 2011 07:56:14 +0300 Subject: [PATCH] opengl translator: extending ConversionArrays class inserting some of the logic which was scattered over some parts of the GLESContext class to be encpsulated inside the ConversionArrays so that the code will be more clea and organized. --- .../libs/Translator/GLES_CM/GLEScmContext.cpp | 61 ++++++++-------- .../libs/Translator/GLES_V2/GLESv2Context.cpp | 25 +++---- .../libs/Translator/GLcommon/GLEScontext.cpp | 71 ++++++++++++------- .../libs/Translator/GLcommon/GLESpointer.cpp | 4 ++ .../Translator/include/GLcommon/GLEScontext.h | 25 +++++-- .../Translator/include/GLcommon/GLESpointer.h | 1 + 6 files changed, 110 insertions(+), 77 deletions(-) diff --git a/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLEScmContext.cpp b/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLEScmContext.cpp index 69023c3bb..954fad485 100644 --- a/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLEScmContext.cpp +++ b/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLEScmContext.cpp @@ -84,25 +84,21 @@ void GLEScmContext::setupArr(const GLvoid* arr,GLenum arrayType,GLenum dataType, } -void GLEScmContext::setupArrayPointerHelper(GLESConversionArrays& fArrs,GLint first,GLsizei count,GLenum type,const GLvoid* indices,bool direct,GLenum array_id,GLESpointer* p){ +void GLEScmContext::setupArrayPointerHelper(GLESConversionArrays& cArrs,GLint first,GLsizei count,GLenum type,const GLvoid* indices,bool direct,GLenum array_id,GLESpointer* p){ unsigned int size = p->getSize(); - bool usingVBO = p->isVBO(); GLenum dataType = p->getType(); - if(needConvert(fArrs,first,count,type,indices,direct,p,array_id)){ + if(needConvert(cArrs,first,count,type,indices,direct,p,array_id)){ //conversion has occured - unsigned int convertedStride = (usingVBO && dataType != GL_BYTE) ? p->getStride() : 0; - const void* data = (usingVBO && dataType!= GL_BYTE) ? p->getBufferData() : fArrs.getCurrentData(); - dataType = (dataType == GL_FIXED) ? GL_FLOAT:GL_SHORT; - setupArr(data,array_id,dataType,size,convertedStride,fArrs.getCurrentIndex()); - ++fArrs; + ArrayData currentArr = cArrs.getCurrentArray(); + setupArr(currentArr.data,array_id,currentArr.type,size,currentArr.stride,cArrs.getCurrentIndex()); + ++cArrs; } else { - const void* data = usingVBO ? p->getBufferData() : p->getArrayData(); - setupArr(data,array_id,dataType,size,p->getStride()); + setupArr(p->getData(),array_id,dataType,size,p->getStride()); } } -void GLEScmContext::setupArraysPointers(GLESConversionArrays& fArrs,GLint first,GLsizei count,GLenum type,const GLvoid* indices,bool direct) { +void GLEScmContext::setupArraysPointers(GLESConversionArrays& cArrs,GLint first,GLsizei count,GLenum type,const GLvoid* indices,bool direct) { ArraysMap::iterator it; m_pointsIndex = -1; @@ -113,7 +109,7 @@ void GLEScmContext::setupArraysPointers(GLESConversionArrays& fArrs,GLint first, GLESpointer* p = (*it).second; if(!isArrEnabled(array_id)) continue; if(array_id == GL_TEXTURE_COORD_ARRAY) continue; //handling textures later - setupArrayPointerHelper(fArrs,first,count,type,indices,direct,array_id,p); + setupArrayPointerHelper(cArrs,first,count,type,indices,direct,array_id,p); } unsigned int activeTexture = m_clientActiveTexture + GL_TEXTURE0; @@ -132,7 +128,7 @@ void GLEScmContext::setupArraysPointers(GLESConversionArrays& fArrs,GLint first, GLenum array_id = GL_TEXTURE_COORD_ARRAY; GLESpointer* p = m_map[array_id]; if(!isArrEnabled(array_id)) continue; - setupArrayPointerHelper(fArrs,first,count,type,indices,direct,array_id,p); + setupArrayPointerHelper(cArrs,first,count,type,indices,direct,array_id,p); } setClientActiveTexture(activeTexture); @@ -164,19 +160,22 @@ void GLEScmContext::drawPoints(PointSizeIndices* points) { if(indices) delete [] indices; } -void GLEScmContext::drawPointsData(GLESConversionArrays& fArrs,GLint first,GLsizei count,GLenum type,const GLvoid* indices_in,bool isElemsDraw) { - const GLfloat *pointsArr = NULL; - int stride = 0; //steps in GLfloats - bool usingVBO = isBindedBuffer(GL_ARRAY_BUFFER); +void GLEScmContext::drawPointsData(GLESConversionArrays& cArrs,GLint first,GLsizei count,GLenum type,const GLvoid* indices_in,bool isElemsDraw) { + const char *pointsArr = NULL; + int stride = 0; + GLESpointer* p = m_map[GL_POINT_SIZE_ARRAY_OES]; //choosing the right points sizes array source - if(m_pointsIndex >= 0 && !usingVBO) { //point size array was converted - pointsArr= (const GLfloat*)fArrs[m_pointsIndex]; - stride = 1; + if(m_pointsIndex >= 0) { //point size array was converted + pointsArr = (const char*)(cArrs[m_pointsIndex].data); + stride = cArrs[m_pointsIndex].stride; } else { - GLESpointer* p = m_map[GL_POINT_SIZE_ARRAY_OES]; - pointsArr = static_cast(usingVBO ? p->getBufferData():p->getArrayData()); - stride = p->getStride()?p->getStride()/sizeof(GLfloat):1; + pointsArr = static_cast(p->getData()); + stride = p->getStride(); + } + + if(stride == 0){ + stride = sizeof(GLfloat); } //filling arrays before sorting them @@ -186,11 +185,13 @@ void GLEScmContext::drawPointsData(GLESConversionArrays& fArrs,GLint first,GLsi GLushort index = (type == GL_UNSIGNED_SHORT? static_cast(indices_in)[i]: static_cast(indices_in)[i]); - points[pointsArr[index*stride]].push_back(index); + GLfloat pSize = *((GLfloat*)(pointsArr+(index*stride))); + points[pSize].push_back(index); } } else { for(int i=0; i< count; i++) { - points[pointsArr[first+i*stride]].push_back(i+first); + GLfloat pSize = *((GLfloat*)(pointsArr+(first+i*stride))); + points[pSize].push_back(i+first); } } drawPoints(&points); @@ -204,7 +205,7 @@ void GLEScmContext::drawPointsElems(GLESConversionArrays& arrs,GLsizei count,GLe drawPointsData(arrs,0,count,type,indices_in,true); } -bool GLEScmContext::needConvert(GLESConversionArrays& fArrs,GLint first,GLsizei count,GLenum type,const GLvoid* indices,bool direct,GLESpointer* p,GLenum array_id) { +bool GLEScmContext::needConvert(GLESConversionArrays& cArrs,GLint first,GLsizei count,GLenum type,const GLvoid* indices,bool direct,GLESpointer* p,GLenum array_id) { bool usingVBO = p->isVBO(); GLenum arrType = p->getType(); @@ -225,15 +226,15 @@ bool GLEScmContext::needConvert(GLESConversionArrays& fArrs,GLint first,GLsizei if(!usingVBO || byteVBO) { if (direct) { - convertDirect(fArrs,first,count,array_id,p); + convertDirect(cArrs,first,count,array_id,p); } else { - convertIndirect(fArrs,count,type,indices,array_id,p); + convertIndirect(cArrs,count,type,indices,array_id,p); } } else { if (direct) { - convertDirectVBO(first,count,array_id,p) ; + convertDirectVBO(cArrs,first,count,array_id,p) ; } else { - convertIndirectVBO(count,type,indices,array_id,p); + convertIndirectVBO(cArrs,count,type,indices,array_id,p); } } return true; diff --git a/tools/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Context.cpp b/tools/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Context.cpp index e8dfc3798..17dd0497a 100644 --- a/tools/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Context.cpp +++ b/tools/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Context.cpp @@ -32,7 +32,7 @@ void GLESv2Context::init() { GLESv2Context::GLESv2Context():GLEScontext(){}; -void GLESv2Context::setupArraysPointers(GLESConversionArrays& fArrs,GLint first,GLsizei count,GLenum type,const GLvoid* indices,bool direct) { +void GLESv2Context::setupArraysPointers(GLESConversionArrays& cArrs,GLint first,GLsizei count,GLenum type,const GLvoid* indices,bool direct) { ArraysMap::iterator it; //going over all clients arrays Pointers @@ -42,17 +42,14 @@ void GLESv2Context::setupArraysPointers(GLESConversionArrays& fArrs,GLint first, if(!isArrEnabled(array_id)) continue; unsigned int size = p->getSize(); - bool usingVBO = p->isVBO(); - if(needConvert(fArrs,first,count,type,indices,direct,p,array_id)){ + if(needConvert(cArrs,first,count,type,indices,direct,p,array_id)){ //conversion has occured - unsigned int convertedStride = usingVBO ? p->getStride() : 0; - const void* data = usingVBO ? p->getBufferData() : fArrs.getCurrentData(); - setupArr(data,array_id,GL_FLOAT,size,convertedStride); - ++fArrs; + ArrayData currentArr = cArrs.getCurrentArray(); + setupArr(currentArr.data,array_id,currentArr.type,size,currentArr.stride); + ++cArrs; } else { - const void* data = usingVBO ? p->getBufferData() : p->getArrayData(); - setupArr(data,array_id,p->getType(),size,p->getStride()); + setupArr(p->getData(),array_id,p->getType(),size,p->getStride()); } } } @@ -63,7 +60,7 @@ void GLESv2Context::setupArr(const GLvoid* arr,GLenum arrayType,GLenum dataType, s_glDispatch.glVertexAttribPointer(arrayType,size,dataType,GL_FALSE,stride,arr); } -bool GLESv2Context::needConvert(GLESConversionArrays& fArrs,GLint first,GLsizei count,GLenum type,const GLvoid* indices,bool direct,GLESpointer* p,GLenum array_id) { +bool GLESv2Context::needConvert(GLESConversionArrays& cArrs,GLint first,GLsizei count,GLenum type,const GLvoid* indices,bool direct,GLESpointer* p,GLenum array_id) { bool usingVBO = p->isVBO(); GLenum arrType = p->getType(); @@ -75,15 +72,15 @@ bool GLESv2Context::needConvert(GLESConversionArrays& fArrs,GLint first,GLsizei if(!usingVBO) { if (direct) { - convertDirect(fArrs,first,count,array_id,p); + convertDirect(cArrs,first,count,array_id,p); } else { - convertIndirect(fArrs,count,type,indices,array_id,p); + convertIndirect(cArrs,count,type,indices,array_id,p); } } else { if (direct) { - convertDirectVBO(first,count,array_id,p) ; + convertDirectVBO(cArrs,first,count,array_id,p) ; } else { - convertIndirectVBO(count,type,indices,array_id,p); + convertIndirectVBO(cArrs,count,type,indices,array_id,p); } } return true; diff --git a/tools/emulator/opengl/host/libs/Translator/GLcommon/GLEScontext.cpp b/tools/emulator/opengl/host/libs/Translator/GLcommon/GLEScontext.cpp index 5740b6cf3..72089d212 100644 --- a/tools/emulator/opengl/host/libs/Translator/GLcommon/GLEScontext.cpp +++ b/tools/emulator/opengl/host/libs/Translator/GLcommon/GLEScontext.cpp @@ -11,37 +11,52 @@ static void convertByteDirectLoop(const char* dataIn,unsigned int strideIn,void* static void convertByteIndirectLoop(const char* dataIn,unsigned int strideIn,void* dataOut,GLsizei count,GLenum indices_type,const GLvoid* indices,unsigned int strideOut,int attribSize); GLESConversionArrays::~GLESConversionArrays() { - for(std::map >::iterator it = m_arrays.begin(); it != m_arrays.end();it++) { - if((*it).second.first == GL_FLOAT){ - GLfloat* p = (GLfloat *)((*it).second.second); - if(p) delete[] p; - } else if((*it).second.first == GL_SHORT){ - GLshort* p = (GLshort *)((*it).second.second); - if(p) delete[] p; + for(std::map::iterator it = m_arrays.begin(); it != m_arrays.end();it++) { + if((*it).second.allocated){ + if((*it).second.type == GL_FLOAT){ + GLfloat* p = (GLfloat *)((*it).second.data); + if(p) delete[] p; + } else if((*it).second.type == GL_SHORT){ + GLshort* p = (GLshort *)((*it).second.data); + if(p) delete[] p; + } } } } -void GLESConversionArrays::alloc(unsigned int size,GLenum type){ +void GLESConversionArrays::allocArr(unsigned int size,GLenum type){ if(type == GL_FIXED){ - m_arrays[m_current].second = new GLfloat[size]; - m_arrays[m_current].first = GL_FLOAT; + m_arrays[m_current].data = new GLfloat[size]; + m_arrays[m_current].type = GL_FLOAT; } else if(type == GL_BYTE){ - m_arrays[m_current].second = new GLshort[size]; - m_arrays[m_current].first = GL_SHORT; + m_arrays[m_current].data = new GLshort[size]; + m_arrays[m_current].type = GL_SHORT; } + m_arrays[m_current].stride = 0; + m_arrays[m_current].allocated = true; +} + +void GLESConversionArrays::setArr(void* data,unsigned int stride,GLenum type){ + m_arrays[m_current].type = type; + m_arrays[m_current].data = data; + m_arrays[m_current].stride = stride; + m_arrays[m_current].allocated = false; } void* GLESConversionArrays::getCurrentData(){ - return m_arrays[m_current].second; + return m_arrays[m_current].data; +} + +ArrayData& GLESConversionArrays::getCurrentArray(){ + return m_arrays[m_current]; } unsigned int GLESConversionArrays::getCurrentIndex(){ return m_current; } -void* GLESConversionArrays::operator[](int i){ - return m_arrays[i].second; +ArrayData& GLESConversionArrays::operator[](int i){ + return m_arrays[i]; } void GLESConversionArrays::operator++(){ @@ -108,7 +123,7 @@ void GLEScontext::init() { m_tex2DBind[i].texture = 0; for (int j=0;jgetType(); int attribSize = p->getSize(); unsigned int size = attribSize*count + first; unsigned int bytes = type == GL_FIXED ? sizeof(GLfixed):sizeof(GLbyte); - fArrs.alloc(size,type); + cArrs.allocArr(size,type); int stride = p->getStride()?p->getStride():bytes*attribSize; const char* data = (const char*)p->getArrayData() + (first*stride); if(type == GL_FIXED) { - convertFixedDirectLoop(data,stride,fArrs.getCurrentData(),size*sizeof(GLfloat),attribSize*sizeof(GLfloat),attribSize); + convertFixedDirectLoop(data,stride,cArrs.getCurrentData(),size*sizeof(GLfloat),attribSize*sizeof(GLfloat),attribSize); } else if(type == GL_BYTE) { - convertByteDirectLoop(data,stride,fArrs.getCurrentData(),size*sizeof(GLshort),attribSize*sizeof(GLshort),attribSize); + convertByteDirectLoop(data,stride,cArrs.getCurrentData(),size*sizeof(GLshort),attribSize*sizeof(GLshort),attribSize); } } -void GLEScontext::convertDirectVBO(GLint first,GLsizei count,GLenum array_id,GLESpointer* p) { +void GLEScontext::convertDirectVBO(GLESConversionArrays& cArrs,GLint first,GLsizei count,GLenum array_id,GLESpointer* p) { RangeList ranges; RangeList conversions; @@ -301,6 +316,7 @@ void GLEScontext::convertDirectVBO(GLint first,GLsizei count,GLenum array_id,GLE } } if(indices) delete[] indices; + cArrs.setArr(data,p->getStride(),GL_FLOAT); } static int findMaxIndex(GLsizei count,GLenum type,const GLvoid* indices) { @@ -320,25 +336,25 @@ static int findMaxIndex(GLsizei count,GLenum type,const GLvoid* indices) { return max; } -void GLEScontext::convertIndirect(GLESConversionArrays& fArrs,GLsizei count,GLenum indices_type,const GLvoid* indices,GLenum array_id,GLESpointer* p) { +void GLEScontext::convertIndirect(GLESConversionArrays& cArrs,GLsizei count,GLenum indices_type,const GLvoid* indices,GLenum array_id,GLESpointer* p) { GLenum type = p->getType(); int maxElements = findMaxIndex(count,type,indices) + 1; int attribSize = p->getSize(); int size = attribSize * maxElements; unsigned int bytes = type == GL_FIXED ? sizeof(GLfixed):sizeof(GLbyte); - fArrs.alloc(size,type); + cArrs.allocArr(size,type); int stride = p->getStride()?p->getStride():bytes*attribSize; const char* data = (const char*)p->getArrayData(); if(type == GL_FIXED) { - convertFixedIndirectLoop(data,stride,fArrs.getCurrentData(),count,indices_type,indices,attribSize*sizeof(GLfloat),attribSize); + convertFixedIndirectLoop(data,stride,cArrs.getCurrentData(),count,indices_type,indices,attribSize*sizeof(GLfloat),attribSize); } else if(type == GL_BYTE){ - convertByteIndirectLoop(data,stride,fArrs.getCurrentData(),count,indices_type,indices,attribSize*sizeof(GLshort),attribSize); + convertByteIndirectLoop(data,stride,cArrs.getCurrentData(),count,indices_type,indices,attribSize*sizeof(GLshort),attribSize); } } -void GLEScontext::convertIndirectVBO(GLsizei count,GLenum indices_type,const GLvoid* indices,GLenum array_id,GLESpointer* p) { +void GLEScontext::convertIndirectVBO(GLESConversionArrays& cArrs,GLsizei count,GLenum indices_type,const GLvoid* indices,GLenum array_id,GLESpointer* p) { RangeList ranges; RangeList conversions; GLushort* conversionIndices = NULL; @@ -356,6 +372,7 @@ void GLEScontext::convertIndirectVBO(GLsizei count,GLenum indices_type,const GLv } } if(conversionIndices) delete[] conversionIndices; + cArrs.setArr(data,p->getStride(),GL_FLOAT); } @@ -449,7 +466,7 @@ void GLEScontext::releaseGlobalLock() { void GLEScontext::initCapsLocked(const GLubyte * extensionString) { - const char* cstring = (const char*)extensionString; + const char* cstring = (const char*)extensionString; s_glDispatch.glGetIntegerv(GL_MAX_VERTEX_ATTRIBS,&s_glSupport.maxVertexAttribs); s_glDispatch.glGetIntegerv(GL_MAX_CLIP_PLANES,&s_glSupport.maxClipPlane); diff --git a/tools/emulator/opengl/host/libs/Translator/GLcommon/GLESpointer.cpp b/tools/emulator/opengl/host/libs/Translator/GLcommon/GLESpointer.cpp index 1d2a26d25..a68f8ad41 100644 --- a/tools/emulator/opengl/host/libs/Translator/GLcommon/GLESpointer.cpp +++ b/tools/emulator/opengl/host/libs/Translator/GLcommon/GLESpointer.cpp @@ -47,6 +47,10 @@ GLvoid* GLESpointer::getBufferData() const { return m_buffer ? static_cast(m_buffer->getData()) + m_buffOffset : NULL; } +const GLvoid* GLESpointer::getData() const{ + return m_isVBO ? getBufferData():getArrayData(); +} + void GLESpointer::redirectPointerData(){ m_data = getBufferData(); } diff --git a/tools/emulator/opengl/host/libs/Translator/include/GLcommon/GLEScontext.h b/tools/emulator/opengl/host/libs/Translator/include/GLcommon/GLEScontext.h index d43dddbab..2b48d14e1 100644 --- a/tools/emulator/opengl/host/libs/Translator/include/GLcommon/GLEScontext.h +++ b/tools/emulator/opengl/host/libs/Translator/include/GLcommon/GLEScontext.h @@ -6,7 +6,6 @@ #include "objectNameManager.h" #include #include -#include typedef std::map ArraysMap; @@ -62,19 +61,33 @@ struct GLSupport { }; +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 alloc(unsigned int size,GLenum type); - void* operator[](int i); + 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 > m_arrays; + std::map m_arrays; unsigned int m_current; }; @@ -125,9 +138,9 @@ public: protected: 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(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(GLsizei count,GLenum indices_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 android::Mutex s_lock; diff --git a/tools/emulator/opengl/host/libs/Translator/include/GLcommon/GLESpointer.h b/tools/emulator/opengl/host/libs/Translator/include/GLcommon/GLESpointer.h index d5d6b1cb0..7f3b3969f 100644 --- a/tools/emulator/opengl/host/libs/Translator/include/GLcommon/GLESpointer.h +++ b/tools/emulator/opengl/host/libs/Translator/include/GLcommon/GLESpointer.h @@ -29,6 +29,7 @@ public: GLsizei getStride() const; const GLvoid* getArrayData() const; GLvoid* getBufferData() const; + const GLvoid* getData() const; unsigned int getBufferOffset() const; void redirectPointerData(); void getBufferConversions(const RangeList& rl,RangeList& rlOut);