diff --git a/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/active_state.cpp b/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/active_state.cpp index 5408fc86..eeb92605 100644 --- a/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/active_state.cpp +++ b/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/active_state.cpp @@ -146,12 +146,10 @@ namespace skyline::gpu::interconnect::maxwell3d { indexType = ConvertIndexType(engine->indexBuffer.indexSize); - if (quadConversion) { + if (quadConversion) megaBufferBinding = GenerateQuadConversionIndexBuffer(ctx, engine->indexBuffer.indexSize, *view, firstIndex, elementCount); - quadBufferSequence.SetSequence(quadBufferSequence.GenerateBufferBindingHash(megaBufferBinding)); - } else { + else megaBufferBinding = view->TryMegaBuffer(ctx.executor.cycle, ctx.gpu.megaBufferAllocator, ctx.executor.executionTag); - } if (megaBufferBinding) builder.SetIndexBuffer(megaBufferBinding, indexType); @@ -163,22 +161,17 @@ namespace skyline::gpu::interconnect::maxwell3d { if (*view) view->GetBuffer()->PopulateReadBarrier(vk::PipelineStageFlagBits::eVertexInput, srcStageMask, dstStageMask); - if (didEstimateSize != estimateSize || - (elementCount + firstIndex > usedElementCount + usedFirstIndex) || - quadConversion != usedQuadConversion) { + if (didEstimateSize != estimateSize || (elementCount + firstIndex > usedElementCount + usedFirstIndex) || quadConversion != usedQuadConversion) return true; - } + // TODO: optimise this to use buffer sequencing to avoid needing to regenerate the quad buffer every time. We can't use as it is rn though because sequences aren't globally unique and may conflict after buffer recreation if (usedQuadConversion) { - if (!quadBufferSequence.IsValid() || quadBufferSequence.HasChanged()) { - megaBufferBinding = GenerateQuadConversionIndexBuffer(ctx, engine->indexBuffer.indexSize, *view, firstIndex, elementCount); - quadBufferSequence.Update(); - quadBufferSequence.SetSequence(quadBufferSequence.GenerateBufferBindingHash(megaBufferBinding)); - } + megaBufferBinding = GenerateQuadConversionIndexBuffer(ctx, engine->indexBuffer.indexSize, *view, firstIndex, elementCount); builder.SetIndexBuffer(megaBufferBinding, indexType); } else if (megaBufferBinding) { - auto newMegaBufferBinding = view->TryMegaBuffer(ctx.executor.cycle, ctx.gpu.megaBufferAllocator, ctx.executor.executionTag); - if (newMegaBufferBinding != megaBufferBinding) { + if (auto newMegaBufferBinding{view->TryMegaBuffer(ctx.executor.cycle, ctx.gpu.megaBufferAllocator, ctx.executor.executionTag)}; + newMegaBufferBinding != megaBufferBinding) { + megaBufferBinding = newMegaBufferBinding; if (megaBufferBinding) builder.SetIndexBuffer(megaBufferBinding, indexType); diff --git a/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/active_state.h b/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/active_state.h index 7214eeb7..855d73e4 100644 --- a/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/active_state.h +++ b/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/active_state.h @@ -6,7 +6,6 @@ #include #include "common.h" #include "pipeline_state.h" -#include "buffer_sequence_tracker.h" namespace skyline::gpu::interconnect::maxwell3d { class VertexBufferState : dirty::RefreshableManualDirty, dirty::CachedManualDirty { @@ -52,7 +51,6 @@ namespace skyline::gpu::interconnect::maxwell3d { u32 usedElementCount{}; u32 usedFirstIndex{}; bool usedQuadConversion{}; - BufferSequenceTracker quadBufferSequence; public: IndexBufferState(dirty::Handle dirtyHandle, DirtyManager &manager, const EngineRegisters &engine); diff --git a/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/buffer_sequence_tracker.h b/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/buffer_sequence_tracker.h deleted file mode 100644 index ab7049a5..00000000 --- a/app/src/main/cpp/skyline/gpu/interconnect/maxwell_3d/buffer_sequence_tracker.h +++ /dev/null @@ -1,33 +0,0 @@ -#include -#include - -class BufferSequenceTracker { -public: - BufferSequenceTracker() : currentSequence(0), lastKnownSequence(0) {} - - bool IsValid() const { - return currentSequence > 0; - } - - bool HasChanged() const { - return currentSequence != lastKnownSequence; - } - - void Update() { - lastKnownSequence = currentSequence; - } - - void SetSequence(size_t sequence) { - currentSequence = sequence; - } - - size_t GenerateBufferBindingHash(const skyline::gpu::BufferBinding& binding) { - size_t bufferHash = std::hash{}(reinterpret_cast(static_cast(binding.buffer))); - size_t offsetHash = std::hash{}(binding.offset); - return bufferHash ^ (offsetHash << 1); - } - -private: - size_t currentSequence; - size_t lastKnownSequence; -};