You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
197 lines
5.7 KiB
197 lines
5.7 KiB
13 years ago
|
/*
|
||
|
**
|
||
|
** Copyright 2008, The Android Open Source Project
|
||
|
** Copyright 2009 Samsung Electronics Co, Ltd. 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 FIMG_C210_H
|
||
|
#define FIMG_C210_H
|
||
|
|
||
|
|
||
|
#include <stdio.h>
|
||
|
#include <string.h>
|
||
|
#include <stdlib.h>
|
||
|
|
||
|
#include <fcntl.h>
|
||
|
#include <unistd.h>
|
||
|
#include <errno.h>
|
||
|
#include <signal.h>
|
||
|
#include <sys/mman.h>
|
||
|
#include <sys/time.h>
|
||
|
#include <sys/ioctl.h>
|
||
|
#include <sys/poll.h>
|
||
|
#include <sys/stat.h>
|
||
|
|
||
|
#include <utils/threads.h>
|
||
|
#include <utils/StopWatch.h>
|
||
|
|
||
|
#include "FimgApi.h"
|
||
|
//#include "FimgMem.h"
|
||
|
|
||
|
#include "sec_g2d.h"
|
||
|
|
||
|
//-----------------------------------------------------------------//
|
||
|
|
||
|
namespace android
|
||
|
{
|
||
|
|
||
|
//#define CHECK_FIMGC210_PERFORMANCE
|
||
|
//#define CHECK_FIMGC210_CRITICAL_PERFORMANCE
|
||
|
#define NUMBER_FIMG_LIST (1) // kcoolsw : because of pmem
|
||
|
//#define G2D_NONE_BLOCKING_MODE // Not supported yet. because of sysMMU Page fault
|
||
|
#define GET_RECT_SIZE(rect) ((rect->full_w) * (rect->h) * (rect->bytes_per_pixel))
|
||
|
#define GET_REAL_SIZE(rect) ((rect->full_w) * (rect->h) * (rect->bytes_per_pixel))
|
||
|
#define GET_START_ADDR(rect) (rect->virt_addr + ((rect->y * rect->full_w) * rect->bytes_per_pixel))
|
||
|
|
||
|
|
||
|
//---------------------------------------------------------------------------//
|
||
|
// class FimgC210 : public FimgBase
|
||
|
//---------------------------------------------------------------------------//
|
||
|
class FimgC210 : public FimgApi
|
||
|
{
|
||
|
private :
|
||
|
int m_g2dFd;
|
||
|
|
||
|
unsigned char * m_g2dVirtAddr;
|
||
|
unsigned int m_g2dSize;
|
||
|
unsigned char * m_g2dSrcVirtAddr;
|
||
|
unsigned int m_g2dSrcSize;
|
||
|
unsigned char * m_g2dDstVirtAddr;
|
||
|
unsigned int m_g2dDstSize;
|
||
|
struct pollfd m_g2dPoll;
|
||
|
|
||
|
Mutex * m_lock;
|
||
|
|
||
|
static Mutex m_instanceLock;
|
||
|
static int m_curFimgC210Index;
|
||
|
static int m_numOfInstance;
|
||
|
|
||
|
static FimgApi * m_ptrFimgApiList[NUMBER_FIMG_LIST];
|
||
|
|
||
|
|
||
|
protected :
|
||
|
FimgC210();
|
||
|
virtual ~FimgC210();
|
||
|
|
||
|
public:
|
||
|
static FimgApi * CreateInstance();
|
||
|
static void DestroyInstance(FimgApi * ptrFimgApi);
|
||
|
static void DestroyAllInstance(void);
|
||
|
|
||
|
protected:
|
||
|
virtual bool t_Create(void);
|
||
|
virtual bool t_Destroy(void);
|
||
|
virtual bool t_Stretch(FimgRect * src, FimgRect * dst, FimgClip * clip, FimgFlag * flag);
|
||
|
virtual bool t_Sync(void);
|
||
|
virtual bool t_Lock(void);
|
||
|
virtual bool t_UnLock(void);
|
||
|
|
||
|
private:
|
||
|
bool m_CreateG2D(void);
|
||
|
bool m_DestroyG2D(void);
|
||
|
bool SetClipRectl(FimgRect * dst, FimgClip * clip, FimgClip * clipTempMidRect);
|
||
|
|
||
|
bool m_DoG2D(FimgRect * src, FimgRect * dst, FimgClip * clip, FimgFlag * flag);
|
||
|
|
||
|
inline bool m_PollG2D(struct pollfd * events);
|
||
|
|
||
|
inline bool m_CleanG2D (unsigned int addr, unsigned int size);
|
||
|
inline bool m_FlushG2D (unsigned int addr, unsigned int size);
|
||
|
|
||
|
inline int m_ColorFormatFimgApi2FimgHw(int colorFormat);
|
||
|
inline int m_RotateValueFimgApi2FimgHw(int rotateValue);
|
||
|
|
||
|
#ifdef CHECK_FIMGC210_PERFORMANCE
|
||
|
void m_PrintFimgC210Performance(FimgRect * src,
|
||
|
FimgRect * dst,
|
||
|
int stopWatchIndex,
|
||
|
const char * stopWatchName[],
|
||
|
nsecs_t stopWatchTime[]);
|
||
|
#endif // CHECK_FIMGC210_PERFORMANCE
|
||
|
};
|
||
|
|
||
|
//---------------------------------------------------------------------------//
|
||
|
// class FimgApiAutoFreeThread : public Thread
|
||
|
//---------------------------------------------------------------------------//
|
||
|
class FimgApiAutoFreeThread;
|
||
|
|
||
|
static sp<FimgApiAutoFreeThread> fimgApiAutoFreeThread = 0;
|
||
|
|
||
|
class FimgApiAutoFreeThread : public Thread
|
||
|
{
|
||
|
private:
|
||
|
bool mOneMoreSleep;
|
||
|
bool mDestroyed;
|
||
|
|
||
|
public:
|
||
|
FimgApiAutoFreeThread(void):
|
||
|
//Thread(true),
|
||
|
Thread(false),
|
||
|
mOneMoreSleep(true),
|
||
|
mDestroyed(false)
|
||
|
{ }
|
||
|
~FimgApiAutoFreeThread(void)
|
||
|
{
|
||
|
if(mDestroyed == false)
|
||
|
{
|
||
|
FimgC210::DestroyAllInstance();
|
||
|
mDestroyed = true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
virtual void onFirstRef()
|
||
|
{
|
||
|
run("FimgApiAutoFreeThread", PRIORITY_BACKGROUND);
|
||
|
}
|
||
|
|
||
|
virtual bool threadLoop()
|
||
|
{
|
||
|
//#define SLEEP_TIME (10000000) // 10 sec
|
||
|
#define SLEEP_TIME (3000000) // 3 sec
|
||
|
//#define SLEEP_TIME (1000000) // 1 sec
|
||
|
|
||
|
if(mOneMoreSleep == true)
|
||
|
{
|
||
|
mOneMoreSleep = false;
|
||
|
usleep(SLEEP_TIME);
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if(mDestroyed == false)
|
||
|
{
|
||
|
FimgC210::DestroyAllInstance();
|
||
|
mDestroyed = true;
|
||
|
}
|
||
|
|
||
|
fimgApiAutoFreeThread = 0;
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void SetOneMoreSleep(void)
|
||
|
{
|
||
|
mOneMoreSleep = true;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
}; // namespace android
|
||
|
|
||
|
#endif // FIMG_C210_H
|