From afe47ff8479ceb816e54aab2523cb6cccf046923 Mon Sep 17 00:00:00 2001 From: Scott Mansell Date: Sun, 24 Nov 2013 00:15:08 +1300 Subject: [PATCH] Increase res of color texture to match PAL Super Smash Bros: Brawl The pal version of SSBB has a 640x568 xfb, which is larger than the efb. Increase the size of the static textures and put in some runtime checks to prevent buffer overruns. --- Source/Core/VideoBackends/Software/Src/EfbInterface.cpp | 5 +++++ Source/Core/VideoBackends/Software/Src/SWRenderer.cpp | 7 ++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/Source/Core/VideoBackends/Software/Src/EfbInterface.cpp b/Source/Core/VideoBackends/Software/Src/EfbInterface.cpp index e3b3481b8a..8fdcb5fa04 100644 --- a/Source/Core/VideoBackends/Software/Src/EfbInterface.cpp +++ b/Source/Core/VideoBackends/Software/Src/EfbInterface.cpp @@ -551,6 +551,11 @@ namespace EfbInterface // Like CopyToXFB, but we copy directly into the opengl colour texture without going via Gamecube main memory or doing a yuyv conversion void BypassXFB(u8* texture, u32 fbWidth, u32 fbHeight, const EFBRectangle& sourceRc, float Gamma) { + if(fbWidth*fbHeight > 640*568) { + ERROR_LOG(VIDEO, "Framebuffer is too large: %ix%i", fbWidth, fbHeight); + return; + } + u32 color; u8* colorPtr = (u8*)&color; u32* texturePtr = (u32*)texture; diff --git a/Source/Core/VideoBackends/Software/Src/SWRenderer.cpp b/Source/Core/VideoBackends/Software/Src/SWRenderer.cpp index 83d542bcec..62d2970160 100644 --- a/Source/Core/VideoBackends/Software/Src/SWRenderer.cpp +++ b/Source/Core/VideoBackends/Software/Src/SWRenderer.cpp @@ -20,7 +20,7 @@ static GLint attr_pos = -1, attr_tex = -1; static GLint uni_tex = -1; static GLuint program; -static u8 s_xfbColorTexture[2][EFB_WIDTH*EFB_HEIGHT*4]; +static u8 s_xfbColorTexture[2][640*568*4]; static int s_currentColorTexture = 0; static volatile bool s_bScreenshot; @@ -154,6 +154,11 @@ void SWRenderer::swapColorTexture() { void SWRenderer::UpdateColorTexture(EfbInterface::yuv422_packed *xfb, u32 fbWidth, u32 fbHeight) { + if(fbWidth*fbHeight > 640*568) { + ERROR_LOG(VIDEO, "Framebuffer is too large: %ix%i", fbWidth, fbHeight); + return; + } + u32 offset = 0; u8 *TexturePointer = getColorTexture();