summaryrefslogtreecommitdiffstats
path: root/src/video_core/renderer_opengl/gl_staging_buffer_pool.h
diff options
context:
space:
mode:
authorameerj <52414509+ameerj@users.noreply.github.com>2023-05-28 03:46:15 +0200
committerameerj <52414509+ameerj@users.noreply.github.com>2023-05-28 06:38:46 +0200
commit642c14f0c7ee71f1f4daa50cee84ec9143697af6 (patch)
tree864fae9c9389790e87f8f63341c89e09f6fed5bc /src/video_core/renderer_opengl/gl_staging_buffer_pool.h
parentMerge pull request #10414 from liamwhite/anv-push-descriptor (diff)
downloadyuzu-642c14f0c7ee71f1f4daa50cee84ec9143697af6.tar
yuzu-642c14f0c7ee71f1f4daa50cee84ec9143697af6.tar.gz
yuzu-642c14f0c7ee71f1f4daa50cee84ec9143697af6.tar.bz2
yuzu-642c14f0c7ee71f1f4daa50cee84ec9143697af6.tar.lz
yuzu-642c14f0c7ee71f1f4daa50cee84ec9143697af6.tar.xz
yuzu-642c14f0c7ee71f1f4daa50cee84ec9143697af6.tar.zst
yuzu-642c14f0c7ee71f1f4daa50cee84ec9143697af6.zip
Diffstat (limited to '')
-rw-r--r--src/video_core/renderer_opengl/gl_staging_buffer_pool.h (renamed from src/video_core/renderer_opengl/gl_stream_buffer.h)42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/video_core/renderer_opengl/gl_stream_buffer.h b/src/video_core/renderer_opengl/gl_staging_buffer_pool.h
index 8fe927aaf..2c467be3d 100644
--- a/src/video_core/renderer_opengl/gl_stream_buffer.h
+++ b/src/video_core/renderer_opengl/gl_staging_buffer_pool.h
@@ -4,8 +4,10 @@
#pragma once
#include <array>
+#include <optional>
#include <span>
#include <utility>
+#include <vector>
#include <glad/glad.h>
@@ -17,6 +19,33 @@ namespace OpenGL {
using namespace Common::Literals;
+struct StagingBufferMap {
+ ~StagingBufferMap();
+
+ std::span<u8> mapped_span;
+ size_t offset = 0;
+ OGLSync* sync;
+ GLuint buffer;
+};
+
+struct StagingBuffers {
+ explicit StagingBuffers(GLenum storage_flags_, GLenum map_flags_);
+ ~StagingBuffers();
+
+ StagingBufferMap RequestMap(size_t requested_size, bool insert_fence);
+
+ size_t RequestBuffer(size_t requested_size);
+
+ std::optional<size_t> FindBuffer(size_t requested_size);
+
+ std::vector<OGLSync> syncs;
+ std::vector<OGLBuffer> buffers;
+ std::vector<u8*> maps;
+ std::vector<size_t> sizes;
+ GLenum storage_flags;
+ GLenum map_flags;
+};
+
class StreamBuffer {
static constexpr size_t STREAM_BUFFER_SIZE = 64_MiB;
static constexpr size_t NUM_SYNCS = 16;
@@ -48,4 +77,17 @@ private:
std::array<OGLSync, NUM_SYNCS> fences;
};
+class StagingBufferPool {
+public:
+ StagingBufferPool() = default;
+ ~StagingBufferPool() = default;
+
+ StagingBufferMap RequestUploadBuffer(size_t size);
+ StagingBufferMap RequestDownloadBuffer(size_t size);
+
+private:
+ StagingBuffers upload_buffers{GL_MAP_WRITE_BIT, GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT};
+ StagingBuffers download_buffers{GL_MAP_READ_BIT | GL_CLIENT_STORAGE_BIT, GL_MAP_READ_BIT};
+};
+
} // namespace OpenGL