diff options
Diffstat (limited to 'dom/canvas/HostWebGLContext.cpp')
-rw-r--r-- | dom/canvas/HostWebGLContext.cpp | 231 |
1 files changed, 231 insertions, 0 deletions
diff --git a/dom/canvas/HostWebGLContext.cpp b/dom/canvas/HostWebGLContext.cpp new file mode 100644 index 0000000000..36029e33ed --- /dev/null +++ b/dom/canvas/HostWebGLContext.cpp @@ -0,0 +1,231 @@ +/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "HostWebGLContext.h" + +#include "CompositableHost.h" +#include "mozilla/layers/LayersSurfaces.h" + +#include "MozFramebuffer.h" +#include "TexUnpackBlob.h" +#include "WebGL2Context.h" +#include "WebGLBuffer.h" +#include "WebGLContext.h" +#include "WebGLFramebuffer.h" +#include "WebGLMemoryTracker.h" +#include "WebGLParent.h" +#include "WebGLProgram.h" +#include "WebGLRenderbuffer.h" +#include "WebGLSampler.h" +#include "WebGLShader.h" +#include "WebGLSync.h" +#include "WebGLTexture.h" +#include "WebGLTransformFeedback.h" +#include "WebGLVertexArray.h" +#include "WebGLQuery.h" + +#include "mozilla/StaticMutex.h" + +namespace mozilla { + +// - + +static StaticMutex sContextSetLock MOZ_UNANNOTATED; + +static std::unordered_set<HostWebGLContext*>& DeferredStaticContextSet() { + static std::unordered_set<HostWebGLContext*> sContextSet; + return sContextSet; +} + +LockedOutstandingContexts::LockedOutstandingContexts() + : contexts(DeferredStaticContextSet()) { + sContextSetLock.Lock(); +} + +LockedOutstandingContexts::~LockedOutstandingContexts() { + sContextSetLock.Unlock(); +} + +// - + +/*static*/ +UniquePtr<HostWebGLContext> HostWebGLContext::Create( + const OwnerData& ownerData, const webgl::InitContextDesc& desc, + webgl::InitContextResult* const out) { + auto host = WrapUnique(new HostWebGLContext(ownerData)); + auto webgl = WebGLContext::Create(*host, desc, out); + if (!webgl) return nullptr; + return host; +} + +HostWebGLContext::HostWebGLContext(const OwnerData& ownerData) + : mOwnerData(ownerData) { + StaticMutexAutoLock lock(sContextSetLock); + auto& contexts = DeferredStaticContextSet(); + (void)contexts.insert(this); +} + +HostWebGLContext::~HostWebGLContext() { + StaticMutexAutoLock lock(sContextSetLock); + auto& contexts = DeferredStaticContextSet(); + (void)contexts.erase(this); +} + +// - + +void HostWebGLContext::OnContextLoss(const webgl::ContextLossReason reason) { + if (mOwnerData.inProcess) { + mOwnerData.inProcess->OnContextLoss(reason); + } else { + (void)mOwnerData.outOfProcess->SendOnContextLoss(reason); + } +} + +void HostWebGLContext::JsWarning(const std::string& text) const { + if (mOwnerData.inProcess) { + mOwnerData.inProcess->JsWarning(text); + return; + } + (void)mOwnerData.outOfProcess->SendJsWarning(text); +} + +Maybe<layers::SurfaceDescriptor> HostWebGLContext::GetFrontBuffer( + const ObjectId xrFb, const bool webvr) const { + return mContext->GetFrontBuffer(AutoResolve(xrFb), webvr); +} + +////////////////////////////////////////////// +// Creation + +void HostWebGLContext::CreateBuffer(const ObjectId id) { + auto& slot = mBufferMap[id]; + if (slot) { + MOZ_ASSERT(false, "duplicate ID"); + return; + } + slot = mContext->CreateBuffer(); +} + +void HostWebGLContext::CreateFramebuffer(const ObjectId id) { + auto& slot = mFramebufferMap[id]; + if (slot) { + MOZ_ASSERT(false, "duplicate ID"); + return; + } + slot = mContext->CreateFramebuffer(); +} + +bool HostWebGLContext::CreateOpaqueFramebuffer( + const ObjectId id, const webgl::OpaqueFramebufferOptions& options) { + auto& slot = mFramebufferMap[id]; + if (slot) { + MOZ_ASSERT(false, "duplicate ID"); + return false; + } + slot = mContext->CreateOpaqueFramebuffer(options); + return slot; +} + +void HostWebGLContext::CreateProgram(const ObjectId id) { + auto& slot = mProgramMap[id]; + if (slot) { + MOZ_ASSERT(false, "duplicate ID"); + return; + } + slot = mContext->CreateProgram(); +} + +void HostWebGLContext::CreateQuery(const ObjectId id) { + auto& slot = mQueryMap[id]; + if (slot) { + MOZ_ASSERT(false, "duplicate ID"); + return; + } + slot = mContext->CreateQuery(); +} + +void HostWebGLContext::CreateRenderbuffer(const ObjectId id) { + auto& slot = mRenderbufferMap[id]; + if (slot) { + MOZ_ASSERT(false, "duplicate ID"); + return; + } + slot = mContext->CreateRenderbuffer(); +} + +void HostWebGLContext::CreateSampler(const ObjectId id) { + auto& slot = mSamplerMap[id]; + if (slot) { + MOZ_ASSERT(false, "duplicate ID"); + return; + } + slot = GetWebGL2Context()->CreateSampler(); +} + +void HostWebGLContext::CreateShader(const ObjectId id, GLenum type) { + auto& slot = mShaderMap[id]; + if (slot) { + MOZ_ASSERT(false, "duplicate ID"); + return; + } + slot = mContext->CreateShader(type); +} + +void HostWebGLContext::CreateSync(const ObjectId id) { + auto& slot = mSyncMap[id]; + if (slot) { + MOZ_ASSERT(false, "duplicate ID"); + return; + } + slot = GetWebGL2Context()->FenceSync(LOCAL_GL_SYNC_GPU_COMMANDS_COMPLETE, 0); +} + +void HostWebGLContext::CreateTexture(const ObjectId id) { + auto& slot = mTextureMap[id]; + if (slot) { + MOZ_ASSERT(false, "duplicate ID"); + return; + } + slot = mContext->CreateTexture(); +} + +void HostWebGLContext::CreateTransformFeedback(const ObjectId id) { + auto& slot = mTransformFeedbackMap[id]; + if (slot) { + MOZ_ASSERT(false, "duplicate ID"); + return; + } + slot = GetWebGL2Context()->CreateTransformFeedback(); +} + +void HostWebGLContext::CreateVertexArray(const ObjectId id) { + auto& slot = mVertexArrayMap[id]; + if (slot) { + MOZ_ASSERT(false, "duplicate ID"); + return; + } + slot = mContext->CreateVertexArray(); +} + +//////////////////////// + +#define _(X) \ + void HostWebGLContext::Delete##X(const ObjectId id) { m##X##Map.erase(id); } + +_(Buffer) +_(Framebuffer) +_(Program) +_(Query) +_(Renderbuffer) +_(Sampler) +_(Shader) +_(Sync) +_(Texture) +_(TransformFeedback) +_(VertexArray) + +#undef _ + +} // namespace mozilla |