qcom/display: Update HALs

- Update the display HAL from Code Aurora Forum
- Add updated overlay library
- Enable HWC with basic video going through overlay
- Cleanup some files

Change-Id: I65c687c51be458cee71213c79e03eeda962d9086
diff --git a/liboverlay/overlayCtrlData.h b/liboverlay/overlayCtrlData.h
new file mode 100644
index 0000000..fbd701a
--- /dev/null
+++ b/liboverlay/overlayCtrlData.h
@@ -0,0 +1,365 @@
+/*
+* Copyright (c) 2012, Code Aurora Forum. All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions are
+* met:
+*    * Redistributions of source code must retain the above copyright
+*      notice, this list of conditions and the following disclaimer.
+*    * Redistributions in binary form must reproduce the above
+*      copyright notice, this list of conditions and the following
+*      disclaimer in the documentation and/or other materials provided
+*      with the distribution.
+*    * Neither the name of Code Aurora Forum, Inc. nor the names of its
+*      contributors may be used to endorse or promote products derived
+*      from this software without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#ifndef OVERLAY_CTRLDATA_H
+#define OVERLAY_CTRLDATA_H
+
+#include "overlayUtils.h"
+#include "overlayMdp.h"
+#include "gralloc_priv.h" // INTERLACE_MASK
+
+namespace ovutils = overlay::utils;
+
+namespace overlay {
+
+// FIXME make int to be uint32 whenever possible
+
+class RotatorBase;
+
+/*
+* FIXME do we want rot to be template parameter?
+* It's already using inheritance...
+*
+* Sequence to use:
+* open
+* start
+* setXXX
+* close
+*
+* Can call setRot anytime to replace rotator on-the-fly
+* */
+class Ctrl : utils::NoCopy {
+public:
+
+    /* ctor */
+    explicit Ctrl();
+
+    /* dtor close */
+    ~Ctrl();
+
+    /* should open devices? or start()? */
+    bool open(uint32_t fbnum, RotatorBase* rot);
+
+    /* close underlying mdp */
+    bool close();
+
+    /* Invoke methods for opening underlying devices
+     * flags - PIPE SHARED
+     * wait - WAIT, NO_WAIT */
+    bool start(const utils::PipeArgs& args);
+
+    /* Dynamically set rotator*/
+    void setRot(RotatorBase* rot);
+
+    /* set mdp posision using dim */
+    bool setPosition(const utils::Dim& dim);
+
+    /* set param using Params (param,value pair)  */
+    bool setParameter(const utils::Params& p);
+
+    /* set source using whf, orient and wait flag */
+    bool setSource(const utils::PipeArgs& args);
+
+    /* set crop info and pass it down to mdp */
+    bool setCrop(const utils::Dim& d);
+
+    /* mdp set overlay/commit changes */
+    bool commit();
+
+    /* ctrl id */
+    int  getId() const;
+    /* ctrl fd */
+    int  getFd() const;
+    bool getRotSessId(int& id) const;
+    utils::Dim getAspectRatio(const utils::Whf& whf) const;
+    utils::Dim getAspectRatio(const utils::Dim& dim) const;
+
+    /* access for screen info */
+    utils::ScreenInfo getScreenInfo() const;
+
+    /* retrieve cached crop data */
+    utils::Dim getCrop() const;
+
+    /* dump the state of the object */
+    void dump() const;
+
+private:
+    /* Retrieve screen info from underlying mdp */
+    bool getScreenInfo(utils::ScreenInfo& info);
+
+    /* calls underlying mdp set info */
+    bool setInfo(const utils::PipeArgs& args);
+
+    /* given whf, update src */
+    void updateSource(RotatorBase* r,
+            const utils::PipeArgs& args,
+            utils::ScreenInfo& info);
+
+    // mdp ctrl struct(info e.g.)
+    MdpCtrl mMdp;
+
+    // Rotator
+    RotatorBase* mRot;
+
+    /* Cache cropped value */
+    utils::Dim mCrop;
+
+    /* Screen info */
+    utils::ScreenInfo mInfo;
+
+    /* orientation cache FIXME */
+    utils::eTransform mOrient;
+
+    /* Cache last known whfz.
+     * That would help us compare to a previous
+     * source that was submitted */
+    utils::Whf mOvBufInfo;
+};
+
+
+/*
+* MDP = DataMdp, ROT = CtrlMdp usually since Rotator<>
+* is instansiated with Ctrl data structure.
+* */
+class Data : utils::NoCopy {
+public:
+    /* init, reset */
+    explicit Data();
+
+    /* calls close */
+    ~Data();
+
+    /* should open devices? or start()? */
+    bool open(uint32_t fbnum, RotatorBase* rot);
+
+    /* calls underlying mdp close */
+    bool close();
+
+    /* set the rotator */
+    void setRot(RotatorBase* rot);
+
+    /* set memory id in the mdp struct */
+    void setMemoryId(int id);
+
+    /* set overlay id in the mdp struct */
+    void setId(int id);
+
+    /* get overlay id in the mdp struct */
+    int getId() const;
+
+    /* queue buffer to the overlay */
+    bool queueBuffer(uint32_t offset);
+
+    /* wait for vsync to be done */
+    bool waitForVsync();
+
+    /* sump the state of the obj */
+    void dump() const;
+private:
+    /* play wrapper */
+    bool play();
+
+    /* playWait wrapper */
+    bool playWait();
+
+    // mdp data struct
+    MdpData mMdp;
+
+    // Rotator
+    RotatorBase* mRot;
+};
+
+/* This class just creates a Ctrl Data pair to be used by a pipe.
+ * Although this was legacy design, this separation still makes sense, since we
+ * need to use the Ctrl channel in hwc_prepare (i.e config stage) and Data
+ * channel in hwc_set (i.e draw stage)
+ */
+struct CtrlData {
+    Ctrl ctrl;
+    Data data;
+};
+
+//-------------Inlines-------------------------------
+
+inline Ctrl::Ctrl() : mRot(0), mOrient(utils::OVERLAY_TRANSFORM_0) {
+    mMdp.reset();
+}
+
+inline Ctrl::~Ctrl() {
+    close();
+}
+
+inline bool Ctrl::close() {
+    // do not close the rotator
+    if(!mMdp.close())
+        return false;
+    return true;
+}
+
+inline bool Ctrl::commit() {
+    if(!mMdp.set()) {
+        ALOGE("Ctrl commit failed set overlay");
+        return false;
+    }
+    return true;
+}
+
+inline bool Ctrl::getScreenInfo(utils::ScreenInfo& info) {
+    if(!mMdp.getScreenInfo(info)){
+        ALOGE("Ctrl failed to get screen info");
+        return false;
+    }
+    return true;
+}
+
+inline bool Ctrl::setInfo(const utils::PipeArgs& args)
+{
+    // FIXME set flags, zorder and wait separtly
+    if(!mMdp.setInfo(mRot, args, mInfo)){
+        ALOGE("Ctrl failed to setInfo wait=%d mdpflags=%d "
+                "zorder=%d", args.wait, args.mdpFlags, args.zorder);
+        return false;
+    }
+    return true;
+}
+
+inline int Ctrl::getId() const {
+    // FIXME check channel up?
+    return mMdp.getId();
+}
+
+inline int Ctrl::getFd() const {
+    // FIXME check channel up?
+    return mMdp.getFd();
+}
+
+inline bool Ctrl::getRotSessId(int& id) const {
+    // FIXME check channel up?
+    // should be -1 in case of no rot session active
+    id = mRot->getSessId();
+    return true;
+}
+
+inline utils::ScreenInfo Ctrl::getScreenInfo() const {
+    return mInfo;
+}
+
+inline utils::Dim Ctrl::getCrop() const {
+    return mCrop;
+}
+
+
+
+inline Data::Data() : mRot(0) {
+    mMdp.reset();
+}
+
+inline Data::~Data() { close(); }
+
+inline void Data::setRot(RotatorBase* rot) { mRot = rot; }
+
+inline void Data::setMemoryId(int id) { mMdp.setMemoryId(id); }
+
+// really a reqid
+inline void Data::setId(int id) { mMdp.setId(id); }
+
+inline int Data::getId() const { return mMdp.getId(); }
+
+inline bool Data::open(uint32_t fbnum,
+        RotatorBase* rot) {
+    if(!mMdp.open(fbnum)) {
+        ALOGE("Data cannot open mdp");
+        return false;
+    }
+
+    OVASSERT(rot, "rot is null");
+    mRot = rot;
+
+    // rotator should be already opened here
+    return true;
+}
+
+inline bool Data::close() {
+    if(!mMdp.close()) {
+        ALOGE("Data close failed");
+        return false;
+    }
+    return true;
+}
+
+inline bool Data::queueBuffer(uint32_t offset) {
+    // FIXME asserts on state validity
+
+    mMdp.setOffset(offset);
+    mRot->setRotDataSrcMemId(mMdp.getMemoryId());
+    // will play if succeeded
+    if(!mRot->prepareQueueBuf(offset)) {
+        ALOGE("Data failed to prepareQueueBuf");
+        return false;
+    }
+    // Play can go either from mdp or rot
+    if(!this->play()){
+        ALOGE("Data error in MDP/ROT play");
+        return false;
+    }
+
+    return true;
+}
+
+inline bool Data::waitForVsync() {
+
+    // Call mdp playWait
+    if(!this->playWait()){
+        ALOGE("Error in MDP playWait");
+        return false;
+    }
+
+    return true;
+}
+
+inline bool Data::play() {
+    int fd = mMdp.getFd();
+    return mRot->enabled() ? mRot->play(fd) : mMdp.play();
+}
+
+inline bool Data::playWait() {
+    return mMdp.playWait();
+}
+
+inline void Data::dump() const {
+    ALOGE("== Dump Data MDP start ==");
+    mMdp.dump();
+    mRot->dump();
+    ALOGE("== Dump Data MDP end ==");
+}
+
+
+} // overlay
+
+#endif