]> git.vomp.tv Git - vompclient-marten.git/commitdiff
Switch to smaller OSD rendering buffer
authorMarten Richter <marten.richter@freenet.de>
Sat, 1 Sep 2012 08:31:08 +0000 (10:31 +0200)
committerMarten Richter <marten.richter@freenet.de>
Sat, 1 Sep 2012 08:31:08 +0000 (10:31 +0200)
osdopengl.cc
osdopengl.h [changed mode: 0755->0644]

index 545b5cba21b940e3c8ec7fbbc4cae0aa95c07163..6717f643dabf9887c3cadef77e22eff21ff48391 100644 (file)
@@ -29,8 +29,8 @@
 #include "command.h"\r
 \r
 \r
-#define  BACKBUFFER_WIDTH 1920\r
-#define  BACKBUFFER_HEIGHT 1080\r
+#define  BACKBUFFER_WIDTH 1280\r
+#define  BACKBUFFER_HEIGHT 720\r
 \r
 \r
 \r
@@ -151,7 +151,7 @@ int OsdOpenGL::init(void* device)
    }\r
    Log::getInstance()->log("OSD", Log::NOTICE, "Displaysize is %d x %d ",display_width, display_height);\r
    VC_RECT_T dst_rect ={0,0,display_width,display_height};\r
-   VC_RECT_T src_rect={0,0,display_width<<16,display_height<<16};\r
+   VC_RECT_T src_rect={0,0,BACKBUFFER_WIDTH <<16,BACKBUFFER_HEIGHT<<16};\r
    DISPMANX_DISPLAY_HANDLE_T bcm_display;\r
    DISPMANX_ELEMENT_HANDLE_T bcm_element;\r
    DISPMANX_UPDATE_HANDLE_T  bcm_update;\r
@@ -166,8 +166,8 @@ int OsdOpenGL::init(void* device)
    vc_dispmanx_update_submit_sync(bcm_update);\r
    static EGL_DISPMANX_WINDOW_T nativewindow;\r
    nativewindow.element=bcm_element;\r
-   nativewindow.height=display_height;\r
-   nativewindow.width=display_width;\r
+   nativewindow.height=BACKBUFFER_HEIGHT;\r
+   nativewindow.width=BACKBUFFER_WIDTH;\r
 \r
    egl_surface = eglCreateWindowSurface(egl_display,egl_ourconfig, &nativewindow,NULL );\r
    if (egl_surface==EGL_NO_SURFACE) {\r
@@ -231,75 +231,6 @@ int OsdOpenGL::init(void* device)
          return 0;\r
   }\r
 \r
- /* gen_shader=CreateShader(generic_vertex_shader, GL_VERTEX_SHADER);\r
-  osd_shader=CreateShader(osd_frag_shader, GL_FRAGMENT_SHADER);\r
-\r
-  // Create the program for osd rendering\r
-  osd_program=glCreateProgram();\r
-  if (osd_program==0) {\r
-         Log::getInstance()->log("OSD", Log::WARN, "Creating glsl program failed!%d",glGetError());\r
-      return 0;\r
-  }\r
-  glAttachShader(osd_program,gen_shader);\r
-  glAttachShader(osd_program,osd_shader);\r
-  glBindAttribLocation(osd_program,0,"vec_pos");\r
-  glBindAttribLocation(osd_program,1,"tex_coord");\r
-\r
-\r
-\r
-  glLinkProgram(osd_program);\r
-\r
-\r
-\r
-  GLint link_status;\r
-  glGetProgramiv(osd_program,GL_LINK_STATUS, &link_status);\r
-\r
-  if (!link_status) {\r
-         char buffer[1024];\r
-         glGetProgramInfoLog(osd_program,1024,NULL,buffer);\r
-         Log::getInstance()->log("OSD", Log::WARN, "Compiling Programm failed!");\r
-         Log::getInstance()->log("OSD", Log::WARN, "%s",buffer);\r
-         glDeleteProgram(osd_program);\r
-         return 0;\r
-  }\r
-\r
-  osd_sampler_loc=glGetUniformLocation(osd_program,"texture");\r
- //   Log::getInstance()->log("OSD", Log::WARN, "uniform location %x %x",osd_sampler_loc,glGetError());\r
-\r
-  // create the program for yuv frame rendering\r
-  frame_shader=CreateShader(frame_frag_shader, GL_FRAGMENT_SHADER);\r
-\r
-  frame_program=glCreateProgram();\r
-  if (frame_program==0) {\r
-         Log::getInstance()->log("OSD", Log::WARN, "Creating glsl program failed!%d",glGetError());\r
-      return 0;\r
-  }\r
-  glAttachShader(frame_program,gen_shader);\r
-  glAttachShader(frame_program,frame_shader);\r
-  glBindAttribLocation(frame_program,0,"vec_pos");\r
-  glBindAttribLocation(frame_program,1,"tex_coord");\r
-\r
-\r
-\r
-  glLinkProgram(frame_program);\r
-  //GLint link_status;\r
-  glGetProgramiv(frame_program,GL_LINK_STATUS, &link_status);\r
-\r
-  if (!link_status) {\r
-         char buffer[1024];\r
-         glGetProgramInfoLog(frame_program,1024,NULL,buffer);\r
-         Log::getInstance()->log("OSD", Log::WARN, "Compiling Programm failed!");\r
-         Log::getInstance()->log("OSD", Log::WARN, "%s",buffer);\r
-         glDeleteProgram(frame_program);\r
-         return 0;\r
-  }\r
-\r
-  frame_sampler_locY=glGetUniformLocation(frame_program,"textureY");\r
- // Log::getInstance()->log("OSD", Log::WARN, "uniform location %x %x",frame_sampler_locY,glGetError());\r
-  frame_sampler_locU=glGetUniformLocation(frame_program,"textureU");\r
-  //Log::getInstance()->log("OSD", Log::WARN, "uniform location %x %x",frame_sampler_locU,glGetError());\r
-   frame_sampler_locV=glGetUniformLocation(frame_program,"textureV");\r
-*/\r
 \r
 \r
   glClearColor(0.0f,0.0f,0.0f,1.f);\r
@@ -361,18 +292,6 @@ void OsdOpenGL::InitVertexBuffer(float  scalex,float scaley)
   osdindices[4]=2;\r
   osdindices[5]=3;\r
 \r
-\r
-\r
-\r
- // glBindBuffer(GL_ARRAY_BUFFER, vB);\r
- // glBufferData(GL_ARRAY_BUFFER, sizeof(osdvertices), osdvertices, GL_STATIC_DRAW);\r
-\r
-\r
- // glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, iB);\r
-  //glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(osdindices), osdindices, GL_STATIC_DRAW);\r
-\r
-\r
-\r
   return;\r
 }\r
 \r
@@ -467,162 +386,23 @@ void OsdOpenGL::threadPostStopCleanup()
        //goo;\r
 }\r
 \r
-/*\r
-// This function is called from the WinMain function in order to get Screen updates\r
-void OsdOpenGL::Render()\r
-{\r
-       if (!initted) return ;\r
-       VPEOGLFrame* frame=NULL;\r
-       if (external_driving) {\r
-        long long time1=getTimeMS();\r
-               if ((time1-lastrendertime)>200) {//5 fps for OSD updates are enough, avoids tearing\r
-                       InternalRendering(NULL);\r
-                       lastrendertime=getTimeMS();\r
-        } else {\r
-                  //Sleep(5); //Sleep for 5 ms, in order to avoid blocking the other threads\r
-        }\r
-       } else {\r
-               struct timespec ts;\r
-               clock_gettime(CLOCK_MONOTONIC, &ts);\r
-               long long time1=ts.tv_sec*1000+ts.tv_nsec/1000000LL;\r
-               if ((time1-lastrendertime)>100) {//10 fps for OSD updates are enough, avoids tearing\r
-                       InternalRendering(NULL);\r
-                       lastrendertime=getTimeMS();\r
-               } else {\r
-                       //Sleep(5);\r
-               \r
-               }\r
-               \r
-       }\r
-}\r
-\r
-void OsdOpenGL::RenderDS(VPEOGLFrame* frame){\r
-       if (!initted) return; \r
-       if (external_driving) {\r
-               InternalRendering(frame);\r
-               lastrendertime=getTimeMS();\r
-       }\r
-}*/\r
 \r
 \r
 void OsdOpenGL::InternalRendering(VPEOGLFrame* frame){\r
     BeginPainting();\r
-  /*  HRESULT losty=d3ddevice->TestCooperativeLevel();\r
-    if (losty==D3DERR_DEVICELOST) {\r
-        //Sleep(10);\r
-               EndPainting();\r
-        return; //Device Lost\r
-    }\r
-    if (losty==D3DERR_DEVICENOTRESET){\r
-          EndPainting();\r
-       DoLost();\r
-       return;\r
-    }\r
-       WaitForSingleObject(event,INFINITE);\r
-       */\r
-   \r
-       \r
-/*\r
-    LPDIRECT3DSURFACE9 targetsurf;\r
-       if (swappy)\r
-       {\r
-               targetsurf=swapsurf;\r
-               d3ddevice->SetRenderTarget(0,swapsurf);//Stupid VMR manipulates the render target\r
-       } \r
-       else\r
-       {\r
-               targetsurf=d3drtsurf;\r
-               d3ddevice->SetRenderTarget(0,d3drtsurf);//Stupid VMR manipulates the render target\r
-       }\r
-       D3DSURFACE_DESC targetdesc;\r
-       targetsurf->GetDesc(&targetdesc);\r
-\r
-       if (external_driving) {\r
-               //Copy video to Backbuffer\r
-               if (present!=NULL ) {\r
-                       VideoWin* video =(VideoWin*) Video::getInstance();\r
-                       /*calculating destination rect *\r
-                       RECT destrect={0,0,/*video->getScreenWidth()* targetdesc.Width,\r
-                               /*video->getScreenHeight()*targetdesc.Height};\r
-                       UCHAR mode=video->getMode();\r
-                       switch (mode) {\r
-                       case Video::EIGHTH:\r
-                       destrect.right=destrect.right/2;\r
-                       destrect.bottom=destrect.bottom/2;\r
-                       case Video::QUARTER:\r
-                       destrect.right=destrect.right/2+video->getPosx()*2;\r
-                       destrect.bottom=destrect.bottom/2+video->getPosy()*2;\r
-                       destrect.left=video->getPosx()*2;\r
-                       destrect.top=video->getPosy()*2;\r
-                       d3ddevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);\r
-                       break;\r
-                       };\r
-                       D3DSURFACE_DESC surf_desc;\r
-                       present->GetDesc(&surf_desc);//for chop sides\r
-                       RECT sourcerect= {0,0,surf_desc.Width,surf_desc.Height};\r
-                       if (video->getPseudoTVsize()==Video::ASPECT4X3 \r
-                               && video->getMode()==Video::NORMAL \r
-                               && video->getAspectRatio()==Video::ASPECT16X9) {\r
-                                       unsigned int correction=((double) (surf_desc.Width))*4.*9./3./16.;\r
-                                       sourcerect.left=(surf_desc.Width-correction)/2;\r
-                                       sourcerect.right=sourcerect.left+correction;\r
-                       }\r
-                       d3ddevice->StretchRect(present,&sourcerect,targetsurf ,&destrect,filter_type);\r
 \r
-               }\r
-       } else {\r
-               VideoWin* video =(VideoWin*) Video::getInstance();\r
-               //Clear Background\r
-               if (!video->isVideoOn()) d3ddevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);\r
-       }*/\r
 \r
 \r
        //InitVertexBuffer(display_width,display_height);\r
     InitVertexBuffer(1.f,1.f);\r
 \r
 \r
-       glViewport(0, 0, display_width,display_height);\r
+       glViewport(0, 0, BACKBUFFER_WIDTH ,BACKBUFFER_HEIGHT);\r
 \r
        glClearColor(0.0f,0.0f,0.0f,1.f);\r
        glClear(GL_COLOR_BUFFER_BIT);\r
 \r
-\r
-\r
-\r
-\r
        if (frame) {\r
-               //Log::getInstance()->log("OSD", Log::WARN, "mark1 glerror %x",glGetError());\r
-       /*      glUseProgram(frame_program);\r
-               //Log::getInstance()->log("OSD", Log::WARN, "mark1 glerror %x",glGetError());\r
-               glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE,sizeof(OSDVERTEX), osdvertices);\r
-               glEnableVertexAttribArray(0);\r
-               glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE,sizeof(OSDVERTEX), &(osdvertices[0].u));\r
-               glEnableVertexAttribArray(1);\r
-\r
-\r
-               //Log::getInstance()->log("OSD", Log::WARN, "mark2 glerror %x",glGetError());\r
-\r
-\r
-               glActiveTexture(GL_TEXTURE2);\r
-               glBindTexture(GL_TEXTURE_2D,frame->textures[2]);\r
-               glUniform1i(frame_sampler_locV,2);\r
-               glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);\r
-               glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);\r
-\r
-\r
-               glActiveTexture(GL_TEXTURE1);\r
-               glBindTexture(GL_TEXTURE_2D,frame->textures[1]);\r
-               glUniform1i(frame_sampler_locU,1);\r
-               glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);\r
-               glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);\r
-\r
-\r
-               glActiveTexture(GL_TEXTURE0);\r
-               glBindTexture(GL_TEXTURE_2D,frame->textures[0]);\r
-               glUniform1i(frame_sampler_locY,0);\r
-               glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);\r
-               glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);*/\r
-\r
                switch (frame->type) {\r
                case 1:\r
                        yuv400_shader.PrepareRendering(frame->textures[0],frame->textures[1],frame->textures[2]);break;\r
@@ -649,20 +429,7 @@ void OsdOpenGL::InternalRendering(VPEOGLFrame* frame){
        }\r
 \r
 \r
-       /*glUseProgram(osd_program);\r
-       glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE,sizeof(OSDVERTEX), osdvertices);\r
-       glEnableVertexAttribArray(0);\r
-       glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE,sizeof(OSDVERTEX), &(osdvertices[0].u));\r
-       glEnableVertexAttribArray(1);\r
-\r
-\r
-       glActiveTexture(GL_TEXTURE0);\r
-       glBindTexture(GL_TEXTURE_2D,((SurfaceOpenGL*)screen)->getTexture());\r
-\r
-       glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);\r
-       glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);\r
 \r
-       glUniform1i(osd_sampler_loc,0);*/\r
 \r
        osd_shader.PrepareRendering(((SurfaceOpenGL*)screen)->getTexture());\r
 \r
@@ -703,53 +470,10 @@ void OsdOpenGL::InternalRendering(VPEOGLFrame* frame){
 #endif\r
 \r
        \r
-//     if (!external_driving) {\r
-//             Sleep(4);//The User can wait for 4 milliseconds to see his changes\r
-//     }\r
-}\r
 \r
-bool OsdOpenGL::DoLost(){\r
-       /*\r
-       Log::getInstance()->log("OSD", Log::WARN, "Direct3D Device Lost! Reobtaining...");\r
-       ResetEvent(event);\r
-       if (external_driving && dsallocator!=NULL) {\r
-               dsallocator->LostDevice(d3ddevice,d3d); //Propagate the information through DS\r
-       }\r
-       //First we free up all resources\r
-       Video* video = Video::getInstance();\r
-       ((SurfaceWin*)screen)->ReleaseSurface();\r
-       if (d3drtsurf) d3drtsurf->Release();\r
-    d3drtsurf=NULL;\r
-       D3DPRESENT_PARAMETERS d3dparas;\r
-       ZeroMemory(&d3dparas,sizeof(d3dparas));\r
-       d3dparas.BackBufferWidth=BACKBUFFER_WIDTH;\r
-       d3dparas.BackBufferHeight=BACKBUFFER_HEIGHT;\r
-       d3dparas.Windowed=TRUE;\r
-       d3dparas.SwapEffect=D3DSWAPEFFECT_COPY;\r
-\r
-       if (swapsurf) {swapsurf->Release();swapsurf=NULL;};\r
-       if (swappy) {swappy->Release();swappy=NULL;};\r
-\r
-       if (d3ddevice->Reset(&d3dparas)!=D3D_OK){\r
-               return false;\r
-       }\r
-    d3ddevice->GetRenderTarget(0,&d3drtsurf);\r
-       if (d3ddevman) d3ddevman->ResetDevice(d3ddevice,dxvatoken);\r
-       //InitVertexBuffer();\r
-    //Redraw Views, Chris could you add a member function to BoxStack, so that\r
-       // I can cause it to completely redraw the Views?\r
-       // Otherwise the OSD would be distorted after Device Lost\r
-       // FIXME\r
-       \r
-       SetEvent(event);\r
+}\r
 \r
 \r
-       screen->create(video->getScreenWidth(), video->getScreenHeight());\r
-       screen->display();*/\r
-       \r
-       return true;\r
-\r
-}\r
 \r
 \r
 void OsdOpenGL::BeginPainting() {//We synchronize calls to d3d between different threads\r
@@ -767,51 +491,7 @@ void OsdOpenGL::EndPainting() {
        glmutex.Unlock();\r
 }\r
 \r
-void OsdOpenGL::setExternalDriving(/*DsAllocator* dsall,*/unsigned int  width, unsigned height) {\r
-       /*\r
-       if (swappy)\r
-       {\r
-               BeginPainting();\r
-               d3ddevice->StretchRect(swapsurf,NULL,d3drtsurf,NULL,filter_type);\r
-               LPDIRECT3DSWAPCHAIN9 temp=swappy;\r
-               LPDIRECT3DSURFACE9 tempsurf=swapsurf;\r
-               swappy=NULL;\r
-               swapsurf=NULL;\r
-               EndPainting();\r
-               tempsurf->Release();\r
-               temp->Release();\r
-       }\r
-\r
-       if (dsall==NULL) {\r
-               external_driving=false;\r
-               dsallocator=NULL;       \r
-               return;\r
-       }\r
-       WaitForSingleObject(event,INFINITE);//We will only return if we are initted\r
-       BeginPainting();\r
 \r
-       if (width>BACKBUFFER_WIDTH || height>BACKBUFFER_HEIGHT) \r
-       {\r
-               D3DPRESENT_PARAMETERS d3dparas;\r
-               ZeroMemory(&d3dparas,sizeof(d3dparas));\r
-               d3dparas.BackBufferWidth=width;\r
-               d3dparas.BackBufferHeight=height;\r
-               d3dparas.Windowed=TRUE;\r
-               d3dparas.SwapEffect=D3DSWAPEFFECT_COPY;\r
-               if (d3ddevice->CreateAdditionalSwapChain(&d3dparas,&swappy)!=D3D_OK){\r
-                       Log::getInstance()->log("OSD", Log::WARN, "Could not create Swap Chain!");\r
-                       //return 0;\r
-               } else {\r
-                       swappy->GetBackBuffer(0,D3DBACKBUFFER_TYPE_MONO,&swapsurf);\r
-               }\r
-        Log::getInstance()->log("OSD", Log::INFO, "Create Additional Swap Chain %d %d!",width,height);\r
-       }\r
-\r
-       dsallocator=dsall;\r
-       external_driving=true;\r
-       \r
-       EndPainting();*/\r
-}\r
 \r
 void OsdOpenGL::Blank() {\r
        BeginPainting();\r
old mode 100755 (executable)
new mode 100644 (file)
index 75288f2..e2446e3
@@ -83,15 +83,9 @@ class OsdOpenGL : public Osd, public Thread_TYPE
     Surface * createNewSurface();\r
 \r
 \r
-\r
-\r
-       // This function is called from the threadMethod function in order to get Screen updates\r
-/*     void Render();\r
-       void RenderDS(VPEOGLFrame* frame);*/\r
        void BeginPainting();\r
        void EndPainting();\r
 \r
-       void setExternalDriving(/*DsAllocator* dsall,*/ unsigned int width, unsigned int height);\r
        void Blank();\r
 \r
        void getEGLObjs(EGLDisplay *i_egl_display,EGLSurface *i_egl_surface,EGLContext *i_egl_context, EGLConfig *i_egl_config){\r
@@ -121,25 +115,10 @@ private:
        Mutex glmutex;\r
        long long  lastrendertime;\r
        void InternalRendering(VPEOGLFrame* frame);\r
-       bool DoLost();\r
        void InitVertexBuffer(float  scalex,float scaley);\r
        OSDVERTEX osdvertices[4];\r
        GLubyte osdindices[6];\r
 \r
-\r
-/*     GLuint osd_shader;\r
-       GLuint gen_shader;\r
-\r
-       GLuint osd_program;\r
-\r
-       GLuint frame_shader;\r
-       GLuint frame_program;\r
-\r
-       GLint frame_sampler_locY;\r
-       GLint frame_sampler_locU;\r
-       GLint frame_sampler_locV;\r
-\r
-       GLint osd_sampler_loc;*/\r
        GLOsdShader osd_shader;\r
        GLYuv400Shader yuv400_shader;\r
        GLYuv444Shader yuv444_shader;\r