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.
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
2019-11-02 08:08:31 +01:00
|
|
|
#include <array>
|
2018-08-29 00:27:03 +02:00
|
|
|
#include <memory>
|
|
|
|
|
|
|
|
#include "common/common_types.h"
|
2019-07-19 16:50:40 +02:00
|
|
|
#include "video_core/buffer_cache/buffer_cache.h"
|
2019-11-02 08:08:31 +01:00
|
|
|
#include "video_core/engines/maxwell_3d.h"
|
2018-08-29 00:27:03 +02:00
|
|
|
#include "video_core/renderer_opengl/gl_resource_manager.h"
|
|
|
|
#include "video_core/renderer_opengl/gl_stream_buffer.h"
|
|
|
|
|
2019-06-15 00:58:16 +02:00
|
|
|
namespace Core {
|
|
|
|
class System;
|
|
|
|
}
|
|
|
|
|
2018-08-29 00:27:03 +02:00
|
|
|
namespace OpenGL {
|
|
|
|
|
2019-11-02 08:08:31 +01:00
|
|
|
class Device;
|
2019-06-20 08:22:25 +02:00
|
|
|
class OGLStreamBuffer;
|
2018-11-08 12:08:00 +01:00
|
|
|
class RasterizerOpenGL;
|
|
|
|
|
2020-06-09 23:27:59 +02:00
|
|
|
class Buffer : public VideoCommon::BufferBlock {
|
2019-07-19 16:50:40 +02:00
|
|
|
public:
|
2020-05-11 21:35:04 +02:00
|
|
|
explicit Buffer(const Device& device, VAddr cpu_addr, std::size_t size);
|
2020-06-09 23:27:59 +02:00
|
|
|
~Buffer();
|
2019-07-19 16:50:40 +02:00
|
|
|
|
2020-05-11 21:35:04 +02:00
|
|
|
GLuint Handle() const noexcept {
|
2020-04-04 07:54:55 +02:00
|
|
|
return gl_buffer.handle;
|
2019-07-19 16:50:40 +02:00
|
|
|
}
|
|
|
|
|
2020-05-11 21:35:04 +02:00
|
|
|
u64 Address() const noexcept {
|
|
|
|
return gpu_address;
|
|
|
|
}
|
|
|
|
|
2019-07-19 16:50:40 +02:00
|
|
|
private:
|
2020-04-04 07:54:55 +02:00
|
|
|
OGLBuffer gl_buffer;
|
2020-05-11 21:35:04 +02:00
|
|
|
u64 gpu_address = 0;
|
2019-07-19 16:50:40 +02:00
|
|
|
};
|
|
|
|
|
2020-06-09 23:27:59 +02:00
|
|
|
using GenericBufferCache = VideoCommon::BufferCache<Buffer, GLuint, OGLStreamBuffer>;
|
2019-11-02 08:08:31 +01:00
|
|
|
class OGLBufferCache final : public GenericBufferCache {
|
2019-02-19 02:58:32 +01:00
|
|
|
public:
|
2019-06-20 08:22:25 +02:00
|
|
|
explicit OGLBufferCache(RasterizerOpenGL& rasterizer, Core::System& system,
|
2019-11-02 08:08:31 +01:00
|
|
|
const Device& device, std::size_t stream_size);
|
2019-05-28 01:50:11 +02:00
|
|
|
~OGLBufferCache();
|
|
|
|
|
2020-05-11 21:35:04 +02:00
|
|
|
BufferInfo GetEmptyBuffer(std::size_t) override;
|
2019-07-06 04:49:45 +02:00
|
|
|
|
2019-11-02 08:08:31 +01:00
|
|
|
void Acquire() noexcept {
|
|
|
|
cbuf_cursor = 0;
|
|
|
|
}
|
|
|
|
|
2018-08-29 00:27:03 +02:00
|
|
|
protected:
|
2020-06-09 23:27:59 +02:00
|
|
|
std::shared_ptr<Buffer> CreateBlock(VAddr cpu_addr, std::size_t size) override;
|
2019-05-28 01:50:11 +02:00
|
|
|
|
2019-07-19 16:50:40 +02:00
|
|
|
void UploadBlockData(const Buffer& buffer, std::size_t offset, std::size_t size,
|
2019-08-10 18:50:38 +02:00
|
|
|
const u8* data) override;
|
2019-06-15 00:58:16 +02:00
|
|
|
|
2019-07-19 16:50:40 +02:00
|
|
|
void DownloadBlockData(const Buffer& buffer, std::size_t offset, std::size_t size,
|
2019-08-10 18:50:38 +02:00
|
|
|
u8* data) override;
|
2019-05-28 01:50:11 +02:00
|
|
|
|
2019-07-19 16:50:40 +02:00
|
|
|
void CopyBlock(const Buffer& src, const Buffer& dst, std::size_t src_offset,
|
2019-08-10 18:50:38 +02:00
|
|
|
std::size_t dst_offset, std::size_t size) override;
|
2019-11-02 08:08:31 +01:00
|
|
|
|
|
|
|
BufferInfo ConstBufferUpload(const void* raw_pointer, std::size_t size) override;
|
|
|
|
|
|
|
|
private:
|
2020-05-11 21:35:04 +02:00
|
|
|
static constexpr std::size_t NUM_CBUFS = Tegra::Engines::Maxwell3D::Regs::MaxConstBuffers *
|
|
|
|
Tegra::Engines::Maxwell3D::Regs::MaxShaderProgram;
|
|
|
|
|
|
|
|
const Device& device;
|
|
|
|
|
2019-11-02 08:08:31 +01:00
|
|
|
std::size_t cbuf_cursor = 0;
|
2020-05-11 21:35:04 +02:00
|
|
|
std::array<GLuint, NUM_CBUFS> cbufs{};
|
2018-08-29 00:27:03 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace OpenGL
|