blob: 275225888f24c20d71a869ef192230a597ee42e1 [file] [log] [blame]
/*
* Copyright 2022 Rive
*/
#pragma once
#include "rive/renderer.hpp"
#include "rive/renderer/gpu.hpp"
namespace rive
{
// RenderBuffer with additional indices to track the "front" and "back" buffers,
// assuming a ring of gpu::kBufferRingSize buffers.
class RiveRenderBuffer : public RenderBuffer
{
protected:
RiveRenderBuffer(RenderBufferType type,
RenderBufferFlags flags,
size_t sizeInBytes) :
RenderBuffer(type, flags, sizeInBytes)
{}
// Returns the index of the buffer to map and update, prior to rendering.
int backBufferIdx() const { return m_backBufferIdx; }
// Returns the index of the buffer to submit with rendering commands.
// Automatically advances the buffer ring if the RenderBuffer is dirty.
int frontBufferIdx()
{
if (checkAndResetDirty())
{
// The update buffer is dirty. Advance the buffer ring.
m_frontBufferIdx = m_backBufferIdx;
m_backBufferIdx = (m_backBufferIdx + 1) % gpu::kBufferRingSize;
}
return m_frontBufferIdx;
}
private:
int m_backBufferIdx = 0;
int m_frontBufferIdx = -1;
};
} // namespace rive