mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2024-11-15 05:47:56 -07:00
Merge pull request #3372 from lioncash/framebuffer
FramebufferManagerBase: Get rid of explicit delete and new
This commit is contained in:
commit
4c428ed019
@ -2,6 +2,8 @@
|
|||||||
// Licensed under GPLv2+
|
// Licensed under GPLv2+
|
||||||
// Refer to the license.txt file included.
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
#include "Core/HW/Memmap.h"
|
#include "Core/HW/Memmap.h"
|
||||||
#include "VideoBackends/D3D/D3DBase.h"
|
#include "VideoBackends/D3D/D3DBase.h"
|
||||||
#include "VideoBackends/D3D/D3DUtil.h"
|
#include "VideoBackends/D3D/D3DUtil.h"
|
||||||
@ -13,7 +15,8 @@
|
|||||||
#include "VideoBackends/D3D/XFBEncoder.h"
|
#include "VideoBackends/D3D/XFBEncoder.h"
|
||||||
#include "VideoCommon/VideoConfig.h"
|
#include "VideoCommon/VideoConfig.h"
|
||||||
|
|
||||||
namespace DX11 {
|
namespace DX11
|
||||||
|
{
|
||||||
|
|
||||||
static XFBEncoder s_xfbEncoder;
|
static XFBEncoder s_xfbEncoder;
|
||||||
|
|
||||||
@ -176,9 +179,9 @@ void FramebufferManager::CopyToRealXFB(u32 xfbAddr, u32 fbStride, u32 fbHeight,
|
|||||||
s_xfbEncoder.Encode(dst, fbStride/2, fbHeight, sourceRc, Gamma);
|
s_xfbEncoder.Encode(dst, fbStride/2, fbHeight, sourceRc, Gamma);
|
||||||
}
|
}
|
||||||
|
|
||||||
XFBSourceBase* FramebufferManager::CreateXFBSource(unsigned int target_width, unsigned int target_height, unsigned int layers)
|
std::unique_ptr<XFBSourceBase> FramebufferManager::CreateXFBSource(unsigned int target_width, unsigned int target_height, unsigned int layers)
|
||||||
{
|
{
|
||||||
return new XFBSource(D3DTexture2D::Create(target_width, target_height,
|
return std::make_unique<XFBSource>(D3DTexture2D::Create(target_width, target_height,
|
||||||
(D3D11_BIND_FLAG)(D3D11_BIND_RENDER_TARGET|D3D11_BIND_SHADER_RESOURCE),
|
(D3D11_BIND_FLAG)(D3D11_BIND_RENDER_TARGET|D3D11_BIND_SHADER_RESOURCE),
|
||||||
D3D11_USAGE_DEFAULT, DXGI_FORMAT_R8G8B8A8_UNORM, 1, layers), layers);
|
D3D11_USAGE_DEFAULT, DXGI_FORMAT_R8G8B8A8_UNORM, 1, layers), layers);
|
||||||
}
|
}
|
||||||
|
@ -4,13 +4,14 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "d3d11.h"
|
#include <d3d11.h>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
#include "VideoBackends/D3D/D3DTexture.h"
|
#include "VideoBackends/D3D/D3DTexture.h"
|
||||||
#include "VideoCommon/FramebufferManagerBase.h"
|
#include "VideoCommon/FramebufferManagerBase.h"
|
||||||
|
|
||||||
namespace DX11 {
|
namespace DX11
|
||||||
|
{
|
||||||
// On the GameCube, the game sends a request for the graphics processor to
|
// On the GameCube, the game sends a request for the graphics processor to
|
||||||
// transfer its internal EFB (Embedded Framebuffer) to an area in GameCube RAM
|
// transfer its internal EFB (Embedded Framebuffer) to an area in GameCube RAM
|
||||||
// called the XFB (External Framebuffer). The size and location of the XFB is
|
// called the XFB (External Framebuffer). The size and location of the XFB is
|
||||||
@ -80,7 +81,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
XFBSourceBase* CreateXFBSource(unsigned int target_width, unsigned int target_height, unsigned int layers) override;
|
std::unique_ptr<XFBSourceBase> CreateXFBSource(unsigned int target_width, unsigned int target_height, unsigned int layers) override;
|
||||||
void GetTargetSize(unsigned int *width, unsigned int *height) override;
|
void GetTargetSize(unsigned int *width, unsigned int *height) override;
|
||||||
|
|
||||||
void CopyToRealXFB(u32 xfbAddr, u32 fbStride, u32 fbHeight, const EFBRectangle& sourceRc,float Gamma) override;
|
void CopyToRealXFB(u32 xfbAddr, u32 fbStride, u32 fbHeight, const EFBRectangle& sourceRc,float Gamma) override;
|
||||||
|
@ -2,6 +2,8 @@
|
|||||||
// Licensed under GPLv2+
|
// Licensed under GPLv2+
|
||||||
// Refer to the license.txt file included.
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
#include "Common/Common.h"
|
#include "Common/Common.h"
|
||||||
#include "Common/CommonFuncs.h"
|
#include "Common/CommonFuncs.h"
|
||||||
#include "Common/GL/GLInterfaceBase.h"
|
#include "Common/GL/GLInterfaceBase.h"
|
||||||
@ -623,7 +625,7 @@ void XFBSource::CopyEFB(float Gamma)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
XFBSourceBase* FramebufferManager::CreateXFBSource(unsigned int target_width, unsigned int target_height, unsigned int layers)
|
std::unique_ptr<XFBSourceBase> FramebufferManager::CreateXFBSource(unsigned int target_width, unsigned int target_height, unsigned int layers)
|
||||||
{
|
{
|
||||||
GLuint texture;
|
GLuint texture;
|
||||||
|
|
||||||
@ -634,7 +636,7 @@ XFBSourceBase* FramebufferManager::CreateXFBSource(unsigned int target_width, un
|
|||||||
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 0);
|
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 0);
|
||||||
glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, target_width, target_height, layers, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
|
glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, target_width, target_height, layers, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
|
||||||
|
|
||||||
return new XFBSource(texture, layers);
|
return std::make_unique<XFBSource>(texture, layers);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FramebufferManager::GetTargetSize(unsigned int *width, unsigned int *height)
|
void FramebufferManager::GetTargetSize(unsigned int *width, unsigned int *height)
|
||||||
|
@ -4,11 +4,11 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "Common/GL/GLUtil.h"
|
#include <memory>
|
||||||
|
|
||||||
|
#include "Common/GL/GLUtil.h"
|
||||||
#include "VideoBackends/OGL/ProgramShaderCache.h"
|
#include "VideoBackends/OGL/ProgramShaderCache.h"
|
||||||
#include "VideoBackends/OGL/Render.h"
|
#include "VideoBackends/OGL/Render.h"
|
||||||
|
|
||||||
#include "VideoCommon/FramebufferManagerBase.h"
|
#include "VideoCommon/FramebufferManagerBase.h"
|
||||||
|
|
||||||
// On the GameCube, the game sends a request for the graphics processor to
|
// On the GameCube, the game sends a request for the graphics processor to
|
||||||
@ -95,7 +95,7 @@ public:
|
|||||||
static void PokeEFB(EFBAccessType type, const std::vector<EfbPokeData>& data);
|
static void PokeEFB(EFBAccessType type, const std::vector<EfbPokeData>& data);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
XFBSourceBase* CreateXFBSource(unsigned int target_width, unsigned int target_height, unsigned int layers) override;
|
std::unique_ptr<XFBSourceBase> CreateXFBSource(unsigned int target_width, unsigned int target_height, unsigned int layers) override;
|
||||||
void GetTargetSize(unsigned int *width, unsigned int *height) override;
|
void GetTargetSize(unsigned int *width, unsigned int *height) override;
|
||||||
|
|
||||||
void CopyToRealXFB(u32 xfbAddr, u32 fbStride, u32 fbHeight, const EFBRectangle& sourceRc,float Gamma) override;
|
void CopyToRealXFB(u32 xfbAddr, u32 fbStride, u32 fbHeight, const EFBRectangle& sourceRc,float Gamma) override;
|
||||||
|
@ -3,15 +3,17 @@
|
|||||||
// Refer to the license.txt file included.
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <array>
|
||||||
|
#include <memory>
|
||||||
#include "VideoCommon/FramebufferManagerBase.h"
|
#include "VideoCommon/FramebufferManagerBase.h"
|
||||||
#include "VideoCommon/RenderBase.h"
|
#include "VideoCommon/RenderBase.h"
|
||||||
#include "VideoCommon/VideoConfig.h"
|
#include "VideoCommon/VideoConfig.h"
|
||||||
|
|
||||||
FramebufferManagerBase *g_framebuffer_manager;
|
FramebufferManagerBase *g_framebuffer_manager;
|
||||||
|
|
||||||
XFBSourceBase *FramebufferManagerBase::m_realXFBSource; // Only used in Real XFB mode
|
std::unique_ptr<XFBSourceBase> FramebufferManagerBase::m_realXFBSource; // Only used in Real XFB mode
|
||||||
FramebufferManagerBase::VirtualXFBListType FramebufferManagerBase::m_virtualXFBList; // Only used in Virtual XFB mode
|
FramebufferManagerBase::VirtualXFBListType FramebufferManagerBase::m_virtualXFBList; // Only used in Virtual XFB mode
|
||||||
const XFBSourceBase* FramebufferManagerBase::m_overlappingXFBArray[MAX_VIRTUAL_XFB];
|
std::array<const XFBSourceBase*, FramebufferManagerBase::MAX_VIRTUAL_XFB> FramebufferManagerBase::m_overlappingXFBArray;
|
||||||
|
|
||||||
unsigned int FramebufferManagerBase::s_last_xfb_width = 1;
|
unsigned int FramebufferManagerBase::s_last_xfb_width = 1;
|
||||||
unsigned int FramebufferManagerBase::s_last_xfb_height = 1;
|
unsigned int FramebufferManagerBase::s_last_xfb_height = 1;
|
||||||
@ -20,21 +22,16 @@ unsigned int FramebufferManagerBase::m_EFBLayers = 1;
|
|||||||
|
|
||||||
FramebufferManagerBase::FramebufferManagerBase()
|
FramebufferManagerBase::FramebufferManagerBase()
|
||||||
{
|
{
|
||||||
m_realXFBSource = nullptr;
|
// Can't hurt
|
||||||
|
m_overlappingXFBArray.fill(nullptr);
|
||||||
// can't hurt
|
|
||||||
memset(m_overlappingXFBArray, 0, sizeof(m_overlappingXFBArray));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FramebufferManagerBase::~FramebufferManagerBase()
|
FramebufferManagerBase::~FramebufferManagerBase()
|
||||||
{
|
{
|
||||||
for (VirtualXFB& vxfb : m_virtualXFBList)
|
// Necessary, as these are static members
|
||||||
{
|
// (they really shouldn't be and should be refactored at some point).
|
||||||
delete vxfb.xfbSource;
|
|
||||||
}
|
|
||||||
m_virtualXFBList.clear();
|
m_virtualXFBList.clear();
|
||||||
|
m_realXFBSource.reset();
|
||||||
delete m_realXFBSource;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const XFBSourceBase* const* FramebufferManagerBase::GetXFBSource(u32 xfbAddr, u32 fbWidth, u32 fbHeight, u32* xfbCountP)
|
const XFBSourceBase* const* FramebufferManagerBase::GetXFBSource(u32 xfbAddr, u32 fbWidth, u32 fbHeight, u32* xfbCountP)
|
||||||
@ -54,10 +51,7 @@ const XFBSourceBase* const* FramebufferManagerBase::GetRealXFBSource(u32 xfbAddr
|
|||||||
|
|
||||||
// recreate if needed
|
// recreate if needed
|
||||||
if (m_realXFBSource && (m_realXFBSource->texWidth != fbWidth || m_realXFBSource->texHeight != fbHeight))
|
if (m_realXFBSource && (m_realXFBSource->texWidth != fbWidth || m_realXFBSource->texHeight != fbHeight))
|
||||||
{
|
m_realXFBSource.reset();
|
||||||
delete m_realXFBSource;
|
|
||||||
m_realXFBSource = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!m_realXFBSource && g_framebuffer_manager)
|
if (!m_realXFBSource && g_framebuffer_manager)
|
||||||
m_realXFBSource = g_framebuffer_manager->CreateXFBSource(fbWidth, fbHeight, 1);
|
m_realXFBSource = g_framebuffer_manager->CreateXFBSource(fbWidth, fbHeight, 1);
|
||||||
@ -83,7 +77,7 @@ const XFBSourceBase* const* FramebufferManagerBase::GetRealXFBSource(u32 xfbAddr
|
|||||||
// Decode YUYV data from GameCube RAM
|
// Decode YUYV data from GameCube RAM
|
||||||
m_realXFBSource->DecodeToTexture(xfbAddr, fbWidth, fbHeight);
|
m_realXFBSource->DecodeToTexture(xfbAddr, fbWidth, fbHeight);
|
||||||
|
|
||||||
m_overlappingXFBArray[0] = m_realXFBSource;
|
m_overlappingXFBArray[0] = m_realXFBSource.get();
|
||||||
return &m_overlappingXFBArray[0];
|
return &m_overlappingXFBArray[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -109,7 +103,7 @@ const XFBSourceBase* const* FramebufferManagerBase::GetVirtualXFBSource(u32 xfbA
|
|||||||
|
|
||||||
if (AddressRangesOverlap(srcLower, srcUpper, dstLower, dstUpper))
|
if (AddressRangesOverlap(srcLower, srcUpper, dstLower, dstUpper))
|
||||||
{
|
{
|
||||||
m_overlappingXFBArray[xfbCount] = vxfb->xfbSource;
|
m_overlappingXFBArray[xfbCount] = vxfb->xfbSource.get();
|
||||||
++xfbCount;
|
++xfbCount;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -163,10 +157,7 @@ void FramebufferManagerBase::CopyToVirtualXFB(u32 xfbAddr, u32 fbStride, u32 fbH
|
|||||||
|
|
||||||
// recreate if needed
|
// recreate if needed
|
||||||
if (vxfb->xfbSource && (vxfb->xfbSource->texWidth != target_width || vxfb->xfbSource->texHeight != target_height))
|
if (vxfb->xfbSource && (vxfb->xfbSource->texWidth != target_width || vxfb->xfbSource->texHeight != target_height))
|
||||||
{
|
vxfb->xfbSource.reset();
|
||||||
delete vxfb->xfbSource;
|
|
||||||
vxfb->xfbSource = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!vxfb->xfbSource)
|
if (!vxfb->xfbSource)
|
||||||
{
|
{
|
||||||
|
@ -4,7 +4,9 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <array>
|
||||||
#include <list>
|
#include <list>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
#include "VideoCommon/VideoCommon.h"
|
#include "VideoCommon/VideoCommon.h"
|
||||||
|
|
||||||
@ -70,7 +72,7 @@ protected:
|
|||||||
u32 xfbWidth = 0;
|
u32 xfbWidth = 0;
|
||||||
u32 xfbHeight = 0;
|
u32 xfbHeight = 0;
|
||||||
|
|
||||||
XFBSourceBase* xfbSource = nullptr;
|
std::unique_ptr<XFBSourceBase> xfbSource;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef std::list<VirtualXFB> VirtualXFBListType;
|
typedef std::list<VirtualXFB> VirtualXFBListType;
|
||||||
@ -78,7 +80,7 @@ protected:
|
|||||||
static unsigned int m_EFBLayers;
|
static unsigned int m_EFBLayers;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
virtual XFBSourceBase* CreateXFBSource(unsigned int target_width, unsigned int target_height, unsigned int layers) = 0;
|
virtual std::unique_ptr<XFBSourceBase> CreateXFBSource(unsigned int target_width, unsigned int target_height, unsigned int layers) = 0;
|
||||||
// TODO: figure out why OGL is different for this guy
|
// TODO: figure out why OGL is different for this guy
|
||||||
virtual void GetTargetSize(unsigned int *width, unsigned int *height) = 0;
|
virtual void GetTargetSize(unsigned int *width, unsigned int *height) = 0;
|
||||||
|
|
||||||
@ -93,10 +95,10 @@ private:
|
|||||||
static const XFBSourceBase* const* GetRealXFBSource(u32 xfbAddr, u32 fbWidth, u32 fbHeight, u32* xfbCount);
|
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 const XFBSourceBase* const* GetVirtualXFBSource(u32 xfbAddr, u32 fbWidth, u32 fbHeight, u32* xfbCount);
|
||||||
|
|
||||||
static XFBSourceBase *m_realXFBSource; // Only used in Real XFB mode
|
static std::unique_ptr<XFBSourceBase> m_realXFBSource; // Only used in Real XFB mode
|
||||||
static VirtualXFBListType m_virtualXFBList; // Only used in Virtual XFB mode
|
static VirtualXFBListType m_virtualXFBList; // Only used in Virtual XFB mode
|
||||||
|
|
||||||
static const XFBSourceBase* m_overlappingXFBArray[MAX_VIRTUAL_XFB];
|
static std::array<const XFBSourceBase*, MAX_VIRTUAL_XFB> m_overlappingXFBArray;
|
||||||
|
|
||||||
static unsigned int s_last_xfb_width;
|
static unsigned int s_last_xfb_width;
|
||||||
static unsigned int s_last_xfb_height;
|
static unsigned int s_last_xfb_height;
|
||||||
|
Loading…
Reference in New Issue
Block a user