#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
}\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
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
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
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
//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
}\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
#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
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