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 "RenderTextureHostWrapper.h"
8 
9 #include "mozilla/gfx/Logging.h"
10 #include "mozilla/webrender/RenderThread.h"
11 
12 namespace mozilla {
13 namespace wr {
14 
RenderTextureHostWrapper(ExternalImageId aExternalImageId)15 RenderTextureHostWrapper::RenderTextureHostWrapper(
16     ExternalImageId aExternalImageId)
17     : mExternalImageId(aExternalImageId) {
18   MOZ_COUNT_CTOR_INHERITED(RenderTextureHostWrapper, RenderTextureHost);
19 }
20 
~RenderTextureHostWrapper()21 RenderTextureHostWrapper::~RenderTextureHostWrapper() {
22   MOZ_COUNT_DTOR_INHERITED(RenderTextureHostWrapper, RenderTextureHost);
23 }
24 
EnsureTextureHost() const25 void RenderTextureHostWrapper::EnsureTextureHost() const {
26   if (!mTextureHost) {
27     mTextureHost = RenderThread::Get()->GetRenderTexture(mExternalImageId);
28     MOZ_ASSERT(mTextureHost);
29     if (!mTextureHost) {
30       gfxCriticalNoteOnce << "Failed to get RenderTextureHost for extId:"
31                           << AsUint64(mExternalImageId);
32     }
33   }
34 }
35 
Lock(uint8_t aChannelIndex,gl::GLContext * aGL,wr::ImageRendering aRendering)36 wr::WrExternalImage RenderTextureHostWrapper::Lock(
37     uint8_t aChannelIndex, gl::GLContext* aGL, wr::ImageRendering aRendering) {
38   EnsureTextureHost();
39   if (!mTextureHost) {
40     return InvalidToWrExternalImage();
41   }
42 
43   return mTextureHost->Lock(aChannelIndex, aGL, aRendering);
44 }
45 
Unlock()46 void RenderTextureHostWrapper::Unlock() {
47   if (mTextureHost) {
48     mTextureHost->Unlock();
49   }
50 }
51 
ClearCachedResources()52 void RenderTextureHostWrapper::ClearCachedResources() {
53   if (mTextureHost) {
54     mTextureHost->ClearCachedResources();
55   }
56 }
57 
58 RenderMacIOSurfaceTextureHost*
AsRenderMacIOSurfaceTextureHost()59 RenderTextureHostWrapper::AsRenderMacIOSurfaceTextureHost() {
60   EnsureTextureHost();
61   if (!mTextureHost) {
62     return nullptr;
63   }
64   return mTextureHost->AsRenderMacIOSurfaceTextureHost();
65 }
66 
AsRenderDXGITextureHost()67 RenderDXGITextureHost* RenderTextureHostWrapper::AsRenderDXGITextureHost() {
68   EnsureTextureHost();
69   if (!mTextureHost) {
70     return nullptr;
71   }
72   return mTextureHost->AsRenderDXGITextureHost();
73 }
74 
75 RenderDXGIYCbCrTextureHost*
AsRenderDXGIYCbCrTextureHost()76 RenderTextureHostWrapper::AsRenderDXGIYCbCrTextureHost() {
77   EnsureTextureHost();
78   if (!mTextureHost) {
79     return nullptr;
80   }
81   return mTextureHost->AsRenderDXGIYCbCrTextureHost();
82 }
83 
EnsureRenderTextureHostSWGL() const84 RenderTextureHostSWGL* RenderTextureHostWrapper::EnsureRenderTextureHostSWGL()
85     const {
86   EnsureTextureHost();
87   if (!mTextureHost) {
88     return nullptr;
89   }
90   return mTextureHost->AsRenderTextureHostSWGL();
91 }
92 
GetPlaneCount() const93 size_t RenderTextureHostWrapper::GetPlaneCount() const {
94   if (RenderTextureHostSWGL* swglHost = EnsureRenderTextureHostSWGL()) {
95     return swglHost->GetPlaneCount();
96   }
97   return 0;
98 }
99 
GetFormat() const100 gfx::SurfaceFormat RenderTextureHostWrapper::GetFormat() const {
101   if (RenderTextureHostSWGL* swglHost = EnsureRenderTextureHostSWGL()) {
102     return swglHost->GetFormat();
103   }
104   return gfx::SurfaceFormat::UNKNOWN;
105 }
106 
GetColorDepth() const107 gfx::ColorDepth RenderTextureHostWrapper::GetColorDepth() const {
108   if (RenderTextureHostSWGL* swglHost = EnsureRenderTextureHostSWGL()) {
109     return swglHost->GetColorDepth();
110   }
111   return gfx::ColorDepth::COLOR_8;
112 }
113 
GetYUVColorSpace() const114 gfx::YUVRangedColorSpace RenderTextureHostWrapper::GetYUVColorSpace() const {
115   if (RenderTextureHostSWGL* swglHost = EnsureRenderTextureHostSWGL()) {
116     return swglHost->GetYUVColorSpace();
117   }
118   return gfx::YUVRangedColorSpace::Default;
119 }
120 
MapPlane(RenderCompositor * aCompositor,uint8_t aChannelIndex,PlaneInfo & aPlaneInfo)121 bool RenderTextureHostWrapper::MapPlane(RenderCompositor* aCompositor,
122                                         uint8_t aChannelIndex,
123                                         PlaneInfo& aPlaneInfo) {
124   if (RenderTextureHostSWGL* swglHost = EnsureRenderTextureHostSWGL()) {
125     return swglHost->MapPlane(aCompositor, aChannelIndex, aPlaneInfo);
126   }
127   return false;
128 }
129 
UnmapPlanes()130 void RenderTextureHostWrapper::UnmapPlanes() {
131   if (RenderTextureHostSWGL* swglHost = EnsureRenderTextureHostSWGL()) {
132     swglHost->UnmapPlanes();
133   }
134 }
135 
136 }  // namespace wr
137 }  // namespace mozilla
138