示例#1
0
        public DisplayManager(PresentationPanel presentationPanel)
        {
            GL = GlobalWin.GL;
            this.presentationPanel = presentationPanel;
            GraphicsControl = this.presentationPanel.GraphicsControl;
            CR_GraphicsControl = GlobalWin.GLManager.GetContextForGraphicsControl(GraphicsControl);

            //it's sort of important for these to be initialized to something nonzero
            currEmuWidth = currEmuHeight = 1;

            if (GL is BizHawk.Bizware.BizwareGL.Drivers.OpenTK.IGL_TK)
                Renderer = new GuiRenderer(GL);
            else if (GL is BizHawk.Bizware.BizwareGL.Drivers.SlimDX.IGL_SlimDX9)
                Renderer = new GuiRenderer(GL);
            else
                Renderer = new GDIPlusGuiRenderer((BizHawk.Bizware.BizwareGL.Drivers.GdiPlus.IGL_GdiPlus)GL);

            VideoTextureFrugalizer = new TextureFrugalizer(GL);

            ShaderChainFrugalizers = new RenderTargetFrugalizer[16]; //hacky hardcoded limit.. need some other way to manage these
            for (int i = 0; i < 16; i++)
            {
                ShaderChainFrugalizers[i] = new RenderTargetFrugalizer(GL);
            }

            using (var xml = typeof(Program).Assembly.GetManifestResourceStream("BizHawk.Client.EmuHawk.Resources.courier16px.fnt"))
            using (var tex = typeof(Program).Assembly.GetManifestResourceStream("BizHawk.Client.EmuHawk.Resources.courier16px_0.png"))
                TheOneFont = new StringRenderer(GL, xml, tex);

            using (var gens = typeof(Program).Assembly.GetManifestResourceStream("BizHawk.Client.EmuHawk.Resources.gens.ttf"))
                LoadCustomFont(gens);
            using (var fceux = typeof(Program).Assembly.GetManifestResourceStream("BizHawk.Client.EmuHawk.Resources.fceux.ttf"))
                LoadCustomFont(fceux);

            if (GL is BizHawk.Bizware.BizwareGL.Drivers.OpenTK.IGL_TK || GL is BizHawk.Bizware.BizwareGL.Drivers.SlimDX.IGL_SlimDX9)
            {
                var fiHq2x = new FileInfo(Path.Combine(PathManager.GetExeDirectoryAbsolute(), "Shaders/BizHawk/hq2x.cgp"));
                if (fiHq2x.Exists)
                    using (var stream = fiHq2x.OpenRead())
                        ShaderChain_hq2x = new Filters.RetroShaderChain(GL, new Filters.RetroShaderPreset(stream), Path.Combine(PathManager.GetExeDirectoryAbsolute(), "Shaders/BizHawk"));
                var fiScanlines = new FileInfo(Path.Combine(PathManager.GetExeDirectoryAbsolute(), "Shaders/BizHawk/BizScanlines.cgp"));
                if (fiScanlines.Exists)
                    using (var stream = fiScanlines.OpenRead())
                        ShaderChain_scanlines = new Filters.RetroShaderChain(GL, new Filters.RetroShaderPreset(stream), Path.Combine(PathManager.GetExeDirectoryAbsolute(), "Shaders/BizHawk"));
                string bicubic_path = "Shaders/BizHawk/bicubic-fast.cgp";
                if(GL is BizHawk.Bizware.BizwareGL.Drivers.SlimDX.IGL_SlimDX9)
                    bicubic_path = "Shaders/BizHawk/bicubic-normal.cgp";
                var fiBicubic = new FileInfo(Path.Combine(PathManager.GetExeDirectoryAbsolute(), bicubic_path));
                if (fiBicubic.Exists)
                    using (var stream = fiBicubic.Open(FileMode.Open, FileAccess.Read, FileShare.Read))
                        ShaderChain_bicubic = new Filters.RetroShaderChain(GL, new Filters.RetroShaderPreset(stream), Path.Combine(PathManager.GetExeDirectoryAbsolute(), "Shaders/BizHawk"));
            }

            LuaSurfaceSets["emu"] = new SwappableDisplaySurfaceSet();
            LuaSurfaceSets["native"] = new SwappableDisplaySurfaceSet();
            LuaSurfaceFrugalizers["emu"] = new TextureFrugalizer(GL);
            LuaSurfaceFrugalizers["native"] = new TextureFrugalizer(GL);

            RefreshUserShader();
        }
示例#2
0
        public DisplayManager(PresentationPanel presentationPanel)
        {
            GL = GlobalWin.GL;
            this.presentationPanel = presentationPanel;
            GraphicsControl        = this.presentationPanel.GraphicsControl;
            CR_GraphicsControl     = GlobalWin.GLManager.GetContextForGraphicsControl(GraphicsControl);

            //it's sort of important for these to be initialized to something nonzero
            currEmuWidth = currEmuHeight = 1;

            Renderer = new GuiRenderer(GL);

            VideoTextureFrugalizer = new TextureFrugalizer(GL);

            ShaderChainFrugalizers = new RenderTargetFrugalizer[16];             //hacky hardcoded limit.. need some other way to manage these
            for (int i = 0; i < 16; i++)
            {
                ShaderChainFrugalizers[i] = new RenderTargetFrugalizer(GL);
            }

            using (var xml = typeof(Program).Assembly.GetManifestResourceStream("BizHawk.Client.EmuHawk.Resources.courier16px.fnt"))
                using (var tex = typeof(Program).Assembly.GetManifestResourceStream("BizHawk.Client.EmuHawk.Resources.courier16px_0.png"))
                    TheOneFont = new StringRenderer(GL, xml, tex);

            var fiHq2x = new FileInfo(Path.Combine(PathManager.GetExeDirectoryAbsolute(), "Shaders/BizHawk/hq2x.cgp"));

            if (fiHq2x.Exists)
            {
                using (var stream = fiHq2x.OpenRead())
                    ShaderChain_hq2x = new Filters.RetroShaderChain(GL, new Filters.RetroShaderPreset(stream), Path.Combine(PathManager.GetExeDirectoryAbsolute(), "Shaders/BizHawk"));
            }
            var fiScanlines = new FileInfo(Path.Combine(PathManager.GetExeDirectoryAbsolute(), "Shaders/BizHawk/BizScanlines.cgp"));

            if (fiScanlines.Exists)
            {
                using (var stream = fiScanlines.OpenRead())
                    ShaderChain_scanlines = new Filters.RetroShaderChain(GL, new Filters.RetroShaderPreset(stream), Path.Combine(PathManager.GetExeDirectoryAbsolute(), "Shaders/BizHawk"));
            }
            var fiBicubic = new FileInfo(Path.Combine(PathManager.GetExeDirectoryAbsolute(), "Shaders/BizHawk/bicubic-fast.cgp"));

            if (fiBicubic.Exists)
            {
                using (var stream = fiBicubic.OpenRead())
                    ShaderChain_bicubic = new Filters.RetroShaderChain(GL, new Filters.RetroShaderPreset(stream), Path.Combine(PathManager.GetExeDirectoryAbsolute(), "Shaders/BizHawk"));
            }

            LuaSurfaceSets["emu"]           = new SwappableDisplaySurfaceSet();
            LuaSurfaceSets["native"]        = new SwappableDisplaySurfaceSet();
            LuaSurfaceFrugalizers["emu"]    = new TextureFrugalizer(GL);
            LuaSurfaceFrugalizers["native"] = new TextureFrugalizer(GL);

            RefreshUserShader();
        }
示例#3
0
        public DisplayManager(
            Config config,
            IEmulator emulator,
            InputManager inputManager,
            IMovieSession movieSession,
            IGL gl,
            PresentationPanel presentationPanel,
            Func <bool> getIsSecondaryThrottlingDisabled)
            : base(config, emulator, inputManager, movieSession, gl.DispMethodEnum(), gl, gl.CreateRenderer())
        {
            _presentationPanel = presentationPanel;
            _getIsSecondaryThrottlingDisabled = getIsSecondaryThrottlingDisabled;

            // setup the GL context manager, needed for coping with multiple opengl cores vs opengl display method
            // but is it tho? --yoshi
            // turns out it was, calling Instance getter here initialises it, and the encapsulated Activate call is necessary too --yoshi
            _crGraphicsControl = GLManager.Instance.GetContextForGraphicsControl(_graphicsControl);
        }
示例#4
0
		public DisplayManager(PresentationPanel presentationPanel)
		{
			GL = GlobalWin.GL;
			this.presentationPanel = presentationPanel;
			GraphicsControl = this.presentationPanel.GraphicsControl;
			CR_GraphicsControl = GlobalWin.GLManager.GetContextForGraphicsControl(GraphicsControl);

			//it's sort of important for these to be initialized to something nonzero
			currEmuWidth = currEmuHeight = 1;

			Renderer = new GuiRenderer(GL);

			VideoTextureFrugalizer = new TextureFrugalizer(GL);

			ShaderChainFrugalizers = new RenderTargetFrugalizer[16]; //hacky hardcoded limit.. need some other way to manage these
			for (int i = 0; i < 16; i++)
			{
				ShaderChainFrugalizers[i] = new RenderTargetFrugalizer(GL);
			}

			using (var xml = typeof(Program).Assembly.GetManifestResourceStream("BizHawk.Client.EmuHawk.Resources.courier16px.fnt"))
			using (var tex = typeof(Program).Assembly.GetManifestResourceStream("BizHawk.Client.EmuHawk.Resources.courier16px_0.png"))
				TheOneFont = new StringRenderer(GL, xml, tex);

			var fiHq2x = new FileInfo(Path.Combine(PathManager.GetExeDirectoryAbsolute(),"Shaders/BizHawk/hq2x.cgp"));
			if(fiHq2x.Exists)
				using(var stream = fiHq2x.OpenRead())
					ShaderChain_hq2x = new Filters.RetroShaderChain(GL, new Filters.RetroShaderPreset(stream), Path.Combine(PathManager.GetExeDirectoryAbsolute(), "Shaders/BizHawk"));
			var fiScanlines = new FileInfo(Path.Combine(PathManager.GetExeDirectoryAbsolute(), "Shaders/BizHawk/BizScanlines.cgp"));
			if (fiScanlines.Exists)
				using (var stream = fiScanlines.OpenRead())
					ShaderChain_scanlines = new Filters.RetroShaderChain(GL, new Filters.RetroShaderPreset(stream), Path.Combine(PathManager.GetExeDirectoryAbsolute(), "Shaders/BizHawk"));
			var fiBicubic = new FileInfo(Path.Combine(PathManager.GetExeDirectoryAbsolute(), "Shaders/BizHawk/bicubic-fast.cgp"));
			if (fiBicubic.Exists)
				using (var stream = fiBicubic.OpenRead())
					ShaderChain_bicubic = new Filters.RetroShaderChain(GL, new Filters.RetroShaderPreset(stream), Path.Combine(PathManager.GetExeDirectoryAbsolute(), "Shaders/BizHawk"));

			LuaSurfaceSets["emu"] = new SwappableDisplaySurfaceSet();
			LuaSurfaceSets["native"] = new SwappableDisplaySurfaceSet();
			LuaSurfaceFrugalizers["emu"] = new TextureFrugalizer(GL);
			LuaSurfaceFrugalizers["native"] = new TextureFrugalizer(GL);

			RefreshUserShader();
		}
示例#5
0
        public MainForm(string[] args)
        {
            GlobalWin.MainForm = this;
            Global.Rewinder = new Rewinder
            {
                MessageCallback = GlobalWin.OSD.AddMessage
            };

            Global.ControllerInputCoalescer = new ControllerInputCoalescer();
            Global.FirmwareManager = new FirmwareManager();
            Global.MovieSession = new MovieSession
            {
                Movie = MovieService.DefaultInstance,
                MovieControllerAdapter = MovieService.DefaultInstance.LogGeneratorInstance().MovieControllerAdapter,
                MessageCallback = GlobalWin.OSD.AddMessage,
                AskYesNoCallback = StateErrorAskUser,
                PauseCallback = PauseEmulator,
                ModeChangedCallback = SetMainformMovieInfo
            };

            new AutoResetEvent(false);
            Icon = Properties.Resources.logo;
            InitializeComponent();
            Global.Game = GameInfo.NullInstance;
            if (Global.Config.ShowLogWindow)
            {
                LogConsole.ShowConsole();
                DisplayLogWindowMenuItem.Checked = true;
            }

            _throttle = new Throttle();

            Global.CheatList = new CheatCollection();
            Global.CheatList.Changed += ToolHelpers.UpdateCheatRelatedTools;

            UpdateStatusSlots();
            UpdateKeyPriorityIcon();

            // In order to allow late construction of this database, we hook up a delegate here to dearchive the data and provide it on demand
            // we could background thread this later instead if we wanted to be real clever
            NES.BootGodDB.GetDatabaseBytes = () =>
            {
                using (var NesCartFile =
                        new HawkFile(Path.Combine(PathManager.GetExeDirectoryAbsolute(), "gamedb", "NesCarts.7z")).BindFirst())
                {
                    return NesCartFile
                        .GetStream()
                        .ReadAllBytes();
                }
            };

            // TODO - replace this with some kind of standard dictionary-yielding parser in a separate component
            string cmdRom = null;
            string cmdLoadState = null;
            string cmdMovie = null;
            string cmdDumpType = null;
            string cmdDumpName = null;
            bool startFullscreen = false;
            for (int i = 0; i < args.Length; i++)
            {
                // For some reason sometimes visual studio will pass this to us on the commandline. it makes no sense.
                if (args[i] == ">")
                {
                    i++;
                    var stdout = args[i];
                    Console.SetOut(new StreamWriter(stdout));
                    continue;
                }

                var arg = args[i].ToLower();
                if (arg.StartsWith("--load-slot="))
                {
                    cmdLoadState = arg.Substring(arg.IndexOf('=') + 1);
                }
                else if (arg.StartsWith("--movie="))
                {
                    cmdMovie = arg.Substring(arg.IndexOf('=') + 1);
                }
                else if (arg.StartsWith("--dump-type="))
                {
                    cmdDumpType = arg.Substring(arg.IndexOf('=') + 1);
                }
                else if (arg.StartsWith("--dump-frames="))
                {
                    var list = arg.Substring(arg.IndexOf('=') + 1);
                    var items = list.Split(',');
                    _currAviWriterFrameList = new HashSet<int>();
                    for (int j = 0; j < items.Length; j++)
                        _currAviWriterFrameList.Add(int.Parse(items[j]));
                    //automatically set dump length to maximum frame
                    _autoDumpLength = _currAviWriterFrameList.OrderBy(x => x).Last();
                }
                else if (arg.StartsWith("--dump-name="))
                {
                    cmdDumpName = arg.Substring(arg.IndexOf('=') + 1);
                }
                else if (arg.StartsWith("--dump-length="))
                {
                    int.TryParse(arg.Substring(arg.IndexOf('=') + 1), out _autoDumpLength);
                }
                else if (arg.StartsWith("--dump-close"))
                {
                    _autoCloseOnDump = true;
                }
                else if (arg.StartsWith("--chromeless"))
                {
                    _chromeless = true;
                }
                else if (arg.StartsWith("--fullscreen"))
                {
                    startFullscreen = true;
                }
                else
                {
                    cmdRom = arg;
                }
            }

            Database.LoadDatabase(Path.Combine(PathManager.GetExeDirectoryAbsolute(), "gamedb", "gamedb.txt"));

            //TODO GL - a lot of disorganized wiring-up here
            PresentationPanel = new PresentationPanel();
            GlobalWin.DisplayManager = new DisplayManager(PresentationPanel);
            Controls.Add(PresentationPanel);
            Controls.SetChildIndex(PresentationPanel, 0);

            //TODO GL - move these event handlers somewhere less obnoxious line in the On* overrides
            Load += (o, e) =>
            {
                AllowDrop = true;
                DragEnter += FormDragEnter;
                DragDrop += FormDragDrop;
            };

            Closing += (o, e) =>
            {
                if (GlobalWin.Tools.AskSave())
                {
                    CloseGame();
                    Global.MovieSession.Movie.Stop();
                    GlobalWin.Tools.Close();
                    SaveConfig();
                }
                else
                {
                    e.Cancel = true;
                }
            };

            ResizeBegin += (o, e) =>
            {
                _inResizeLoop = true;
                if (GlobalWin.Sound != null)
                {
                    GlobalWin.Sound.StopSound();
                }
            };

            Resize += (o, e) =>
            {
                SetWindowText();
            };

            ResizeEnd += (o, e) =>
            {
                _inResizeLoop = false;
                SetWindowText();

                if (PresentationPanel != null)
                {
                    PresentationPanel.Resized = true;
                }

                if (GlobalWin.Sound != null)
                {
                    GlobalWin.Sound.StartSound();
                }
            };

            Input.Initialize();
            InitControls();

            var comm = CreateCoreComm();
            CoreFileProvider.SyncCoreCommInputSignals(comm);
            Global.Emulator = new NullEmulator(comm, Global.Config.GetCoreSettings<NullEmulator>());
            Global.ActiveController = new Controller(NullEmulator.NullController);
            Global.AutoFireController = Global.AutofireNullControls;
            Global.AutofireStickyXORAdapter.SetOnOffPatternFromConfig();
            try { GlobalWin.Sound = new Sound(Handle); }
            catch
            {
                string message = "Couldn't initialize sound device! Try changing the output method in Sound config.";
                if (Global.Config.SoundOutputMethod == Config.ESoundOutputMethod.DirectSound)
                    message = "Couldn't initialize DirectSound! Things may go poorly for you. Try changing your sound driver to 44.1khz instead of 48khz in mmsys.cpl.";
                MessageBox.Show(message, "Initialization Error", MessageBoxButtons.OK, MessageBoxIcon.Error);

                Global.Config.SoundOutputMethod = Config.ESoundOutputMethod.Dummy;
                GlobalWin.Sound = new Sound(Handle);
            }
            GlobalWin.Sound.StartSound();
            InputManager.RewireInputChain();
            GlobalWin.Tools = new ToolManager(this);
            RewireSound();

            // Workaround for windows, location is -32000 when minimized, if they close it during this time, that's what gets saved
            if (Global.Config.MainWndx == -32000)
            {
                Global.Config.MainWndx = 0;
            }

            if (Global.Config.MainWndy == -32000)
            {
                Global.Config.MainWndy = 0;
            }

            if (Global.Config.MainWndx != -1 && Global.Config.MainWndy != -1 && Global.Config.SaveWindowPosition)
            {
                Location = new Point(Global.Config.MainWndx, Global.Config.MainWndy);
            }

            if (cmdRom != null)
            {
                // Commandline should always override auto-load
                LoadRom(cmdRom);
                if (Global.Game == null)
                {
                    MessageBox.Show("Failed to load " + cmdRom + " specified on commandline");
                }
            }
            else if (Global.Config.RecentRoms.AutoLoad && !Global.Config.RecentRoms.Empty)
            {
                LoadRomFromRecent(Global.Config.RecentRoms.MostRecent);
            }

            if (cmdMovie != null)
            {
                if (Global.Game == null)
                {
                    OpenRom();
                }
                else
                {
                    var movie = MovieService.Get(cmdMovie);
                    Global.MovieSession.ReadOnly = true;

                    // if user is dumping and didnt supply dump length, make it as long as the loaded movie
                    if (_autoDumpLength == 0)
                    {
                        _autoDumpLength = movie.InputLogLength;
                    }

                    StartNewMovie(movie, false);
                    Global.Config.RecentMovies.Add(cmdMovie);
                }
            }
            else if (Global.Config.RecentMovies.AutoLoad && !Global.Config.RecentMovies.Empty)
            {
                if (Global.Game.IsNullInstance)
                {
                    OpenRom();
                }

                // If user picked a game, then do the autoload logic
                if (!Global.Game.IsNullInstance)
                {

                    if (File.Exists(Global.Config.RecentMovies.MostRecent))
                    {
                        StartNewMovie(MovieService.Get(Global.Config.RecentMovies.MostRecent), false);
                    }
                    else
                    {
                        Global.Config.RecentMovies.HandleLoadError(Global.Config.RecentMovies.MostRecent);
                    }
                }
            }

            if (startFullscreen || Global.Config.StartFullscreen)
            {
                ToggleFullscreen();
            }

            if (cmdLoadState != null && !Global.Game.IsNullInstance)
            {
                LoadQuickSave("QuickSave" + cmdLoadState);
            }
            else if (Global.Config.AutoLoadLastSaveSlot && !Global.Game.IsNullInstance)
            {
                LoadQuickSave("QuickSave" + Global.Config.SaveSlot);
            }

            GlobalWin.Tools.AutoLoad();

            if (Global.Config.RecentWatches.AutoLoad)
            {
                GlobalWin.Tools.LoadRamWatch(!Global.Config.DisplayRamWatch);
            }

            if (Global.Config.RecentCheats.AutoLoad)
            {
                GlobalWin.Tools.Load<Cheats>();
            }

            if (Global.Config.DisplayStatusBar == false)
            {
                MainStatusBar.Visible = false;
            }
            else
            {
                DisplayStatusBarMenuItem.Checked = true;
            }

            if (Global.Config.StartPaused)
            {
                PauseEmulator();
            }

            // start dumping, if appropriate
            if (cmdDumpType != null && cmdDumpName != null)
            {
                RecordAv(cmdDumpType, cmdDumpName);
            }

            SetMainformMovieInfo();

            SynchChrome();

            //TODO POOP
            PresentationPanel.Control.Paint += (o, e) =>
            {
                GlobalWin.DisplayManager.NeedsToPaint = true;
            };
        }
示例#6
0
        public DisplayManager(PresentationPanel presentationPanel)
        {
            GL = GlobalWin.GL;
            this.presentationPanel = presentationPanel;
            GraphicsControl        = this.presentationPanel.GraphicsControl;
            CR_GraphicsControl     = GlobalWin.GLManager.GetContextForGraphicsControl(GraphicsControl);

            //it's sort of important for these to be initialized to something nonzero
            currEmuWidth = currEmuHeight = 1;

            if (GL is BizHawk.Bizware.BizwareGL.Drivers.OpenTK.IGL_TK)
            {
                Renderer = new GuiRenderer(GL);
            }
            else if (GL is BizHawk.Bizware.BizwareGL.Drivers.SlimDX.IGL_SlimDX9)
            {
                Renderer = new GuiRenderer(GL);
            }
            else
            {
                Renderer = new GDIPlusGuiRenderer((BizHawk.Bizware.BizwareGL.Drivers.GdiPlus.IGL_GdiPlus)GL);
            }

            VideoTextureFrugalizer = new TextureFrugalizer(GL);

            ShaderChainFrugalizers = new RenderTargetFrugalizer[16];             //hacky hardcoded limit.. need some other way to manage these
            for (int i = 0; i < 16; i++)
            {
                ShaderChainFrugalizers[i] = new RenderTargetFrugalizer(GL);
            }

            using (var xml = typeof(Program).Assembly.GetManifestResourceStream("BizHawk.Client.EmuHawk.Resources.courier16px.fnt"))
                using (var tex = typeof(Program).Assembly.GetManifestResourceStream("BizHawk.Client.EmuHawk.Resources.courier16px_0.png"))
                    TheOneFont = new StringRenderer(GL, xml, tex);

            using (var gens = typeof(Program).Assembly.GetManifestResourceStream("BizHawk.Client.EmuHawk.Resources.gens.ttf"))
                LoadCustomFont(gens);
            using (var fceux = typeof(Program).Assembly.GetManifestResourceStream("BizHawk.Client.EmuHawk.Resources.fceux.ttf"))
                LoadCustomFont(fceux);

            if (GL is BizHawk.Bizware.BizwareGL.Drivers.OpenTK.IGL_TK || GL is BizHawk.Bizware.BizwareGL.Drivers.SlimDX.IGL_SlimDX9)
            {
                var fiHq2x = new FileInfo(Path.Combine(PathManager.GetExeDirectoryAbsolute(), "Shaders/BizHawk/hq2x.cgp"));
                if (fiHq2x.Exists)
                {
                    using (var stream = fiHq2x.OpenRead())
                        ShaderChain_hq2x = new Filters.RetroShaderChain(GL, new Filters.RetroShaderPreset(stream), Path.Combine(PathManager.GetExeDirectoryAbsolute(), "Shaders/BizHawk"));
                }
                var fiScanlines = new FileInfo(Path.Combine(PathManager.GetExeDirectoryAbsolute(), "Shaders/BizHawk/BizScanlines.cgp"));
                if (fiScanlines.Exists)
                {
                    using (var stream = fiScanlines.OpenRead())
                        ShaderChain_scanlines = new Filters.RetroShaderChain(GL, new Filters.RetroShaderPreset(stream), Path.Combine(PathManager.GetExeDirectoryAbsolute(), "Shaders/BizHawk"));
                }
                string bicubic_path = "Shaders/BizHawk/bicubic-fast.cgp";
                if (GL is BizHawk.Bizware.BizwareGL.Drivers.SlimDX.IGL_SlimDX9)
                {
                    bicubic_path = "Shaders/BizHawk/bicubic-normal.cgp";
                }
                var fiBicubic = new FileInfo(Path.Combine(PathManager.GetExeDirectoryAbsolute(), bicubic_path));
                if (fiBicubic.Exists)
                {
                    using (var stream = fiBicubic.Open(FileMode.Open, FileAccess.Read, FileShare.Read))
                        ShaderChain_bicubic = new Filters.RetroShaderChain(GL, new Filters.RetroShaderPreset(stream), Path.Combine(PathManager.GetExeDirectoryAbsolute(), "Shaders/BizHawk"));
                }
            }

            LuaSurfaceSets["emu"]           = new SwappableDisplaySurfaceSet();
            LuaSurfaceSets["native"]        = new SwappableDisplaySurfaceSet();
            LuaSurfaceFrugalizers["emu"]    = new TextureFrugalizer(GL);
            LuaSurfaceFrugalizers["native"] = new TextureFrugalizer(GL);

            RefreshUserShader();
        }