summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2019-05-27 20:11:46 -0300
committerGravatar ReinUsesLisp2019-07-06 00:37:55 -0300
commitf8ba72d4912fb472f97bc8d5b80f3363e6f714cc (patch)
treea871633dc4e3d35a2a4a123540972d0bd7b34e51 /src
parentgl_buffer_cache: Return used buffer from Upload function (diff)
downloadyuzu-f8ba72d4912fb472f97bc8d5b80f3363e6f714cc.tar.gz
yuzu-f8ba72d4912fb472f97bc8d5b80f3363e6f714cc.tar.xz
yuzu-f8ba72d4912fb472f97bc8d5b80f3363e6f714cc.zip
gl_buffer_cache: Store in CachedBufferEntry the used buffer handle
Diffstat (limited to 'src')
-rw-r--r--src/video_core/renderer_opengl/gl_buffer_cache.cpp33
-rw-r--r--src/video_core/renderer_opengl/gl_buffer_cache.h20
2 files changed, 30 insertions, 23 deletions
diff --git a/src/video_core/renderer_opengl/gl_buffer_cache.cpp b/src/video_core/renderer_opengl/gl_buffer_cache.cpp
index ea8b4c99f..b4277ef73 100644
--- a/src/video_core/renderer_opengl/gl_buffer_cache.cpp
+++ b/src/video_core/renderer_opengl/gl_buffer_cache.cpp
@@ -14,10 +14,10 @@
14 14
15namespace OpenGL { 15namespace OpenGL {
16 16
17CachedBufferEntry::CachedBufferEntry(VAddr cpu_addr, std::size_t size, GLintptr offset, 17CachedBufferEntry::CachedBufferEntry(VAddr cpu_addr, u8* host_ptr, std::size_t size,
18 std::size_t alignment, u8* host_ptr) 18 std::size_t alignment, GLuint buffer, GLintptr offset)
19 : RasterizerCacheObject{host_ptr}, cpu_addr{cpu_addr}, size{size}, offset{offset}, 19 : RasterizerCacheObject{host_ptr}, cpu_addr{cpu_addr}, size{size}, alignment{alignment},
20 alignment{alignment} {} 20 buffer{buffer}, offset{offset} {}
21 21
22OGLBufferCache::OGLBufferCache(RasterizerOpenGL& rasterizer, std::size_t size) 22OGLBufferCache::OGLBufferCache(RasterizerOpenGL& rasterizer, std::size_t size)
23 : RasterizerCache{rasterizer}, stream_buffer(size, true) {} 23 : RasterizerCache{rasterizer}, stream_buffer(size, true) {}
@@ -28,16 +28,20 @@ std::pair<GLuint, GLintptr> OGLBufferCache::UploadMemory(GPUVAddr gpu_addr, std:
28 28
29 auto& memory_manager = Core::System::GetInstance().GPU().MemoryManager(); 29 auto& memory_manager = Core::System::GetInstance().GPU().MemoryManager();
30 30
31 const auto& host_ptr{memory_manager.GetPointer(gpu_addr)};
32 if (!host_ptr) {
33 // Return a dummy buffer when host_ptr is invalid.
34 return {0, 0};
35 }
36
31 // Cache management is a big overhead, so only cache entries with a given size. 37 // Cache management is a big overhead, so only cache entries with a given size.
32 // TODO: Figure out which size is the best for given games. 38 // TODO: Figure out which size is the best for given games.
33 cache &= size >= 2048; 39 cache &= size >= 2048;
34 40
35 const auto& host_ptr{memory_manager.GetPointer(gpu_addr)};
36 if (cache) { 41 if (cache) {
37 auto entry = TryGet(host_ptr); 42 if (auto entry = TryGet(host_ptr); entry) {
38 if (entry) {
39 if (entry->GetSize() >= size && entry->GetAlignment() == alignment) { 43 if (entry->GetSize() >= size && entry->GetAlignment() == alignment) {
40 return {stream_buffer.GetHandle(), entry->GetOffset()}; 44 return {entry->GetBuffer(), entry->GetOffset()};
41 } 45 }
42 Unregister(entry); 46 Unregister(entry);
43 } 47 }
@@ -46,21 +50,18 @@ std::pair<GLuint, GLintptr> OGLBufferCache::UploadMemory(GPUVAddr gpu_addr, std:
46 AlignBuffer(alignment); 50 AlignBuffer(alignment);
47 const GLintptr uploaded_offset = buffer_offset; 51 const GLintptr uploaded_offset = buffer_offset;
48 52
49 if (!host_ptr) {
50 return {stream_buffer.GetHandle(), uploaded_offset};
51 }
52
53 std::memcpy(buffer_ptr, host_ptr, size); 53 std::memcpy(buffer_ptr, host_ptr, size);
54 buffer_ptr += size; 54 buffer_ptr += size;
55 buffer_offset += size; 55 buffer_offset += size;
56 56
57 const GLuint buffer = stream_buffer.GetHandle();
57 if (cache) { 58 if (cache) {
58 auto entry = std::make_shared<CachedBufferEntry>( 59 const VAddr cpu_addr = *memory_manager.GpuToCpuAddress(gpu_addr);
59 *memory_manager.GpuToCpuAddress(gpu_addr), size, uploaded_offset, alignment, host_ptr); 60 Register(std::make_shared<CachedBufferEntry>(cpu_addr, host_ptr, size, alignment, buffer,
60 Register(entry); 61 uploaded_offset));
61 } 62 }
62 63
63 return {stream_buffer.GetHandle(), uploaded_offset}; 64 return {buffer, uploaded_offset};
64} 65}
65 66
66std::pair<GLuint, GLintptr> OGLBufferCache::UploadHostMemory(const void* raw_pointer, 67std::pair<GLuint, GLintptr> OGLBufferCache::UploadHostMemory(const void* raw_pointer,
diff --git a/src/video_core/renderer_opengl/gl_buffer_cache.h b/src/video_core/renderer_opengl/gl_buffer_cache.h
index 544f3b010..4a055035a 100644
--- a/src/video_core/renderer_opengl/gl_buffer_cache.h
+++ b/src/video_core/renderer_opengl/gl_buffer_cache.h
@@ -20,8 +20,8 @@ class RasterizerOpenGL;
20 20
21class CachedBufferEntry final : public RasterizerCacheObject { 21class CachedBufferEntry final : public RasterizerCacheObject {
22public: 22public:
23 explicit CachedBufferEntry(VAddr cpu_addr, std::size_t size, GLintptr offset, 23 explicit CachedBufferEntry(VAddr cpu_addr, u8* host_ptr, std::size_t size,
24 std::size_t alignment, u8* host_ptr); 24 std::size_t alignment, GLuint buffer, GLintptr offset);
25 25
26 VAddr GetCpuAddr() const override { 26 VAddr GetCpuAddr() const override {
27 return cpu_addr; 27 return cpu_addr;
@@ -35,19 +35,25 @@ public:
35 return size; 35 return size;
36 } 36 }
37 37
38 GLintptr GetOffset() const {
39 return offset;
40 }
41
42 std::size_t GetAlignment() const { 38 std::size_t GetAlignment() const {
43 return alignment; 39 return alignment;
44 } 40 }
45 41
42 GLuint GetBuffer() const {
43 return buffer;
44 }
45
46 GLintptr GetOffset() const {
47 return offset;
48 }
49
46private: 50private:
47 VAddr cpu_addr{}; 51 VAddr cpu_addr{};
48 std::size_t size{}; 52 std::size_t size{};
49 GLintptr offset{};
50 std::size_t alignment{}; 53 std::size_t alignment{};
54
55 GLuint buffer{};
56 GLintptr offset{};
51}; 57};
52 58
53class OGLBufferCache final : public RasterizerCache<std::shared_ptr<CachedBufferEntry>> { 59class OGLBufferCache final : public RasterizerCache<std::shared_ptr<CachedBufferEntry>> {