blob: 9a7d941982bfac2ff0872371dace3303bbd70a1d [file] [log] [blame]
//
// Copyright 2023 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// ShareGroup.h: Defines the egl::ShareGroup class, representing the collection of contexts in a
// share group.
#include "libANGLE/ShareGroup.h"
#include <algorithm>
#include <iterator>
#include <EGL/eglext.h>
#include <platform/PlatformMethods.h>
#include "common/debug.h"
#include "common/platform_helpers.h"
#include "libANGLE/Context.h"
#include "libANGLE/capture/FrameCapture.h"
#include "libANGLE/renderer/DisplayImpl.h"
#include "libANGLE/renderer/ShareGroupImpl.h"
namespace egl
{
// ShareGroupState
ShareGroupState::ShareGroupState()
: mAnyContextWithRobustness(false), mAnyContextWithDisplayTextureShareGroup(false)
{}
ShareGroupState::~ShareGroupState() = default;
void ShareGroupState::addSharedContext(gl::Context *context)
{
mContexts.insert(std::pair(context->id().value, context));
if (context->isRobustnessEnabled())
{
mAnyContextWithRobustness = true;
}
if (context->getState().hasDisplayTextureShareGroup())
{
mAnyContextWithDisplayTextureShareGroup = true;
}
}
void ShareGroupState::removeSharedContext(gl::Context *context)
{
mContexts.erase(context->id().value);
}
// ShareGroup
ShareGroup::ShareGroup(rx::EGLImplFactory *factory)
: mRefCount(1),
mImplementation(factory->createShareGroup(mState)),
mFrameCaptureShared(new angle::FrameCaptureShared)
{}
ShareGroup::~ShareGroup()
{
SafeDelete(mImplementation);
}
void ShareGroup::addRef()
{
// This is protected by global lock, so no atomic is required
mRefCount++;
}
void ShareGroup::release(const Display *display)
{
if (--mRefCount == 0)
{
if (mImplementation)
{
mImplementation->onDestroy(display);
}
delete this;
}
}
void ShareGroup::finishAllContexts()
{
for (auto shareContext : mState.getContexts())
{
if (shareContext.second->hasBeenCurrent() && !shareContext.second->isDestroyed())
{
shareContext.second->finish();
}
}
}
void ShareGroup::addSharedContext(gl::Context *context)
{
mState.addSharedContext(context);
mImplementation->onContextAdd();
}
void ShareGroup::removeSharedContext(gl::Context *context)
{
mState.removeSharedContext(context);
}
} // namespace egl