am 23685f03: Merge "opengles emulator: fixed EGLContext and EGLSurface ref-counting."
* commit '23685f03992b3aca25fd087a468cf95fdb2b9282': opengles emulator: fixed EGLContext and EGLSurface ref-counting.
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
@@ -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,¶ms[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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user