michael@0: /* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*- michael@0: * This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #include "GLContext.h" // for GLContext, etc michael@0: #include "SurfaceStream.h" michael@0: #include "mozilla/Assertions.h" // for MOZ_ASSERT, etc michael@0: #include "mozilla/layers/ISurfaceAllocator.h" michael@0: #include "mozilla/layers/TextureClientOGL.h" michael@0: #include "nsSize.h" // for nsIntSize michael@0: michael@0: using namespace mozilla::gl; michael@0: michael@0: namespace mozilla { michael@0: namespace layers { michael@0: michael@0: class CompositableForwarder; michael@0: michael@0: SharedTextureClientOGL::SharedTextureClientOGL(TextureFlags aFlags) michael@0: : TextureClient(aFlags) michael@0: , mHandle(0) michael@0: , mInverted(false) michael@0: { michael@0: // SharedTextureClient is always owned externally. michael@0: mFlags |= TEXTURE_DEALLOCATE_CLIENT; michael@0: } michael@0: michael@0: SharedTextureClientOGL::~SharedTextureClientOGL() michael@0: { michael@0: // the shared data is owned externally. michael@0: } michael@0: michael@0: michael@0: bool michael@0: SharedTextureClientOGL::ToSurfaceDescriptor(SurfaceDescriptor& aOutDescriptor) michael@0: { michael@0: MOZ_ASSERT(IsValid()); michael@0: if (!IsAllocated()) { michael@0: return false; michael@0: } michael@0: aOutDescriptor = SharedTextureDescriptor(mShareType, mHandle, mSize, mInverted); michael@0: return true; michael@0: } michael@0: michael@0: void michael@0: SharedTextureClientOGL::InitWith(gl::SharedTextureHandle aHandle, michael@0: gfx::IntSize aSize, michael@0: gl::SharedTextureShareType aShareType, michael@0: bool aInverted) michael@0: { michael@0: MOZ_ASSERT(IsValid()); michael@0: MOZ_ASSERT(!IsAllocated()); michael@0: mHandle = aHandle; michael@0: mSize = aSize; michael@0: mShareType = aShareType; michael@0: mInverted = aInverted; michael@0: if (mInverted) { michael@0: AddFlags(TEXTURE_NEEDS_Y_FLIP); michael@0: } michael@0: } michael@0: michael@0: bool michael@0: SharedTextureClientOGL::Lock(OpenMode mode) michael@0: { michael@0: MOZ_ASSERT(!mIsLocked); michael@0: if (!IsValid() || !IsAllocated()) { michael@0: return false; michael@0: } michael@0: mIsLocked = true; michael@0: return true; michael@0: } michael@0: michael@0: void michael@0: SharedTextureClientOGL::Unlock() michael@0: { michael@0: MOZ_ASSERT(mIsLocked); michael@0: mIsLocked = false; michael@0: } michael@0: michael@0: bool michael@0: SharedTextureClientOGL::IsAllocated() const michael@0: { michael@0: return mHandle != 0; michael@0: } michael@0: michael@0: StreamTextureClientOGL::StreamTextureClientOGL(TextureFlags aFlags) michael@0: : TextureClient(aFlags) michael@0: , mIsLocked(false) michael@0: { michael@0: } michael@0: michael@0: StreamTextureClientOGL::~StreamTextureClientOGL() michael@0: { michael@0: // the data is owned externally. michael@0: } michael@0: michael@0: bool michael@0: StreamTextureClientOGL::Lock(OpenMode mode) michael@0: { michael@0: MOZ_ASSERT(!mIsLocked); michael@0: if (!IsValid() || !IsAllocated()) { michael@0: return false; michael@0: } michael@0: mIsLocked = true; michael@0: return true; michael@0: } michael@0: michael@0: void michael@0: StreamTextureClientOGL::Unlock() michael@0: { michael@0: MOZ_ASSERT(mIsLocked); michael@0: mIsLocked = false; michael@0: } michael@0: michael@0: bool michael@0: StreamTextureClientOGL::ToSurfaceDescriptor(SurfaceDescriptor& aOutDescriptor) michael@0: { michael@0: if (!IsAllocated()) { michael@0: return false; michael@0: } michael@0: michael@0: gfx::SurfaceStreamHandle handle = mStream->GetShareHandle(); michael@0: aOutDescriptor = SurfaceStreamDescriptor(handle, false); michael@0: return true; michael@0: } michael@0: michael@0: void michael@0: StreamTextureClientOGL::InitWith(gfx::SurfaceStream* aStream) michael@0: { michael@0: MOZ_ASSERT(!IsAllocated()); michael@0: mStream = aStream; michael@0: mGL = mStream->GLContext(); michael@0: } michael@0: michael@0: bool michael@0: StreamTextureClientOGL::IsAllocated() const michael@0: { michael@0: return mStream != 0; michael@0: } michael@0: michael@0: michael@0: } // namespace michael@0: } // namespace