blob: 2a7c42f737312fb9b406efded54c0029d8c2f8dc [file] [log] [blame]
codeworkx62f02ba2012-05-20 12:00:36 +02001/*
2**
3** Copyright 2008, The Android Open Source Project
4** Copyright 2009 Samsung Electronics Co, Ltd. All Rights Reserved.
5**
6** Licensed under the Apache License, Version 2.0 (the "License");
7** you may not use this file except in compliance with the License.
8** You may obtain a copy of the License at
9**
10** http://www.apache.org/licenses/LICENSE-2.0
11**
12** Unless required by applicable law or agreed to in writing, software
13** distributed under the License is distributed on an "AS IS" BASIS,
14** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15** See the License for the specific language governing permissions and
16** limitations under the License.
17**
18**
19*/
20
21#ifndef FIMG_EXYNOS4_H
22#define FIMG_EXYNOS4_H
23
24#include <stdio.h>
25#include <string.h>
26#include <stdlib.h>
27
28#include <fcntl.h>
29#include <unistd.h>
30#include <errno.h>
31#include <signal.h>
32#include <sys/mman.h>
33#include <sys/time.h>
34#include <sys/ioctl.h>
35#include <sys/poll.h>
36#include <sys/stat.h>
37
38#include <linux/android_pmem.h>
39#include <utils/threads.h>
40#include <utils/StopWatch.h>
41
42#include "FimgApi.h"
43
44#include "sec_g2d_4x.h"
45
46namespace android
47{
48
49#define NUMBER_FIMG_LIST (1) // kcoolsw : because of pmem
50#define GET_RECT_SIZE(rect) ((rect->full_w) * (rect->h) * (rect->bytes_per_pixel))
51#define GET_REAL_SIZE(rect) ((rect->full_w) * (rect->h) * (rect->bytes_per_pixel))
52#define GET_START_ADDR(rect) (rect->virt_addr + ((rect->y * rect->full_w) * rect->bytes_per_pixel))
53#define SLEEP_TIME (3000000) // 3 sec
54
55//---------------------------------------------------------------------------//
56// class FimgV4x : public FimgBase
57//---------------------------------------------------------------------------//
58class FimgV4x : public FimgApi
59{
60private :
61 int m_g2dFd;
62
63 unsigned char *m_g2dVirtAddr;
64 unsigned int m_g2dSize;
65 unsigned char *m_g2dSrcVirtAddr;
66 unsigned int m_g2dSrcSize;
67 unsigned char *m_g2dDstVirtAddr;
68 unsigned int m_g2dDstSize;
69 struct pollfd m_g2dPoll;
70
71 Mutex *m_lock;
72
73 static Mutex m_instanceLock;
74 static unsigned m_curFimgV4xIndex;
75 static int m_numOfInstance;
76
77 static FimgApi *m_ptrFimgApiList[NUMBER_FIMG_LIST];
78
79protected :
80 FimgV4x();
81 virtual ~FimgV4x();
82
83public:
84 static FimgApi *CreateInstance();
85 static void DestroyInstance(FimgApi *ptrFimgApi);
86 static void DestroyAllInstance(void);
87
88protected:
89 virtual bool t_Create(void);
90 virtual bool t_Destroy(void);
91 virtual bool t_Stretch(struct fimg2d_blit *cmd);
92 virtual bool t_Sync(void);
93 virtual bool t_Lock(void);
94 virtual bool t_UnLock(void);
95
96private:
97 bool m_CreateG2D(void);
98 bool m_DestroyG2D(void);
99
100 bool m_DoG2D(struct fimg2d_blit *cmd);
101
102 inline bool m_PollG2D(struct pollfd *events);
103
104 inline int m_ColorFormatFimgApi2FimgHw(int colorFormat);
105};
106
107class FimgApiAutoFreeThread;
108
109static sp<FimgApiAutoFreeThread> fimgApiAutoFreeThread = 0;
110
111class FimgApiAutoFreeThread : public Thread
112{
113private:
114 bool mOneMoreSleep;
115 bool mDestroyed;
116
117public:
118 FimgApiAutoFreeThread(void):
119 Thread(false),
120 mOneMoreSleep(true),
121 mDestroyed(false)
122 { }
123 ~FimgApiAutoFreeThread(void)
124 {
125 if (mDestroyed == false)
126 {
127 FimgV4x::DestroyAllInstance();
128 mDestroyed = true;
129 }
130 }
131
132 virtual void onFirstRef()
133 {
134 run("FimgApiAutoFreeThread", PRIORITY_BACKGROUND);
135 }
136
137 virtual bool threadLoop()
138 {
139
140 if (mOneMoreSleep == true)
141 {
142 mOneMoreSleep = false;
143 usleep(SLEEP_TIME);
144
145 return true;
146 }
147 else
148 {
149 if (mDestroyed == false)
150 {
151 FimgV4x::DestroyAllInstance();
152 mDestroyed = true;
153 }
154
155 fimgApiAutoFreeThread = 0;
156
157 return false;
158 }
159 }
160
161 void SetOneMoreSleep(void)
162 {
163 mOneMoreSleep = true;
164 }
165};
166
167}; // namespace android
168
169#endif // FIMG_EXYNOS4_H