EGLAPI EGLImageKHR EGLAPIENTRY eglCreateImageKHR(EGLDisplay display, EGLContext context, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list) { VALIDATE_DISPLAY(display); VALIDATE_CONTEXT(context); // We only support EGL_GL_TEXTURE_2D images if (target != EGL_GL_TEXTURE_2D_KHR) { RETURN_ERROR(EGL_NO_IMAGE_KHR,EGL_BAD_PARAMETER); } ThreadInfo* thread = getThreadInfo(); ShareGroupPtr sg = thread->shareGroup; if (sg.Ptr() != NULL) { unsigned int globalTexName = sg->getGlobalName(TEXTURE, SafeUIntFromPointer(buffer)); if (!globalTexName) return EGL_NO_IMAGE_KHR; ImagePtr img( new EglImage() ); if (img.Ptr() != NULL) { ObjectDataPtr objData = sg->getObjectData(TEXTURE, SafeUIntFromPointer(buffer)); if (!objData.Ptr()) return EGL_NO_IMAGE_KHR; TextureData *texData = (TextureData *)objData.Ptr(); if(!texData->width || !texData->height) return EGL_NO_IMAGE_KHR; img->width = texData->width; img->height = texData->height; img->border = texData->border; img->internalFormat = texData->internalFormat; img->globalTexName = globalTexName; return dpy->addImageKHR(img); } } return EGL_NO_IMAGE_KHR; }
ImagePtr EglDisplay::getImage(EGLImageKHR img) const { emugl::Mutex::AutoLock mutex(m_lock); /* img is "key" in map<unsigned int, ImagePtr>. */ unsigned int hndl = SafeUIntFromPointer(img); ImagesHndlMap::const_iterator i( m_eglImages.find(hndl) ); return (i != m_eglImages.end()) ? (*i).second :ImagePtr(NULL); }
ContextPtr EglDisplay::getContext(EGLContext ctx) const { emugl::Mutex::AutoLock mutex(m_lock); /* ctx is "key" in map<unsigned int, ContextPtr>. */ unsigned int hndl = SafeUIntFromPointer(ctx); ContextsHndlMap::const_iterator it = m_contexts.find(hndl); return it != m_contexts.end() ? (*it).second : ContextPtr(NULL); }
SurfacePtr EglDisplay::getSurface(EGLSurface surface) const { emugl::Mutex::AutoLock mutex(m_lock); /* surface is "key" in map<unsigned int, SurfacePtr>. */ unsigned int hndl = SafeUIntFromPointer(surface); SurfacesHndlMap::const_iterator it = m_surfaces.find(hndl); return it != m_surfaces.end() ? (*it).second : SurfacePtr(NULL); }
const GLvoid* GLEScontext::setPointer(GLenum arrType,GLint size,GLenum type,GLsizei stride,const GLvoid* data,bool normalize) { GLuint bufferName = m_arrayBuffer; if(bufferName) { unsigned int offset = SafeUIntFromPointer(data); GLESbuffer* vbo = static_cast<GLESbuffer*>(m_shareGroup->getObjectData(VERTEXBUFFER,bufferName).Ptr()); m_map[arrType]->setBuffer(size,type,stride,vbo,bufferName,offset,normalize); return static_cast<const unsigned char*>(vbo->getData()) + offset; } m_map[arrType]->setArray(size,type,stride,data,normalize); return data; }
bool EglDisplay::removeContext(EGLContext ctx) { emugl::Mutex::AutoLock mutex(m_lock); /* ctx is "key" in map<unsigned int, ContextPtr>. */ unsigned int hndl = SafeUIntFromPointer(ctx); ContextsHndlMap::iterator it = m_contexts.find(hndl); if(it != m_contexts.end()) { m_contexts.erase(it); return true; } return false; }
bool EglDisplay::removeSurface(EGLSurface s) { emugl::Mutex::AutoLock mutex(m_lock); /* s is "key" in map<unsigned int, SurfacePtr>. */ unsigned int hndl = SafeUIntFromPointer(s); SurfacesHndlMap::iterator it = m_surfaces.find(hndl); if(it != m_surfaces.end()) { m_surfaces.erase(it); return true; } return false; }
bool EglDisplay:: destroyImageKHR(EGLImageKHR img) { emugl::Mutex::AutoLock mutex(m_lock); /* img is "key" in map<unsigned int, ImagePtr>. */ unsigned int hndl = SafeUIntFromPointer(img); ImagesHndlMap::iterator i( m_eglImages.find(hndl) ); if (i != m_eglImages.end()) { m_eglImages.erase(i); return true; } return false; }