| /* |
| * 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 |