TextureClientSharedSurface.cpp (2905B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #include "TextureClientSharedSurface.h" 8 9 #include "GLContext.h" 10 #include "mozilla/gfx/2D.h" 11 #include "mozilla/gfx/Logging.h" // for gfxDebug 12 #include "mozilla/layers/ISurfaceAllocator.h" 13 #include "nsThreadUtils.h" 14 #include "SharedSurface.h" 15 16 #ifdef MOZ_WIDGET_ANDROID 17 # include "mozilla/layers/AndroidHardwareBuffer.h" 18 #endif 19 20 using namespace mozilla::gl; 21 22 namespace mozilla { 23 namespace layers { 24 25 /* static */ 26 already_AddRefed<TextureClient> SharedSurfaceTextureData::CreateTextureClient( 27 const layers::SurfaceDescriptor& aDesc, const gfx::SurfaceFormat aFormat, 28 gfx::IntSize aSize, TextureFlags aFlags, LayersIPCChannel* aAllocator) { 29 auto data = MakeUnique<SharedSurfaceTextureData>(aDesc, aFormat, aSize); 30 return TextureClient::CreateWithData(data.release(), aFlags, aAllocator); 31 } 32 33 SharedSurfaceTextureData::SharedSurfaceTextureData( 34 const SurfaceDescriptor& desc, const gfx::SurfaceFormat format, 35 const gfx::IntSize size) 36 : mDesc(desc), mFormat(format), mSize(size) {} 37 38 SharedSurfaceTextureData::~SharedSurfaceTextureData() = default; 39 40 void SharedSurfaceTextureData::Deallocate(LayersIPCChannel*) {} 41 42 void SharedSurfaceTextureData::FillInfo(TextureData::Info& aInfo) const { 43 aInfo.size = mSize; 44 aInfo.format = mFormat; 45 aInfo.hasSynchronization = false; 46 aInfo.supportsMoz2D = false; 47 aInfo.canExposeMappedData = false; 48 } 49 50 bool SharedSurfaceTextureData::Serialize(SurfaceDescriptor& aOutDescriptor) { 51 aOutDescriptor = mDesc; 52 return true; 53 } 54 55 TextureFlags SharedSurfaceTextureData::GetTextureFlags() const { 56 TextureFlags flags = TextureFlags::NO_FLAGS; 57 return flags; 58 } 59 60 Maybe<uint64_t> SharedSurfaceTextureData::GetBufferId() const { 61 #ifdef MOZ_WIDGET_ANDROID 62 if (mDesc.type() == 63 SurfaceDescriptor::TSurfaceDescriptorAndroidHardwareBuffer) { 64 const SurfaceDescriptorAndroidHardwareBuffer& desc = 65 mDesc.get_SurfaceDescriptorAndroidHardwareBuffer(); 66 return Some(desc.bufferId()); 67 } 68 #endif 69 return Nothing(); 70 } 71 72 UniqueFileHandle SharedSurfaceTextureData::GetAcquireFence() { 73 #ifdef MOZ_WIDGET_ANDROID 74 if (mDesc.type() == 75 SurfaceDescriptor::TSurfaceDescriptorAndroidHardwareBuffer) { 76 const SurfaceDescriptorAndroidHardwareBuffer& desc = 77 mDesc.get_SurfaceDescriptorAndroidHardwareBuffer(); 78 RefPtr<AndroidHardwareBuffer> buffer = 79 AndroidHardwareBufferManager::Get()->GetBuffer(desc.bufferId()); 80 if (!buffer) { 81 return UniqueFileHandle(); 82 } 83 84 return buffer->GetAcquireFence(); 85 } 86 #endif 87 return UniqueFileHandle(); 88 } 89 90 } // namespace layers 91 } // namespace mozilla