summaryrefslogtreecommitdiffstats
path: root/src/video_core/renderer_opengl/gl_buffer_cache.cpp
diff options
context:
space:
mode:
authorReinUsesLisp <reinuseslisp@airmail.cc>2019-11-02 08:08:31 +0100
committerReinUsesLisp <reinuseslisp@airmail.cc>2019-11-02 09:05:34 +0100
commit76ca2a5f82f4df64cb839af42c93acb6705411ae (patch)
tree22ef46bef8f32d8b2aa2f3928a96b30b3f69e213 /src/video_core/renderer_opengl/gl_buffer_cache.cpp
parentMerge pull request #3054 from FernandoS27/fix-tld4-2 (diff)
downloadyuzu-76ca2a5f82f4df64cb839af42c93acb6705411ae.tar
yuzu-76ca2a5f82f4df64cb839af42c93acb6705411ae.tar.gz
yuzu-76ca2a5f82f4df64cb839af42c93acb6705411ae.tar.bz2
yuzu-76ca2a5f82f4df64cb839af42c93acb6705411ae.tar.lz
yuzu-76ca2a5f82f4df64cb839af42c93acb6705411ae.tar.xz
yuzu-76ca2a5f82f4df64cb839af42c93acb6705411ae.tar.zst
yuzu-76ca2a5f82f4df64cb839af42c93acb6705411ae.zip
Diffstat (limited to 'src/video_core/renderer_opengl/gl_buffer_cache.cpp')
-rw-r--r--src/video_core/renderer_opengl/gl_buffer_cache.cpp31
1 files changed, 27 insertions, 4 deletions
diff --git a/src/video_core/renderer_opengl/gl_buffer_cache.cpp b/src/video_core/renderer_opengl/gl_buffer_cache.cpp
index f8a807c84..0375fca17 100644
--- a/src/video_core/renderer_opengl/gl_buffer_cache.cpp
+++ b/src/video_core/renderer_opengl/gl_buffer_cache.cpp
@@ -8,13 +8,17 @@
#include "common/assert.h"
#include "common/microprofile.h"
+#include "video_core/engines/maxwell_3d.h"
#include "video_core/rasterizer_interface.h"
#include "video_core/renderer_opengl/gl_buffer_cache.h"
+#include "video_core/renderer_opengl/gl_device.h"
#include "video_core/renderer_opengl/gl_rasterizer.h"
#include "video_core/renderer_opengl/gl_resource_manager.h"
namespace OpenGL {
+using Maxwell = Tegra::Engines::Maxwell3D::Regs;
+
MICROPROFILE_DEFINE(OpenGL_Buffer_Download, "OpenGL", "Buffer Download", MP_RGB(192, 192, 128));
CachedBufferBlock::CachedBufferBlock(CacheAddr cache_addr, const std::size_t size)
@@ -26,11 +30,22 @@ CachedBufferBlock::CachedBufferBlock(CacheAddr cache_addr, const std::size_t siz
CachedBufferBlock::~CachedBufferBlock() = default;
OGLBufferCache::OGLBufferCache(RasterizerOpenGL& rasterizer, Core::System& system,
- std::size_t stream_size)
- : VideoCommon::BufferCache<Buffer, GLuint, OGLStreamBuffer>{
- rasterizer, system, std::make_unique<OGLStreamBuffer>(stream_size, true)} {}
+ const Device& device, std::size_t stream_size)
+ : GenericBufferCache{rasterizer, system, std::make_unique<OGLStreamBuffer>(stream_size, true)} {
+ if (!device.HasFastBufferSubData()) {
+ return;
+ }
+
+ static constexpr auto size = static_cast<GLsizeiptr>(Maxwell::MaxConstBufferSize);
+ glCreateBuffers(static_cast<GLsizei>(std::size(cbufs)), std::data(cbufs));
+ for (const GLuint cbuf : cbufs) {
+ glNamedBufferData(cbuf, size, nullptr, GL_STREAM_DRAW);
+ }
+}
-OGLBufferCache::~OGLBufferCache() = default;
+OGLBufferCache::~OGLBufferCache() {
+ glDeleteBuffers(static_cast<GLsizei>(std::size(cbufs)), std::data(cbufs));
+}
Buffer OGLBufferCache::CreateBlock(CacheAddr cache_addr, std::size_t size) {
return std::make_shared<CachedBufferBlock>(cache_addr, size);
@@ -69,4 +84,12 @@ void OGLBufferCache::CopyBlock(const Buffer& src, const Buffer& dst, std::size_t
static_cast<GLsizeiptr>(size));
}
+OGLBufferCache::BufferInfo OGLBufferCache::ConstBufferUpload(const void* raw_pointer,
+ std::size_t size) {
+ DEBUG_ASSERT(cbuf_cursor < std::size(cbufs));
+ const GLuint& cbuf = cbufs[cbuf_cursor++];
+ glNamedBufferSubData(cbuf, 0, static_cast<GLsizeiptr>(size), raw_pointer);
+ return {&cbuf, 0};
+}
+
} // namespace OpenGL