videoconfig: add BBoxPreferStencilImplementation

@JMC47 requested this to be able to do performance comparisons.
This commit is contained in:
Michael Maltese 2017-03-10 00:07:49 -08:00
parent 53224d41d0
commit 134317e07f
5 changed files with 18 additions and 11 deletions

View File

@ -28,7 +28,7 @@ namespace OGL
{ {
void BoundingBox::SetTargetSizeChanged(int target_width, int target_height) void BoundingBox::SetTargetSizeChanged(int target_width, int target_height)
{ {
if (g_ActiveConfig.backend_info.bSupportsFragmentStoresAndAtomics) if (g_ActiveConfig.BBoxUseFragmentShaderImplementation())
return; return;
s_target_width = target_width; s_target_width = target_width;
@ -42,7 +42,7 @@ void BoundingBox::SetTargetSizeChanged(int target_width, int target_height)
void BoundingBox::Init(int target_width, int target_height) void BoundingBox::Init(int target_width, int target_height)
{ {
if (g_ActiveConfig.backend_info.bSupportsFragmentStoresAndAtomics) if (g_ActiveConfig.BBoxUseFragmentShaderImplementation())
{ {
int initial_values[4] = {0, 0, 0, 0}; int initial_values[4] = {0, 0, 0, 0};
glGenBuffers(1, &s_bbox_buffer_id); glGenBuffers(1, &s_bbox_buffer_id);
@ -60,7 +60,7 @@ void BoundingBox::Init(int target_width, int target_height)
void BoundingBox::Shutdown() void BoundingBox::Shutdown()
{ {
if (g_ActiveConfig.backend_info.bSupportsFragmentStoresAndAtomics) if (g_ActiveConfig.BBoxUseFragmentShaderImplementation())
{ {
glDeleteBuffers(1, &s_bbox_buffer_id); glDeleteBuffers(1, &s_bbox_buffer_id);
} }
@ -72,7 +72,7 @@ void BoundingBox::Shutdown()
void BoundingBox::Set(int index, int value) void BoundingBox::Set(int index, int value)
{ {
if (g_ActiveConfig.backend_info.bSupportsFragmentStoresAndAtomics) if (g_ActiveConfig.BBoxUseFragmentShaderImplementation())
{ {
glBindBuffer(GL_SHADER_STORAGE_BUFFER, s_bbox_buffer_id); glBindBuffer(GL_SHADER_STORAGE_BUFFER, s_bbox_buffer_id);
glBufferSubData(GL_SHADER_STORAGE_BUFFER, index * sizeof(int), sizeof(int), &value); glBufferSubData(GL_SHADER_STORAGE_BUFFER, index * sizeof(int), sizeof(int), &value);
@ -95,7 +95,7 @@ void BoundingBox::Set(int index, int value)
int BoundingBox::Get(int index) int BoundingBox::Get(int index)
{ {
if (g_ActiveConfig.backend_info.bSupportsFragmentStoresAndAtomics) if (g_ActiveConfig.BBoxUseFragmentShaderImplementation())
{ {
int data = 0; int data = 0;
glBindBuffer(GL_SHADER_STORAGE_BUFFER, s_bbox_buffer_id); glBindBuffer(GL_SHADER_STORAGE_BUFFER, s_bbox_buffer_id);
@ -170,7 +170,6 @@ void BoundingBox::StencilWasUpdated()
bool BoundingBox::NeedsStencilBuffer() bool BoundingBox::NeedsStencilBuffer()
{ {
return g_ActiveConfig.bBBoxEnable && return g_ActiveConfig.bBBoxEnable && !g_ActiveConfig.BBoxUseFragmentShaderImplementation();
!g_ActiveConfig.backend_info.bSupportsFragmentStoresAndAtomics;
} }
}; };

View File

@ -158,14 +158,14 @@ void VertexManager::vFlush()
// setup the pointers // setup the pointers
nativeVertexFmt->SetupVertexPointers(); nativeVertexFmt->SetupVertexPointers();
if (!g_Config.backend_info.bSupportsFragmentStoresAndAtomics && ::BoundingBox::active) if (::BoundingBox::active && !g_Config.BBoxUseFragmentShaderImplementation())
{ {
glEnable(GL_STENCIL_TEST); glEnable(GL_STENCIL_TEST);
} }
Draw(stride); Draw(stride);
if (!g_Config.backend_info.bSupportsFragmentStoresAndAtomics && ::BoundingBox::active) if (::BoundingBox::active && !g_Config.BBoxUseFragmentShaderImplementation())
{ {
OGL::BoundingBox::StencilWasUpdated(); OGL::BoundingBox::StencilWasUpdated();
glDisable(GL_STENCIL_TEST); glDisable(GL_STENCIL_TEST);

View File

@ -171,8 +171,7 @@ PixelShaderUid GetPixelShaderUid()
uid_data->genMode_numtevstages = bpmem.genMode.numtevstages; uid_data->genMode_numtevstages = bpmem.genMode.numtevstages;
uid_data->genMode_numtexgens = bpmem.genMode.numtexgens; uid_data->genMode_numtexgens = bpmem.genMode.numtexgens;
uid_data->per_pixel_lighting = g_ActiveConfig.bEnablePixelLighting; uid_data->per_pixel_lighting = g_ActiveConfig.bEnablePixelLighting;
uid_data->bounding_box = g_ActiveConfig.backend_info.bSupportsBBox && uid_data->bounding_box = g_ActiveConfig.BBoxUseFragmentShaderImplementation() &&
g_ActiveConfig.backend_info.bSupportsFragmentStoresAndAtomics &&
g_ActiveConfig.bBBoxEnable && BoundingBox::active; g_ActiveConfig.bBBoxEnable && BoundingBox::active;
uid_data->rgba6_format = uid_data->rgba6_format =
bpmem.zcontrol.pixel_format == PEControl::RGBA6_Z24 && !g_ActiveConfig.bForceTrueColor; bpmem.zcontrol.pixel_format == PEControl::RGBA6_Z24 && !g_ActiveConfig.bForceTrueColor;

View File

@ -119,6 +119,7 @@ void VideoConfig::Load(const std::string& ini_file)
IniFile::Section* hacks = iniFile.GetOrCreateSection("Hacks"); IniFile::Section* hacks = iniFile.GetOrCreateSection("Hacks");
hacks->Get("EFBAccessEnable", &bEFBAccessEnable, true); hacks->Get("EFBAccessEnable", &bEFBAccessEnable, true);
hacks->Get("BBoxEnable", &bBBoxEnable, false); hacks->Get("BBoxEnable", &bBBoxEnable, false);
hacks->Get("BBoxPreferStencilImplementation", &bBBoxPreferStencilImplementation, false);
hacks->Get("ForceProgressive", &bForceProgressive, true); hacks->Get("ForceProgressive", &bForceProgressive, true);
hacks->Get("EFBToTextureEnable", &bSkipEFBCopyToRam, true); hacks->Get("EFBToTextureEnable", &bSkipEFBCopyToRam, true);
hacks->Get("EFBScaledCopy", &bCopyEFBScaled, true); hacks->Get("EFBScaledCopy", &bCopyEFBScaled, true);
@ -342,6 +343,7 @@ void VideoConfig::Save(const std::string& ini_file)
IniFile::Section* hacks = iniFile.GetOrCreateSection("Hacks"); IniFile::Section* hacks = iniFile.GetOrCreateSection("Hacks");
hacks->Set("EFBAccessEnable", bEFBAccessEnable); hacks->Set("EFBAccessEnable", bEFBAccessEnable);
hacks->Set("BBoxEnable", bBBoxEnable); hacks->Set("BBoxEnable", bBBoxEnable);
hacks->Set("BBoxPreferStencilImplementation", bBBoxPreferStencilImplementation);
hacks->Set("ForceProgressive", bForceProgressive); hacks->Set("ForceProgressive", bForceProgressive);
hacks->Set("EFBToTextureEnable", bSkipEFBCopyToRam); hacks->Set("EFBToTextureEnable", bSkipEFBCopyToRam);
hacks->Set("EFBScaledCopy", bCopyEFBScaled); hacks->Set("EFBScaledCopy", bCopyEFBScaled);

View File

@ -114,6 +114,7 @@ struct VideoConfig final
bool bEFBAccessEnable; bool bEFBAccessEnable;
bool bPerfQueriesEnable; bool bPerfQueriesEnable;
bool bBBoxEnable; bool bBBoxEnable;
bool bBBoxPreferStencilImplementation; // OpenGL-only, to see how slow it is compared to SSBOs
bool bForceProgressive; bool bForceProgressive;
bool bEFBEmulateFormatChanges; bool bEFBEmulateFormatChanges;
@ -203,6 +204,12 @@ struct VideoConfig final
{ {
return backend_info.bSupportsExclusiveFullscreen && !bBorderlessFullscreen; return backend_info.bSupportsExclusiveFullscreen && !bBorderlessFullscreen;
} }
bool BBoxUseFragmentShaderImplementation() const
{
if (backend_info.api_type == APIType::OpenGL && bBBoxPreferStencilImplementation)
return false;
return backend_info.bSupportsBBox && backend_info.bSupportsFragmentStoresAndAtomics;
}
}; };
extern VideoConfig g_Config; extern VideoConfig g_Config;