From 81dae686524354dc11e77c125d29df0a4c814809 Mon Sep 17 00:00:00 2001 From: rogerman Date: Tue, 15 Sep 2015 20:20:13 +0000 Subject: [PATCH] GPU: - Do some minor code cleanup. --- desmume/src/GPU.cpp | 145 +++++++++++++++++++++----------------------- desmume/src/GPU.h | 4 +- 2 files changed, 71 insertions(+), 78 deletions(-) diff --git a/desmume/src/GPU.cpp b/desmume/src/GPU.cpp index ab3d79d04..0a4082303 100644 --- a/desmume/src/GPU.cpp +++ b/desmume/src/GPU.cpp @@ -400,8 +400,6 @@ void GPUEngineBase::_Reset_Base() this->_blend2[6] = false; this->_blend2[7] = false; - this->_masterBrightMode = GPUMasterBrightMode_Disable; - this->_masterBrightFactor = 0; this->_isMasterBrightFullIntensity = false; this->_currentScanline = 0; @@ -519,10 +517,8 @@ void GPUEngineBase::ParseReg_MASTER_BRIGHT() } const IOREG_MASTER_BRIGHT &MASTER_BRIGHT = this->_IORegisterMap->MASTER_BRIGHT; - this->_masterBrightFactor = MASTER_BRIGHT.Intensity; - this->_masterBrightMode = (GPUMasterBrightMode)MASTER_BRIGHT.Mode; - this->_isMasterBrightFullIntensity = ( (this->_masterBrightFactor >= 16) && ((this->_masterBrightMode == GPUMasterBrightMode_Up) || (this->_masterBrightMode == GPUMasterBrightMode_Down)) ); - //printf("MASTER BRIGHTNESS %d to %d at %d\n",this->core,this->_masterBrightFactor,nds.VCount); + this->_isMasterBrightFullIntensity = ( (MASTER_BRIGHT.Intensity >= 16) && ((MASTER_BRIGHT.Mode == GPUMasterBrightMode_Up) || (MASTER_BRIGHT.Mode == GPUMasterBrightMode_Down)) ); + //printf("MASTER BRIGHTNESS %d to %d at %d\n",this->core,MASTER_BRIGHT.Intensity,nds.VCount); } void GPUEngineBase::SetupFinalPixelBlitter() @@ -1006,9 +1002,9 @@ FORCEINLINE FASTCALL void GPUEngineBase::_master_setFinalOBJColor(const size_t s { selectedFunc = Blend; - //obj without fine-grained alpha are using EVA/EVB for blending. this is signified by receiving 255 in the alpha + //obj without fine-grained alpha are using EVA/EVB for blending. this is signified by receiving 0xFF in the alpha //it's tested by the spriteblend demo and the glory of heracles title screen - if (alpha != 255) + if (alpha != 0xFF) { eva = alpha; evb = 16 - alpha; @@ -1635,7 +1631,7 @@ void GPUEngineBase::_RenderSpriteBMP(const u8 spriteNum, const u16 l, u16 *dst, { dst[sprX] = color; dst_alpha[sprX] = alpha+1; - typeTab[sprX] = 3; + typeTab[sprX] = OBJMode_Bitmap; prioTab[sprX] = prio; this->_sprNum[sprX] = spriteNum; } @@ -1655,8 +1651,8 @@ void GPUEngineBase::_RenderSprite256(const u8 spriteNum, const u16 l, u16 *dst, { const u16 color = LE_TO_LOCAL_16(pal[palette_entry]); dst[sprX] = color; - dst_alpha[sprX] = -1; - typeTab[sprX] = (alpha ? 1 : 0); + dst_alpha[sprX] = 0xFF; + typeTab[sprX] = (alpha ? OBJMode_Transparent : OBJMode_Normal); prioTab[sprX] = prio; this->_sprNum[sprX] = spriteNum; } @@ -1678,8 +1674,8 @@ void GPUEngineBase::_RenderSprite16(const u16 l, u16 *dst, const u32 srcadr, con { const u16 color = LE_TO_LOCAL_16(pal[palette_entry]); dst[sprX] = color; - dst_alpha[sprX] = -1; - typeTab[sprX] = (alpha ? 1 : 0); + dst_alpha[sprX] = 0xFF; + typeTab[sprX] = (alpha ? OBJMode_Transparent : OBJMode_Normal); prioTab[sprX] = prio; } } @@ -1719,15 +1715,11 @@ bool GPUEngineBase::_ComputeSpriteVars(const OAMAttributes &spriteInfo, const u1 { x = 0; // get sprite location and size - sprX = (spriteInfo.X/*<<23*/)/*>>23*/; + sprX = spriteInfo.X; sprY = spriteInfo.Y; sprSize = GPUEngineBase::_sprSizeTab[spriteInfo.Size][spriteInfo.Shape]; - lg = sprSize.x; - if (sprY >= GPU_FRAMEBUFFER_NATIVE_HEIGHT) - sprY = (s32)((s8)(spriteInfo.Y)); - // FIXME: for rot/scale, a list of entries into the sprite should be maintained, // that tells us where the first pixel of a screenline starts in the sprite, // and how a step to the right in a screenline translates within the sprite @@ -1834,18 +1826,24 @@ void GPUEngineBase::_SpriteRenderPerform(u16 *dst, u8 *dst_alpha, u8 *typeTab, u //do we incur a cost if a sprite is disabled?? we guess so. cost += 2; + + // Check if sprite is disabled before everything + if (spriteInfo.RotScale == 0 && spriteInfo.Disable != 0) + continue; + + const OBJMode objMode = (OBJMode)spriteInfo.Mode; SpriteSize sprSize; - s32 sprX, sprY, x, y, lg; + s32 sprX; + s32 sprY; + s32 x; + s32 y; + s32 lg; s32 xdir; u8 prio; u16 *pal; u8 *src; u32 srcadr; - - // Check if sprite is disabled before everything - if (spriteInfo.RotScale == 0 && spriteInfo.Disable != 0) - continue; prio = spriteInfo.Priority; @@ -1857,18 +1855,14 @@ void GPUEngineBase::_SpriteRenderPerform(u16 *dst, u8 *dst_alpha, u8 *typeTab, u u16 colour; // Get sprite positions and size - sprX = (spriteInfo.X << 23) >> 23; + sprX = spriteInfo.X; sprY = spriteInfo.Y; sprSize = GPUEngineBase::_sprSizeTab[spriteInfo.Size][spriteInfo.Shape]; - lg = sprSize.x; - - if (sprY >= GPU_FRAMEBUFFER_NATIVE_HEIGHT) - sprY = (s32)((s8)(spriteInfo.Y)); - // Copy sprite size, to check change it if needed fieldX = sprSize.x; fieldY = sprSize.y; + lg = sprSize.x; // If we are using double size mode, double our control vars if (spriteInfo.DoubleSize != 0) @@ -1899,9 +1893,9 @@ void GPUEngineBase::_SpriteRenderPerform(u16 *dst, u8 *dst_alpha, u8 *typeTab, u dy = LE_TO_LOCAL_16((s16)this->_oamList[blockparameter+2].attr3); dmy = LE_TO_LOCAL_16((s16)this->_oamList[blockparameter+3].attr3); - // Calculate fixed poitn 8.8 start offsets - realX = ((sprSize.x) << 7) - (fieldX >> 1)*dx - (fieldY>>1)*dmx + y * dmx; - realY = ((sprSize.y) << 7) - (fieldX >> 1)*dy - (fieldY>>1)*dmy + y * dmy; + // Calculate fixed point 8.8 start offsets + realX = (sprSize.x << 7) - (fieldX >> 1)*dx - (fieldY >> 1)*dmx + y*dmx; + realY = (sprSize.y << 7) - (fieldX >> 1)*dy - (fieldY >> 1)*dmy + y*dmy; if (sprX < 0) { @@ -1927,7 +1921,7 @@ void GPUEngineBase::_SpriteRenderPerform(u16 *dst, u8 *dst_alpha, u8 *typeTab, u src = (u8 *)MMU_gpu_map(this->_sprMem + (spriteInfo.TileIndex << this->_sprBoundary)); // If extended palettes are set, use them - pal = (DISPCNT.ExOBJPalette_Enable) ? (u16 *)(MMU.ObjExtPal[this->_engineID][0]+(spriteInfo.PaletteIndex*0x200)) : this->_paletteOBJ; + pal = (DISPCNT.ExOBJPalette_Enable) ? (u16 *)(MMU.ObjExtPal[this->_engineID][0]+(spriteInfo.PaletteIndex*ADDRESS_STEP_512B)) : this->_paletteOBJ; for (size_t j = 0; j < lg; ++j, ++sprX) { @@ -1944,11 +1938,11 @@ void GPUEngineBase::_SpriteRenderPerform(u16 *dst, u8 *dst_alpha, u8 *typeTab, u colour = src[offset]; - if (colour && (prio_sprWin[sprX] = 1; } else { dst[sprX] = LE_TO_LOCAL_16(pal[colour]); - dst_alpha[sprX] = -1; - typeTab[sprX] = spriteInfo.Mode; + dst_alpha[sprX] = 0xFF; + typeTab[sprX] = objMode; prioTab[sprX] = prio; } } @@ -2068,7 +2062,7 @@ void GPUEngineBase::_SpriteRenderPerform(u16 *dst, u8 *dst_alpha, u8 *typeTab, u cost += sprSize.x; - if (spriteInfo.Mode == 2) + if (objMode == OBJMode_Window) { if (MODE == SpriteRenderMode_Sprite2D) { @@ -2087,7 +2081,7 @@ void GPUEngineBase::_SpriteRenderPerform(u16 *dst, u8 *dst_alpha, u8 *typeTab, u this->_RenderSpriteWin(src, (spriteInfo.PaletteMode == PaletteMode_1x256), lg, sprX, x, xdir); } - else if (spriteInfo.Mode == 3) //sprite is in BMP format + else if (objMode == OBJMode_Bitmap) //sprite is in BMP format { srcadr = this->_SpriteAddressBMP(spriteInfo, sprSize, y); @@ -2104,8 +2098,8 @@ void GPUEngineBase::_SpriteRenderPerform(u16 *dst, u8 *dst_alpha, u8 *typeTab, u else srcadr = this->_sprMem + (spriteInfo.TileIndex<_sprBoundary) + ((y>>3)*sprSize.x*8) + ((y&0x7)*8); - pal = (DISPCNT.ExOBJPalette_Enable) ? (u16 *)(MMU.ObjExtPal[this->_engineID][0]+(spriteInfo.PaletteIndex*0x200)) : this->_paletteOBJ; - this->_RenderSprite256(i, l, dst, srcadr, pal, dst_alpha, typeTab, prioTab, prio, lg, sprX, x, xdir, spriteInfo.Mode == 1); + pal = (DISPCNT.ExOBJPalette_Enable) ? (u16 *)(MMU.ObjExtPal[this->_engineID][0]+(spriteInfo.PaletteIndex*ADDRESS_STEP_512B)) : this->_paletteOBJ; + this->_RenderSprite256(i, l, dst, srcadr, pal, dst_alpha, typeTab, prioTab, prio, lg, sprX, x, xdir, (objMode == OBJMode_Transparent)); } else // 16 colors { @@ -2119,7 +2113,7 @@ void GPUEngineBase::_SpriteRenderPerform(u16 *dst, u8 *dst_alpha, u8 *typeTab, u } pal = this->_paletteOBJ + (spriteInfo.PaletteIndex << 4); - this->_RenderSprite16(l, dst, srcadr, pal, dst_alpha, typeTab, prioTab, prio, lg, sprX, x, xdir, spriteInfo.Mode == 1); + this->_RenderSprite16(l, dst, srcadr, pal, dst_alpha, typeTab, prioTab, prio, lg, sprX, x, xdir, (objMode == OBJMode_Transparent)); } } } @@ -2131,28 +2125,29 @@ void GPUEngineBase::_RenderLine_Layer(const u16 l, u16 *dstColorLine, const size } -template +template void GPUEngineBase::_RenderLine_MasterBrightness(u16 *dstColorLine, const size_t dstLineWidth, const size_t dstLineCount) { - const u32 factor = this->_masterBrightFactor; + const IOREG_MASTER_BRIGHT &MASTER_BRIGHT = this->_IORegisterMap->MASTER_BRIGHT; + const u32 intensity = MASTER_BRIGHT.Intensity; //isn't it odd that we can set uselessly high factors here? //factors above 16 change nothing. curious. - if (factor == 0) return; + if (!ISFULLINTENSITYHINT && (intensity == 0)) return; //Apply final brightness adjust (MASTER_BRIGHT) //http://nocash.emubase.de/gbatek.htm#dsvideo (Under MASTER_BRIGHTNESS) const size_t pixCount = dstLineWidth * dstLineCount; - switch (this->_masterBrightMode) + switch (MASTER_BRIGHT.Mode) { case GPUMasterBrightMode_Disable: break; case GPUMasterBrightMode_Up: { - if (!this->_isMasterBrightFullIntensity) + if (!ISFULLINTENSITYHINT && !this->_isMasterBrightFullIntensity) { size_t i = 0; @@ -2163,19 +2158,19 @@ void GPUEngineBase::_RenderLine_MasterBrightness(u16 *dstColorLine, const size_t __m128i dstColor_vec128 = _mm_load_si128((__m128i *)(dstColorLine + i)); dstColor_vec128 = _mm_and_si128(dstColor_vec128, _mm_set1_epi16(0x7FFF)); - dstColorLine[i+7] = GPUEngineBase::_fadeInColors[factor][ _mm_extract_epi16(dstColor_vec128, 7) ]; - dstColorLine[i+6] = GPUEngineBase::_fadeInColors[factor][ _mm_extract_epi16(dstColor_vec128, 6) ]; - dstColorLine[i+5] = GPUEngineBase::_fadeInColors[factor][ _mm_extract_epi16(dstColor_vec128, 5) ]; - dstColorLine[i+4] = GPUEngineBase::_fadeInColors[factor][ _mm_extract_epi16(dstColor_vec128, 4) ]; - dstColorLine[i+3] = GPUEngineBase::_fadeInColors[factor][ _mm_extract_epi16(dstColor_vec128, 3) ]; - dstColorLine[i+2] = GPUEngineBase::_fadeInColors[factor][ _mm_extract_epi16(dstColor_vec128, 2) ]; - dstColorLine[i+1] = GPUEngineBase::_fadeInColors[factor][ _mm_extract_epi16(dstColor_vec128, 1) ]; - dstColorLine[i+0] = GPUEngineBase::_fadeInColors[factor][ _mm_extract_epi16(dstColor_vec128, 0) ]; + dstColorLine[i+7] = GPUEngineBase::_fadeInColors[intensity][ _mm_extract_epi16(dstColor_vec128, 7) ]; + dstColorLine[i+6] = GPUEngineBase::_fadeInColors[intensity][ _mm_extract_epi16(dstColor_vec128, 6) ]; + dstColorLine[i+5] = GPUEngineBase::_fadeInColors[intensity][ _mm_extract_epi16(dstColor_vec128, 5) ]; + dstColorLine[i+4] = GPUEngineBase::_fadeInColors[intensity][ _mm_extract_epi16(dstColor_vec128, 4) ]; + dstColorLine[i+3] = GPUEngineBase::_fadeInColors[intensity][ _mm_extract_epi16(dstColor_vec128, 3) ]; + dstColorLine[i+2] = GPUEngineBase::_fadeInColors[intensity][ _mm_extract_epi16(dstColor_vec128, 2) ]; + dstColorLine[i+1] = GPUEngineBase::_fadeInColors[intensity][ _mm_extract_epi16(dstColor_vec128, 1) ]; + dstColorLine[i+0] = GPUEngineBase::_fadeInColors[intensity][ _mm_extract_epi16(dstColor_vec128, 0) ]; } #endif for (; i < pixCount; i++) { - dstColorLine[i] = GPUEngineBase::_fadeInColors[factor][ dstColorLine[i] & 0x7FFF ]; + dstColorLine[i] = GPUEngineBase::_fadeInColors[intensity][ dstColorLine[i] & 0x7FFF ]; } } else @@ -2195,7 +2190,7 @@ void GPUEngineBase::_RenderLine_MasterBrightness(u16 *dstColorLine, const size_t case GPUMasterBrightMode_Down: { - if (!this->_isMasterBrightFullIntensity) + if (!ISFULLINTENSITYHINT && !this->_isMasterBrightFullIntensity) { size_t i = 0; @@ -2206,19 +2201,19 @@ void GPUEngineBase::_RenderLine_MasterBrightness(u16 *dstColorLine, const size_t __m128i dstColor_vec128 = _mm_load_si128((__m128i *)(dstColorLine + i)); dstColor_vec128 = _mm_and_si128(dstColor_vec128, _mm_set1_epi16(0x7FFF)); - dstColorLine[i+7] = GPUEngineBase::_fadeOutColors[factor][ _mm_extract_epi16(dstColor_vec128, 7) ]; - dstColorLine[i+6] = GPUEngineBase::_fadeOutColors[factor][ _mm_extract_epi16(dstColor_vec128, 6) ]; - dstColorLine[i+5] = GPUEngineBase::_fadeOutColors[factor][ _mm_extract_epi16(dstColor_vec128, 5) ]; - dstColorLine[i+4] = GPUEngineBase::_fadeOutColors[factor][ _mm_extract_epi16(dstColor_vec128, 4) ]; - dstColorLine[i+3] = GPUEngineBase::_fadeOutColors[factor][ _mm_extract_epi16(dstColor_vec128, 3) ]; - dstColorLine[i+2] = GPUEngineBase::_fadeOutColors[factor][ _mm_extract_epi16(dstColor_vec128, 2) ]; - dstColorLine[i+1] = GPUEngineBase::_fadeOutColors[factor][ _mm_extract_epi16(dstColor_vec128, 1) ]; - dstColorLine[i+0] = GPUEngineBase::_fadeOutColors[factor][ _mm_extract_epi16(dstColor_vec128, 0) ]; + dstColorLine[i+7] = GPUEngineBase::_fadeOutColors[intensity][ _mm_extract_epi16(dstColor_vec128, 7) ]; + dstColorLine[i+6] = GPUEngineBase::_fadeOutColors[intensity][ _mm_extract_epi16(dstColor_vec128, 6) ]; + dstColorLine[i+5] = GPUEngineBase::_fadeOutColors[intensity][ _mm_extract_epi16(dstColor_vec128, 5) ]; + dstColorLine[i+4] = GPUEngineBase::_fadeOutColors[intensity][ _mm_extract_epi16(dstColor_vec128, 4) ]; + dstColorLine[i+3] = GPUEngineBase::_fadeOutColors[intensity][ _mm_extract_epi16(dstColor_vec128, 3) ]; + dstColorLine[i+2] = GPUEngineBase::_fadeOutColors[intensity][ _mm_extract_epi16(dstColor_vec128, 2) ]; + dstColorLine[i+1] = GPUEngineBase::_fadeOutColors[intensity][ _mm_extract_epi16(dstColor_vec128, 1) ]; + dstColorLine[i+0] = GPUEngineBase::_fadeOutColors[intensity][ _mm_extract_epi16(dstColor_vec128, 0) ]; } #endif for (; i < pixCount; i++) { - dstColorLine[i] = GPUEngineBase::_fadeOutColors[factor][ dstColorLine[i] & 0x7FFF ]; + dstColorLine[i] = GPUEngineBase::_fadeOutColors[intensity][ dstColorLine[i] & 0x7FFF ]; } } else @@ -2364,7 +2359,7 @@ void GPUEngineBase::UpdateVRAM3DUsageProperties_OBJLayer(const size_t bankIndex, { const OAMAttributes &spriteInfo = this->_oamList[spriteIndex]; - if ( ((spriteInfo.RotScale != 0) || (spriteInfo.Disable == 0)) && (spriteInfo.Mode == 3) && (spriteInfo.PaletteIndex != 0) ) + if ( ((spriteInfo.RotScale != 0) || (spriteInfo.Disable == 0)) && (spriteInfo.Mode == OBJMode_Bitmap) && (spriteInfo.PaletteIndex != 0) ) { const u32 vramAddress = ((spriteInfo.TileIndex & 0x1F) << 5) + ((spriteInfo.TileIndex & ~0x1F) << 7); const SpriteSize sprSize = GPUEngineBase::_sprSizeTab[spriteInfo.Size][spriteInfo.Shape]; @@ -2826,7 +2821,7 @@ void GPUEngineA::RenderLine(const u16 l, bool skip) if ( !DISPCAPCNT.CaptureEnable && (l != 0) && (l != 191) ) { this->_currentScanline = l; - this->_RenderLine_MasterBrightness(dstColorLine, dstLineWidth, dstLineCount); + this->_RenderLine_MasterBrightness(dstColorLine, dstLineWidth, dstLineCount); return; } } @@ -2901,7 +2896,7 @@ void GPUEngineA::RenderLine(const u16 l, bool skip) DISP_FIFOreset(); } - this->_RenderLine_MasterBrightness(dstColorLine, dstLineWidth, dstLineCount); + this->_RenderLine_MasterBrightness(dstColorLine, dstLineWidth, dstLineCount); } template @@ -3883,7 +3878,7 @@ void GPUEngineB::RenderLine(const u16 l, bool skip) { // except if it could cause any side effects (for example if we're capturing), then don't skip anything this->_currentScanline = l; - this->_RenderLine_MasterBrightness(dstColorLine, dstLineWidth, dstLineCount); + this->_RenderLine_MasterBrightness(dstColorLine, dstLineWidth, dstLineCount); return; } @@ -3926,7 +3921,7 @@ void GPUEngineB::RenderLine(const u16 l, bool skip) break; } - this->_RenderLine_MasterBrightness(dstColorLine, dstLineWidth, dstLineCount); + this->_RenderLine_MasterBrightness(dstColorLine, dstLineWidth, dstLineCount); } template diff --git a/desmume/src/GPU.h b/desmume/src/GPU.h index 89a9a56c3..1305ac64f 100644 --- a/desmume/src/GPU.h +++ b/desmume/src/GPU.h @@ -1128,8 +1128,6 @@ protected: int _finalColorSpriteFuncID; SpriteRenderMode _spriteRenderMode; - GPUMasterBrightMode _masterBrightMode; - u32 _masterBrightFactor; bool _isMasterBrightFullIntensity; u32 _currentScanline; @@ -1173,7 +1171,7 @@ protected: template void _RenderLine_CheckWindows(const size_t srcX, bool &draw, bool &effect) const; template void _RenderLine_Layer(const u16 l, u16 *dstColorLine, const size_t dstLineWidth, const size_t dstLineCount); - template void _RenderLine_MasterBrightness(u16 *dstColorLine, const size_t dstLineWidth, const size_t dstLineCount); + template void _RenderLine_MasterBrightness(u16 *dstColorLine, const size_t dstLineWidth, const size_t dstLineCount); template void _HandleDisplayModeOff(u16 *dstColorLine, const size_t l, const size_t dstLineWidth, const size_t dstLineCount); template void _HandleDisplayModeNormal(u16 *dstColorLine, const size_t l, const size_t dstLineWidth, const size_t dstLineCount);