From 6d1db6daaeb130c087beed406ae9475b6549b8ef Mon Sep 17 00:00:00 2001 From: rogerman Date: Mon, 28 Nov 2016 15:08:24 -0800 Subject: [PATCH] Render3D: Refactor common parts of OpenGLTexture and SoftRasterizerTexture into a new Render3DTexture class. --- desmume/src/OGLRender.cpp | 62 +++-------------------------------- desmume/src/OGLRender.h | 21 ++---------- desmume/src/OGLRender_3_2.cpp | 2 -- desmume/src/rasterize.cpp | 50 ++++------------------------ desmume/src/rasterize.h | 14 +------- desmume/src/render3D.cpp | 56 +++++++++++++++++++++++++++++-- desmume/src/render3D.h | 23 ++++++++++++- 7 files changed, 92 insertions(+), 136 deletions(-) diff --git a/desmume/src/OGLRender.cpp b/desmume/src/OGLRender.cpp index 341bbb0c9..ab10f2b4a 100644 --- a/desmume/src/OGLRender.cpp +++ b/desmume/src/OGLRender.cpp @@ -26,9 +26,7 @@ #include "common.h" #include "debug.h" -#include "gfx3d.h" #include "NDSSystem.h" -#include "texcache.h" #include "./filter/filter.h" #include "./filter/xbrz.h" @@ -639,22 +637,12 @@ static void OGLGetDriverVersion(const char *oglVersionString, } } -OpenGLTexture::OpenGLTexture(u32 texAttributes, u32 palAttributes) : TextureStore(texAttributes, palAttributes) +OpenGLTexture::OpenGLTexture(u32 texAttributes, u32 palAttributes) : Render3DTexture(texAttributes, palAttributes) { _cacheSize = GetUnpackSizeUsingFormat(TexFormat_32bpp); _invSizeS = 1.0f / (float)_sizeS; _invSizeT = 1.0f / (float)_sizeT; - _useDeposterize = false; - _scalingFactor = 1; - - memset(&_deposterizeSrcSurface, 0, sizeof(_deposterizeSrcSurface)); - memset(&_deposterizeDstSurface, 0, sizeof(_deposterizeDstSurface)); - - _deposterizeSrcSurface.Width = _deposterizeDstSurface.Width = _sizeS; - _deposterizeSrcSurface.Height = _deposterizeDstSurface.Height = _sizeT; - _deposterizeSrcSurface.Pitch = _deposterizeDstSurface.Pitch = 1; - _upscaleBuffer = NULL; glGenTextures(1, &_texID); @@ -665,26 +653,6 @@ OpenGLTexture::~OpenGLTexture() glDeleteTextures(1, &this->_texID); } -template -void OpenGLTexture::_Upscale() -{ - if ( (SCALEFACTOR != 2) && (SCALEFACTOR != 4) ) - { - return; - } - - u32 *src = (u32 *)this->_deposterizeSrcSurface.Surface; - - if ( (this->_packFormat == TEXMODE_A3I5) || (this->_packFormat == TEXMODE_A5I3) ) - { - xbrz::scale(src, this->_upscaleBuffer, this->_sizeS, this->_sizeT); - } - else - { - xbrz::scale(src, this->_upscaleBuffer, this->_sizeS, this->_sizeT); - } -} - void OpenGLTexture::Load(bool isNewTexture) { u32 *textureSrc = (u32 *)this->_deposterizeSrcSurface.Surface; @@ -721,7 +689,7 @@ void OpenGLTexture::Load(bool isNewTexture) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1); - this->_Upscale<2>(); + this->_Upscale<2>(textureSrc, this->_upscaleBuffer); if (isNewTexture) { @@ -741,13 +709,13 @@ void OpenGLTexture::Load(bool isNewTexture) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 2); - this->_Upscale<4>(); + this->_Upscale<4>(textureSrc, this->_upscaleBuffer); if (isNewTexture) { glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, this->_sizeS*4, this->_sizeT*4, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, this->_upscaleBuffer); - this->_Upscale<2>(); + this->_Upscale<2>(textureSrc, this->_upscaleBuffer); glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, this->_sizeS*2, this->_sizeT*2, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, this->_upscaleBuffer); glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA, this->_sizeS*1, this->_sizeT*1, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, textureSrc); @@ -756,7 +724,7 @@ void OpenGLTexture::Load(bool isNewTexture) { glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, this->_sizeS*4, this->_sizeT*4, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, this->_upscaleBuffer); - this->_Upscale<2>(); + this->_Upscale<2>(textureSrc, this->_upscaleBuffer); glTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, this->_sizeS*2, this->_sizeT*2, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, this->_upscaleBuffer); glTexSubImage2D(GL_TEXTURE_2D, 2, 0, 0, this->_sizeS*1, this->_sizeT*1, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, textureSrc); @@ -784,26 +752,6 @@ GLfloat OpenGLTexture::GetInvHeight() const return this->_invSizeT; } -bool OpenGLTexture::IsUsingDeposterize() const -{ - return this->_useDeposterize; -} - -void OpenGLTexture::SetUseDeposterize(bool willDeposterize) -{ - this->_useDeposterize = willDeposterize; -} - -size_t OpenGLTexture::GetScalingFactor() const -{ - return this->_scalingFactor; -} - -void OpenGLTexture::SetScalingFactor(size_t scalingFactor) -{ - this->_scalingFactor = ( (scalingFactor == 2) || (scalingFactor == 4) ) ? scalingFactor : 1; -} - void OpenGLTexture::SetUnpackBuffer(void *unpackBuffer) { this->_deposterizeSrcSurface.Surface = (unsigned char *)unpackBuffer; diff --git a/desmume/src/OGLRender.h b/desmume/src/OGLRender.h index f895d9ca3..1693bba63 100644 --- a/desmume/src/OGLRender.h +++ b/desmume/src/OGLRender.h @@ -24,7 +24,6 @@ #include #include #include "render3D.h" -#include "texcache.h" #include "types.h" #ifndef OGLRENDER_3_2_H @@ -511,7 +510,6 @@ struct VERTLIST; struct POLYLIST; struct INDEXLIST; struct POLY; -class TexCacheItem; class OpenGLRenderer; extern GPU3DInterface gpu3Dgl; @@ -555,22 +553,15 @@ extern void (*OGLCreateRenderer_3_2_Func)(OpenGLRenderer **rendererPtr); bool IsVersionSupported(unsigned int checkVersionMajor, unsigned int checkVersionMinor, unsigned int checkVersionRevision); -class OpenGLTexture : public TextureStore +class OpenGLTexture : public Render3DTexture { -private: +protected: GLuint _texID; GLfloat _invSizeS; GLfloat _invSizeT; - - bool _useDeposterize; - size_t _scalingFactor; - - SSurface _deposterizeSrcSurface; - SSurface _deposterizeDstSurface; + u32 *_upscaleBuffer; - template void _Upscale(); - public: OpenGLTexture(u32 texAttributes, u32 palAttributes); virtual ~OpenGLTexture(); @@ -581,12 +572,6 @@ public: GLfloat GetInvWidth() const; GLfloat GetInvHeight() const; - bool IsUsingDeposterize() const; - void SetUseDeposterize(bool willDeposterize); - - size_t GetScalingFactor() const; - void SetScalingFactor(size_t scalingFactor); - void SetUnpackBuffer(void *unpackBuffer); void SetDeposterizeBuffer(void *dstBuffer, void *workingBuffer); void SetUpscalingBuffer(void *upscaleBuffer); diff --git a/desmume/src/OGLRender_3_2.cpp b/desmume/src/OGLRender_3_2.cpp index 45e0979a1..485fecb59 100644 --- a/desmume/src/OGLRender_3_2.cpp +++ b/desmume/src/OGLRender_3_2.cpp @@ -25,9 +25,7 @@ #include "common.h" #include "debug.h" -#include "gfx3d.h" #include "NDSSystem.h" -#include "texcache.h" //------------------------------------------------------------ diff --git a/desmume/src/rasterize.cpp b/desmume/src/rasterize.cpp index a34040b41..eda62ab5d 100644 --- a/desmume/src/rasterize.cpp +++ b/desmume/src/rasterize.cpp @@ -51,7 +51,6 @@ #include "matrix.h" #include "render3D.h" -#include "gfx3d.h" #include "MMU.h" #include "NDSSystem.h" #include "utils/task.h" @@ -1148,13 +1147,11 @@ static void SoftRasterizerRendererDestroy() } } -SoftRasterizerTexture::SoftRasterizerTexture(u32 texAttributes, u32 palAttributes) : TextureStore(texAttributes, palAttributes) +SoftRasterizerTexture::SoftRasterizerTexture(u32 texAttributes, u32 palAttributes) : Render3DTexture(texAttributes, palAttributes) { _cacheSize = GetUnpackSizeUsingFormat(TexFormat_15bpp); _unpackData = (u32 *)malloc_alignedCacheLine(_cacheSize); - _useDeposterize = false; - _scalingFactor = 1; _customBuffer = NULL; _renderData = _unpackData; @@ -1164,12 +1161,6 @@ SoftRasterizerTexture::SoftRasterizerTexture(u32 texAttributes, u32 palAttribute _renderHeightMask = _renderHeight - 1; _renderWidthShift = 0; - memset(&_deposterizeSrcSurface, 0, sizeof(_deposterizeSrcSurface)); - memset(&_deposterizeDstSurface, 0, sizeof(_deposterizeDstSurface)); - - _deposterizeSrcSurface.Width = _deposterizeDstSurface.Width = _sizeS; - _deposterizeSrcSurface.Height = _deposterizeDstSurface.Height = _sizeT; - _deposterizeSrcSurface.Pitch = _deposterizeDstSurface.Pitch = 1; _deposterizeSrcSurface.Surface = (unsigned char *)_unpackData; u32 tempWidth = _renderWidth; @@ -1187,26 +1178,6 @@ SoftRasterizerTexture::~SoftRasterizerTexture() free_aligned(this->_customBuffer); } -template -void SoftRasterizerTexture::_Upscale() -{ - if ( (SCALEFACTOR != 2) && (SCALEFACTOR != 4) ) - { - return; - } - - u32 *src = (this->_useDeposterize) ? (u32 *)this->_deposterizeDstSurface.Surface : this->_unpackData; - - if (this->_packFormat == TEXMODE_A3I5 || this->_packFormat == TEXMODE_A5I3) - { - xbrz::scale(src, this->_customBuffer, this->_sizeS, this->_sizeT); - } - else - { - xbrz::scale(src, this->_customBuffer, this->_sizeS, this->_sizeT); - } -} - void SoftRasterizerTexture::Load() { if (this->_scalingFactor == 1 && !this->_useDeposterize) @@ -1215,21 +1186,24 @@ void SoftRasterizerTexture::Load() } else { - this->Unpack((u32 *)this->_unpackData); + u32 *textureSrc = this->_unpackData; + + this->Unpack(textureSrc); if (this->_useDeposterize) { RenderDeposterize(this->_deposterizeSrcSurface, this->_deposterizeDstSurface); + textureSrc = (u32 *)this->_deposterizeDstSurface.Surface; } switch (this->_scalingFactor) { case 2: - this->_Upscale<2>(); + this->_Upscale<2>(textureSrc, this->_customBuffer); break; case 4: - this->_Upscale<4>(); + this->_Upscale<4>(textureSrc, this->_customBuffer); break; default: @@ -1275,11 +1249,6 @@ u32 SoftRasterizerTexture::GetRenderWidthShift() const return this->_renderWidthShift; } -bool SoftRasterizerTexture::IsUsingDeposterize() const -{ - return this->_useDeposterize; -} - void SoftRasterizerTexture::SetUseDeposterize(bool willDeposterize) { this->_useDeposterize = willDeposterize; @@ -1312,11 +1281,6 @@ void SoftRasterizerTexture::SetUseDeposterize(bool willDeposterize) } } -size_t SoftRasterizerTexture::GetScalingFactor() const -{ - return this->_scalingFactor; -} - void SoftRasterizerTexture::SetScalingFactor(size_t scalingFactor) { if ( (scalingFactor != 2) && (scalingFactor != 4) ) diff --git a/desmume/src/rasterize.h b/desmume/src/rasterize.h index adc8794ea..8be859dfb 100644 --- a/desmume/src/rasterize.h +++ b/desmume/src/rasterize.h @@ -20,13 +20,11 @@ #include "render3D.h" #include "gfx3d.h" -#include "texcache.h" #define SOFTRASTERIZER_DEPTH_EQUAL_TEST_TOLERANCE 0x200 extern GPU3DInterface gpu3DRasterize; -class TexCacheItem; class SoftRasterizerRenderer; struct SoftRasterizerPostProcessParams @@ -40,7 +38,7 @@ struct SoftRasterizerPostProcessParams bool fogAlphaOnly; }; -class SoftRasterizerTexture : public TextureStore +class SoftRasterizerTexture : public Render3DTexture { protected: u32 *_unpackData; @@ -52,15 +50,8 @@ protected: u32 _renderHeightMask; u32 _renderWidthShift; - bool _useDeposterize; - size_t _scalingFactor; u32 *_customBuffer; - SSurface _deposterizeSrcSurface; - SSurface _deposterizeDstSurface; - - template void _Upscale(); - public: SoftRasterizerTexture(u32 texAttributes, u32 palAttributes); virtual ~SoftRasterizerTexture(); @@ -76,10 +67,7 @@ public: u32 GetRenderHeightMask() const; u32 GetRenderWidthShift() const; - bool IsUsingDeposterize() const; void SetUseDeposterize(bool willDeposterize); - - size_t GetScalingFactor() const; void SetScalingFactor(size_t scalingFactor); }; diff --git a/desmume/src/render3D.cpp b/desmume/src/render3D.cpp index bda3cbfd4..e45139dfb 100644 --- a/desmume/src/render3D.cpp +++ b/desmume/src/render3D.cpp @@ -25,9 +25,7 @@ #endif #include "utils/bits.h" -#include "gfx3d.h" #include "MMU.h" -#include "texcache.h" #include "./filter/filter.h" #include "./filter/xbrz.h" @@ -195,6 +193,60 @@ void FragmentAttributesBuffer::SetAll(const FragmentAttributes &attr) } } +Render3DTexture::Render3DTexture(u32 texAttributes, u32 palAttributes) : TextureStore(texAttributes, palAttributes) +{ + _useDeposterize = false; + _scalingFactor = 1; + + memset(&_deposterizeSrcSurface, 0, sizeof(_deposterizeSrcSurface)); + memset(&_deposterizeDstSurface, 0, sizeof(_deposterizeDstSurface)); + + _deposterizeSrcSurface.Width = _deposterizeDstSurface.Width = _sizeS; + _deposterizeSrcSurface.Height = _deposterizeDstSurface.Height = _sizeT; + _deposterizeSrcSurface.Pitch = _deposterizeDstSurface.Pitch = 1; +} + +template +void Render3DTexture::_Upscale(const u32 *__restrict src, u32 *__restrict dst) +{ + if ( (SCALEFACTOR != 2) && (SCALEFACTOR != 4) ) + { + return; + } + + if ( (this->_packFormat == TEXMODE_A3I5) || (this->_packFormat == TEXMODE_A5I3) ) + { + xbrz::scale(src, dst, this->_sizeS, this->_sizeT); + } + else + { + xbrz::scale(src, dst, this->_sizeS, this->_sizeT); + } +} + +bool Render3DTexture::IsUsingDeposterize() const +{ + return this->_useDeposterize; +} + +void Render3DTexture::SetUseDeposterize(bool willDeposterize) +{ + this->_useDeposterize = willDeposterize; +} + +size_t Render3DTexture::GetScalingFactor() const +{ + return this->_scalingFactor; +} + +void Render3DTexture::SetScalingFactor(size_t scalingFactor) +{ + this->_scalingFactor = ( (scalingFactor == 2) || (scalingFactor == 4) ) ? scalingFactor : 1; +} + +template void Render3DTexture::_Upscale<2>(const u32 *__restrict src, u32 *__restrict dst); +template void Render3DTexture::_Upscale<4>(const u32 *__restrict src, u32 *__restrict dst); + void* Render3D::operator new(size_t size) { void *newPtr = malloc_alignedCacheLine(size); diff --git a/desmume/src/render3D.h b/desmume/src/render3D.h index 45d75e370..ea433cc77 100644 --- a/desmume/src/render3D.h +++ b/desmume/src/render3D.h @@ -19,8 +19,9 @@ #ifndef RENDER3D_H #define RENDER3D_H -#include "gfx3d.h" #include "types.h" +#include "gfx3d.h" +#include "texcache.h" #include "./filter/filter.h" #define kUnsetTranslucentPolyID 255 @@ -113,6 +114,26 @@ struct Render3DDeviceInfo u8 maxSamples; }; +class Render3DTexture : public TextureStore +{ +protected: + bool _useDeposterize; + size_t _scalingFactor; + SSurface _deposterizeSrcSurface; + SSurface _deposterizeDstSurface; + + template void _Upscale(const u32 *__restrict src, u32 *__restrict dst); + +public: + Render3DTexture(u32 texAttributes, u32 palAttributes); + + bool IsUsingDeposterize() const; + void SetUseDeposterize(bool willDeposterize); + + size_t GetScalingFactor() const; + void SetScalingFactor(size_t scalingFactor); +}; + class Render3D { protected: