diff --git a/Data/Sys/GameSettings/G8M.ini b/Data/Sys/GameSettings/G8M.ini index 1516199687..1c07b83be4 100644 --- a/Data/Sys/GameSettings/G8M.ini +++ b/Data/Sys/GameSettings/G8M.ini @@ -19,4 +19,5 @@ EmulationIssues = Needs Efb to Ram for BBox (proper graphics). [Video_Hacks] EFBToTextureEnable = False +BBoxEnable = True diff --git a/Data/Sys/GameSettings/GDM.ini b/Data/Sys/GameSettings/GDM.ini index 783be19817..5445559bd5 100644 --- a/Data/Sys/GameSettings/GDM.ini +++ b/Data/Sys/GameSettings/GDM.ini @@ -17,3 +17,5 @@ EmulationIssues = [ActionReplay] # Add action replay cheats here. +[Video_Hacks] +BBoxEnable = True diff --git a/Data/Sys/GameSettings/GHV.ini b/Data/Sys/GameSettings/GHV.ini index ef688ce114..4acedba8a0 100644 --- a/Data/Sys/GameSettings/GHV.ini +++ b/Data/Sys/GameSettings/GHV.ini @@ -17,3 +17,5 @@ EmulationIssues = [ActionReplay] # Add action replay cheats here. +[Video_Hacks] +BBoxEnable = True diff --git a/Data/Sys/GameSettings/GSZ.ini b/Data/Sys/GameSettings/GSZ.ini index a305be0faa..d87d2d594c 100644 --- a/Data/Sys/GameSettings/GSZ.ini +++ b/Data/Sys/GameSettings/GSZ.ini @@ -25,3 +25,6 @@ PH_SZFar = 0 PH_ExtraParam = 0 PH_ZNear = PH_ZFar = + +[Video_Hacks] +BBoxEnable = True diff --git a/Data/Sys/GameSettings/R8P.ini b/Data/Sys/GameSettings/R8P.ini index 22ee7db50f..8cc62012b6 100644 --- a/Data/Sys/GameSettings/R8P.ini +++ b/Data/Sys/GameSettings/R8P.ini @@ -23,3 +23,5 @@ ProjectionHack = 0 [Video_Hacks] EFBToTextureEnable = False +[Video_Hacks] +BBoxEnable = True diff --git a/Source/Core/Common/JitRegister.cpp b/Source/Core/Common/JitRegister.cpp index bb09999f66..33dbcb52f9 100644 --- a/Source/Core/Common/JitRegister.cpp +++ b/Source/Core/Common/JitRegister.cpp @@ -12,7 +12,6 @@ #include "Common/FileUtil.h" #include "Common/JitRegister.h" #include "Common/StringUtil.h" -#include "Core/ConfigManager.h" #ifdef _WIN32 #include @@ -38,13 +37,12 @@ static File::IOFile s_perf_map_file; namespace JitRegister { -void Init() +void Init(const std::string& perf_dir) { #if defined USE_OPROFILE && USE_OPROFILE s_agent = op_open_agent(); #endif - const std::string& perf_dir = SConfig::GetInstance().m_LocalCoreStartupParameter.m_perfDir; if (!perf_dir.empty()) { std::string filename = StringFromFormat("%s/perf-%d.map", perf_dir.data(), getpid()); diff --git a/Source/Core/Common/JitRegister.h b/Source/Core/Common/JitRegister.h index b42051a422..5b89f12cf3 100644 --- a/Source/Core/Common/JitRegister.h +++ b/Source/Core/Common/JitRegister.h @@ -9,7 +9,7 @@ namespace JitRegister { -void Init(); +void Init(const std::string& perf_dir); void Shutdown(); void RegisterV(const void* base_address, u32 code_size, const char* format, va_list args); diff --git a/Source/Core/Core/PowerPC/JitCommon/JitCache.cpp b/Source/Core/Core/PowerPC/JitCommon/JitCache.cpp index 88b62a575f..1a4bfc5957 100644 --- a/Source/Core/Core/PowerPC/JitCommon/JitCache.cpp +++ b/Source/Core/Core/PowerPC/JitCommon/JitCache.cpp @@ -36,7 +36,7 @@ using namespace Gen; return; } - JitRegister::Init(); + JitRegister::Init(SConfig::GetInstance().m_LocalCoreStartupParameter.m_perfDir); iCache.fill(JIT_ICACHE_INVALID_BYTE); iCacheEx.fill(JIT_ICACHE_INVALID_BYTE); diff --git a/Source/Core/DolphinWX/VideoConfigDiag.cpp b/Source/Core/DolphinWX/VideoConfigDiag.cpp index 12ef34a35e..c703761554 100644 --- a/Source/Core/DolphinWX/VideoConfigDiag.cpp +++ b/Source/Core/DolphinWX/VideoConfigDiag.cpp @@ -110,6 +110,7 @@ static wxString aa_desc = _("Reduces the amount of aliasing caused by rasterizin static wxString scaled_efb_copy_desc = _("Greatly increases quality of textures generated using render-to-texture effects.\nRaising the internal resolution will improve the effect of this setting.\nSlightly increases GPU load and causes relatively few graphical issues.\n\nIf unsure, leave this checked."); static wxString pixel_lighting_desc = _("Calculates lighting of 3D objects per-pixel rather than per-vertex, smoothing out the appearance of lit polygons and making individual triangles less noticeable.\nRarely causes slowdowns or graphical issues.\n\nIf unsure, leave this unchecked."); static wxString fast_depth_calc_desc = _("Use a less accurate algorithm to calculate depth values.\nCauses issues in a few games, but can give a decent speedup depending on the game and/or your GPU.\n\nIf unsure, leave this checked."); +static wxString disable_bbox_desc = _("Disable the bounding box emulation.\nThis may improve the GPU performance a lot, but some games will break.\n\nIf unsure, leave this checked."); static wxString force_filtering_desc = _("Filter all textures, including any that the game explicitly set as unfiltered.\nMay improve quality of certain textures in some games, but will cause issues in others.\nOn Direct3D, setting Anisotropic Filtering above 1x will also have the same effect as enabling this option.\n\nIf unsure, leave this unchecked."); static wxString borderless_fullscreen_desc = _("Implement fullscreen mode with a borderless window spanning the whole screen instead of using exclusive mode.\nAllows for faster transitions between fullscreen and windowed mode, but slightly increases input latency, makes movement less smooth and slightly decreases performance.\nExclusive mode is required for Nvidia 3D Vision to work in the Direct3D backend.\n\nIf unsure, leave this unchecked."); static wxString internal_res_desc = _("Specifies the resolution used to render at. A high resolution greatly improves visual quality, but also greatly increases GPU load and can cause issues in certain games.\n\"Multiple of 640x528\" will result in a size slightly larger than \"Window Size\" but yield fewer issues. Generally speaking, the lower the internal resolution is, the better your performance will be.\n\nIf unsure, select 640x528."); @@ -517,6 +518,7 @@ VideoConfigDiag::VideoConfigDiag(wxWindow* parent, const std::string &title, con wxGridSizer* const szr_other = new wxGridSizer(2, 5, 5); szr_other->Add(CreateCheckBox(page_hacks, _("Disable Destination Alpha"), disable_dstalpha_desc, vconfig.bDstAlphaPass)); szr_other->Add(CreateCheckBox(page_hacks, _("Fast Depth Calculation"), fast_depth_calc_desc, vconfig.bFastDepthCalc)); + szr_other->Add(CreateCheckBox(page_hacks, _("Disable Bounding Box"), disable_bbox_desc, vconfig.bBBoxEnable, true)); wxStaticBoxSizer* const group_other = new wxStaticBoxSizer(wxVERTICAL, page_hacks, _("Other")); group_other->Add(szr_other, 1, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, 5); diff --git a/Source/Core/VideoBackends/Software/SWVertexLoader.cpp b/Source/Core/VideoBackends/Software/SWVertexLoader.cpp index b58c012ab7..d77bbc810b 100644 --- a/Source/Core/VideoBackends/Software/SWVertexLoader.cpp +++ b/Source/Core/VideoBackends/Software/SWVertexLoader.cpp @@ -33,7 +33,6 @@ SWVertexLoader::~SWVertexLoader() void SWVertexLoader::SetFormat(u8 attributeIndex, u8 primitiveType) { m_attributeIndex = attributeIndex; - m_primitiveType = primitiveType; VertexLoaderUID uid(g_main_cp_state.vtx_desc, g_main_cp_state.vtx_attr[m_attributeIndex]); m_CurrentLoader = m_VertexLoaderMap[uid].get(); @@ -182,7 +181,7 @@ void SWVertexLoader::LoadVertex() int converted_vertices = m_CurrentLoader->RunVertices( DataReader(g_video_buffer_read_ptr, nullptr), // src DataReader(m_LoadedVertices.data(), m_LoadedVertices.data() + m_LoadedVertices.size()), // dst - 1, m_primitiveType + 1 // vertices ); g_video_buffer_read_ptr = old + m_CurrentLoader->m_VertexSize; diff --git a/Source/Core/VideoBackends/Software/SWVertexLoader.h b/Source/Core/VideoBackends/Software/SWVertexLoader.h index 8de1e95b23..4972364c1b 100644 --- a/Source/Core/VideoBackends/Software/SWVertexLoader.h +++ b/Source/Core/VideoBackends/Software/SWVertexLoader.h @@ -36,7 +36,6 @@ class SWVertexLoader VertexLoaderBase* m_CurrentLoader; u8 m_attributeIndex; - u8 m_primitiveType; public: SWVertexLoader(); diff --git a/Source/Core/VideoCommon/BPStructs.cpp b/Source/Core/VideoCommon/BPStructs.cpp index b4d9fe31e9..3b883fb205 100644 --- a/Source/Core/VideoCommon/BPStructs.cpp +++ b/Source/Core/VideoCommon/BPStructs.cpp @@ -379,16 +379,11 @@ static void BPWritten(const BPCmd& bp) u8 offset = bp.address & 2; BoundingBox::active = true; - if (g_ActiveConfig.backend_info.bSupportsBBox) + if (g_ActiveConfig.backend_info.bSupportsBBox && g_ActiveConfig.bBBoxEnable) { g_renderer->BBoxWrite(offset, bp.newvalue & 0x3ff); g_renderer->BBoxWrite(offset + 1, bp.newvalue >> 10); } - else - { - BoundingBox::coords[offset] = bp.newvalue & 0x3ff; - BoundingBox::coords[offset + 1] = bp.newvalue >> 10; - } } return; case BPMEM_TEXINVALIDATE: diff --git a/Source/Core/VideoCommon/BoundingBox.cpp b/Source/Core/VideoCommon/BoundingBox.cpp index 51c4511b7e..f1bf5d066e 100644 --- a/Source/Core/VideoCommon/BoundingBox.cpp +++ b/Source/Core/VideoCommon/BoundingBox.cpp @@ -18,127 +18,6 @@ namespace BoundingBox // External vars bool active = false; u16 coords[4] = { 0x80, 0xA0, 0x80, 0xA0 }; -u8 posMtxIdx; -u8 texMtxIdx[8]; - - -// Internal vars -static SetupUnit vtxUnit; -static VAT myVat; -static u8 * bufferPos; -static TVtxDesc vertexDesc; -static PortableVertexDeclaration vertexDecl; - -// Gets the pointer to the current buffer position -void LOADERDECL SetVertexBufferPosition(VertexLoader* loader) -{ - bufferPos = g_vertex_manager_write_ptr; -} - -// Prepares the bounding box for new primitive data -void Prepare(const VAT & vat, int primitive, const TVtxDesc & vtxDesc, const PortableVertexDeclaration & vtxDecl) -{ - if (!active) - return; - - myVat = vat; - vertexDesc = vtxDesc; - vertexDecl = vtxDecl; - - vtxUnit.Init(primitive); - - // Initialize the SW renderer - static bool SWinit = false; - - if (!SWinit) - { - Clipper::Init(); - Rasterizer::Init(); - SWinit = true; - } - - // Update SW renderer values - Clipper::SetViewOffset(); - Rasterizer::SetScissor(); - - for (u8 i = 0; i < 4; ++i) - { - Rasterizer::SetTevReg(i, 0, true, (s16)PixelShaderManager::constants.kcolors[i][0]); - Rasterizer::SetTevReg(i, 1, true, (s16)PixelShaderManager::constants.kcolors[i][1]); - Rasterizer::SetTevReg(i, 2, true, (s16)PixelShaderManager::constants.kcolors[i][2]); - Rasterizer::SetTevReg(i, 3, true, (s16)PixelShaderManager::constants.kcolors[i][3]); - - Rasterizer::SetTevReg(i, 0, false, (s16)PixelShaderManager::constants.colors[i][0]); - Rasterizer::SetTevReg(i, 1, false, (s16)PixelShaderManager::constants.colors[i][1]); - Rasterizer::SetTevReg(i, 2, false, (s16)PixelShaderManager::constants.colors[i][2]); - Rasterizer::SetTevReg(i, 3, false, (s16)PixelShaderManager::constants.colors[i][3]); - } -} - -// Updates the bounding box -void LOADERDECL Update(VertexLoader* loader) -{ - if (!active) - return; - - // Grab vertex input data and transform to output vertex - InputVertexData myVertex; - OutputVertexData * outVertex = vtxUnit.GetVertex(); - - // Feed vertex position and matrix - myVertex.position = Vec3((const float *)bufferPos); - myVertex.posMtx = vertexDesc.PosMatIdx ? posMtxIdx : g_main_cp_state.matrix_index_a.PosNormalMtxIdx; - - // Transform position - TransformUnit::TransformPosition(&myVertex, outVertex); - - if (g_main_cp_state.vtx_desc.Normal != NOT_PRESENT) - { - // Feed normal input data and transform - memcpy((u8 *)myVertex.normal, bufferPos + vertexDecl.normals[0].offset, sizeof(float) * 3 * ((myVat.g0.NormalElements) ? 3 : 1)); - - TransformUnit::TransformNormal(&myVertex, myVat.g0.NormalElements, outVertex); - } - - // Feed color input data - for (int i = 0; i < 2; ++i) - { - if (vertexDecl.colors[i].enable) - { - u32 color; - memcpy((u8 *)&color, bufferPos + vertexDecl.colors[i].offset, sizeof(u32)); - *(u32*)myVertex.color[i] = Common::swap32(color); - } - } - - // Transform color - TransformUnit::TransformColor(&myVertex, outVertex); - - // Feed texture matrices - int idx = 0; - - myVertex.texMtx[0] = (vertexDesc.Tex0MatIdx) ? texMtxIdx[idx++] : g_main_cp_state.matrix_index_a.Tex0MtxIdx; - myVertex.texMtx[1] = (vertexDesc.Tex1MatIdx) ? texMtxIdx[idx++] : g_main_cp_state.matrix_index_a.Tex1MtxIdx; - myVertex.texMtx[2] = (vertexDesc.Tex2MatIdx) ? texMtxIdx[idx++] : g_main_cp_state.matrix_index_a.Tex2MtxIdx; - myVertex.texMtx[3] = (vertexDesc.Tex3MatIdx) ? texMtxIdx[idx++] : g_main_cp_state.matrix_index_a.Tex3MtxIdx; - myVertex.texMtx[4] = (vertexDesc.Tex4MatIdx) ? texMtxIdx[idx++] : g_main_cp_state.matrix_index_b.Tex4MtxIdx; - myVertex.texMtx[5] = (vertexDesc.Tex5MatIdx) ? texMtxIdx[idx++] : g_main_cp_state.matrix_index_b.Tex5MtxIdx; - myVertex.texMtx[6] = (vertexDesc.Tex6MatIdx) ? texMtxIdx[idx++] : g_main_cp_state.matrix_index_b.Tex6MtxIdx; - myVertex.texMtx[7] = (vertexDesc.Tex7MatIdx) ? texMtxIdx[idx++] : g_main_cp_state.matrix_index_b.Tex7MtxIdx; - - // Feed texture coordinate data - for (int i = 0; i < 8; ++i) - { - if (vertexDecl.texcoords[i].enable) - memcpy((u8 *)&myVertex.texCoords[i], bufferPos + vertexDecl.texcoords[i].offset, sizeof(float) * 2); - } - - // Transform texture coordinate - TransformUnit::TransformTexCoord(&myVertex, outVertex, false); - - // Render the vertex in SW to calculate bbox - vtxUnit.SetupVertex(); -} // Save state void DoState(PointerWrap &p) diff --git a/Source/Core/VideoCommon/BoundingBox.h b/Source/Core/VideoCommon/BoundingBox.h index 1e1cbcc711..af649b8971 100644 --- a/Source/Core/VideoCommon/BoundingBox.h +++ b/Source/Core/VideoCommon/BoundingBox.h @@ -25,16 +25,6 @@ enum BOTTOM = 3 }; -// Current position matrix index -extern u8 posMtxIdx; - -// Texture matrix indexes -extern u8 texMtxIdx[8]; - -void LOADERDECL SetVertexBufferPosition(VertexLoader* loader); -void LOADERDECL Update(VertexLoader* loader); -void Prepare(const VAT & vat, int primitive, const TVtxDesc & vtxDesc, const PortableVertexDeclaration & vtxDecl); - // Save state void DoState(PointerWrap &p); diff --git a/Source/Core/VideoCommon/MainBase.cpp b/Source/Core/VideoCommon/MainBase.cpp index 2b6324a0b4..0b9dd58f27 100644 --- a/Source/Core/VideoCommon/MainBase.cpp +++ b/Source/Core/VideoCommon/MainBase.cpp @@ -157,7 +157,16 @@ u32 VideoBackendHardware::Video_GetQueryResult(PerfQueryType type) u16 VideoBackendHardware::Video_GetBoundingBox(int index) { if (!g_ActiveConfig.backend_info.bSupportsBBox) - return BoundingBox::coords[index]; + return 0; + + if (!g_ActiveConfig.bBBoxEnable) + { + static bool warn_once = true; + if (warn_once) + ERROR_LOG(VIDEO, "BBox shall be used but it is disabled. Please use a gameini to enable it for this game."); + warn_once = false; + return 0; + } SyncGPU(SYNC_GPU_BBOX); diff --git a/Source/Core/VideoCommon/PixelShaderGen.cpp b/Source/Core/VideoCommon/PixelShaderGen.cpp index 8d504ac401..ecb47d5584 100644 --- a/Source/Core/VideoCommon/PixelShaderGen.cpp +++ b/Source/Core/VideoCommon/PixelShaderGen.cpp @@ -277,7 +277,7 @@ static inline void GeneratePixelShader(T& out, DSTALPHA_MODE dstAlphaMode, API_T out.Write("};\n"); } - if (g_ActiveConfig.backend_info.bSupportsBBox) + if (g_ActiveConfig.backend_info.bSupportsBBox && g_ActiveConfig.bBBoxEnable) { if (ApiType == API_OPENGL) { @@ -641,7 +641,7 @@ static inline void GeneratePixelShader(T& out, DSTALPHA_MODE dstAlphaMode, API_T out.Write("\tocol0.a = float(" I_ALPHA".a) / 255.0;\n"); } - if (g_ActiveConfig.backend_info.bSupportsBBox && BoundingBox::active) + if (g_ActiveConfig.backend_info.bSupportsBBox && g_ActiveConfig.bBBoxEnable && BoundingBox::active) { uid_data->bounding_box = true; const char* atomic_op = ApiType == API_OPENGL ? "atomic" : "Interlocked"; diff --git a/Source/Core/VideoCommon/VertexLoader.cpp b/Source/Core/VideoCommon/VertexLoader.cpp index e8a5c8ddcf..72aad88d7f 100644 --- a/Source/Core/VideoCommon/VertexLoader.cpp +++ b/Source/Core/VideoCommon/VertexLoader.cpp @@ -7,7 +7,6 @@ #include "Core/Host.h" -#include "VideoCommon/BoundingBox.h" #include "VideoCommon/DataReader.h" #include "VideoCommon/PixelEngine.h" #include "VideoCommon/VertexLoader.h" @@ -24,14 +23,14 @@ u8* g_vertex_manager_write_ptr; static void LOADERDECL PosMtx_ReadDirect_UByte(VertexLoader* loader) { - u8 posmtx = BoundingBox::posMtxIdx = DataReadU8() & 0x3f; + u32 posmtx = DataReadU8() & 0x3f; DataWrite(posmtx); PRIM_LOG("posmtx: %d, ", posmtx); } static void LOADERDECL TexMtx_ReadDirect_UByte(VertexLoader* loader) { - BoundingBox::texMtxIdx[loader->m_texmtxread] = loader->m_curtexmtx[loader->m_texmtxread] = DataReadU8() & 0x3f; + loader->m_curtexmtx[loader->m_texmtxread] = DataReadU8() & 0x3f; PRIM_LOG("texmtx%d: %d, ", loader->m_texmtxread, loader->m_curtexmtx[loader->m_texmtxread]); loader->m_texmtxread++; @@ -87,10 +86,6 @@ void VertexLoader::CompileVertexTranslator() // Reset pipeline m_numPipelineStages = 0; - // Get the pointer to this vertex's buffer data for the bounding box - if (!g_ActiveConfig.backend_info.bSupportsBBox) - WriteCall(BoundingBox::SetVertexBufferPosition); - // Colors const u64 col[2] = { m_VtxDesc.Color0, m_VtxDesc.Color1 }; // TextureCoord @@ -298,10 +293,6 @@ void VertexLoader::CompileVertexTranslator() } } - // Update the bounding box - if (!g_ActiveConfig.backend_info.bSupportsBBox) - WriteCall(BoundingBox::Update); - // indexed position formats may skip a the vertex if (m_VtxDesc.Position & 2) { @@ -317,7 +308,7 @@ void VertexLoader::WriteCall(TPipelineFunction func) m_PipelineStages[m_numPipelineStages++] = func; } -int VertexLoader::RunVertices(DataReader src, DataReader dst, int count, int primitive) +int VertexLoader::RunVertices(DataReader src, DataReader dst, int count) { g_vertex_manager_write_ptr = dst.GetPointer(); g_video_buffer_read_ptr = src.GetPointer(); @@ -325,10 +316,6 @@ int VertexLoader::RunVertices(DataReader src, DataReader dst, int count, int pri m_numLoadedVertices += count; m_skippedVertices = 0; - // Prepare bounding box - if (!g_ActiveConfig.backend_info.bSupportsBBox) - BoundingBox::Prepare(m_vat, primitive, m_VtxDesc, m_native_vtx_decl); - for (int s = 0; s < count; s++) { m_tcIndex = 0; diff --git a/Source/Core/VideoCommon/VertexLoader.h b/Source/Core/VideoCommon/VertexLoader.h index d10b9a3172..b53532a592 100644 --- a/Source/Core/VideoCommon/VertexLoader.h +++ b/Source/Core/VideoCommon/VertexLoader.h @@ -32,7 +32,7 @@ class VertexLoader : public VertexLoaderBase public: VertexLoader(const TVtxDesc &vtx_desc, const VAT &vtx_attr); - int RunVertices(DataReader src, DataReader dst, int count, int primitive) override; + int RunVertices(DataReader src, DataReader dst, int count) override; std::string GetName() const override { return "OldLoader"; } bool IsInitialized() override { return true; } // This vertex loader supports all formats diff --git a/Source/Core/VideoCommon/VertexLoaderARM64.cpp b/Source/Core/VideoCommon/VertexLoaderARM64.cpp index 3004880214..038a576e74 100644 --- a/Source/Core/VideoCommon/VertexLoaderARM64.cpp +++ b/Source/Core/VideoCommon/VertexLoaderARM64.cpp @@ -535,7 +535,7 @@ void VertexLoaderARM64::GenerateVertexLoader() m_native_vtx_decl.stride = m_dst_ofs; } -int VertexLoaderARM64::RunVertices(DataReader src, DataReader dst, int count, int primitive) +int VertexLoaderARM64::RunVertices(DataReader src, DataReader dst, int count) { m_numLoadedVertices += count; return ((int (*)(u8* src, u8* dst, int count))region)(src.GetPointer(), dst.GetPointer(), count); diff --git a/Source/Core/VideoCommon/VertexLoaderARM64.h b/Source/Core/VideoCommon/VertexLoaderARM64.h index 8ded9ce171..cbcf7bf06d 100644 --- a/Source/Core/VideoCommon/VertexLoaderARM64.h +++ b/Source/Core/VideoCommon/VertexLoaderARM64.h @@ -14,7 +14,7 @@ public: protected: std::string GetName() const override { return "VertexLoaderARM64"; } bool IsInitialized() override { return true; } - int RunVertices(DataReader src, DataReader dst, int count, int primitive) override; + int RunVertices(DataReader src, DataReader dst, int count) override; private: u32 m_src_ofs = 0; diff --git a/Source/Core/VideoCommon/VertexLoaderBase.cpp b/Source/Core/VideoCommon/VertexLoaderBase.cpp index 64bef30928..d5831bc8e5 100644 --- a/Source/Core/VideoCommon/VertexLoaderBase.cpp +++ b/Source/Core/VideoCommon/VertexLoaderBase.cpp @@ -161,13 +161,13 @@ public: delete b; } - int RunVertices(DataReader src, DataReader dst, int count, int primitive) override + int RunVertices(DataReader src, DataReader dst, int count) override { buffer_a.resize(count * a->m_native_vtx_decl.stride + 4); buffer_b.resize(count * b->m_native_vtx_decl.stride + 4); - int count_a = a->RunVertices(src, DataReader(buffer_a.data(), buffer_a.data()+buffer_a.size()), count, primitive); - int count_b = b->RunVertices(src, DataReader(buffer_b.data(), buffer_b.data()+buffer_b.size()), count, primitive); + int count_a = a->RunVertices(src, DataReader(buffer_a.data(), buffer_a.data()+buffer_a.size()), count); + int count_b = b->RunVertices(src, DataReader(buffer_b.data(), buffer_b.data()+buffer_b.size()), count); if (count_a != count_b) ERROR_LOG(VIDEO, "The two vertex loaders have loaded a different amount of vertices (a: %d, b: %d).", count_a, count_b); diff --git a/Source/Core/VideoCommon/VertexLoaderBase.h b/Source/Core/VideoCommon/VertexLoaderBase.h index 3f145c2e65..46f7509c0f 100644 --- a/Source/Core/VideoCommon/VertexLoaderBase.h +++ b/Source/Core/VideoCommon/VertexLoaderBase.h @@ -74,7 +74,7 @@ public: static VertexLoaderBase* CreateVertexLoader(const TVtxDesc &vtx_desc, const VAT &vtx_attr); virtual ~VertexLoaderBase() {} - virtual int RunVertices(DataReader src, DataReader dst, int count, int primitive) = 0; + virtual int RunVertices(DataReader src, DataReader dst, int count) = 0; virtual bool IsInitialized() = 0; diff --git a/Source/Core/VideoCommon/VertexLoaderManager.cpp b/Source/Core/VideoCommon/VertexLoaderManager.cpp index d06962af47..4168f7c777 100644 --- a/Source/Core/VideoCommon/VertexLoaderManager.cpp +++ b/Source/Core/VideoCommon/VertexLoaderManager.cpp @@ -165,7 +165,7 @@ int RunVertices(int vtx_attr_group, int primitive, int count, DataReader src, bo DataReader dst = VertexManager::PrepareForAdditionalData(primitive, count, loader->m_native_vtx_decl.stride, cullall); - count = loader->RunVertices(src, dst, count, primitive); + count = loader->RunVertices(src, dst, count); IndexGenerator::AddIndices(primitive, count); diff --git a/Source/Core/VideoCommon/VertexLoaderX64.cpp b/Source/Core/VideoCommon/VertexLoaderX64.cpp index 5ec531ab6c..476566ab49 100644 --- a/Source/Core/VideoCommon/VertexLoaderX64.cpp +++ b/Source/Core/VideoCommon/VertexLoaderX64.cpp @@ -512,7 +512,7 @@ void VertexLoaderX64::GenerateVertexLoader() m_native_vtx_decl.stride = m_dst_ofs; } -int VertexLoaderX64::RunVertices(DataReader src, DataReader dst, int count, int primitive) +int VertexLoaderX64::RunVertices(DataReader src, DataReader dst, int count) { m_numLoadedVertices += count; return ((int (*)(u8* src, u8* dst, int count))region)(src.GetPointer(), dst.GetPointer(), count); diff --git a/Source/Core/VideoCommon/VertexLoaderX64.h b/Source/Core/VideoCommon/VertexLoaderX64.h index e3df37b987..2d5ff72beb 100644 --- a/Source/Core/VideoCommon/VertexLoaderX64.h +++ b/Source/Core/VideoCommon/VertexLoaderX64.h @@ -13,7 +13,7 @@ public: protected: std::string GetName() const override { return "VertexLoaderX64"; } bool IsInitialized() override { return true; } - int RunVertices(DataReader src, DataReader dst, int count, int primitive) override; + int RunVertices(DataReader src, DataReader dst, int count) override; private: u32 m_src_ofs = 0; diff --git a/Source/Core/VideoCommon/VideoConfig.cpp b/Source/Core/VideoCommon/VideoConfig.cpp index 99b287771e..9bca0e86ad 100644 --- a/Source/Core/VideoCommon/VideoConfig.cpp +++ b/Source/Core/VideoCommon/VideoConfig.cpp @@ -97,6 +97,7 @@ void VideoConfig::Load(const std::string& ini_file) IniFile::Section* hacks = iniFile.GetOrCreateSection("Hacks"); hacks->Get("EFBAccessEnable", &bEFBAccessEnable, true); + hacks->Get("BBoxEnable", &bBBoxEnable, false); hacks->Get("EFBToTextureEnable", &bSkipEFBCopyToRam, true); hacks->Get("EFBScaledCopy", &bCopyEFBScaled, true); hacks->Get("EFBEmulateFormatChanges", &bEFBEmulateFormatChanges, false); @@ -196,6 +197,7 @@ void VideoConfig::GameIniLoad() CHECK_SETTING("Video_Stereoscopy", "StereoConvergenceMinimum", iStereoConvergenceMinimum); CHECK_SETTING("Video_Hacks", "EFBAccessEnable", bEFBAccessEnable); + CHECK_SETTING("Video_Hacks", "BBoxEnable", bBBoxEnable); CHECK_SETTING("Video_Hacks", "EFBToTextureEnable", bSkipEFBCopyToRam); CHECK_SETTING("Video_Hacks", "EFBScaledCopy", bCopyEFBScaled); CHECK_SETTING("Video_Hacks", "EFBEmulateFormatChanges", bEFBEmulateFormatChanges); @@ -283,6 +285,7 @@ void VideoConfig::Save(const std::string& ini_file) IniFile::Section* hacks = iniFile.GetOrCreateSection("Hacks"); hacks->Set("EFBAccessEnable", bEFBAccessEnable); + hacks->Set("BBoxEnable", bBBoxEnable); hacks->Set("EFBToTextureEnable", bSkipEFBCopyToRam); hacks->Set("EFBScaledCopy", bCopyEFBScaled); hacks->Set("EFBEmulateFormatChanges", bEFBEmulateFormatChanges); diff --git a/Source/Core/VideoCommon/VideoConfig.h b/Source/Core/VideoCommon/VideoConfig.h index 41c04ad770..64eec52173 100644 --- a/Source/Core/VideoCommon/VideoConfig.h +++ b/Source/Core/VideoCommon/VideoConfig.h @@ -112,6 +112,7 @@ struct VideoConfig final // Hacks bool bEFBAccessEnable; bool bPerfQueriesEnable; + bool bBBoxEnable; bool bEFBEmulateFormatChanges; bool bSkipEFBCopyToRam; diff --git a/Source/UnitTests/VideoCommon/VertexLoaderTest.cpp b/Source/UnitTests/VideoCommon/VertexLoaderTest.cpp index a31c1b79fe..8c4ea12964 100644 --- a/Source/UnitTests/VideoCommon/VertexLoaderTest.cpp +++ b/Source/UnitTests/VideoCommon/VertexLoaderTest.cpp @@ -87,7 +87,7 @@ protected: if (expected_count == -1) expected_count = count; ResetPointers(); - int actual_count = m_loader->RunVertices(m_src, m_dst, count, GX_DRAW_POINTS); + int actual_count = m_loader->RunVertices(m_src, m_dst, count); EXPECT_EQ(actual_count, expected_count); }