[emugl] Got rid of SmartPtr - it's shared_ptr now

Change-Id: I8fce1abc9ed8f0ba6d1d334c9a287e98dd0865d1
diff --git a/distrib/android-emugl/host/libs/Translator/EGL/ClientAPIExts.cpp b/distrib/android-emugl/host/libs/Translator/EGL/ClientAPIExts.cpp
index 42d5764..3deacb9 100644
--- a/distrib/android-emugl/host/libs/Translator/EGL/ClientAPIExts.cpp
+++ b/distrib/android-emugl/host/libs/Translator/EGL/ClientAPIExts.cpp
@@ -94,7 +94,7 @@
     static void _egl_ ## fname params \
     { \
         ThreadInfo* thread  = getThreadInfo(); \
-        if (!thread->eglContext.Ptr()) { \
+        if (!thread->eglContext.get()) { \
             return; \
         } \
         int idx = (int)thread->eglContext->version() - 1; \
@@ -108,7 +108,7 @@
     static rtype _egl_ ## fname params \
     { \
         ThreadInfo* thread  = getThreadInfo(); \
-        if (!thread->eglContext.Ptr()) { \
+        if (!thread->eglContext.get()) { \
             return (rtype)0; \
         } \
         int idx = (int)thread->eglContext->version() - 1; \
diff --git a/distrib/android-emugl/host/libs/Translator/EGL/EglContext.cpp b/distrib/android-emugl/host/libs/Translator/EGL/EglContext.cpp
index bc33f1f..7b67b24 100644
--- a/distrib/android-emugl/host/libs/Translator/EGL/EglContext.cpp
+++ b/distrib/android-emugl/host/libs/Translator/EGL/EglContext.cpp
@@ -23,21 +23,25 @@
 extern EglGlobalInfo* g_eglInfo; // defined in EglImp.cpp
 
 bool EglContext::usingSurface(SurfacePtr surface) {
-  return surface.Ptr() == m_read.Ptr() || surface.Ptr() == m_draw.Ptr();
+  return surface.get() == m_read.get() || surface.get() == m_draw.get();
 }
 
-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_version(ver),
-m_mngr(mngr)
-{
-    m_shareGroup = shared_context.Ptr()?
+EglContext::EglContext(EglDisplay *dpy,
+                       EglOS::Context* 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_version(ver),
+        m_mngr(mngr) {
+    m_shareGroup = shared_context.get()?
                    mngr->attachShareGroup(context,shared_context->nativeType()):
                    mngr->createShareGroup(context);
     m_hndl = ++s_nextContextHndl;
@@ -45,11 +49,10 @@
 
 EglContext::~EglContext()
 {
-  
     //
     // remove the context in the underlying OS layer
-    // 
-    EglOS::destroyContext(m_dpy->nativeType(),m_native);
+    //
+    m_dpy->nativeType()->destroyContext(m_native);
 
     //
     // call the client-api to remove the GLES context
diff --git a/distrib/android-emugl/host/libs/Translator/EGL/EglDisplay.cpp b/distrib/android-emugl/host/libs/Translator/EGL/EglDisplay.cpp
index 24b9a0d..f502b61 100644
--- a/distrib/android-emugl/host/libs/Translator/EGL/EglDisplay.cpp
+++ b/distrib/android-emugl/host/libs/Translator/EGL/EglDisplay.cpp
@@ -204,7 +204,7 @@
 
     ContextsHndlMap::iterator it;
     for(it = m_contexts.begin(); it != m_contexts.end();it++) {
-        if((*it).second.Ptr() == ctx.Ptr()){
+        if((*it).second.get() == ctx.get()){
             break;
         }
     }
@@ -258,7 +258,7 @@
 
 EGLSurface EglDisplay::addSurface(SurfacePtr s ) {
    emugl::Mutex::AutoLock mutex(m_lock);
-   unsigned int hndl = s.Ptr()->getHndl();
+   unsigned int hndl = s.get()->getHndl();
    EGLSurface ret =reinterpret_cast<EGLSurface> (hndl);
 
    if(m_surfaces.find(hndl) != m_surfaces.end()) {
@@ -272,7 +272,7 @@
 EGLContext EglDisplay::addContext(ContextPtr ctx ) {
     emugl::Mutex::AutoLock mutex(m_lock);
 
-   unsigned int hndl = ctx.Ptr()->getHndl();
+   unsigned int hndl = ctx.get()->getHndl();
    EGLContext ret    = reinterpret_cast<EGLContext> (hndl);
 
    if(m_contexts.find(hndl) != m_contexts.end()) {
diff --git a/distrib/android-emugl/host/libs/Translator/EGL/EglImp.cpp b/distrib/android-emugl/host/libs/Translator/EGL/EglImp.cpp
index 5831097..86348dd 100644
--- a/distrib/android-emugl/host/libs/Translator/EGL/EglImp.cpp
+++ b/distrib/android-emugl/host/libs/Translator/EGL/EglImp.cpp
@@ -18,17 +18,13 @@
 #define EGLAPI __declspec(dllexport)
 #endif
 
-#include <EGL/egl.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <stdio.h>
 #include "ThreadInfo.h"
 #include <GLcommon/TranslatorIfaces.h>
 #include "emugl/common/shared_library.h"
+#include <OpenglCodecCommon/ErrorLog.h>
 
 #include "EglWindowSurface.h"
 #include "EglPbufferSurface.h"
-#include "EglPixmapSurface.h"
 #include "EglGlobalInfo.h"
 #include "EglThreadInfo.h"
 #include "EglValidate.h"
@@ -38,6 +34,12 @@
 #include "EglOsApi.h"
 #include "ClientAPIExts.h"
 
+#include <EGL/egl.h>
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
 #define MAJOR          1
 #define MINOR          4
 
@@ -46,6 +48,7 @@
 EglImage *attachEGLImage(unsigned int imageId);
 void detachEGLImage(unsigned int imageId);
 GLEScontext* getGLESContext();
+GlLibrary* getGlLibrary();
 
 #define tls_thread  EglThreadInfo::get()
 
@@ -60,28 +63,43 @@
     } 
 }
 
-static EGLiface            s_eglIface = {
-    getGLESContext    : getGLESContext,
-    eglAttachEGLImage:attachEGLImage,
-    eglDetachEGLImage:detachEGLImage
+static const EGLiface s_eglIface = {
+    .getGLESContext = getGLESContext,
+    .eglAttachEGLImage = attachEGLImage,
+    .eglDetachEGLImage = detachEGLImage,
+    .eglGetGlLibrary = getGlLibrary,
 };
 
+static void initGLESx(GLESVersion version) {
+    const GLESiface* iface = g_eglInfo->getIface(version);
+    if (!iface) {
+        DBG("EGL failed to initialize GLESv%d; incompatible interface\n", version);
+        return;
+    }
+    iface->initGLESx();
+}
+
 /*****************************************  supported extentions  ***********************************************************************/
 
 //extentions
 #define EGL_EXTENTIONS 2
 
 //decleration
+extern "C" {
 EGLAPI EGLImageKHR EGLAPIENTRY eglCreateImageKHR(EGLDisplay display, EGLContext context, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list);
 EGLAPI EGLBoolean EGLAPIENTRY eglDestroyImageKHR(EGLDisplay display, EGLImageKHR image);
+}  // extern "C"
 
 // extentions descriptors
-static ExtentionDescriptor s_eglExtentions[] = {
-                                                   {"eglCreateImageKHR" ,(__eglMustCastToProperFunctionPointerType)eglCreateImageKHR},
-                                                   {"eglDestroyImageKHR",(__eglMustCastToProperFunctionPointerType)eglDestroyImageKHR}
-                                               };
-static int s_eglExtentionsSize = sizeof(s_eglExtentions) /
-                                 sizeof(ExtentionDescriptor);
+static const ExtentionDescriptor s_eglExtentions[] = {
+        {"eglCreateImageKHR" ,
+                (__eglMustCastToProperFunctionPointerType)eglCreateImageKHR },
+        {"eglDestroyImageKHR",
+                (__eglMustCastToProperFunctionPointerType)eglDestroyImageKHR },
+};
+
+static const int s_eglExtentionsSize =
+        sizeof(s_eglExtentions) / sizeof(ExtentionDescriptor);
 
 /****************************************************************************************************************************************/
 //macros for accessing global egl info & tls objects
@@ -112,13 +130,13 @@
 
 #define VALIDATE_SURFACE_RETURN(EGLSurface,ret,varName)      \
         SurfacePtr varName = dpy->getSurface(EGLSurface);    \
-        if(!varName.Ptr()) {                                 \
+        if(!varName.get()) {                                 \
             RETURN_ERROR(ret,EGL_BAD_SURFACE);               \
         }
 
 #define VALIDATE_CONTEXT_RETURN(EGLContext,ret)              \
         ContextPtr ctx = dpy->getContext(EGLContext);        \
-        if(!ctx.Ptr()) {                                     \
+        if(!ctx.get()) {                                     \
             RETURN_ERROR(ret,EGL_BAD_CONTEXT);               \
         }
 
@@ -142,6 +160,10 @@
     return thread->glesContext;
 }
 
+GlLibrary* getGlLibrary() {
+    return EglGlobalInfo::getInstance()->getOsEngine()->getGlLibrary();
+}
+
 EGLAPI EGLint EGLAPIENTRY eglGetError(void) {
     CURRENT_THREAD();
     EGLint err = tls_thread->getError();
@@ -151,24 +173,22 @@
 
 EGLAPI EGLDisplay EGLAPIENTRY eglGetDisplay(EGLNativeDisplayType display_id) {
     EglDisplay* dpy = NULL;
-    EGLNativeInternalDisplayType internalDisplay = NULL;
+    EglOS::Display* internalDisplay = NULL;
 
     initGlobalInfo();
 
     if ((dpy = g_eglInfo->getDisplay(display_id))) {
         return dpy;
-    } else {
-
-        if( display_id == EGL_DEFAULT_DISPLAY) {
-            internalDisplay = g_eglInfo->getDefaultNativeDisplay();
-        } else {
-            internalDisplay = g_eglInfo->generateInternalDisplay(display_id);
-        }
-
-        dpy = g_eglInfo->addDisplay(display_id,internalDisplay);
-        if(dpy) return dpy;
+    }
+    if (display_id != EGL_DEFAULT_DISPLAY) {
         return EGL_NO_DISPLAY;
     }
+    internalDisplay = g_eglInfo->getDefaultNativeDisplay();
+    dpy = g_eglInfo->addDisplay(display_id,internalDisplay);
+    if(!dpy) {
+        return EGL_NO_DISPLAY;
+    }
+    return dpy;
 }
 
 
@@ -220,6 +240,7 @@
                    __FUNCTION__, error);
            return EGL_FALSE;
         }
+        initGLESx(GLES_1_1);
     }
     if(!g_eglInfo->getIface(GLES_2_0)) {
         func  = loadIfaces(LIB_GLES_V2_NAME, error, sizeof(error));
@@ -230,6 +251,7 @@
            fprintf(stderr, "%s: Could not find ifaces for GLES 2.0 [%s]\n",
                    __FUNCTION__, error);
         }
+        initGLESx(GLES_2_0);
     }
     dpy->initialize(renderableType);
     return EGL_TRUE;
@@ -462,11 +484,10 @@
             }
         }
     }
-    EGLNativePixelFormatType tmpfrmt = PIXEL_FORMAT_INITIALIZER;
     EglConfig dummy(red_size,green_size,blue_size,alpha_size,caveat,config_id,depth_size,
                     frame_buffer_level,0,0,0,native_renderable,renderable_type,0,native_visual_type,
                     samples_per_pixel,stencil_size,surface_type,transparent_type,
-                    trans_red_val,trans_green_val,trans_blue_val,tmpfrmt);
+                    trans_red_val,trans_green_val,trans_blue_val,NULL);
 
     *num_config = dpy->chooseConfigs(dummy,configs,config_size);
 
@@ -493,7 +514,7 @@
     if(!(cfg->surfaceType() & EGL_WINDOW_BIT)) {
         RETURN_ERROR(EGL_NO_SURFACE,EGL_BAD_MATCH);
     }
-    if(!EglOS::validNativeWin(dpy->nativeType(),win)) {
+    if(!dpy->nativeType()->isValidNativeWin(win)) {
         RETURN_ERROR(EGL_NO_SURFACE,EGL_BAD_NATIVE_WINDOW);
     }
     if(!EglValidate::noAttribs(attrib_list)) {
@@ -504,31 +525,33 @@
     }
 
     unsigned int width,height;
-    if(!EglOS::checkWindowPixelFormatMatch(dpy->nativeType(),win,cfg,&width,&height)) {
+    if(!dpy->nativeType()->checkWindowPixelFormatMatch(
+            win, cfg->nativeFormat(), &width, &height)) {
         RETURN_ERROR(EGL_NO_SURFACE,EGL_BAD_ALLOC);
     }
     SurfacePtr wSurface(new EglWindowSurface(dpy, win,cfg,width,height));
-    if(!wSurface.Ptr()) {
+    if(!wSurface.get()) {
         RETURN_ERROR(EGL_NO_SURFACE,EGL_BAD_ALLOC);
     }
     return dpy->addSurface(wSurface);
 }
 
-EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferSurface(EGLDisplay display, EGLConfig config,
-                   const EGLint *attrib_list) {
+EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferSurface(
+        EGLDisplay display,
+        EGLConfig config,
+        const EGLint *attrib_list) {
     VALIDATE_DISPLAY_RETURN(display,EGL_NO_SURFACE);
     VALIDATE_CONFIG_RETURN(config,EGL_NO_SURFACE);
     if(!(cfg->surfaceType() & EGL_PBUFFER_BIT)) {
         RETURN_ERROR(EGL_NO_SURFACE,EGL_BAD_MATCH);
     }
 
-
     SurfacePtr pbSurface(new EglPbufferSurface(dpy,cfg));
-    if(!pbSurface.Ptr()) {
+    if(!pbSurface.get()) {
         RETURN_ERROR(EGL_NO_SURFACE,EGL_BAD_ALLOC);
     }
 
-    if(!EglValidate::noAttribs(attrib_list)) { //there are attribs
+    if(!EglValidate::noAttribs(attrib_list)) { // There are attribs.
         int i = 0 ;
         while(attrib_list[i] != EGL_NONE) {
             if(!pbSurface->setAttrib(attrib_list[i],attrib_list[i+1])) {
@@ -538,17 +561,33 @@
         }
     }
 
-    EGLint width,height,largest,texTarget,texFormat;
-    EglPbufferSurface* tmpPbSurfacePtr = static_cast<EglPbufferSurface*>(pbSurface.Ptr());
-    tmpPbSurfacePtr->getDim(&width,&height,&largest);
-    tmpPbSurfacePtr->getTexInfo(&texTarget,&texFormat);
+    EGLint width, height, largest, texTarget, texFormat;
+    EglPbufferSurface* tmpPbSurfacePtr =
+            static_cast<EglPbufferSurface*>(pbSurface.get());
 
-    if(!EglValidate::pbufferAttribs(width,height,texFormat == EGL_NO_TEXTURE,texTarget == EGL_NO_TEXTURE)) {
+    tmpPbSurfacePtr->getDim(&width, &height, &largest);
+    tmpPbSurfacePtr->getTexInfo(&texTarget, &texFormat);
+
+    if(!EglValidate::pbufferAttribs(width,
+                                    height,
+                                    texFormat == EGL_NO_TEXTURE,
+                                    texTarget == EGL_NO_TEXTURE)) {
         //TODO: RETURN_ERROR(EGL_NO_SURFACE,EGL_BAD_VALUE); dont have bad_value
         RETURN_ERROR(EGL_NO_SURFACE,EGL_BAD_ATTRIBUTE);
     }
 
-    EGLNativeSurfaceType pb = EglOS::createPbufferSurface(dpy->nativeType(),cfg,tmpPbSurfacePtr);
+    EglOS::PbufferInfo pbinfo;
+
+    pbinfo.width = width;
+    pbinfo.height = height;
+    pbinfo.largest = largest;
+    pbinfo.target = texTarget;
+    pbinfo.format = texFormat;
+
+    tmpPbSurfacePtr->getAttrib(EGL_MIPMAP_TEXTURE, &pbinfo.hasMipmap);
+
+    EglOS::Surface* pb = dpy->nativeType()->createPbufferSurface(
+            cfg->nativeFormat(), &pbinfo);
     if(!pb) {
         //TODO: RETURN_ERROR(EGL_NO_SURFACE,EGL_BAD_VALUE); dont have bad value
         RETURN_ERROR(EGL_NO_SURFACE,EGL_BAD_ATTRIBUTE);
@@ -558,37 +597,10 @@
     return dpy->addSurface(pbSurface);
 }
 
-EGLAPI EGLSurface EGLAPIENTRY eglCreatePixmapSurface(EGLDisplay display, EGLConfig config,
-                  EGLNativePixmapType pixmap,
-                  const EGLint *attrib_list) {
-    VALIDATE_DISPLAY_RETURN(display,EGL_NO_SURFACE);
-    VALIDATE_CONFIG_RETURN(config,EGL_NO_SURFACE);
-    if(!(cfg->surfaceType() & EGL_PIXMAP_BIT)) {
-        RETURN_ERROR(EGL_NO_SURFACE,EGL_BAD_MATCH);
-    }
-    if(!EglValidate::noAttribs(attrib_list)) {
-        RETURN_ERROR(EGL_NO_SURFACE,EGL_BAD_ATTRIBUTE);
-    }
-    if(EglPixmapSurface::alreadyAssociatedWithConfig(pixmap)) {
-        RETURN_ERROR(EGL_NO_SURFACE,EGL_BAD_ALLOC);
-    }
-
-    unsigned int width,height;
-    if(!EglOS::checkPixmapPixelFormatMatch(dpy->nativeType(),pixmap,cfg,&width,&height)) {
-        RETURN_ERROR(EGL_NO_SURFACE,EGL_BAD_ALLOC);
-    }
-    SurfacePtr pixSurface(new EglPixmapSurface(dpy, pixmap,cfg));
-    if(!pixSurface.Ptr()) {
-        RETURN_ERROR(EGL_NO_SURFACE,EGL_BAD_ALLOC);
-    }
-
-    return dpy->addSurface(pixSurface);
-}
-
 EGLAPI EGLBoolean EGLAPIENTRY eglDestroySurface(EGLDisplay display, EGLSurface surface) {
     VALIDATE_DISPLAY(display);
     SurfacePtr srfc = dpy->getSurface(surface);
-    if(!srfc.Ptr()) {
+    if(!srfc.get()) {
         RETURN_ERROR(EGL_FALSE,EGL_BAD_SURFACE);
     }
 
@@ -641,7 +653,7 @@
             i+=2;
         }
     }
-    GLESiface* iface = g_eglInfo->getIface(version);
+    const GLESiface* iface = g_eglInfo->getIface(version);
     GLEScontext* glesCtx = NULL;
     if(iface) {
         glesCtx = iface->createGLESContext();
@@ -652,13 +664,14 @@
     ContextPtr sharedCtxPtr;
     if(share_context != EGL_NO_CONTEXT) {
         sharedCtxPtr = dpy->getContext(share_context);
-        if(!sharedCtxPtr.Ptr()) {
+        if(!sharedCtxPtr.get()) {
             RETURN_ERROR(EGL_NO_CONTEXT,EGL_BAD_CONTEXT);
         }
     }
 
-    EGLNativeContextType globalSharedContext = dpy->getGlobalSharedContext();
-    EGLNativeContextType nativeContext = EglOS::createContext(dpy->nativeType(),cfg,globalSharedContext);
+    EglOS::Context* globalSharedContext = dpy->getGlobalSharedContext();
+    EglOS::Context* nativeContext = dpy->nativeType()->createContext(
+            cfg->nativeFormat(), globalSharedContext);
 
     if(nativeContext) {
         ContextPtr ctx(new EglContext(dpy, nativeContext,sharedCtxPtr,cfg,glesCtx,version,dpy->getManager(version)));
@@ -678,23 +691,24 @@
     return EGL_TRUE;
 }
 
-EGLAPI EGLBoolean EGLAPIENTRY eglMakeCurrent(EGLDisplay display, EGLSurface draw,
-              EGLSurface read, EGLContext context) {
+EGLAPI EGLBoolean EGLAPIENTRY eglMakeCurrent(EGLDisplay display,
+                                             EGLSurface draw,
+                                             EGLSurface read,
+                                             EGLContext context) {
     VALIDATE_DISPLAY(display);
 
-
-    bool releaseContext = EglValidate::releaseContext(context,read,draw);
-    if(!releaseContext && EglValidate::badContextMatch(context,read,draw)) {
-        RETURN_ERROR(EGL_FALSE,EGL_BAD_MATCH);
+    bool releaseContext = EglValidate::releaseContext(context, read, draw);
+    if(!releaseContext && EglValidate::badContextMatch(context, read, draw)) {
+        RETURN_ERROR(EGL_FALSE, EGL_BAD_MATCH);
     }
 
-    ThreadInfo* thread     = getThreadInfo();
-    ContextPtr  prevCtx    = thread->eglContext;
+    ThreadInfo* thread = getThreadInfo();
+    ContextPtr prevCtx = thread->eglContext;
 
     if(releaseContext) { //releasing current context
-       if(prevCtx.Ptr()) {
+       if(prevCtx.get()) {
            g_eglInfo->getIface(prevCtx->version())->flush();
-           if(!EglOS::makeCurrent(dpy->nativeType(),NULL,NULL,NULL)) {
+           if(!dpy->nativeType()->makeCurrent(NULL,NULL,NULL)) {
                RETURN_ERROR(EGL_FALSE,EGL_BAD_ACCESS);
            }
            thread->updateInfo(ContextPtr(NULL),dpy,NULL,ShareGroupPtr(NULL),dpy->getManager(prevCtx->version()));
@@ -704,14 +718,14 @@
         VALIDATE_SURFACE(draw,newDrawSrfc);
         VALIDATE_SURFACE(read,newReadSrfc);
 
-        EglSurface* newDrawPtr = newDrawSrfc.Ptr();
-        EglSurface* newReadPtr = newReadSrfc.Ptr();
+        EglSurface* newDrawPtr = newDrawSrfc.get();
+        EglSurface* newReadPtr = newReadSrfc.get();
         ContextPtr  newCtx     = ctx;
 
-        if (newCtx.Ptr() && prevCtx.Ptr()) {
-            if (newCtx.Ptr() == prevCtx.Ptr()) {
-                if (newDrawPtr == prevCtx->draw().Ptr() &&
-                    newReadPtr == prevCtx->read().Ptr()) {
+        if (newCtx.get() && prevCtx.get()) {
+            if (newCtx.get() == prevCtx.get()) {
+                if (newDrawPtr == prevCtx->draw().get() &&
+                    newReadPtr == prevCtx->read().get()) {
                     // nothing to do
                     return EGL_TRUE;
                 }
@@ -722,34 +736,32 @@
             }
         }
 
-        //surfaces compitability check
-        if(!((*ctx->getConfig()).compitableWith((*newDrawPtr->getConfig()))) ||
-           !((*ctx->getConfig()).compitableWith((*newReadPtr->getConfig())))) {
+        //surfaces compatibility check
+        if(!((*ctx->getConfig()).compatibleWith((*newDrawPtr->getConfig()))) ||
+           !((*ctx->getConfig()).compatibleWith((*newReadPtr->getConfig())))) {
             RETURN_ERROR(EGL_FALSE,EGL_BAD_MATCH);
         }
 
-         EGLNativeInternalDisplayType nativeDisplay = dpy->nativeType();
-         EGLNativeSurfaceType nativeRead = newReadPtr->native();
-         EGLNativeSurfaceType nativeDraw = newDrawPtr->native();
+         EglOS::Display* nativeDisplay = dpy->nativeType();
+         EglOS::Surface* nativeRead = newReadPtr->native();
+         EglOS::Surface* nativeDraw = newDrawPtr->native();
         //checking native window validity
-        if(newReadPtr->type() == EglSurface::WINDOW && !EglOS::validNativeWin(nativeDisplay,nativeRead)) {
+        if(newReadPtr->type() == EglSurface::WINDOW &&
+                !nativeDisplay->isValidNativeWin(nativeRead)) {
             RETURN_ERROR(EGL_FALSE,EGL_BAD_NATIVE_WINDOW);
         }
-        if(newDrawPtr->type() == EglSurface::WINDOW && !EglOS::validNativeWin(nativeDisplay,nativeDraw)) {
+        if(newDrawPtr->type() == EglSurface::WINDOW &&
+                !nativeDisplay->isValidNativeWin(nativeDraw)) {
             RETURN_ERROR(EGL_FALSE,EGL_BAD_NATIVE_WINDOW);
         }
 
-        //checking native pixmap validity
-        if(newReadPtr->type() == EglSurface::PIXMAP && !EglOS::validNativePixmap(nativeDisplay,nativeRead)) {
-            RETURN_ERROR(EGL_FALSE,EGL_BAD_NATIVE_PIXMAP);
-        }
-        if(newDrawPtr->type() == EglSurface::PIXMAP && !EglOS::validNativePixmap(nativeDisplay,nativeDraw)) {
-            RETURN_ERROR(EGL_FALSE,EGL_BAD_NATIVE_PIXMAP);
-        }
-        if(prevCtx.Ptr()) {
+        if(prevCtx.get()) {
             g_eglInfo->getIface(prevCtx->version())->flush();
         }
-        if(!EglOS::makeCurrent(dpy->nativeType(),newReadPtr,newDrawPtr,newCtx->nativeType())) {
+        if (!dpy->nativeType()->makeCurrent(
+                newReadPtr->native(),
+                newDrawPtr->native(),
+                newCtx->nativeType())) {
                RETURN_ERROR(EGL_FALSE,EGL_BAD_ACCESS);
         }
         //TODO: handle the following errors
@@ -767,7 +779,7 @@
     }
 
     // release previous context surface binding
-    if(prevCtx.Ptr() && releaseContext) {
+    if(prevCtx.get() && releaseContext) {
         prevCtx->setSurfaces(SurfacePtr(NULL),SurfacePtr(NULL));
     }
 
@@ -797,39 +809,24 @@
         RETURN_ERROR(EGL_TRUE,EGL_SUCCESS);
     }
 
-    if(!currentCtx.Ptr() || !currentCtx->usingSurface(Srfc) || !EglOS::validNativeWin(dpy->nativeType(),Srfc.Ptr()->native())) {
+    if(!currentCtx.get() || !currentCtx->usingSurface(Srfc) ||
+            !dpy->nativeType()->isValidNativeWin(Srfc.get()->native())) {
         RETURN_ERROR(EGL_FALSE,EGL_BAD_SURFACE);
     }
 
-    EglOS::swapBuffers(dpy->nativeType(),Srfc->native());
+    dpy->nativeType()->swapBuffers(Srfc->native());
     return EGL_TRUE;
 }
 
-EGLAPI EGLBoolean EGLAPIENTRY eglSwapInterval(EGLDisplay display, EGLint interval) {
-    VALIDATE_DISPLAY(display);
-    ThreadInfo* thread  = getThreadInfo();
-    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);
-        }
-        EglOS::swapInterval(dpy->nativeType(),currCtx->draw()->native(),interval);
-    } else {
-            RETURN_ERROR(EGL_FALSE,EGL_BAD_SURFACE);
-    }
-    return EGL_TRUE;
-}
-
-
 EGLAPI EGLContext EGLAPIENTRY eglGetCurrentContext(void) {
     ThreadInfo* thread = getThreadInfo();
     EglDisplay* dpy    = static_cast<EglDisplay*>(thread->eglDisplay);
     ContextPtr  ctx    = thread->eglContext;
-    if(dpy && ctx.Ptr()){
+    if(dpy && ctx.get()){
         // 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)SafePointerFromUInt(ctx->getHndl());
-        if(dpy->getContext(c).Ptr())
+        if(dpy->getContext(c).get())
         {
             return c;
         }
@@ -838,15 +835,17 @@
 }
 
 EGLAPI EGLSurface EGLAPIENTRY eglGetCurrentSurface(EGLint readdraw) {
-    if(!EglValidate::surfaceTarget(readdraw)) return EGL_NO_SURFACE;
+    if (!EglValidate::surfaceTarget(readdraw)) {
+        return EGL_NO_SURFACE;
+    }
 
     ThreadInfo* thread = getThreadInfo();
     EglDisplay* dpy    = static_cast<EglDisplay*>(thread->eglDisplay);
     ContextPtr  ctx    = thread->eglContext;
 
-    if(dpy && ctx.Ptr()) {
+    if(dpy && ctx.get()) {
         SurfacePtr surface = readdraw == EGL_READ ? ctx->read() : ctx->draw();
-        if(surface.Ptr())
+        if(surface.get())
         {
             // This double check is required because a surface might still be
             // current after it is destroyed - in which case its handle should
@@ -854,7 +853,7 @@
             // though the surface is current.
             EGLSurface s = (EGLSurface)SafePointerFromUInt(surface->getHndl());
             surface = dpy->getSurface(s);
-            if(surface.Ptr())
+            if(surface.get())
             {
                 return s;
             }
@@ -864,53 +863,8 @@
 }
 
 EGLAPI EGLDisplay EGLAPIENTRY eglGetCurrentDisplay(void) {
-    ThreadInfo* thread     = getThreadInfo();
-    return (thread->eglContext.Ptr()) ? thread->eglDisplay : EGL_NO_DISPLAY;
-}
-
-EGLAPI EGLBoolean EGLAPIENTRY eglWaitGL(void) {
-    EGLenum api = eglQueryAPI();
-    eglBindAPI(EGL_OPENGL_ES_API);
-    EGLBoolean ret = eglWaitClient();
-    eglBindAPI(api);
-    return ret;
-}
-
-EGLAPI EGLBoolean EGLAPIENTRY eglWaitNative(EGLint engine) {
-    if(!EglValidate::engine(engine)) {
-        RETURN_ERROR(EGL_FALSE,EGL_BAD_PARAMETER);
-    }
-    ThreadInfo* thread  = getThreadInfo();
-    ContextPtr  currCtx = thread->eglContext;
-    EglDisplay* dpy     = static_cast<EglDisplay*>(thread->eglDisplay);
-    if(currCtx.Ptr()) {
-        SurfacePtr read = currCtx->read();
-        SurfacePtr draw = currCtx->draw();
-
-        EGLNativeInternalDisplayType nativeDisplay = dpy->nativeType();
-        if(read.Ptr()) {
-            if(read->type() == EglSurface::WINDOW &&
-               !EglOS::validNativeWin(nativeDisplay,read->native())) {
-                RETURN_ERROR(EGL_FALSE,EGL_BAD_SURFACE);
-            }
-            if(read->type() == EglSurface::PIXMAP &&
-               !EglOS::validNativePixmap(nativeDisplay,read->native())) {
-                RETURN_ERROR(EGL_FALSE,EGL_BAD_SURFACE);
-            }
-        }
-        if(draw.Ptr()) {
-            if(draw->type() == EglSurface::WINDOW &&
-               !EglOS::validNativeWin(nativeDisplay,draw->native())) {
-                RETURN_ERROR(EGL_FALSE,EGL_BAD_SURFACE);
-            }
-            if(draw->type() == EglSurface::PIXMAP &&
-               !EglOS::validNativePixmap(nativeDisplay,draw->native())) {
-                RETURN_ERROR(EGL_FALSE,EGL_BAD_SURFACE);
-            }
-        }
-    }
-    EglOS::waitNative();
-    return EGL_TRUE;
+    ThreadInfo* thread = getThreadInfo();
+    return (thread->eglContext.get()) ? thread->eglDisplay : EGL_NO_DISPLAY;
 }
 
 EGLAPI EGLBoolean EGLAPIENTRY eglBindAPI(EGLenum api) {
@@ -927,18 +881,6 @@
     return tls_thread->getApi();
 }
 
-EGLAPI EGLBoolean EGLAPIENTRY eglWaitClient(void) {
-    ThreadInfo* thread  = getThreadInfo();
-    ContextPtr currCtx = thread->eglContext;
-    if(currCtx.Ptr()) {
-        if(!currCtx->read().Ptr() || !currCtx->draw().Ptr()) {
-            RETURN_ERROR(EGL_FALSE,EGL_BAD_CURRENT_SURFACE);
-        }
-        g_eglInfo->getIface(currCtx->version())->finish();
-    }
-    return EGL_TRUE;
-}
-
 EGLAPI EGLBoolean EGLAPIENTRY eglReleaseThread(void) {
     ThreadInfo* thread  = getThreadInfo();
     EglDisplay* dpy     = static_cast<EglDisplay*>(thread->eglDisplay);
@@ -967,58 +909,17 @@
     return retVal;
 }
 
-//not supported for now
-/************************* NOT SUPPORTED FOR NOW ***********************/
-EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferFromClientBuffer(
-          EGLDisplay display, EGLenum buftype, EGLClientBuffer buffer,
-          EGLConfig config, const EGLint *attrib_list) {
-    VALIDATE_DISPLAY(display);
-    VALIDATE_CONFIG(config);
-    //we do not support for now openVG, and the only client API resources which may be bound in this fashion are OpenVG
-    RETURN_ERROR(EGL_NO_SURFACE,EGL_BAD_PARAMETER);
-}
-
-EGLAPI EGLBoolean EGLAPIENTRY eglCopyBuffers(EGLDisplay display, EGLSurface surface,
-              EGLNativePixmapType target) {
-    VALIDATE_DISPLAY(display);
-    VALIDATE_SURFACE(surface,srfc);
-    if(!EglOS::validNativePixmap(dpy->nativeType(),NULL)) {
-        RETURN_ERROR(EGL_FALSE,EGL_BAD_NATIVE_PIXMAP);
-    }
-
-    //we do not need to support this for android , since we are not gonna use pixmaps
-    RETURN_ERROR(EGL_FALSE,EGL_BAD_NATIVE_PIXMAP);
-}
-
-/***********************************************************************/
-
-
-
-//do last ( only if needed)
-/*********************************************************************************************************/
-EGLAPI EGLBoolean EGLAPIENTRY eglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer) {
-//TODO:
-return 0;
-}
-
-EGLAPI EGLBoolean EGLAPIENTRY eglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer) {
-//TODO:
-return 0;
-}
-/*********************************************************************************************************/
-
-
 /************************** KHR IMAGE *************************************************************/
 EglImage *attachEGLImage(unsigned int imageId)
 {
     ThreadInfo* thread  = getThreadInfo();
     EglDisplay* dpy     = static_cast<EglDisplay*>(thread->eglDisplay);
     ContextPtr  ctx     = thread->eglContext;
-    if (ctx.Ptr()) {
+    if (ctx.get()) {
         ImagePtr img = dpy->getImage(reinterpret_cast<EGLImageKHR>(imageId));
-        if(img.Ptr()) {
+        if(img.get()) {
              ctx->attachImage(imageId,img);
-             return img.Ptr();
+             return img.get();
         }
     }
     return NULL;
@@ -1028,7 +929,7 @@
 {
     ThreadInfo* thread  = getThreadInfo();
     ContextPtr  ctx     = thread->eglContext;
-    if (ctx.Ptr()) {
+    if (ctx.get()) {
         ctx->detachImage(imageId);
     }
 }
@@ -1046,17 +947,17 @@
 
     ThreadInfo* thread  = getThreadInfo();
     ShareGroupPtr sg = thread->shareGroup;
-    if (sg.Ptr() != NULL) {
+    if (sg.get() != NULL) {
         unsigned int globalTexName = sg->getGlobalName(TEXTURE, SafeUIntFromPointer(buffer));
         if (!globalTexName) return EGL_NO_IMAGE_KHR;
 
         ImagePtr img( new EglImage() );
-        if (img.Ptr() != NULL) {
+        if (img.get() != NULL) {
 
             ObjectDataPtr objData = sg->getObjectData(TEXTURE, SafeUIntFromPointer(buffer));
-            if (!objData.Ptr()) return EGL_NO_IMAGE_KHR;
+            if (!objData.get()) return EGL_NO_IMAGE_KHR;
 
-            TextureData *texData = (TextureData *)objData.Ptr();
+            TextureData *texData = (TextureData *)objData.get();
             if(!texData->width || !texData->height) return EGL_NO_IMAGE_KHR;
             img->width = texData->width;
             img->height = texData->height;
diff --git a/distrib/android-emugl/host/libs/Translator/GLES_CM/GLEScmImp.cpp b/distrib/android-emugl/host/libs/Translator/GLES_CM/GLEScmImp.cpp
index 88941b9..91b41b6 100644
--- a/distrib/android-emugl/host/libs/Translator/GLES_CM/GLEScmImp.cpp
+++ b/distrib/android-emugl/host/libs/Translator/GLES_CM/GLEScmImp.cpp
@@ -184,11 +184,11 @@
 
     TextureData *texData = NULL;
     ObjectDataPtr objData = ctx->shareGroup()->getObjectData(TEXTURE,tex);
-    if(!objData.Ptr()){
+    if(!objData.get()){
         texData = new TextureData();
         ctx->shareGroup()->setObjectData(TEXTURE, tex, ObjectDataPtr(texData));
     } else {
-        texData = (TextureData*)objData.Ptr();
+        texData = (TextureData*)objData.get();
     }
     return texData;
 }
@@ -202,9 +202,9 @@
 GL_API GLboolean GL_APIENTRY glIsBuffer(GLuint buffer) {
     GET_CTX_RET(GL_FALSE)
 
-    if(buffer && ctx->shareGroup().Ptr()) {
+    if(buffer && ctx->shareGroup().get()) {
        ObjectDataPtr objData = ctx->shareGroup()->getObjectData(VERTEXBUFFER,buffer);
-       return objData.Ptr() ? ((GLESbuffer*)objData.Ptr())->wasBinded():GL_FALSE;
+       return objData.get() ? ((GLESbuffer*)objData.get())->wasBinded():GL_FALSE;
     }
     return GL_FALSE;
 }
@@ -287,13 +287,13 @@
     SET_ERROR_IF(!GLEScmValidate::bufferTarget(target),GL_INVALID_ENUM);
 
     //if buffer wasn't generated before,generate one
-    if(buffer && ctx->shareGroup().Ptr() && !ctx->shareGroup()->isObject(VERTEXBUFFER,buffer)){
+    if(buffer && ctx->shareGroup().get() && !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*)ctx->shareGroup()->getObjectData(VERTEXBUFFER,buffer).Ptr();
+        GLESbuffer* vbo = (GLESbuffer*)ctx->shareGroup()->getObjectData(VERTEXBUFFER,buffer).get();
         vbo->setBinded();
     }
 }
@@ -307,7 +307,7 @@
     ObjectLocalName localTexName = TextureLocalName(target,texture);
 
     GLuint globalTextureName = localTexName;
-    if(ctx->shareGroup().Ptr()){
+    if(ctx->shareGroup().get()){
         globalTextureName = ctx->shareGroup()->getGlobalName(TEXTURE,localTexName);
         //if texture wasn't generated before,generate one
         if(!globalTextureName){
@@ -475,7 +475,7 @@
 GL_API void GL_APIENTRY  glDeleteBuffers( GLsizei n, const GLuint *buffers) {
     GET_CTX()
     SET_ERROR_IF(n<0,GL_INVALID_VALUE);
-    if(ctx->shareGroup().Ptr()) {
+    if(ctx->shareGroup().get()) {
         for(int i=0; i < n; i++){
            ctx->shareGroup()->deleteName(VERTEXBUFFER,buffers[i]);
            ctx->unbindBuffer(buffers[i]);
@@ -486,7 +486,7 @@
 GL_API void GL_APIENTRY  glDeleteTextures( GLsizei n, const GLuint *textures) {
     GET_CTX()
     SET_ERROR_IF(n<0,GL_INVALID_VALUE);
-    if(ctx->shareGroup().Ptr()) {
+    if(ctx->shareGroup().get()) {
         for(int i=0; i < n; i++){
             if(textures[i] != 0)
             {
@@ -672,7 +672,7 @@
 GL_API void GL_APIENTRY  glGenBuffers( GLsizei n, GLuint *buffers) {
     GET_CTX()
     SET_ERROR_IF(n<0,GL_INVALID_VALUE);
-    if(ctx->shareGroup().Ptr()) {
+    if(ctx->shareGroup().get()) {
         for(int i=0; i<n ;i++) {
             buffers[i] = ctx->shareGroup()->genName(VERTEXBUFFER, 0, true);
             //generating vbo object related to this buffer name
@@ -683,7 +683,7 @@
 
 GL_API void GL_APIENTRY  glGenTextures( GLsizei n, GLuint *textures) {
     GET_CTX();
-    if(ctx->shareGroup().Ptr()) {
+    if(ctx->shareGroup().get()) {
         for(int i=0; i<n ;i++) {
             textures[i] = ctx->shareGroup()->genName(TEXTURE, 0, true);
         }
@@ -872,13 +872,13 @@
         ctx->dispatcher().glGetIntegerv(GL_TEXTURE_GEN_S,&params[0]);
         break;
     case GL_FRAMEBUFFER_BINDING_OES:
-        if (ctx->shareGroup().Ptr()) {
+        if (ctx->shareGroup().get()) {
             ctx->dispatcher().glGetIntegerv(pname,&i);
             *params = ctx->shareGroup()->getLocalName(FRAMEBUFFER,i);
         }
         break;
     case GL_RENDERBUFFER_BINDING_OES:
-        if (ctx->shareGroup().Ptr()) {
+        if (ctx->shareGroup().get()) {
             ctx->dispatcher().glGetIntegerv(pname,&i);
             *params = ctx->shareGroup()->getLocalName(RENDERBUFFER,i);
         }
@@ -1457,7 +1457,7 @@
 
     bool needAutoMipmap = false;
 
-    if (ctx->shareGroup().Ptr()){
+    if (ctx->shareGroup().get()){
         TextureData *texData = getTextureTargetData(target);
         SET_ERROR_IF(texData==NULL,GL_INVALID_OPERATION);
         if(texData) {
@@ -1611,7 +1611,7 @@
 
     ctx->dispatcher().glTexSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels);
 
-    if (ctx->shareGroup().Ptr()){
+    if (ctx->shareGroup().get()){
         TextureData *texData = getTextureTargetData(target);
         SET_ERROR_IF(texData==NULL,GL_INVALID_OPERATION);
         if(texData && texData->requiresAutoMipmap)
@@ -1653,7 +1653,7 @@
         // 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 (ctx->shareGroup().Ptr()) {
+        if (ctx->shareGroup().get()) {
             ObjectLocalName tex = TextureLocalName(target,ctx->getBindedTexture(target));
             unsigned int oldGlobal = ctx->shareGroup()->getGlobalName(TEXTURE, tex);
             // Delete old texture object but only if it is not a target of a EGLImage
@@ -1686,14 +1686,14 @@
     unsigned int imagehndl = SafeUIntFromPointer(image);
     EglImage *img = s_eglIface->eglAttachEGLImage(imagehndl);
     SET_ERROR_IF(!img,GL_INVALID_VALUE);
-    SET_ERROR_IF(!ctx->shareGroup().Ptr(),GL_INVALID_OPERATION);
+    SET_ERROR_IF(!ctx->shareGroup().get(),GL_INVALID_OPERATION);
 
     // Get current bounded renderbuffer
     // raise INVALID_OPERATIOn if no renderbuffer is bounded
     GLuint rb = ctx->getRenderbufferBinding();
     SET_ERROR_IF(rb == 0,GL_INVALID_OPERATION);
     ObjectDataPtr objData = ctx->shareGroup()->getObjectData(RENDERBUFFER,rb);
-    RenderbufferData *rbData = (RenderbufferData *)objData.Ptr();
+    RenderbufferData *rbData = (RenderbufferData *)objData.get();
     SET_ERROR_IF(!rbData,GL_INVALID_OPERATION);
 
     //
@@ -1753,7 +1753,7 @@
 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 && ctx->shareGroup().Ptr()){
+    if(renderbuffer && ctx->shareGroup().get()){
         return ctx->shareGroup()->isObject(RENDERBUFFER,renderbuffer) ? GL_TRUE :GL_FALSE;
     }
     return ctx->dispatcher().glIsRenderbufferEXT(renderbuffer);
@@ -1765,7 +1765,7 @@
     SET_ERROR_IF(!GLEScmValidate::renderbufferTarget(target),GL_INVALID_ENUM);
 
     //if buffer wasn't generated before,generate one
-    if(renderbuffer && ctx->shareGroup().Ptr() && !ctx->shareGroup()->isObject(RENDERBUFFER,renderbuffer)){
+    if(renderbuffer && ctx->shareGroup().get() && !ctx->shareGroup()->isObject(RENDERBUFFER,renderbuffer)){
         ctx->shareGroup()->genName(RENDERBUFFER,renderbuffer);
         ctx->shareGroup()->setObjectData(RENDERBUFFER,
                                          renderbuffer,
@@ -1792,7 +1792,7 @@
     GET_CTX()
     SET_ERROR_IF(!ctx->getCaps()->GL_EXT_FRAMEBUFFER_OBJECT,GL_INVALID_OPERATION);
     SET_ERROR_IF(n<0,GL_INVALID_VALUE);
-    if(ctx->shareGroup().Ptr()) {
+    if(ctx->shareGroup().get()) {
         for(int i=0; i<n ;i++) {
             renderbuffers[i] = ctx->shareGroup()->genName(RENDERBUFFER, 0, true);
             ctx->shareGroup()->setObjectData(RENDERBUFFER,
@@ -1814,7 +1814,7 @@
     GLuint rb = ctx->getRenderbufferBinding();
     SET_ERROR_IF(rb == 0,GL_INVALID_OPERATION);
     ObjectDataPtr objData = ctx->shareGroup()->getObjectData(RENDERBUFFER,rb);
-    RenderbufferData *rbData = (RenderbufferData *)objData.Ptr();
+    RenderbufferData *rbData = (RenderbufferData *)objData.get();
     SET_ERROR_IF(!rbData,GL_INVALID_OPERATION);
 
     //
@@ -1844,7 +1844,7 @@
     GLuint rb = ctx->getRenderbufferBinding();
     if (rb) {
         ObjectDataPtr objData = ctx->shareGroup()->getObjectData(RENDERBUFFER,rb);
-        RenderbufferData *rbData = (RenderbufferData *)objData.Ptr();
+        RenderbufferData *rbData = (RenderbufferData *)objData.get();
         if (rbData && rbData->sourceEGLImage != 0) {
             GLenum texPname;
             switch(pname) {
@@ -1897,7 +1897,7 @@
 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 && ctx->shareGroup().Ptr()) {
+    if (framebuffer && ctx->shareGroup().get()) {
         return ctx->shareGroup()->isObject(FRAMEBUFFER,framebuffer) ? GL_TRUE : GL_FALSE;
     }
     return ctx->dispatcher().glIsFramebufferEXT(framebuffer);
@@ -1907,7 +1907,7 @@
     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 && ctx->shareGroup().Ptr() && !ctx->shareGroup()->isObject(FRAMEBUFFER,framebuffer)) {
+    if (framebuffer && ctx->shareGroup().get() && !ctx->shareGroup()->isObject(FRAMEBUFFER,framebuffer)) {
         ctx->shareGroup()->genName(FRAMEBUFFER,framebuffer);
         ctx->shareGroup()->setObjectData(FRAMEBUFFER, framebuffer,
                                          ObjectDataPtr(new FramebufferData(framebuffer)));
@@ -1932,7 +1932,7 @@
     GET_CTX()
     SET_ERROR_IF(!ctx->getCaps()->GL_EXT_FRAMEBUFFER_OBJECT,GL_INVALID_OPERATION);
     SET_ERROR_IF(n<0,GL_INVALID_VALUE);
-    if (ctx->shareGroup().Ptr()) {
+    if (ctx->shareGroup().get()) {
         for (int i=0;i<n;i++) {
             framebuffers[i] = ctx->shareGroup()->genName(FRAMEBUFFER, 0, true);
             ctx->shareGroup()->setObjectData(FRAMEBUFFER, framebuffers[i],
@@ -1953,7 +1953,7 @@
     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);
-    SET_ERROR_IF(!ctx->shareGroup().Ptr(), GL_INVALID_OPERATION);
+    SET_ERROR_IF(!ctx->shareGroup().get(), GL_INVALID_OPERATION);
 
     GLuint globalTexName = 0;
     if(texture) {
@@ -1969,8 +1969,8 @@
     // Update the the current framebuffer object attachment state
     GLuint fbName = ctx->getFramebufferBinding();
     ObjectDataPtr fbObj = ctx->shareGroup()->getObjectData(FRAMEBUFFER,fbName);
-    if (fbObj.Ptr() != NULL) {
-        FramebufferData *fbData = (FramebufferData *)fbObj.Ptr();
+    if (fbObj.get() != NULL) {
+        FramebufferData *fbData = (FramebufferData *)fbObj.get();
         fbData->setAttachment(attachment, textarget, 
                               texture, ObjectDataPtr(NULL));
     }
@@ -1983,7 +1983,7 @@
                  !GLEScmValidate::framebufferAttachment(attachment) ||
                  !GLEScmValidate::renderbufferTarget(renderbuffertarget), GL_INVALID_ENUM);
 
-    SET_ERROR_IF(!ctx->shareGroup().Ptr(), GL_INVALID_OPERATION);
+    SET_ERROR_IF(!ctx->shareGroup().get(), GL_INVALID_OPERATION);
 
     GLuint globalBufferName = 0;
     ObjectDataPtr obj;
@@ -2006,13 +2006,13 @@
     // Update the the current framebuffer object attachment state
     GLuint fbName = ctx->getFramebufferBinding();
     ObjectDataPtr fbObj = ctx->shareGroup()->getObjectData(FRAMEBUFFER,fbName);
-    if (fbObj.Ptr() != NULL) {
-        FramebufferData *fbData = (FramebufferData *)fbObj.Ptr();
+    if (fbObj.get() != NULL) {
+        FramebufferData *fbData = (FramebufferData *)fbObj.get();
         fbData->setAttachment(attachment, renderbuffertarget, renderbuffer, obj);
     }
 
-    if (renderbuffer && obj.Ptr() != NULL) {
-        RenderbufferData *rbData = (RenderbufferData *)obj.Ptr();
+    if (renderbuffer && obj.get() != NULL) {
+        RenderbufferData *rbData = (RenderbufferData *)obj.get();
         if (rbData->sourceEGLImage != 0) {
             //
             // This renderbuffer object is an eglImage target
@@ -2041,8 +2041,8 @@
     GLuint fbName = ctx->getFramebufferBinding();
     if (fbName) {
         ObjectDataPtr fbObj = ctx->shareGroup()->getObjectData(FRAMEBUFFER,fbName);
-        if (fbObj.Ptr() != NULL) {
-            FramebufferData *fbData = (FramebufferData *)fbObj.Ptr();
+        if (fbObj.get() != NULL) {
+            FramebufferData *fbData = (FramebufferData *)fbObj.get();
             GLenum target;
             GLuint name = fbData->getAttachment(attachment, &target, NULL);
             if (pname == GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_OES) {
@@ -2275,8 +2275,8 @@
             ObjectLocalName tex = TextureLocalName(GL_TEXTURE_2D,texname);
             ctx->dispatcher().glClientActiveTexture(GL_TEXTURE0+i);
             ObjectDataPtr objData = ctx->shareGroup()->getObjectData(TEXTURE,tex);
-            if (objData.Ptr()) {
-                texData = (TextureData*)objData.Ptr();
+            if (objData.get()) {
+                texData = (TextureData*)objData.get();
                 //calculate texels
                 texels[i][0] = (float)(texData->crop_rect[0])/(float)(texData->width);
                 texels[i][1] = (float)(texData->crop_rect[1])/(float)(texData->height);
diff --git a/distrib/android-emugl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp b/distrib/android-emugl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp
index beefde0..0202b92 100644
--- a/distrib/android-emugl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp
+++ b/distrib/android-emugl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp
@@ -128,19 +128,19 @@
 }  // extern "C"
 
 static void s_attachShader(GLEScontext* ctx, GLuint program, GLuint shader) {
-    if (ctx && program && shader && ctx->shareGroup().Ptr()) {
+    if (ctx && program && shader && ctx->shareGroup().get()) {
         ObjectDataPtr shaderData = ctx->shareGroup()->getObjectData(SHADER,shader);
-        if (!shaderData.Ptr()) return;
-        ShaderParser* shaderParser = (ShaderParser*)shaderData.Ptr();
+        if (!shaderData.get()) return;
+        ShaderParser* shaderParser = (ShaderParser*)shaderData.get();
         shaderParser->setAttachedProgram(program);
     }
 }
 
 static void s_detachShader(GLEScontext* ctx, GLuint shader) {
-    if (ctx && shader && ctx->shareGroup().Ptr()) {
+    if (ctx && shader && ctx->shareGroup().get()) {
         ObjectDataPtr shaderData = ctx->shareGroup()->getObjectData(SHADER,shader);
-        if (!shaderData.Ptr()) return;
-        ShaderParser* shaderParser = (ShaderParser*)shaderData.Ptr();
+        if (!shaderData.get()) return;
+        ShaderParser* shaderParser = (ShaderParser*)shaderData.get();
         shaderParser->setAttachedProgram(0);
         if (shaderParser->getDeleteStatus()) {
             ctx->shareGroup()->deleteName(SHADER, shader);
@@ -157,11 +157,11 @@
     GET_CTX_RET(NULL);
     TextureData *texData = NULL;
     ObjectDataPtr objData = ctx->shareGroup()->getObjectData(TEXTURE,tex);
-    if(!objData.Ptr()){
+    if(!objData.get()){
         texData = new TextureData();
         ctx->shareGroup()->setObjectData(TEXTURE, tex, ObjectDataPtr(texData));
     } else {
-        texData = (TextureData*)objData.Ptr();
+        texData = (TextureData*)objData.get();
     }
     return texData;
 }
@@ -181,7 +181,7 @@
 
 GL_APICALL void  GL_APIENTRY glAttachShader(GLuint program, GLuint shader){
     GET_CTX();
-    if(ctx->shareGroup().Ptr()) {
+    if(ctx->shareGroup().get()) {
         const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
         SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
         const GLuint globalShaderName  = ctx->shareGroup()->getGlobalName(SHADER,shader);
@@ -189,12 +189,12 @@
 
         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);
+        SET_ERROR_IF(!shaderData.get() || !programData.get() ,GL_INVALID_OPERATION);
+        SET_ERROR_IF(!(shaderData.get()->getDataType() ==SHADER_DATA) ||
+                     !(programData.get()->getDataType()==PROGRAM_DATA) ,GL_INVALID_OPERATION);
 
-        GLenum shaderType = ((ShaderParser*)shaderData.Ptr())->getType();
-        ProgramData* pData = (ProgramData*)programData.Ptr();
+        GLenum shaderType = ((ShaderParser*)shaderData.get())->getType();
+        ProgramData* pData = (ProgramData*)programData.get();
         SET_ERROR_IF((pData->getAttachedShader(shaderType)!=0), GL_INVALID_OPERATION);
         pData->attachShader(shader,shaderType);
         s_attachShader(ctx, program, shader);
@@ -206,11 +206,11 @@
     GET_CTX();
     SET_ERROR_IF(!GLESv2Validate::attribName(name),GL_INVALID_OPERATION);
     SET_ERROR_IF(!GLESv2Validate::attribIndex(index),GL_INVALID_VALUE);
-    if(ctx->shareGroup().Ptr()) {
+    if(ctx->shareGroup().get()) {
         const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
         SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
         ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program);
-        SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
+        SET_ERROR_IF(objData.get()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
 
         ctx->dispatcher().glBindAttribLocation(globalProgramName,index,name);
     }
@@ -220,13 +220,13 @@
     GET_CTX();
     SET_ERROR_IF(!GLESv2Validate::bufferTarget(target),GL_INVALID_ENUM);
     //if buffer wasn't generated before,generate one
-    if(buffer && ctx->shareGroup().Ptr() && !ctx->shareGroup()->isObject(VERTEXBUFFER,buffer)){
+    if(buffer && ctx->shareGroup().get() && !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*)ctx->shareGroup()->getObjectData(VERTEXBUFFER,buffer).Ptr();
+        GLESbuffer* vbo = (GLESbuffer*)ctx->shareGroup()->getObjectData(VERTEXBUFFER,buffer).get();
         vbo->setBinded();
     }
 }
@@ -236,7 +236,7 @@
     SET_ERROR_IF(!GLESv2Validate::framebufferTarget(target),GL_INVALID_ENUM);
 
     GLuint globalFrameBufferName = framebuffer;
-    if(framebuffer && ctx->shareGroup().Ptr()){
+    if(framebuffer && ctx->shareGroup().get()){
         globalFrameBufferName = ctx->shareGroup()->getGlobalName(FRAMEBUFFER,framebuffer);
         //if framebuffer wasn't generated before,generate one
         if(!globalFrameBufferName){
@@ -257,7 +257,7 @@
     SET_ERROR_IF(!GLESv2Validate::renderbufferTarget(target),GL_INVALID_ENUM);
 
     GLuint globalRenderBufferName = renderbuffer;
-    if(renderbuffer && ctx->shareGroup().Ptr()){
+    if(renderbuffer && ctx->shareGroup().get()){
         globalRenderBufferName = ctx->shareGroup()->getGlobalName(RENDERBUFFER,renderbuffer);
         //if renderbuffer wasn't generated before,generate one
         if(!globalRenderBufferName){
@@ -282,7 +282,7 @@
     ObjectLocalName localTexName = TextureLocalName(target,texture);
     
     GLuint globalTextureName = localTexName;
-    if(ctx->shareGroup().Ptr()){
+    if(ctx->shareGroup().get()){
         globalTextureName = ctx->shareGroup()->getGlobalName(TEXTURE,localTexName);
         //if texture wasn't generated before,generate one
         if(!globalTextureName){
@@ -383,20 +383,24 @@
 
 GL_APICALL void  GL_APIENTRY glCompileShader(GLuint shader){
     GET_CTX();
-    if(ctx->shareGroup().Ptr()) {
+    if(ctx->shareGroup().get()) {
         const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shader);
         SET_ERROR_IF(globalShaderName==0, GL_INVALID_VALUE);
         ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,shader);
-        SET_ERROR_IF(objData.Ptr()->getDataType()!= SHADER_DATA,GL_INVALID_OPERATION);
-        ShaderParser* sp = (ShaderParser*)objData.Ptr();
-        ctx->dispatcher().glCompileShader(globalShaderName);
+        SET_ERROR_IF(objData.get()->getDataType()!= SHADER_DATA,GL_INVALID_OPERATION);
+        ShaderParser* sp = (ShaderParser*)objData.get();
+        if (sp->validShader()) {
+            ctx->dispatcher().glCompileShader(globalShaderName);
 
-        GLsizei infoLogLength=0;
-        GLchar* infoLog;
-        ctx->dispatcher().glGetShaderiv(globalShaderName,GL_INFO_LOG_LENGTH,&infoLogLength);
-        infoLog = new GLchar[infoLogLength+1];
-        ctx->dispatcher().glGetShaderInfoLog(globalShaderName,infoLogLength,NULL,infoLog);
-        sp->setInfoLog(infoLog);
+            GLsizei infoLogLength=0;
+            GLchar* infoLog;
+            ctx->dispatcher().glGetShaderiv(globalShaderName,GL_INFO_LOG_LENGTH,&infoLogLength);
+            infoLog = new GLchar[infoLogLength+1];
+            ctx->dispatcher().glGetShaderInfoLog(globalShaderName,infoLogLength,NULL,infoLog);
+            sp->setInfoLog(infoLog);
+        } else {
+            sp->setInvalidInfoLog();
+        }
     }
 }
 
@@ -405,6 +409,7 @@
     GET_CTX();
     SET_ERROR_IF(!GLESv2Validate::textureTargetEx(target),GL_INVALID_ENUM);
     SET_ERROR_IF(level < 0 || imageSize < 0, GL_INVALID_VALUE);
+    SET_ERROR_IF(!data,GL_INVALID_OPERATION);
 
     doCompressedTexImage2D(ctx, target, level, internalformat,
                                 width, height, border,
@@ -414,6 +419,7 @@
 GL_APICALL void  GL_APIENTRY glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid* data){
     GET_CTX();
     SET_ERROR_IF(!GLESv2Validate::textureTargetEx(target),GL_INVALID_ENUM);
+    SET_ERROR_IF(!data,GL_INVALID_OPERATION);
     ctx->dispatcher().glCompressedTexSubImage2D(target,level,xoffset,yoffset,width,height,format,imageSize,data);
 }
 
@@ -434,7 +440,7 @@
 GL_APICALL GLuint GL_APIENTRY glCreateProgram(void){
     GET_CTX_RET(0);
     const GLuint globalProgramName = ctx->dispatcher().glCreateProgram();
-    if(ctx->shareGroup().Ptr() && globalProgramName) {
+    if(ctx->shareGroup().get() && globalProgramName) {
             ProgramData* programInfo = new ProgramData();
             const GLuint localProgramName = ctx->shareGroup()->genName(SHADER, 0, true);
             ctx->shareGroup()->replaceGlobalName(SHADER,localProgramName,globalProgramName);
@@ -451,7 +457,7 @@
     GET_CTX_V2_RET(0);
     RET_AND_SET_ERROR_IF(!GLESv2Validate::shaderType(type),GL_INVALID_ENUM,0);
     const GLuint globalShaderName = ctx->dispatcher().glCreateShader(type);
-    if(ctx->shareGroup().Ptr() && globalShaderName) {
+    if(ctx->shareGroup().get() && globalShaderName) {
             const GLuint localShaderName = ctx->shareGroup()->genName(SHADER, 0, true);
             ShaderParser* sp = new ShaderParser(type);
             ctx->shareGroup()->replaceGlobalName(SHADER,localShaderName,globalShaderName);
@@ -472,7 +478,7 @@
 GL_APICALL void  GL_APIENTRY glDeleteBuffers(GLsizei n, const GLuint* buffers){
     GET_CTX();
     SET_ERROR_IF(n<0,GL_INVALID_VALUE);
-    if(ctx->shareGroup().Ptr()) {
+    if(ctx->shareGroup().get()) {
         for(int i=0; i < n; i++){
            ctx->shareGroup()->deleteName(VERTEXBUFFER,buffers[i]);
         }
@@ -482,7 +488,7 @@
 GL_APICALL void  GL_APIENTRY glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers){
     GET_CTX();
     SET_ERROR_IF(n<0,GL_INVALID_VALUE);
-    if(ctx->shareGroup().Ptr()) {
+    if(ctx->shareGroup().get()) {
         for(int i=0; i < n; i++){
            const GLuint globalFrameBufferName = ctx->shareGroup()->getGlobalName(FRAMEBUFFER,framebuffers[i]);
            ctx->shareGroup()->deleteName(FRAMEBUFFER,framebuffers[i]);
@@ -496,8 +502,8 @@
     GLuint fbName = ctx->getFramebufferBinding();
     if (!fbName) return;
     ObjectDataPtr fbObj = ctx->shareGroup()->getObjectData(FRAMEBUFFER,fbName);
-    if (fbObj.Ptr() == NULL) return;
-    FramebufferData *fbData = (FramebufferData *)fbObj.Ptr();
+    if (fbObj.get() == NULL) return;
+    FramebufferData *fbData = (FramebufferData *)fbObj.get();
     GLenum target;
     const GLenum kAttachments[] = {GL_COLOR_ATTACHMENT0, GL_DEPTH_ATTACHMENT, GL_STENCIL_ATTACHMENT};
     const size_t sizen = sizeof(kAttachments)/sizeof(GLenum);
@@ -515,7 +521,7 @@
 GL_APICALL void  GL_APIENTRY glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers){
     GET_CTX();
     SET_ERROR_IF(n<0,GL_INVALID_VALUE);
-    if(ctx->shareGroup().Ptr()) {
+    if(ctx->shareGroup().get()) {
         for(int i=0; i < n; i++){
            const GLuint globalRenderBufferName = ctx->shareGroup()->getGlobalName(RENDERBUFFER,renderbuffers[i]);
            ctx->shareGroup()->deleteName(RENDERBUFFER,renderbuffers[i]);
@@ -528,7 +534,7 @@
 GL_APICALL void  GL_APIENTRY glDeleteTextures(GLsizei n, const GLuint* textures){
     GET_CTX();
     SET_ERROR_IF(n<0,GL_INVALID_VALUE);
-    if(ctx->shareGroup().Ptr()) {
+    if(ctx->shareGroup().get()) {
         for(int i=0; i < n; i++){
             if (textures[i]!=0) {
                 TextureData* tData = getTextureData(textures[i]);
@@ -552,12 +558,12 @@
 
 GL_APICALL void  GL_APIENTRY glDeleteProgram(GLuint program){
     GET_CTX();
-    if(program && ctx->shareGroup().Ptr()) {
+    if(program && ctx->shareGroup().get()) {
         const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
         SET_ERROR_IF(!globalProgramName, GL_INVALID_VALUE);
 
         ObjectDataPtr programData = ctx->shareGroup()->getObjectData(SHADER,program);
-        ProgramData* pData = (ProgramData*)programData.Ptr();
+        ProgramData* pData = (ProgramData*)programData.get();
         if (pData && pData->isInUse()) {
             pData->setDeleteStatus(true);
             return;
@@ -572,13 +578,13 @@
 
 GL_APICALL void  GL_APIENTRY glDeleteShader(GLuint shader){
     GET_CTX();
-    if(shader && ctx->shareGroup().Ptr()) {
+    if(shader && ctx->shareGroup().get()) {
         const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shader);
         SET_ERROR_IF(!globalShaderName, GL_INVALID_VALUE);
         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();
+        SET_ERROR_IF(!objData.get() ,GL_INVALID_OPERATION);
+        SET_ERROR_IF(objData.get()->getDataType()!=SHADER_DATA,GL_INVALID_OPERATION);
+        ShaderParser* sp = (ShaderParser*)objData.get();
         if (sp->getAttachedProgram()) {
             sp->setDeleteStatus(true);
         } else {
@@ -604,17 +610,17 @@
 
 GL_APICALL void  GL_APIENTRY glDetachShader(GLuint program, GLuint shader){
     GET_CTX();
-    if(ctx->shareGroup().Ptr()) {
+    if(ctx->shareGroup().get()) {
         const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
         SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
         const GLuint globalShaderName  = ctx->shareGroup()->getGlobalName(SHADER,shader);
         SET_ERROR_IF(globalShaderName==0, GL_INVALID_VALUE);
 
         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);
+        SET_ERROR_IF(!objData.get(),GL_INVALID_OPERATION);
+        SET_ERROR_IF(!(objData.get()->getDataType()==PROGRAM_DATA) ,GL_INVALID_OPERATION);
 
-        ProgramData* programData = (ProgramData*)objData.Ptr();
+        ProgramData* programData = (ProgramData*)objData.get();
         SET_ERROR_IF(!programData->isAttached(shader),GL_INVALID_OPERATION);
         programData->detachShader(shader);
 
@@ -681,7 +687,7 @@
     GLESConversionArrays tmpArrs;
     ctx->setupArraysPointers(tmpArrs,0,count,type,indices,false);
 
-    int maxIndex = ctx->findMaxIndex(count, type, indices);
+    unsigned int maxIndex = ctx->findMaxIndex(count, type, indices);
     ctx->validateAtt0PreDraw(maxIndex);
     
     //See glDrawArrays
@@ -727,7 +733,7 @@
     SET_ERROR_IF(!(GLESv2Validate::framebufferTarget(target)              &&
                    GLESv2Validate::renderbufferTarget(renderbuffertarget) &&
                    GLESv2Validate::framebufferAttachment(attachment)),GL_INVALID_ENUM);
-    SET_ERROR_IF(!ctx->shareGroup().Ptr(), GL_INVALID_OPERATION);
+    SET_ERROR_IF(!ctx->shareGroup().get(), GL_INVALID_OPERATION);
 
     GLuint globalRenderbufferName = 0;
     ObjectDataPtr obj;
@@ -750,13 +756,13 @@
     // Update the the current framebuffer object attachment state
     GLuint fbName = ctx->getFramebufferBinding();
     ObjectDataPtr fbObj = ctx->shareGroup()->getObjectData(FRAMEBUFFER,fbName);
-    if (fbObj.Ptr() != NULL) {
-        FramebufferData *fbData = (FramebufferData *)fbObj.Ptr();
+    if (fbObj.get() != NULL) {
+        FramebufferData *fbData = (FramebufferData *)fbObj.get();
         fbData->setAttachment(attachment, renderbuffertarget, renderbuffer, obj);
     }
 
-    if (renderbuffer && obj.Ptr() != NULL) {
-        RenderbufferData *rbData = (RenderbufferData *)obj.Ptr();
+    if (renderbuffer && obj.get() != NULL) {
+        RenderbufferData *rbData = (RenderbufferData *)obj.get();
         if (rbData->sourceEGLImage != 0) {
             //
             // This renderbuffer object is an eglImage target
@@ -779,7 +785,7 @@
                    GLESv2Validate::textureTargetEx(textarget)  &&
                    GLESv2Validate::framebufferAttachment(attachment)),GL_INVALID_ENUM);
     SET_ERROR_IF(level != 0, GL_INVALID_VALUE);
-    SET_ERROR_IF(!ctx->shareGroup().Ptr(), GL_INVALID_OPERATION);
+    SET_ERROR_IF(!ctx->shareGroup().get(), GL_INVALID_OPERATION);
 
     GLuint globalTextureName = 0;
 
@@ -796,8 +802,8 @@
     // Update the the current framebuffer object attachment state
     GLuint fbName = ctx->getFramebufferBinding();
     ObjectDataPtr fbObj = ctx->shareGroup()->getObjectData(FRAMEBUFFER,fbName);
-    if (fbObj.Ptr() != NULL) {
-        FramebufferData *fbData = (FramebufferData *)fbObj.Ptr();
+    if (fbObj.get() != NULL) {
+        FramebufferData *fbData = (FramebufferData *)fbObj.get();
         fbData->setAttachment(attachment, textarget, 
                               texture, ObjectDataPtr(NULL));
     }
@@ -812,7 +818,7 @@
 GL_APICALL void  GL_APIENTRY glGenBuffers(GLsizei n, GLuint* buffers){
     GET_CTX();
     SET_ERROR_IF(n<0,GL_INVALID_VALUE);
-    if(ctx->shareGroup().Ptr()) {
+    if(ctx->shareGroup().get()) {
         for(int i=0; i<n ;i++) {
             buffers[i] = ctx->shareGroup()->genName(VERTEXBUFFER, 0, true);
             //generating vbo object related to this buffer name
@@ -830,7 +836,7 @@
 GL_APICALL void  GL_APIENTRY glGenFramebuffers(GLsizei n, GLuint* framebuffers){
     GET_CTX();
     SET_ERROR_IF(n<0,GL_INVALID_VALUE);
-    if(ctx->shareGroup().Ptr()) {
+    if(ctx->shareGroup().get()) {
         for(int i=0; i<n ;i++) {
             framebuffers[i] = ctx->shareGroup()->genName(FRAMEBUFFER, 0 ,true);
             ctx->shareGroup()->setObjectData(FRAMEBUFFER, framebuffers[i],
@@ -842,7 +848,7 @@
 GL_APICALL void  GL_APIENTRY glGenRenderbuffers(GLsizei n, GLuint* renderbuffers){
     GET_CTX();
     SET_ERROR_IF(n<0,GL_INVALID_VALUE);
-    if(ctx->shareGroup().Ptr()) {
+    if(ctx->shareGroup().get()) {
         for(int i=0; i<n ;i++) {
             renderbuffers[i] = ctx->shareGroup()->genName(RENDERBUFFER, 0, true);
             ctx->shareGroup()->setObjectData(RENDERBUFFER,
@@ -855,7 +861,7 @@
 GL_APICALL void  GL_APIENTRY glGenTextures(GLsizei n, GLuint* textures){
     GET_CTX();
     SET_ERROR_IF(n<0,GL_INVALID_VALUE);
-    if(ctx->shareGroup().Ptr()) {
+    if(ctx->shareGroup().get()) {
         for(int i=0; i<n ;i++) {
             textures[i] = ctx->shareGroup()->genName(TEXTURE, 0, true);
         }
@@ -864,34 +870,34 @@
 
 GL_APICALL void  GL_APIENTRY glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name){
     GET_CTX();
-    if(ctx->shareGroup().Ptr()) {
+    if(ctx->shareGroup().get()) {
         const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
         SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
         ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program);
-        SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
+        SET_ERROR_IF(objData.get()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
         ctx->dispatcher().glGetActiveAttrib(globalProgramName,index,bufsize,length,size,type,name);
     }
 }
 
 GL_APICALL void  GL_APIENTRY glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name){
     GET_CTX();
-    if(ctx->shareGroup().Ptr()) {
+    if(ctx->shareGroup().get()) {
         const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
         SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
         ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program);
-        SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
+        SET_ERROR_IF(objData.get()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
         ctx->dispatcher().glGetActiveUniform(globalProgramName,index,bufsize,length,size,type,name);
     }
 }
 
 GL_APICALL void  GL_APIENTRY glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders){
     GET_CTX();
-    if(ctx->shareGroup().Ptr()) {
+    if(ctx->shareGroup().get()) {
         const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
         SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
         ctx->dispatcher().glGetAttachedShaders(globalProgramName,maxcount,count,shaders);
         ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program);
-        SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
+        SET_ERROR_IF(objData.get()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
         GLint numShaders=0;
         ctx->dispatcher().glGetProgramiv(globalProgramName,GL_ATTACHED_SHADERS,&numShaders);
         for(int i=0 ; i < maxcount && i<numShaders ;i++){
@@ -902,12 +908,12 @@
 
 GL_APICALL int GL_APIENTRY glGetAttribLocation(GLuint program, const GLchar* name){
      GET_CTX_RET(-1);
-     if(ctx->shareGroup().Ptr()) {
+     if(ctx->shareGroup().get()) {
         const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
         RET_AND_SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE,-1);
         ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program);
-        RET_AND_SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION,-1);
-        ProgramData* pData = (ProgramData *)objData.Ptr();
+        RET_AND_SET_ERROR_IF(objData.get()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION,-1);
+        ProgramData* pData = (ProgramData *)objData.get();
         RET_AND_SET_ERROR_IF(pData->getLinkStatus() != GL_TRUE,GL_INVALID_OPERATION,-1);
         return ctx->dispatcher().glGetAttribLocation(globalProgramName,name);
      }
@@ -1056,19 +1062,19 @@
 
     switch (pname) {
     case GL_CURRENT_PROGRAM:
-        if (ctx->shareGroup().Ptr()) {
+        if (ctx->shareGroup().get()) {
             ctx->dispatcher().glGetIntegerv(pname,&i);
             *params = ctx->shareGroup()->getLocalName(SHADER,i);
         }
         break;
     case GL_FRAMEBUFFER_BINDING:
-        if (ctx->shareGroup().Ptr()) {
+        if (ctx->shareGroup().get()) {
             ctx->dispatcher().glGetIntegerv(pname,&i);
             *params = ctx->shareGroup()->getLocalName(FRAMEBUFFER,i);
         }
         break;
     case GL_RENDERBUFFER_BINDING:
-        if (ctx->shareGroup().Ptr()) {
+        if (ctx->shareGroup().get()) {
             ctx->dispatcher().glGetIntegerv(pname,&i);
             *params = ctx->shareGroup()->getLocalName(RENDERBUFFER,i);
         }
@@ -1151,8 +1157,8 @@
     SET_ERROR_IF (!fbName, GL_INVALID_OPERATION);
     if (fbName) {
         ObjectDataPtr fbObj = ctx->shareGroup()->getObjectData(FRAMEBUFFER,fbName);
-        if (fbObj.Ptr() != NULL) {
-            FramebufferData *fbData = (FramebufferData *)fbObj.Ptr();
+        if (fbObj.get() != NULL) {
+            FramebufferData *fbData = (FramebufferData *)fbObj.get();
             GLenum target;
             GLuint name = fbData->getAttachment(attachment, &target, NULL);
             if (!name) {
@@ -1192,7 +1198,7 @@
     GLuint rb = ctx->getRenderbufferBinding();
     if (rb) {
         ObjectDataPtr objData = ctx->shareGroup()->getObjectData(RENDERBUFFER,rb);
-        RenderbufferData *rbData = (RenderbufferData *)objData.Ptr();
+        RenderbufferData *rbData = (RenderbufferData *)objData.get();
         if (rbData && rbData->sourceEGLImage != 0) {
             GLenum texPname;
             switch(pname) {
@@ -1246,25 +1252,25 @@
 GL_APICALL void  GL_APIENTRY glGetProgramiv(GLuint program, GLenum pname, GLint* params){
     GET_CTX();
     SET_ERROR_IF(!GLESv2Validate::programParam(pname),GL_INVALID_ENUM);
-    if(ctx->shareGroup().Ptr()) {
+    if(ctx->shareGroup().get()) {
         const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
         SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
         switch(pname) {
         case GL_DELETE_STATUS:
             {
                 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();
+                SET_ERROR_IF(!objData.get() ,GL_INVALID_OPERATION);
+                SET_ERROR_IF(objData.get()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
+                ProgramData* programData = (ProgramData*)objData.get();
                 params[0] = programData->getDeleteStatus() ? GL_TRUE : GL_FALSE;
             }
             break;
         case GL_LINK_STATUS:
             {
                 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();
+                SET_ERROR_IF(!objData.get() ,GL_INVALID_OPERATION);
+                SET_ERROR_IF(objData.get()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
+                ProgramData* programData = (ProgramData*)objData.get();
                 params[0] = programData->getLinkStatus();
             }
             break;
@@ -1272,9 +1278,9 @@
         case GL_VALIDATE_STATUS:
             {
                 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();
+                SET_ERROR_IF(!objData.get() ,GL_INVALID_OPERATION);
+                SET_ERROR_IF(objData.get()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
+                ProgramData* programData = (ProgramData*)objData.get();
                 if (programData->getLinkStatus()==GL_TRUE) 
                     ctx->dispatcher().glGetProgramiv(globalProgramName,pname,params);
                 else
@@ -1284,9 +1290,9 @@
         case GL_INFO_LOG_LENGTH:
             {
                 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();
+                SET_ERROR_IF(!objData.get() ,GL_INVALID_OPERATION);
+                SET_ERROR_IF(objData.get()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
+                ProgramData* programData = (ProgramData*)objData.get();
                 GLint logLength = strlen(programData->getInfoLog());
                 params[0] = (logLength>0) ? logLength+1 : 0;
             }
@@ -1299,13 +1305,13 @@
 
 GL_APICALL void  GL_APIENTRY glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog){
     GET_CTX();
-    if(ctx->shareGroup().Ptr()) {
+    if(ctx->shareGroup().get()) {
         const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
         SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
         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();
+        SET_ERROR_IF(!objData.get() ,GL_INVALID_OPERATION);
+        SET_ERROR_IF(objData.get()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
+        ProgramData* programData = (ProgramData*)objData.get();
 
         if (bufsize==0) {
             if (length) {
@@ -1331,14 +1337,14 @@
 
 GL_APICALL void  GL_APIENTRY glGetShaderiv(GLuint shader, GLenum pname, GLint* params){
     GET_CTX();
-    if(ctx->shareGroup().Ptr()) {
+    if(ctx->shareGroup().get()) {
         const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shader);
         if (pname == GL_DELETE_STATUS) {
             SET_ERROR_IF(globalShaderName == 0, GL_INVALID_VALUE);
             ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,shader);
-            SET_ERROR_IF(!objData.Ptr() ,GL_INVALID_VALUE);
-            SET_ERROR_IF(objData.Ptr()->getDataType()!=SHADER_DATA,GL_INVALID_VALUE);
-            ShaderParser* sp = (ShaderParser*)objData.Ptr();
+            SET_ERROR_IF(!objData.get() ,GL_INVALID_VALUE);
+            SET_ERROR_IF(objData.get()->getDataType()!=SHADER_DATA,GL_INVALID_VALUE);
+            ShaderParser* sp = (ShaderParser*)objData.get();
             params[0]  = (sp->getDeleteStatus()) ? GL_TRUE : GL_FALSE;
             return;
         }
@@ -1347,9 +1353,9 @@
         case GL_INFO_LOG_LENGTH:
             {
                 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();
+                SET_ERROR_IF(!objData.get() ,GL_INVALID_OPERATION);
+                SET_ERROR_IF(objData.get()->getDataType()!=SHADER_DATA,GL_INVALID_OPERATION);
+                ShaderParser* sp = (ShaderParser*)objData.get();
                 GLint logLength = strlen(sp->getInfoLog());
                 params[0] = (logLength>0) ? logLength+1 : 0;
             }
@@ -1363,13 +1369,13 @@
 
 GL_APICALL void  GL_APIENTRY glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog){
     GET_CTX();
-    if(ctx->shareGroup().Ptr()) {
+    if(ctx->shareGroup().get()) {
         const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shader);
         SET_ERROR_IF(globalShaderName==0, GL_INVALID_VALUE);
         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();
+        SET_ERROR_IF(!objData.get() ,GL_INVALID_OPERATION);
+        SET_ERROR_IF(objData.get()->getDataType()!=SHADER_DATA,GL_INVALID_OPERATION);
+        ShaderParser* sp = (ShaderParser*)objData.get();
 
         if (bufsize==0) {
             if (length) {
@@ -1420,21 +1426,18 @@
 
 GL_APICALL void  GL_APIENTRY glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source){
     GET_CTX();
-    if(ctx->shareGroup().Ptr()) {
+    if(ctx->shareGroup().get()) {
        const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shader);
        SET_ERROR_IF(globalShaderName == 0,GL_INVALID_VALUE);
        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();
-       int srcLength = 0;
-       if (src) {
-            srcLength = strlen(src);
-       }
+       SET_ERROR_IF(!objData.get(),GL_INVALID_OPERATION);
+       SET_ERROR_IF(objData.get()->getDataType()!=SHADER_DATA,GL_INVALID_OPERATION);
+       const std::string& src = ((ShaderParser*)objData.get())->getOriginalSrc();
+       int srcLength = static_cast<int>(src.size());
 
        int returnLength = bufsize<srcLength ? bufsize-1 : srcLength;
        if (returnLength) {
-            strncpy(source,src, returnLength);
+            strncpy(source, src.c_str(), returnLength);
             source[returnLength] = '\0';
        }
 
@@ -1478,12 +1481,12 @@
 GL_APICALL void  GL_APIENTRY glGetUniformfv(GLuint program, GLint location, GLfloat* params){
     GET_CTX();
     SET_ERROR_IF(location < 0,GL_INVALID_OPERATION);
-    if(ctx->shareGroup().Ptr()) {
+    if(ctx->shareGroup().get()) {
         const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
         SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
         ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program);
-        SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
-        ProgramData* pData = (ProgramData *)objData.Ptr();
+        SET_ERROR_IF(objData.get()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
+        ProgramData* pData = (ProgramData *)objData.get();
         SET_ERROR_IF(pData->getLinkStatus() != GL_TRUE,GL_INVALID_OPERATION);
         ctx->dispatcher().glGetUniformfv(globalProgramName,location,params);
     }
@@ -1492,12 +1495,12 @@
 GL_APICALL void  GL_APIENTRY glGetUniformiv(GLuint program, GLint location, GLint* params){
     GET_CTX();
     SET_ERROR_IF(location < 0,GL_INVALID_OPERATION);
-    if(ctx->shareGroup().Ptr()) {
+    if(ctx->shareGroup().get()) {
         const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
         SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
         ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program);
-        SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
-        ProgramData* pData = (ProgramData *)objData.Ptr();
+        SET_ERROR_IF(objData.get()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
+        ProgramData* pData = (ProgramData *)objData.get();
         SET_ERROR_IF(pData->getLinkStatus() != GL_TRUE,GL_INVALID_OPERATION);
         ctx->dispatcher().glGetUniformiv(globalProgramName,location,params);
     }
@@ -1505,12 +1508,12 @@
 
 GL_APICALL int GL_APIENTRY glGetUniformLocation(GLuint program, const GLchar* name){
     GET_CTX_RET(-1);
-    if(ctx->shareGroup().Ptr()) {
+    if(ctx->shareGroup().get()) {
         const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
         RET_AND_SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE,-1);
         ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program);
-        RET_AND_SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION,-1);
-        ProgramData* pData = (ProgramData *)objData.Ptr();
+        RET_AND_SET_ERROR_IF(objData.get()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION,-1);
+        ProgramData* pData = (ProgramData *)objData.get();
         RET_AND_SET_ERROR_IF(pData->getLinkStatus() != GL_TRUE,GL_INVALID_OPERATION,-1);
         return ctx->dispatcher().glGetUniformLocation(globalProgramName,name);
     }
@@ -1634,16 +1637,16 @@
 
 GL_APICALL GLboolean    GL_APIENTRY glIsBuffer(GLuint buffer){
     GET_CTX_RET(GL_FALSE)
-    if(buffer && ctx->shareGroup().Ptr()) {
+    if(buffer && ctx->shareGroup().get()) {
        ObjectDataPtr objData = ctx->shareGroup()->getObjectData(VERTEXBUFFER,buffer);
-       return objData.Ptr() ? ((GLESbuffer*)objData.Ptr())->wasBinded():GL_FALSE;
+       return objData.get() ? ((GLESbuffer*)objData.get())->wasBinded():GL_FALSE;
     }
     return GL_FALSE;
 }
 
 GL_APICALL GLboolean    GL_APIENTRY glIsFramebuffer(GLuint framebuffer){
     GET_CTX_RET(GL_FALSE)
-    if(framebuffer && ctx->shareGroup().Ptr()){
+    if(framebuffer && ctx->shareGroup().get()){
         return (ctx->shareGroup()->isObject(FRAMEBUFFER,framebuffer) &&
             ctx->getFramebufferBinding() == framebuffer) ? GL_TRUE :GL_FALSE;
     }
@@ -1652,7 +1655,7 @@
 
 GL_APICALL GLboolean    GL_APIENTRY glIsRenderbuffer(GLuint renderbuffer){
     GET_CTX_RET(GL_FALSE)
-    if(renderbuffer && ctx->shareGroup().Ptr()){
+    if(renderbuffer && ctx->shareGroup().get()){
         return (ctx->shareGroup()->isObject(RENDERBUFFER,renderbuffer) &&
                 ctx->getRenderbufferBinding() == renderbuffer) ? GL_TRUE :GL_FALSE;
     }
@@ -1669,7 +1672,7 @@
 
 GL_APICALL GLboolean    GL_APIENTRY glIsProgram(GLuint program){
     GET_CTX_RET(GL_FALSE)
-    if(program && ctx->shareGroup().Ptr() &&
+    if(program && ctx->shareGroup().get() &&
        ctx->shareGroup()->isObject(SHADER,program)) {
         const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
         return ctx->dispatcher().glIsProgram(globalProgramName);
@@ -1679,7 +1682,7 @@
 
 GL_APICALL GLboolean    GL_APIENTRY glIsShader(GLuint shader){
     GET_CTX_RET(GL_FALSE)
-    if(shader && ctx->shareGroup().Ptr() &&
+    if(shader && ctx->shareGroup().get() &&
        ctx->shareGroup()->isObject(SHADER,shader)) {
         const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shader);
         return ctx->dispatcher().glIsShader(globalShaderName);
@@ -1695,14 +1698,14 @@
 GL_APICALL void  GL_APIENTRY glLinkProgram(GLuint program){
     GET_CTX();
     GLint linkStatus = GL_FALSE;
-    if(ctx->shareGroup().Ptr()) {
+    if(ctx->shareGroup().get()) {
         const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
         SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
 
         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();
+        SET_ERROR_IF(!objData.get(), GL_INVALID_OPERATION);
+        SET_ERROR_IF(objData.get()->getDataType()!=PROGRAM_DATA, GL_INVALID_OPERATION);
+        ProgramData* programData = (ProgramData*)objData.get();
         GLint fragmentShader   = programData->getAttachedFragmentShader();
         GLint vertexShader =  programData->getAttachedVertexShader();
         if (vertexShader != 0 && fragmentShader!=0) {
@@ -1796,7 +1799,7 @@
     GLuint rb = ctx->getRenderbufferBinding();
     SET_ERROR_IF(rb == 0,GL_INVALID_OPERATION);
     ObjectDataPtr objData = ctx->shareGroup()->getObjectData(RENDERBUFFER,rb);
-    RenderbufferData *rbData = (RenderbufferData *)objData.Ptr();
+    RenderbufferData *rbData = (RenderbufferData *)objData.get();
     SET_ERROR_IF(!rbData,GL_INVALID_OPERATION);
 
     //
@@ -1829,7 +1832,7 @@
 
     SET_ERROR_IF( (ctx->dispatcher().glShaderBinary == NULL), GL_INVALID_OPERATION);
 
-    if(ctx->shareGroup().Ptr()){
+    if(ctx->shareGroup().get()){
         for(int i=0; i < n ; i++){
             const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shaders[i]);
             SET_ERROR_IF(globalShaderName == 0,GL_INVALID_VALUE);
@@ -1841,15 +1844,16 @@
 GL_APICALL void  GL_APIENTRY glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length){
     GET_CTX_V2();
     SET_ERROR_IF(count < 0,GL_INVALID_VALUE);
-    if(ctx->shareGroup().Ptr()){
+    if(ctx->shareGroup().get()){
             const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shader);
             SET_ERROR_IF(globalShaderName == 0,GL_INVALID_VALUE);
             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();
+            SET_ERROR_IF(!objData.get(),GL_INVALID_OPERATION);
+            SET_ERROR_IF(objData.get()->getDataType()!=SHADER_DATA,GL_INVALID_OPERATION);
+            ShaderParser* sp = (ShaderParser*)objData.get();
             sp->setSrc(ctx->glslVersion(),count,string,length);
             ctx->dispatcher().glShaderSource(globalShaderName,1,sp->parsedLines(),NULL);
+            sp->clear();
     }
 }
 
@@ -1908,7 +1912,7 @@
     SET_ERROR_IF(!(GLESv2Validate::pixelOp(format,type) && internalformat == ((GLint)format)),GL_INVALID_OPERATION);
     SET_ERROR_IF(border != 0,GL_INVALID_VALUE);
 
-    if (ctx->shareGroup().Ptr()){
+    if (ctx->shareGroup().get()){
         TextureData *texData = getTextureTargetData(target);
         if(texData) {
             texData->width = width;
@@ -1976,6 +1980,7 @@
     SET_ERROR_IF(!(GLESv2Validate::pixelFrmt(ctx,format)&&
                    GLESv2Validate::pixelType(ctx,type)),GL_INVALID_ENUM);
     SET_ERROR_IF(!GLESv2Validate::pixelOp(format,type),GL_INVALID_OPERATION);
+    SET_ERROR_IF(!pixels,GL_INVALID_OPERATION);
     if (type==GL_HALF_FLOAT_OES)
         type = GL_HALF_FLOAT_NV;
 
@@ -2079,23 +2084,23 @@
     if (!localCurrentProgram) return;
 
     ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,localCurrentProgram);
-    SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
-    ProgramData* programData = (ProgramData*)objData.Ptr();
+    SET_ERROR_IF(objData.get()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
+    ProgramData* programData = (ProgramData*)objData.get();
     programData->setInUse(false);
     if (programData->getDeleteStatus()) { glDeleteProgram(localCurrentProgram); }
 }
 
 GL_APICALL void  GL_APIENTRY glUseProgram(GLuint program){
     GET_CTX();
-    if(ctx->shareGroup().Ptr()) {
+    if(ctx->shareGroup().get()) {
         const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
         SET_ERROR_IF(program!=0 && globalProgramName==0,GL_INVALID_VALUE);
         ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program);
-        SET_ERROR_IF(objData.Ptr() && (objData.Ptr()->getDataType()!=PROGRAM_DATA),GL_INVALID_OPERATION);
+        SET_ERROR_IF(objData.get() && (objData.get()->getDataType()!=PROGRAM_DATA),GL_INVALID_OPERATION);
 
         s_unUseCurrentProgram();
 
-        ProgramData* programData = (ProgramData*)objData.Ptr();
+        ProgramData* programData = (ProgramData*)objData.get();
         if (programData) programData->setInUse(true);
 
         ctx->dispatcher().glUseProgram(globalProgramName);
@@ -2104,12 +2109,12 @@
 
 GL_APICALL void  GL_APIENTRY glValidateProgram(GLuint program){
     GET_CTX();
-    if(ctx->shareGroup().Ptr()) {
+    if(ctx->shareGroup().get()) {
         const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
         SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
         ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program);
-        SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
-        ProgramData* programData = (ProgramData*)objData.Ptr();
+        SET_ERROR_IF(objData.get()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
+        ProgramData* programData = (ProgramData*)objData.get();
         ctx->dispatcher().glValidateProgram(globalProgramName);
 
         GLsizei infoLogLength=0;
@@ -2199,7 +2204,7 @@
         // 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 (ctx->shareGroup().Ptr()) {
+        if (ctx->shareGroup().get()) {
             ObjectLocalName tex = TextureLocalName(target,ctx->getBindedTexture(target));
             unsigned int oldGlobal = ctx->shareGroup()->getGlobalName(TEXTURE, tex);
             // Delete old texture object but only if it is not a target of a EGLImage
@@ -2232,14 +2237,14 @@
     unsigned int imagehndl = SafeUIntFromPointer(image);
     EglImage *img = s_eglIface->eglAttachEGLImage(imagehndl);
     SET_ERROR_IF(!img,GL_INVALID_VALUE);
-    SET_ERROR_IF(!ctx->shareGroup().Ptr(),GL_INVALID_OPERATION);
+    SET_ERROR_IF(!ctx->shareGroup().get(),GL_INVALID_OPERATION);
 
     // Get current bounded renderbuffer
     // raise INVALID_OPERATIOn if no renderbuffer is bounded
     GLuint rb = ctx->getRenderbufferBinding();
     SET_ERROR_IF(rb == 0,GL_INVALID_OPERATION);
     ObjectDataPtr objData = ctx->shareGroup()->getObjectData(RENDERBUFFER,rb);
-    RenderbufferData *rbData = (RenderbufferData *)objData.Ptr();
+    RenderbufferData *rbData = (RenderbufferData *)objData.get();
     SET_ERROR_IF(!rbData,GL_INVALID_OPERATION);
 
     //
diff --git a/distrib/android-emugl/host/libs/Translator/GLcommon/FramebufferData.cpp b/distrib/android-emugl/host/libs/Translator/GLcommon/FramebufferData.cpp
index 2e35c8d..1fd55e0 100644
--- a/distrib/android-emugl/host/libs/Translator/GLcommon/FramebufferData.cpp
+++ b/distrib/android-emugl/host/libs/Translator/GLcommon/FramebufferData.cpp
@@ -58,7 +58,7 @@
     }
     if (m_attachPoints[idx].target != target ||
         m_attachPoints[idx].name != name ||
-        m_attachPoints[idx].obj.Ptr() != obj.Ptr() ||
+        m_attachPoints[idx].obj.get() != obj.get() ||
         m_attachPoints[idx].owned != takeOwnership) {
 
         detachObject(idx); 
@@ -68,8 +68,8 @@
         m_attachPoints[idx].obj = obj;
         m_attachPoints[idx].owned = takeOwnership;
 
-        if (target == GL_RENDERBUFFER_OES && obj.Ptr() != NULL) {
-            RenderbufferData *rbData = (RenderbufferData *)obj.Ptr();
+        if (target == GL_RENDERBUFFER_OES && obj.get() != NULL) {
+            RenderbufferData *rbData = (RenderbufferData *)obj.get();
             rbData->attachedFB = m_fbName;
             rbData->attachedPoint = attachment;
         }
@@ -102,8 +102,8 @@
 }
 
 void FramebufferData::detachObject(int idx) {
-    if (m_attachPoints[idx].target == GL_RENDERBUFFER_OES && m_attachPoints[idx].obj.Ptr() != NULL) {
-        RenderbufferData *rbData = (RenderbufferData *)m_attachPoints[idx].obj.Ptr();
+    if (m_attachPoints[idx].target == GL_RENDERBUFFER_OES && m_attachPoints[idx].obj.get() != NULL) {
+        RenderbufferData *rbData = (RenderbufferData *)m_attachPoints[idx].obj.get();
         rbData->attachedFB = 0;
         rbData->attachedPoint = 0;
     }
diff --git a/distrib/android-emugl/host/libs/Translator/GLcommon/GLEScontext.cpp b/distrib/android-emugl/host/libs/Translator/GLcommon/GLEScontext.cpp
index 9146805..8a50e87 100644
--- a/distrib/android-emugl/host/libs/Translator/GLcommon/GLEScontext.cpp
+++ b/distrib/android-emugl/host/libs/Translator/GLcommon/GLEScontext.cpp
@@ -246,7 +246,7 @@
     GLuint bufferName = m_arrayBuffer;
     if(bufferName) {
         unsigned int offset = SafeUIntFromPointer(data);
-        GLESbuffer* vbo = static_cast<GLESbuffer*>(m_shareGroup->getObjectData(VERTEXBUFFER,bufferName).Ptr());
+        GLESbuffer* vbo = static_cast<GLESbuffer*>(m_shareGroup->getObjectData(VERTEXBUFFER,bufferName).get());
         m_map[arrType]->setBuffer(size,type,stride,vbo,bufferName,offset,normalize);
         return  static_cast<const unsigned char*>(vbo->getData()) +  offset;
     }
@@ -494,26 +494,26 @@
     GLuint bufferName = getBuffer(target);
     if(!bufferName) return NULL;
 
-    GLESbuffer* vbo = static_cast<GLESbuffer*>(m_shareGroup->getObjectData(VERTEXBUFFER,bufferName).Ptr());
+    GLESbuffer* vbo = static_cast<GLESbuffer*>(m_shareGroup->getObjectData(VERTEXBUFFER,bufferName).get());
     return vbo->getData();
 }
 
 void GLEScontext::getBufferSize(GLenum target,GLint* param) {
     GLuint bufferName = getBuffer(target);
-    GLESbuffer* vbo = static_cast<GLESbuffer*>(m_shareGroup->getObjectData(VERTEXBUFFER,bufferName).Ptr());
+    GLESbuffer* vbo = static_cast<GLESbuffer*>(m_shareGroup->getObjectData(VERTEXBUFFER,bufferName).get());
     *param = vbo->getSize();
 }
 
 void GLEScontext::getBufferUsage(GLenum target,GLint* param) {
     GLuint bufferName = getBuffer(target);
-    GLESbuffer* vbo = static_cast<GLESbuffer*>(m_shareGroup->getObjectData(VERTEXBUFFER,bufferName).Ptr());
+    GLESbuffer* vbo = static_cast<GLESbuffer*>(m_shareGroup->getObjectData(VERTEXBUFFER,bufferName).get());
     *param = vbo->getUsage();
 }
 
 bool GLEScontext::setBufferData(GLenum target,GLsizeiptr size,const GLvoid* data,GLenum usage) {
     GLuint bufferName = getBuffer(target);
     if(!bufferName) return false;
-    GLESbuffer* vbo = static_cast<GLESbuffer*>(m_shareGroup->getObjectData(VERTEXBUFFER,bufferName).Ptr());
+    GLESbuffer* vbo = static_cast<GLESbuffer*>(m_shareGroup->getObjectData(VERTEXBUFFER,bufferName).get());
     return vbo->setBuffer(size,usage,data);
 }
 
@@ -521,7 +521,7 @@
 
     GLuint bufferName = getBuffer(target);
     if(!bufferName) return false;
-    GLESbuffer* vbo = static_cast<GLESbuffer*>(m_shareGroup->getObjectData(VERTEXBUFFER,bufferName).Ptr());
+    GLESbuffer* vbo = static_cast<GLESbuffer*>(m_shareGroup->getObjectData(VERTEXBUFFER,bufferName).get());
     return vbo->setSubBuffer(offset,size,data);
 }
 
@@ -834,10 +834,10 @@
         return;
 
     ObjectDataPtr fbObj = m_shareGroup->getObjectData(FRAMEBUFFER,m_framebuffer);
-    if (fbObj.Ptr() == NULL)
+    if (fbObj.get() == NULL)
         return;
 
-    FramebufferData *fbData = (FramebufferData *)fbObj.Ptr();
+    FramebufferData *fbData = (FramebufferData *)fbObj.get();
 
     fbData->validate(this);
 }
diff --git a/distrib/android-emugl/host/libs/Translator/include/GLcommon/objectNameManager.h b/distrib/android-emugl/host/libs/Translator/include/GLcommon/objectNameManager.h
index 4d4d038..d3ce2c7 100644
--- a/distrib/android-emugl/host/libs/Translator/include/GLcommon/objectNameManager.h
+++ b/distrib/android-emugl/host/libs/Translator/include/GLcommon/objectNameManager.h
@@ -143,9 +143,8 @@
 class ShareGroup
 {
     friend class ObjectNameManager;
-    friend class emugl::SmartPtr<ShareGroup>;  // to allow destructing when ShareGroupPtr refcount reaches zero
-
 public:
+    ~ShareGroup();
 
     //
     // genName - generates new object name and returns its name value.
@@ -201,7 +200,6 @@
 
 private:
     explicit ShareGroup(GlobalNameSpace *globalNameSpace);
-    ~ShareGroup();
 
 private:
     emugl::Mutex m_lock;
diff --git a/distrib/android-emugl/host/libs/libOpenglRender/ColorBuffer.cpp b/distrib/android-emugl/host/libs/libOpenglRender/ColorBuffer.cpp
index 74218f6..3feda65 100644
--- a/distrib/android-emugl/host/libs/libOpenglRender/ColorBuffer.cpp
+++ b/distrib/android-emugl/host/libs/libOpenglRender/ColorBuffer.cpp
@@ -265,7 +265,7 @@
 bool ColorBuffer::blitFromCurrentReadBuffer()
 {
     RenderThreadInfo *tInfo = RenderThreadInfo::get();
-    if (!tInfo->currContext.Ptr()) {
+    if (!tInfo->currContext.get()) {
         // no Current context
         return false;
     }
@@ -325,7 +325,7 @@
         return false;
     }
     RenderThreadInfo *tInfo = RenderThreadInfo::get();
-    if (!tInfo->currContext.Ptr()) {
+    if (!tInfo->currContext.get()) {
         return false;
     }
     if (tInfo->currContext->isGL2()) {
@@ -342,7 +342,7 @@
         return false;
     }
     RenderThreadInfo *tInfo = RenderThreadInfo::get();
-    if (!tInfo->currContext.Ptr()) {
+    if (!tInfo->currContext.get()) {
         return false;
     }
     if (tInfo->currContext->isGL2()) {
diff --git a/distrib/android-emugl/host/libs/libOpenglRender/FrameBuffer.cpp b/distrib/android-emugl/host/libs/libOpenglRender/FrameBuffer.cpp
index faa220a..b39c7f3 100644
--- a/distrib/android-emugl/host/libs/libOpenglRender/FrameBuffer.cpp
+++ b/distrib/android-emugl/host/libs/libOpenglRender/FrameBuffer.cpp
@@ -632,7 +632,7 @@
             p_internalFormat,
             getCaps().has_eglimage_texture_2d,
             m_colorBufferHelper));
-    if (cb.Ptr() != NULL) {
+    if (cb.get() != NULL) {
         ret = genHandle();
         m_colorbuffers[ret].cb = cb;
         m_colorbuffers[ret].refcount = 1;
@@ -660,11 +660,11 @@
         share = (*s).second;
     }
     EGLContext sharedContext =
-            share.Ptr() ? share->getEGLContext() : EGL_NO_CONTEXT;
+            share.get() ? share->getEGLContext() : EGL_NO_CONTEXT;
 
     RenderContextPtr rctx(RenderContext::create(
         m_eglDisplay, config->getEglConfig(), sharedContext, p_isGL2));
-    if (rctx.Ptr() != NULL) {
+    if (rctx.get() != NULL) {
         ret = genHandle();
         m_contexts[ret] = rctx;
         RenderThreadInfo *tinfo = RenderThreadInfo::get();
@@ -686,7 +686,7 @@
 
     WindowSurfacePtr win(WindowSurface::create(
             getDisplay(), config->getEglConfig(), p_width, p_height));
-    if (win.Ptr() != NULL) {
+    if (win.get() != NULL) {
         ret = genHandle();
         m_windows[ret] = std::pair<WindowSurfacePtr, HandleType>(win,0);
         RenderThreadInfo *tinfo = RenderThreadInfo::get();
@@ -791,7 +791,7 @@
         return false;
     }
 
-    WindowSurface* surface = (*w).second.first.Ptr();
+    WindowSurface* surface = (*w).second.first.get();
     surface->flushColorBuffer();
 
     return true;
@@ -932,7 +932,7 @@
     //
     RenderThreadInfo *tinfo = RenderThreadInfo::get();
     WindowSurfacePtr bindDraw, bindRead;
-    if (draw.Ptr() == NULL && read.Ptr() == NULL) {
+    if (draw.get() == NULL && read.get() == NULL) {
         // Unbind the current read and draw surfaces from the context
         bindDraw = tinfo->currDrawSurf;
         bindRead = tinfo->currReadSurf;
@@ -941,8 +941,8 @@
         bindRead = read;
     }
 
-    if (bindDraw.Ptr() != NULL && bindRead.Ptr() != NULL) {
-        if (bindDraw.Ptr() != bindRead.Ptr()) {
+    if (bindDraw.get() != NULL && bindRead.get() != NULL) {
+        if (bindDraw.get() != bindRead.get()) {
             bindDraw->bind(ctx, WindowSurface::BIND_DRAW);
             bindRead->bind(ctx, WindowSurface::BIND_READ);
         }
diff --git a/distrib/android-emugl/host/libs/libOpenglRender/RenderControl.cpp b/distrib/android-emugl/host/libs/libOpenglRender/RenderControl.cpp
index 8bb0456..a75d9df 100644
--- a/distrib/android-emugl/host/libs/libOpenglRender/RenderControl.cpp
+++ b/distrib/android-emugl/host/libs/libOpenglRender/RenderControl.cpp
@@ -68,7 +68,7 @@
     RenderThreadInfo *tInfo = RenderThreadInfo::get();
     const char *str = NULL;
     int len = 0;
-    if (tInfo && tInfo->currContext.Ptr()) {
+    if (tInfo && tInfo->currContext.get()) {
         if (tInfo->currContext->isGL2()) {
             str = (const char *)s_gles2.glGetString(name);
         }
diff --git a/distrib/android-emugl/host/libs/libOpenglRender/WindowSurface.cpp b/distrib/android-emugl/host/libs/libOpenglRender/WindowSurface.cpp
index 32b72f1..bad6982 100644
--- a/distrib/android-emugl/host/libs/libOpenglRender/WindowSurface.cpp
+++ b/distrib/android-emugl/host/libs/libOpenglRender/WindowSurface.cpp
@@ -87,7 +87,7 @@
 }
 
 bool WindowSurface::flushColorBuffer() {
-    if (!mAttachedColorBuffer.Ptr()) {
+    if (!mAttachedColorBuffer.get()) {
         return true;
     }
     if (!mWidth || !mHeight) {
@@ -101,7 +101,7 @@
         return false;
     }
 
-    if (!mDrawContext.Ptr()) {
+    if (!mDrawContext.get()) {
         fprintf(stderr, "Draw context is NULL\n");
         return false;
     }
diff --git a/distrib/android-emugl/shared/emugl/common/Android.mk b/distrib/android-emugl/shared/emugl/common/Android.mk
index 590efe1..c454036 100644
--- a/distrib/android-emugl/shared/emugl/common/Android.mk
+++ b/distrib/android-emugl/shared/emugl/common/Android.mk
@@ -8,30 +8,17 @@
 commonSources := \
         crash_reporter.cpp \
         id_to_object_map.cpp \
-        lazy_instance.cpp \
         logging.cpp \
-        message_channel.cpp \
-        pod_vector.cpp \
         shared_library.cpp \
-        smart_ptr.cpp \
         stringparsing.cpp \
         sockets.cpp \
-        thread_store.cpp \
 
 host_commonSources := $(commonSources)
 
 host_commonLdLibs := $(CXX_STD_LIB)
 
 ifneq (windows,$(BUILD_TARGET_OS))
-    host_commonSources += \
-        thread_pthread.cpp \
-
     host_commonLdLibs += -ldl -lpthread
-else
-    host_commonSources += \
-        condition_variable_win32.cpp \
-        thread_win32.cpp \
-
 endif
 
 $(call emugl-begin-static-library,libemugl_common)
@@ -43,16 +30,8 @@
 ### emugl_common_unittests ##############################################
 
 host_commonSources := \
-    condition_variable_unittest.cpp \
     id_to_object_map_unittest.cpp \
-    lazy_instance_unittest.cpp \
-    pod_vector_unittest.cpp \
-    message_channel_unittest.cpp \
-    mutex_unittest.cpp \
     shared_library_unittest.cpp \
-    smart_ptr_unittest.cpp \
-    thread_store_unittest.cpp \
-    thread_unittest.cpp \
     unique_integer_map_unittest.cpp \
     stringparsing_unittest.cpp
 
diff --git a/distrib/android-emugl/shared/emugl/common/lazy_instance_unittest.cpp b/distrib/android-emugl/shared/emugl/common/lazy_instance_unittest.cpp
index 824845f..f9bf71c 100644
--- a/distrib/android-emugl/shared/emugl/common/lazy_instance_unittest.cpp
+++ b/distrib/android-emugl/shared/emugl/common/lazy_instance_unittest.cpp
@@ -62,18 +62,18 @@
     LazyInstance<Foo> foo_instance = LAZY_INSTANCE_INIT;
     EXPECT_FALSE(foo_instance.hasInstance());
     EXPECT_FALSE(foo_instance.hasInstance());
-    foo_instance.ptr();
+    foo_instance.get();
     EXPECT_TRUE(foo_instance.hasInstance());
 }
 
 TEST(LazyInstance, Simple) {
     LazyInstance<Foo> foo_instance = LAZY_INSTANCE_INIT;
-    Foo* foo1 = foo_instance.ptr();
+    Foo* foo1 = foo_instance.get();
     EXPECT_TRUE(foo1);
     EXPECT_EQ(42, foo_instance->get());
     foo1->set(10);
     EXPECT_EQ(10, foo_instance->get());
-    EXPECT_EQ(foo1, foo_instance.ptr());
+    EXPECT_EQ(foo1, foo_instance.get());
 }
 
 // For the following test, launch 1000 threads that each try to get
@@ -133,7 +133,7 @@
     EXPECT_EQ(1, counter_instance->getValue());
 
     // Now compare all the store values, they should be the same.
-    StaticCounter* expectedValue = counter_instance.ptr();
+    StaticCounter* expectedValue = counter_instance.get();
     for (size_t n = 0; n < kNumThreads; ++n) {
         EXPECT_EQ(expectedValue, state.mValues[n]) << "For thread " << n;
     }
diff --git a/distrib/android-emugl/shared/emugl/common/logging.h b/distrib/android-emugl/shared/emugl/common/logging.h
index 8a6b413..27e9a53 100644
--- a/distrib/android-emugl/shared/emugl/common/logging.h
+++ b/distrib/android-emugl/shared/emugl/common/logging.h
@@ -14,6 +14,8 @@
 * limitations under the License.
 */
 
+#pragma once
+
 typedef void (*logger_t)(const char* fmt, ...);
 extern logger_t emugl_logger;
 extern logger_t emugl_cxt_logger;
diff --git a/distrib/android-emugl/shared/emugl/common/smart_ptr.h b/distrib/android-emugl/shared/emugl/common/smart_ptr.h
index 73efdd6..5de90a7 100644
--- a/distrib/android-emugl/shared/emugl/common/smart_ptr.h
+++ b/distrib/android-emugl/shared/emugl/common/smart_ptr.h
@@ -11,140 +11,13 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-#ifndef EMUGL_SMART_PTR_H
-#define EMUGL_SMART_PTR_H
+#pragma once
 
-#include <stddef.h>
+#include <memory>
 
 namespace emugl {
 
-// Hidden atomic ref-counting implementation.
-class RefCount;
-
-// Base class for all templated SmartPtr<> instances. Reduces
-// template expansion and code. Consider this to be an implementation
-// detail of SmartPtr<>, so don't rely on anything here.
-class SmartPtrBase {
-public:
-    // Defrault constructor.
-    SmartPtrBase() : mPtr(NULL), mRefCount(NULL) {}
-
-    // Normal constructor. This takes ownership of |ptr|, though only
-    // template instances are capable of destroying the object.
-    explicit SmartPtrBase(void* ptr);
-
-    // Copy-constructor, this increments the reference count.
-    SmartPtrBase(const SmartPtrBase& other);
-
-    // Assignment operator, also increments the reference count.
-    SmartPtrBase& operator=(const SmartPtrBase& other);
-
-    // Nothing happens in this destructor, the real work must be performed
-    // in subclasses.
-    ~SmartPtrBase() {}
-
-
-    // Used to enable 'if (smart_ptr) { ... }' properly.
-    operator void*() const {
-        return mPtr;
-    }
-
-    // Return internal reference count value, only use for unit testing.
-    int getRefCount() const;
-
-protected:
-    // Used internally to increment the reference count.
-    void addRef();
-
-    // Copy the |other| into this instance, returns the old pointer value
-    // if it needs to be destroyed by the caller, or NULL otherwise.
-    void* copyFrom(const SmartPtrBase& other);
-
-    // Used internally to decrement the reference count, if it reaches 0,
-    // returns the pointer to be destroyed, NULL otherwise.
-    void* release();
-
-    void* mPtr;
-    RefCount* mRefCount;
-};
-
-
-// The real template class to be used for smart pointers.
-// Typical uses:
-//
-//     SmartPtr<Foo>  ptr(new Foo());   // takes ownership.
-//     SmartPtr<Foo>  ptr2;             // empty pointer.
-//     ptr2 = ptr;                      // copies pointer + increment reference count.
-//     Foo* obj = ptr.Ptr();            // access pointed object.
-//     ptr->DoStuff();                  // operate directly on pointed object.
-//     (*ptr)->DoStuff();               // same here.
-//
-// On scope exit, the internal reference count is decremented and the
-// object is deleted automatically when it reaches 0, indicating that
-// there are no more owners.
-//
-// IMPORTANT: You need to be sure that only one 'chain' of smart pointers
-// own a given object. I.e. the following is incorrect:
-//
-//     Foo* foo = new Foo();      // create new instance.
-//     SmartPtr<Foo>  ptr(foo);   // |ptr| takes ownership of |foo|.
-//     SmartPtr<Foo>  ptr2(foo);  // |ptr2| takes also ownership of |foo|.
-//
-// The problem is that |ptr| and |ptr2| don't know anything about each
-// other, and will not share the same reference count. Once a smart pointer
-// owns an object, only use other smart pointers that are copy-constructed
-// or assigned with the initial one to keep everything consistent.
 template <class T>
-class SmartPtr : public emugl::SmartPtrBase {
-public:
-    // Default constructor. The instance holds a NULL pointer.
-    SmartPtr() : SmartPtrBase() {}
-
-    // Regular constructor, takes ownership of |ptr|.
-    explicit SmartPtr(T* ptr) : SmartPtrBase(ptr) {}
-
-    // Copy-constructor, |this| and |other| will share the same internal
-    // reference count, which is incremented by 1.
-    SmartPtr(const SmartPtr& other)
-            : SmartPtrBase(reinterpret_cast<const SmartPtrBase&>(other)) {}
-
-    // Assignment operator, same semantics as copy-constructor.
-    SmartPtr& operator=(const SmartPtr& other) {
-      void* old_ptr = copyFrom(static_cast<const SmartPtrBase&>(other));
-      if (old_ptr)
-        delete reinterpret_cast<T*>(old_ptr);
-      return *this;
-    }
-
-    // Destructor, decrements reference count and destroys the object
-    // if it reaches 0 (indicating this was the last owning smart pointer).
-    ~SmartPtr() {
-        void* ptr = release();
-        if (ptr)
-          delete reinterpret_cast<T*>(ptr);
-    }
-
-    // Return owned object instance, or NULL.
-    T* Ptr() const {
-        return reinterpret_cast<T*>(mPtr);
-    }
-
-    // Return owned object instance, or NULL
-    const T* constPtr() const {
-        return reinterpret_cast<const T*>(mPtr);
-    }
-
-    // Operate directly on owned object.
-    T* operator->() const {
-        return Ptr();
-    }
-
-    // Return reference to owned object.
-    T& operator*() const {
-        return *Ptr();
-    }
-};
+using SmartPtr = std::shared_ptr<T>;
 
 }  // namespace emugl
-
-#endif // EMUGL_SMART_PTR_H
diff --git a/distrib/android-emugl/shared/emugl/common/smart_ptr_unittest.cpp b/distrib/android-emugl/shared/emugl/common/smart_ptr_unittest.cpp
index db9e5f2..715e471 100644
--- a/distrib/android-emugl/shared/emugl/common/smart_ptr_unittest.cpp
+++ b/distrib/android-emugl/shared/emugl/common/smart_ptr_unittest.cpp
@@ -62,7 +62,7 @@
 
 TEST_F(SmartPtrTest, Empty) {
     SmartPtr<MyClass> ptr;
-    EXPECT_FALSE(ptr.Ptr());
+    EXPECT_FALSE(ptr.get());
 
     EXPECT_EQ(0, mNewCount);
     EXPECT_EQ(0, mDeleteCount);
@@ -76,7 +76,7 @@
 
     {
         SmartPtr<MyClass> ptr(obj);
-        EXPECT_EQ(obj, ptr.Ptr());
+        EXPECT_EQ(obj, ptr.get());
 
         EXPECT_EQ(1, mNewCount);
         EXPECT_EQ(0, mDeleteCount);
@@ -95,8 +95,8 @@
         SmartPtr<MyClass> ptr1(obj);
         {
             SmartPtr<MyClass> ptr2(ptr1);
-            EXPECT_EQ(2, ptr1.getRefCount());
-            EXPECT_EQ(2, ptr2.getRefCount());
+            EXPECT_EQ(2, ptr1.use_count());
+            EXPECT_EQ(2, ptr2.use_count());
             EXPECT_EQ(1, mNewCount);
             EXPECT_EQ(0, mDeleteCount);
             EXPECT_EQ(0, mDoCount);
@@ -122,9 +122,9 @@
     EXPECT_EQ(2, mNewCount);
     EXPECT_EQ(1, mDeleteCount);
 
-    EXPECT_EQ(ptr1.Ptr(), ptr2.Ptr());
-    EXPECT_EQ(2, ptr1.getRefCount());
-    EXPECT_EQ(2, ptr2.getRefCount());
+    EXPECT_EQ(ptr1.get(), ptr2.get());
+    EXPECT_EQ(2, ptr1.use_count());
+    EXPECT_EQ(2, ptr2.use_count());
 }
 
 
diff --git a/distrib/android-emugl/shared/emugl/common/thread_store.cpp b/distrib/android-emugl/shared/emugl/common/thread_store.cpp
index ea64c6f..ecb4d0c 100644
--- a/distrib/android-emugl/shared/emugl/common/thread_store.cpp
+++ b/distrib/android-emugl/shared/emugl/common/thread_store.cpp
@@ -198,7 +198,7 @@
 
 ThreadStore::~ThreadStore() {
     D("Entering this=%p\n", this);
-    GlobalState* state = gGlobalState.ptr();
+    GlobalState* state = gGlobalState.get();
     state->unregisterKey(mKey);
     D("Exiting this=%p\n", this);
 }