GPU: Add some more properties to NDSDisplayInfo pertaining to auto-applying the master brightness.

This commit is contained in:
rogerman 2017-01-17 11:30:14 -08:00
parent 25c0232673
commit 8aa066dffc
2 changed files with 96 additions and 43 deletions

View File

@ -4027,31 +4027,56 @@ void GPUEngineBase::SetWillApplyMasterBrightnessPerScanline(bool willApply)
template <NDSColorFormat OUTPUTFORMAT>
void GPUEngineBase::ApplyMasterBrightness()
{
NDSDisplayInfo &dispInfoMutable = (NDSDisplayInfo &)GPU->GetDisplayInfo();
const bool isMasterBrightnessAutoApplied = GPU->GetWillAutoApplyMasterBrightness();
if (this->_willApplyMasterBrightnessPerScanline)
{
const bool isNativeSize = (this->nativeLineOutputCount == GPU_FRAMEBUFFER_NATIVE_HEIGHT);
for (size_t line = 0; line < GPU_FRAMEBUFFER_NATIVE_HEIGHT; line++)
{
const NDSDisplayInfo &dispInfo = GPU->GetDisplayInfo();
const GPUEngineCompositorInfo &compInfo = this->_currentCompositorInfo[line];
void *dstColorLine = (isNativeSize) ? ((u8 *)this->nativeBuffer + (compInfo.line.blockOffsetNative * dispInfo.pixelBytes)) : ((u8 *)this->customBuffer + (compInfo.line.blockOffsetCustom * dispInfo.pixelBytes));
const size_t pixCount = (isNativeSize) ? GPU_FRAMEBUFFER_NATIVE_WIDTH : compInfo.line.pixelCount;
this->ApplyMasterBrightness<OUTPUTFORMAT, false>(dstColorLine,
pixCount,
compInfo.renderState.masterBrightnessMode,
compInfo.renderState.masterBrightnessIntensity);
if (isMasterBrightnessAutoApplied)
{
void *dstColorLine = (isNativeSize) ? ((u8 *)this->nativeBuffer + (compInfo.line.blockOffsetNative * dispInfoMutable.pixelBytes)) : ((u8 *)this->customBuffer + (compInfo.line.blockOffsetCustom * dispInfoMutable.pixelBytes));
const size_t pixCount = (isNativeSize) ? GPU_FRAMEBUFFER_NATIVE_WIDTH : compInfo.line.pixelCount;
this->ApplyMasterBrightness<OUTPUTFORMAT, false>(dstColorLine,
pixCount,
compInfo.renderState.masterBrightnessMode,
compInfo.renderState.masterBrightnessIntensity);
if ( (compInfo.renderState.masterBrightnessIntensity != 0) && ((compInfo.renderState.masterBrightnessMode == GPUMasterBrightMode_Up) || (compInfo.renderState.masterBrightnessMode == GPUMasterBrightMode_Down)) )
{
dispInfoMutable.isMasterBrightnessApplied[this->_targetDisplayID] = true;
}
}
dispInfoMutable.masterBrightnessMode[this->_targetDisplayID][line] = compInfo.renderState.masterBrightnessMode;
dispInfoMutable.masterBrightnessIntensity[this->_targetDisplayID][line] = compInfo.renderState.masterBrightnessIntensity;
}
}
else
{
const GPUEngineCompositorInfo &compInfo = this->_currentCompositorInfo[0];
this->ApplyMasterBrightness<OUTPUTFORMAT, false>(this->renderedBuffer,
this->renderedWidth * this->renderedHeight,
compInfo.renderState.masterBrightnessMode,
compInfo.renderState.masterBrightnessIntensity);
if (isMasterBrightnessAutoApplied)
{
this->ApplyMasterBrightness<OUTPUTFORMAT, false>(this->renderedBuffer,
this->renderedWidth * this->renderedHeight,
compInfo.renderState.masterBrightnessMode,
compInfo.renderState.masterBrightnessIntensity);
dispInfoMutable.isMasterBrightnessApplied[this->_targetDisplayID] = (compInfo.renderState.masterBrightnessIntensity != 0) && ((compInfo.renderState.masterBrightnessMode == GPUMasterBrightMode_Up) || (compInfo.renderState.masterBrightnessMode == GPUMasterBrightMode_Down));
}
for (size_t line = 0; line < GPU_FRAMEBUFFER_NATIVE_HEIGHT; line++)
{
dispInfoMutable.masterBrightnessMode[this->_targetDisplayID][line] = compInfo.renderState.masterBrightnessMode;
dispInfoMutable.masterBrightnessIntensity[this->_targetDisplayID][line] = compInfo.renderState.masterBrightnessIntensity;
}
}
}
@ -7428,22 +7453,30 @@ void GPUSubsystem::RenderLine(const size_t l, bool isFrameSkipRequested)
this->_displayInfo.renderedWidth[NDSDisplayID_Touch] = this->_displayTouch->GetEngine()->renderedWidth;
this->_displayInfo.renderedHeight[NDSDisplayID_Touch] = this->_displayTouch->GetEngine()->renderedHeight;
if (this->_willAutoApplyMasterBrightness)
this->_displayInfo.isDisplayEnabled[NDSDisplayID_Main] = CommonSettings.showGpu.main;
this->_displayInfo.isDisplayEnabled[NDSDisplayID_Touch] = CommonSettings.showGpu.sub;
this->_displayInfo.isMasterBrightnessApplied[NDSDisplayID_Main] = false;
this->_displayInfo.isMasterBrightnessApplied[NDSDisplayID_Touch] = false;
if (CommonSettings.showGpu.main)
{
if (CommonSettings.showGpu.main)
{
this->_engineMain->ApplyMasterBrightness<OUTPUTFORMAT>();
}
else
this->_engineMain->ApplyMasterBrightness<OUTPUTFORMAT>();
}
else
{
if (this->_willAutoApplyMasterBrightness)
{
memset(this->_engineMain->renderedBuffer, 0, this->_engineMain->renderedWidth * this->_engineMain->renderedHeight * this->_displayInfo.pixelBytes);
}
if (CommonSettings.showGpu.sub)
{
this->_engineSub->ApplyMasterBrightness<OUTPUTFORMAT>();
}
else
}
if (CommonSettings.showGpu.sub)
{
this->_engineSub->ApplyMasterBrightness<OUTPUTFORMAT>();
}
else
{
if (this->_willAutoApplyMasterBrightness)
{
memset(this->_engineSub->renderedBuffer, 0, this->_engineSub->renderedWidth * this->_engineSub->renderedHeight * this->_displayInfo.pixelBytes);
}

View File

@ -1058,33 +1058,53 @@ typedef struct
// User-requested settings. These fields will always remain constant until changed.
// Changed by calling GPUSubsystem::SetColorFormat().
NDSColorFormat colorFormat; // The output color format.
size_t pixelBytes; // The number of bytes per pixel.
NDSColorFormat colorFormat; // The output color format.
size_t pixelBytes; // The number of bytes per pixel.
// Changed by calling GPUSubsystem::SetFramebufferSize().
bool isCustomSizeRequested; // Reports that the call to GPUSubsystem::SetFramebufferSize() resulted in a custom rendering size.
// true - The user requested a custom size.
// false - The user requested the native size.
size_t customWidth; // The requested custom width, measured in pixels.
size_t customHeight; // The requested custom height, measured in pixels.
bool isCustomSizeRequested; // Reports that the call to GPUSubsystem::SetFramebufferSize() resulted in a custom rendering size.
// true - The user requested a custom size.
// false - The user requested the native size.
size_t customWidth; // The requested custom width, measured in pixels.
size_t customHeight; // The requested custom height, measured in pixels.
void *masterNativeBuffer; // Pointer to the head of the master native buffer.
void *masterCustomBuffer; // Pointer to the head of the master custom buffer.
// If GPUSubsystem::GetWillAutoResolveToCustomBuffer() would return true, or if
// GPUEngineBase::ResolveToCustomFramebuffer() is called, then this buffer is used as the target
// buffer for resolving any native-sized renders.
// Changed by calling GPUSubsystem::SetWillAutoApplyMasterBrightness().
bool isMasterBrightnessAutoApplyRequested; // Reports the result of GPUSubsystem::GetWillAutoApplyMasterBrightness().
// true - The emulator itself will apply the master brightness. This is the default option.
// false - The output framebuffer will not have master brightness applied. Clients will need to
// apply the master brightness themselves in a post-processing pass. Clients should use
// the isMasterBrightnessApplied, masterBrightnessMode, masterBrightnessIntensity and
// isDisplayEnabled properties to determine how to apply the master brightness on their
// end.
// Changed by calling GPUEngineBase::SetEnableState().
bool isDisplayEnabled[2]; // Reports that a particular display has been enabled or disabled by the user.
void *masterNativeBuffer; // Pointer to the head of the master native buffer.
void *masterCustomBuffer; // Pointer to the head of the master custom buffer.
// If GPUSubsystem::GetWillAutoResolveToCustomBuffer() would return true, or if
// GPUEngineBase::ResolveToCustomFramebuffer() is called, then this buffer is used as the target
// buffer for resolving any native-sized renders.
// Frame information. These fields will change per frame, depending on how each display was rendered.
void *nativeBuffer[2]; // Pointer to the display's native size framebuffer.
void *customBuffer[2]; // Pointer to the display's custom size framebuffer.
void *nativeBuffer[2]; // Pointer to the display's native size framebuffer.
void *customBuffer[2]; // Pointer to the display's custom size framebuffer.
bool didPerformCustomRender[2]; // Reports that the display actually rendered at a custom size for this frame.
// true - The display performed a custom-sized render.
// false - The display performed a native-sized render.
size_t renderedWidth[2]; // The display rendered at this width, measured in pixels.
size_t renderedHeight[2]; // The display rendered at this height, measured in pixels.
void *renderedBuffer[2]; // The display rendered to this buffer.
bool didPerformCustomRender[2]; // Reports that the display actually rendered at a custom size for this frame.
// true - The display performed a custom-sized render.
// false - The display performed a native-sized render.
bool isMasterBrightnessApplied[2]; // Reports if a display has master brightness applied. This will be false if the user requested to
// turn off auto-apply via GPUSubsystem::SetWillAutoApplyMasterBrightness(), or if the NDS applied
// a master brightness intensity of 0 for all lines.
GPUMasterBrightMode masterBrightnessMode[2][GPU_FRAMEBUFFER_NATIVE_HEIGHT]; // The master brightness mode of each display line.
u8 masterBrightnessIntensity[2][GPU_FRAMEBUFFER_NATIVE_HEIGHT]; // The master brightness intensity of each display line.
size_t renderedWidth[2]; // The display rendered at this width, measured in pixels.
size_t renderedHeight[2]; // The display rendered at this height, measured in pixels.
void *renderedBuffer[2]; // The display rendered to this buffer.
} NDSDisplayInfo;
#define VRAM_NO_3D_USAGE 0xFF