summaryrefslogtreecommitdiffstats
path: root/widget/gonk/HwcComposer2D.h
diff options
context:
space:
mode:
Diffstat (limited to 'widget/gonk/HwcComposer2D.h')
-rw-r--r--widget/gonk/HwcComposer2D.h123
1 files changed, 123 insertions, 0 deletions
diff --git a/widget/gonk/HwcComposer2D.h b/widget/gonk/HwcComposer2D.h
new file mode 100644
index 000000000..56c1d1ec1
--- /dev/null
+++ b/widget/gonk/HwcComposer2D.h
@@ -0,0 +1,123 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* vim:set ts=4 sw=4 sts=4 et: */
+/*
+ * Copyright (c) 2012, The Linux Foundation. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef mozilla_HwcComposer2D
+#define mozilla_HwcComposer2D
+
+#include "Composer2D.h"
+#include "hwchal/HwcHALBase.h" // for HwcHAL
+#include "HwcUtils.h" // for RectVector
+#include "Layers.h"
+#include "mozilla/Mutex.h"
+#include "mozilla/layers/FenceUtils.h" // for FenceHandle
+#include "mozilla/UniquePtr.h" // for HwcHAL
+
+#include <vector>
+#include <list>
+
+#include <utils/Timers.h>
+
+class nsScreenGonk;
+
+namespace mozilla {
+
+namespace gl {
+ class GLContext;
+}
+
+namespace layers {
+class CompositorBridgeParent;
+class Layer;
+}
+
+/*
+ * HwcComposer2D provides a way for gecko to render frames
+ * using hwcomposer.h in the AOSP HAL.
+ *
+ * hwcomposer.h defines an interface for display composition
+ * using dedicated hardware. This hardware is usually faster
+ * or more power efficient than the GPU. However, in exchange
+ * for better performance, generality has to be sacrificed:
+ * no 3d transforms, no intermediate surfaces, no special shader effects,
+ * and loss of other goodies depending on the platform.
+ *
+ * In general, when hwc is enabled gecko tries to compose
+ * its frames using HwcComposer2D first. Then if HwcComposer2D is
+ * unable to compose a frame then it falls back to compose it
+ * using the GPU with OpenGL.
+ *
+ */
+class HwcComposer2D : public mozilla::layers::Composer2D {
+public:
+ HwcComposer2D();
+ virtual ~HwcComposer2D();
+
+ static HwcComposer2D* GetInstance();
+
+ // Returns TRUE if the container has been succesfully rendered
+ // Returns FALSE if the container cannot be fully rendered
+ // by this composer so nothing was rendered at all
+ virtual bool TryRenderWithHwc(layers::Layer* aRoot,
+ nsIWidget* aWidget,
+ bool aGeometryChanged,
+ bool aHasImageHostOverlays) override;
+
+ virtual bool Render(nsIWidget* aWidget) override;
+
+ virtual bool HasHwc() override { return mHal->HasHwc(); }
+
+ bool EnableVsync(bool aEnable);
+ bool RegisterHwcEventCallback();
+ void Vsync(int aDisplay, int64_t aTimestamp);
+ void Invalidate();
+ void Hotplug(int aDisplay, int aConnected);
+ void SetCompositorBridgeParent(layers::CompositorBridgeParent* aCompositorBridgeParent);
+
+private:
+ void Reset();
+ void Prepare(buffer_handle_t dispHandle, int fence, nsScreenGonk* screen);
+ bool Commit(nsScreenGonk* aScreen);
+ bool TryHwComposition(nsScreenGonk* aScreen);
+ bool ReallocLayerList();
+ bool PrepareLayerList(layers::Layer* aContainer, const nsIntRect& aClip,
+ const gfx::Matrix& aParentTransform,
+ bool aFindSidebandStreams);
+ void SendtoLayerScope();
+
+ UniquePtr<HwcHALBase> mHal;
+ HwcList* mList;
+ nsIntRect mScreenRect;
+ int mMaxLayerCount;
+ bool mColorFill;
+ bool mRBSwapSupport;
+ //Holds all the dynamically allocated RectVectors needed
+ //to render the current frame
+ std::list<HwcUtils::RectVector> mVisibleRegions;
+ layers::FenceHandle mPrevRetireFence;
+ layers::FenceHandle mPrevDisplayFence;
+ nsTArray<HwcLayer> mCachedSidebandLayers;
+ nsTArray<layers::LayerComposite*> mHwcLayerMap;
+ bool mPrepared;
+ bool mHasHWVsync;
+ layers::CompositorBridgeParent* mCompositorBridgeParent;
+ Mutex mLock;
+};
+
+} // namespace mozilla
+
+#endif // mozilla_HwcComposer2D