]> git.vomp.tv Git - vompclient-marten.git/blob - osdopengl.cc
Add files specific for raspberry pi
[vompclient-marten.git] / osdopengl.cc
1 /*\r
2     Copyright 2004-2005 Chris Tallon, 2006,2011-2012 Marten Richter\r
3 \r
4     This file is part of VOMP.\r
5 \r
6     VOMP is free software; you can redistribute it and/or modify\r
7     it under the terms of the GNU General Public License as published by\r
8     the Free Software Foundation; either version 2 of the License, or\r
9     (at your option) any later version.\r
10 \r
11     VOMP is distributed in the hope that it will be useful,\r
12     but WITHOUT ANY WARRANTY; without even the implied warranty of\r
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
14     GNU General Public License for more details.\r
15 \r
16     You should have received a copy of the GNU General Public License\r
17     along with VOMP; if not, write to the Free Software\r
18     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\r
19 */\r
20 \r
21 \r
22 #include "osdopengl.h"\r
23 #include "mtd.h"\r
24 #include "videovpeogl.h"\r
25 #include "surfaceopengl.h"\r
26 \r
27 \r
28 #include "message.h"\r
29 #include "command.h"\r
30 \r
31 #include "shaders/generic__vertex_shader.h"\r
32 #include "shaders/osd__frag_shader.h"\r
33 \r
34 #define  BACKBUFFER_WIDTH 1920\r
35 #define  BACKBUFFER_HEIGHT 1080\r
36 \r
37 \r
38 \r
39 long long getTimeMS() {\r
40         struct timespec ts;\r
41         clock_gettime(CLOCK_MONOTONIC, &ts);\r
42         return ts.tv_sec*1000+ts.tv_nsec/1000000LL;\r
43 }\r
44 \r
45 \r
46 \r
47 OsdOpenGL::OsdOpenGL()\r
48 {\r
49   glmutex.Lock();\r
50 \r
51   external_driving=false;\r
52 \r
53   lastrendertime=getTimeMS();\r
54   display_height=0;\r
55   display_width=0;\r
56   osd_shader=0;\r
57   gen_shader=0;\r
58   osd_program=0;\r
59 \r
60 \r
61   \r
62 }\r
63 \r
64 OsdOpenGL::~OsdOpenGL()\r
65 {\r
66 \r
67   if (initted) \r
68   {\r
69           threadStop();\r
70                 shutdown();\r
71   }\r
72 \r
73 \r
74   glmutex.Unlock();\r
75 }\r
76 \r
77 int OsdOpenGL::getFD()\r
78 {\r
79   if (!initted) return 0;\r
80   return fdOsd;\r
81 }\r
82 \r
83 Surface * OsdOpenGL::createNewSurface() {\r
84         return (Surface*)new SurfaceOpenGL();\r
85 }\r
86 \r
87 int OsdOpenGL::init(void* device)\r
88 {\r
89   if (initted) return 0;\r
90   Video* video = Video::getInstance();\r
91    //window=*((HWND*)device);\r
92   \r
93    // May be this device specific part should go to a device specific child class\r
94 \r
95    //init broadcom chipset (Move to video?)\r
96    bcm_host_init();\r
97 \r
98    //First get connection to egl\r
99    egl_display=eglGetDisplay(EGL_DEFAULT_DISPLAY);\r
100 \r
101    if (egl_display==EGL_NO_DISPLAY) {\r
102            Log::getInstance()->log("OSD", Log::WARN, "Could not get egl display!",eglGetError());\r
103            return 0;\r
104    }\r
105 \r
106    if (eglInitialize(egl_display, NULL, NULL)==EGL_FALSE) {\r
107            Log::getInstance()->log("OSD", Log::WARN, "Initialising display failed! %d",eglGetError());\r
108            return 0;\r
109    }\r
110 \r
111    const EGLint attributs[]={\r
112                  EGL_RED_SIZE,8,EGL_GREEN_SIZE, 8,EGL_BLUE_SIZE, 8,EGL_ALPHA_SIZE, 8,\r
113          EGL_SURFACE_TYPE, EGL_WINDOW_BIT,\r
114          EGL_CONFORMANT, EGL_OPENGL_ES2_BIT,\r
115          EGL_NONE\r
116    }; // Here, we might have to select the resolution!\r
117 \r
118    EGLConfig ourconfig; //maybe accept more configs?\r
119    EGLint number;\r
120 \r
121    if (eglChooseConfig(egl_display, attributs, &ourconfig, 1, &number)==EGL_FALSE) {\r
122            Log::getInstance()->log("OSD", Log::WARN, "Choosing egl config failed! %d",eglGetError());\r
123            return 0;\r
124    }\r
125 \r
126    const EGLint attr_context[]={\r
127                    EGL_CONTEXT_CLIENT_VERSION,2,\r
128           EGL_NONE\r
129       };\r
130 \r
131    egl_context=eglCreateContext(egl_display,ourconfig,EGL_NO_CONTEXT,attr_context);\r
132    if (egl_context==EGL_NO_CONTEXT) {\r
133            Log::getInstance()->log("OSD", Log::WARN, "Creating egl context failed! %d",eglGetError());\r
134            return 0;\r
135    }\r
136 \r
137    // warning broadcom specific, get display size!\r
138    display_width=display_height=0;\r
139    if (graphics_get_display_size(0, &display_width, &display_height)<0) {\r
140            Log::getInstance()->log("OSD", Log::WARN, "Getting display size failed! (BCM API) ");\r
141            return 0;\r
142    }\r
143    Log::getInstance()->log("OSD", Log::NOTICE, "Displaysize is %d x %d ",display_width, display_height);\r
144    VC_RECT_T dst_rect ={0,0,display_width,display_height};\r
145    VC_RECT_T src_rect={0,0,display_width<<16,display_height<<16};\r
146    DISPMANX_DISPLAY_HANDLE_T bcm_display;\r
147    DISPMANX_ELEMENT_HANDLE_T bcm_element;\r
148    DISPMANX_UPDATE_HANDLE_T  bcm_update;\r
149 \r
150 \r
151    bcm_display=vc_dispmanx_display_open(0);\r
152    bcm_update=vc_dispmanx_update_start(0);\r
153    bcm_element=vc_dispmanx_element_add(bcm_update,bcm_display,\r
154          0,&dst_rect, 0,\r
155          &src_rect,DISPMANX_PROTECTION_NONE,0, 0, (DISPMANX_TRANSFORM_T) 0);\r
156 \r
157    vc_dispmanx_update_submit_sync(bcm_update);\r
158    static EGL_DISPMANX_WINDOW_T nativewindow;\r
159    nativewindow.element=bcm_element;\r
160    nativewindow.height=display_height;\r
161    nativewindow.width=display_width;\r
162 \r
163    egl_surface = eglCreateWindowSurface(egl_display,ourconfig, &nativewindow,NULL );\r
164    if (egl_surface==EGL_NO_SURFACE) {\r
165            Log::getInstance()->log("OSD", Log::WARN, "Creating egl window surface failed!");\r
166            return 0;\r
167    }\r
168 \r
169    if (eglMakeCurrent(egl_display, egl_surface, egl_surface, egl_context)== EGL_FALSE) {\r
170            Log::getInstance()->log("OSD", Log::WARN, "Making egl Current failed");\r
171                    return 0;\r
172    }\r
173    // Test stuff\r
174 \r
175 \r
176 \r
177   //Now we will create the Screen\r
178   screen = (Surface*) new SurfaceOpenGL(Surface::SCREEN);\r
179 \r
180   screen->create(video->getScreenWidth(), video->getScreenHeight());\r
181   screen->display();\r
182   initted = 1; // must set this here or create surface won't work\r
183 \r
184   //glGenBuffers(1, &vB);\r
185   //glGenBuffers(1, &iB);\r
186 \r
187   //Preparing the Shaders\r
188 \r
189   gen_shader=CreateShader(generic_vertex_shader, GL_VERTEX_SHADER);\r
190   osd_shader=CreateShader(osd_frag_shader, GL_FRAGMENT_SHADER);\r
191 \r
192 \r
193   osd_program=glCreateProgram();\r
194   if (osd_program==0) {\r
195           Log::getInstance()->log("OSD", Log::WARN, "Creating glsl program failed!%d",glGetError());\r
196       return 0;\r
197   }\r
198   glAttachShader(osd_program,gen_shader);\r
199   glAttachShader(osd_program,osd_shader);\r
200   glBindAttribLocation(osd_program,0,"vec_pos");\r
201   glBindAttribLocation(osd_program,1,"tex_coord");\r
202 \r
203   osd_sampler_loc=glGetUniformLocation(osd_program,"texture");\r
204 \r
205   glLinkProgram(osd_program);\r
206   GLint link_status;\r
207   glGetShaderiv(osd_program,GL_LINK_STATUS, &link_status);\r
208 \r
209   if (!link_status) {\r
210           char buffer[1024];\r
211           glGetProgramInfoLog(osd_program,1024,NULL,buffer);\r
212           Log::getInstance()->log("OSD", Log::WARN, "Compiling Programm failed!");\r
213           Log::getInstance()->log("OSD", Log::WARN, "%s",buffer);\r
214           glDeleteProgram(osd_program);\r
215           return 0;\r
216   }\r
217 \r
218   glClearColor(0.0f,0.0f,0.0f,1.f);\r
219 \r
220   eglMakeCurrent(egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT );\r
221   glmutex.Unlock();\r
222   threadStart();\r
223 \r
224   return 1;\r
225 }\r
226 \r
227 \r
228 GLuint OsdOpenGL::CreateShader(const GLchar * source, GLenum type)\r
229 {\r
230         GLuint ret_shad=0;\r
231 \r
232         ret_shad=glCreateShader(type);\r
233         if (ret_shad==0 ) {\r
234                 Log::getInstance()->log("OSD", Log::WARN, "Creating Shader failed! %d",glGetError());\r
235                 return 0;\r
236         }\r
237         glShaderSource(ret_shad,1,&source,NULL);\r
238         glCompileShader(ret_shad);\r
239         GLint comp_status;\r
240         glGetShaderiv(ret_shad,GL_COMPILE_STATUS, &comp_status);\r
241 \r
242         if (!comp_status) {\r
243                 char buffer[1024];\r
244                 Log::getInstance()->log("OSD", Log::WARN, "Compiling Shader failed!");\r
245                 glGetShaderInfoLog(ret_shad,1024,NULL,buffer);\r
246                 Log::getInstance()->log("OSD", Log::WARN, "%s",buffer);\r
247                 glDeleteShader(ret_shad);\r
248                 return 0;\r
249         }\r
250         return ret_shad;\r
251 }\r
252 \r
253         \r
254 void OsdOpenGL::InitVertexBuffer(float  scalex,float scaley)\r
255 {\r
256   Video* video=Video::getInstance();\r
257   float texx=((float)video->getScreenWidth())/1024.f;\r
258   float texy=((float)video->getScreenHeight())/1024.f;\r
259   OSDCOLOR osdcolor={1.f,1.f,1.f,1.f};\r
260 \r
261  // osdvertices[0].c=osdcolor;\r
262   osdvertices[0].x= (scalex);\r
263   osdvertices[0].y=-scaley;\r
264   osdvertices[0].z=0.5;\r
265   osdvertices[0].u=texx;\r
266   osdvertices[0].v=texy;\r
267  // osdvertices[1].c=osdcolor;\r
268   osdvertices[1].x=(scalex);\r
269   osdvertices[1].y=(scaley);\r
270   osdvertices[1].z=0.5f;\r
271   osdvertices[1].u=texx;\r
272   osdvertices[1].v=0.f;\r
273   //  osdvertices[0].c=osdcolor;\r
274   osdvertices[2].x=(-scalex);\r
275   osdvertices[2].y=-scaley;\r
276   osdvertices[2].z=0.5f;\r
277   osdvertices[2].u=0.f;\r
278   osdvertices[2].v=texy;\r
279  // osdvertices[3].c=osdcolor;\r
280   osdvertices[3].x=-scalex;\r
281   osdvertices[3].y=(scaley);\r
282   osdvertices[3].z=0.5f;\r
283   osdvertices[3].u=0.f;\r
284   osdvertices[3].v=0.f;\r
285   \r
286   osdindices[0]=0;\r
287   osdindices[1]=1;\r
288   osdindices[2]=2;\r
289   osdindices[3]=0;\r
290   osdindices[4]=2;\r
291   osdindices[5]=3;\r
292 \r
293 \r
294 \r
295 \r
296  // glBindBuffer(GL_ARRAY_BUFFER, vB);\r
297  // glBufferData(GL_ARRAY_BUFFER, sizeof(osdvertices), osdvertices, GL_STATIC_DRAW);\r
298 \r
299 \r
300  // glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, iB);\r
301   //glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(osdindices), osdindices, GL_STATIC_DRAW);\r
302 \r
303 \r
304 \r
305   return;\r
306 }\r
307 \r
308 int OsdOpenGL::shutdown()\r
309 {\r
310   if (!initted) return 0;\r
311   initted = 0;\r
312 \r
313 \r
314   if (osd_shader!=0) glDeleteShader(osd_shader);\r
315   if (gen_shader!=0) glDeleteShader(gen_shader);\r
316   if (osd_program!=0) glDeleteProgram(osd_program);\r
317 \r
318   glClear(GL_COLOR_BUFFER_BIT);\r
319   eglSwapBuffers(egl_display, egl_surface);\r
320   eglMakeCurrent(egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT );\r
321   eglDestroySurface(egl_display,egl_surface);\r
322   eglDestroyContext(egl_display,egl_context);\r
323   eglTerminate(egl_display );\r
324 \r
325   return 1;\r
326 }\r
327 \r
328 void OsdOpenGL::screenShot(const char* fileName)\r
329 {\r
330   screen->screenShot(fileName);\r
331 }\r
332 \r
333 void OsdOpenGL::threadMethod()\r
334 {\r
335         // We have to claim the gl context for this thread\r
336         //glmutex.Lock();\r
337 \r
338         //glmutex.Unlock();\r
339         while (true)\r
340         {\r
341                 unsigned int waittime=10;\r
342                 if (initted){\r
343                 //      if (evrstate==EVR_pres_off || evrstate==EVR_pres_pause)\r
344                 //      {\r
345                                 Render();\r
346                                 //TODO get surfaces from Video object\r
347         /*              } else if (evrstate==EVR_pres_started)\r
348                         {\r
349                                 LPDIRECT3DSURFACE9 surf;\r
350                                 if (dsallocator) dsallocator->GetNextSurface(&surf,&waittime);\r
351                                 if (surf==NULL)\r
352                                 {\r
353                                         Render();\r
354                                 }\r
355                                 else\r
356                                 {\r
357                                         RenderDS(surf);\r
358                                         surf->Release();\r
359                                         if (dsallocator) dsallocator->DiscardSurfaceandgetWait(&waittime);\r
360                                 }\r
361                         }*/\r
362                 }\r
363                 threadCheckExit();\r
364                 if (waittime!=0) MILLISLEEP(min(10,waittime));\r
365                 //Sleep(1);\r
366         }\r
367         //eglMakeCurrent(egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT );\r
368 }\r
369 \r
370 \r
371 void OsdOpenGL::threadPostStopCleanup()\r
372 {\r
373         //Doing nothing\r
374         //goo;\r
375 }\r
376 \r
377 \r
378 // This function is called from the WinMain function in order to get Screen updates\r
379 void OsdOpenGL::Render()\r
380 {\r
381         if (!initted) return ;\r
382         if (external_driving) {\r
383         long long time1=getTimeMS();\r
384 \r
385                 if ((time1-lastrendertime)>200) {//5 fps for OSD updates are enough, avoids tearing\r
386                         InternalRendering(NULL);\r
387                         lastrendertime=getTimeMS();\r
388         } else {\r
389                    //Sleep(5); //Sleep for 5 ms, in order to avoid blocking the other threads\r
390         }\r
391         } else {\r
392                 struct timespec ts;\r
393                 clock_gettime(CLOCK_MONOTONIC, &ts);\r
394                 long long time1=ts.tv_sec*1000+ts.tv_nsec/1000000LL;\r
395                 if ((time1-lastrendertime)>50) {//10 fps for OSD updates are enough, avoids tearing\r
396                         InternalRendering(NULL);\r
397                         lastrendertime=getTimeMS();\r
398                 } else {\r
399                         //Sleep(5);\r
400                 \r
401                 }\r
402                 \r
403         }\r
404 }\r
405 \r
406 void OsdOpenGL::RenderDS(GLuint  present){\r
407         if (!initted) return; \r
408         if (external_driving) {\r
409                 InternalRendering(present);\r
410                 lastrendertime=getTimeMS();\r
411         }\r
412 }\r
413 \r
414 \r
415 void OsdOpenGL::InternalRendering(GLuint  present){\r
416     BeginPainting();\r
417   /*  HRESULT losty=d3ddevice->TestCooperativeLevel();\r
418     if (losty==D3DERR_DEVICELOST) {\r
419         //Sleep(10);\r
420                 EndPainting();\r
421         return; //Device Lost\r
422     }\r
423     if (losty==D3DERR_DEVICENOTRESET){\r
424            EndPainting();\r
425        DoLost();\r
426        return;\r
427     }\r
428         WaitForSingleObject(event,INFINITE);\r
429         */\r
430    \r
431         \r
432 /*\r
433     LPDIRECT3DSURFACE9 targetsurf;\r
434         if (swappy)\r
435         {\r
436                 targetsurf=swapsurf;\r
437                 d3ddevice->SetRenderTarget(0,swapsurf);//Stupid VMR manipulates the render target\r
438         } \r
439         else\r
440         {\r
441                 targetsurf=d3drtsurf;\r
442                 d3ddevice->SetRenderTarget(0,d3drtsurf);//Stupid VMR manipulates the render target\r
443         }\r
444         D3DSURFACE_DESC targetdesc;\r
445         targetsurf->GetDesc(&targetdesc);\r
446 \r
447         if (external_driving) {\r
448                 //Copy video to Backbuffer\r
449                 if (present!=NULL ) {\r
450                         VideoWin* video =(VideoWin*) Video::getInstance();\r
451                         /*calculating destination rect *\r
452                         RECT destrect={0,0,/*video->getScreenWidth()* targetdesc.Width,\r
453                                 /*video->getScreenHeight()*targetdesc.Height};\r
454                         UCHAR mode=video->getMode();\r
455                         switch (mode) {\r
456                         case Video::EIGHTH:\r
457                         destrect.right=destrect.right/2;\r
458                         destrect.bottom=destrect.bottom/2;\r
459                         case Video::QUARTER:\r
460                         destrect.right=destrect.right/2+video->getPosx()*2;\r
461                         destrect.bottom=destrect.bottom/2+video->getPosy()*2;\r
462                         destrect.left=video->getPosx()*2;\r
463                         destrect.top=video->getPosy()*2;\r
464                         d3ddevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);\r
465                         break;\r
466                         };\r
467                         D3DSURFACE_DESC surf_desc;\r
468                         present->GetDesc(&surf_desc);//for chop sides\r
469                         RECT sourcerect= {0,0,surf_desc.Width,surf_desc.Height};\r
470                         if (video->getPseudoTVsize()==Video::ASPECT4X3 \r
471                                 && video->getMode()==Video::NORMAL \r
472                                 && video->getAspectRatio()==Video::ASPECT16X9) {\r
473                                         unsigned int correction=((double) (surf_desc.Width))*4.*9./3./16.;\r
474                                         sourcerect.left=(surf_desc.Width-correction)/2;\r
475                                         sourcerect.right=sourcerect.left+correction;\r
476                         }\r
477                         d3ddevice->StretchRect(present,&sourcerect,targetsurf ,&destrect,filter_type);\r
478 \r
479                 }\r
480         } else {\r
481                 VideoWin* video =(VideoWin*) Video::getInstance();\r
482                 //Clear Background\r
483                 if (!video->isVideoOn()) d3ddevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);\r
484         }*/\r
485 \r
486 \r
487         //InitVertexBuffer(display_width,display_height);\r
488     InitVertexBuffer(1.f,1.f);\r
489 \r
490 \r
491         glViewport(0, 0, display_width,display_height);\r
492 \r
493         glClear(GL_COLOR_BUFFER_BIT);\r
494         glUseProgram(osd_program);\r
495 \r
496         glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE,sizeof(OSDVERTEX), osdvertices);\r
497         glEnableVertexAttribArray(0);\r
498         glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE,sizeof(OSDVERTEX), &(osdvertices[0].u));\r
499         glEnableVertexAttribArray(1);\r
500 \r
501 \r
502 \r
503 \r
504         glActiveTexture(GL_TEXTURE0);\r
505         glBindTexture(GL_TEXTURE_2D,((SurfaceOpenGL*)screen)->getTexture());\r
506 \r
507         glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);\r
508         glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);\r
509 \r
510         glUniform1i(osd_sampler_loc,0);\r
511 \r
512         glEnable(GL_BLEND);\r
513         glBlendFuncSeparate (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA,GL_ZERO,GL_ONE);\r
514 \r
515 /*      glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE,sizeof(OSDVERTEX),\r
516                         (GLvoid*)(((char*)osdvertices)+3*sizeof(GLfloat)));\r
517         glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE,sizeof(OSDVERTEX),\r
518                         (GLvoid*)(((char*)osdvertices)+3*sizeof(GLfloat)+sizeof(OSDCOLOR)));*/\r
519         //glDisable(GL_LIGHTING);\r
520         //glEnable(GL_TEXTURE_2D);\r
521         //glEnable(GL_BLEND);\r
522     //glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);\r
523     //glDepthFunc(GL_ALWAYS);\r
524     //glDisable(GL_DEPTH_TEST);\r
525     //glDisable(GL_STENCIL_TEST);\r
526     //glDisable(GL_CULL_FACE);\r
527 \r
528 \r
529 \r
530 /*\r
531         glActiveTexture(GL_TEXTURE0);\r
532         glBindTexture(GL_TEXTURE_2D,((SurfaceOpenGL*)screen)->getTexture());\r
533         glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);\r
534         glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);*/\r
535 //      glUniform1i(mTextureUniformHandle, present);\r
536 \r
537 \r
538 \r
539         glDrawArrays(GL_TRIANGLE_STRIP, 0,  4);\r
540 \r
541         //glDrawElements(GL_TRIANGLES, sizeof(osdindices)/sizeof(osdindices[0]), GL_UNSIGNED_BYTE, 0);\r
542 \r
543 \r
544 \r
545 \r
546 /*      glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE,sizeof(OSDVERTEX), 0);\r
547         glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE,sizeof(OSDVERTEX),\r
548                                 (GLvoid*)(3*sizeof(GLfloat)));\r
549         glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE,sizeof(OSDVERTEX),\r
550                         (GLvoid*)(3*sizeof(GLfloat)+sizeof(OSDCOLOR)));*/\r
551 \r
552         //glDisable(GL_BLEND);\r
553         //glDisable(GL_TEXTURE_2D);\r
554         \r
555         //Show it to the user!\r
556         eglSwapBuffers(egl_display, egl_surface);\r
557 \r
558         EndPainting();\r
559 \r
560         \r
561 //      if (!external_driving) {\r
562 //              Sleep(4);//The User can wait for 4 milliseconds to see his changes\r
563 //      }\r
564 }\r
565 \r
566 bool OsdOpenGL::DoLost(){\r
567         /*\r
568         Log::getInstance()->log("OSD", Log::WARN, "Direct3D Device Lost! Reobtaining...");\r
569         ResetEvent(event);\r
570         if (external_driving && dsallocator!=NULL) {\r
571                 dsallocator->LostDevice(d3ddevice,d3d); //Propagate the information through DS\r
572         }\r
573         //First we free up all resources\r
574         Video* video = Video::getInstance();\r
575         ((SurfaceWin*)screen)->ReleaseSurface();\r
576         if (d3drtsurf) d3drtsurf->Release();\r
577     d3drtsurf=NULL;\r
578         D3DPRESENT_PARAMETERS d3dparas;\r
579         ZeroMemory(&d3dparas,sizeof(d3dparas));\r
580         d3dparas.BackBufferWidth=BACKBUFFER_WIDTH;\r
581         d3dparas.BackBufferHeight=BACKBUFFER_HEIGHT;\r
582         d3dparas.Windowed=TRUE;\r
583         d3dparas.SwapEffect=D3DSWAPEFFECT_COPY;\r
584 \r
585         if (swapsurf) {swapsurf->Release();swapsurf=NULL;};\r
586         if (swappy) {swappy->Release();swappy=NULL;};\r
587 \r
588         if (d3ddevice->Reset(&d3dparas)!=D3D_OK){\r
589                 return false;\r
590         }\r
591     d3ddevice->GetRenderTarget(0,&d3drtsurf);\r
592         if (d3ddevman) d3ddevman->ResetDevice(d3ddevice,dxvatoken);\r
593         //InitVertexBuffer();\r
594     //Redraw Views, Chris could you add a member function to BoxStack, so that\r
595         // I can cause it to completely redraw the Views?\r
596         // Otherwise the OSD would be distorted after Device Lost\r
597         // FIXME\r
598         \r
599         SetEvent(event);\r
600 \r
601 \r
602         screen->create(video->getScreenWidth(), video->getScreenHeight());\r
603         screen->display();*/\r
604         \r
605         return true;\r
606 \r
607 }\r
608 \r
609 \r
610 void OsdOpenGL::BeginPainting() {//We synchronize calls to d3d between different threads\r
611         glmutex.Lock();\r
612         if (initted) {\r
613                 if (eglMakeCurrent(egl_display, egl_surface, egl_surface, egl_context)== EGL_FALSE) {\r
614                         Log::getInstance()->log("OSD", Log::WARN, "Making egl Current failed in thread %d",eglGetError());\r
615                         return;\r
616                 }\r
617         }\r
618 }\r
619 \r
620 void OsdOpenGL::EndPainting() {\r
621         eglMakeCurrent(egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT );\r
622         glmutex.Unlock();\r
623 }\r
624 \r
625 void OsdOpenGL::setExternalDriving(/*DsAllocator* dsall,*/unsigned int  width, unsigned height) {\r
626         /*\r
627         if (swappy)\r
628         {\r
629                 BeginPainting();\r
630                 d3ddevice->StretchRect(swapsurf,NULL,d3drtsurf,NULL,filter_type);\r
631                 LPDIRECT3DSWAPCHAIN9 temp=swappy;\r
632                 LPDIRECT3DSURFACE9 tempsurf=swapsurf;\r
633                 swappy=NULL;\r
634                 swapsurf=NULL;\r
635                 EndPainting();\r
636                 tempsurf->Release();\r
637                 temp->Release();\r
638         }\r
639 \r
640         if (dsall==NULL) {\r
641                 external_driving=false;\r
642                 dsallocator=NULL;       \r
643                 return;\r
644         }\r
645         WaitForSingleObject(event,INFINITE);//We will only return if we are initted\r
646         BeginPainting();\r
647 \r
648         if (width>BACKBUFFER_WIDTH || height>BACKBUFFER_HEIGHT) \r
649         {\r
650                 D3DPRESENT_PARAMETERS d3dparas;\r
651                 ZeroMemory(&d3dparas,sizeof(d3dparas));\r
652                 d3dparas.BackBufferWidth=width;\r
653                 d3dparas.BackBufferHeight=height;\r
654                 d3dparas.Windowed=TRUE;\r
655                 d3dparas.SwapEffect=D3DSWAPEFFECT_COPY;\r
656                 if (d3ddevice->CreateAdditionalSwapChain(&d3dparas,&swappy)!=D3D_OK){\r
657                         Log::getInstance()->log("OSD", Log::WARN, "Could not create Swap Chain!");\r
658                         //return 0;\r
659                 } else {\r
660                         swappy->GetBackBuffer(0,D3DBACKBUFFER_TYPE_MONO,&swapsurf);\r
661                 }\r
662         Log::getInstance()->log("OSD", Log::INFO, "Create Additional Swap Chain %d %d!",width,height);\r
663         }\r
664 \r
665         dsallocator=dsall;\r
666         external_driving=true;\r
667         \r
668         EndPainting();*/\r
669 }\r
670 \r
671 void OsdOpenGL::Blank() {\r
672         BeginPainting();\r
673         glClearColor(0.15f, 0.25f, 0.35f, 1.0f); // change this to black after testing\r
674         glClear( GL_COLOR_BUFFER_BIT );\r
675         glClear( GL_DEPTH_BUFFER_BIT );\r
676         EndPainting();\r
677 }\r