/*
// Copyright (c) 2014 Intel Corporation
//
// 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 OVERLAY_PLANE_BASE_H
#define OVERLAY_PLANE_BASE_H
#include <utils/KeyedVector.h>
#include <DisplayPlane.h>
#include <BufferMapper.h>
#include <ips/common/Wsbm.h>
#include <ips/common/OverlayHardware.h>
#include <ips/common/VideoPayloadBuffer.h>
namespace android {
namespace intel {
typedef struct {
OverlayBackBufferBlk *buf;
uint32_t gttOffsetInPage;
uint32_t bufObject;
} OverlayBackBuffer;
class OverlayPlaneBase : public DisplayPlane {
public:
OverlayPlaneBase(int index, int disp);
virtual ~OverlayPlaneBase();
virtual void invalidateBufferCache();
virtual bool assignToDevice(int disp);
virtual void setZOrderConfig(ZOrderConfig& config, void *nativeConfig);
// plane operations
virtual bool flip(void *ctx) = 0;
virtual bool reset();
virtual bool enable();
virtual bool disable();
virtual bool isDisabled();
virtual void* getContext() const = 0;
virtual bool initialize(uint32_t bufferCount);
virtual void deinitialize();
protected:
// generic overlay register flush
virtual bool flush(uint32_t flags) = 0;
virtual bool setDataBuffer(BufferMapper& mapper);
virtual bool bufferOffsetSetup(BufferMapper& mapper);
virtual uint32_t calculateSWidthSW(uint32_t offset, uint32_t width);
virtual bool coordinateSetup(BufferMapper& mapper);
virtual bool setCoeffRegs(double *coeff, int mantSize,
coeffPtr pCoeff, int pos);
virtual void updateCoeff(int taps, double fCutoff,
bool isHoriz, bool isY,
coeffPtr pCoeff);
virtual bool scalingSetup(BufferMapper& mapper);
virtual bool colorSetup(BufferMapper& mapper);
virtual void checkPosition(int& x, int& y, int& w, int& h);
virtual void checkCrop(int& x, int& y, int& w, int& h, int coded_width, int coded_height);
protected:
// back buffer operations
virtual OverlayBackBuffer* createBackBuffer();
virtual void deleteBackBuffer(int buf);
virtual void resetBackBuffer(int buf);
virtual BufferMapper* getTTMMapper(BufferMapper& grallocMapper, struct VideoPayloadBuffer *payload);
virtual void putTTMMapper(BufferMapper* mapper);
virtual bool rotatedBufferReady(BufferMapper& mapper, BufferMapper* &rotatedMapper);
virtual bool useOverlayRotation(BufferMapper& mapper);
private:
inline bool isActiveTTMBuffer(BufferMapper *mapper);
void updateActiveTTMBuffers(BufferMapper *mapper);
void invalidateActiveTTMBuffers();
void invalidateTTMBuffers();
protected:
// flush flags
enum {
PLANE_ENABLE = 0x00000001UL,
PLANE_DISABLE = 0x00000002UL,
UPDATE_COEF = 0x00000004UL,
};
enum {
OVERLAY_BACK_BUFFER_COUNT = 3,
MAX_ACTIVE_TTM_BUFFERS = 3,
OVERLAY_DATA_BUFFER_COUNT = 20,
};
// TTM data buffers
KeyedVector<uint64_t, BufferMapper*> mTTMBuffers;
// latest TTM buffers
Vector<BufferMapper*> mActiveTTMBuffers;
// overlay back buffer
OverlayBackBuffer *mBackBuffer[OVERLAY_BACK_BUFFER_COUNT];
int mCurrent;
// wsbm
Wsbm *mWsbm;
// pipe config
uint32_t mPipeConfig;
int mBobDeinterlace;
};
} // namespace intel
} // namespace android
#endif /* OVERLAY_PLANE_BASE_H */