diff options
| author | Jules Blok <jules.blok@gmail.com> | 2015-06-10 00:00:12 +0200 |
|---|---|---|
| committer | Jules Blok <jules.blok@gmail.com> | 2015-06-10 00:00:12 +0200 |
| commit | 7dfced21a2e5aac7195e0e1ad76468e30306766b (patch) | |
| tree | bd671b639d3d911460b767caabad8fc8a759a6bf /Source/Core/VideoCommon/FramebufferManagerBase.h | |
| parent | c25be031fc1031d795157d8344b87b7841145197 (diff) | |
| parent | 7b0a65e295c784f9d573f2ef52d4e2a7b9bb2889 (diff) | |
Merge branch 'master' into stable
Diffstat (limited to 'Source/Core/VideoCommon/FramebufferManagerBase.h')
| -rw-r--r-- | Source/Core/VideoCommon/FramebufferManagerBase.h | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/Source/Core/VideoCommon/FramebufferManagerBase.h b/Source/Core/VideoCommon/FramebufferManagerBase.h new file mode 100644 index 0000000000..bd6360877c --- /dev/null +++ b/Source/Core/VideoCommon/FramebufferManagerBase.h @@ -0,0 +1,105 @@ +// Copyright 2010 Dolphin Emulator Project +// Licensed under GPLv2+ +// Refer to the license.txt file included. + +#pragma once + +#include <list> + +#include "VideoCommon/VideoCommon.h" + +inline bool AddressRangesOverlap(u32 aLower, u32 aUpper, u32 bLower, u32 bUpper) +{ + return !((aLower >= bUpper) || (bLower >= aUpper)); +} + +struct XFBSourceBase +{ + virtual ~XFBSourceBase() {} + + virtual void DecodeToTexture(u32 xfbAddr, u32 fbWidth, u32 fbHeight) = 0; + + virtual void CopyEFB(float Gamma) = 0; + + u32 srcAddr; + u32 srcWidth; + u32 srcHeight; + + unsigned int texWidth; + unsigned int texHeight; + + // TODO: only used by OGL + TargetRectangle sourceRc; +}; + +class FramebufferManagerBase +{ +public: + enum + { + // There may be multiple XFBs in GameCube RAM. This is the maximum number to + // virtualize. + MAX_VIRTUAL_XFB = 8 + }; + + FramebufferManagerBase(); + virtual ~FramebufferManagerBase(); + + static void CopyToXFB(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRectangle& sourceRc,float Gamma); + static const XFBSourceBase* const* GetXFBSource(u32 xfbAddr, u32 fbWidth, u32 fbHeight, u32* xfbCount); + + static void SetLastXfbWidth(unsigned int width) { s_last_xfb_width = width; } + static void SetLastXfbHeight(unsigned int height) { s_last_xfb_height = height; } + static unsigned int LastXfbWidth() { return s_last_xfb_width; } + static unsigned int LastXfbHeight() { return s_last_xfb_height; } + + static int ScaleToVirtualXfbWidth(int x); + static int ScaleToVirtualXfbHeight(int y); + + static unsigned int GetEFBLayers() { return m_EFBLayers; } + +protected: + struct VirtualXFB + { + VirtualXFB() + { + } + + // Address and size in GameCube RAM + u32 xfbAddr = 0; + u32 xfbWidth = 0; + u32 xfbHeight = 0; + + XFBSourceBase* xfbSource = nullptr; + }; + + typedef std::list<VirtualXFB> VirtualXFBListType; + + static unsigned int m_EFBLayers; + +private: + virtual XFBSourceBase* CreateXFBSource(unsigned int target_width, unsigned int target_height, unsigned int layers) = 0; + // TODO: figure out why OGL is different for this guy + virtual void GetTargetSize(unsigned int *width, unsigned int *height) = 0; + + static VirtualXFBListType::iterator FindVirtualXFB(u32 xfbAddr, u32 width, u32 height); + + static void ReplaceVirtualXFB(); + + // TODO: merge these virtual funcs, they are nearly all the same + virtual void CopyToRealXFB(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRectangle& sourceRc,float Gamma = 1.0f) = 0; + static void CopyToVirtualXFB(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRectangle& sourceRc,float Gamma = 1.0f); + + static const XFBSourceBase* const* GetRealXFBSource(u32 xfbAddr, u32 fbWidth, u32 fbHeight, u32* xfbCount); + static const XFBSourceBase* const* GetVirtualXFBSource(u32 xfbAddr, u32 fbWidth, u32 fbHeight, u32* xfbCount); + + static XFBSourceBase *m_realXFBSource; // Only used in Real XFB mode + static VirtualXFBListType m_virtualXFBList; // Only used in Virtual XFB mode + + static const XFBSourceBase* m_overlappingXFBArray[MAX_VIRTUAL_XFB]; + + static unsigned int s_last_xfb_width; + static unsigned int s_last_xfb_height; +}; + +extern FramebufferManagerBase *g_framebuffer_manager; |
