void RENDER_Init(Section * sec) { Section_prop * section=static_cast<Section_prop *>(sec); //For restarting the renderer. static bool running = false; bool aspect = render.aspect; render.pal.first=256; render.pal.last=0; render.aspect=section->Get_bool("aspect"); render.frameskip.max=section->Get_int("frameskip"); render.frameskip.count=0; //If something changed that needs a ReInit // Only ReInit when there is a src.bpp (fixes crashes on startup and directly changing the scaler without a screen specified yet) if(running && render.src.bpp && render.aspect != aspect) RENDER_CallBack( GFX_CallBackReset ); if(!running) render.updating=true; running = true; MAPPER_AddHandler(DecreaseFrameSkip,MK_f7,MMOD1,"decfskip","Dec Fskip"); MAPPER_AddHandler(IncreaseFrameSkip,MK_f8,MMOD1,"incfskip","Inc Fskip"); GFX_SetTitle(-1,render.frameskip.max,false); }
void DOSBox_NoMenu(void) { #if DOSBOXMENU_TYPE == DOSBOXMENU_SDLDRAW /* FIXME: SDL menu is NOT AVAILABLE if OpenGL surface is used */ { menu.toggle=false; mainMenu.showMenu(false); mainMenu.setRedraw(); GFX_ResetScreen(); } #endif #if DOSBOXMENU_TYPE == DOSBOXMENU_NSMENU void sdl_hax_macosx_setmenu(void *nsMenu); sdl_hax_macosx_setmenu(NULL); #endif #if DOSBOXMENU_TYPE == DOSBOXMENU_HMENU if(!menu.gui) return; menu.toggle=false; NonUserResizeCounter=1; SDL1_hax_SetMenu(NULL); mainMenu.get_item("mapper_togmenu").check(!menu.toggle).refresh_item(mainMenu); RENDER_CallBack( GFX_CallBackReset ); void DOSBox_SetSysMenu(void); DOSBox_SetSysMenu(); #endif }
// Sets the scaler to use. void SetScaler(scalerOperation_t op, Bitu size, std::string prefix) { auto value = prefix + (render.scale.forced ? " forced" : ""); SetVal("render", "scaler", value); render.scale.size = size; render.scale.op = op; RENDER_CallBack(GFX_CallBackReset); }
void DOSBox_SetMenu(void) { #if DOSBOXMENU_TYPE == DOSBOXMENU_SDLDRAW /* FIXME: SDL menu is NOT AVAILABLE if OpenGL surface is used */ { menu.toggle=true; mainMenu.showMenu(); mainMenu.setRedraw(); GFX_ResetScreen(); } #endif #if DOSBOXMENU_TYPE == DOSBOXMENU_NSMENU /* TODO: Move to menu.cpp DOSBox_SetMenu() and add setmenu(NULL) to DOSBox_NoMenu() @emendelson request showmenu=false */ void sdl_hax_macosx_setmenu(void *nsMenu); sdl_hax_macosx_setmenu(mainMenu.getNsMenu()); #endif #if DOSBOXMENU_TYPE == DOSBOXMENU_HMENU if(!menu.gui) return; if (MainMenu == NULL) return; LOG(LOG_MISC,LOG_DEBUG)("Win32: loading and attaching menu resource to DOSBox's window"); menu.toggle=true; NonUserResizeCounter=1; SDL1_hax_SetMenu(MainMenu); mainMenu.get_item("mapper_togmenu").check(!menu.toggle).refresh_item(mainMenu); Reflect_Menu(); if(menu.startup) { RENDER_CallBack( GFX_CallBackReset ); } void DOSBox_SetSysMenu(void); DOSBox_SetSysMenu(); #endif }
// Draw a textured quad on the back-buffer bool CDirect3D::D3DSwapBuffers(void) { HRESULT hr; UINT uPasses; if (backbuffer_clear_countdown > 0) { backbuffer_clear_countdown--; pD3DDevice9->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); } #if DOSBOXMENU_TYPE == DOSBOXMENU_SDLDRAW // If the SDL drawn menus are visible, copy the SDL surface to the Direct3D surface to keep them visible on-screen if (mainMenu.isVisible() && mainMenu.menuBox.h != 0 && dwY >= mainMenu.menuBox.h) UpdateRectFromSDLSurface(0, 0, mainMenu.menuBox.w, mainMenu.menuBox.h); #endif // begin rendering pD3DDevice9->BeginScene(); #if C_D3DSHADERS /* PS 2.0 path */ if(psActive) { if(preProcess) { // Set preprocess matrices if(FAILED(psEffect->SetMatrices(m_matPreProj, m_matPreView, m_matPreWorld))) { LOG_MSG("D3D:Set matrices failed."); return false; } // Save render target LPDIRECT3DSURFACE9 lpRenderTarget; pD3DDevice9->GetRenderTarget(0, &lpRenderTarget); LPDIRECT3DTEXTURE9 lpWorkTexture = lpWorkTexture1; pass2: // Change the render target LPDIRECT3DSURFACE9 lpNewRenderTarget; lpWorkTexture->GetSurfaceLevel(0, &lpNewRenderTarget); if(FAILED(pD3DDevice9->SetRenderTarget(0, lpNewRenderTarget))) { LOG_MSG("D3D:Failed to set render target"); return false; } SAFE_RELEASE(lpNewRenderTarget); uPasses = 0; if(FAILED(psEffect->Begin((lpWorkTexture==lpWorkTexture1) ? (ScalingEffect::Preprocess1):(ScalingEffect::Preprocess2), &uPasses))) { LOG_MSG("D3D:Failed to begin PS"); return false; } for(UINT uPass=0;uPass<uPasses;uPass++) { hr=psEffect->BeginPass(uPass); if(FAILED(hr)) { LOG_MSG("D3D:Failed to begin pass %d", uPass); return false; } // Render the vertex buffer contents pD3DDevice9->DrawPrimitive(D3DPT_TRIANGLESTRIP, 4, 2); psEffect->EndPass(); } if(FAILED(psEffect->End())) { LOG_MSG("D3D:Failed to end effect"); return false; } #if DEBUG_PS // Save rendertarget data LPDIRECT3DSURFACE9 lpTexRenderTarget; lpWorkTexture->GetSurfaceLevel(0, &lpTexRenderTarget); lpDebugTexture->GetSurfaceLevel(0, &lpNewRenderTarget); if(FAILED(hr=pD3DDevice9->GetRenderTargetData(lpTexRenderTarget, lpNewRenderTarget))) { LOG_MSG("D3D:Unable to get render target data: 0x%x", hr); SAFE_RELEASE(lpTexRenderTarget); SAFE_RELEASE(lpNewRenderTarget); } else { SAFE_RELEASE(lpTexRenderTarget); SAFE_RELEASE(lpNewRenderTarget); LOG_MSG("D3D:Got render target data, writing debug file (%dx%d)", dwTexWidth, dwTexHeight); if(lpDebugTexture->LockRect(0, &d3dlr, NULL, D3DLOCK_READONLY) == D3D_OK) { FILE * debug = fopen(((lpWorkTexture==lpWorkTexture1)?"pass1.raw":"pass2.raw"), "wb"); if(debug == NULL) { LOG_MSG("D3D:Unable to create file!"); } else { for(int i = 0; i < dwTexHeight; i++) { Bit8u * ptr = (Bit8u*)d3dlr.pBits; for(int j = 0; j < dwTexWidth; j++) { fwrite(ptr, 3, sizeof(char), debug); ptr += 4; } d3dlr.pBits = (Bit8u*)d3dlr.pBits + d3dlr.Pitch; } fclose(debug); } lpDebugTexture->UnlockRect(0); } d3dlr.pBits = NULL; } #endif if((psEffect->hasPreprocess2()) && (lpWorkTexture == lpWorkTexture1)) { lpWorkTexture = lpWorkTexture2; goto pass2; } // Reset the rendertarget pD3DDevice9->SetRenderTarget(0, lpRenderTarget); SAFE_RELEASE(lpRenderTarget); // Set matrices for final pass if(FAILED(psEffect->SetMatrices(m_matProj, m_matView, m_matWorld))) { LOG_MSG("D3D:Set matrices failed."); return false; } } uPasses = 0; if(FAILED(psEffect->Begin(ScalingEffect::Combine, &uPasses))) { LOG_MSG("D3D:Failed to begin PS"); return false; } for(UINT uPass=0;uPass<uPasses;uPass++) { hr=psEffect->BeginPass(uPass); if(FAILED(hr)) { LOG_MSG("D3D:Failed to begin pass %d", uPass); return false; } // Render the vertex buffer contents pD3DDevice9->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); psEffect->EndPass(); } if(FAILED(psEffect->End())) { LOG_MSG("D3D:Failed to end effect"); return false; } } else #endif { // Normal path pD3DDevice9->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); } // end rendering pD3DDevice9->EndScene(); if(GCC_UNLIKELY(hr=pD3DDevice9->Present(NULL, NULL, NULL, NULL)) != D3D_OK) { switch(hr) { case D3DERR_DEVICELOST: LOG_MSG("D3D:Driver device lost"); if (!deviceLost) { deviceLost = true; void RENDER_CallBack(GFX_CallBackFunctions_t f); RENDER_CallBack(GFX_CallBackRedraw); } return false; break; case D3DERR_DRIVERINTERNALERROR: LOG_MSG("D3D:Driver internal error"); return false; break; case D3DERR_INVALIDCALL: default: LOG_MSG("D3D:Invalid call"); return false; break; } } return true; }
void RENDER_Init(Section * sec) { Section_prop * section=static_cast<Section_prop *>(sec); //For restarting the renderer. static bool running = false; bool aspect = render.aspect; Bitu scalersize = render.scale.size; bool scalerforced = render.scale.forced; scalerOperation_t scaleOp = render.scale.op; render.pal.first=256; render.pal.last=0; render.aspect=section->Get_bool("aspect"); render.frameskip.max=section->Get_int("frameskip"); render.frameskip.count=0; std::string cline; std::string scaler; //Check for commandline paramters and parse them through the configclass so they get checked against allowed values if (control->cmdline->FindString("-scaler",cline,false)) { section->HandleInputline(std::string("scaler=") + cline); } else if (control->cmdline->FindString("-forcescaler",cline,false)) { section->HandleInputline(std::string("scaler=") + cline + " forced"); } Prop_multival* prop = section->Get_multival("scaler"); scaler = prop->GetSection()->Get_string("type"); std::string f = prop->GetSection()->Get_string("force"); render.scale.forced = false; if(f == "forced") render.scale.forced = true; if (scaler == "none") { render.scale.op = scalerOpNormal;render.scale.size = 1; } else if (scaler == "normal2x") { render.scale.op = scalerOpNormal;render.scale.size = 2; } else if (scaler == "normal3x") { render.scale.op = scalerOpNormal;render.scale.size = 3; } #if RENDER_USE_ADVANCED_SCALERS>2 else if (scaler == "advmame2x") { render.scale.op = scalerOpAdvMame;render.scale.size = 2; } else if (scaler == "advmame3x") { render.scale.op = scalerOpAdvMame;render.scale.size = 3; } else if (scaler == "advinterp2x") { render.scale.op = scalerOpAdvInterp;render.scale.size = 2; } else if (scaler == "advinterp3x") { render.scale.op = scalerOpAdvInterp;render.scale.size = 3; } else if (scaler == "hq2x") { render.scale.op = scalerOpHQ;render.scale.size = 2; } else if (scaler == "hq3x") { render.scale.op = scalerOpHQ;render.scale.size = 3; } else if (scaler == "2xsai") { render.scale.op = scalerOpSaI;render.scale.size = 2; } else if (scaler == "super2xsai") { render.scale.op = scalerOpSuperSaI;render.scale.size = 2; } else if (scaler == "supereagle") { render.scale.op = scalerOpSuperEagle;render.scale.size = 2; } #endif #if RENDER_USE_ADVANCED_SCALERS>0 else if (scaler == "tv2x") { render.scale.op = scalerOpTV;render.scale.size = 2; } else if (scaler == "tv3x") { render.scale.op = scalerOpTV;render.scale.size = 3; } else if (scaler == "rgb2x"){ render.scale.op = scalerOpRGB;render.scale.size = 2; } else if (scaler == "rgb3x"){ render.scale.op = scalerOpRGB;render.scale.size = 3; } else if (scaler == "scan2x"){ render.scale.op = scalerOpScan;render.scale.size = 2; } else if (scaler == "scan3x"){ render.scale.op = scalerOpScan;render.scale.size = 3; } #endif //If something changed that needs a ReInit // Only ReInit when there is a src.bpp (fixes crashes on startup and directly changing the scaler without a screen specified yet) if(running && render.src.bpp && ((render.aspect != aspect) || (render.scale.op != scaleOp) || (render.scale.size != scalersize) || (render.scale.forced != scalerforced) || render.scale.forced)) RENDER_CallBack( GFX_CallBackReset ); if(!running) render.updating=true; running = true; MAPPER_AddHandler(DecreaseFrameSkip,MK_f7,MMOD1,"decfskip","Dec Fskip"); MAPPER_AddHandler(IncreaseFrameSkip,MK_f8,MMOD1,"incfskip","Inc Fskip"); GFX_SetTitle(-1,render.frameskip.max,false); }
void RENDER_Init(Section * sec) { Section_prop * section=static_cast<Section_prop *>(sec); vga.draw.linewise_set=true; vga.draw.doublescan_set=section->Get_bool("doublescan"); vga.draw.char9_set=section->Get_bool("char9"); //For restarting the renderer. static bool running = false; bool aspect = render.aspect; Bitu scalersize = render.scale.size; bool scalerforced = render.scale.forced; scalerOperation_t scaleOp = render.scale.op; render.pal.first=0; render.pal.last=255; render.aspect=section->Get_bool("aspect"); render.frameskip.max=section->Get_int("frameskip"); /* BUG FIX: Some people's dosbox.conf files have frameskip=-1 WTF?? */ /* without this fix, nothing displays, EVER */ if ((int)render.frameskip.max < 0) render.frameskip.max = 0; render.frameskip.count=0; render.forceUpdate=false; std::string cline; std::string scaler; //Check for commandline paramters and parse them through the configclass so they get checked against allowed values if (control->cmdline->FindString("-scaler",cline,false)) { section->HandleInputline(std::string("scaler=") + cline); } else if (control->cmdline->FindString("-forcescaler",cline,false)) { section->HandleInputline(std::string("scaler=") + cline + " forced"); } Prop_multival* prop = section->Get_multival("scaler"); scaler = prop->GetSection()->Get_string("type"); std::string f = prop->GetSection()->Get_string("force"); render.scale.forced = false; if(f == "forced") render.scale.forced = true; if (scaler == "none") { render.scale.op = scalerOpNormal; render.scale.size = 1; render.scale.hardware=false; } else if (scaler == "normal2x") { render.scale.op = scalerOpNormal; render.scale.size = 2; render.scale.hardware=false; } else if (scaler == "normal3x") { render.scale.op = scalerOpNormal; render.scale.size = 3; render.scale.hardware=false; } else if (scaler == "normal4x") { render.scale.op = scalerOpNormal; render.scale.size = 4; render.scale.hardware=false; } else if (scaler == "normal5x") { render.scale.op = scalerOpNormal; render.scale.size = 5; render.scale.hardware=false; } #if RENDER_USE_ADVANCED_SCALERS>2 else if (scaler == "advmame2x") { render.scale.op = scalerOpAdvMame; render.scale.size = 2; render.scale.hardware=false; } else if (scaler == "advmame3x") { render.scale.op = scalerOpAdvMame; render.scale.size = 3; render.scale.hardware=false; } else if (scaler == "advinterp2x") { render.scale.op = scalerOpAdvInterp; render.scale.size = 2; render.scale.hardware=false; } else if (scaler == "advinterp3x") { render.scale.op = scalerOpAdvInterp; render.scale.size = 3; render.scale.hardware=false; } else if (scaler == "hq2x") { render.scale.op = scalerOpHQ; render.scale.size = 2; render.scale.hardware=false; } else if (scaler == "hq3x") { render.scale.op = scalerOpHQ; render.scale.size = 3; render.scale.hardware=false; } else if (scaler == "2xsai") { render.scale.op = scalerOpSaI; render.scale.size = 2; render.scale.hardware=false; } else if (scaler == "super2xsai") { render.scale.op = scalerOpSuperSaI; render.scale.size = 2; render.scale.hardware=false; } else if (scaler == "supereagle") { render.scale.op = scalerOpSuperEagle; render.scale.size = 2; render.scale.hardware=false; } #endif #if RENDER_USE_ADVANCED_SCALERS>0 else if (scaler == "tv2x") { render.scale.op = scalerOpTV; render.scale.size = 2; render.scale.hardware=false; } else if (scaler == "tv3x") { render.scale.op = scalerOpTV; render.scale.size = 3; render.scale.hardware=false; } else if (scaler == "rgb2x"){ render.scale.op = scalerOpRGB; render.scale.size = 2; render.scale.hardware=false; } else if (scaler == "rgb3x"){ render.scale.op = scalerOpRGB; render.scale.size = 3; render.scale.hardware=false; } else if (scaler == "scan2x"){ render.scale.op = scalerOpScan; render.scale.size = 2; render.scale.hardware=false; } else if (scaler == "scan3x"){ render.scale.op = scalerOpScan; render.scale.size = 3; render.scale.hardware=false; } #endif else if (scaler == "hardware_none") { render.scale.op = scalerOpNormal; render.scale.size = 1; render.scale.hardware=true; } else if (scaler == "hardware2x") { render.scale.op = scalerOpNormal; render.scale.size = 4; render.scale.hardware=true; } else if (scaler == "hardware3x") { render.scale.op = scalerOpNormal; render.scale.size = 6; render.scale.hardware=true; } else if (scaler == "hardware4x") { render.scale.op = scalerOpNormal; render.scale.size = 8; render.scale.hardware=true; } else if (scaler == "hardware5x") { render.scale.op = scalerOpNormal; render.scale.size = 10; render.scale.hardware=true; } render.autofit=section->Get_bool("autofit"); //If something changed that needs a ReInit // Only ReInit when there is a src.bpp (fixes crashes on startup and directly changing the scaler without a screen specified yet) if(running && render.src.bpp && ((render.aspect != aspect) || (render.scale.op != scaleOp) || (render.scale.size != scalersize) || (render.scale.forced != scalerforced) || render.scale.forced)) RENDER_CallBack( GFX_CallBackReset ); if(!running) render.updating=true; running = true; MAPPER_AddHandler(DecreaseFrameSkip,MK_f7,MMOD1,"decfskip","Dec Fskip"); MAPPER_AddHandler(IncreaseFrameSkip,MK_f8,MMOD1,"incfskip","Inc Fskip"); VGA_TweakUserVsyncOffset(0.0f); GFX_SetTitle(-1,render.frameskip.max,-1,false); }
// Sets the scaler 'forced' flag. void SetScaleForced(bool forced) { render.scale.forced = forced; RENDER_CallBack(GFX_CallBackReset); mainMenu.get_item("scaler_forced").check(render.scale.forced).refresh_item(mainMenu); }