EGLBoolean result = s->cnx->egl.eglDestroySurface(dp->disp.dpy, s->surface);
if (result == EGL_TRUE) {
_s.terminate();
- dp->removeSurface(surface);
}
return result;
}
return false;
}
-void egl_display_t::addContext(egl_context_t* context) {
- Mutex::Autolock _l(lock);
- contexts.add(context);
-}
-
-void egl_display_t::removeContext(egl_context_t* context) {
- Mutex::Autolock _l(lock);
- contexts.remove(context);
-}
-
-void egl_display_t::removeSurface(EGLSurface surface) const {
- Mutex::Autolock _l(lock);
- for (size_t i = 0; i < contexts.size(); i++) {
- egl_context_t* context = contexts[i];
- if (context->read == surface) {
- SurfaceRef _r(get_surface(context->read));
- _r.release();
- }
- if (context->draw == surface) {
- SurfaceRef _d(get_surface(context->draw));
- _d.release();
- }
- }
-}
-
EGLDisplay egl_display_t::getFromNativeDisplay(EGLNativeDisplayType disp) {
if (uintptr_t(disp) >= NUM_DISPLAYS)
return NULL;
// add reference to this object. returns true if this is a valid object.
bool getObject(egl_object_t* object) const;
- // add context to this display's list
- void addContext(egl_context_t* context);
- // remove context from this display's list
- void removeContext(egl_context_t* context);
- // search for surface on all contexts and remove the references
- void removeSurface(EGLSurface surface) const;
-
// These notifications allow the display to keep track of how many window
// surfaces exist, which it uses to decide whether to hibernate the
// underlying EGL implementation. They can be called by any thread without
mutable Mutex lock, refLock;
mutable Condition refCond;
SortedVector<egl_object_t*> objects;
- SortedVector<egl_context_t*> contexts;
String8 mVendorString;
String8 mVersionString;
String8 mClientApiString;
egl_connection_t const* cnx, int version) :
egl_object_t(get_display_nowake(dpy)), dpy(dpy), context(context),
config(config), read(0), draw(0), cnx(cnx), version(version) {
- get_display_nowake(dpy)->addContext(this);
-}
-
-void egl_context_t::terminate() {
- display->removeContext(this);
- egl_object_t::terminate();
}
void egl_context_t::onLooseCurrent() {
class egl_display_t;
class egl_object_t {
+ egl_display_t *display;
mutable volatile int32_t count;
protected:
virtual ~egl_object_t();
- virtual void terminate();
- egl_display_t *display;
public:
egl_object_t(egl_display_t* display);
inline egl_display_t* getDisplay() const { return display; }
private:
+ void terminate();
static bool get(egl_display_t const* display, egl_object_t* object);
public:
class egl_context_t: public egl_object_t {
protected:
~egl_context_t() {}
- void terminate() override;
public:
typedef egl_object_t::LocalRef<egl_context_t, EGLContext> Ref;