From 2e28ed3291bc531ba5d0cd4057aa9cefdbf128be Mon Sep 17 00:00:00 2001 From: booto Date: Tue, 7 Jul 2015 21:09:25 +0800 Subject: Video: respect stride of efb copies to xfb --- Source/Core/VideoCommon/BPStructs.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'Source/Core/VideoCommon/BPStructs.cpp') diff --git a/Source/Core/VideoCommon/BPStructs.cpp b/Source/Core/VideoCommon/BPStructs.cpp index 410d4d44cc..92ab0bf63f 100644 --- a/Source/Core/VideoCommon/BPStructs.cpp +++ b/Source/Core/VideoCommon/BPStructs.cpp @@ -251,9 +251,10 @@ static void BPWritten(const BPCmd& bp) height = MAX_XFB_HEIGHT; } - u32 width = bpmem.copyMipMapStrideChannels << 4; - - Renderer::RenderToXFB(destAddr, srcRect, width, height, s_gammaLUT[PE_copy.gamma]); + u32 stride = bpmem.copyMipMapStrideChannels << 4; + WARN_LOG(VIDEO, "RenderToXFB: destAddr: %08x | srcRect {%d %d %d %d} | fbWidth: %u | fbStride: %u | fbHeight: %u", + destAddr, srcRect.left, srcRect.top, srcRect.right, srcRect.bottom, bpmem.copyTexSrcWH.x + 1, stride, height); + Renderer::RenderToXFB(destAddr, srcRect, stride, height, s_gammaLUT[PE_copy.gamma]); } // Clear the rectangular region after copying it. -- cgit v1.2.3 From efd250494d62272451bed3257771f6dae6edb695 Mon Sep 17 00:00:00 2001 From: booto Date: Sat, 25 Jul 2015 02:48:56 +0800 Subject: Video: stride in bytes rather than pixels --- Source/Core/VideoCommon/BPStructs.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Core/VideoCommon/BPStructs.cpp') diff --git a/Source/Core/VideoCommon/BPStructs.cpp b/Source/Core/VideoCommon/BPStructs.cpp index 92ab0bf63f..5d1f3cfb08 100644 --- a/Source/Core/VideoCommon/BPStructs.cpp +++ b/Source/Core/VideoCommon/BPStructs.cpp @@ -251,7 +251,7 @@ static void BPWritten(const BPCmd& bp) height = MAX_XFB_HEIGHT; } - u32 stride = bpmem.copyMipMapStrideChannels << 4; + u32 stride = bpmem.copyMipMapStrideChannels << 5; WARN_LOG(VIDEO, "RenderToXFB: destAddr: %08x | srcRect {%d %d %d %d} | fbWidth: %u | fbStride: %u | fbHeight: %u", destAddr, srcRect.left, srcRect.top, srcRect.right, srcRect.bottom, bpmem.copyTexSrcWH.x + 1, stride, height); Renderer::RenderToXFB(destAddr, srcRect, stride, height, s_gammaLUT[PE_copy.gamma]); -- cgit v1.2.3 From 86dce8b0f7d7503ff4d7bf275618ca740f91fe26 Mon Sep 17 00:00:00 2001 From: booto Date: Mon, 27 Jul 2015 10:22:40 +0800 Subject: VideoCommon: reduce level of debug output --- Source/Core/VideoCommon/BPStructs.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Core/VideoCommon/BPStructs.cpp') diff --git a/Source/Core/VideoCommon/BPStructs.cpp b/Source/Core/VideoCommon/BPStructs.cpp index 5d1f3cfb08..b4d3cce959 100644 --- a/Source/Core/VideoCommon/BPStructs.cpp +++ b/Source/Core/VideoCommon/BPStructs.cpp @@ -252,7 +252,7 @@ static void BPWritten(const BPCmd& bp) } u32 stride = bpmem.copyMipMapStrideChannels << 5; - WARN_LOG(VIDEO, "RenderToXFB: destAddr: %08x | srcRect {%d %d %d %d} | fbWidth: %u | fbStride: %u | fbHeight: %u", + DEBUG_LOG(VIDEO, "RenderToXFB: destAddr: %08x | srcRect {%d %d %d %d} | fbWidth: %u | fbStride: %u | fbHeight: %u", destAddr, srcRect.left, srcRect.top, srcRect.right, srcRect.bottom, bpmem.copyTexSrcWH.x + 1, stride, height); Renderer::RenderToXFB(destAddr, srcRect, stride, height, s_gammaLUT[PE_copy.gamma]); } -- cgit v1.2.3 From 5a32c3fba49cbe62f1f6447d681ac6717c032f99 Mon Sep 17 00:00:00 2001 From: booto Date: Thu, 3 Sep 2015 03:57:03 +0800 Subject: VideoCommon: xfb height calculation adjusted Baten Kaitos allocates its XFBs from a tagged heap structure. With the old calculation, too many lines were being written so the tag of the allocation after the XFB was being corrupted. Fixes crash mentioned in this comment: https://code.google.com/p/dolphin-emu/issues/detail?id=7734#c6 --- Source/Core/VideoCommon/BPStructs.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Core/VideoCommon/BPStructs.cpp') diff --git a/Source/Core/VideoCommon/BPStructs.cpp b/Source/Core/VideoCommon/BPStructs.cpp index b4d3cce959..cacb005143 100644 --- a/Source/Core/VideoCommon/BPStructs.cpp +++ b/Source/Core/VideoCommon/BPStructs.cpp @@ -241,7 +241,7 @@ static void BPWritten(const BPCmd& bp) else yScale = (float)bpmem.dispcopyyscale / 256.0f; - float num_xfb_lines = ((bpmem.copyTexSrcWH.y + 1.0f) * yScale); + float num_xfb_lines = 1.0f + bpmem.copyTexSrcWH.y * yScale; u32 height = static_cast(num_xfb_lines); if (height > MAX_XFB_HEIGHT) -- cgit v1.2.3 From 0af2bbcea3025aae0eb69cde63e2284cdfa7e738 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Fri, 4 Sep 2015 15:32:30 +0200 Subject: Remove extra space from 5a32c3f --- Source/Core/VideoCommon/BPStructs.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Source/Core/VideoCommon/BPStructs.cpp') diff --git a/Source/Core/VideoCommon/BPStructs.cpp b/Source/Core/VideoCommon/BPStructs.cpp index cacb005143..2717fe4b21 100644 --- a/Source/Core/VideoCommon/BPStructs.cpp +++ b/Source/Core/VideoCommon/BPStructs.cpp @@ -241,7 +241,7 @@ static void BPWritten(const BPCmd& bp) else yScale = (float)bpmem.dispcopyyscale / 256.0f; - float num_xfb_lines = 1.0f + bpmem.copyTexSrcWH.y * yScale; + float num_xfb_lines = 1.0f + bpmem.copyTexSrcWH.y * yScale; u32 height = static_cast(num_xfb_lines); if (height > MAX_XFB_HEIGHT) -- cgit v1.2.3 From 52948bb3ef016abd7e35e775b17b7cf3f487d49c Mon Sep 17 00:00:00 2001 From: Scott Mansell Date: Tue, 1 Sep 2015 02:41:16 +1200 Subject: Cleanup and unify handling of efb copy stride. --- Source/Core/VideoCommon/BPStructs.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'Source/Core/VideoCommon/BPStructs.cpp') diff --git a/Source/Core/VideoCommon/BPStructs.cpp b/Source/Core/VideoCommon/BPStructs.cpp index 2717fe4b21..e30aa2fcaa 100644 --- a/Source/Core/VideoCommon/BPStructs.cpp +++ b/Source/Core/VideoCommon/BPStructs.cpp @@ -20,6 +20,7 @@ #include "VideoCommon/PixelShaderManager.h" #include "VideoCommon/RenderBase.h" #include "VideoCommon/Statistics.h" +#include "VideoCommon/TextureCacheBase.h" #include "VideoCommon/TextureDecoder.h" #include "VideoCommon/VertexShaderManager.h" #include "VideoCommon/VideoCommon.h" @@ -205,6 +206,7 @@ static void BPWritten(const BPCmd& bp) // The values in bpmem.copyTexSrcXY and bpmem.copyTexSrcWH are updated in case 0x49 and 0x4a in this function u32 destAddr = bpmem.copyTexDest << 5; + u32 destStride = bpmem.copyMipMapStrideChannels << 5; EFBRectangle srcRect; srcRect.left = (int)bpmem.copyTexSrcXY.x; @@ -223,8 +225,9 @@ static void BPWritten(const BPCmd& bp) if (g_ActiveConfig.bShowEFBCopyRegions) stats.efb_regions.push_back(srcRect); - CopyEFB(destAddr, srcRect, - PE_copy.tp_realFormat(), bpmem.zcontrol.pixel_format, + // bpmem.zcontrol.pixel_format to PEControl::Z24 is when the game wants to copy from ZBuffer (Zbuffer uses 24-bit Format) + TextureCache::CopyRenderTargetToTexture(destAddr, PE_copy.tp_realFormat(), destStride, + bpmem.zcontrol.pixel_format, srcRect, !!PE_copy.intensity_fmt, !!PE_copy.half_scale); } else @@ -251,10 +254,9 @@ static void BPWritten(const BPCmd& bp) height = MAX_XFB_HEIGHT; } - u32 stride = bpmem.copyMipMapStrideChannels << 5; DEBUG_LOG(VIDEO, "RenderToXFB: destAddr: %08x | srcRect {%d %d %d %d} | fbWidth: %u | fbStride: %u | fbHeight: %u", - destAddr, srcRect.left, srcRect.top, srcRect.right, srcRect.bottom, bpmem.copyTexSrcWH.x + 1, stride, height); - Renderer::RenderToXFB(destAddr, srcRect, stride, height, s_gammaLUT[PE_copy.gamma]); + destAddr, srcRect.left, srcRect.top, srcRect.right, srcRect.bottom, bpmem.copyTexSrcWH.x + 1, destStride, height); + Renderer::RenderToXFB(destAddr, srcRect, destStride, height, s_gammaLUT[PE_copy.gamma]); } // Clear the rectangular region after copying it. -- cgit v1.2.3 From a355d9868e855e0bbba766d6a5550bf88f1defe7 Mon Sep 17 00:00:00 2001 From: Scott Mansell Date: Tue, 8 Sep 2015 03:05:47 +1200 Subject: FifoRecorder: Use Video Common to record efb2ram correctly. Texture updates have been moved into TextureCache, while TMEM updates where moved into bpmem. Code for handling efb2ram updates was added to TextureCache. There was a bug for preloaded RGBA8 textures, it only copied half the texture. The TODO was wrong too. --- Source/Core/VideoCommon/BPStructs.cpp | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) (limited to 'Source/Core/VideoCommon/BPStructs.cpp') diff --git a/Source/Core/VideoCommon/BPStructs.cpp b/Source/Core/VideoCommon/BPStructs.cpp index e30aa2fcaa..4dc4643afb 100644 --- a/Source/Core/VideoCommon/BPStructs.cpp +++ b/Source/Core/VideoCommon/BPStructs.cpp @@ -8,6 +8,7 @@ #include "Common/Thread.h" #include "Core/ConfigManager.h" #include "Core/Core.h" +#include "Core/FifoPlayer/FifoRecorder.h" #include "Core/HW/Memmap.h" #include "VideoCommon/BoundingBox.h" @@ -281,6 +282,9 @@ static void BPWritten(const BPCmd& bp) Memory::CopyFromEmu(texMem + tlutTMemAddr, addr, tlutXferCount); + if (g_bRecordFifoData) + FifoRecorder::GetInstance().UseMemory(addr, tlutXferCount, MemoryUpdate::TMEM); + return; } case BPMEM_FOGRANGE: // Fog Settings Control @@ -455,15 +459,16 @@ static void BPWritten(const BPCmd& bp) BPS_TmemConfig& tmem_cfg = bpmem.tmem_config; u32 src_addr = tmem_cfg.preload_addr << 5; // TODO: Should we add mask here on GC? - u32 size = tmem_cfg.preload_tile_info.count * TMEM_LINE_SIZE; + u32 bytes_read = 0; u32 tmem_addr_even = tmem_cfg.preload_tmem_even * TMEM_LINE_SIZE; if (tmem_cfg.preload_tile_info.type != 3) { - if (tmem_addr_even + size > TMEM_SIZE) - size = TMEM_SIZE - tmem_addr_even; + bytes_read = tmem_cfg.preload_tile_info.count * TMEM_LINE_SIZE; + if (tmem_addr_even + bytes_read > TMEM_SIZE) + bytes_read = TMEM_SIZE - tmem_addr_even; - Memory::CopyFromEmu(texMem + tmem_addr_even, src_addr, size); + Memory::CopyFromEmu(texMem + tmem_addr_even, src_addr, bytes_read); } else // RGBA8 tiles (and CI14, but that might just be stupid libogc!) { @@ -471,21 +476,23 @@ static void BPWritten(const BPCmd& bp) // AR and GB tiles are stored in separate TMEM banks => can't use a single memcpy for everything u32 tmem_addr_odd = tmem_cfg.preload_tmem_odd * TMEM_LINE_SIZE; + u32 bytes_read = 0; for (u32 i = 0; i < tmem_cfg.preload_tile_info.count; ++i) { - if (tmem_addr_even + TMEM_LINE_SIZE > TMEM_SIZE || - tmem_addr_odd + TMEM_LINE_SIZE > TMEM_SIZE) - return; + if (tmem_addr_even + TMEM_LINE_SIZE > TMEM_SIZE || tmem_addr_odd + TMEM_LINE_SIZE > TMEM_SIZE) + break; - // TODO: This isn't very optimised, does a whole lot of small memcpys - memcpy(texMem + tmem_addr_even, src_ptr, TMEM_LINE_SIZE); - memcpy(texMem + tmem_addr_odd, src_ptr + TMEM_LINE_SIZE, TMEM_LINE_SIZE); + memcpy(texMem + tmem_addr_even, src_ptr + bytes_read, TMEM_LINE_SIZE); + memcpy(texMem + tmem_addr_odd, src_ptr + bytes_read + TMEM_LINE_SIZE, TMEM_LINE_SIZE); tmem_addr_even += TMEM_LINE_SIZE; tmem_addr_odd += TMEM_LINE_SIZE; - src_ptr += TMEM_LINE_SIZE * 2; + bytes_read += TMEM_LINE_SIZE * 2; } } + + if (g_bRecordFifoData) + FifoRecorder::GetInstance().UseMemory(src_addr, bytes_read, MemoryUpdate::TMEM); } return; -- cgit v1.2.3 From a48e425f41cb430e1e39d7affb7d8c412761f150 Mon Sep 17 00:00:00 2001 From: Rohit Nirmal Date: Wed, 23 Sep 2015 11:00:53 -0500 Subject: Silence -Wshadow warning. --- Source/Core/VideoCommon/BPStructs.cpp | 1 - 1 file changed, 1 deletion(-) (limited to 'Source/Core/VideoCommon/BPStructs.cpp') diff --git a/Source/Core/VideoCommon/BPStructs.cpp b/Source/Core/VideoCommon/BPStructs.cpp index 4dc4643afb..4e3df7cc00 100644 --- a/Source/Core/VideoCommon/BPStructs.cpp +++ b/Source/Core/VideoCommon/BPStructs.cpp @@ -476,7 +476,6 @@ static void BPWritten(const BPCmd& bp) // AR and GB tiles are stored in separate TMEM banks => can't use a single memcpy for everything u32 tmem_addr_odd = tmem_cfg.preload_tmem_odd * TMEM_LINE_SIZE; - u32 bytes_read = 0; for (u32 i = 0; i < tmem_cfg.preload_tile_info.count; ++i) { -- cgit v1.2.3