summaryrefslogtreecommitdiffstats
path: root/widget/gonk/HwcUtils.h
diff options
context:
space:
mode:
Diffstat (limited to 'widget/gonk/HwcUtils.h')
-rw-r--r--widget/gonk/HwcUtils.h135
1 files changed, 135 insertions, 0 deletions
diff --git a/widget/gonk/HwcUtils.h b/widget/gonk/HwcUtils.h
new file mode 100644
index 000000000..876ff8e99
--- /dev/null
+++ b/widget/gonk/HwcUtils.h
@@ -0,0 +1,135 @@
+/*
+ * Copyright (c) 2013, 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_HwcUtils
+#define mozilla_HwcUtils
+
+#include "Layers.h"
+#include <vector>
+#include "hardware/hwcomposer.h"
+
+namespace mozilla {
+
+namespace gfx {
+class Matrix;
+}
+
+class HwcUtils {
+public:
+
+enum {
+ HWC_USE_GPU = HWC_FRAMEBUFFER,
+ HWC_USE_OVERLAY = HWC_OVERLAY,
+ HWC_USE_COPYBIT
+};
+
+// HWC layer flags
+enum {
+ // Draw a solid color rectangle
+ // The color should be set on the transform member of the hwc_layer_t struct
+ // The expected format is a 32 bit ABGR with 8 bits per component
+ HWC_COLOR_FILL = 0x8,
+ // Swap the RB pixels of gralloc buffer, like RGBA<->BGRA or RGBX<->BGRX
+ // The flag will be set inside LayerRenderState
+ HWC_FORMAT_RB_SWAP = 0x40
+};
+
+typedef std::vector<hwc_rect_t> RectVector;
+
+/* Utility functions - implemented in HwcUtils.cpp */
+
+/**
+ * Calculates the layer's clipping rectangle
+ *
+ * @param aTransform Input. A transformation matrix
+ * It transforms the clip rect to screen space
+ * @param aLayerClip Input. The layer's internal clipping rectangle.
+ * This may be NULL which means the layer has no internal clipping
+ * The origin is the top-left corner of the layer
+ * @param aParentClip Input. The parent layer's rendering clipping rectangle
+ * The origin is the top-left corner of the screen
+ * @param aRenderClip Output. The layer's rendering clipping rectangle
+ * The origin is the top-left corner of the screen
+ * @return true if the layer should be rendered.
+ * false if the layer can be skipped
+ */
+static bool CalculateClipRect(const gfx::Matrix& aTransform,
+ const nsIntRect* aLayerClip,
+ nsIntRect aParentClip, nsIntRect* aRenderClip);
+
+
+/**
+ * Prepares hwc layer visible region required for hwc composition
+ *
+ * @param aVisible Input. Layer's unclipped visible region
+ * The origin is the top-left corner of the layer
+ * @param aLayerTransform Input. Layer's transformation matrix
+ * It transforms from layer space to screen space
+ * @param aLayerBufferTransform Input. Layer buffer's transformation matrix
+ * It transforms from layer buffer's space to screen space
+ * @param aClip Input. A clipping rectangle.
+ * The origin is the top-left corner of the screen
+ * @param aBufferRect Input. The layer's buffer bounds
+ * The origin is the top-left corner of the layer
+ * @param aVisibleRegionScreen Output. Visible region in screen space.
+ * The origin is the top-left corner of the screen
+ * @param aIsVisible Output. true if region is visible
+ * false if region is not visible
+ * @return true if region can be rendered by HWC.
+ * false if region should not be rendered by HWC
+ */
+static bool PrepareVisibleRegion(const nsIntRegion& aVisible,
+ const gfx::Matrix& aLayerTransform,
+ const gfx::Matrix& aLayerBufferTransform,
+ nsIntRect aClip, nsIntRect aBufferRect,
+ RectVector* aVisibleRegionScreen,
+ bool& aIsVisible);
+
+
+/**
+ * Sets hwc layer rectangles required for hwc composition
+ *
+ * @param aVisible Input. Layer's unclipped visible rectangle
+ * The origin is the top-left corner of the layer
+ * @param aLayerTransform Input. Layer's transformation matrix
+ * It transforms from layer space to screen space
+ * @param aLayerBufferTransform Input. Layer buffer's transformation matrix
+ * It transforms from layer buffer's space to screen space
+ * @param aClip Input. A clipping rectangle.
+ * The origin is the top-left corner of the screen
+ * @param aBufferRect Input. The layer's buffer bounds
+ * The origin is the top-left corner of the layer
+ * @param aYFlipped Input. true if the buffer is rendered as Y flipped
+ * @param aSurceCrop Output. Area of the source to consider,
+ * the origin is the top-left corner of the buffer
+ * @param aVisibleRegionScreen Output. Visible region in screen space.
+ * The origin is the top-left corner of the screen
+ * @return true if the layer should be rendered.
+ * false if the layer can be skipped
+ */
+static bool PrepareLayerRects(nsIntRect aVisible,
+ const gfx::Matrix& aLayerTransform,
+ const gfx::Matrix& aLayerBufferTransform,
+ nsIntRect aClip, nsIntRect aBufferRect,
+ bool aYFlipped,
+ hwc_rect_t* aSourceCrop,
+ hwc_rect_t* aVisibleRegionScreen);
+
+};
+
+} // namespace mozilla
+
+#endif // mozilla_HwcUtils