diff --git a/Source/Core/Core/Src/Core.cpp b/Source/Core/Core/Src/Core.cpp index 52308f3565..55ddeecbe2 100644 --- a/Source/Core/Core/Src/Core.cpp +++ b/Source/Core/Core/Src/Core.cpp @@ -595,14 +595,14 @@ void ScreenShot() // This should only be called from VI void VideoThrottle() { - u32 TargetFPS = (SConfig::GetInstance().m_Framelimit > 1) ? + u32 TargetVPS = (SConfig::GetInstance().m_Framelimit > 1) ? SConfig::GetInstance().m_Framelimit * 10 : VideoInterface::TargetRefreshRate; // When frame limit is NOT off if (SConfig::GetInstance().m_Framelimit) { // Make the limiter a bit loose - u32 frametime = DrawnFrame * 1000 / ++TargetFPS; + u32 frametime = DrawnVideo * 1000 / ++TargetVPS; while ((u32)Timer.GetTimeDifference() < frametime) Common::YieldCPU(); //Common::SleepCurrentThread(1); @@ -616,7 +616,7 @@ void VideoThrottle() u32 FPS = Common::AtomicLoad(DrawnFrame) * 1000 / ElapseTime; u32 VPS = --DrawnVideo * 1000 / ElapseTime; - u32 Speed = FPS * 100 / VideoInterface::TargetRefreshRate; + u32 Speed = VPS * 100 / VideoInterface::TargetRefreshRate; // Settings are shown the same for both extended and summary info std::string SSettings = StringFromFormat("%s %s", @@ -699,7 +699,8 @@ void Callback_VideoLog(const TCHAR *_szMessage, int _bDoBreak) // Should be called from GPU thread when a frame is drawn void Callback_VideoCopiedToXFB(bool video_update) { - Common::AtomicIncrement(DrawnFrame); + if(video_update) + Common::AtomicIncrement(DrawnFrame); Frame::FrameUpdate(); } diff --git a/Source/Core/VideoCommon/Src/PixelShaderGen.cpp b/Source/Core/VideoCommon/Src/PixelShaderGen.cpp index c7b8a48598..031653d817 100644 --- a/Source/Core/VideoCommon/Src/PixelShaderGen.cpp +++ b/Source/Core/VideoCommon/Src/PixelShaderGen.cpp @@ -363,7 +363,7 @@ static const char *tevIndAlphaSel[] = {"", "x", "y", "z"}; static const char *tevIndAlphaScale[] = {"*(248.0f/255.0f)", "*(224.0f/255.0f)","*(240.0f/255.0f)","*(248.0f/255.0f)"}; static const char *tevIndBiasField[] = {"", "x", "y", "xy", "z", "xz", "yz", "xyz"}; // indexed by bias static const char *tevIndBiasAdd[] = {"-128.0f", "1.0f", "1.0f", "1.0f" }; // indexed by fmt -static const char *tevIndWrapStart[] = {"0", "256", "128", "64", "32", "16", "0.001" }; +static const char *tevIndWrapStart[] = {"0.0f", "256.0f", "128.0f", "64.0f", "32.0f", "16.0f", "0.001f" }; static const char *tevIndFmtScale[] = {"255.0f", "31.0f", "15.0f", "7.0f" }; #define WRITE p+=sprintf diff --git a/Source/Core/VideoCommon/Src/TextureDecoder.cpp b/Source/Core/VideoCommon/Src/TextureDecoder.cpp index f9565d7f6f..ecd78ba16b 100644 --- a/Source/Core/VideoCommon/Src/TextureDecoder.cpp +++ b/Source/Core/VideoCommon/Src/TextureDecoder.cpp @@ -88,43 +88,6 @@ int TexDecoder_GetTextureSizeInBytes(int width, int height, int format) return (width * height * TexDecoder_GetTexelSizeInNibbles(format)) / 2; } -u32 TexDecoder_GetHash32(const u8 *src, int len, u32 samples) -{ - const u32 m = 0x5bd1e995; - const int r = 24; - u32 h = len; - const u32 * data = (const u32 *)src; - u32 Step = (len/4); - const u32 * End = data + Step; - const u8 * uEnd = (const u8 *)End; - if(samples == 0) samples = Step; - Step = Step / samples; - if(Step < 1) Step = 1; - while(data < End) - { - u32 k = data[0]; - k *= m; - k ^= k >> r; - k *= m; - h *= m; - h ^= k; - data+=Step; - } - - switch(len & 3) - { - case 3: h ^= u32(uEnd[2]) << 16; - case 2: h ^= u32(uEnd[1]) << 8; - case 1: h ^= u32(uEnd[0]); - h *= m; - }; - - h ^= h >> 13; - h *= m; - h ^= h >> 15; - return h; -} - #ifdef _M_X64 u64 TexDecoder_GetHash64(const u8 *src, int len, u32 samples) { diff --git a/Source/Core/VideoCommon/Src/TextureDecoder.h b/Source/Core/VideoCommon/Src/TextureDecoder.h index 4169ce0ca6..014696faf8 100644 --- a/Source/Core/VideoCommon/Src/TextureDecoder.h +++ b/Source/Core/VideoCommon/Src/TextureDecoder.h @@ -88,9 +88,7 @@ void TexDecoder_DirectDecode(u8 *dst, const u8 *src, int width, int height,int P PC_TexFormat GetPC_TexFormat(int texformat, int tlutfmt); void TexDecoder_DecodeTexel(u8 *dst, const u8 *src, int s, int t, int imageWidth, int texformat, int tlutaddr, int tlutfmt); - u64 TexDecoder_GetHash64(const u8 *src, int len, u32 samples = 0); -u32 TexDecoder_GetHash32(const u8 *src, int len, u32 samples = 0); void TexDecoder_SetTexFmtOverlayOptions(bool enable, bool center); diff --git a/Source/Plugins/Plugin_VideoDX9/Src/FramebufferManager.cpp b/Source/Plugins/Plugin_VideoDX9/Src/FramebufferManager.cpp index 6d926cba9d..9119bb596e 100644 --- a/Source/Plugins/Plugin_VideoDX9/Src/FramebufferManager.cpp +++ b/Source/Plugins/Plugin_VideoDX9/Src/FramebufferManager.cpp @@ -311,6 +311,8 @@ void FramebufferManager::copyToRealXFB(u32 xfbAddr, u32 fbWidth, u32 fbHeight, c void FramebufferManager::copyToVirtualXFB(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRectangle& sourceRc) { LPDIRECT3DTEXTURE9 xfbTexture; + HRESULT hr = 0; + VirtualXFBListType::iterator it = findVirtualXFB(xfbAddr, fbWidth, fbHeight); @@ -361,12 +363,14 @@ void FramebufferManager::copyToVirtualXFB(u32 xfbAddr, u32 fbWidth, u32 fbHeight it->xfbSource.srcWidth = fbWidth; it->xfbSource.srcHeight = fbHeight; - if(it->xfbSource.texWidth != target_width || it->xfbSource.texHeight != target_height || !it->xfbSource.texture) + if(it->xfbSource.texWidth != target_width || it->xfbSource.texHeight != target_height || !(it->xfbSource.texture)) { if(it->xfbSource.texture) it->xfbSource.texture->Release(); - D3D::dev->CreateTexture(target_width, target_height, 1, D3DUSAGE_RENDERTARGET, s_efb_color_surface_Format, - D3DPOOL_DEFAULT, &it->xfbSource.texture, NULL); + it->xfbSource.texture = NULL; + hr = D3D::dev->CreateTexture(target_width, target_height, 1, D3DUSAGE_RENDERTARGET, s_efb_color_surface_Format, + D3DPOOL_DEFAULT, &(it->xfbSource.texture), NULL); + } xfbTexture = it->xfbSource.texture; @@ -412,10 +416,8 @@ void FramebufferManager::copyToVirtualXFB(u32 xfbAddr, u32 fbWidth, u32 fbHeight if(!xfbTexture) return; - // Make sure to resolve anything we need to read from. LPDIRECT3DTEXTURE9 read_texture = GetEFBColorTexture(sourceRc); - // We have to run a pixel shader, for color conversion. Renderer::ResetAPIState(); // reset any game specific settings LPDIRECT3DSURFACE9 Rendersurf = NULL; @@ -425,7 +427,6 @@ void FramebufferManager::copyToVirtualXFB(u32 xfbAddr, u32 fbWidth, u32 fbHeight D3DVIEWPORT9 vp; - // Stretch picture with increased internal resolution vp.X = 0; vp.Y = 0; vp.Width = target_width; diff --git a/Source/Plugins/Plugin_VideoDX9/Src/FramebufferManager.h b/Source/Plugins/Plugin_VideoDX9/Src/FramebufferManager.h index 85eded08de..e6deec19b8 100644 --- a/Source/Plugins/Plugin_VideoDX9/Src/FramebufferManager.h +++ b/Source/Plugins/Plugin_VideoDX9/Src/FramebufferManager.h @@ -61,9 +61,15 @@ inline bool addrRangesOverlap(u32 aLower, u32 aUpper, u32 bLower, u32 bUpper) struct XFBSource { - XFBSource() : - texture(0) - {} + XFBSource() + { + this->srcAddr = 0; + this->srcWidth = 0; + this->srcHeight = 0; + this->texture = 0; + this->texWidth = 0; + this->texHeight = 0; + } u32 srcAddr; u32 srcWidth; diff --git a/Source/Plugins/Plugin_VideoDX9/Src/Render.cpp b/Source/Plugins/Plugin_VideoDX9/Src/Render.cpp index 9f7ed73d95..388cae6627 100644 --- a/Source/Plugins/Plugin_VideoDX9/Src/Render.cpp +++ b/Source/Plugins/Plugin_VideoDX9/Src/Render.cpp @@ -340,7 +340,7 @@ bool Renderer::Init() s_LastFrameDumped = false; s_AVIDumping = false; - // We're not using fixed function, except for some 2D. + // We're not using fixed function. // Let's just set the matrices to identity to be sure. D3DXMATRIX mtx; D3DXMatrixIdentity(&mtx); @@ -572,19 +572,13 @@ void Renderer::RenderToXFB(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRect { if(!fbWidth || !fbHeight) return; - //VideoFifo_CheckEFBAccess(); - // If we're about to write to a requested XFB, make sure the previous - // contents make it to the screen first. - if (g_ActiveConfig.bUseXFB) - { - VideoFifo_CheckSwapRequestAt(xfbAddr, fbWidth, fbHeight); - } + VideoFifo_CheckEFBAccess(); FBManager.CopyToXFB(xfbAddr, fbWidth, fbHeight, sourceRc); XFBWrited = true; - // XXX: Without the VI, how would we know what kind of field this is? So - // just use progressive. if (!g_ActiveConfig.bUseXFB) { + // XXX: Without the VI, how would we know what kind of field this is? So + // just use progressive. Renderer::Swap(xfbAddr, FIELD_PROGRESSIVE, fbWidth, fbHeight); Common::AtomicStoreRelease(s_swapRequested, FALSE); } @@ -1019,9 +1013,7 @@ void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight) } // this function is called after the XFB field is changed, not after // EFB is copied to XFB. In this way, flickering is reduced in games - // and seems to also give more FPS in ZTP - if (field == FIELD_LOWER) - xfbAddr -= fbWidth * 2; + // and seems to also give more FPS in ZTP u32 xfbCount = 0; const XFBSource** xfbSourceList = FBManager.GetXFBSource(xfbAddr, fbWidth, fbHeight, xfbCount); @@ -1029,9 +1021,7 @@ void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight) { g_VideoInitialize.pCopiedToXFB(false); return; - } - - + } Renderer::ResetAPIState(); // Set the backbuffer as the rendering target @@ -1319,7 +1309,7 @@ void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight) D3D::dev->SetDepthStencilSurface(FBManager.GetEFBDepthRTSurface()); UpdateViewport(); VertexShaderManager::SetViewportChanged(); - g_VideoInitialize.pCopiedToXFB(false); + g_VideoInitialize.pCopiedToXFB(true); XFBWrited = false; } diff --git a/Source/Plugins/Plugin_VideoDX9/Src/VertexShaderCache.cpp b/Source/Plugins/Plugin_VideoDX9/Src/VertexShaderCache.cpp index 79ee04218c..3bd94b2210 100644 --- a/Source/Plugins/Plugin_VideoDX9/Src/VertexShaderCache.cpp +++ b/Source/Plugins/Plugin_VideoDX9/Src/VertexShaderCache.cpp @@ -165,14 +165,12 @@ void VertexShaderCache::Init() sprintf(vProg,"struct VSOUTPUT\n" "{\n" "float4 vPosition : POSITION;\n" - "float4 vColor0 : COLOR0;\n" "float2 vTexCoord : TEXCOORD0;\n" "};\n" - "VSOUTPUT main(float4 inPosition : POSITION,float2 inTEX0 : TEXCOORD0,float4 inColor0: COLOR0)\n" + "VSOUTPUT main(float4 inPosition : POSITION,float2 inTEX0 : TEXCOORD0)\n" "{\n" "VSOUTPUT OUT;\n" "OUT.vPosition = inPosition;\n" - "OUT.vColor0 = inColor0;\n" "OUT.vTexCoord = inTEX0;\n" "return OUT;\n" "}\n"); diff --git a/Source/Plugins/Plugin_VideoDX9/Src/main.cpp b/Source/Plugins/Plugin_VideoDX9/Src/main.cpp index 9db267fe85..062dff2118 100644 --- a/Source/Plugins/Plugin_VideoDX9/Src/main.cpp +++ b/Source/Plugins/Plugin_VideoDX9/Src/main.cpp @@ -358,7 +358,6 @@ void Video_BeginField(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight) { if (s_PluginInitialized && g_ActiveConfig.bUseXFB) { - // Make sure previous swap request has made it to the screen s_beginFieldArgs.xfbAddr = xfbAddr; s_beginFieldArgs.field = field; s_beginFieldArgs.fbWidth = fbWidth; @@ -372,8 +371,7 @@ void Video_BeginField(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight) Common::YieldCPU(); } else - VideoFifo_CheckSwapRequest(); - + VideoFifo_CheckSwapRequest(); } } diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp b/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp index 8aae9d64e4..4161465b06 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp @@ -805,9 +805,7 @@ void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight) { g_VideoInitialize.pCopiedToXFB(false); return; - } - if (field == FIELD_LOWER) - xfbAddr -= fbWidth * 2; + } u32 xfbCount = 0; const XFBSource** xfbSourceList = g_framebufferManager.GetXFBSource(xfbAddr, fbWidth, fbHeight, xfbCount); @@ -1143,7 +1141,7 @@ void Renderer::Swap(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight) // Renderer::SetZBufferRender(); // SaveTexture("tex.tga", GL_TEXTURE_RECTANGLE_ARB, s_FakeZTarget, GetTargetWidth(), GetTargetHeight()); - g_VideoInitialize.pCopiedToXFB(false); + g_VideoInitialize.pCopiedToXFB(true); XFBWrited = false; } diff --git a/Source/Plugins/Plugin_VideoOGL/Src/main.cpp b/Source/Plugins/Plugin_VideoOGL/Src/main.cpp index 83070999cd..4f799514c3 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/main.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/main.cpp @@ -521,12 +521,6 @@ void Video_BeginField(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight) { if (s_PluginInitialized && g_ActiveConfig.bUseXFB) { - s_beginFieldArgs.xfbAddr = xfbAddr; - s_beginFieldArgs.field = field; - s_beginFieldArgs.fbWidth = fbWidth; - s_beginFieldArgs.fbHeight = fbHeight; - - Common::AtomicStoreRelease(s_swapRequested, TRUE); if (g_VideoInitialize.bOnThread) { while (Common::AtomicLoadAcquire(s_swapRequested) && !s_FifoShuttingDown) @@ -535,6 +529,12 @@ void Video_BeginField(u32 xfbAddr, FieldType field, u32 fbWidth, u32 fbHeight) } else VideoFifo_CheckSwapRequest(); + s_beginFieldArgs.xfbAddr = xfbAddr; + s_beginFieldArgs.field = field; + s_beginFieldArgs.fbWidth = fbWidth; + s_beginFieldArgs.fbHeight = fbHeight; + + Common::AtomicStoreRelease(s_swapRequested, TRUE); } }