PPU: Implement brightness control
This commit is contained in:
parent
dbfed2bb46
commit
f028518664
2 changed files with 15 additions and 3 deletions
17
Core/Ppu.cpp
17
Core/Ppu.cpp
|
@ -314,6 +314,7 @@ void Ppu::RenderScanline()
|
||||||
}
|
}
|
||||||
|
|
||||||
ApplyColorMath();
|
ApplyColorMath();
|
||||||
|
ApplyBrightness();
|
||||||
|
|
||||||
//Process sprites for next scanline
|
//Process sprites for next scanline
|
||||||
memset(_spritePriority, 0xFF, sizeof(_spritePriority));
|
memset(_spritePriority, 0xFF, sizeof(_spritePriority));
|
||||||
|
@ -627,7 +628,6 @@ void Ppu::ApplyColorMath()
|
||||||
otherPixel = _fixedColor;
|
otherPixel = _fixedColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if(_colorMathSubstractMode) {
|
if(_colorMathSubstractMode) {
|
||||||
uint16_t r = std::max((mainPixel & 0x001F) - (otherPixel & 0x001F), 0) >> halfShift;
|
uint16_t r = std::max((mainPixel & 0x001F) - (otherPixel & 0x001F), 0) >> halfShift;
|
||||||
uint16_t g = std::max(((mainPixel >> 5) & 0x001F) - ((otherPixel >> 5) & 0x001F), 0) >> halfShift;
|
uint16_t g = std::max(((mainPixel >> 5) & 0x001F) - ((otherPixel >> 5) & 0x001F), 0) >> halfShift;
|
||||||
|
@ -645,6 +645,19 @@ void Ppu::ApplyColorMath()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Ppu::ApplyBrightness()
|
||||||
|
{
|
||||||
|
if(_screenBrightness != 15) {
|
||||||
|
for(int x = 0; x < 256; x++) {
|
||||||
|
uint16_t &pixel = _currentBuffer[(_scanline << 8) | x];
|
||||||
|
uint16_t r = (pixel & 0x1F) * _screenBrightness / 15;
|
||||||
|
uint16_t g = ((pixel >> 5) & 0x1F) * _screenBrightness / 15;
|
||||||
|
uint16_t b = ((pixel >> 10) & 0x1F) * _screenBrightness / 15;
|
||||||
|
pixel = r | (g << 5) | (b << 10);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
template<uint8_t layerIndex>
|
template<uint8_t layerIndex>
|
||||||
bool Ppu::ProcessMaskWindow(uint8_t activeWindowCount, int x)
|
bool Ppu::ProcessMaskWindow(uint8_t activeWindowCount, int x)
|
||||||
{
|
{
|
||||||
|
@ -830,8 +843,6 @@ void Ppu::Write(uint32_t addr, uint8_t value)
|
||||||
switch(addr) {
|
switch(addr) {
|
||||||
case 0x2100:
|
case 0x2100:
|
||||||
_forcedVblank = (value & 0x80) != 0;
|
_forcedVblank = (value & 0x80) != 0;
|
||||||
|
|
||||||
//TODO Apply brightness
|
|
||||||
_screenBrightness = value & 0x0F;
|
_screenBrightness = value & 0x0F;
|
||||||
|
|
||||||
//TODO : Also, writing this register on the first line of V-Blank (225 or 240, depending on overscan) when force blank is currently active causes the OAM Address Reset to occur.
|
//TODO : Also, writing this register on the first line of V-Blank (225 or 240, depending on overscan) when force blank is currently active causes the OAM Address Reset to occur.
|
||||||
|
|
|
@ -158,6 +158,7 @@ private:
|
||||||
|
|
||||||
void RenderScanline();
|
void RenderScanline();
|
||||||
void ApplyColorMath();
|
void ApplyColorMath();
|
||||||
|
void ApplyBrightness();
|
||||||
|
|
||||||
template<uint8_t layerIndex>
|
template<uint8_t layerIndex>
|
||||||
bool ProcessMaskWindow(uint8_t activeWindowCount, int x);
|
bool ProcessMaskWindow(uint8_t activeWindowCount, int x);
|
||||||
|
|
Loading…
Add table
Reference in a new issue