From 542675def458220dcd631530d74fb91cdac1604f Mon Sep 17 00:00:00 2001 From: zeromus Date: Wed, 10 Dec 2014 21:56:12 +0000 Subject: [PATCH] psx - implement framebuffer 'normalizing' for consistent 700x480 output, at the cost of slightly warped AR in some resolutions. Ideal for debugging, but not for gaming just yet. --- .../Consoles/Sony/PSX/Octoshock.cs | 38 ++-- .../Consoles/Sony/PSX/OctoshockDll.cs | 12 +- output/dll/octoshock.dll | Bin 960000 -> 961024 bytes psx/octoshock/psx/psx.cpp | 198 ++++++++++++++++-- psx/octoshock/psx/psx.h | 12 +- psx/octoshock/test/miniclient/miniclient.cpp | 13 +- 6 files changed, 225 insertions(+), 48 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Sony/PSX/Octoshock.cs b/BizHawk.Emulation.Cores/Consoles/Sony/PSX/Octoshock.cs index 403eb0d370..fa4743348c 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sony/PSX/Octoshock.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sony/PSX/Octoshock.cs @@ -1,18 +1,7 @@ //TODO hook up newer file ID stuff, think about how to combine it with the disc ID -//TODO not liking the name ShockFramebufferJob //TODO change display manager to not require 0xFF alpha channel set on videoproviders. check gdi+ and opengl! this will get us a speedup in some places //TODO Disc.Structure.Sessions[0].length_aba was 0 -//looks like we can have (in NTSC) framebuffer dimensions like this: -//width: 280, 350, 700 -//height: 240, 480 -//mednafen's strategy is to put everything in a 320x240 and scale it up 3x to 960x720 by default (which is adequate to contain the largest PSX framebuffer) -//heres my strategy. -//1. we should have a native output mode, for debugging. but most users wont want it (massively distorted resolutions are common in games) -//2. do the right thing: -//always double a height of 240, and double a width of 280 or 350. For 280, float content in center screen. -//but lets not do this til we're on an upgraded mednafen - using System; using System.Runtime.InteropServices; using System.IO; @@ -149,14 +138,13 @@ namespace BizHawk.Emulation.Cores.Sony.PSX } } - + //note: its annoying that we have to have a disc before constructing this. + //might want to change that later. HOWEVER - we need to definitely have a region, at least public Octoshock(CoreComm comm, DiscSystem.Disc disc) { ServiceProvider = new BasicServiceProvider(this); var domains = new List(); CoreComm = comm; - VirtualWidth = BufferWidth = 256; - BufferHeight = 192; Attach(); @@ -177,6 +165,23 @@ namespace BizHawk.Emulation.Cores.Sony.PSX fixed (byte* pFirmware = firmware) OctoshockDll.shock_Create(out psx, discInfo.region, pFirmware); + + //these should track values in octoshock gpu.cpp FillVideoParams + //if (discInfo.region == OctoshockDll.eRegion.EU) + //{ + // VirtualWidth = 377; // " Dunno :( " + // VirtualHeight = 288; + //} + //else + //{ + // VirtualWidth = 320; // Dunno :( + // VirtualHeight = 240; + //} + //BUT-for now theyre normalized (NOTE: THIS MESSES UP THE ASPECT RATIOS) + VirtualWidth = 700; + VirtualHeight = 480; + + OctoshockDll.shock_OpenTray(psx); OctoshockDll.shock_SetDisc(psx, discInterface.OctoshockHandle); OctoshockDll.shock_CloseTray(psx); @@ -218,7 +223,8 @@ namespace BizHawk.Emulation.Cores.Sony.PSX { OctoshockDll.shock_Step(psx, OctoshockDll.eShockStep.Frame); - OctoshockDll.ShockFramebufferJob fb = new OctoshockDll.ShockFramebufferJob(); + OctoshockDll.ShockFramebufferInfo fb = new OctoshockDll.ShockFramebufferInfo(); + fb.flags = OctoshockDll.eShockFramebufferFlags.Normalize; OctoshockDll.shock_GetFramebuffer(psx, ref fb); //Console.WriteLine(fb.height); @@ -265,7 +271,7 @@ namespace BizHawk.Emulation.Cores.Sony.PSX public int[] GetVideoBuffer() { return frameBuffer; } public int VirtualWidth { get; private set; } - public int VirtualHeight { get { return BufferHeight; } } + public int VirtualHeight { get; private set; } public int BufferWidth { get; private set; } public int BufferHeight { get; private set; } public int BackgroundColor { get { return 0; } } diff --git a/BizHawk.Emulation.Cores/Consoles/Sony/PSX/OctoshockDll.cs b/BizHawk.Emulation.Cores/Consoles/Sony/PSX/OctoshockDll.cs index e65a136617..f8f7fa7358 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sony/PSX/OctoshockDll.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sony/PSX/OctoshockDll.cs @@ -19,6 +19,12 @@ public unsafe static class OctoshockDll Frame }; + public enum eShockFramebufferFlags + { + None = 0, + Normalize = 1 + } + public const int SHOCK_OK = 0; public const int SHOCK_ERROR = -1; public const int SHOCK_NOCANDO = -2; @@ -47,9 +53,11 @@ public unsafe static class OctoshockDll }; [StructLayout(LayoutKind.Sequential)] - public struct ShockFramebufferJob + public struct ShockFramebufferInfo { public int width, height; + [MarshalAs(UnmanagedType.I4)] + public eShockFramebufferFlags flags; public void* ptr; }; @@ -93,5 +101,5 @@ public unsafe static class OctoshockDll public static extern int shock_Step(IntPtr psx, eShockStep step); [DllImport("octoshock.dll")] - public static extern int shock_GetFramebuffer(IntPtr psx, ref ShockFramebufferJob fb); + public static extern int shock_GetFramebuffer(IntPtr psx, ref ShockFramebufferInfo fb); } diff --git a/output/dll/octoshock.dll b/output/dll/octoshock.dll index 72c1f18238e01187aaf581f99ad9374938b69ccd..82e973c11151a1c7a2a7ef9863ffd40d2bd6cae9 100644 GIT binary patch delta 79783 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 N$Cdv&&9Kh?e*jM8vts}N delta 82674 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�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 T5)$&tdfa8$Br2g9eBb{E1&MtS diff --git a/psx/octoshock/psx/psx.cpp b/psx/octoshock/psx/psx.cpp index 7e7866230d..5e82bbc6d7 100644 --- a/psx/octoshock/psx/psx.cpp +++ b/psx/octoshock/psx/psx.cpp @@ -1346,6 +1346,9 @@ static void MountCPUAddressSpace() static MDFN_Surface *VTBuffer[2] = { NULL, NULL }; static int *VTLineWidths[2] = { NULL, NULL }; +static bool s_FramebufferNormalized; +static int s_FramebufferCurrent; +static int s_FramebufferCurrentWidth; EW_EXPORT s32 shock_Create(void** psx, eRegion region, void* firmware512k) { @@ -1374,33 +1377,37 @@ EW_EXPORT s32 shock_Create(void** psx, eRegion region, void* firmware512k) { sls = 0; sle = 287; - s_ShockConfig.nominal_width = 367; // Dunno. :( - s_ShockConfig.nominal_height = 288; - - s_ShockConfig.fb_width = 768; - s_ShockConfig.fb_height = 576; } else { sls = 0; sle = 239; - s_ShockConfig.lcm_width = 2720; - s_ShockConfig.lcm_height = 480; - - s_ShockConfig.nominal_width = 310; - s_ShockConfig.nominal_height = 240; - - s_ShockConfig.fb_width = 768; - s_ShockConfig.fb_height = 480; } - //setup gpu output surfaces - MDFN_PixelFormat nf(MDFN_COLORSPACE_RGB, 16, 8, 0, 24); - VTBuffer[0] = new MDFN_Surface(NULL, s_ShockConfig.fb_width, s_ShockConfig.fb_height, s_ShockConfig.fb_width, nf); - VTLineWidths[0] = (int *)calloc(s_ShockConfig.fb_height, sizeof(int)); - //these steps can't be done without more information GPU = new PS_GPU(region == REGION_EU, sls, sle); + + //fetch video parameters, stash in a simpler format + MDFNGI givp; + GPU->FillVideoParams(&givp); + s_ShockConfig.lcm_width = givp.lcm_width; + s_ShockConfig.lcm_height = givp.lcm_height; + s_ShockConfig.fb_height = givp.fb_height; + s_ShockConfig.fb_width = givp.fb_width; + s_ShockConfig.fb_height = givp.fb_height; + s_ShockConfig.nominal_width = givp.nominal_width; + s_ShockConfig.nominal_height = givp.nominal_height; + //givp.fps // TODO + + + //setup gpu output surfaces + MDFN_PixelFormat nf(MDFN_COLORSPACE_RGB, 16, 8, 0, 24); + for(int i=0;i<2;i++) + { + VTBuffer[i] = new MDFN_Surface(NULL, s_ShockConfig.fb_width, s_ShockConfig.fb_height, s_ShockConfig.fb_width, nf); + VTLineWidths[i] = (int *)calloc(s_ShockConfig.fb_height, sizeof(int)); + } + //TODO - configuration static bool emulate_memcard[8] = {0}; @@ -1521,16 +1528,161 @@ EW_EXPORT s32 shock_Step(void* psx, eShockStep step) espec.InterlaceField = 0; } - //pixel-double some dimensions as needed (TBD) + //new frame, hasnt been normalized + s_FramebufferNormalized = false; + s_FramebufferCurrent = 0; + s_FramebufferCurrentWidth = s_ShockConfig.fb_width; return SHOCK_OK; } -EW_EXPORT s32 shock_GetFramebuffer(void* psx, ShockFramebufferJob* fb) +//`normalizes` the framebuffer to 700x480 by pixel doubling and wrecking the AR a little bit as needed +void NormalizeFramebuffer() { - //always fetch description + //mednafen's advised solution for smooth gaming: "scale the output width to z * nominal_width, and the output height to z * nominal_height, where nominal_width and nominal_height are members of the MDFNGI struct" + //IOW, mednafen's strategy is to put everything in a 320x240 and scale it up 3x to 960x720 by default (which is adequate to contain the largest PSX framebuffer of 700x480) + + //psxtech says horizontal resolutions can be: 256, 320, 368, 512, 640 pixels + //mednafen will turn those into 2800/{ 10, 8, 5, 4, 7 } -> 280,350,560,700,400 + + //heres my strategy: + //try to do the smart thing, try to get aspect ratio near the right value + //intended AR = 320/240 = 1.3333 + //280x240 - ok (AR 1.1666666666666666666666666666667) + //350x240 - ok (AR 1.4583333333333333333333333333333) + //400x240 - ok (AR 1.6666666666666666666666666666667) + //560x240 - scale vertically by 2 = 560x480 ~ 280x240 + //700x240 - scale vertically by 2 = 700x480 ~ 350x240 + //280x480 - scale horizontally by 2 = 560x480 ~ 280x240 + //350x480 - scale horizontally by 2 = 700x480 ~ 350x240 + //400x480 - scale horizontally by 2 = 800x480 ~ 400x240 + //560x480 - ok ~ 280x240 + //700x480 - ok ~ 350x240 + + //NOTE: this approach is very redundant with the displaymanager AR tracking stuff + //however, it will help us avoid stressing the displaymanager (for example, a 700x240 will freak it out kind of. we could send it a much more sensible 700x480) + + int width = VTLineWidths[0][0]; //presently, except for contrived test programs, it is safe to assume this is the same for the entire frame (no known use by games) int height = espec.DisplayRect.h; + + int xs=1,ys=1,xm=0; + + //I. as described above + //if(width == 280 && height == 240) {} + //if(width == 350 && height == 240) {} + //if(width == 400 && height == 240) {} + //if(width == 560 && height == 240) ys=2; + //if(width == 700 && height == 240) ys=2; + //if(width == 280 && height == 480) xs=2; + //if(width == 350 && height == 480) xs=2; + //if(width == 400 && height == 480) xs=2; + //if(width == 560 && height == 480) {} + //if(width == 700 && height == 480) {} + + //II. as the snes 'always double size framebuffer'. I think thats a better idea, and we already have the concept + if(width == 280 && height == 240) xs=ys=2; + if(width == 350 && height == 240) xs=ys=2; + if(width == 400 && height == 240) xs=ys=2; + if(width == 560 && height == 240) ys=2; + if(width == 700 && height == 240) ys=2; + if(width == 280 && height == 480) xs=2; + if(width == 350 && height == 480) xs=2; + if(width == 400 && height == 480) xs=2; + if(width == 560 && height == 480) {} + if(width == 700 && height == 480) {} + xm = (700-width*xs)/2; + + int curr = 0; + + //1. double the height, while cropping down + if(ys==2) //should handle ntsc or pal, but not tested yet for pal + { + uint32* src = VTBuffer[curr]->pixels + (s_ShockConfig.fb_width*espec.DisplayRect.y) + espec.DisplayRect.x; + uint32* dst = VTBuffer[curr^1]->pixels; + int tocopy = width*4; + for(int y=0;ypixels + (s_ShockConfig.fb_width*espec.DisplayRect.y) + espec.DisplayRect.x; + uint32* dst = VTBuffer[curr^1]->pixels; + + for(int y=0;yflags & eShockFramebufferFlags_Normalize) + if(!s_FramebufferNormalized) + { + NormalizeFramebuffer(); + s_FramebufferNormalized = true; + } + + int fbIndex = s_FramebufferCurrent; + + //always fetch description + int width = VTLineWidths[fbIndex][0]; //presently, except for contrived test programs, it is safe to assume this is the same for the entire frame (no known use by games) + int height = espec.DisplayRect.h; fb->width = width; fb->height = height; @@ -1542,7 +1694,7 @@ EW_EXPORT s32 shock_GetFramebuffer(void* psx, ShockFramebufferJob* fb) //maybe we need to output the framebuffer //do a raster loop and copy it to the target - uint32* src = VTBuffer[0]->pixels + (s_ShockConfig.fb_width*espec.DisplayRect.y) + espec.DisplayRect.x; + uint32* src = VTBuffer[fbIndex]->pixels + (s_FramebufferCurrentWidth*espec.DisplayRect.y) + espec.DisplayRect.x; uint32* dst = (u32*)fb->ptr; int tocopy = width*4; for(int y=0;y