integrating objectNameManger into GLES implementation
Change-Id: Icda250f9e9d3af15a2d7c214136b777833d5596d
diff --git a/tools/emulator/opengl/host/libs/Translator/EGL/EglImp.cpp b/tools/emulator/opengl/host/libs/Translator/EGL/EglImp.cpp
index 8931811..94e3cec 100644
--- a/tools/emulator/opengl/host/libs/Translator/EGL/EglImp.cpp
+++ b/tools/emulator/opengl/host/libs/Translator/EGL/EglImp.cpp
@@ -443,7 +443,7 @@
if(!EglValidate::noAttribs(attrib_list)) { //there are attribs
int i = 0 ;
while(attrib_list[i] != EGL_NONE) {
- if(!pbSurface.Ptr()->setAttrib(attrib_list[i],attrib_list[i+1])) {
+ if(!pbSurface->setAttrib(attrib_list[i],attrib_list[i+1])) {
RETURN_ERROR(EGL_NO_SURFACE,EGL_BAD_ATTRIBUTE);
}
i+=2;
@@ -502,8 +502,8 @@
ThreadInfo* thread = getThreadInfo();
EglContext* currCtx = static_cast<EglContext*>(thread->eglContext);
if(currCtx && !currCtx->usingSurface(surface)){
- if(surface.Ptr()->type() == EglSurface::PBUFFER) {
- EglOS::releasePbuffer(dpy->nativeType(),reinterpret_cast<EGLNativePbufferType>(surface.Ptr()->native()));
+ if(surface->type() == EglSurface::PBUFFER) {
+ EglOS::releasePbuffer(dpy->nativeType(),reinterpret_cast<EGLNativePbufferType>(surface->native()));
return true;
}
}
@@ -516,7 +516,7 @@
RETURN_ERROR(EGL_FALSE,EGL_BAD_SURFACE);
}
- srfc.Ptr()->destroy(); //mark surface for destruction
+ srfc->destroy(); //mark surface for destruction
if(destroySurfaceIfNotCurrent(dpy,srfc)) { //removes surface from the list if not current
dpy->removeSurface(surface);
}
@@ -528,7 +528,7 @@
VALIDATE_DISPLAY(display);
VALIDATE_SURFACE(surface,srfc);
- if(!srfc.Ptr()->getAttrib(attribute,value)) {
+ if(!srfc->getAttrib(attribute,value)) {
RETURN_ERROR(EGL_FALSE,EGL_BAD_ATTRIBUTE);
}
return EGL_TRUE;
@@ -538,7 +538,7 @@
EGLint attribute, EGLint value) {
VALIDATE_DISPLAY(display);
VALIDATE_SURFACE(surface,srfc);
- if(!srfc.Ptr()->setAttrib(attribute,value)) {
+ if(!srfc->setAttrib(attribute,value)) {
RETURN_ERROR(EGL_FALSE,EGL_BAD_ATTRIBUTE);
}
return EGL_TRUE;
@@ -586,7 +586,7 @@
nativeShared = sharedCtxPtr->nativeType();
}
- EGLNativeContextType nativeContext = EglOS::createContext(dpy->nativeType(),cfg,nativeShared);
+ EGLNativeContextType nativeContext = EglOS::createContext(dpy->nativeType(),cfg,static_cast<EGLNativeContextType>(dpy->getManager(version)->getGlobalContext()));
if(nativeContext) {
ContextPtr ctx(new EglContext(nativeContext,sharedCtxPtr,cfg,glesCtx,version,dpy->getManager(version)));
return dpy->addContext(ctx);
@@ -602,7 +602,7 @@
ThreadInfo* thread = getThreadInfo();
EglContext* currCtx = static_cast<EglContext*>(thread->eglContext);
if(ctx.Ptr() != currCtx ){
- EglOS::destroyContext(dpy->nativeType(),ctx.Ptr()->nativeType());
+ EglOS::destroyContext(dpy->nativeType(),ctx->nativeType());
return true;
}
return false;
@@ -612,9 +612,9 @@
VALIDATE_DISPLAY(display);
VALIDATE_CONTEXT(context);
- ctx.Ptr()->destroy(); //mark for destruction
+ ctx->destroy(); //mark for destruction
if(destroyContextIfNotCurrent(dpy,ctx)){ //removes the context from the list if it is not current
- g_eglInfo->getIface(ctx.Ptr()->version())->deleteGLESContext(ctx.Ptr()->getGlesContext());
+ g_eglInfo->getIface(ctx->version())->deleteGLESContext(ctx->getGlesContext());
dpy->removeContext(context);
}
return EGL_TRUE;
@@ -646,7 +646,8 @@
RETURN_ERROR(EGL_FALSE,EGL_BAD_ACCESS);
}
thread->updateInfo(newCtx,dpy,NULL,newCtx->getShareGroup(),dpy->getManager(newCtx->version()));
- ctx.Ptr()->setSurfaces(SurfacePtr(NULL),SurfacePtr(NULL));
+ g_eglInfo->getIface(prevCtx->version())->setShareGroup(newCtx->getGlesContext(),ShareGroupPtr(NULL));
+ ctx->setSurfaces(SurfacePtr(NULL),SurfacePtr(NULL));
}
} else { //assining new context
//surfaces compitability check
@@ -682,6 +683,7 @@
thread->updateInfo(newCtx,dpy,newCtx->getGlesContext(),newCtx->getShareGroup(),dpy->getManager(newCtx->version()));
newCtx->setSurfaces(newReadSrfc,newDrawSrfc);
g_eglInfo->getIface(newCtx->version())->initContext(newCtx->getGlesContext());
+ g_eglInfo->getIface(newCtx->version())->setShareGroup(newCtx->getGlesContext(),newCtx->getShareGroup());
}
SurfacePtr prevRead;
@@ -689,13 +691,13 @@
//removing terminated surfaces & context
if(prevCtx) {
prevRead = prevCtx->read();
- if(prevRead.Ptr()->destroy()){
+ if(prevRead->destroy()){
if(destroySurfaceIfNotCurrent(dpy,prevRead)) { //removes surface from the list if not current
dpy->removeSurface(prevRead);
}
}
prevDraw = prevCtx->draw();
- if(prevDraw.Ptr()->destroy()){
+ if(prevDraw->destroy()){
if(destroySurfaceIfNotCurrent(dpy,prevDraw)) { //removes surface from the list if not current
dpy->removeSurface(prevDraw);
}
@@ -731,7 +733,7 @@
//if surface not window return
- if(Srfc.Ptr()->type() != EglSurface::WINDOW){
+ if(Srfc->type() != EglSurface::WINDOW){
RETURN_ERROR(EGL_TRUE,EGL_SUCCESS);
}
@@ -739,7 +741,7 @@
RETURN_ERROR(EGL_FALSE,EGL_BAD_SURFACE);
}
- EglOS::swapBuffers(dpy->nativeType(),reinterpret_cast<EGLNativeWindowType>(Srfc.Ptr()->native()));
+ EglOS::swapBuffers(dpy->nativeType(),reinterpret_cast<EGLNativeWindowType>(Srfc->native()));
return EGL_TRUE;
}
@@ -748,10 +750,10 @@
ThreadInfo* thread = getThreadInfo();
EglContext* currCtx = static_cast<EglContext*>(thread->eglContext);
if(currCtx) {
- if(!currCtx->read().Ptr() || !currCtx->draw().Ptr() || currCtx->draw().Ptr()->type()!=EglSurface::WINDOW) {
+ if(!currCtx->read().Ptr() || !currCtx->draw().Ptr() || currCtx->draw()->type()!=EglSurface::WINDOW) {
RETURN_ERROR(EGL_FALSE,EGL_BAD_CURRENT_SURFACE);
}
- EglOS::swapInterval(dpy->nativeType(),reinterpret_cast<EGLNativeWindowType>(currCtx->draw().Ptr()->native()),interval);
+ EglOS::swapInterval(dpy->nativeType(),reinterpret_cast<EGLNativeWindowType>(currCtx->draw()->native()),interval);
} else {
RETURN_ERROR(EGL_FALSE,EGL_BAD_SURFACE);
}
diff --git a/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLESbuffer.h b/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLESbuffer.h
index e1326fc..5c4ce78 100644
--- a/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLESbuffer.h
+++ b/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLESbuffer.h
@@ -18,11 +18,12 @@
#include <stdio.h>
#include <GLES/gl.h>
+#include <GLcommon/objectNameManager.h>
#include "RangeManip.h"
-class GLESbuffer {
+class GLESbuffer: public ObjectData {
public:
- GLESbuffer():m_size(0),m_usage(GL_STATIC_DRAW),m_data(NULL){}
+ GLESbuffer():m_size(0),m_usage(GL_STATIC_DRAW),m_data(NULL),m_wasBound(false){}
GLuint getSize(){return m_size;};
GLuint getUsage(){return m_usage;};
GLvoid* getData(){ return m_data;}
@@ -30,6 +31,8 @@
bool setSubBuffer(GLint offset,GLuint size,const GLvoid* data);
void getConversions(const RangeList& rIn,RangeList& rOut);
bool fullyConverted(){return m_conversionManager.size() == 0;};
+ void setBinded(){m_wasBound = true;};
+ bool wasBinded(){return m_wasBound;};
~GLESbuffer();
private:
@@ -37,6 +40,8 @@
GLuint m_usage;
unsigned char* m_data;
RangeList m_conversionManager;
+ bool m_wasBound;
};
+typedef SmartPtr<GLESbuffer> GLESbufferPtr;
#endif
diff --git a/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLEScontext.cpp b/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLEScontext.cpp
index 1f9a1e5..ad56ba3 100644
--- a/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLEScontext.cpp
+++ b/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLEScontext.cpp
@@ -65,7 +65,7 @@
m_initialized = true;
}
-GLEScontext::GLEScontext():m_glError(GL_NO_ERROR),m_activeTexture(0),m_arrayBuffer(0),m_elementBuffer(0),m_minAvailableBuffer(1),m_pointsIndex(-1),m_initialized(false) {
+GLEScontext::GLEScontext():m_glError(GL_NO_ERROR),m_activeTexture(0),m_arrayBuffer(0),m_elementBuffer(0),m_pointsIndex(-1),m_initialized(false) {
s_glDispatch.dispatchFuncs();
@@ -96,8 +96,9 @@
GLuint bufferName = m_arrayBuffer;
if(bufferName) {
unsigned int offset = reinterpret_cast<unsigned int>(data);
- m_map[arrType]->setBuffer(size,type,stride,m_vbos[bufferName],offset);
- return static_cast<const unsigned char*>(m_vbos[bufferName]->getData()) + offset;
+ GLESbuffer* vbo = static_cast<GLESbuffer*>(m_shareGroup->getObjectData(VERTEXBUFFER,bufferName).Ptr());
+ m_map[arrType]->setBuffer(size,type,stride,vbo,offset);
+ return static_cast<const unsigned char*>(vbo->getData()) + offset;
}
m_map[arrType]->setArray(size,type,stride,data);
return data;
@@ -444,45 +445,12 @@
drawPointsData(arrs,0,count,type,indices_in,true);
}
-void GLEScontext:: genBuffers(GLsizei n,GLuint* buffers)
-{
- int i = 0;
- while(i < n) {
- if(m_vbos.find(m_minAvailableBuffer) == m_vbos.end()) {
- buffers[i++] = m_minAvailableBuffer;;
- m_vbos[m_minAvailableBuffer] = new GLESbuffer();
- }
- m_minAvailableBuffer++;
- }
-}
-
-void GLEScontext::deleteBuffers(GLsizei n,const GLuint* buffers) {
- for(int i = 0; i < n ;i++) {
- if(m_vbos.find(buffers[i]) != m_vbos.end()) {
- if(m_vbos[buffers[i]]) delete m_vbos[buffers[i]];
- if(buffers[i] < m_minAvailableBuffer) m_minAvailableBuffer = buffers[i];
- m_vbos.erase(buffers[i]);
- }
- }
-}
-
void GLEScontext::bindBuffer(GLenum target,GLuint buffer) {
if(target == GL_ARRAY_BUFFER) {
m_arrayBuffer = buffer;
} else {
m_elementBuffer = buffer;
}
- if(m_vbos.find(buffer) == m_vbos.end()) { // buffer name wasn't generated before
- m_vbos[buffer] = new GLESbuffer();
- }
-}
-
-//checks if there is buffer named "buffer" and if this buffer is binded
-bool GLEScontext::isBuffer(GLuint buffer) {
- if(m_vbos.find(buffer) != m_vbos.end()) {
- if(m_elementBuffer == buffer || m_arrayBuffer == buffer) return true;
- }
- return false;
}
//checks if any buffer is binded to target
@@ -501,28 +469,34 @@
GLvoid* GLEScontext::getBindedBuffer(GLenum target) {
GLuint bufferName = getBuffer(target);
if(!bufferName) return NULL;
- return m_vbos[bufferName]->getData();
+
+ GLESbuffer* vbo = static_cast<GLESbuffer*>(m_shareGroup->getObjectData(VERTEXBUFFER,bufferName).Ptr());
+ return vbo->getData();
}
void GLEScontext::getBufferSize(GLenum target,GLint* param) {
GLuint bufferName = getBuffer(target);
- *param = m_vbos[bufferName]->getSize();
+ GLESbuffer* vbo = static_cast<GLESbuffer*>(m_shareGroup->getObjectData(VERTEXBUFFER,bufferName).Ptr());
+ *param = vbo->getSize();
}
void GLEScontext::getBufferUsage(GLenum target,GLint* param) {
GLuint bufferName = getBuffer(target);
- *param = m_vbos[bufferName]->getUsage();
+ GLESbuffer* vbo = static_cast<GLESbuffer*>(m_shareGroup->getObjectData(VERTEXBUFFER,bufferName).Ptr());
+ *param = vbo->getUsage();
}
bool GLEScontext::setBufferData(GLenum target,GLsizeiptr size,const GLvoid* data,GLenum usage) {
GLuint bufferName = getBuffer(target);
if(!bufferName) return false;
- return m_vbos[bufferName]->setBuffer(size,usage,data);
+ GLESbuffer* vbo = static_cast<GLESbuffer*>(m_shareGroup->getObjectData(VERTEXBUFFER,bufferName).Ptr());
+ return vbo->setBuffer(size,usage,data);
}
bool GLEScontext::setBufferSubData(GLenum target,GLintptr offset,GLsizeiptr size,const GLvoid* data) {
GLuint bufferName = getBuffer(target);
if(!bufferName) return false;
- return m_vbos[bufferName]->setSubBuffer(offset,size,data);
+ GLESbuffer* vbo = static_cast<GLESbuffer*>(m_shareGroup->getObjectData(VERTEXBUFFER,bufferName).Ptr());
+ return vbo->setSubBuffer(offset,size,data);
}
diff --git a/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLEScontext.h b/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLEScontext.h
index 7322609..89add7d 100644
--- a/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLEScontext.h
+++ b/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLEScontext.h
@@ -26,7 +26,6 @@
#define MAX_TEX_UNITS 8
typedef std::map<GLenum,GLESpointer*> ArraysMap;
-typedef std::map<GLuint,GLESbuffer*> BuffersMap;
typedef std::map<GLfloat,std::vector<int> > PointSizeIndices;
struct GLESFloatArrays
@@ -63,8 +62,6 @@
void drawPointsArrs(GLESFloatArrays& arrs,GLint first,GLsizei count);
void drawPointsElems(GLESFloatArrays& arrs,GLsizei count,GLenum type,const GLvoid* indices);
- void genBuffers(GLsizei n,GLuint* buffers);
- void deleteBuffers(GLsizei n,const GLuint* buffers);
void bindBuffer(GLenum target,GLuint buffer);
bool isBuffer(GLuint buffer);
bool isBindedBuffer(GLenum target);
@@ -73,6 +70,7 @@
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);
+ void setShareGroup(ShareGroupPtr grp){m_shareGroup = grp;};
static GLDispatch& dispatcher();
static int getMaxLights(){return s_glSupport.maxLights;}
@@ -104,12 +102,9 @@
unsigned int m_activeTexture;
unsigned int m_arrayBuffer;
unsigned int m_elementBuffer;
-
- unsigned int m_minAvailableBuffer;
- BuffersMap m_vbos;
-
int m_pointsIndex;
bool m_initialized;
+ ShareGroupPtr m_shareGroup;
};
#endif
diff --git a/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLESimp.cpp b/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLESimp.cpp
index ab10a04..ba52c17 100644
--- a/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLESimp.cpp
+++ b/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLESimp.cpp
@@ -33,6 +33,7 @@
static void initContext(GLEScontext* ctx);
static GLEScontext* createGLESContext();
static void deleteGLESContext(GLEScontext* ctx);
+static void setShareGroup(GLEScontext* ctx,ShareGroupPtr grp);
}
@@ -42,7 +43,8 @@
initContext :initContext,
deleteGLESContext:deleteGLESContext,
flush :glFlush,
- finish :glFinish
+ finish :glFinish,
+ setShareGroup :setShareGroup
};
extern "C" {
@@ -59,6 +61,12 @@
if(ctx) delete ctx;
}
+static void setShareGroup(GLEScontext* ctx,ShareGroupPtr grp) {
+ if(ctx) {
+ ctx->setShareGroup(grp);
+ }
+}
+
GLESiface* __translator_getIfaces(EGLiface* eglIface){
s_eglIface = eglIface;
return & s_glesIface;
@@ -73,7 +81,7 @@
} else { \
fprintf(stderr,"Context wasn't initialized yet \n"); \
}
-
+
#define GET_CTX() \
GET_THREAD(); \
@@ -100,7 +108,11 @@
GL_API GLboolean GL_APIENTRY glIsBuffer(GLuint buffer) {
GET_CTX_RET(GL_FALSE)
- return ctx->isBuffer(buffer);
+ if(buffer && thrd->shareGroup.Ptr()) {
+ ObjectDataPtr objData = thrd->shareGroup->getObjectData(VERTEXBUFFER,buffer);
+ return objData.Ptr() ? ((GLESbuffer*)objData.Ptr())->wasBinded():GL_FALSE;
+ }
+ return GL_FALSE;
}
GL_API GLboolean GL_APIENTRY glIsEnabled( GLenum cap) {
@@ -113,6 +125,9 @@
GL_API GLboolean GL_APIENTRY glIsTexture( GLuint texture) {
GET_CTX_RET(GL_FALSE)
+ if(texture && thrd->shareGroup.Ptr()){
+ return thrd->shareGroup->isObject(TEXTURE,texture) ? GL_TRUE :GL_FALSE;
+ }
return ctx->dispatcher().glIsTexture(texture);
}
@@ -172,13 +187,32 @@
GL_API void GL_APIENTRY glBindBuffer( GLenum target, GLuint buffer) {
GET_CTX()
SET_ERROR_IF(!GLESvalidate::bufferTarget(target),GL_INVALID_ENUM);
+
+ //if buffer wasn't generated before,generate one
+ if(thrd->shareGroup.Ptr() && !thrd->shareGroup->isObject(VERTEXBUFFER,buffer)){
+ thrd->shareGroup->genName(VERTEXBUFFER,buffer);
+ thrd->shareGroup->setObjectData(VERTEXBUFFER,buffer,ObjectDataPtr(new GLESbuffer()));
+ }
ctx->bindBuffer(target,buffer);
+ GLESbuffer* vbo = (GLESbuffer*)thrd->shareGroup->getObjectData(VERTEXBUFFER,buffer).Ptr();
+ vbo->wasBinded();
}
+
GL_API void GL_APIENTRY glBindTexture( GLenum target, GLuint texture) {
GET_CTX()
SET_ERROR_IF(!GLESvalidate::textureTarget(target),GL_INVALID_ENUM)
- ctx->dispatcher().glBindTexture(target,texture);
+
+ GLuint globalTextureName = texture;
+ if(texture && thrd->shareGroup.Ptr()){
+ globalTextureName = thrd->shareGroup->getGlobalName(TEXTURE,texture);
+ //if texture wasn't generated before,generate one
+ if(!globalTextureName){
+ thrd->shareGroup->genName(TEXTURE,texture);
+ globalTextureName = thrd->shareGroup->getGlobalName(TEXTURE,texture);
+ }
+ }
+ ctx->dispatcher().glBindTexture(target,globalTextureName);
}
GL_API void GL_APIENTRY glBlendFunc( GLenum sfactor, GLenum dfactor) {
@@ -340,12 +374,22 @@
GL_API void GL_APIENTRY glDeleteBuffers( GLsizei n, const GLuint *buffers) {
GET_CTX()
SET_ERROR_IF(n<0,GL_INVALID_VALUE);
- ctx->deleteBuffers(n,buffers);
+ if(thrd->shareGroup.Ptr()) {
+ for(int i=0; i < n; i++){
+ thrd->shareGroup->deleteName(VERTEXBUFFER,buffers[i]);
+ }
+ }
}
GL_API void GL_APIENTRY glDeleteTextures( GLsizei n, const GLuint *textures) {
GET_CTX()
- ctx->dispatcher().glDeleteTextures(n,textures);
+ if(thrd->shareGroup.Ptr()) {
+ for(int i=0; i < n; i++){
+ thrd->shareGroup->deleteName(TEXTURE,textures[i]);
+ const GLuint globalTextureName = thrd->shareGroup->getGlobalName(TEXTURE,textures[i]);
+ ctx->dispatcher().glDeleteTextures(1,&globalTextureName);
+ }
+ }
}
GL_API void GL_APIENTRY glDepthFunc( GLenum func) {
@@ -490,12 +534,22 @@
GL_API void GL_APIENTRY glGenBuffers( GLsizei n, GLuint *buffers) {
GET_CTX()
SET_ERROR_IF(n<0,GL_INVALID_VALUE);
- ctx->genBuffers(n,buffers);
+ if(thrd->shareGroup.Ptr()) {
+ for(int i=0; i<n ;i++) {
+ buffers[i] = thrd->shareGroup->genName(VERTEXBUFFER);
+ //generating vbo object related to this buffer name
+ thrd->shareGroup->setObjectData(VERTEXBUFFER,buffers[i],ObjectDataPtr(new GLESbuffer()));
+ }
+ }
}
GL_API void GL_APIENTRY glGenTextures( GLsizei n, GLuint *textures) {
- GET_CTX()
- ctx->dispatcher().glGenTextures(n,textures);
+ GET_CTX();
+ if(thrd->shareGroup.Ptr()) {
+ for(int i=0; i<n ;i++) {
+ textures[i] = thrd->shareGroup->genName(TEXTURE);
+ }
+ }
}
GL_API void GL_APIENTRY glGetBooleanv( GLenum pname, GLboolean *params) {
diff --git a/tools/emulator/opengl/host/libs/Translator/include/GLcommon/TranslatorIfaces.h b/tools/emulator/opengl/host/libs/Translator/include/GLcommon/TranslatorIfaces.h
index dbf1eb9..a887f9f 100644
--- a/tools/emulator/opengl/host/libs/Translator/include/GLcommon/TranslatorIfaces.h
+++ b/tools/emulator/opengl/host/libs/Translator/include/GLcommon/TranslatorIfaces.h
@@ -27,6 +27,7 @@
void (*deleteGLESContext)(GLEScontext*);
void (*flush)();
void (*finish)();
+ void (*setShareGroup)(GLEScontext*,ShareGroupPtr);
}GLESiface;