コード例 #1
0
        public GSDump Clone()
        {
            GSDump newDump = new GSDump();

            newDump.CRC = this.CRC;

            byte[] state = new byte[StateData.Length];
            Array.Copy(StateData, state, StateData.Length);
            newDump.StateData = state;

            newDump.Registers = new byte[8192];
            Array.Copy(this.Registers, newDump.Registers, 8192);

            foreach (var itm in this.Data)
            {
                if (itm.GetType().IsInstanceOfType(typeof(GSTransfer)))
                {
                    GSTransfer gt = new GSTransfer();
                    gt.id   = itm.id;
                    gt.Path = ((GSTransfer)itm).Path;
                    gt.data = new byte[itm.data.Length];
                    Array.Copy(itm.data, gt.data, itm.data.Length);
                    newDump.Data.Add(gt);
                }
                else
                {
                    GSData gt = new GSData();
                    gt.id   = itm.id;
                    gt.data = new byte[itm.data.Length];
                    Array.Copy(itm.data, gt.data, itm.data.Length);
                    newDump.Data.Add(gt);
                }
            }
            return(newDump);
        }
コード例 #2
0
        internal object GetGifPacketInfo(GSDump dump, int i)
        {
            if (dump.Data[i].id == GSType.Transfer)
            {
                try
                {
                    GIFTag val = GIFTag.ExtractGifTag(dump.Data[i].data, ((GSTransfer)dump.Data[i]).Path);
                    return(val);
                }
                catch (Exception)
                {
                    return(new GIFTag());
                }
            }
            else
            {
                switch (dump.Data[i].id)
                {
                case GSType.VSync:
                    return(dump.Data[i].data.Length + "|Field = " + dump.Data[i].data[0].ToString());

                case GSType.ReadFIFO2:
                    return(dump.Data[i].data.Length + "|ReadFIFO2 : Size = " + BitConverter.ToInt32(dump.Data[i].data, 0).ToString() + " byte");

                case GSType.Registers:
                    return(dump.Data[i].data.Length + "|Registers");

                default:
                    return("");
                }
            }
        }
コード例 #3
0
ファイル: GSDump.cs プロジェクト: Blackbird88/pcsx2
        public GSDump Clone()
        {
            GSDump newDump = new GSDump();
            newDump.CRC = this.CRC;

            byte[] state = new byte[StateData.Length];
            Array.Copy(StateData,state, StateData.Length);
            newDump.StateData = state;

            newDump.Registers = new byte[8192];
            Array.Copy(this.Registers, newDump.Registers, 8192);

            foreach (var itm in this.Data)
            {
                if (itm.GetType().IsInstanceOfType(typeof(GSTransfer)))
                {
                    GSTransfer gt = new GSTransfer();
                    gt.id = itm.id;
                    gt.Path = ((GSTransfer)itm).Path;
                    gt.data = new byte[itm.data.Length];
                    Array.Copy(itm.data, gt.data, itm.data.Length);
                    newDump.Data.Add(gt);
                }
                else
                {
                    GSData gt = new GSData();
                    gt.id = itm.id;
                    gt.data = new byte[itm.data.Length];
                    Array.Copy(itm.data, gt.data, itm.data.Length);
                    newDump.Data.Add(gt);
                }
            }
            return newDump;
        }
コード例 #4
0
ファイル: GSDump.cs プロジェクト: tsiru/pcsx2
        public static GSDump LoadDump(String FileName)
        {
            GSDump dmp = new GSDump();

            BinaryReader br = new BinaryReader(System.IO.File.Open(FileName, FileMode.Open));
            dmp.CRC = br.ReadInt32();

            Int32 ss = br.ReadInt32();
            dmp.StateData = br.ReadBytes(ss);

            dmp.Registers = br.ReadBytes(8192);

            while (br.PeekChar() != -1)
            {
                GSType id = (GSType)br.ReadByte();
                switch (id)
                {
                    case GSType.Transfer:
                        GSTransfer data = new GSTransfer();

                        byte index = br.ReadByte();

                        data.id = id;
                        data.Path = (GSTransferPath)index;

                        Int32 size = br.ReadInt32();

                        List<byte> Data = new List<byte>();
                        Data.AddRange(br.ReadBytes(size));
                        data.data = Data.ToArray();
                        dmp.Data.Add(data);
                        break;
                    case GSType.VSync:
                        GSData dataV = new GSData();
                        dataV.id = id;
                        dataV.data = br.ReadBytes(1);
                        dmp.Data.Add(dataV);
                        break;
                    case GSType.ReadFIFO2:
                        GSData dataR = new GSData();
                        dataR.id = id;
                        Int32 sF = br.ReadInt32();
                        dataR.data = BitConverter.GetBytes(sF);
                        dmp.Data.Add(dataR);
                        break;
                    case GSType.Registers:
                        GSData dataRR = new GSData();
                        dataRR.id = id;
                        dataRR.data = br.ReadBytes(8192);
                        dmp.Data.Add(dataRR);
                        break;
                    default:
                        break;
                }
            }
            br.Close();

            return dmp;
        }
コード例 #5
0
        internal List <Object> GetGifPackets(GSDump dump)
        {
            List <Object> Data = new List <Object>();

            for (int i = 0; i < dump.Data.Count; i++)
            {
                String act = i.ToString() + "|";
                act += dump.Data[i].id.ToString() + "|";
                if (dump.Data[i].GetType().IsSubclassOf(typeof(GSData)))
                {
                    act += ((GSTransfer)dump.Data[i]).Path.ToString() + "|";
                    act += ((GSTransfer)dump.Data[i]).data.Length;
                }
                else
                {
                    act += ((GSData)dump.Data[i]).data.Length;
                }
                Data.Add(act);
            }
            return(Data);
        }
コード例 #6
0
ファイル: Program.cs プロジェクト: chaoticgd/pcsx2
        static void Main(String[] args)
        {
            if (args.Length == 5)
            {
                // do this first, else racy mess ;)
                wrap = new GSDXWrapper();
                var port = Convert.ToInt32(args[4]);

                try
                {
                    Client = new TCPLibrary.MessageBased.Core.BaseMessageClient();
                    Client.OnMessageReceived += new TCPLibrary.MessageBased.Core.BaseMessageClient.MessageReceivedHandler(Client_OnMessageReceived);
                    Client.Connect("localhost", port);
                }
                catch (Exception)
                {
                    Client = null;
                }

                Thread thd = new Thread(new ThreadStart(delegate
                {
                    while (true)
                    {
                        IntPtr pt = Process.GetCurrentProcess().MainWindowHandle;
                        if (ChangeIcon)
                        {
                            if (pt.ToInt64() != 0)
                            {
                                NativeMethods.SetClassLong(pt, -14, Resources.AppIcon.Handle.ToInt64());
                                ChangeIcon = false;
                            }
                        }

                        Int32 tmp = NativeMethods.GetAsyncKeyState(0x1b) & 0xf;
                        if (tmp != 0)
                        {
                            Process.GetCurrentProcess().Kill();
                        }
                        Thread.Sleep(16);
                    }
                }));
                thd.IsBackground = true;
                thd.Start();

                // Retrieve parameters
                String DLLPath   = args[0];
                String DumpPath  = args[1];
                String Operation = args[2];
                Int32  Renderer  = Convert.ToInt32(args[3]);

                wrap.Load(DLLPath);
                Directory.SetCurrentDirectory(Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory + "GSDumpGSDXConfigs\\"));
                if (Operation == "GSReplay")
                {
                    dump = GSDump.LoadDump(DumpPath);

                    if (Client != null)
                    {
                        SendStatistics();
                        SendDumpSize();
                    }

                    wrap.Run(dump, Renderer);
                    ChangeIcon = true;
                }
                else
                {
                    wrap.GSConfig();
                }
                wrap.Unload();

                if (GSDXWrapper.DumpTooOld)
                {
                    if (Client != null)
                    {
                        TCPMessage msg = new TCPMessage();
                        msg.MessageType = MessageType.StateOld;
                        Client.Send(msg);
                    }
                }

                if (Client != null)
                {
                    Client.Disconnect();
                }
            }
            else
            {
                Clients = new List <TCPLibrary.MessageBased.Core.BaseMessageClientS>();

                Server = new TCPLibrary.MessageBased.Core.BaseMessageServer();
                Server.OnClientMessageReceived   += new BaseMessageServer.MessageReceivedHandler(Server_OnClientMessageReceived);
                Server.OnClientAfterConnect      += new TCPLibrary.Core.Server.ConnectedHandler(Server_OnClientAfterConnect);
                Server.OnClientAfterDisconnected += new TCPLibrary.Core.Server.DisconnectedHandler(Server_OnClientAfterDisconnected);
                Server.Enabled = true;

                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                frmMain = new GSDumpGUI();
                Application.Run(frmMain);

                Server.Enabled = false;
            }
        }
コード例 #7
0
        public unsafe void Run(GSDump dump, int rendererOverride)
        {
            QueueMessage  = new Queue <TCPMessage>();
            Running       = true;
            ExternalEvent = new AutoResetEvent(true);

            GSinit();
            byte[] tempregisters = new byte[8192];
            Array.Copy(dump.Registers, tempregisters, 8192);
            fixed(byte *pointer = tempregisters)
            {
                GSsetBaseMem(new IntPtr(pointer));
                IntPtr hWnd = IntPtr.Zero;

                if (GSopen(new IntPtr(&hWnd), "", rendererOverride) != 0)
                {
                    return;
                }

                GSsetGameCRC(dump.CRC, 0);

                NativeMethods.SetClassLong(hWnd, /*GCL_HICON*/ -14, Program.hMainIcon);

                fixed(byte *freeze = dump.StateData)
                {
                    byte[] GSFreez;

                    if (Environment.Is64BitProcess)
                    {
                        GSFreez = new byte[16];
                        Array.Copy(BitConverter.GetBytes((Int64)dump.StateData.Length), 0, GSFreez, 0, 8);
                        Array.Copy(BitConverter.GetBytes(new IntPtr(freeze).ToInt64()), 0, GSFreez, 8, 8);
                    }
                    else
                    {
                        GSFreez = new byte[8];
                        Array.Copy(BitConverter.GetBytes((Int32)dump.StateData.Length), 0, GSFreez, 0, 4);
                        Array.Copy(BitConverter.GetBytes(new IntPtr(freeze).ToInt32()), 0, GSFreez, 4, 4);
                    }

                    fixed(byte *fr = GSFreez)
                    {
                        int ris = GSfreeze(0, new IntPtr(fr));

                        if (ris == -1)
                        {
                            DumpTooOld = true;
                            Running    = false;
                        }
                        GSVSync(1);

                        GSreset();
                        Marshal.Copy(dump.Registers, 0, new IntPtr(pointer), 8192);
                        GSsetBaseMem(new IntPtr(pointer));
                        GSfreeze(0, new IntPtr(fr));

                        GSData gsd_vsync = new GSData();

                        gsd_vsync.id = GSType.VSync;

                        int           gs_idx    = 0;
                        int           debug_idx = 0;
                        NativeMessage msg;

                        while (Running)
                        {
                            while (NativeMethods.PeekMessage(out msg, hWnd, 0, 0, 1)) // PM_REMOVE
                            {
                                NativeMethods.TranslateMessage(ref msg);
                                NativeMethods.DispatchMessage(ref msg);

                                if (msg.msg == 0x0100) // WM_KEYDOWN
                                {
                                    switch (msg.wParam.ToInt32() & 0xFF)
                                    {
                                    case 0x1B: Running = false; break;     // VK_ESCAPE;

                                    case 0x77: GSmakeSnapshot(""); break;  // VK_F8;
                                    }
                                }
                            }

                            if (!Running || !NativeMethods.IsWindowVisible(hWnd))
                            {
                                break;
                            }

                            if (DebugMode)
                            {
                                if (QueueMessage.Count > 0)
                                {
                                    TCPMessage Mess = QueueMessage.Dequeue();
                                    switch (Mess.MessageType)
                                    {
                                    case MessageType.Step:
                                        if (debug_idx >= dump.Data.Count)
                                        {
                                            debug_idx = 0;
                                        }
                                        RunTo = debug_idx;
                                        break;

                                    case MessageType.RunToCursor:
                                        RunTo = (int)Mess.Parameters[0];
                                        if (debug_idx > RunTo)
                                        {
                                            debug_idx = 0;
                                        }
                                        break;

                                    case MessageType.RunToNextVSync:
                                        if (debug_idx >= dump.Data.Count)
                                        {
                                            debug_idx = 1;
                                        }
                                        RunTo = dump.Data.FindIndex(debug_idx, a => a.id == GSType.VSync);
                                        break;

                                    default:
                                        break;
                                    }
                                }

                                if (debug_idx <= RunTo)
                                {
                                    while (debug_idx <= RunTo)
                                    {
                                        GSData itm = dump.Data[debug_idx];
                                        CurrentGIFPacket = itm;
                                        Step(itm, pointer);
                                        debug_idx++;
                                    }

                                    int idxnextReg = dump.Data.FindIndex(debug_idx, a => a.id == GSType.Registers);
                                    if (idxnextReg != -1)
                                    {
                                        Step(dump.Data[idxnextReg], pointer);
                                    }

                                    TCPMessage Msg = new TCPMessage();
                                    Msg.MessageType = MessageType.RunToCursor;
                                    Msg.Parameters.Add(debug_idx - 1);
                                    Program.Client.Send(Msg);

                                    ExternalEvent.Set();
                                }

                                Step(gsd_vsync, pointer);
                            }
                            else
                            {
                                while (gs_idx < dump.Data.Count)
                                {
                                    GSData itm = dump.Data[gs_idx++];
                                    CurrentGIFPacket = itm;
                                    Step(itm, pointer);

                                    if (gs_idx < dump.Data.Count && dump.Data[gs_idx].id == GSType.VSync)
                                    {
                                        break;
                                    }
                                }

                                if (gs_idx >= dump.Data.Count)
                                {
                                    gs_idx = 0;
                                }
                            }
                        }

                        GSclose();
                        GSshutdown();
                    }
                }
            }
        }
コード例 #8
0
ファイル: GSDXWrapper.cs プロジェクト: RazvanRotari/pcsx2
 internal object GetGifPacketInfo(GSDump dump, int i)
 {
     if (dump.Data[i].id == GSType.Transfer)
     {
         try
         {
             GIFTag val = GIFTag.ExtractGifTag(dump.Data[i].data, ((GSTransfer)dump.Data[i]).Path);
             return val;
         }
         catch (Exception)
         {
             return new GIFTag();
         }
     }
     else
     {
         switch (dump.Data[i].id)
         {
             case GSType.VSync:
                 return dump.Data[i].data.Length + "|Field = " + dump.Data[i].data[0].ToString();
             case GSType.ReadFIFO2:
                 return dump.Data[i].data.Length + "|ReadFIFO2 : Size = " + BitConverter.ToInt32(dump.Data[i].data, 0).ToString() + " byte";
             case GSType.Registers:
                 return dump.Data[i].data.Length + "|Registers";
             default:
                 return "";
         }
     }
 }
コード例 #9
0
ファイル: GSDXWrapper.cs プロジェクト: RazvanRotari/pcsx2
 internal List<Object> GetGifPackets(GSDump dump)
 {
     List<Object> Data = new List<Object>();
     for (int i = 0; i < dump.Data.Count; i++)
     {
         String act = i.ToString() + "|";
         act += dump.Data[i].id.ToString() + "|";
         if (dump.Data[i].GetType().IsSubclassOf(typeof(GSData)))
         {
             act += ((GSTransfer)dump.Data[i]).Path.ToString() + "|";
             act += ((GSTransfer)dump.Data[i]).data.Length;
         }
         else
         {
             act += ((GSData)dump.Data[i]).data.Length;
         }
         Data.Add(act);
     }
     return Data;
 }
コード例 #10
0
ファイル: GSDXWrapper.cs プロジェクト: RazvanRotari/pcsx2
        public unsafe void Run(GSDump dump, int rendererOverride)
        {
            QueueMessage = new Queue<TCPMessage>();
            Running = true;
            ExternalEvent = new AutoResetEvent(true);

            GSinit();
            byte[] tempregisters = new byte[8192];
            Array.Copy(dump.Registers, tempregisters, 8192);
            fixed (byte* pointer = tempregisters)
            {
                GSsetBaseMem(new IntPtr(pointer));
                Int32 HWND = 0;
                GSopen(new IntPtr(&HWND), "", rendererOverride);
                GSsetGameCRC(dump.CRC, 0);

                fixed (byte* freeze = dump.StateData)
                {
                    byte[] GSFreez = new byte[8];
                    Array.Copy(BitConverter.GetBytes(dump.StateData.Length), 0, GSFreez, 0, 4);
                    Array.Copy(BitConverter.GetBytes(new IntPtr(freeze).ToInt32()), 0, GSFreez, 4, 4);

                    fixed (byte* fr = GSFreez)
                    {
                        int ris = GSfreeze(0, new IntPtr(fr));
                        if (ris == -1)
                        {
                            DumpTooOld = true;
                            return;
                        }
                        GSVSync(1);

                        while (Running)
                        {
                            if (!NativeMethods.IsWindowVisible(new IntPtr(HWND)))
                            {
                                Running = false;
                                break;
                            }

                            GSreset();
                            Marshal.Copy(dump.Registers, 0, new IntPtr(pointer), 8192);
                            GSsetBaseMem(new IntPtr(pointer));
                            GSfreeze(0, new IntPtr(fr));

                            for (int i = 0; i < dump.Data.Count; i++)
                            {
                                GSData itm = dump.Data[i];
                                CurrentGIFPacket = itm;

                                if (DebugMode)
                                {
                                    if (RunTo != -1)
                                    {
                                        if (i == RunTo)
                                        {
                                            RunTo = -1;
                                            int idxnextReg = dump.Data.FindIndex(i, a => a.id == GSType.Registers);
                                            if (idxnextReg != -1)
                                            {
                                                Step(dump.Data[idxnextReg], pointer);
                                            }

                                            GSData g = new GSData();
                                            g.id = GSType.VSync;
                                            Step(g, pointer);

                                            TCPMessage Msg = new TCPMessage();
                                            Msg.MessageType = MessageType.RunToCursor;
                                            Msg.Parameters.Add(i);
                                            Program.Client.Send(Msg);

                                            ExternalEvent.Set();
                                        }
                                        else
                                        {
                                            Step(itm, pointer);
                                        }
                                    }
                                    else
                                    {
                                        while (!ThereIsWork && Running)
                                        {
                                            NativeMessage message;
                                            while (NativeMethods.PeekMessage(out message, IntPtr.Zero, 0, 0, 1))
                                            {
                                                if (!NativeMethods.IsWindowVisible(new IntPtr(HWND)))
                                                {
                                                    Running = false;
                                                }
                                                NativeMethods.TranslateMessage(ref message);
                                                NativeMethods.DispatchMessage(ref message);
                                            }
                                        }

                                        ThereIsWork = false;
                                        if (QueueMessage.Count > 0)
                                        {
                                            TCPMessage Mess = QueueMessage.Dequeue();
                                            switch (Mess.MessageType)
                                            {
                                                case MessageType.Step:
                                                    RunTo = i;
                                                    break;
                                                case MessageType.RunToCursor:
                                                    RunTo = (int)Mess.Parameters[0];
                                                    break;
                                                case MessageType.RunToNextVSync:
                                                    RunTo = dump.Data.FindIndex(i, a => a.id == GSType.VSync);
                                                    break;
                                                default:
                                                    break;
                                            }
                                            break;
                                        }
                                    }
                                }
                                else
                                {
                                    Step(itm, pointer);
                                }
                            }
                        }

                        GSclose();
                        GSshutdown();
                    }
                }
            }
        }
コード例 #11
0
        static void Main(String[] args)
        {
            if (args.Length == 5)
            {
                hMainIcon = Resources.AppIcon.Handle;

                // do this first, else racy mess ;)
                wrap = new GSDXWrapper();
                var port = Convert.ToInt32(args[4]);

                try
                {
                    Client = new TCPLibrary.MessageBased.Core.BaseMessageClient();
                    Client.OnMessageReceived += new TCPLibrary.MessageBased.Core.BaseMessageClient.MessageReceivedHandler(Client_OnMessageReceived);
                    Client.Connect("localhost", port);
                }
                catch (Exception)
                {
                    Client = null;
                }

                // Retrieve parameters
                String DLLPath   = args[0];
                String DumpPath  = args[1];
                String Operation = args[2];
                Int32  Renderer  = Convert.ToInt32(args[3]);

                wrap.Load(DLLPath);
                Directory.SetCurrentDirectory(Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory + "GSDumpGSDXConfigs\\"));
                if (Operation == "GSReplay")
                {
                    dump = GSDump.LoadDump(DumpPath);

                    if (Client != null)
                    {
                        SendStatistics();
                        SendDumpSize();
                    }

                    wrap.Run(dump, Renderer);
                }
                else
                {
                    wrap.GSConfig();
                }
                wrap.Unload();

                if (GSDXWrapper.DumpTooOld)
                {
                    if (Client != null)
                    {
                        TCPMessage msg = new TCPMessage();
                        msg.MessageType = MessageType.StateOld;
                        Client.Send(msg);
                    }
                }

                if (Client != null)
                {
                    Client.Disconnect();
                }
            }
            else
            {
                Clients = new List <TCPLibrary.MessageBased.Core.BaseMessageClientS>();

                Server = new TCPLibrary.MessageBased.Core.BaseMessageServer();
                Server.OnClientMessageReceived   += new BaseMessageServer.MessageReceivedHandler(Server_OnClientMessageReceived);
                Server.OnClientAfterConnect      += new TCPLibrary.Core.Server.ConnectedHandler(Server_OnClientAfterConnect);
                Server.OnClientAfterDisconnected += new TCPLibrary.Core.Server.DisconnectedHandler(Server_OnClientAfterDisconnected);
                Server.Enabled = true;

                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);

                using (frmMain = new GSDumpGUI())
                {
                    Application.Run(frmMain);
                }

                Server.Enabled = false;
            }
        }
コード例 #12
0
        static public GSDump LoadDump(String FileName)
        {
            GSDump dmp = new GSDump();

            BinaryReader br = new BinaryReader(System.IO.File.Open(FileName, FileMode.Open));

            dmp.CRC = br.ReadInt32();

            Int32 ss = br.ReadInt32();

            dmp.StateData = br.ReadBytes(ss);

            dmp.Registers = br.ReadBytes(8192);

            while (br.PeekChar() != -1)
            {
                GSType id = (GSType)br.ReadByte();
                switch (id)
                {
                case GSType.Transfer:
                    GSTransfer data = new GSTransfer();

                    byte index = br.ReadByte();

                    data.id   = id;
                    data.Path = (GSTransferPath)index;

                    Int32 size = br.ReadInt32();

                    List <byte> Data = new List <byte>();
                    Data.AddRange(br.ReadBytes(size));
                    data.data = Data.ToArray();
                    dmp.Data.Add(data);
                    break;

                case GSType.VSync:
                    GSData dataV = new GSData();
                    dataV.id   = id;
                    dataV.data = br.ReadBytes(1);
                    dmp.Data.Add(dataV);
                    break;

                case GSType.ReadFIFO2:
                    GSData dataR = new GSData();
                    dataR.id = id;
                    Int32 sF = br.ReadInt32();
                    dataR.data = BitConverter.GetBytes(sF);
                    dmp.Data.Add(dataR);
                    break;

                case GSType.Registers:
                    GSData dataRR = new GSData();
                    dataRR.id   = id;
                    dataRR.data = br.ReadBytes(8192);
                    dmp.Data.Add(dataRR);
                    break;

                default:
                    break;
                }
            }
            br.Close();

            return(dmp);
        }
コード例 #13
0
ファイル: GSDXWrapper.cs プロジェクト: zod331/pcsx2
        public unsafe void Run(GSDump dump, int rendererOverride)
        {
            QueueMessage  = new Queue <TCPMessage>();
            Running       = true;
            ExternalEvent = new AutoResetEvent(true);

            GSinit();
            byte[] tempregisters = new byte[8192];
            Array.Copy(dump.Registers, tempregisters, 8192);
            fixed(byte *pointer = tempregisters)
            {
                GSsetBaseMem(new IntPtr(pointer));
                Int32 HWND = 0;

                GSopen(new IntPtr(&HWND), "", rendererOverride);
                GSsetGameCRC(dump.CRC, 0);

                fixed(byte *freeze = dump.StateData)
                {
                    byte[] GSFreez = new byte[8];
                    Array.Copy(BitConverter.GetBytes(dump.StateData.Length), 0, GSFreez, 0, 4);
                    Array.Copy(BitConverter.GetBytes(new IntPtr(freeze).ToInt32()), 0, GSFreez, 4, 4);

                    fixed(byte *fr = GSFreez)
                    {
                        int ris = GSfreeze(0, new IntPtr(fr));

                        if (ris == -1)
                        {
                            DumpTooOld = true;
                            return;
                        }
                        GSVSync(1);

                        while (Running)
                        {
                            if (!NativeMethods.IsWindowVisible(new IntPtr(HWND)))
                            {
                                Running = false;
                                break;
                            }

                            GSreset();
                            Marshal.Copy(dump.Registers, 0, new IntPtr(pointer), 8192);
                            GSsetBaseMem(new IntPtr(pointer));
                            GSfreeze(0, new IntPtr(fr));

                            for (int i = 0; i < dump.Data.Count; i++)
                            {
                                GSData itm = dump.Data[i];
                                CurrentGIFPacket = itm;

                                if (DebugMode)
                                {
                                    if (RunTo != -1)
                                    {
                                        if (i == RunTo)
                                        {
                                            RunTo = -1;
                                            int idxnextReg = dump.Data.FindIndex(i, a => a.id == GSType.Registers);
                                            if (idxnextReg != -1)
                                            {
                                                Step(dump.Data[idxnextReg], pointer);
                                            }

                                            GSData g = new GSData();
                                            g.id = GSType.VSync;
                                            Step(g, pointer);

                                            TCPMessage Msg = new TCPMessage();
                                            Msg.MessageType = MessageType.RunToCursor;
                                            Msg.Parameters.Add(i);
                                            Program.Client.Send(Msg);

                                            ExternalEvent.Set();
                                        }
                                        else
                                        {
                                            Step(itm, pointer);
                                        }
                                    }
                                    else
                                    {
                                        while (!ThereIsWork && Running)
                                        {
                                            NativeMessage message;
                                            while (NativeMethods.PeekMessage(out message, IntPtr.Zero, 0, 0, 1))
                                            {
                                                if (!NativeMethods.IsWindowVisible(new IntPtr(HWND)))
                                                {
                                                    Running = false;
                                                }
                                                NativeMethods.TranslateMessage(ref message);
                                                NativeMethods.DispatchMessage(ref message);
                                            }
                                        }

                                        ThereIsWork = false;
                                        if (QueueMessage.Count > 0)
                                        {
                                            TCPMessage Mess = QueueMessage.Dequeue();
                                            switch (Mess.MessageType)
                                            {
                                            case MessageType.Step:
                                                RunTo = i;
                                                break;

                                            case MessageType.RunToCursor:
                                                RunTo = (int)Mess.Parameters[0];
                                                break;

                                            case MessageType.RunToNextVSync:
                                                RunTo = dump.Data.FindIndex(i, a => a.id == GSType.VSync);
                                                break;

                                            default:
                                                break;
                                            }
                                            break;
                                        }
                                    }
                                }
                                else
                                {
                                    Step(itm, pointer);
                                }
                            }
                        }

                        GSclose();
                        GSshutdown();
                    }
                }
            }
        }
コード例 #14
0
ファイル: Program.cs プロジェクト: Blackbird88/pcsx2
        static void Main(String[] args)
        {
            if (args.Length == 4)
            {
                // do this first, else racy mess ;)
                wrap = new GSDXWrapper();

                try
                {
                    Client = new TCPLibrary.MessageBased.Core.BaseMessageClient();
                    Client.OnMessageReceived += new TCPLibrary.MessageBased.Core.BaseMessageClient.MessageReceivedHandler(Client_OnMessageReceived);
                    Client.Connect("localhost", 9999);
                }
                catch (Exception)
                {
                    Client = null;
                }

                Thread thd = new Thread(new ThreadStart(delegate
                {
                    while (true)
                    {
                        IntPtr pt = Process.GetCurrentProcess().MainWindowHandle;
                        if (ChangeIcon)
                        {
                            if (pt.ToInt64() != 0)
                            {
                                NativeMethods.SetClassLong(pt, -14, Resources.AppIcon.Handle.ToInt64());
                                ChangeIcon = false;
                            }
                        }

                        Int32 tmp = NativeMethods.GetAsyncKeyState(0x1b) & 0xf;
                        if (tmp != 0)
                            Process.GetCurrentProcess().Kill();
                        Thread.Sleep(16);
                    }
                }));
                thd.IsBackground = true;
                thd.Start();

                // Retrieve parameters
                String DLLPath = args[0];
                String DumpPath = args[1];
                String Operation = args[2];
                Int32 Renderer = Convert.ToInt32(args[3]);

                wrap.Load(DLLPath);
                Directory.SetCurrentDirectory(Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory + "GSDumpGSDXConfigs\\" + Path.GetFileName(DLLPath) + "\\"));
                if (Operation == "GSReplay")
                {
                    dump = GSDump.LoadDump(DumpPath);

                    if (Client != null)
                    {
                        SendStatistics();
                        SendDumpSize();
                    }

                    wrap.Run(dump, Renderer);
                    ChangeIcon = true;
                }
                else
                    wrap.GSConfig();
                wrap.Unload();

                if (GSDXWrapper.DumpTooOld)
                {
                    if (Client != null)
                    {
                        TCPMessage msg = new TCPMessage();
                        msg.MessageType = MessageType.StateOld;
                        Client.Send(msg);
                    }
                }

                if (Client != null)
                    Client.Disconnect();
            }
            else
            {
                Clients = new List<TCPLibrary.MessageBased.Core.BaseMessageClientS>();

                Server = new TCPLibrary.MessageBased.Core.BaseMessageServer();
                Server.OnClientMessageReceived += new BaseMessageServer.MessageReceivedHandler(Server_OnClientMessageReceived);
                Server.OnClientAfterConnect += new TCPLibrary.Core.Server.ConnectedHandler(Server_OnClientAfterConnect);
                Server.OnClientAfterDisconnected += new TCPLibrary.Core.Server.DisconnectedHandler(Server_OnClientAfterDisconnected);
                Server.Port = 9999;
                Server.Enabled = true;

                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                frmMain = new GSDumpGUI();
                Application.Run(frmMain);

                Server.Enabled = false;
            }
        }