• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 #include "renderControl_dec.h"
17 #include "FrameBuffer.h"
18 #include "FBConfig.h"
19 #include "EGLDispatch.h"
20 #include "GLDispatch.h"
21 #include "GL2Dispatch.h"
22 #include "ThreadInfo.h"
23 
24 static const GLint rendererVersion = 1;
25 
rcGetRendererVersion()26 static GLint rcGetRendererVersion()
27 {
28     return rendererVersion;
29 }
30 
rcGetEGLVersion(EGLint * major,EGLint * minor)31 static EGLint rcGetEGLVersion(EGLint* major, EGLint* minor)
32 {
33     FrameBuffer *fb = FrameBuffer::getFB();
34     if (!fb) {
35         return EGL_FALSE;
36     }
37     *major = (EGLint)fb->getCaps().eglMajor;
38     *minor = (EGLint)fb->getCaps().eglMinor;
39 
40     return EGL_TRUE;
41 }
42 
rcQueryEGLString(EGLenum name,void * buffer,EGLint bufferSize)43 static EGLint rcQueryEGLString(EGLenum name, void* buffer, EGLint bufferSize)
44 {
45     FrameBuffer *fb = FrameBuffer::getFB();
46     if (!fb) {
47         return 0;
48     }
49 
50     const char *str = s_egl.eglQueryString(fb->getDisplay(), name);
51     if (!str) {
52         return 0;
53     }
54 
55     int len = strlen(str) + 1;
56     if (!buffer || len > bufferSize) {
57         return -len;
58     }
59 
60     strcpy((char *)buffer, str);
61     return len;
62 }
63 
rcGetGLString(EGLenum name,void * buffer,EGLint bufferSize)64 static EGLint rcGetGLString(EGLenum name, void* buffer, EGLint bufferSize)
65 {
66     RenderThreadInfo *tInfo = RenderThreadInfo::get();
67     if (!tInfo || !tInfo->currContext.Ptr()) {
68         return 0;
69     }
70 
71     const char *str = NULL;
72 #ifdef WITH_GLES2
73     if (tInfo->currContext->isGL2()) {
74         str = (const char *)s_gl2.glGetString(name);
75     }
76     else {
77 #endif
78         str = (const char *)s_gl.glGetString(name);
79 #ifdef WITH_GLES2
80     }
81 #endif
82 
83     if (!str) {
84         return 0;
85     }
86 
87     int len = strlen(str) + 1;
88     if (!buffer || len > bufferSize) {
89         return -len;
90     }
91 
92     strcpy((char *)buffer, str);
93     return len;
94 }
95 
rcGetNumConfigs(uint32_t * numAttribs)96 static EGLint rcGetNumConfigs(uint32_t* numAttribs)
97 {
98     if (numAttribs) {
99         *numAttribs = FBConfig::getNumAttribs();
100     }
101     return FBConfig::getNumConfigs();
102 }
103 
rcGetConfigs(uint32_t bufSize,GLuint * buffer)104 static EGLint rcGetConfigs(uint32_t bufSize, GLuint* buffer)
105 {
106     int configSize = FBConfig::getNumAttribs();
107     int nConfigs = FBConfig::getNumConfigs();
108     uint32_t neededSize = (nConfigs + 1) * configSize * sizeof(GLuint);
109     if (!buffer || bufSize < neededSize) {
110         return -neededSize;
111     }
112     FBConfig::packConfigsInfo(buffer);
113     return nConfigs;
114 }
115 
rcChooseConfig(EGLint * attribs,uint32_t attribs_size,uint32_t * configs,uint32_t configs_size)116 static EGLint rcChooseConfig(EGLint *attribs, uint32_t attribs_size, uint32_t *configs, uint32_t configs_size)
117 {
118     FrameBuffer *fb = FrameBuffer::getFB();
119     if (!fb) {
120         return 0;
121     }
122 
123     return FBConfig::chooseConfig(fb, attribs, configs, configs_size);
124 }
125 
rcGetFBParam(EGLint param)126 static EGLint rcGetFBParam(EGLint param)
127 {
128     FrameBuffer *fb = FrameBuffer::getFB();
129     if (!fb) {
130         return 0;
131     }
132 
133     EGLint ret = 0;
134 
135     switch(param) {
136         case FB_WIDTH:
137             ret = fb->getWidth();
138             break;
139         case FB_HEIGHT:
140             ret = fb->getHeight();
141             break;
142         case FB_XDPI:
143             ret = 72; // XXX: should be implemented
144             break;
145         case FB_YDPI:
146             ret = 72; // XXX: should be implemented
147             break;
148         case FB_FPS:
149             ret = 60;
150             break;
151         case FB_MIN_SWAP_INTERVAL:
152             ret = 1; // XXX: should be implemented
153             break;
154         case FB_MAX_SWAP_INTERVAL:
155             ret = 1; // XXX: should be implemented
156             break;
157         default:
158             break;
159     }
160 
161     return ret;
162 }
163 
rcCreateContext(uint32_t config,uint32_t share,uint32_t glVersion)164 static uint32_t rcCreateContext(uint32_t config,
165                                 uint32_t share, uint32_t glVersion)
166 {
167     FrameBuffer *fb = FrameBuffer::getFB();
168     if (!fb) {
169         return 0;
170     }
171 
172     HandleType ret = fb->createRenderContext(config, share, glVersion == 2);
173     return ret;
174 }
175 
rcDestroyContext(uint32_t context)176 static void rcDestroyContext(uint32_t context)
177 {
178     FrameBuffer *fb = FrameBuffer::getFB();
179     if (!fb) {
180         return;
181     }
182 
183     fb->DestroyRenderContext(context);
184 }
185 
rcCreateWindowSurface(uint32_t config,uint32_t width,uint32_t height)186 static uint32_t rcCreateWindowSurface(uint32_t config,
187                                       uint32_t width, uint32_t height)
188 {
189     FrameBuffer *fb = FrameBuffer::getFB();
190     if (!fb) {
191         return 0;
192     }
193 
194     return fb->createWindowSurface(config, width, height);
195 }
196 
rcDestroyWindowSurface(uint32_t windowSurface)197 static void rcDestroyWindowSurface(uint32_t windowSurface)
198 {
199     FrameBuffer *fb = FrameBuffer::getFB();
200     if (!fb) {
201         return;
202     }
203 
204     fb->DestroyWindowSurface( windowSurface );
205 }
206 
rcCreateColorBuffer(uint32_t width,uint32_t height,GLenum internalFormat)207 static uint32_t rcCreateColorBuffer(uint32_t width,
208                                     uint32_t height, GLenum internalFormat)
209 {
210     FrameBuffer *fb = FrameBuffer::getFB();
211     if (!fb) {
212         return 0;
213     }
214 
215     return fb->createColorBuffer(width, height, internalFormat);
216 }
217 
rcOpenColorBuffer(uint32_t colorbuffer)218 static void rcOpenColorBuffer(uint32_t colorbuffer)
219 {
220     FrameBuffer *fb = FrameBuffer::getFB();
221     if (!fb) {
222         return;
223     }
224     fb->openColorBuffer( colorbuffer );
225 }
226 
rcCloseColorBuffer(uint32_t colorbuffer)227 static void rcCloseColorBuffer(uint32_t colorbuffer)
228 {
229     FrameBuffer *fb = FrameBuffer::getFB();
230     if (!fb) {
231         return;
232     }
233     fb->closeColorBuffer( colorbuffer );
234 }
235 
rcFlushWindowColorBuffer(uint32_t windowSurface)236 static int rcFlushWindowColorBuffer(uint32_t windowSurface)
237 {
238     FrameBuffer *fb = FrameBuffer::getFB();
239     if (!fb) {
240         return -1;
241     }
242     fb->flushWindowSurfaceColorBuffer(windowSurface);
243     return 0;
244 }
245 
rcSetWindowColorBuffer(uint32_t windowSurface,uint32_t colorBuffer)246 static void rcSetWindowColorBuffer(uint32_t windowSurface,
247                                    uint32_t colorBuffer)
248 {
249     FrameBuffer *fb = FrameBuffer::getFB();
250     if (!fb) {
251         return;
252     }
253     fb->setWindowSurfaceColorBuffer(windowSurface, colorBuffer);
254 }
255 
rcMakeCurrent(uint32_t context,uint32_t drawSurf,uint32_t readSurf)256 static EGLint rcMakeCurrent(uint32_t context,
257                             uint32_t drawSurf, uint32_t readSurf)
258 {
259     FrameBuffer *fb = FrameBuffer::getFB();
260     if (!fb) {
261         return EGL_FALSE;
262     }
263 
264     bool ret = fb->bindContext(context, drawSurf, readSurf);
265 
266     return (ret ? EGL_TRUE : EGL_FALSE);
267 }
268 
rcFBPost(uint32_t colorBuffer)269 static void rcFBPost(uint32_t colorBuffer)
270 {
271     FrameBuffer *fb = FrameBuffer::getFB();
272     if (!fb) {
273         return;
274     }
275 
276     fb->post(colorBuffer);
277 }
278 
rcFBSetSwapInterval(EGLint interval)279 static void rcFBSetSwapInterval(EGLint interval)
280 {
281    // XXX: TBD - should be implemented
282 }
283 
rcBindTexture(uint32_t colorBuffer)284 static void rcBindTexture(uint32_t colorBuffer)
285 {
286     FrameBuffer *fb = FrameBuffer::getFB();
287     if (!fb) {
288         return;
289     }
290 
291     fb->bindColorBufferToTexture(colorBuffer);
292 }
293 
rcBindRenderbuffer(uint32_t colorBuffer)294 static void rcBindRenderbuffer(uint32_t colorBuffer)
295 {
296     FrameBuffer *fb = FrameBuffer::getFB();
297     if (!fb) {
298         return;
299     }
300 
301     fb->bindColorBufferToRenderbuffer(colorBuffer);
302 }
303 
rcColorBufferCacheFlush(uint32_t colorBuffer,EGLint postCount,int forRead)304 static EGLint rcColorBufferCacheFlush(uint32_t colorBuffer,
305                                       EGLint postCount, int forRead)
306 {
307    // XXX: TBD - should be implemented
308    return 0;
309 }
310 
rcReadColorBuffer(uint32_t colorBuffer,GLint x,GLint y,GLint width,GLint height,GLenum format,GLenum type,void * pixels)311 static void rcReadColorBuffer(uint32_t colorBuffer,
312                               GLint x, GLint y,
313                               GLint width, GLint height,
314                               GLenum format, GLenum type, void* pixels)
315 {
316    // XXX: TBD - should be implemented
317 }
318 
rcUpdateColorBuffer(uint32_t colorBuffer,GLint x,GLint y,GLint width,GLint height,GLenum format,GLenum type,void * pixels)319 static int rcUpdateColorBuffer(uint32_t colorBuffer,
320                                 GLint x, GLint y,
321                                 GLint width, GLint height,
322                                 GLenum format, GLenum type, void* pixels)
323 {
324     FrameBuffer *fb = FrameBuffer::getFB();
325     if (!fb) {
326         return -1;
327     }
328 
329     fb->updateColorBuffer(colorBuffer, x, y, width, height, format, type, pixels);
330     return 0;
331 }
332 
initRenderControlContext(renderControl_decoder_context_t * dec)333 void initRenderControlContext(renderControl_decoder_context_t *dec)
334 {
335     dec->set_rcGetRendererVersion(rcGetRendererVersion);
336     dec->set_rcGetEGLVersion(rcGetEGLVersion);
337     dec->set_rcQueryEGLString(rcQueryEGLString);
338     dec->set_rcGetGLString(rcGetGLString);
339     dec->set_rcGetNumConfigs(rcGetNumConfigs);
340     dec->set_rcGetConfigs(rcGetConfigs);
341     dec->set_rcChooseConfig(rcChooseConfig);
342     dec->set_rcGetFBParam(rcGetFBParam);
343     dec->set_rcCreateContext(rcCreateContext);
344     dec->set_rcDestroyContext(rcDestroyContext);
345     dec->set_rcCreateWindowSurface(rcCreateWindowSurface);
346     dec->set_rcDestroyWindowSurface(rcDestroyWindowSurface);
347     dec->set_rcCreateColorBuffer(rcCreateColorBuffer);
348     dec->set_rcOpenColorBuffer(rcOpenColorBuffer);
349     dec->set_rcCloseColorBuffer(rcCloseColorBuffer);
350     dec->set_rcSetWindowColorBuffer(rcSetWindowColorBuffer);
351     dec->set_rcFlushWindowColorBuffer(rcFlushWindowColorBuffer);
352     dec->set_rcMakeCurrent(rcMakeCurrent);
353     dec->set_rcFBPost(rcFBPost);
354     dec->set_rcFBSetSwapInterval(rcFBSetSwapInterval);
355     dec->set_rcBindTexture(rcBindTexture);
356     dec->set_rcBindRenderbuffer(rcBindRenderbuffer);
357     dec->set_rcColorBufferCacheFlush(rcColorBufferCacheFlush);
358     dec->set_rcReadColorBuffer(rcReadColorBuffer);
359     dec->set_rcUpdateColorBuffer(rcUpdateColorBuffer);
360 }
361