2018-08-29 00:27:03 +02:00
|
|
|
// Copyright 2018 yuzu Emulator Project
|
|
|
|
// Licensed under GPLv2 or any later version
|
|
|
|
// Refer to the license.txt file included.
|
|
|
|
|
2018-09-06 20:57:40 +02:00
|
|
|
#include <memory>
|
|
|
|
|
2019-06-20 08:22:25 +02:00
|
|
|
#include <glad/glad.h>
|
|
|
|
|
2019-05-28 01:50:11 +02:00
|
|
|
#include "common/assert.h"
|
2018-08-29 00:27:03 +02:00
|
|
|
#include "video_core/renderer_opengl/gl_buffer_cache.h"
|
2018-11-08 12:08:00 +01:00
|
|
|
#include "video_core/renderer_opengl/gl_rasterizer.h"
|
2019-05-28 01:50:11 +02:00
|
|
|
#include "video_core/renderer_opengl/gl_resource_manager.h"
|
2018-08-29 00:27:03 +02:00
|
|
|
|
|
|
|
namespace OpenGL {
|
|
|
|
|
2019-06-20 08:22:25 +02:00
|
|
|
OGLBufferCache::OGLBufferCache(RasterizerOpenGL& rasterizer, Core::System& system,
|
|
|
|
std::size_t stream_size)
|
|
|
|
: VideoCommon::BufferCache<OGLBuffer, GLuint, OGLStreamBuffer>{
|
|
|
|
rasterizer, system, std::make_unique<OGLStreamBuffer>(stream_size, true)} {}
|
2019-05-28 01:50:11 +02:00
|
|
|
|
2019-06-20 08:22:25 +02:00
|
|
|
OGLBufferCache::~OGLBufferCache() = default;
|
2019-05-28 01:50:11 +02:00
|
|
|
|
2019-06-20 08:22:25 +02:00
|
|
|
OGLBuffer OGLBufferCache::CreateBuffer(std::size_t size) {
|
2019-05-28 01:50:11 +02:00
|
|
|
OGLBuffer buffer;
|
|
|
|
buffer.Create();
|
2019-06-20 08:22:25 +02:00
|
|
|
glNamedBufferData(buffer.handle, static_cast<GLsizeiptr>(size), nullptr, GL_DYNAMIC_DRAW);
|
2019-05-28 01:50:11 +02:00
|
|
|
return buffer;
|
|
|
|
}
|
|
|
|
|
2019-06-20 08:22:25 +02:00
|
|
|
const GLuint* OGLBufferCache::ToHandle(const OGLBuffer& buffer) {
|
|
|
|
return &buffer.handle;
|
2018-08-29 00:27:03 +02:00
|
|
|
}
|
2018-10-02 19:47:26 +02:00
|
|
|
|
2019-06-20 08:22:25 +02:00
|
|
|
const GLuint* OGLBufferCache::GetEmptyBuffer(std::size_t) {
|
|
|
|
static const GLuint null_buffer = 0;
|
|
|
|
return &null_buffer;
|
2019-05-28 01:50:11 +02:00
|
|
|
}
|
|
|
|
|
2019-06-20 08:22:25 +02:00
|
|
|
void OGLBufferCache::UploadBufferData(const OGLBuffer& buffer, std::size_t offset, std::size_t size,
|
|
|
|
const u8* data) {
|
|
|
|
glNamedBufferSubData(buffer.handle, static_cast<GLintptr>(offset),
|
|
|
|
static_cast<GLsizeiptr>(size), data);
|
2019-05-28 01:50:11 +02:00
|
|
|
}
|
|
|
|
|
2019-06-20 08:22:25 +02:00
|
|
|
void OGLBufferCache::DownloadBufferData(const OGLBuffer& buffer, std::size_t offset,
|
|
|
|
std::size_t size, u8* data) {
|
|
|
|
glGetNamedBufferSubData(buffer.handle, static_cast<GLintptr>(offset),
|
|
|
|
static_cast<GLsizeiptr>(size), data);
|
2018-08-29 00:27:03 +02:00
|
|
|
}
|
|
|
|
|
2019-06-20 08:22:25 +02:00
|
|
|
void OGLBufferCache::CopyBufferData(const OGLBuffer& src, const OGLBuffer& dst,
|
|
|
|
std::size_t src_offset, std::size_t dst_offset,
|
|
|
|
std::size_t size) {
|
|
|
|
glCopyNamedBufferSubData(src.handle, dst.handle, static_cast<GLintptr>(src_offset),
|
|
|
|
static_cast<GLintptr>(dst_offset), static_cast<GLsizeiptr>(size));
|
2018-08-29 00:27:03 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
} // namespace OpenGL
|