d3drtsurf=NULL;
external_driving=false;
dsallocator=NULL;
- filter_type=D3DTEXF_NONE;
+ filter_type=D3DTEXF_FORCE_DWORD;
lastrendertime=timeGetTime();
event = CreateEvent(NULL,/*FALSE*/TRUE,FALSE,NULL);
d3dmutex = CreateMutex(NULL,FALSE,NULL);
/* We have to determine which kind of filtering is supported*/
D3DCAPS9 caps;
d3ddevice->GetDeviceCaps(&caps);
- filter_type=D3DTEXF_NONE;
+ if ( ((caps.StretchRectFilterCaps & D3DPTFILTERCAPS_MINFLINEAR)!=0)
+ && ((caps.StretchRectFilterCaps & D3DPTFILTERCAPS_MAGFLINEAR)!=0)) {
+ if (filter_type==D3DTEXF_FORCE_DWORD) {
+ filter_type=D3DTEXF_LINEAR;
+ }
+ } else {
+ if (filter_type==D3DTEXF_LINEAR)
+ {
+ filter_type=D3DTEXF_POINT;
+ }
+ }
+
if ( ((caps.StretchRectFilterCaps & D3DPTFILTERCAPS_MINFPOINT)!=0)
&& ((caps.StretchRectFilterCaps & D3DPTFILTERCAPS_MAGFPOINT)!=0)) {
+ if (filter_type==D3DTEXF_FORCE_DWORD)
+ {
filter_type=D3DTEXF_POINT;
}
- if ( ((caps.StretchRectFilterCaps & D3DPTFILTERCAPS_MINFLINEAR)!=0)
- && ((caps.StretchRectFilterCaps & D3DPTFILTERCAPS_MAGFLINEAR)!=0)) {
- filter_type=D3DTEXF_LINEAR;
+ } else {
+ if (filter_type==D3DTEXF_POINT) {
+ filter_type=D3DTEXF_NONE;
}
+ }
+ if (filter_type==D3DTEXF_FORCE_DWORD) {
+ filter_type=D3DTEXF_NONE;
+ }
+
+
//Now we will create the Screen
screen = new SurfaceWin(Surface::SCREEN);
return 1;
}
+DWORD OsdWin::getFilterCaps()
+{
+ if (!initted) return NULL;
+ D3DCAPS9 caps;
+ d3ddevice->GetDeviceCaps(&caps);
+ return caps.StretchRectFilterCaps;
+}
int OsdWin::InitVertexBuffer() {
Video* video = Video::getInstance();
osdvertices[3].c=osdcolor;
osdvertices[3].x=0.f-0.5f;
osdvertices[3].y=((float)video->getScreenHeight())-0.5f;
- osdvertices[3].z=0;
+ osdvertices[3].z=0.5f;
osdvertices[3].rhw=1.f;
osdvertices[3].u=0.f;
osdvertices[3].v=texy;
InternalRendering(NULL);
lastrendertime=timeGetTime();
} else {
- Sleep(5); //Sleep for 5 ms, in order to avoid blocking the other threads
+ Sleep(5); //Sleep for 5 ms, in order to avoid blocking the other threads
}
} else {
DWORD time1=timeGetTime();
BeginPainting();
+ d3ddevice->SetRenderTarget(0,d3drtsurf);//Stupid VMR manipulates the render target
if (external_driving) {
//Copy video to Backbuffer
- if (present!=NULL) {
+ if (present!=NULL ) {
VideoWin* video =(VideoWin*) Video::getInstance();
/*calculating destination rect */
RECT destrect={0,0,video->getScreenWidth(),video->getScreenHeight()};
sourcerect.right=sourcerect.left+correction;
}
d3ddevice->StretchRect(present,&sourcerect,d3drtsurf ,&destrect,filter_type);
+
}
} else {
VideoWin* video =(VideoWin*) Video::getInstance();
d3ddevice->SetTexture(0,((SurfaceWin*)screen)->getD3dtexture());
//d3ddevice->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_MODULATE);
d3ddevice->SetTextureStageState(0, D3DTSS_ALPHAOP,D3DTOP_MODULATE);
+
+ d3ddevice->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR);
+ d3ddevice->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_LINEAR);
+
+
d3ddevice->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE);
d3ddevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
d3ddevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
d3ddevice->DrawPrimitive(D3DPT_TRIANGLEFAN,0,2);
d3ddevice->EndScene();
//Show it to the user!
- if (d3ddevice->Present(NULL,NULL,NULL,NULL)==D3DERR_DEVICELOST){
+ HRESULT hres;
+ if (hres=d3ddevice->Present(NULL,NULL,NULL,NULL)==D3DERR_DEVICELOST){
EndPainting();
if (!external_driving) DoLost();
}