• 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 "EglOsApi.h"
17 #include "MacNative.h"
18 #define MAX_PBUFFER_MIPMAP_LEVEL 1
19 
20 namespace EglOS {
21 
22 static std::list<EGLNativePixelFormatType> s_nativeConfigs;
23 
getDefaultDisplay()24 EGLNativeDisplayType getDefaultDisplay() {return 0;}
25 
releaseDisplay(EGLNativeDisplayType dpy)26 bool releaseDisplay(EGLNativeDisplayType dpy) {
27     return true;
28 }
29 
pixelFormatToConfig(int index,int renderableType,EGLNativePixelFormatType * frmt)30 static EglConfig* pixelFormatToConfig(int index,int renderableType,EGLNativePixelFormatType* frmt){
31     if(!frmt) return NULL;
32 
33     EGLint  red,green,blue,alpha,depth,stencil;
34     EGLint  supportedSurfaces,visualType,visualId;
35     EGLint  transparentType,samples;
36     EGLint  tRed,tGreen,tBlue;
37     EGLint  pMaxWidth,pMaxHeight,pMaxPixels;
38     EGLint  configId,level;
39     EGLint  window,pbuffer;
40     EGLint  doubleBuffer,colorSize;
41 
42     getPixelFormatAttrib(*frmt,MAC_HAS_DOUBLE_BUFFER,&doubleBuffer);
43     if(!doubleBuffer) return NULL; //pixel double buffer
44 
45     supportedSurfaces = 0;
46 
47     getPixelFormatAttrib(*frmt,MAC_DRAW_TO_WINDOW,&window);
48     getPixelFormatAttrib(*frmt,MAC_DRAW_TO_PBUFFER,&pbuffer);
49 
50     if(window)  supportedSurfaces |= EGL_WINDOW_BIT;
51     if(pbuffer) supportedSurfaces |= EGL_PBUFFER_BIT;
52 
53     if(!supportedSurfaces) return NULL;
54 
55     //default values
56     visualId                  = 0;
57     visualType                = EGL_NONE;
58     EGLenum caveat            = EGL_NONE;
59     EGLBoolean renderable     = EGL_FALSE;
60     pMaxWidth                 = PBUFFER_MAX_WIDTH;
61     pMaxHeight                = PBUFFER_MAX_HEIGHT;
62     pMaxPixels                = PBUFFER_MAX_PIXELS;
63     samples                   = 0;
64     level                     = 0;
65     tRed = tGreen = tBlue     = 0;
66 
67     transparentType = EGL_NONE;
68 
69     getPixelFormatAttrib(*frmt,MAC_SAMPLES_PER_PIXEL,&samples);
70     getPixelFormatAttrib(*frmt,MAC_COLOR_SIZE,&colorSize);
71     getPixelFormatAttrib(*frmt,MAC_ALPHA_SIZE,&alpha);
72     getPixelFormatAttrib(*frmt,MAC_DEPTH_SIZE,&depth);
73     getPixelFormatAttrib(*frmt,MAC_STENCIL_SIZE,&stencil);
74 
75     red = green = blue = (colorSize / 4); //TODO: ask guy if it is OK
76 
77     return new EglConfig(red,green,blue,alpha,caveat,(EGLint)index,depth,level,pMaxWidth,pMaxHeight,pMaxPixels,renderable,renderableType,
78                          visualId,visualType,samples,stencil,supportedSurfaces,transparentType,tRed,tGreen,tBlue,*frmt);
79 }
80 
81 
initNativeConfigs()82 static void initNativeConfigs(){
83     int nConfigs = getNumPixelFormats();
84     if(s_nativeConfigs.empty()){
85         for(int i=0; i < nConfigs ;i++){
86              EGLNativePixelFormatType frmt = getPixelFormat(i);
87              if(frmt){
88                  s_nativeConfigs.push_back(frmt);
89              }
90         }
91     }
92 }
93 
queryConfigs(EGLNativeDisplayType dpy,int renderableType,ConfigsList & listOut)94 void queryConfigs(EGLNativeDisplayType dpy,int renderableType,ConfigsList& listOut) {
95     int i = 0 ;
96     initNativeConfigs();
97     for(std::list<EGLNativePixelFormatType>::iterator it = s_nativeConfigs.begin(); it != s_nativeConfigs.end();it++){
98          EGLNativePixelFormatType frmt = *it;
99          EglConfig* conf = pixelFormatToConfig(i++,renderableType,&frmt);
100          if(conf){
101              listOut.push_front(conf);
102          };
103     }
104 }
105 
validNativeDisplay(EGLNativeInternalDisplayType dpy)106 bool validNativeDisplay(EGLNativeInternalDisplayType dpy) {
107     return true;
108 }
109 
validNativeWin(EGLNativeDisplayType dpy,EGLNativeWindowType win)110 bool validNativeWin(EGLNativeDisplayType dpy, EGLNativeWindowType win) {
111     unsigned int width,height;
112     return nsGetWinDims(win,&width,&height);
113 }
114 
validNativeWin(EGLNativeDisplayType dpy,EGLNativeSurfaceType win)115 bool validNativeWin(EGLNativeDisplayType dpy, EGLNativeSurfaceType win) {
116     return validNativeWin(dpy,(EGLNativeWindowType)win);
117 }
118 
119 //no support for pixmap in mac
validNativePixmap(EGLNativeDisplayType dpy,EGLNativeSurfaceType pix)120 bool validNativePixmap(EGLNativeDisplayType dpy, EGLNativeSurfaceType pix) {
121 
122    return true;
123 }
124 
checkWindowPixelFormatMatch(EGLNativeDisplayType dpy,EGLNativeWindowType win,EglConfig * cfg,unsigned int * width,unsigned int * height)125 bool checkWindowPixelFormatMatch(EGLNativeDisplayType dpy,EGLNativeWindowType win,EglConfig* cfg,unsigned int* width,unsigned int* height) {
126     int r,g,b;
127     bool ret = nsGetWinDims(win,width,height);
128 
129     cfg->getConfAttrib(EGL_RED_SIZE,&r);
130     cfg->getConfAttrib(EGL_GREEN_SIZE,&g);
131     cfg->getConfAttrib(EGL_BLUE_SIZE,&b);
132     bool match = nsCheckColor(win,r + g + b);
133 
134     return ret && match;
135 }
136 
137 //no support for pixmap in mac
checkPixmapPixelFormatMatch(EGLNativeDisplayType dpy,EGLNativePixmapType pix,EglConfig * cfg,unsigned int * width,unsigned int * height)138 bool checkPixmapPixelFormatMatch(EGLNativeDisplayType dpy,EGLNativePixmapType pix,EglConfig* cfg,unsigned int* width,unsigned int* height) {
139     return false;
140 }
141 
createPbufferSurface(EGLNativeDisplayType dpy,EglConfig * cfg,EglPbufferSurface * srfc)142 EGLNativeSurfaceType createPbufferSurface(EGLNativeDisplayType dpy,EglConfig* cfg,EglPbufferSurface* srfc){
143     EGLint width,height,hasMipmap,tmp;
144     EGLint target,format;
145     srfc->getDim(&width,&height,&tmp);
146     srfc->getTexInfo(&format,&target);
147     srfc->getAttrib(EGL_MIPMAP_TEXTURE,&hasMipmap);
148     EGLint maxMipmap = hasMipmap ? MAX_PBUFFER_MIPMAP_LEVEL:0;
149     return (EGLNativeSurfaceType)nsCreatePBuffer(target,format,maxMipmap,width,height);
150 }
151 
releasePbuffer(EGLNativeDisplayType dis,EGLNativeSurfaceType pb)152 bool releasePbuffer(EGLNativeDisplayType dis,EGLNativeSurfaceType pb) {
153     nsDestroyPBuffer(pb);
154     return true;
155 }
156 
createContext(EGLNativeDisplayType dpy,EglConfig * cfg,EGLNativeContextType sharedContext)157 EGLNativeContextType createContext(EGLNativeDisplayType dpy,EglConfig* cfg,EGLNativeContextType sharedContext) {
158  return nsCreateContext(cfg->nativeConfig(),sharedContext);
159 }
160 
destroyContext(EGLNativeDisplayType dpy,EGLNativeContextType ctx)161 bool destroyContext(EGLNativeDisplayType dpy,EGLNativeContextType ctx) {
162     nsDestroyContext(ctx);
163     return true;
164 }
165 
makeCurrent(EGLNativeDisplayType dpy,EglSurface * read,EglSurface * draw,EGLNativeContextType ctx)166 bool makeCurrent(EGLNativeDisplayType dpy,EglSurface* read,EglSurface* draw,EGLNativeContextType ctx){
167 
168     // check for unbind
169     if (ctx == NULL && read == NULL && draw == NULL) {
170         nsWindowMakeCurrent(NULL, NULL);
171         return true;
172     }
173     else if (ctx == NULL || read == NULL || draw == NULL) {
174         // error !
175         return false;
176     }
177 
178     //dont supporting diffrent read & draw surfaces on Mac
179     if(read->native() != draw->native()) return false;
180     switch(draw->type()){
181     case EglSurface::WINDOW:
182         nsWindowMakeCurrent(ctx,draw->native());
183         break;
184     case EglSurface::PBUFFER:
185     {
186         EGLint hasMipmap;
187         draw->getAttrib(EGL_MIPMAP_TEXTURE,&hasMipmap);
188         int mipmapLevel = hasMipmap ? MAX_PBUFFER_MIPMAP_LEVEL:0;
189         nsPBufferMakeCurrent(ctx,draw->native(),mipmapLevel);
190         break;
191     }
192     case EglSurface::PIXMAP: // not supported on Mac
193     default:
194         return false;
195     }
196     return true;
197 }
198 
swapBuffers(EGLNativeDisplayType dpy,EGLNativeSurfaceType srfc)199 void swapBuffers(EGLNativeDisplayType dpy,EGLNativeSurfaceType srfc){
200     nsSwapBuffers();
201 }
202 
waitNative()203 void waitNative(){}
204 
swapInterval(EGLNativeDisplayType dpy,EGLNativeSurfaceType win,int interval)205 void swapInterval(EGLNativeDisplayType dpy,EGLNativeSurfaceType win,int interval){
206     nsSwapInterval(&interval);
207 }
208 
createWindowSurface(EGLNativeWindowType wnd)209 EGLNativeSurfaceType createWindowSurface(EGLNativeWindowType wnd){
210     return (EGLNativeSurfaceType)wnd;
211 }
212 
createPixmapSurface(EGLNativePixmapType pix)213 EGLNativeSurfaceType createPixmapSurface(EGLNativePixmapType pix){
214     return (EGLNativeSurfaceType)pix;
215 }
216 
destroySurface(EGLNativeSurfaceType srfc)217 void destroySurface(EGLNativeSurfaceType srfc){
218 }
219 
getInternalDisplay(EGLNativeDisplayType dpy)220 EGLNativeInternalDisplayType getInternalDisplay(EGLNativeDisplayType dpy){
221     return (EGLNativeInternalDisplayType)dpy;
222 }
223 
deleteDisplay(EGLNativeInternalDisplayType idpy)224 void deleteDisplay(EGLNativeInternalDisplayType idpy){
225 }
226 
227 };
228