am 53dfd83d: am 23685f03: Merge "opengles emulator: fixed EGLContext and EGLSurface ref-counting."

* commit '53dfd83d48777e0196117322a498cea8cc29f863':
  opengles emulator: fixed EGLContext and EGLSurface ref-counting.
This commit is contained in:
David Turner
2011-08-09 10:06:09 -07:00
committed by Android Git Automerger
17 changed files with 326 additions and 340 deletions

View File

@@ -14,21 +14,26 @@
* limitations under the License.
*/
#include "EglContext.h"
#include "EglDisplay.h"
#include "EglGlobalInfo.h"
#include "EglOsApi.h"
unsigned int EglContext::s_nextContextHndl = 0;
extern EglGlobalInfo* g_eglInfo; // defined in EglImp.cpp
bool EglContext::usingSurface(SurfacePtr surface) {
return surface.Ptr() == m_read.Ptr() || surface.Ptr() == m_draw.Ptr();
}
EglContext::EglContext(EGLNativeContextType context,ContextPtr shared_context,
EglContext::EglContext(EglDisplay *dpy, EGLNativeContextType context,ContextPtr shared_context,
EglConfig* config,GLEScontext* glesCtx,GLESVersion ver,ObjectNameManager* mngr):
m_dpy(dpy),
m_native(context),
m_config(config),
m_glesContext(glesCtx),
m_read(NULL),
m_draw(NULL),
m_destroy(false),
m_version(ver),
m_mngr(mngr)
{
@@ -40,6 +45,17 @@ m_mngr(mngr)
EglContext::~EglContext()
{
//
// remove the context in the underlying OS layer
//
EglOS::destroyContext(m_dpy->nativeType(),m_native);
//
// call the client-api to remove the GLES context
//
g_eglInfo->getIface(version())->deleteGLESContext(m_glesContext);
if (m_mngr)
{
m_mngr->deleteShareGroup(m_native);

View File

@@ -32,15 +32,15 @@
class EglContext;
typedef SmartPtr<EglContext> ContextPtr;
class EglDisplay;
class EglContext {
public:
EglContext(EGLNativeContextType context,ContextPtr shared_context,EglConfig* config,GLEScontext* glesCtx,GLESVersion ver,ObjectNameManager* mngr);
EglContext(EglDisplay *dpy, EGLNativeContextType context,ContextPtr shared_context,EglConfig* config,GLEScontext* glesCtx,GLESVersion ver,ObjectNameManager* mngr);
bool usingSurface(SurfacePtr surface);
EGLNativeContextType nativeType(){return m_native;};
void markForDestruction(){m_destroy = true;}
bool destroy(){ return m_destroy;}
bool getAttrib(EGLint attrib,EGLint* value);
SurfacePtr read(){ return m_read;};
SurfacePtr draw(){ return m_draw;};
@@ -57,13 +57,13 @@ public:
private:
static unsigned int s_nextContextHndl;
EglDisplay *m_dpy;
EGLNativeContextType m_native;
EglConfig* m_config;
GLEScontext* m_glesContext;
ShareGroupPtr m_shareGroup;
SurfacePtr m_read;
SurfacePtr m_draw;
bool m_destroy;
GLESVersion m_version;
ObjectNameManager *m_mngr;
unsigned int m_hndl;

View File

@@ -22,7 +22,7 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <GLcommon/ThreadInfo.h>
#include "ThreadInfo.h"
#include <GLcommon/TranslatorIfaces.h>
#include <OpenglOsUtils/osDynLibrary.h>
@@ -44,13 +44,14 @@
EglImage *attachEGLImage(unsigned int imageId);
void detachEGLImage(unsigned int imageId);
GLEScontext* getGLESContext();
#define tls_thread EglThreadInfo::get()
EglGlobalInfo* g_eglInfo = EglGlobalInfo::getInstance();
static EGLiface s_eglIface = {
getThreadInfo : getThreadInfo, // implemented in ThreadInfo.cpp
getGLESContext : getGLESContext,
eglAttachEGLImage:attachEGLImage,
eglDetachEGLImage:detachEGLImage
};
@@ -125,6 +126,12 @@ static int s_eglExtentionsSize = sizeof(s_eglExtentions) /
VALIDATE_CONTEXT_RETURN(EGLContext,EGL_FALSE)
GLEScontext* getGLESContext()
{
ThreadInfo* thread = getThreadInfo();
return thread->glesContext;
}
EGLAPI EGLint EGLAPIENTRY eglGetError(void) {
CURRENT_THREAD();
EGLint err = tls_thread->getError();
@@ -479,7 +486,7 @@ EGLAPI EGLSurface EGLAPIENTRY eglCreateWindowSurface(EGLDisplay display, EGLConf
if(!EglOS::checkWindowPixelFormatMatch(dpy->nativeType(),win,cfg,&width,&height)) {
RETURN_ERROR(EGL_NO_SURFACE,EGL_BAD_ALLOC);
}
SurfacePtr wSurface(new EglWindowSurface(win,cfg,width,height));
SurfacePtr wSurface(new EglWindowSurface(dpy, win,cfg,width,height));
if(!wSurface.Ptr()) {
RETURN_ERROR(EGL_NO_SURFACE,EGL_BAD_ALLOC);
}
@@ -495,7 +502,7 @@ EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferSurface(EGLDisplay display, EGLCon
}
SurfacePtr pbSurface(new EglPbufferSurface(cfg));
SurfacePtr pbSurface(new EglPbufferSurface(dpy,cfg));
if(!pbSurface.Ptr()) {
RETURN_ERROR(EGL_NO_SURFACE,EGL_BAD_ALLOC);
}
@@ -549,7 +556,7 @@ EGLAPI EGLSurface EGLAPIENTRY eglCreatePixmapSurface(EGLDisplay display, EGLConf
if(!EglOS::checkPixmapPixelFormatMatch(dpy->nativeType(),pixmap,cfg,&width,&height)) {
RETURN_ERROR(EGL_NO_SURFACE,EGL_BAD_ALLOC);
}
SurfacePtr pixSurface(new EglPixmapSurface(pixmap,cfg));
SurfacePtr pixSurface(new EglPixmapSurface(dpy, pixmap,cfg));
if(!pixSurface.Ptr()) {
RETURN_ERROR(EGL_NO_SURFACE,EGL_BAD_ALLOC);
}
@@ -557,18 +564,6 @@ EGLAPI EGLSurface EGLAPIENTRY eglCreatePixmapSurface(EGLDisplay display, EGLConf
return dpy->addSurface(pixSurface);
}
static bool destroySurfaceIfNotCurrent(EglDisplay* dpy,SurfacePtr surface) {
ThreadInfo* thread = getThreadInfo();
EglContext* currCtx = static_cast<EglContext*>(thread->eglContext);
if((!currCtx) || (currCtx && !currCtx->usingSurface(surface))){
if(surface->type() == EglSurface::PBUFFER) {
EglOS::releasePbuffer(dpy->nativeType(),surface->native());
}
return true;
}
return false;
}
EGLAPI EGLBoolean EGLAPIENTRY eglDestroySurface(EGLDisplay display, EGLSurface surface) {
VALIDATE_DISPLAY(display);
SurfacePtr srfc = dpy->getSurface(surface);
@@ -576,10 +571,7 @@ EGLAPI EGLBoolean EGLAPIENTRY eglDestroySurface(EGLDisplay display, EGLSurface s
RETURN_ERROR(EGL_FALSE,EGL_BAD_SURFACE);
}
srfc->markForDestruction(); //mark surface for destruction
if(destroySurfaceIfNotCurrent(dpy,srfc)) { //removes surface from the list if not current
dpy->removeSurface(surface);
}
dpy->removeSurface(surface);
return EGL_TRUE;
}
@@ -650,7 +642,7 @@ EGLAPI EGLContext EGLAPIENTRY eglCreateContext(EGLDisplay display, EGLConfig con
EGLNativeContextType nativeContext = EglOS::createContext(dpy->nativeType(),cfg,globalSharedContext);
if(nativeContext) {
ContextPtr ctx(new EglContext(nativeContext,sharedCtxPtr,cfg,glesCtx,version,dpy->getManager(version)));
ContextPtr ctx(new EglContext(dpy, nativeContext,sharedCtxPtr,cfg,glesCtx,version,dpy->getManager(version)));
return dpy->addContext(ctx);
} else {
iface->deleteGLESContext(glesCtx);
@@ -659,25 +651,11 @@ EGLAPI EGLContext EGLAPIENTRY eglCreateContext(EGLDisplay display, EGLConfig con
return EGL_NO_CONTEXT;
}
static bool destroyContextIfNotCurrent(EglDisplay* dpy,ContextPtr ctx ) {
ThreadInfo* thread = getThreadInfo();
EglContext* currCtx = static_cast<EglContext*>(thread->eglContext);
if(ctx.Ptr() != currCtx ){
EglOS::destroyContext(dpy->nativeType(),ctx->nativeType());
return true;
}
return false;
}
EGLAPI EGLBoolean EGLAPIENTRY eglDestroyContext(EGLDisplay display, EGLContext context) {
VALIDATE_DISPLAY(display);
VALIDATE_CONTEXT(context);
ctx->markForDestruction(); //mark for destruction
if(destroyContextIfNotCurrent(dpy,ctx)){ //removes the context from the list if it is not current
g_eglInfo->getIface(ctx->version())->deleteGLESContext(ctx->getGlesContext());
dpy->removeContext(context);
}
dpy->removeContext(context);
return EGL_TRUE;
}
@@ -692,15 +670,15 @@ EGLAPI EGLBoolean EGLAPIENTRY eglMakeCurrent(EGLDisplay display, EGLSurface draw
}
ThreadInfo* thread = getThreadInfo();
EglContext* prevCtx = static_cast<EglContext*>(thread->eglContext);
ContextPtr prevCtx = thread->eglContext;
if(releaseContext) { //releasing current context
if(prevCtx) {
if(prevCtx.Ptr()) {
g_eglInfo->getIface(prevCtx->version())->flush();
if(!EglOS::makeCurrent(dpy->nativeType(),NULL,NULL,NULL)) {
RETURN_ERROR(EGL_FALSE,EGL_BAD_ACCESS);
}
thread->updateInfo(NULL,dpy,NULL,ShareGroupPtr(NULL),dpy->getManager(prevCtx->version()));
thread->updateInfo(ContextPtr(NULL),dpy,NULL,ShareGroupPtr(NULL),dpy->getManager(prevCtx->version()));
}
} else { //assining new context
VALIDATE_CONTEXT(context);
@@ -709,10 +687,10 @@ EGLAPI EGLBoolean EGLAPIENTRY eglMakeCurrent(EGLDisplay display, EGLSurface draw
EglSurface* newDrawPtr = newDrawSrfc.Ptr();
EglSurface* newReadPtr = newReadSrfc.Ptr();
EglContext* newCtx = ctx.Ptr();
ContextPtr newCtx = ctx;
if (newCtx && prevCtx) {
if (newCtx == prevCtx) {
if (newCtx.Ptr() && prevCtx.Ptr()) {
if (newCtx.Ptr() == prevCtx.Ptr()) {
if (newDrawPtr == prevCtx->draw().Ptr() &&
newReadPtr == prevCtx->read().Ptr()) {
// nothing to do
@@ -749,7 +727,7 @@ EGLAPI EGLBoolean EGLAPIENTRY eglMakeCurrent(EGLDisplay display, EGLSurface draw
if(newDrawPtr->type() == EglSurface::PIXMAP && !EglOS::validNativePixmap(nativeDisplay,nativeDraw)) {
RETURN_ERROR(EGL_FALSE,EGL_BAD_NATIVE_PIXMAP);
}
if(prevCtx) {
if(prevCtx.Ptr()) {
g_eglInfo->getIface(prevCtx->version())->flush();
}
if(!EglOS::makeCurrent(dpy->nativeType(),newReadPtr,newDrawPtr,newCtx->nativeType())) {
@@ -763,33 +741,11 @@ EGLAPI EGLBoolean EGLAPIENTRY eglMakeCurrent(EGLDisplay display, EGLSurface draw
g_eglInfo->getIface(newCtx->version())->initContext(newCtx->getGlesContext(),newCtx->getShareGroup());
}
SurfacePtr prevRead;
SurfacePtr prevDraw;
//removing terminated surfaces & context
if(prevCtx && releaseContext) {
prevRead = prevCtx->read();
if(prevRead->destroy()){
if(destroySurfaceIfNotCurrent(dpy,prevRead)) { //removes surface from the list if not current
dpy->removeSurface(prevRead);
}
}
prevDraw = prevCtx->draw();
if(prevDraw->destroy()){
if(destroySurfaceIfNotCurrent(dpy,prevDraw)) { //removes surface from the list if not current
dpy->removeSurface(prevDraw);
}
}
if(prevCtx->destroy()) {
ContextPtr prevCtxPtr = ContextPtr(prevCtx);
if(destroyContextIfNotCurrent(dpy,prevCtxPtr)){ //removes the context from the list if it is not current
g_eglInfo->getIface(prevCtx->version())->deleteGLESContext(prevCtx->getGlesContext());
dpy->removeContext(prevCtxPtr);
}
}
// release previous context surface binding
if(prevCtx.Ptr() && releaseContext) {
prevCtx->setSurfaces(SurfacePtr(NULL),SurfacePtr(NULL));
}
return EGL_TRUE;
}
@@ -808,7 +764,7 @@ EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffers(EGLDisplay display, EGLSurface surf
VALIDATE_DISPLAY(display);
VALIDATE_SURFACE(surface,Srfc);
ThreadInfo* thread = getThreadInfo();
EglContext* currentCtx = static_cast<EglContext*>(thread->eglContext);
ContextPtr currentCtx = thread->eglContext;
//if surface not window return
@@ -816,7 +772,7 @@ EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffers(EGLDisplay display, EGLSurface surf
RETURN_ERROR(EGL_TRUE,EGL_SUCCESS);
}
if(!currentCtx || !currentCtx->usingSurface(Srfc) || !EglOS::validNativeWin(dpy->nativeType(),Srfc.Ptr()->native())) {
if(!currentCtx.Ptr() || !currentCtx->usingSurface(Srfc) || !EglOS::validNativeWin(dpy->nativeType(),Srfc.Ptr()->native())) {
RETURN_ERROR(EGL_FALSE,EGL_BAD_SURFACE);
}
@@ -827,8 +783,8 @@ EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffers(EGLDisplay display, EGLSurface surf
EGLAPI EGLBoolean EGLAPIENTRY eglSwapInterval(EGLDisplay display, EGLint interval) {
VALIDATE_DISPLAY(display);
ThreadInfo* thread = getThreadInfo();
EglContext* currCtx = static_cast<EglContext*>(thread->eglContext);
if(currCtx) {
ContextPtr currCtx = thread->eglContext;
if(currCtx.Ptr()) {
if(!currCtx->read().Ptr() || !currCtx->draw().Ptr() || currCtx->draw()->type()!=EglSurface::WINDOW) {
RETURN_ERROR(EGL_FALSE,EGL_BAD_CURRENT_SURFACE);
}
@@ -843,8 +799,8 @@ EGLAPI EGLBoolean EGLAPIENTRY eglSwapInterval(EGLDisplay display, EGLint interva
EGLAPI EGLContext EGLAPIENTRY eglGetCurrentContext(void) {
ThreadInfo* thread = getThreadInfo();
EglDisplay* dpy = static_cast<EglDisplay*>(thread->eglDisplay);
EglContext* ctx = static_cast<EglContext*>(thread->eglContext);
if(dpy && ctx){
ContextPtr ctx = thread->eglContext;
if(dpy && ctx.Ptr()){
// This double check is required because a context might still be current after it is destroyed - in which case
// its handle should be invalid, that is EGL_NO_CONTEXT should be returned even though the context is current
EGLContext c = (EGLContext)ctx->getHndl();
@@ -861,9 +817,9 @@ EGLAPI EGLSurface EGLAPIENTRY eglGetCurrentSurface(EGLint readdraw) {
ThreadInfo* thread = getThreadInfo();
EglDisplay* dpy = static_cast<EglDisplay*>(thread->eglDisplay);
EglContext* ctx = static_cast<EglContext*>(thread->eglContext);
ContextPtr ctx = thread->eglContext;
if(dpy && ctx) {
if(dpy && ctx.Ptr()) {
SurfacePtr surface = readdraw == EGL_READ ? ctx->read() : ctx->draw();
if(surface.Ptr())
{
@@ -884,7 +840,7 @@ EGLAPI EGLSurface EGLAPIENTRY eglGetCurrentSurface(EGLint readdraw) {
EGLAPI EGLDisplay EGLAPIENTRY eglGetCurrentDisplay(void) {
ThreadInfo* thread = getThreadInfo();
return (thread->eglContext) ? thread->eglDisplay : EGL_NO_DISPLAY;
return (thread->eglContext.Ptr()) ? thread->eglDisplay : EGL_NO_DISPLAY;
}
EGLAPI EGLBoolean EGLAPIENTRY eglWaitGL(void) {
@@ -898,9 +854,9 @@ EGLAPI EGLBoolean EGLAPIENTRY eglWaitNative(EGLint engine) {
RETURN_ERROR(EGL_FALSE,EGL_BAD_PARAMETER);
}
ThreadInfo* thread = getThreadInfo();
EglContext* currCtx = static_cast<EglContext*>(thread->eglContext);
ContextPtr currCtx = thread->eglContext;
EglDisplay* dpy = static_cast<EglDisplay*>(thread->eglDisplay);
if(currCtx) {
if(currCtx.Ptr()) {
SurfacePtr read = currCtx->read();
SurfacePtr draw = currCtx->draw();
@@ -946,8 +902,8 @@ EGLAPI EGLenum EGLAPIENTRY eglQueryAPI(void) {
EGLAPI EGLBoolean EGLAPIENTRY eglWaitClient(void) {
ThreadInfo* thread = getThreadInfo();
EglContext* currCtx = static_cast<EglContext*>(thread->eglContext);
if(currCtx) {
ContextPtr currCtx = thread->eglContext;
if(currCtx.Ptr()) {
if(!currCtx->read().Ptr() || !currCtx->draw().Ptr()) {
RETURN_ERROR(EGL_FALSE,EGL_BAD_CURRENT_SURFACE);
}
@@ -1026,8 +982,8 @@ EglImage *attachEGLImage(unsigned int imageId)
{
ThreadInfo* thread = getThreadInfo();
EglDisplay* dpy = static_cast<EglDisplay*>(thread->eglDisplay);
EglContext* ctx = static_cast<EglContext*>(thread->eglContext);
if (ctx) {
ContextPtr ctx = thread->eglContext;
if (ctx.Ptr()) {
ImagePtr img = dpy->getImage(reinterpret_cast<EGLImageKHR>(imageId));
if(img.Ptr()) {
ctx->attachImage(imageId,img);
@@ -1041,8 +997,8 @@ void detachEGLImage(unsigned int imageId)
{
ThreadInfo* thread = getThreadInfo();
EglDisplay* dpy = static_cast<EglDisplay*>(thread->eglDisplay);
EglContext* ctx = static_cast<EglContext*>(thread->eglContext);
if (ctx) {
ContextPtr ctx = thread->eglContext;
if (ctx.Ptr()) {
ctx->detachImage(imageId);
}
}

View File

@@ -18,9 +18,12 @@
#include "EglSurface.h"
class EglDisplay;
class EglPbufferSurface:public EglSurface {
public:
EglPbufferSurface(EglConfig* config):EglSurface(PBUFFER,config,0,0),
EglPbufferSurface(EglDisplay *dpy, EglConfig* config):
EglSurface(dpy,PBUFFER,config,0,0),
m_texFormat(EGL_NO_TEXTURE),
m_texTarget(EGL_NO_TEXTURE),
m_texMipmap(EGL_FALSE),

View File

@@ -23,7 +23,12 @@ bool EglPixmapSurface::alreadyAssociatedWithConfig(EGLNativePixmapType pix) {
}
EglPixmapSurface::EglPixmapSurface(EGLNativePixmapType pix,EglConfig* config):EglSurface(PIXMAP,config,0,0),m_pixmap(pix) {
EglPixmapSurface::EglPixmapSurface(EglDisplay *dpy,
EGLNativePixmapType pix,
EglConfig* config) :
EglSurface(dpy, PIXMAP,config,0,0),
m_pixmap(pix)
{
s_associatedPixmaps.insert(pix);
m_native = EglOS::createPixmapSurface(pix);
}

View File

@@ -20,9 +20,11 @@
#include <EGL/egl.h>
#include "EglSurface.h"
class EglDisplay;
class EglPixmapSurface: public EglSurface {
public:
EglPixmapSurface(EGLNativePixmapType pix,EglConfig* config);
EglPixmapSurface(EglDisplay *dpy, EGLNativePixmapType pix,EglConfig* config);
~EglPixmapSurface();
bool getAttrib(EGLint attrib,EGLint* val);

View File

@@ -19,6 +19,11 @@
unsigned int EglSurface::s_nextSurfaceHndl = 0;
EglSurface::~EglSurface(){
if(m_type == EglSurface::PBUFFER) {
EglOS::releasePbuffer(m_dpy->nativeType(),m_native);
}
if(m_native) EglOS::destroySurface(m_native);
}

View File

@@ -23,9 +23,10 @@
#include "EglConfig.h"
class EglSurface;
typedef SmartPtr<EglSurface> SurfacePtr;
class EglDisplay;
class EglSurface {
public:
typedef enum {
@@ -38,8 +39,6 @@ public:
virtual bool setAttrib(EGLint attrib,EGLint val);
virtual bool getAttrib(EGLint attrib,EGLint* val) = 0;
void setDim(int width,int height){ m_width = width; m_height = height;};
void markForDestruction(){m_destroy = true;};
bool destroy(){return m_destroy;};
EglConfig* getConfig(){return m_config;};
unsigned int getHndl(){return m_hndl;};
virtual ~EglSurface();
@@ -47,19 +46,29 @@ public:
private:
static unsigned int s_nextSurfaceHndl;
ESurfaceType m_type;
bool m_destroy;
unsigned int m_hndl;
protected:
EglSurface(ESurfaceType type,EglConfig* config,EGLint width,EGLint height):m_type(type),
m_destroy(false),
m_config(config),
m_width(width),
m_height(height),
m_native(NULL){ m_hndl = ++s_nextSurfaceHndl;};
EglSurface(EglDisplay *dpy,
ESurfaceType type,
EglConfig* config,
EGLint width,
EGLint height) :
m_type(type),
m_config(config),
m_width(width),
m_height(height),
m_native(NULL),
m_dpy(dpy)
{
m_hndl = ++s_nextSurfaceHndl;
}
protected:
EglConfig* m_config;
EGLint m_width;
EGLint m_height;
EGLNativeSurfaceType m_native;
EglDisplay *m_dpy;
};
#endif

View File

@@ -23,7 +23,13 @@ bool EglWindowSurface::alreadyAssociatedWithConfig(EGLNativeWindowType win) {
}
EglWindowSurface::EglWindowSurface(EGLNativeWindowType win,EglConfig* config,unsigned int width,unsigned int height):EglSurface(WINDOW,config,width,height),m_win(win){
EglWindowSurface::EglWindowSurface(EglDisplay *dpy,
EGLNativeWindowType win,
EglConfig* config,
unsigned int width,unsigned int height) :
EglSurface(dpy, WINDOW,config,width,height),
m_win(win)
{
s_associatedWins.insert(win);
m_native = EglOS::createWindowSurface(win);
}

View File

@@ -21,9 +21,11 @@
#include "EglSurface.h"
#include "EglConfig.h"
class EglDisplay;
class EglWindowSurface: public EglSurface {
public:
EglWindowSurface(EGLNativeWindowType win,EglConfig* config,unsigned width,unsigned int height);
EglWindowSurface(EglDisplay *dpy, EGLNativeWindowType win,EglConfig* config,unsigned width,unsigned int height);
~EglWindowSurface();
bool getAttrib(EGLint attrib,EGLint* val);

View File

@@ -14,10 +14,10 @@
* limitations under the License.
*/
#include <GLcommon/ThreadInfo.h>
#include "ThreadInfo.h"
void ThreadInfo::updateInfo(EglContext* eglCtx,
void ThreadInfo::updateInfo(ContextPtr eglCtx,
EglDisplay* dpy,
GLEScontext* glesCtx,
ShareGroupPtr share,

View File

@@ -16,22 +16,21 @@
#ifndef THREAD_INFO_H
#define THREAD_INFO_H
#include "objectNameManager.h"
#include "EglContext.h"
class EglContext;
class EglDisplay;
class GLEScontext;
struct ThreadInfo {
ThreadInfo():eglContext(NULL),glesContext(NULL),objManager(NULL){}
ThreadInfo():glesContext(NULL),objManager(NULL){}
void updateInfo(EglContext* eglctx,
void updateInfo(ContextPtr eglctx,
EglDisplay* dpy,
GLEScontext* glesCtx,
ShareGroupPtr share,
ObjectNameManager* manager);
EglContext* eglContext;
ContextPtr eglContext;
EglDisplay* eglDisplay;
GLEScontext* glesContext;
ShareGroupPtr shareGroup;

View File

@@ -30,7 +30,6 @@
#include <GLcommon/GLDispatch.h>
#include <GLcommon/GLconversion_macros.h>
#include <GLcommon/TranslatorIfaces.h>
#include <GLcommon/ThreadInfo.h>
#include <GLES/gl.h>
#include <GLES/glext.h>
#include <cmath>
@@ -178,16 +177,16 @@ static ObjectLocalName TextureLocalName(GLenum target, unsigned int tex) {
static TextureData* getTextureData(ObjectLocalName tex){
GET_CTX_RET(NULL);
if(!thrd->shareGroup->isObject(TEXTURE,tex))
if(!ctx->shareGroup()->isObject(TEXTURE,tex))
{
return NULL;
}
TextureData *texData = NULL;
ObjectDataPtr objData = thrd->shareGroup->getObjectData(TEXTURE,tex);
ObjectDataPtr objData = ctx->shareGroup()->getObjectData(TEXTURE,tex);
if(!objData.Ptr()){
texData = new TextureData();
thrd->shareGroup->setObjectData(TEXTURE, tex, ObjectDataPtr(texData));
ctx->shareGroup()->setObjectData(TEXTURE, tex, ObjectDataPtr(texData));
} else {
texData = (TextureData*)objData.Ptr();
}
@@ -203,8 +202,8 @@ static TextureData* getTextureTargetData(GLenum target){
GL_API GLboolean GL_APIENTRY glIsBuffer(GLuint buffer) {
GET_CTX_RET(GL_FALSE)
if(buffer && thrd->shareGroup.Ptr()) {
ObjectDataPtr objData = thrd->shareGroup->getObjectData(VERTEXBUFFER,buffer);
if(buffer && ctx->shareGroup().Ptr()) {
ObjectDataPtr objData = ctx->shareGroup()->getObjectData(VERTEXBUFFER,buffer);
return objData.Ptr() ? ((GLESbuffer*)objData.Ptr())->wasBinded():GL_FALSE;
}
return GL_FALSE;
@@ -292,13 +291,13 @@ GL_API void GL_APIENTRY glBindBuffer( GLenum target, GLuint buffer) {
SET_ERROR_IF(!GLEScmValidate::bufferTarget(target),GL_INVALID_ENUM);
//if buffer wasn't generated before,generate one
if(buffer && thrd->shareGroup.Ptr() && !thrd->shareGroup->isObject(VERTEXBUFFER,buffer)){
thrd->shareGroup->genName(VERTEXBUFFER,buffer);
thrd->shareGroup->setObjectData(VERTEXBUFFER,buffer,ObjectDataPtr(new GLESbuffer()));
if(buffer && ctx->shareGroup().Ptr() && !ctx->shareGroup()->isObject(VERTEXBUFFER,buffer)){
ctx->shareGroup()->genName(VERTEXBUFFER,buffer);
ctx->shareGroup()->setObjectData(VERTEXBUFFER,buffer,ObjectDataPtr(new GLESbuffer()));
}
ctx->bindBuffer(target,buffer);
if (buffer) {
GLESbuffer* vbo = (GLESbuffer*)thrd->shareGroup->getObjectData(VERTEXBUFFER,buffer).Ptr();
GLESbuffer* vbo = (GLESbuffer*)ctx->shareGroup()->getObjectData(VERTEXBUFFER,buffer).Ptr();
vbo->setBinded();
}
}
@@ -312,12 +311,12 @@ GL_API void GL_APIENTRY glBindTexture( GLenum target, GLuint texture) {
ObjectLocalName localTexName = TextureLocalName(target,texture);
GLuint globalTextureName = localTexName;
if(thrd->shareGroup.Ptr()){
globalTextureName = thrd->shareGroup->getGlobalName(TEXTURE,localTexName);
if(ctx->shareGroup().Ptr()){
globalTextureName = ctx->shareGroup()->getGlobalName(TEXTURE,localTexName);
//if texture wasn't generated before,generate one
if(!globalTextureName){
thrd->shareGroup->genName(TEXTURE,localTexName);
globalTextureName = thrd->shareGroup->getGlobalName(TEXTURE,localTexName);
ctx->shareGroup()->genName(TEXTURE,localTexName);
globalTextureName = ctx->shareGroup()->getGlobalName(TEXTURE,localTexName);
}
TextureData* texData = getTextureData(localTexName);
@@ -478,9 +477,9 @@ GL_API void GL_APIENTRY glCullFace( GLenum mode) {
GL_API void GL_APIENTRY glDeleteBuffers( GLsizei n, const GLuint *buffers) {
GET_CTX()
SET_ERROR_IF(n<0,GL_INVALID_VALUE);
if(thrd->shareGroup.Ptr()) {
if(ctx->shareGroup().Ptr()) {
for(int i=0; i < n; i++){
thrd->shareGroup->deleteName(VERTEXBUFFER,buffers[i]);
ctx->shareGroup()->deleteName(VERTEXBUFFER,buffers[i]);
ctx->unbindBuffer(buffers[i]);
}
}
@@ -489,12 +488,12 @@ GL_API void GL_APIENTRY glDeleteBuffers( GLsizei n, const GLuint *buffers) {
GL_API void GL_APIENTRY glDeleteTextures( GLsizei n, const GLuint *textures) {
GET_CTX()
SET_ERROR_IF(n<0,GL_INVALID_VALUE);
if(thrd->shareGroup.Ptr()) {
if(ctx->shareGroup().Ptr()) {
for(int i=0; i < n; i++){
if(textures[i] != 0)
{
thrd->shareGroup->deleteName(TEXTURE,textures[i]);
const GLuint globalTextureName = thrd->shareGroup->getGlobalName(TEXTURE,textures[i]);
ctx->shareGroup()->deleteName(TEXTURE,textures[i]);
const GLuint globalTextureName = ctx->shareGroup()->getGlobalName(TEXTURE,textures[i]);
ctx->dispatcher().glDeleteTextures(1,&globalTextureName);
if(ctx->getBindedTexture(GL_TEXTURE_2D) == textures[i])
@@ -666,20 +665,20 @@ GL_API void GL_APIENTRY glFrustumx( GLfixed left, GLfixed right, GLfixed bottom
GL_API void GL_APIENTRY glGenBuffers( GLsizei n, GLuint *buffers) {
GET_CTX()
SET_ERROR_IF(n<0,GL_INVALID_VALUE);
if(thrd->shareGroup.Ptr()) {
if(ctx->shareGroup().Ptr()) {
for(int i=0; i<n ;i++) {
buffers[i] = thrd->shareGroup->genName(VERTEXBUFFER, 0, true);
buffers[i] = ctx->shareGroup()->genName(VERTEXBUFFER, 0, true);
//generating vbo object related to this buffer name
thrd->shareGroup->setObjectData(VERTEXBUFFER,buffers[i],ObjectDataPtr(new GLESbuffer()));
ctx->shareGroup()->setObjectData(VERTEXBUFFER,buffers[i],ObjectDataPtr(new GLESbuffer()));
}
}
}
GL_API void GL_APIENTRY glGenTextures( GLsizei n, GLuint *textures) {
GET_CTX();
if(thrd->shareGroup.Ptr()) {
if(ctx->shareGroup().Ptr()) {
for(int i=0; i<n ;i++) {
textures[i] = thrd->shareGroup->genName(TEXTURE, 0, true);
textures[i] = ctx->shareGroup()->genName(TEXTURE, 0, true);
}
}
}
@@ -870,15 +869,15 @@ GL_API void GL_APIENTRY glGetIntegerv( GLenum pname, GLint *params) {
ctx->dispatcher().glGetIntegerv(GL_TEXTURE_GEN_S,&params[0]);
break;
case GL_FRAMEBUFFER_BINDING_OES:
if (thrd->shareGroup.Ptr()) {
if (ctx->shareGroup().Ptr()) {
ctx->dispatcher().glGetIntegerv(pname,&i);
*params = thrd->shareGroup->getLocalName(FRAMEBUFFER,i);
*params = ctx->shareGroup()->getLocalName(FRAMEBUFFER,i);
}
break;
case GL_RENDERBUFFER_BINDING_OES:
if (thrd->shareGroup.Ptr()) {
if (ctx->shareGroup().Ptr()) {
ctx->dispatcher().glGetIntegerv(pname,&i);
*params = thrd->shareGroup->getLocalName(RENDERBUFFER,i);
*params = ctx->shareGroup()->getLocalName(RENDERBUFFER,i);
}
break;
case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
@@ -1445,7 +1444,7 @@ GL_API void GL_APIENTRY glTexImage2D( GLenum target, GLint level, GLint interna
ctx->dispatcher().glTexImage2D(target,level,internalformat,width,height,border,format,type,pixels);
if (thrd->shareGroup.Ptr()){
if (ctx->shareGroup().Ptr()){
TextureData *texData = getTextureTargetData(target);
SET_ERROR_IF(texData==NULL,GL_INVALID_OPERATION);
if(texData) {
@@ -1574,7 +1573,7 @@ GL_API void GL_APIENTRY glTexSubImage2D( GLenum target, GLint level, GLint xoff
ctx->dispatcher().glTexSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels);
if (thrd->shareGroup.Ptr()){
if (ctx->shareGroup().Ptr()){
TextureData *texData = getTextureTargetData(target);
SET_ERROR_IF(texData==NULL,GL_INVALID_OPERATION);
if(texData && texData->requiresAutoMipmap)
@@ -1615,15 +1614,15 @@ GL_API void GL_APIENTRY glEGLImageTargetTexture2DOES(GLenum target, GLeglImageOE
// Create the texture object in the underlying EGL implementation,
// flag to the OpenGL layer to skip the image creation and map the
// current binded texture object to the existing global object.
if (thrd->shareGroup.Ptr()) {
if (ctx->shareGroup().Ptr()) {
ObjectLocalName tex = TextureLocalName(target,ctx->getBindedTexture(target));
unsigned int oldGlobal = thrd->shareGroup->getGlobalName(TEXTURE, tex);
unsigned int oldGlobal = ctx->shareGroup()->getGlobalName(TEXTURE, tex);
// Delete old texture object
if (oldGlobal) {
ctx->dispatcher().glDeleteTextures(1, &oldGlobal);
}
// replace mapping and bind the new global object
thrd->shareGroup->replaceGlobalName(TEXTURE, tex,img->globalTexName);
ctx->shareGroup()->replaceGlobalName(TEXTURE, tex,img->globalTexName);
ctx->dispatcher().glBindTexture(GL_TEXTURE_2D, img->globalTexName);
TextureData *texData = getTextureTargetData(target);
SET_ERROR_IF(texData==NULL,GL_INVALID_OPERATION);
@@ -1666,8 +1665,8 @@ GL_API void GL_APIENTRY glBlendFuncSeparateOES(GLenum srcRGB, GLenum dstRGB, GLe
GL_API GLboolean GL_APIENTRY glIsRenderbufferOES(GLuint renderbuffer) {
GET_CTX_RET(GL_FALSE)
RET_AND_SET_ERROR_IF(!ctx->getCaps()->GL_EXT_FRAMEBUFFER_OBJECT,GL_INVALID_OPERATION,GL_FALSE);
if(renderbuffer && thrd->shareGroup.Ptr()){
return thrd->shareGroup->isObject(RENDERBUFFER,renderbuffer) ? GL_TRUE :GL_FALSE;
if(renderbuffer && ctx->shareGroup().Ptr()){
return ctx->shareGroup()->isObject(RENDERBUFFER,renderbuffer) ? GL_TRUE :GL_FALSE;
}
return ctx->dispatcher().glIsRenderbufferEXT(renderbuffer);
}
@@ -1678,11 +1677,11 @@ GL_API void GLAPIENTRY glBindRenderbufferOES(GLenum target, GLuint renderbuffer)
SET_ERROR_IF(!GLEScmValidate::renderbufferTarget(target),GL_INVALID_ENUM);
//if buffer wasn't generated before,generate one
if(renderbuffer && thrd->shareGroup.Ptr() && !thrd->shareGroup->isObject(RENDERBUFFER,renderbuffer)){
thrd->shareGroup->genName(RENDERBUFFER,renderbuffer);
if(renderbuffer && ctx->shareGroup().Ptr() && !ctx->shareGroup()->isObject(RENDERBUFFER,renderbuffer)){
ctx->shareGroup()->genName(RENDERBUFFER,renderbuffer);
}
int globalBufferName = (renderbuffer != 0) ? thrd->shareGroup->getGlobalName(RENDERBUFFER,renderbuffer) : 0;
int globalBufferName = (renderbuffer != 0) ? ctx->shareGroup()->getGlobalName(RENDERBUFFER,renderbuffer) : 0;
ctx->dispatcher().glBindRenderbufferEXT(target,globalBufferName);
}
@@ -1690,7 +1689,7 @@ GL_API void GLAPIENTRY glDeleteRenderbuffersOES(GLsizei n, const GLuint *renderb
GET_CTX()
SET_ERROR_IF(!ctx->getCaps()->GL_EXT_FRAMEBUFFER_OBJECT,GL_INVALID_OPERATION);
for (int i=0;i<n;++i) {
GLuint globalBufferName = thrd->shareGroup->getGlobalName(RENDERBUFFER,renderbuffers[i]);
GLuint globalBufferName = ctx->shareGroup()->getGlobalName(RENDERBUFFER,renderbuffers[i]);
ctx->dispatcher().glDeleteRenderbuffersEXT(1,&globalBufferName);
}
}
@@ -1699,9 +1698,9 @@ GL_API void GLAPIENTRY glGenRenderbuffersOES(GLsizei n, GLuint *renderbuffers) {
GET_CTX()
SET_ERROR_IF(!ctx->getCaps()->GL_EXT_FRAMEBUFFER_OBJECT,GL_INVALID_OPERATION);
SET_ERROR_IF(n<0,GL_INVALID_VALUE);
if(thrd->shareGroup.Ptr()) {
if(ctx->shareGroup().Ptr()) {
for(int i=0; i<n ;i++) {
renderbuffers[i] = thrd->shareGroup->genName(RENDERBUFFER, 0, true);
renderbuffers[i] = ctx->shareGroup()->genName(RENDERBUFFER, 0, true);
}
}
}
@@ -1725,8 +1724,8 @@ GL_API void GLAPIENTRY glGetRenderbufferParameterivOES(GLenum target, GLenum pna
GL_API GLboolean GLAPIENTRY glIsFramebufferOES(GLuint framebuffer) {
GET_CTX_RET(GL_FALSE)
RET_AND_SET_ERROR_IF(!ctx->getCaps()->GL_EXT_FRAMEBUFFER_OBJECT,GL_INVALID_OPERATION,GL_FALSE);
if (framebuffer && thrd->shareGroup.Ptr()) {
return thrd->shareGroup->isObject(FRAMEBUFFER,framebuffer) ? GL_TRUE : GL_FALSE;
if (framebuffer && ctx->shareGroup().Ptr()) {
return ctx->shareGroup()->isObject(FRAMEBUFFER,framebuffer) ? GL_TRUE : GL_FALSE;
}
return ctx->dispatcher().glIsFramebufferEXT(framebuffer);
}
@@ -1735,10 +1734,10 @@ GL_API void GLAPIENTRY glBindFramebufferOES(GLenum target, GLuint framebuffer) {
GET_CTX()
SET_ERROR_IF(!ctx->getCaps()->GL_EXT_FRAMEBUFFER_OBJECT,GL_INVALID_OPERATION);
SET_ERROR_IF(!GLEScmValidate::framebufferTarget(target) ,GL_INVALID_ENUM);
if (framebuffer && thrd->shareGroup.Ptr() && !thrd->shareGroup->isObject(FRAMEBUFFER,framebuffer)) {
thrd->shareGroup->genName(FRAMEBUFFER,framebuffer);
if (framebuffer && ctx->shareGroup().Ptr() && !ctx->shareGroup()->isObject(FRAMEBUFFER,framebuffer)) {
ctx->shareGroup()->genName(FRAMEBUFFER,framebuffer);
}
int globalBufferName = (framebuffer!=0) ? thrd->shareGroup->getGlobalName(FRAMEBUFFER,framebuffer) : 0;
int globalBufferName = (framebuffer!=0) ? ctx->shareGroup()->getGlobalName(FRAMEBUFFER,framebuffer) : 0;
ctx->dispatcher().glBindFramebufferEXT(target,globalBufferName);
}
@@ -1746,7 +1745,7 @@ GL_API void GLAPIENTRY glDeleteFramebuffersOES(GLsizei n, const GLuint *framebuf
GET_CTX()
SET_ERROR_IF(!ctx->getCaps()->GL_EXT_FRAMEBUFFER_OBJECT,GL_INVALID_OPERATION);
for (int i=0;i<n;++i) {
GLuint globalBufferName = thrd->shareGroup->getGlobalName(FRAMEBUFFER,framebuffers[i]);
GLuint globalBufferName = ctx->shareGroup()->getGlobalName(FRAMEBUFFER,framebuffers[i]);
ctx->dispatcher().glDeleteFramebuffersEXT(1,&globalBufferName);
}
}
@@ -1755,9 +1754,9 @@ GL_API void GLAPIENTRY glGenFramebuffersOES(GLsizei n, GLuint *framebuffers) {
GET_CTX()
SET_ERROR_IF(!ctx->getCaps()->GL_EXT_FRAMEBUFFER_OBJECT,GL_INVALID_OPERATION);
SET_ERROR_IF(n<0,GL_INVALID_VALUE);
if (thrd->shareGroup.Ptr()) {
if (ctx->shareGroup().Ptr()) {
for (int i=0;i<n;i++) {
framebuffers[i] = thrd->shareGroup->genName(FRAMEBUFFER, 0, true);
framebuffers[i] = ctx->shareGroup()->genName(FRAMEBUFFER, 0, true);
}
}
}
@@ -1774,10 +1773,10 @@ GL_API void GLAPIENTRY glFramebufferTexture2DOES(GLenum target, GLenum attachmen
SET_ERROR_IF(!ctx->getCaps()->GL_EXT_FRAMEBUFFER_OBJECT,GL_INVALID_OPERATION);
SET_ERROR_IF(!GLEScmValidate::framebufferTarget(target) || !GLEScmValidate::framebufferAttachment(attachment) ||
!GLEScmValidate::textureTargetEx(textarget),GL_INVALID_ENUM);
if (thrd->shareGroup.Ptr() && !thrd->shareGroup->isObject(TEXTURE,texture)) {
thrd->shareGroup->genName(TEXTURE,texture);
if (ctx->shareGroup().Ptr() && !ctx->shareGroup()->isObject(TEXTURE,texture)) {
ctx->shareGroup()->genName(TEXTURE,texture);
}
GLuint globalTexName = thrd->shareGroup->getGlobalName(TEXTURE,texture);
GLuint globalTexName = ctx->shareGroup()->getGlobalName(TEXTURE,texture);
ctx->dispatcher().glFramebufferTexture2DEXT(target,attachment,textarget,globalTexName,level);
}
@@ -1786,10 +1785,10 @@ GL_API void GLAPIENTRY glFramebufferRenderbufferOES(GLenum target, GLenum attach
SET_ERROR_IF(!ctx->getCaps()->GL_EXT_FRAMEBUFFER_OBJECT,GL_INVALID_OPERATION);
SET_ERROR_IF(!GLEScmValidate::framebufferTarget(target) || !GLEScmValidate::framebufferAttachment(attachment) ||
!GLEScmValidate::renderbufferTarget(renderbuffertarget), GL_INVALID_ENUM);
if (thrd->shareGroup.Ptr() && !thrd->shareGroup->isObject(RENDERBUFFER,renderbuffer)) {
thrd->shareGroup->genName(RENDERBUFFER,renderbuffer);
if (ctx->shareGroup().Ptr() && !ctx->shareGroup()->isObject(RENDERBUFFER,renderbuffer)) {
ctx->shareGroup()->genName(RENDERBUFFER,renderbuffer);
}
GLuint globalBufferName = thrd->shareGroup->getGlobalName(RENDERBUFFER,renderbuffer);
GLuint globalBufferName = ctx->shareGroup()->getGlobalName(RENDERBUFFER,renderbuffer);
ctx->dispatcher().glFramebufferRenderbufferEXT(target,attachment,renderbuffertarget,globalBufferName);
}
@@ -2012,7 +2011,7 @@ void glDrawTexOES (T x, T y, T z, T width, T height) {
unsigned int texname = ctx->getBindedTexture(GL_TEXTURE0+i,GL_TEXTURE_2D);
ObjectLocalName tex = TextureLocalName(GL_TEXTURE_2D,texname);
ctx->dispatcher().glClientActiveTexture(GL_TEXTURE0+i);
ObjectDataPtr objData = thrd->shareGroup->getObjectData(TEXTURE,tex);
ObjectDataPtr objData = ctx->shareGroup()->getObjectData(TEXTURE,tex);
if (objData.Ptr()) {
texData = (TextureData*)objData.Ptr();
//calculate texels

View File

@@ -25,7 +25,6 @@
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
#include <GLcommon/TranslatorIfaces.h>
#include <GLcommon/ThreadInfo.h>
#include <GLcommon/gldefs.h>
#include "GLESv2Context.h"
#include "GLESv2Validate.h"
@@ -124,10 +123,10 @@ static ObjectLocalName TextureLocalName(GLenum target,unsigned int tex) {
static TextureData* getTextureData(ObjectLocalName tex) {
GET_CTX_RET(NULL);
TextureData *texData = NULL;
ObjectDataPtr objData = thrd->shareGroup->getObjectData(TEXTURE,tex);
ObjectDataPtr objData = ctx->shareGroup()->getObjectData(TEXTURE,tex);
if(!objData.Ptr()){
texData = new TextureData();
thrd->shareGroup->setObjectData(TEXTURE, tex, ObjectDataPtr(texData));
ctx->shareGroup()->setObjectData(TEXTURE, tex, ObjectDataPtr(texData));
} else {
texData = (TextureData*)objData.Ptr();
}
@@ -149,14 +148,14 @@ GL_APICALL void GL_APIENTRY glActiveTexture(GLenum texture){
GL_APICALL void GL_APIENTRY glAttachShader(GLuint program, GLuint shader){
GET_CTX();
if(thrd->shareGroup.Ptr()) {
const GLuint globalProgramName = thrd->shareGroup->getGlobalName(SHADER,program);
if(ctx->shareGroup().Ptr()) {
const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
const GLuint globalShaderName = thrd->shareGroup->getGlobalName(SHADER,shader);
const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shader);
SET_ERROR_IF(globalShaderName==0, GL_INVALID_VALUE);
ObjectDataPtr programData = thrd->shareGroup->getObjectData(SHADER,program);
ObjectDataPtr shaderData = thrd->shareGroup->getObjectData(SHADER,shader);
ObjectDataPtr programData = ctx->shareGroup()->getObjectData(SHADER,program);
ObjectDataPtr shaderData = ctx->shareGroup()->getObjectData(SHADER,shader);
SET_ERROR_IF(!shaderData.Ptr() || !programData.Ptr() ,GL_INVALID_OPERATION);
SET_ERROR_IF(!(shaderData.Ptr()->getDataType() ==SHADER_DATA) ||
!(programData.Ptr()->getDataType()==PROGRAM_DATA) ,GL_INVALID_OPERATION);
@@ -171,8 +170,8 @@ GL_APICALL void GL_APIENTRY glAttachShader(GLuint program, GLuint shader){
GL_APICALL void GL_APIENTRY glBindAttribLocation(GLuint program, GLuint index, const GLchar* name){
GET_CTX();
if(thrd->shareGroup.Ptr()) {
const GLuint globalProgramName = thrd->shareGroup->getGlobalName(SHADER,program);
if(ctx->shareGroup().Ptr()) {
const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
ctx->dispatcher().glBindAttribLocation(globalProgramName,index,name);
}
@@ -182,13 +181,13 @@ GL_APICALL void GL_APIENTRY glBindBuffer(GLenum target, GLuint buffer){
GET_CTX();
SET_ERROR_IF(!GLESv2Validate::bufferTarget(target),GL_INVALID_ENUM);
//if buffer wasn't generated before,generate one
if(buffer && thrd->shareGroup.Ptr() && !thrd->shareGroup->isObject(VERTEXBUFFER,buffer)){
thrd->shareGroup->genName(VERTEXBUFFER,buffer);
thrd->shareGroup->setObjectData(VERTEXBUFFER,buffer,ObjectDataPtr(new GLESbuffer()));
if(buffer && ctx->shareGroup().Ptr() && !ctx->shareGroup()->isObject(VERTEXBUFFER,buffer)){
ctx->shareGroup()->genName(VERTEXBUFFER,buffer);
ctx->shareGroup()->setObjectData(VERTEXBUFFER,buffer,ObjectDataPtr(new GLESbuffer()));
}
ctx->bindBuffer(target,buffer);
if (buffer) {
GLESbuffer* vbo = (GLESbuffer*)thrd->shareGroup->getObjectData(VERTEXBUFFER,buffer).Ptr();
GLESbuffer* vbo = (GLESbuffer*)ctx->shareGroup()->getObjectData(VERTEXBUFFER,buffer).Ptr();
vbo->setBinded();
}
}
@@ -198,12 +197,12 @@ GL_APICALL void GL_APIENTRY glBindFramebuffer(GLenum target, GLuint framebuffer
SET_ERROR_IF(!GLESv2Validate::framebufferTarget(target),GL_INVALID_ENUM);
GLuint globalFrameBufferName = framebuffer;
if(framebuffer && thrd->shareGroup.Ptr()){
globalFrameBufferName = thrd->shareGroup->getGlobalName(FRAMEBUFFER,framebuffer);
if(framebuffer && ctx->shareGroup().Ptr()){
globalFrameBufferName = ctx->shareGroup()->getGlobalName(FRAMEBUFFER,framebuffer);
//if framebuffer wasn't generated before,generate one
if(!globalFrameBufferName){
thrd->shareGroup->genName(FRAMEBUFFER,framebuffer);
globalFrameBufferName = thrd->shareGroup->getGlobalName(FRAMEBUFFER,framebuffer);
ctx->shareGroup()->genName(FRAMEBUFFER,framebuffer);
globalFrameBufferName = ctx->shareGroup()->getGlobalName(FRAMEBUFFER,framebuffer);
}
}
ctx->dispatcher().glBindFramebufferEXT(target,globalFrameBufferName);
@@ -214,12 +213,12 @@ GL_APICALL void GL_APIENTRY glBindRenderbuffer(GLenum target, GLuint renderbuff
SET_ERROR_IF(!GLESv2Validate::renderbufferTarget(target),GL_INVALID_ENUM);
GLuint globalRenderBufferName = renderbuffer;
if(renderbuffer && thrd->shareGroup.Ptr()){
globalRenderBufferName = thrd->shareGroup->getGlobalName(RENDERBUFFER,renderbuffer);
if(renderbuffer && ctx->shareGroup().Ptr()){
globalRenderBufferName = ctx->shareGroup()->getGlobalName(RENDERBUFFER,renderbuffer);
//if renderbuffer wasn't generated before,generate one
if(!globalRenderBufferName){
thrd->shareGroup->genName(RENDERBUFFER,renderbuffer);
globalRenderBufferName = thrd->shareGroup->getGlobalName(RENDERBUFFER,renderbuffer);
ctx->shareGroup()->genName(RENDERBUFFER,renderbuffer);
globalRenderBufferName = ctx->shareGroup()->getGlobalName(RENDERBUFFER,renderbuffer);
}
}
ctx->dispatcher().glBindRenderbufferEXT(target,globalRenderBufferName);
@@ -233,12 +232,12 @@ GL_APICALL void GL_APIENTRY glBindTexture(GLenum target, GLuint texture){
ObjectLocalName localTexName = TextureLocalName(target,texture);
GLuint globalTextureName = localTexName;
if(thrd->shareGroup.Ptr()){
globalTextureName = thrd->shareGroup->getGlobalName(TEXTURE,localTexName);
if(ctx->shareGroup().Ptr()){
globalTextureName = ctx->shareGroup()->getGlobalName(TEXTURE,localTexName);
//if texture wasn't generated before,generate one
if(!globalTextureName){
thrd->shareGroup->genName(TEXTURE,localTexName);
globalTextureName = thrd->shareGroup->getGlobalName(TEXTURE,localTexName);
ctx->shareGroup()->genName(TEXTURE,localTexName);
globalTextureName = ctx->shareGroup()->getGlobalName(TEXTURE,localTexName);
}
TextureData* texData = getTextureData(localTexName);
@@ -327,8 +326,8 @@ GL_APICALL void GL_APIENTRY glColorMask(GLboolean red, GLboolean green, GLboole
GL_APICALL void GL_APIENTRY glCompileShader(GLuint shader){
GET_CTX();
if(thrd->shareGroup.Ptr()) {
const GLuint globalShaderName = thrd->shareGroup->getGlobalName(SHADER,shader);
if(ctx->shareGroup().Ptr()) {
const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shader);
SET_ERROR_IF(globalShaderName==0, GL_INVALID_VALUE);
ctx->dispatcher().glCompileShader(globalShaderName);
}
@@ -366,11 +365,11 @@ GL_APICALL void GL_APIENTRY glCopyTexSubImage2D(GLenum target, GLint level, GLi
GL_APICALL GLuint GL_APIENTRY glCreateProgram(void){
GET_CTX_RET(0);
const GLuint globalProgramName = ctx->dispatcher().glCreateProgram();
if(thrd->shareGroup.Ptr() && globalProgramName) {
if(ctx->shareGroup().Ptr() && globalProgramName) {
ProgramData* programInfo = new ProgramData();
const GLuint localProgramName = thrd->shareGroup->genName(SHADER, 0, true);
thrd->shareGroup->replaceGlobalName(SHADER,localProgramName,globalProgramName);
thrd->shareGroup->setObjectData(SHADER,localProgramName,ObjectDataPtr(programInfo));
const GLuint localProgramName = ctx->shareGroup()->genName(SHADER, 0, true);
ctx->shareGroup()->replaceGlobalName(SHADER,localProgramName,globalProgramName);
ctx->shareGroup()->setObjectData(SHADER,localProgramName,ObjectDataPtr(programInfo));
return localProgramName;
}
if(globalProgramName){
@@ -382,11 +381,11 @@ GL_APICALL GLuint GL_APIENTRY glCreateProgram(void){
GL_APICALL GLuint GL_APIENTRY glCreateShader(GLenum type){
GET_CTX_V2_RET(0);
const GLuint globalShaderName = ctx->dispatcher().glCreateShader(type);
if(thrd->shareGroup.Ptr() && globalShaderName) {
const GLuint localShaderName = thrd->shareGroup->genName(SHADER, 0, true);
if(ctx->shareGroup().Ptr() && globalShaderName) {
const GLuint localShaderName = ctx->shareGroup()->genName(SHADER, 0, true);
ShaderParser* sp = new ShaderParser(type);
thrd->shareGroup->replaceGlobalName(SHADER,localShaderName,globalShaderName);
thrd->shareGroup->setObjectData(SHADER,localShaderName,ObjectDataPtr(sp));
ctx->shareGroup()->replaceGlobalName(SHADER,localShaderName,globalShaderName);
ctx->shareGroup()->setObjectData(SHADER,localShaderName,ObjectDataPtr(sp));
return localShaderName;
}
if(globalShaderName){
@@ -403,9 +402,9 @@ GL_APICALL void GL_APIENTRY glCullFace(GLenum mode){
GL_APICALL void GL_APIENTRY glDeleteBuffers(GLsizei n, const GLuint* buffers){
GET_CTX();
SET_ERROR_IF(n<0,GL_INVALID_VALUE);
if(thrd->shareGroup.Ptr()) {
if(ctx->shareGroup().Ptr()) {
for(int i=0; i < n; i++){
thrd->shareGroup->deleteName(VERTEXBUFFER,buffers[i]);
ctx->shareGroup()->deleteName(VERTEXBUFFER,buffers[i]);
}
}
}
@@ -413,10 +412,10 @@ GL_APICALL void GL_APIENTRY glDeleteBuffers(GLsizei n, const GLuint* buffers){
GL_APICALL void GL_APIENTRY glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers){
GET_CTX();
SET_ERROR_IF(n<0,GL_INVALID_VALUE);
if(thrd->shareGroup.Ptr()) {
if(ctx->shareGroup().Ptr()) {
for(int i=0; i < n; i++){
const GLuint globalFrameBufferName = thrd->shareGroup->getGlobalName(FRAMEBUFFER,framebuffers[i]);
thrd->shareGroup->deleteName(FRAMEBUFFER,framebuffers[i]);
const GLuint globalFrameBufferName = ctx->shareGroup()->getGlobalName(FRAMEBUFFER,framebuffers[i]);
ctx->shareGroup()->deleteName(FRAMEBUFFER,framebuffers[i]);
ctx->dispatcher().glDeleteFramebuffersEXT(1,&globalFrameBufferName);
}
}
@@ -425,10 +424,10 @@ GL_APICALL void GL_APIENTRY glDeleteFramebuffers(GLsizei n, const GLuint* frame
GL_APICALL void GL_APIENTRY glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers){
GET_CTX();
SET_ERROR_IF(n<0,GL_INVALID_VALUE);
if(thrd->shareGroup.Ptr()) {
if(ctx->shareGroup().Ptr()) {
for(int i=0; i < n; i++){
const GLuint globalRenderBufferName = thrd->shareGroup->getGlobalName(RENDERBUFFER,renderbuffers[i]);
thrd->shareGroup->deleteName(RENDERBUFFER,renderbuffers[i]);
const GLuint globalRenderBufferName = ctx->shareGroup()->getGlobalName(RENDERBUFFER,renderbuffers[i]);
ctx->shareGroup()->deleteName(RENDERBUFFER,renderbuffers[i]);
ctx->dispatcher().glDeleteRenderbuffersEXT(1,&globalRenderBufferName);
}
}
@@ -437,11 +436,11 @@ GL_APICALL void GL_APIENTRY glDeleteRenderbuffers(GLsizei n, const GLuint* rend
GL_APICALL void GL_APIENTRY glDeleteTextures(GLsizei n, const GLuint* textures){
GET_CTX();
SET_ERROR_IF(n<0,GL_INVALID_VALUE);
if(thrd->shareGroup.Ptr()) {
if(ctx->shareGroup().Ptr()) {
for(int i=0; i < n; i++){
if (textures[i]!=0) {
const GLuint globalTextureName = thrd->shareGroup->getGlobalName(TEXTURE,textures[i]);
thrd->shareGroup->deleteName(TEXTURE,textures[i]);
const GLuint globalTextureName = ctx->shareGroup()->getGlobalName(TEXTURE,textures[i]);
ctx->shareGroup()->deleteName(TEXTURE,textures[i]);
ctx->dispatcher().glDeleteTextures(1,&globalTextureName);
if (ctx->getBindedTexture(GL_TEXTURE_2D) == textures[i])
@@ -455,20 +454,20 @@ GL_APICALL void GL_APIENTRY glDeleteTextures(GLsizei n, const GLuint* textures)
GL_APICALL void GL_APIENTRY glDeleteProgram(GLuint program){
GET_CTX();
if(program && thrd->shareGroup.Ptr()) {
const GLuint globalProgramName = thrd->shareGroup->getGlobalName(SHADER,program);
if(program && ctx->shareGroup().Ptr()) {
const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
SET_ERROR_IF(!globalProgramName, GL_INVALID_VALUE);
thrd->shareGroup->deleteName(SHADER,program);
ctx->shareGroup()->deleteName(SHADER,program);
ctx->dispatcher().glDeleteProgram(globalProgramName);
}
}
GL_APICALL void GL_APIENTRY glDeleteShader(GLuint shader){
GET_CTX();
if(shader && thrd->shareGroup.Ptr()) {
const GLuint globalShaderName = thrd->shareGroup->getGlobalName(SHADER,shader);
if(shader && ctx->shareGroup().Ptr()) {
const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shader);
SET_ERROR_IF(!globalShaderName, GL_INVALID_VALUE);
thrd->shareGroup->deleteName(SHADER,shader);
ctx->shareGroup()->deleteName(SHADER,shader);
ctx->dispatcher().glDeleteShader(globalShaderName);
}
@@ -489,13 +488,13 @@ GL_APICALL void GL_APIENTRY glDepthRangef(GLclampf zNear, GLclampf zFar){
GL_APICALL void GL_APIENTRY glDetachShader(GLuint program, GLuint shader){
GET_CTX();
if(thrd->shareGroup.Ptr()) {
const GLuint globalProgramName = thrd->shareGroup->getGlobalName(SHADER,program);
if(ctx->shareGroup().Ptr()) {
const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
const GLuint globalShaderName = thrd->shareGroup->getGlobalName(SHADER,shader);
const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shader);
SET_ERROR_IF(globalShaderName==0, GL_INVALID_VALUE);
ObjectDataPtr objData = thrd->shareGroup->getObjectData(SHADER,program);
ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program);
SET_ERROR_IF(!objData.Ptr(),GL_INVALID_OPERATION);
SET_ERROR_IF(!(objData.Ptr()->getDataType()==PROGRAM_DATA) ,GL_INVALID_OPERATION);
@@ -599,8 +598,8 @@ GL_APICALL void GL_APIENTRY glFramebufferRenderbuffer(GLenum target, GLenum att
GLESv2Validate::renderbufferTarget(renderbuffertarget) &&
GLESv2Validate::framebufferAttachment(attachment)),GL_INVALID_ENUM);
if(thrd->shareGroup.Ptr()) {
GLuint globalRenderbufferName = thrd->shareGroup->getGlobalName(RENDERBUFFER,renderbuffer);
if(ctx->shareGroup().Ptr()) {
GLuint globalRenderbufferName = ctx->shareGroup()->getGlobalName(RENDERBUFFER,renderbuffer);
ctx->dispatcher().glFramebufferRenderbufferEXT(target,attachment,renderbuffertarget,globalRenderbufferName);
}
@@ -613,9 +612,9 @@ GL_APICALL void GL_APIENTRY glFramebufferTexture2D(GLenum target, GLenum attach
GLESv2Validate::framebufferAttachment(attachment)),GL_INVALID_ENUM);
SET_ERROR_IF(level != 0, GL_INVALID_VALUE);
if(thrd->shareGroup.Ptr()) {
if(ctx->shareGroup().Ptr()) {
ObjectLocalName texname = TextureLocalName(textarget,texture);
GLuint globalTextureName = thrd->shareGroup->getGlobalName(TEXTURE,texname);
GLuint globalTextureName = ctx->shareGroup()->getGlobalName(TEXTURE,texname);
ctx->dispatcher().glFramebufferTexture2DEXT(target,attachment,textarget,globalTextureName,level);
}
}
@@ -629,11 +628,11 @@ GL_APICALL void GL_APIENTRY glFrontFace(GLenum mode){
GL_APICALL void GL_APIENTRY glGenBuffers(GLsizei n, GLuint* buffers){
GET_CTX();
SET_ERROR_IF(n<0,GL_INVALID_VALUE);
if(thrd->shareGroup.Ptr()) {
if(ctx->shareGroup().Ptr()) {
for(int i=0; i<n ;i++) {
buffers[i] = thrd->shareGroup->genName(VERTEXBUFFER, 0, true);
buffers[i] = ctx->shareGroup()->genName(VERTEXBUFFER, 0, true);
//generating vbo object related to this buffer name
thrd->shareGroup->setObjectData(VERTEXBUFFER,buffers[i],ObjectDataPtr(new GLESbuffer()));
ctx->shareGroup()->setObjectData(VERTEXBUFFER,buffers[i],ObjectDataPtr(new GLESbuffer()));
}
}
}
@@ -647,9 +646,9 @@ GL_APICALL void GL_APIENTRY glGenerateMipmap(GLenum target){
GL_APICALL void GL_APIENTRY glGenFramebuffers(GLsizei n, GLuint* framebuffers){
GET_CTX();
SET_ERROR_IF(n<0,GL_INVALID_VALUE);
if(thrd->shareGroup.Ptr()) {
if(ctx->shareGroup().Ptr()) {
for(int i=0; i<n ;i++) {
framebuffers[i] = thrd->shareGroup->genName(FRAMEBUFFER, 0 ,true);
framebuffers[i] = ctx->shareGroup()->genName(FRAMEBUFFER, 0 ,true);
}
}
}
@@ -657,9 +656,9 @@ GL_APICALL void GL_APIENTRY glGenFramebuffers(GLsizei n, GLuint* framebuffers){
GL_APICALL void GL_APIENTRY glGenRenderbuffers(GLsizei n, GLuint* renderbuffers){
GET_CTX();
SET_ERROR_IF(n<0,GL_INVALID_VALUE);
if(thrd->shareGroup.Ptr()) {
if(ctx->shareGroup().Ptr()) {
for(int i=0; i<n ;i++) {
renderbuffers[i] = thrd->shareGroup->genName(RENDERBUFFER, 0, true);
renderbuffers[i] = ctx->shareGroup()->genName(RENDERBUFFER, 0, true);
}
}
}
@@ -667,17 +666,17 @@ GL_APICALL void GL_APIENTRY glGenRenderbuffers(GLsizei n, GLuint* renderbuffers
GL_APICALL void GL_APIENTRY glGenTextures(GLsizei n, GLuint* textures){
GET_CTX();
SET_ERROR_IF(n<0,GL_INVALID_VALUE);
if(thrd->shareGroup.Ptr()) {
if(ctx->shareGroup().Ptr()) {
for(int i=0; i<n ;i++) {
textures[i] = thrd->shareGroup->genName(TEXTURE, 0, true);
textures[i] = ctx->shareGroup()->genName(TEXTURE, 0, true);
}
}
}
GL_APICALL void GL_APIENTRY glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name){
GET_CTX();
if(thrd->shareGroup.Ptr()) {
const GLuint globalProgramName = thrd->shareGroup->getGlobalName(SHADER,program);
if(ctx->shareGroup().Ptr()) {
const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
ctx->dispatcher().glGetActiveAttrib(globalProgramName,index,bufsize,length,size,type,name);
}
@@ -685,8 +684,8 @@ GL_APICALL void GL_APIENTRY glGetActiveAttrib(GLuint program, GLuint index, GLs
GL_APICALL void GL_APIENTRY glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name){
GET_CTX();
if(thrd->shareGroup.Ptr()) {
const GLuint globalProgramName = thrd->shareGroup->getGlobalName(SHADER,program);
if(ctx->shareGroup().Ptr()) {
const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
ctx->dispatcher().glGetActiveUniform(globalProgramName,index,bufsize,length,size,type,name);
}
@@ -694,20 +693,20 @@ GL_APICALL void GL_APIENTRY glGetActiveUniform(GLuint program, GLuint index, GL
GL_APICALL void GL_APIENTRY glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders){
GET_CTX();
if(thrd->shareGroup.Ptr()) {
const GLuint globalProgramName = thrd->shareGroup->getGlobalName(SHADER,program);
if(ctx->shareGroup().Ptr()) {
const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
ctx->dispatcher().glGetAttachedShaders(globalProgramName,maxcount,count,shaders);
for(int i=0 ; i < *count ;i++){
shaders[i] = thrd->shareGroup->getLocalName(SHADER,shaders[i]);
shaders[i] = ctx->shareGroup()->getLocalName(SHADER,shaders[i]);
}
}
}
GL_APICALL int GL_APIENTRY glGetAttribLocation(GLuint program, const GLchar* name){
GET_CTX_RET(-1);
if(thrd->shareGroup.Ptr()) {
const GLuint globalProgramName = thrd->shareGroup->getGlobalName(SHADER,program);
if(ctx->shareGroup().Ptr()) {
const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
RET_AND_SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE,-1);
return ctx->dispatcher().glGetAttribLocation(globalProgramName,name);
}
@@ -835,21 +834,21 @@ GL_APICALL void GL_APIENTRY glGetIntegerv(GLenum pname, GLint* params){
switch (pname) {
case GL_CURRENT_PROGRAM:
if (thrd->shareGroup.Ptr()) {
if (ctx->shareGroup().Ptr()) {
ctx->dispatcher().glGetIntegerv(pname,&i);
*params = thrd->shareGroup->getLocalName(SHADER,i);
*params = ctx->shareGroup()->getLocalName(SHADER,i);
}
break;
case GL_FRAMEBUFFER_BINDING:
if (thrd->shareGroup.Ptr()) {
if (ctx->shareGroup().Ptr()) {
ctx->dispatcher().glGetIntegerv(pname,&i);
*params = thrd->shareGroup->getLocalName(FRAMEBUFFER,i);
*params = ctx->shareGroup()->getLocalName(FRAMEBUFFER,i);
}
break;
case GL_RENDERBUFFER_BINDING:
if (thrd->shareGroup.Ptr()) {
if (ctx->shareGroup().Ptr()) {
ctx->dispatcher().glGetIntegerv(pname,&i);
*params = thrd->shareGroup->getLocalName(RENDERBUFFER,i);
*params = ctx->shareGroup()->getLocalName(RENDERBUFFER,i);
}
break;
@@ -922,13 +921,13 @@ GL_APICALL void GL_APIENTRY glGetRenderbufferParameteriv(GLenum target, GLenum
GL_APICALL void GL_APIENTRY glGetProgramiv(GLuint program, GLenum pname, GLint* params){
GET_CTX();
if(thrd->shareGroup.Ptr()) {
const GLuint globalProgramName = thrd->shareGroup->getGlobalName(SHADER,program);
if(ctx->shareGroup().Ptr()) {
const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
switch(pname) {
case GL_LINK_STATUS:
{
ObjectDataPtr objData = thrd->shareGroup->getObjectData(SHADER,program);
ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program);
SET_ERROR_IF(!objData.Ptr() ,GL_INVALID_OPERATION);
SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
ProgramData* programData = (ProgramData*)objData.Ptr();
@@ -938,7 +937,7 @@ GL_APICALL void GL_APIENTRY glGetProgramiv(GLuint program, GLenum pname, GLint*
//validate status should not return GL_TRUE if link failed
case GL_VALIDATE_STATUS:
{
ObjectDataPtr objData = thrd->shareGroup->getObjectData(SHADER,program);
ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program);
SET_ERROR_IF(!objData.Ptr() ,GL_INVALID_OPERATION);
SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
ProgramData* programData = (ProgramData*)objData.Ptr();
@@ -956,8 +955,8 @@ GL_APICALL void GL_APIENTRY glGetProgramiv(GLuint program, GLenum pname, GLint*
GL_APICALL void GL_APIENTRY glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog){
GET_CTX();
if(thrd->shareGroup.Ptr()) {
const GLuint globalProgramName = thrd->shareGroup->getGlobalName(SHADER,program);
if(ctx->shareGroup().Ptr()) {
const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
ctx->dispatcher().glGetProgramInfoLog(globalProgramName,bufsize,length,infolog);
}
@@ -965,8 +964,8 @@ GL_APICALL void GL_APIENTRY glGetProgramInfoLog(GLuint program, GLsizei bufsize
GL_APICALL void GL_APIENTRY glGetShaderiv(GLuint shader, GLenum pname, GLint* params){
GET_CTX();
if(thrd->shareGroup.Ptr()) {
const GLuint globalShaderName = thrd->shareGroup->getGlobalName(SHADER,shader);
if(ctx->shareGroup().Ptr()) {
const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shader);
SET_ERROR_IF(globalShaderName==0, GL_INVALID_VALUE);
ctx->dispatcher().glGetShaderiv(globalShaderName,pname,params);
}
@@ -974,8 +973,8 @@ GL_APICALL void GL_APIENTRY glGetShaderiv(GLuint shader, GLenum pname, GLint* p
GL_APICALL void GL_APIENTRY glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog){
GET_CTX();
if(thrd->shareGroup.Ptr()) {
const GLuint globalShaderName = thrd->shareGroup->getGlobalName(SHADER,shader);
if(ctx->shareGroup().Ptr()) {
const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shader);
SET_ERROR_IF(globalShaderName==0, GL_INVALID_VALUE);
ctx->dispatcher().glGetShaderInfoLog(globalShaderName,bufsize,length,infolog);
}
@@ -1012,10 +1011,10 @@ GL_APICALL void GL_APIENTRY glGetShaderPrecisionFormat(GLenum shadertype, GLenu
GL_APICALL void GL_APIENTRY glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source){
GET_CTX();
if(thrd->shareGroup.Ptr()) {
const GLuint globalShaderName = thrd->shareGroup->getGlobalName(SHADER,shader);
if(ctx->shareGroup().Ptr()) {
const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shader);
SET_ERROR_IF(globalShaderName == 0,GL_INVALID_VALUE);
ObjectDataPtr objData = thrd->shareGroup->getObjectData(SHADER,shader);
ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,shader);
SET_ERROR_IF(!objData.Ptr(),GL_INVALID_OPERATION);
SET_ERROR_IF(objData.Ptr()->getDataType()!=SHADER_DATA,GL_INVALID_OPERATION);
const char* src = ((ShaderParser*)objData.Ptr())->getOriginalSrc();
@@ -1067,8 +1066,8 @@ GL_APICALL void GL_APIENTRY glGetTexParameteriv(GLenum target, GLenum pname, GL
GL_APICALL void GL_APIENTRY glGetUniformfv(GLuint program, GLint location, GLfloat* params){
GET_CTX();
if(thrd->shareGroup.Ptr()) {
const GLuint globalProgramName = thrd->shareGroup->getGlobalName(SHADER,program);
if(ctx->shareGroup().Ptr()) {
const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
ctx->dispatcher().glGetUniformfv(globalProgramName,location,params);
}
@@ -1076,8 +1075,8 @@ GL_APICALL void GL_APIENTRY glGetUniformfv(GLuint program, GLint location, GLfl
GL_APICALL void GL_APIENTRY glGetUniformiv(GLuint program, GLint location, GLint* params){
GET_CTX();
if(thrd->shareGroup.Ptr()) {
const GLuint globalProgramName = thrd->shareGroup->getGlobalName(SHADER,program);
if(ctx->shareGroup().Ptr()) {
const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
ctx->dispatcher().glGetUniformiv(globalProgramName,location,params);
}
@@ -1085,8 +1084,8 @@ GL_APICALL void GL_APIENTRY glGetUniformiv(GLuint program, GLint location, GLin
GL_APICALL int GL_APIENTRY glGetUniformLocation(GLuint program, const GLchar* name){
GET_CTX_RET(-1);
if(thrd->shareGroup.Ptr()) {
const GLuint globalProgramName = thrd->shareGroup->getGlobalName(SHADER,program);
if(ctx->shareGroup().Ptr()) {
const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
RET_AND_SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE,-1);
return ctx->dispatcher().glGetUniformLocation(globalProgramName,name);
}
@@ -1190,8 +1189,8 @@ GL_APICALL GLboolean GL_APIENTRY glIsEnabled(GLenum cap){
GL_APICALL GLboolean GL_APIENTRY glIsBuffer(GLuint buffer){
GET_CTX_RET(GL_FALSE)
if(buffer && thrd->shareGroup.Ptr()) {
ObjectDataPtr objData = thrd->shareGroup->getObjectData(VERTEXBUFFER,buffer);
if(buffer && ctx->shareGroup().Ptr()) {
ObjectDataPtr objData = ctx->shareGroup()->getObjectData(VERTEXBUFFER,buffer);
return objData.Ptr() ? ((GLESbuffer*)objData.Ptr())->wasBinded():GL_FALSE;
}
return GL_FALSE;
@@ -1199,16 +1198,16 @@ GL_APICALL GLboolean GL_APIENTRY glIsBuffer(GLuint buffer){
GL_APICALL GLboolean GL_APIENTRY glIsFramebuffer(GLuint framebuffer){
GET_CTX_RET(GL_FALSE)
if(framebuffer && thrd->shareGroup.Ptr()){
return thrd->shareGroup->isObject(FRAMEBUFFER,framebuffer) ? GL_TRUE :GL_FALSE;
if(framebuffer && ctx->shareGroup().Ptr()){
return ctx->shareGroup()->isObject(FRAMEBUFFER,framebuffer) ? GL_TRUE :GL_FALSE;
}
return GL_FALSE;
}
GL_APICALL GLboolean GL_APIENTRY glIsRenderbuffer(GLuint renderbuffer){
GET_CTX_RET(GL_FALSE)
if(renderbuffer && thrd->shareGroup.Ptr()){
return thrd->shareGroup->isObject(RENDERBUFFER,renderbuffer) ? GL_TRUE :GL_FALSE;
if(renderbuffer && ctx->shareGroup().Ptr()){
return ctx->shareGroup()->isObject(RENDERBUFFER,renderbuffer) ? GL_TRUE :GL_FALSE;
}
return GL_FALSE;
}
@@ -1223,9 +1222,9 @@ GL_APICALL GLboolean GL_APIENTRY glIsTexture(GLuint texture){
GL_APICALL GLboolean GL_APIENTRY glIsProgram(GLuint program){
GET_CTX_RET(GL_FALSE)
if(program && thrd->shareGroup.Ptr() &&
thrd->shareGroup->isObject(SHADER,program)) {
const GLuint globalProgramName = thrd->shareGroup->getGlobalName(SHADER,program);
if(program && ctx->shareGroup().Ptr() &&
ctx->shareGroup()->isObject(SHADER,program)) {
const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
return ctx->dispatcher().glIsProgram(globalProgramName);
}
return GL_FALSE;
@@ -1233,9 +1232,9 @@ GL_APICALL GLboolean GL_APIENTRY glIsProgram(GLuint program){
GL_APICALL GLboolean GL_APIENTRY glIsShader(GLuint shader){
GET_CTX_RET(GL_FALSE)
if(shader && thrd->shareGroup.Ptr() &&
thrd->shareGroup->isObject(SHADER,shader)) {
const GLuint globalShaderName = thrd->shareGroup->getGlobalName(SHADER,shader);
if(shader && ctx->shareGroup().Ptr() &&
ctx->shareGroup()->isObject(SHADER,shader)) {
const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shader);
return ctx->dispatcher().glIsShader(globalShaderName);
}
return GL_FALSE;
@@ -1249,11 +1248,11 @@ GL_APICALL void GL_APIENTRY glLineWidth(GLfloat width){
GL_APICALL void GL_APIENTRY glLinkProgram(GLuint program){
GET_CTX();
GLint linkStatus = GL_FALSE;
if(thrd->shareGroup.Ptr()) {
const GLuint globalProgramName = thrd->shareGroup->getGlobalName(SHADER,program);
if(ctx->shareGroup().Ptr()) {
const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
ObjectDataPtr objData = thrd->shareGroup->getObjectData(SHADER,program);
ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program);
SET_ERROR_IF(!objData.Ptr(), GL_INVALID_OPERATION);
SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA, GL_INVALID_OPERATION);
ProgramData* programData = (ProgramData*)objData.Ptr();
@@ -1263,8 +1262,8 @@ GL_APICALL void GL_APIENTRY glLinkProgram(GLuint program){
/* validating that the fragment & vertex shaders were compiled successfuly*/
GLint fCompileStatus = GL_FALSE;
GLint vCompileStatus = GL_FALSE;
GLuint fragmentShaderGlobal = thrd->shareGroup->getGlobalName(SHADER,fragmentShader);
GLuint vertexShaderGlobal = thrd->shareGroup->getGlobalName(SHADER,vertexShader);
GLuint fragmentShaderGlobal = ctx->shareGroup()->getGlobalName(SHADER,fragmentShader);
GLuint vertexShaderGlobal = ctx->shareGroup()->getGlobalName(SHADER,vertexShader);
ctx->dispatcher().glGetShaderiv(fragmentShaderGlobal,GL_COMPILE_STATUS,&fCompileStatus);
ctx->dispatcher().glGetShaderiv(vertexShaderGlobal,GL_COMPILE_STATUS,&vCompileStatus);
@@ -1339,9 +1338,9 @@ GL_APICALL void GL_APIENTRY glShaderBinary(GLsizei n, const GLuint* shaders, GL
SET_ERROR_IF( (ctx->dispatcher().glShaderBinary == NULL), GL_INVALID_OPERATION);
if(thrd->shareGroup.Ptr()){
if(ctx->shareGroup().Ptr()){
for(int i=0; i < n ; i++){
const GLuint globalShaderName = thrd->shareGroup->getGlobalName(SHADER,shaders[i]);
const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shaders[i]);
SET_ERROR_IF(globalShaderName == 0,GL_INVALID_VALUE);
ctx->dispatcher().glShaderBinary(1,&globalShaderName,binaryformat,binary,length);
}
@@ -1351,10 +1350,10 @@ GL_APICALL void GL_APIENTRY glShaderBinary(GLsizei n, const GLuint* shaders, GL
GL_APICALL void GL_APIENTRY glShaderSource(GLuint shader, GLsizei count, const GLchar** string, const GLint* length){
GET_CTX_V2();
SET_ERROR_IF(count < 0,GL_INVALID_VALUE);
if(thrd->shareGroup.Ptr()){
const GLuint globalShaderName = thrd->shareGroup->getGlobalName(SHADER,shader);
if(ctx->shareGroup().Ptr()){
const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shader);
SET_ERROR_IF(globalShaderName == 0,GL_INVALID_VALUE);
ObjectDataPtr objData = thrd->shareGroup->getObjectData(SHADER,shader);
ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,shader);
SET_ERROR_IF(!objData.Ptr(),GL_INVALID_OPERATION);
SET_ERROR_IF(objData.Ptr()->getDataType()!=SHADER_DATA,GL_INVALID_OPERATION);
ShaderParser* sp = (ShaderParser*)objData.Ptr();
@@ -1401,7 +1400,7 @@ GL_APICALL void GL_APIENTRY glTexImage2D(GLenum target, GLint level, GLint inte
SET_ERROR_IF(!(GLESv2Validate::pixelOp(format,type) && internalformat == ((GLint)format)),GL_INVALID_OPERATION);
SET_ERROR_IF(border != 0,GL_INVALID_VALUE);
if (thrd->shareGroup.Ptr()){
if (ctx->shareGroup().Ptr()){
TextureData *texData = getTextureTargetData(target);
if(texData) {
texData->width = width;
@@ -1544,8 +1543,8 @@ GL_APICALL void GL_APIENTRY glUniformMatrix4fv(GLint location, GLsizei count, G
GL_APICALL void GL_APIENTRY glUseProgram(GLuint program){
GET_CTX();
if(thrd->shareGroup.Ptr()) {
const GLuint globalProgramName = thrd->shareGroup->getGlobalName(SHADER,program);
if(ctx->shareGroup().Ptr()) {
const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
SET_ERROR_IF(program!=0 && globalProgramName==0,GL_INVALID_VALUE);
ctx->dispatcher().glUseProgram(globalProgramName);
}
@@ -1553,8 +1552,8 @@ GL_APICALL void GL_APIENTRY glUseProgram(GLuint program){
GL_APICALL void GL_APIENTRY glValidateProgram(GLuint program){
GET_CTX();
if(thrd->shareGroup.Ptr()) {
const GLuint globalProgramName = thrd->shareGroup->getGlobalName(SHADER,program);
if(ctx->shareGroup().Ptr()) {
const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
ctx->dispatcher().glValidateProgram(globalProgramName);
}
@@ -1621,15 +1620,15 @@ GL_APICALL void GL_APIENTRY glEGLImageTargetTexture2DOES(GLenum target, GLeglIma
// Create the texture object in the underlying EGL implementation,
// flag to the OpenGL layer to skip the image creation and map the
// current binded texture object to the existing global object.
if (thrd->shareGroup.Ptr()) {
if (ctx->shareGroup().Ptr()) {
ObjectLocalName tex = TextureLocalName(target,ctx->getBindedTexture(target));
unsigned int oldGlobal = thrd->shareGroup->getGlobalName(TEXTURE, tex);
unsigned int oldGlobal = ctx->shareGroup()->getGlobalName(TEXTURE, tex);
// Delete old texture object
if (oldGlobal) {
ctx->dispatcher().glDeleteTextures(1, &oldGlobal);
}
// replace mapping and bind the new global object
thrd->shareGroup->replaceGlobalName(TEXTURE, tex,img->globalTexName);
ctx->shareGroup()->replaceGlobalName(TEXTURE, tex,img->globalTexName);
ctx->dispatcher().glBindTexture(GL_TEXTURE_2D, img->globalTexName);
TextureData *texData = getTextureTargetData(target);
SET_ERROR_IF(texData==NULL,GL_INVALID_OPERATION);

View File

@@ -103,6 +103,7 @@ public:
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);

View File

@@ -1,49 +1,33 @@
#ifndef GLES_MACROS_H
#define GLES_MACROS_H
#define GET_THREAD() \
ThreadInfo* thrd = NULL; \
if(s_eglIface) { \
thrd = s_eglIface->getThreadInfo(); \
} else { \
fprintf(stderr,"Context wasn't initialized yet \n"); \
}
#define GET_CTX() \
if(!s_eglIface) return; \
GLEScontext *ctx = s_eglIface->getGLESContext(); \
#define GET_CTX() \
GET_THREAD(); \
if(!thrd) return; \
GLEScontext *ctx = static_cast<GLEScontext*>(thrd->glesContext); \
#define GET_CTX_CM() \
if(!s_eglIface) return; \
GLEScmContext *ctx = static_cast<GLEScmContext *>(s_eglIface->getGLESContext()); \
if(!ctx) return;
#define GET_CTX_CM() \
GET_THREAD(); \
if(!thrd) return; \
GLEScmContext *ctx = static_cast<GLEScmContext*>(thrd->glesContext); \
#define GET_CTX_V2() \
if(!s_eglIface) return; \
GLESv2Context *ctx = static_cast<GLESv2Context *>(s_eglIface->getGLESContext()); \
if(!ctx) return;
#define GET_CTX_V2() \
GET_THREAD(); \
if(!thrd) return; \
GLESv2Context *ctx = static_cast<GLESv2Context*>(thrd->glesContext); \
if(!ctx) return;
#define GET_CTX_RET(failure_ret) \
GET_THREAD(); \
if(!thrd) return failure_ret; \
GLEScontext *ctx = static_cast<GLEScontext*>(thrd->glesContext); \
#define GET_CTX_RET(failure_ret) \
if(!s_eglIface) return failure_ret; \
GLEScontext *ctx = s_eglIface->getGLESContext(); \
if(!ctx) return failure_ret;
#define GET_CTX_CM_RET(failure_ret) \
GET_THREAD(); \
if(!thrd) return failure_ret; \
GLEScmContext *ctx = static_cast<GLEScmContext*>(thrd->glesContext); \
#define GET_CTX_CM_RET(failure_ret) \
if(!s_eglIface) return failure_ret; \
GLEScmContext *ctx = static_cast<GLEScmContext *>(s_eglIface->getGLESContext()); \
if(!ctx) return failure_ret;
#define GET_CTX_V2_RET(failure_ret) \
GET_THREAD(); \
if(!thrd) return failure_ret; \
GLESv2Context *ctx = static_cast<GLESv2Context*>(thrd->glesContext); \
#define GET_CTX_V2_RET(failure_ret) \
if(!s_eglIface) return failure_ret; \
GLESv2Context *ctx = static_cast<GLESv2Context *>(s_eglIface->getGLESContext()); \
if(!ctx) return failure_ret;

View File

@@ -15,9 +15,9 @@
*/
#ifndef TRANSLATOR_IFACES_H
#define TRANSLATOR_IFACES_H
#include <GLcommon/ThreadInfo.h>
#include <GLES/gl.h>
#include <string.h>
#include "objectNameManager.h"
extern "C" {
@@ -89,7 +89,7 @@ typedef struct {
typedef struct {
ThreadInfo* (*getThreadInfo)();
GLEScontext* (*getGLESContext)();
EglImage* (*eglAttachEGLImage)(unsigned int imageId);
void (*eglDetachEGLImage)(unsigned int imageId);
}EGLiface;