summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/VertexManagerBase.cpp
diff options
context:
space:
mode:
authorTellowKrinkle <tellowkrinkle@gmail.com>2022-07-26 03:57:30 -0500
committerTellowKrinkle <tellowkrinkle@gmail.com>2023-01-25 02:21:56 -0600
commit1be0149146b23d65a52b5d74c4c073c016878bc9 (patch)
tree89f53854fdb739e040c23389e7fda36e8fecc2e7 /Source/Core/VideoCommon/VertexManagerBase.cpp
parentb170ef9651cda959a5bfa277bb533815f10de5d8 (diff)
VideoCommon: Cull vertices on the CPU
Diffstat (limited to 'Source/Core/VideoCommon/VertexManagerBase.cpp')
-rw-r--r--Source/Core/VideoCommon/VertexManagerBase.cpp20
1 files changed, 20 insertions, 0 deletions
diff --git a/Source/Core/VideoCommon/VertexManagerBase.cpp b/Source/Core/VideoCommon/VertexManagerBase.cpp
index 88d7c47fba..88bdfccb24 100644
--- a/Source/Core/VideoCommon/VertexManagerBase.cpp
+++ b/Source/Core/VideoCommon/VertexManagerBase.cpp
@@ -104,6 +104,7 @@ VertexManagerBase::~VertexManagerBase() = default;
bool VertexManagerBase::Initialize()
{
m_index_generator.Init();
+ m_cpu_cull.Init();
return true;
}
@@ -117,6 +118,13 @@ void VertexManagerBase::AddIndices(OpcodeDecoder::Primitive primitive, u32 num_v
m_index_generator.AddIndices(primitive, num_vertices);
}
+bool VertexManagerBase::AreAllVerticesCulled(VertexLoaderBase* loader,
+ OpcodeDecoder::Primitive primitive, const u8* src,
+ u32 count)
+{
+ return m_cpu_cull.AreAllVerticesCulled(loader, primitive, src, count);
+}
+
DataReader VertexManagerBase::PrepareForAdditionalData(OpcodeDecoder::Primitive primitive,
u32 count, u32 stride, bool cullall)
{
@@ -185,6 +193,16 @@ DataReader VertexManagerBase::PrepareForAdditionalData(OpcodeDecoder::Primitive
return DataReader(m_cur_buffer_pointer, m_end_buffer_pointer);
}
+DataReader VertexManagerBase::DisableCullAll(u32 stride)
+{
+ if (m_cull_all)
+ {
+ m_cull_all = false;
+ ResetBuffer(stride);
+ }
+ return DataReader(m_cur_buffer_pointer, m_end_buffer_pointer);
+}
+
void VertexManagerBase::FlushData(u32 count, u32 stride)
{
m_cur_buffer_pointer += count * stride;
@@ -546,6 +564,8 @@ void VertexManagerBase::Flush()
// Now the vertices can be flushed to the GPU. Everything following the CommitBuffer() call
// must be careful to not upload any utility vertices, as the binding will be lost otherwise.
const u32 num_indices = m_index_generator.GetIndexLen();
+ if (num_indices == 0)
+ return;
u32 base_vertex, base_index;
CommitBuffer(m_index_generator.GetNumVerts(),
VertexLoaderManager::GetCurrentVertexFormat()->GetVertexStride(), num_indices,