- Do heavy code cleanup.
- Split the engine-specific functionality of the main and sub engines into the new GPUEngineA and GPUEngineB subclasses.
- Templatize some parameters. Greatly increases the generated code size, but restores (and possibly improves) performance from r5251.
This commit is contained in:
rogerman 2015-09-04 02:05:50 +00:00
parent 88006197b9
commit ced0d3986d
13 changed files with 2064 additions and 1638 deletions

File diff suppressed because it is too large Load Diff

View File

@ -26,6 +26,10 @@
#include "types.h"
#ifdef ENABLE_SSE2
#include <emmintrin.h>
#endif
class EMUFILE;
struct MMU_struct;
@ -397,10 +401,10 @@ typedef struct _reg_dispx {
u32 dispA_DISPMMEMFIFO; // 0x04000068
} REG_DISPx ;
enum GPUCoreID
enum GPUEngineID
{
GPUCOREID_MAIN = 0,
GPUCOREID_SUB = 1
GPUEngineID_Main = 0,
GPUEngineID_Sub = 1
};
/* human readable bitmask names */
@ -616,6 +620,17 @@ typedef struct
#define MMU_BOBJ 0x06600000
#define MMU_LCDC 0x06800000
enum GPULayerID
{
GPULayerID_BG0 = 0,
GPULayerID_BG1 = 1,
GPULayerID_BG2 = 2,
GPULayerID_BG3 = 3,
GPULayerID_OBJ = 4,
GPULayerID_None = 5
};
enum BGType
{
BGType_Invalid = 0,
@ -686,11 +701,16 @@ typedef struct
class GPUEngineBase
{
private:
protected:
static CACHE_ALIGN u16 _fadeInColors[17][0x8000];
static CACHE_ALIGN u16 _fadeOutColors[17][0x8000];
static CACHE_ALIGN u8 _blendTable555[17][17][32][32];
static const CACHE_ALIGN SpriteSize _sprSizeTab[4][4];
static const CACHE_ALIGN BGType _mode2type[8][4];
static const CACHE_ALIGN u16 _sizeTab[8][4][2];
static const CACHE_ALIGN u8 _winEmpty[GPU_FRAMEBUFFER_NATIVE_WIDTH];
static struct MosaicLookup {
struct TableEntry {
@ -730,6 +750,8 @@ private:
} obj[256];
} _mosaicColors;
GPUEngineID _engineID;
u8 _bgPrio[5];
bool _bg0HasHighestPrio;
@ -755,7 +777,10 @@ private:
BGType _BGTypes[4];
u8 _sprNum[256];
GPUDisplayMode _dispMode;
u8 _vramBlock;
CACHE_ALIGN u8 _sprNum[256];
CACHE_ALIGN u8 _h_win[2][GPU_FRAMEBUFFER_NATIVE_WIDTH];
const u8 *_curr_win[2];
@ -803,36 +828,44 @@ private:
u8 _BLDY_EVY;
void _InitLUTs();
void _Reset_Base();
void _MosaicSpriteLinePixel(const size_t x, u16 l, u16 *dst, u8 *dst_alpha, u8 *typeTab, u8 *prioTab);
void _MosaicSpriteLine(u16 l, u16 *dst, u8 *dst_alpha, u8 *typeTab, u8 *prioTab);
template<bool MOSAIC> void _LineLarge8bpp();
template<bool MOSAIC> void _RenderLine_TextBG(u16 XBG, u16 YBG, u16 LG);
template<GPULayerID LAYERID, bool MOSAIC, bool ISCUSTOMRENDERINGNEEDED> void _LineLarge8bpp();
template<GPULayerID LAYERID, bool MOSAIC, bool ISCUSTOMRENDERINGNEEDED> void _RenderLine_TextBG(u16 XBG, u16 YBG, u16 LG);
template<bool MOSAIC> void _RotBG2(const BGxPARMS &param, const u16 LG);
template<bool MOSAIC> void _ExtRotBG2(const BGxPARMS &param, const u16 LG);
template<GPULayerID LAYERID, bool MOSAIC, bool ISCUSTOMRENDERINGNEEDED> void _RotBG2(const BGxPARMS &param, const u16 LG);
template<GPULayerID LAYERID, bool MOSAIC, bool ISCUSTOMRENDERINGNEEDED> void _ExtRotBG2(const BGxPARMS &param, const u16 LG);
template<bool MOSAIC> void _LineText();
template<bool MOSAIC> void _LineRot();
template<bool MOSAIC> void _LineExtRot();
template<GPULayerID LAYERID, bool MOSAIC, bool ISCUSTOMRENDERINGNEEDED> void _LineText();
template<GPULayerID LAYERID, bool MOSAIC, bool ISCUSTOMRENDERINGNEEDED> void _LineRot();
template<GPULayerID LAYERID, bool MOSAIC, bool ISCUSTOMRENDERINGNEEDED> void _LineExtRot();
// check whether (x,y) is within the rectangle (including wraparounds)
template<int WIN_NUM> u8 _WithinRect(const size_t x) const;
void _RenderLine_CheckWindows(const size_t srcX, bool &draw, bool &effect) const;
template <GPULayerID LAYERID> void _RenderLine_CheckWindows(const size_t srcX, bool &draw, bool &effect) const;
template<bool BACKDROP, BlendFunc FUNC, bool WINDOW>
template<bool ISCUSTOMRENDERINGNEEDED> void _RenderLine_Layer(const u16 l, u16 *dstLine, const size_t dstLineWidth, const size_t dstLineCount);
template<bool ISCUSTOMRENDERINGNEEDED> void _RenderLine_MasterBrightness(u16 *dstLine, const size_t dstLineWidth, const size_t dstLineCount);
template<size_t WIN_NUM> void _UpdateWINH();
template<size_t WIN_NUM> void _SetupWindows();
template<GPULayerID LAYERID, bool MOSAIC, bool ISCUSTOMRENDERINGNEEDED> void _ModeRender();
template<GPULayerID LAYERID, bool BACKDROP, BlendFunc FUNC, bool WINDOW>
FORCEINLINE FASTCALL bool _master_setFinalBGColor(const size_t srcX, const size_t dstX, const u16 *dstLine, const u8 *bgPixelsLine, u16 &outColor);
template<BlendFunc FUNC, bool WINDOW>
template<GPULayerID LAYERID, BlendFunc FUNC, bool WINDOW>
FORCEINLINE FASTCALL void _master_setFinal3dColor(const size_t srcX, const size_t dstX, u16 *dstLine, u8 *bgPixelsLine, const FragmentColor src);
template<BlendFunc FUNC, bool WINDOW>
template<GPULayerID LAYERID, BlendFunc FUNC, bool WINDOW>
FORCEINLINE FASTCALL void _master_setFinalOBJColor(const size_t srcX, const size_t dstX, u16 *dstLine, u8 *bgPixelsLine, const u16 src, const u8 alpha, const u8 type);
template<bool BACKDROP, int FUNCNUM> void _SetFinalColorBG(const size_t srcX, const size_t dstX, u16 *dstLine, u8 *bgPixelsLine, u16 src);
void _SetFinalColor3D(const size_t srcX, const size_t dstX, u16 *dstLine, u8 *bgPixelsLine, const FragmentColor src);
void _SetFinalColorSprite(const size_t srcX, const size_t dstX, u16 *dstLine, u8 *bgPixelsLine, const u16 src, const u8 alpha, const u8 type);
template<GPULayerID LAYERID, bool BACKDROP, int FUNCNUM> void _SetFinalColorBG(const size_t srcX, const size_t dstX, u16 *dstLine, u8 *bgPixelsLine, u16 src);
template<GPULayerID LAYERID> void _SetFinalColor3D(const size_t srcX, const size_t dstX, u16 *dstLine, u8 *bgPixelsLine, const FragmentColor src);
template<GPULayerID LAYERID> void _SetFinalColorSprite(const size_t srcX, const size_t dstX, u16 *dstLine, u8 *bgPixelsLine, const u16 src, const u8 alpha, const u8 type);
u16 _FinalColorBlend(const u16 colA, const u16 colB);
FORCEINLINE u16 _FinalColorBlendFunc(const u16 colA, const u16 colB, const TBlendTable *blendTable);
@ -849,21 +882,17 @@ private:
public:
GPUEngineBase();
GPUEngineBase(const GPUCoreID coreID);
~GPUEngineBase();
virtual ~GPUEngineBase();
void Reset();
virtual void Reset();
void ResortBGLayers();
void SetMasterBrightness(const u16 val);
void SetupFinalPixelBlitter();
void SetVideoProp(const u32 ctrlBits);
void SetBGProp(const size_t num, const u16 ctrlBits);
void SetDISPCAPCNT(u32 val);
void RenderLine(const u16 l, bool skip);
void RenderLine_Layer(const u16 l, u16 *dstLine, const size_t dstLineWidth, const size_t dstLineCount);
void RenderLine_MasterBrightness(u16 *dstLine, const size_t dstLineWidth, const size_t dstLineCount);
template<bool ISCUSTOMRENDERINGNEEDED> void RenderLine(const u16 l, bool skip);
// some structs are becoming redundant
// some functions too (no need to recopy some vars as it is done by MMU)
@ -875,19 +904,9 @@ public:
_BGxCNT & bgcnt(int num) { return (dispx_st)->dispx_BGxCNT[num].bits; }
const _DISPCNT& dispCnt() const { return dispx_st->dispx_DISPCNT.bits; }
DISPCAPCNT dispCapCnt;
u16 BGSize[4][2];
u8 BGExtPalSlot[4];
template<size_t WIN_NUM> void update_winh();
template<size_t WIN_NUM> void setup_windows();
template<bool MOSAIC> void ModeRender(const size_t layer);
GPUCoreID core;
GPUDisplayMode dispMode;
u8 vramBlock;
bool isCustomRenderingNeeded;
bool is3DEnabled;
u8 vramBGLayer;
@ -905,7 +924,6 @@ public:
u32 MasterBrightFactor;
u32 currLine;
u8 currBgNum;
u16 *currDst;
bool need_update_winh[2];
@ -920,9 +938,9 @@ public:
bool GetLayerEnableState(const size_t layerIndex);
void SetLayerEnableState(const size_t layerIndex, bool theState);
template<bool BACKDROP, bool USECUSTOMVRAM, int FUNCNUM> FORCEINLINE void ____setFinalColorBck(const u16 color, const size_t srcX);
template<bool MOSAIC, bool BACKDROP> FORCEINLINE void __setFinalColorBck(u16 color, const size_t srcX, const bool opaque);
template<bool MOSAIC, bool BACKDROP, bool USECUSTOMVRAM, int FUNCNUM> FORCEINLINE void ___setFinalColorBck(u16 color, const size_t srcX, const bool opaque);
template<GPULayerID LAYERID, bool BACKDROP, int FUNCNUM, bool ISCUSTOMRENDERINGNEEDED, bool USECUSTOMVRAM> FORCEINLINE void ____setFinalColorBck(const u16 color, const size_t srcX);
template<GPULayerID LAYERID, bool MOSAIC, bool BACKDROP, int FUNCNUM, bool ISCUSTOMRENDERINGNEEDED, bool USECUSTOMVRAM> FORCEINLINE void ___setFinalColorBck(u16 color, const size_t srcX, const bool opaque);
template<GPULayerID LAYERID, bool MOSAIC, bool BACKDROP, bool ISCUSTOMRENDERINGNEEDED> FORCEINLINE void __setFinalColorBck(u16 color, const size_t srcX, const bool opaque);
void UpdateVRAM3DUsageProperties_BGLayer(const size_t bankIndex, VRAM3DUsageProperties &outProperty);
void UpdateVRAM3DUsageProperties_OBJLayer(const size_t bankIndex, VRAM3DUsageProperties &outProperty);
@ -933,11 +951,12 @@ public:
void refreshAffineStartRegs(const int num, const int xy);
void SpriteRender(u16 *dst, u8 *dst_alpha, u8 *typeTab, u8 *prioTab);
void ModeRenderDebug(const GPULayerID layerID);
void HandleDisplayModeOff(u16 *dstLine, const size_t l, const size_t dstLineWidth, const size_t dstLineCount);
void HandleDisplayModeNormal(u16 *dstLine, const size_t l, const size_t dstLineWidth, const size_t dstLineCount);
void HandleDisplayModeVRAM(u16 *dstLine, const size_t l, const size_t dstLineWidth, const size_t dstLineCount);
void HandleDisplayModeMainMemory(u16 *dstLine, const size_t l, const size_t dstLineWidth, const size_t dstLineCount);
template<bool ISCUSTOMRENDERINGNEEDED> void HandleDisplayModeOff(u16 *dstLine, const size_t l, const size_t dstLineWidth, const size_t dstLineCount);
template<bool ISCUSTOMRENDERINGNEEDED> void HandleDisplayModeNormal(u16 *dstLine, const size_t l, const size_t dstLineWidth, const size_t dstLineCount);
template<bool ISCUSTOMRENDERINGNEEDED> void HandleDisplayModeVRAM(u16 *dstLine, const size_t l, const size_t dstLineWidth, const size_t dstLineCount);
template<bool ISCUSTOMRENDERINGNEEDED> void HandleDisplayModeMainMemory(u16 *dstLine, const size_t l, const size_t dstLineWidth, const size_t dstLineCount);
u32 GetHOFS(const size_t bg) const;
u32 GetVOFS(const size_t bg) const;
@ -983,12 +1002,68 @@ public:
NDSDisplayID GetDisplayByID() const;
void SetDisplayByID(const NDSDisplayID theDisplayID);
void SetCustomFramebufferSize(size_t w, size_t h);
GPUEngineID GetEngineID() const;
virtual void SetCustomFramebufferSize(size_t w, size_t h);
void BlitNativeToCustomFramebuffer();
void REG_DISPx_pack_test();
};
class GPUEngineA : public GPUEngineBase
{
protected:
FragmentColor *_3DFramebufferRGBA6665;
u16 *_3DFramebufferRGBA5551;
template<bool ISCUSTOMRENDERINGNEEDED> void _RenderLine_Layer(const u16 l, u16 *dstLine, const size_t dstLineWidth, const size_t dstLineCount);
template<bool ISCUSTOMRENDERINGNEEDED, size_t CAPTURELENGTH> void _RenderLine_DisplayCapture(const u16 l);
void _RenderLine_DispCapture_FIFOToBuffer(u16 *fifoLineBuffer);
template<int SOURCESWITCH, size_t CAPTURELENGTH, bool CAPTUREFROMNATIVESRC, bool CAPTURETONATIVEDST>
void _RenderLine_DispCapture_Copy(const u16 *__restrict src, u16 *__restrict dst, const size_t captureLengthExt, const size_t captureLineCount);
u16 _RenderLine_DispCapture_BlendFunc(const u16 srcA, const u16 srcB, const u8 blendEVA, const u8 blendEVB);
#ifdef ENABLE_SSE2
__m128i _RenderLine_DispCapture_BlendFunc_SSE2(__m128i &srcA, __m128i &srcB, const __m128i &blendEVA, const __m128i &blendEVB);
#endif
template<bool CAPTUREFROMNATIVESRCA, bool CAPTUREFROMNATIVESRCB>
void _RenderLine_DispCapture_BlendToCustomDstBuffer(const u16 *__restrict srcA, const u16 *__restrict srcB, u16 *__restrict dst, const u8 blendEVA, const u8 blendEVB, const size_t length, size_t l);
template<size_t CAPTURELENGTH, bool CAPTUREFROMNATIVESRCA, bool CAPTUREFROMNATIVESRCB, bool CAPTURETONATIVEDST>
void _RenderLine_DispCapture_Blend(const u16 *__restrict srcA, const u16 *__restrict srcB, u16 *__restrict dst, const size_t captureLengthExt, const size_t l);
public:
DISPCAPCNT dispCapCnt;
GPUEngineA();
~GPUEngineA();
virtual void Reset();
void SetDISPCAPCNT(u32 val);
GPUDisplayMode GetDisplayMode() const;
u8 GetVRAMBlock() const;
FragmentColor* Get3DFramebufferRGBA6665() const;
u16* Get3DFramebufferRGBA5551() const;
virtual void SetCustomFramebufferSize(size_t w, size_t h);
template<bool ISCUSTOMRENDERINGNEEDED> void RenderLine(const u16 l, bool skip);
};
class GPUEngineB : public GPUEngineBase
{
protected:
template<bool ISCUSTOMRENDERINGNEEDED> void _RenderLine_Layer(const u16 l, u16 *dstLine, const size_t dstLineWidth, const size_t dstLineCount);
public:
GPUEngineB();
virtual void Reset();
template<bool ISCUSTOMRENDERINGNEEDED> void RenderLine(const u16 l, bool skip);
};
class NDSDisplay
{
private:
@ -1003,15 +1078,15 @@ public:
GPUEngineBase* GetEngine();
void SetEngine(GPUEngineBase *theEngine);
GPUCoreID GetEngineID();
void SetEngineByID(const GPUCoreID theID);
GPUEngineID GetEngineID();
void SetEngineByID(const GPUEngineID theID);
};
class GPUSubsystem
{
private:
GPUEngineBase *_engineMain;
GPUEngineBase *_engineSub;
GPUEngineA *_engineMain;
GPUEngineB *_engineSub;
NDSDisplay *_displayMain;
NDSDisplay *_displayTouch;
@ -1034,8 +1109,8 @@ public:
const NDSDisplayInfo& GetDisplayInfo(); // Frontends need to call this whenever they need to read the video buffers from the emulator core
void SetDisplayDidCustomRender(NDSDisplayID displayID, bool theState);
GPUEngineBase* GetEngineMain();
GPUEngineBase* GetEngineSub();
GPUEngineA* GetEngineMain();
GPUEngineB* GetEngineSub();
NDSDisplay* GetDisplayMain();
NDSDisplay* GetDisplayTouch();

View File

@ -1848,14 +1848,14 @@ static void writereg_POWCNT1(const int size, const u32 adr, const u32 val) {
if(nds.power1.dispswap)
{
//printf("Main core on top (vcount=%d)\n",nds.VCount);
GPU->GetDisplayMain()->SetEngineByID(GPUCOREID_MAIN);
GPU->GetDisplayTouch()->SetEngineByID(GPUCOREID_SUB);
GPU->GetDisplayMain()->SetEngineByID(GPUEngineID_Main);
GPU->GetDisplayTouch()->SetEngineByID(GPUEngineID_Sub);
}
else
{
//printf("Main core on bottom (vcount=%d)\n",nds.VCount);
GPU->GetDisplayMain()->SetEngineByID(GPUCOREID_SUB);
GPU->GetDisplayTouch()->SetEngineByID(GPUCOREID_MAIN);
GPU->GetDisplayMain()->SetEngineByID(GPUEngineID_Sub);
GPU->GetDisplayTouch()->SetEngineByID(GPUEngineID_Main);
}
break;
}
@ -3286,8 +3286,8 @@ void FASTCALL _MMU_ARM9_write08(u32 adr, u8 val)
return;
}
GPUEngineBase *mainEngine = GPU->GetEngineMain();
GPUEngineBase *subEngine = GPU->GetEngineSub();
GPUEngineA *mainEngine = GPU->GetEngineMain();
GPUEngineB *subEngine = GPU->GetEngineSub();
switch(adr)
{
@ -3573,8 +3573,8 @@ void FASTCALL _MMU_ARM9_write16(u32 adr, u16 val)
return;
}
GPUEngineBase *mainEngine = GPU->GetEngineMain();
GPUEngineBase *subEngine = GPU->GetEngineSub();
GPUEngineA *mainEngine = GPU->GetEngineMain();
GPUEngineB *subEngine = GPU->GetEngineSub();
// Address is an IO register
switch(adr)
@ -4091,8 +4091,8 @@ void FASTCALL _MMU_ARM9_write32(u32 adr, u32 val)
return;
}
GPUEngineBase *mainEngine = GPU->GetEngineMain();
GPUEngineBase *subEngine = GPU->GetEngineSub();
GPUEngineA *mainEngine = GPU->GetEngineMain();
GPUEngineB *subEngine = GPU->GetEngineSub();
switch(adr)
{

View File

@ -794,7 +794,7 @@ public:
}
void Advance()
{
const GPUEngineBase *mainEngine = GPU->GetEngineMain();
const GPUEngineA *mainEngine = GPU->GetEngineMain();
bool capturing = (mainEngine->dispCapCnt.enabled || (mainEngine->dispCapCnt.val & 0x80000000));
if(capturing && consecutiveNonCaptures > 30)
@ -2899,15 +2899,15 @@ void NDS_suspendProcessingInput(bool suspend)
void NDS_swapScreen()
{
if (GPU->GetDisplayMain()->GetEngineID() == GPUCOREID_MAIN)
if (GPU->GetDisplayMain()->GetEngineID() == GPUEngineID_Main)
{
GPU->GetDisplayMain()->SetEngineByID(GPUCOREID_SUB);
GPU->GetDisplayTouch()->SetEngineByID(GPUCOREID_MAIN);
GPU->GetDisplayMain()->SetEngineByID(GPUEngineID_Sub);
GPU->GetDisplayTouch()->SetEngineByID(GPUEngineID_Main);
}
else
{
GPU->GetDisplayMain()->SetEngineByID(GPUCOREID_MAIN);
GPU->GetDisplayTouch()->SetEngineByID(GPUCOREID_SUB);
GPU->GetDisplayMain()->SetEngineByID(GPUEngineID_Main);
GPU->GetDisplayTouch()->SetEngineByID(GPUEngineID_Sub);
}
}

View File

@ -2744,7 +2744,7 @@ Render3DError OpenGLRenderer_1_2::RenderFinish()
ENDGL();
this->FlushFramebuffer(gfx3d_colorRGBA6665, gfx3d_colorRGBA5551);
this->FlushFramebuffer(GPU->GetEngineMain()->Get3DFramebufferRGBA6665(), GPU->GetEngineMain()->Get3DFramebufferRGBA5551());
this->_pixelReadNeedsFinish = false;
return OGLERROR_NOERR;
@ -3311,7 +3311,7 @@ Render3DError OpenGLRenderer_1_5::RenderFinish()
ENDGL();
this->FlushFramebuffer(gfx3d_colorRGBA6665, gfx3d_colorRGBA5551);
this->FlushFramebuffer(GPU->GetEngineMain()->Get3DFramebufferRGBA6665(), GPU->GetEngineMain()->Get3DFramebufferRGBA5551());
this->_pixelReadNeedsFinish = false;
return OGLERROR_NOERR;
@ -4094,7 +4094,7 @@ Render3DError OpenGLRenderer_2_1::RenderFinish()
ENDGL();
this->FlushFramebuffer(gfx3d_colorRGBA6665, gfx3d_colorRGBA5551);
this->FlushFramebuffer(GPU->GetEngineMain()->Get3DFramebufferRGBA6665(), GPU->GetEngineMain()->Get3DFramebufferRGBA5551());
this->_pixelReadNeedsFinish = false;
return OGLERROR_NOERR;

View File

@ -322,8 +322,8 @@ static float normalTable[1024];
#define fix10_2float(v) (((float)((s32)(v))) / (float)(1<<9))
// Color buffer that is filled by the 3D renderer and is read by the GPU engine.
FragmentColor *gfx3d_colorRGBA6665 = NULL;
u16 *gfx3d_colorRGBA5551 = NULL;
static FragmentColor *_gfx3d_colorRGBA6665 = NULL;
static u16 *_gfx3d_colorRGBA5551 = NULL;
// Matrix stack handling
CACHE_ALIGN MatrixStack mtxStack[4] = {
@ -574,12 +574,6 @@ void gfx3d_deinit()
free(vertlists);
vertlists = NULL;
vertlist = NULL;
free_aligned(gfx3d_colorRGBA6665);
gfx3d_colorRGBA6665 = NULL;
free_aligned(gfx3d_colorRGBA5551);
gfx3d_colorRGBA5551 = NULL;
}
void gfx3d_reset()
@ -2325,7 +2319,7 @@ void gfx3d_VBlankEndSignal(bool skipFrame)
if (!CommonSettings.showGpu.main)
{
memset(gfx3d_colorRGBA6665, 0, GPU->GetCustomFramebufferWidth() * GPU->GetCustomFramebufferHeight() * sizeof(FragmentColor));
memset(_gfx3d_colorRGBA6665, 0, GPU->GetCustomFramebufferWidth() * GPU->GetCustomFramebufferHeight() * sizeof(FragmentColor));
return;
}
@ -2437,19 +2431,6 @@ void gfx3d_glGetLightColor(const size_t index, u32 &dst)
dst = lightColor[index];
}
const FragmentColor* gfx3d_GetLineDataRGBA6665(const size_t line)
{
CurrentRenderer->RenderFinish();
return (gfx3d_colorRGBA6665 + (line * GPU->GetCustomFramebufferWidth()));
}
const u16* gfx3d_GetLineDataRGBA5551(const size_t line)
{
CurrentRenderer->RenderFinish();
return (gfx3d_colorRGBA5551 + (line * GPU->GetCustomFramebufferWidth()));
}
//http://www.opengl.org/documentation/specs/version1.1/glspec1.1/node17.html
//talks about the state required to process verts in quadlists etc. helpful ideas.
//consider building a little state structure that looks exactly like this describes
@ -2536,10 +2517,16 @@ SFORMAT SF_GFX3D[]={
{ "GTVC", 4, 1, &tempVertInfo.count},
{ "GTVM", 4, 4, tempVertInfo.map},
{ "GTVF", 4, 1, &tempVertInfo.first},
{ "G3CX", 1, 4*GPU_FRAMEBUFFER_NATIVE_WIDTH*GPU_FRAMEBUFFER_NATIVE_HEIGHT, gfx3d_colorRGBA6665},
{ "G3CX", 1, 4*GPU_FRAMEBUFFER_NATIVE_WIDTH*GPU_FRAMEBUFFER_NATIVE_HEIGHT, _gfx3d_colorRGBA6665},
{ 0 }
};
void gfx3d_Update3DFramebuffers(FragmentColor *framebufferRGBA6665, u16 *framebufferRGBA5551)
{
_gfx3d_colorRGBA6665 = framebufferRGBA6665;
_gfx3d_colorRGBA5551 = framebufferRGBA5551;
}
//-------------savestate
void gfx3d_savestate(EMUFILE* os)
{

View File

@ -740,10 +740,6 @@ extern CACHE_ALIGN const u8 material_3bit_to_5bit[8];
extern CACHE_ALIGN const u8 material_3bit_to_6bit[8];
extern CACHE_ALIGN const u8 material_3bit_to_8bit[8];
//these contain the 3d framebuffer converted into the most useful format
//they are stored here instead of in the renderers in order to consolidate the buffers
extern FragmentColor *gfx3d_colorRGBA6665;
extern u16 *gfx3d_colorRGBA5551;
extern BOOL isSwapBuffers;
int _hack_getMatrixStackLevel(int);
@ -776,11 +772,9 @@ void gfx3d_glGetMatrix(const MatrixMode mode, int index, float *dst);
void gfx3d_glGetLightDirection(const size_t index, u32 &dst);
void gfx3d_glGetLightColor(const size_t index, u32 &dst);
const FragmentColor* gfx3d_GetLineDataRGBA6665(const size_t line);
const u16* gfx3d_GetLineDataRGBA5551(const size_t line);
struct SFORMAT;
extern SFORMAT SF_GFX3D[];
void gfx3d_Update3DFramebuffers(FragmentColor *framebufferRGBA6665, u16 *framebufferRGBA5551);
void gfx3d_savestate(EMUFILE* os);
bool gfx3d_loadstate(EMUFILE* is, int size);

View File

@ -301,7 +301,7 @@ gboolean screen (GtkWidget * widget, int viewportscreen) {
if (desmume_running()) {
// master bright
gpu = (screen) ? GPU->GetEngineSub() : GPU->GetEngineMain();
gpu = (screen) ? (GPUEngineBase *)GPU->GetEngineSub() : (GPUEngineBase *)GPU->GetEngineMain();
switch (gpu->MasterBrightMode)
{

View File

@ -2228,7 +2228,7 @@ public:
char temp [256];
sprintf(temp, " " /*"mismatch at "*/ "byte %d(0x%X at 0x%X): %d(0x%X) != %d(0x%X)\n", i, i, dst, *src,*src, *dst,*dst);
if(ptr == GPU->GetNativeFramebuffer() || ptr == GPU->GetCustomFramebuffer() || ptr == gfx3d_colorRGBA6665) // ignore screen-only differences since frame skipping can cause them and it's probably ok
if(ptr == GPU->GetNativeFramebuffer() || ptr == GPU->GetCustomFramebuffer() || ptr == GPU->GetEngineMain()->Get3DFramebufferRGBA6665()) // ignore screen-only differences since frame skipping can cause them and it's probably ok
break;
differences.push_back(temp); // <-- probably the best place for a breakpoint

View File

@ -1960,7 +1960,7 @@ Render3DError SoftRasterizerRenderer::EndRender(const u64 frameCount)
this->RenderEdgeMarkingAndFog(this->postprocessParam[0]);
}
this->FlushFramebuffer(gfx3d_colorRGBA6665, gfx3d_colorRGBA5551);
this->FlushFramebuffer(GPU->GetEngineMain()->Get3DFramebufferRGBA6665(), GPU->GetEngineMain()->Get3DFramebufferRGBA5551());
}
return RENDER3DERROR_NOERR;
@ -2003,7 +2003,7 @@ Render3DError SoftRasterizerRenderer::RenderFinish()
}
}
this->FlushFramebuffer(gfx3d_colorRGBA6665, gfx3d_colorRGBA5551);
this->FlushFramebuffer(GPU->GetEngineMain()->Get3DFramebufferRGBA6665(), GPU->GetEngineMain()->Get3DFramebufferRGBA5551());
return RENDER3DERROR_NOERR;
}

View File

@ -420,7 +420,7 @@ Render3DError Render3D::Reset()
if (this->_framebufferColor != NULL)
{
memset(this->_framebufferColor, 0, this->_framebufferColorSizeBytes);
this->FlushFramebuffer(gfx3d_colorRGBA6665, gfx3d_colorRGBA5551);
this->FlushFramebuffer(GPU->GetEngineMain()->Get3DFramebufferRGBA6665(), GPU->GetEngineMain()->Get3DFramebufferRGBA5551());
}
memset(this->clearImageColor16Buffer, 0, sizeof(this->clearImageColor16Buffer));

View File

@ -816,7 +816,7 @@ void ToDSScreenRelativeCoords(s32& x, s32& y, int whichScreen)
}
// finally, make it relative to the correct screen
const bool isMainGPUFirst = (GPU->GetDisplayMain()->GetEngineID() == GPUCOREID_MAIN);
const bool isMainGPUFirst = (GPU->GetDisplayMain()->GetEngineID() == GPUEngineID_Main);
if (video.layout == 0 || video.layout == 2)
{
@ -1656,7 +1656,7 @@ static void OGL_DoDisplay()
RECT srcRects [2];
const bool isMainGPUFirst = (GPU->GetDisplayMain()->GetEngineID() == GPUCOREID_MAIN);
const bool isMainGPUFirst = (GPU->GetDisplayMain()->GetEngineID() == GPUEngineID_Main);
if(video.swap == 0)
{
@ -1774,7 +1774,7 @@ static void DD_DoDisplay()
RECT* dstRects [2] = {&MainScreenRect, &SubScreenRect};
RECT* srcRects [2];
const bool isMainGPUFirst = (GPU->GetDisplayMain()->GetEngineID() == GPUCOREID_MAIN);
const bool isMainGPUFirst = (GPU->GetDisplayMain()->GetEngineID() == GPUEngineID_Main);
if(video.swap == 0)
{
@ -4383,7 +4383,7 @@ void SaveWindowPos(HWND hwnd)
static void TwiddleLayer(UINT ctlid, int core, int layer)
{
GPUEngineBase *gpu = ((GPUCoreID)core == GPUCOREID_MAIN) ? GPU->GetEngineMain() : GPU->GetEngineSub();
GPUEngineBase *gpu = ((GPUEngineID)core == GPUEngineID_Main) ? (GPUEngineBase *)GPU->GetEngineMain() : (GPUEngineBase *)GPU->GetEngineSub();
const bool newLayerState = !CommonSettings.dispLayers[core][layer];
gpu->SetLayerEnableState(layer, newLayerState);
@ -5139,7 +5139,7 @@ DOKEYDOWN:
}
else
{
const bool isMainGPUFirst = (GPU->GetDisplayMain()->GetEngineID() == GPUCOREID_MAIN);
const bool isMainGPUFirst = (GPU->GetDisplayMain()->GetEngineID() == GPUEngineID_Main);
if ((video.layout == 2) && ((video.swap == 0) || (video.swap == 2 && isMainGPUFirst) || (video.swap == 3 && !isMainGPUFirst))) return 0;
ToDSScreenRelativeCoords(x,y,1);

View File

@ -35,8 +35,8 @@ struct mapview_struct
u32 autoup_secs;
bool autoup;
u8 map;
u16 lcd;
GPULayerID layerID;
GPUEngineID engineID;
u16 bitmap[1024*1024];
bool clear;
@ -44,26 +44,23 @@ struct mapview_struct
{
//we're going to make a copy of the gpu so that we don't wreck affine scroll params
//hopefully we won't mess up anything else
GPUEngineBase *realGpu;
if(lcd) realGpu = GPU->GetEngineSub();
else realGpu = GPU->GetEngineMain();
GPUEngineBase *realGpu = (engineID == GPUEngineID_Main) ? (GPUEngineBase *)GPU->GetEngineMain() : (GPUEngineBase *)GPU->GetEngineSub();
GPUEngineBase &gpu = *realGpu;
//forgive the gyrations, some of this junk in here is to remind us of gyrations we might have to go
//through to avoid breaking the gpu struct
gpu.currBgNum = map;
gpu.debug = true;
int temp = gpu.GetFinalColorBckFuncID();
gpu.SetFinalColorBckFuncID(0); //hax... why arent we copying gpu now?? i cant remember
memset(bitmap,0,sizeof(bitmap));
for(u32 i = 0; i < gpu.BGSize[map][1]; ++i)
for(u32 i = 0; i < gpu.BGSize[layerID][1]; ++i)
{
gpu.currDst = bitmap + i*gpu.BGSize[map][0];
gpu.currDst = bitmap + i*gpu.BGSize[layerID][0];
gpu.currLine = i;
gpu.ModeRender<false>(map);
gpu.ModeRenderDebug(layerID);
}
gpu.debug = false;
@ -81,8 +78,8 @@ LRESULT MapView_OnPaint(mapview_struct * win, HWND hwnd, WPARAM wParam, LPARAM l
HDC hdc;
PAINTSTRUCT ps;
char text[80];
u32 dispcnt = ((volatile u32 *)MMU.ARM9_REG)[(win->lcd*0x400)];
u32 bgcnt = ((volatile u16 *)MMU.ARM9_REG)[(8 + (win->map<<1) + (win->lcd*0x1000))>>1];
u32 dispcnt = ((volatile u32 *)MMU.ARM9_REG)[(win->engineID*0x400)];
u32 bgcnt = ((volatile u16 *)MMU.ARM9_REG)[(8 + (win->layerID<<1) + (win->engineID*0x1000))>>1];
BITMAPV4HEADER bmi;
u16 lg;
u16 ht;
@ -98,15 +95,15 @@ LRESULT MapView_OnPaint(mapview_struct * win, HWND hwnd, WPARAM wParam, LPARAM l
bmi.bV4GreenMask = 0x03E0;
bmi.bV4BlueMask = 0x7C00;
if(win->lcd)
if(win->engineID == GPUEngineID_Main)
{
lg = GPU->GetEngineSub()->BGSize[win->map][0];
ht = GPU->GetEngineSub()->BGSize[win->map][1];
lg = GPU->GetEngineMain()->BGSize[win->layerID][0];
ht = GPU->GetEngineMain()->BGSize[win->layerID][1];
}
else
{
lg = GPU->GetEngineMain()->BGSize[win->map][0];
ht = GPU->GetEngineMain()->BGSize[win->map][1];
lg = GPU->GetEngineSub()->BGSize[win->layerID][0];
ht = GPU->GetEngineSub()->BGSize[win->layerID][1];
}
bmi.bV4Width = lg;
bmi.bV4Height = -ht;
@ -124,16 +121,16 @@ LRESULT MapView_OnPaint(mapview_struct * win, HWND hwnd, WPARAM wParam, LPARAM l
sprintf(text, "normal 256");
else
{
switch(win->map)
switch(win->layerID)
{
case 0 :
case GPULayerID_BG0 :
sprintf(text, "extended slot %d", (bgcnt&(1<<13))?2:0);
break;
case 1 :
case GPULayerID_BG1 :
sprintf(text, "extended slot %d", (bgcnt&(1<<13))?3:1);
break;
default :
sprintf(text, "extended slot %d", GPU->GetEngineMain()->BGExtPalSlot[win->map]);
sprintf(text, "extended slot %d", GPU->GetEngineMain()->BGExtPalSlot[win->layerID]);
break;
}
}
@ -144,19 +141,19 @@ LRESULT MapView_OnPaint(mapview_struct * win, HWND hwnd, WPARAM wParam, LPARAM l
SetWindowText(GetDlgItem(hwnd, IDC_PRIO), text);
if((dispcnt>>8>>win->map)&1)
if((dispcnt>>8>>win->layerID)&1)
SetWindowText(GetDlgItem(hwnd, IDC_VISIBLE), "true");
else
SetWindowText(GetDlgItem(hwnd, IDC_VISIBLE), "false");
sprintf(text, "0x%08X", (int)(0x6000000 + ((bgcnt>>2)&0xF)*0x4000 + win->lcd*0x200000 +((dispcnt>>24)&7)*0x10000));
sprintf(text, "0x%08X", (int)(0x6000000 + ((bgcnt>>2)&0xF)*0x4000 + win->engineID*0x200000 +((dispcnt>>24)&7)*0x10000));
SetWindowText(GetDlgItem(hwnd, IDC_CHAR), text);
sprintf(text, "0x%08X", (int)(0x6000000 + 0x800*((bgcnt>>8)&0x1F) + win->lcd*0x200000 + ((dispcnt>>27)&7)*0x10000));
sprintf(text, "0x%08X", (int)(0x6000000 + 0x800*((bgcnt>>8)&0x1F) + win->engineID*0x200000 + ((dispcnt>>27)&7)*0x10000));
SetWindowText(GetDlgItem(hwnd, IDC_SCR), text);
//sprintf(text, "%d x %d", GPU->GetEngineMain()->BGPA[win->map], GPU->GetEngineMain()->BGPB[win->map]);
sprintf(text, "%d x %d", (int)GPU->GetEngineMain()->BGSize[win->map][0], (int)GPU->GetEngineMain()->BGSize[win->map][1]);
sprintf(text, "%d x %d", (int)GPU->GetEngineMain()->BGSize[win->layerID][0], (int)GPU->GetEngineMain()->BGSize[win->layerID][1]);
SetWindowText(GetDlgItem(hwnd, IDC_MSIZE), text);
//if (win->map==2) {
@ -206,8 +203,8 @@ BOOL CALLBACK ViewMapsProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lPara
memset(MapView, 0, sizeof(MapView));
MapView->clear = true;
MapView->autoup_secs = 1;
MapView->map = 0;
MapView->lcd = 0;
MapView->layerID = GPULayerID_BG0;
MapView->engineID = GPUEngineID_Main;
SendMessage(GetDlgItem(hwnd, IDC_AUTO_UPDATE_SPIN),
UDM_SETRANGE, 0, MAKELONG(99, 1));
SendMessage(GetDlgItem(hwnd, IDC_AUTO_UPDATE_SPIN),
@ -295,15 +292,15 @@ BOOL CALLBACK ViewMapsProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lPara
case 1 :
case 2 :
case 3 :
MapView->map = sel;
MapView->lcd = 0;
MapView->layerID = (GPULayerID)sel;
MapView->engineID = GPUEngineID_Main;
break;
case 4 :
case 5 :
case 6 :
case 7 :
MapView->map = sel-4;
MapView->lcd = 1;
MapView->layerID = (GPULayerID)(sel - 4);
MapView->engineID = GPUEngineID_Sub;
break;
}
}