diff options
author | ReinUsesLisp <reinuseslisp@airmail.cc> | 2019-05-11 08:15:49 +0200 |
---|---|---|
committer | ReinUsesLisp <reinuseslisp@airmail.cc> | 2019-06-21 02:36:12 +0200 |
commit | 9098905dd13bb68f2fe49a9590688b76cc999fdd (patch) | |
tree | 496c5711a40b37341765aedba0aebb458748beea /src/video_core/renderer_opengl/gl_framebuffer_cache.h | |
parent | texture_cache return invalid buffer on deactivated color_mask (diff) | |
download | yuzu-9098905dd13bb68f2fe49a9590688b76cc999fdd.tar yuzu-9098905dd13bb68f2fe49a9590688b76cc999fdd.tar.gz yuzu-9098905dd13bb68f2fe49a9590688b76cc999fdd.tar.bz2 yuzu-9098905dd13bb68f2fe49a9590688b76cc999fdd.tar.lz yuzu-9098905dd13bb68f2fe49a9590688b76cc999fdd.tar.xz yuzu-9098905dd13bb68f2fe49a9590688b76cc999fdd.tar.zst yuzu-9098905dd13bb68f2fe49a9590688b76cc999fdd.zip |
Diffstat (limited to '')
-rw-r--r-- | src/video_core/renderer_opengl/gl_framebuffer_cache.h | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/src/video_core/renderer_opengl/gl_framebuffer_cache.h b/src/video_core/renderer_opengl/gl_framebuffer_cache.h new file mode 100644 index 000000000..a3a996353 --- /dev/null +++ b/src/video_core/renderer_opengl/gl_framebuffer_cache.h @@ -0,0 +1,68 @@ +// Copyright 2019 yuzu Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include <array> +#include <cstddef> +#include <unordered_map> + +#include <glad/glad.h> + +#include "common/common_types.h" +#include "video_core/engines/maxwell_3d.h" +#include "video_core/renderer_opengl/gl_resource_manager.h" +#include "video_core/renderer_opengl/gl_state.h" +#include "video_core/renderer_opengl/gl_texture_cache.h" + +namespace OpenGL { + +struct alignas(sizeof(u64)) FramebufferCacheKey { + bool is_single_buffer = false; + bool stencil_enable = false; + u16 colors_count = 0; + + std::array<GLenum, Tegra::Engines::Maxwell3D::Regs::NumRenderTargets> color_attachments{}; + std::array<View, Tegra::Engines::Maxwell3D::Regs::NumRenderTargets> colors; + View zeta; + + std::size_t Hash() const; + + bool operator==(const FramebufferCacheKey& rhs) const; + + bool operator!=(const FramebufferCacheKey& rhs) const { + return !operator==(rhs); + } +}; + +} // namespace OpenGL + +namespace std { + +template <> +struct hash<OpenGL::FramebufferCacheKey> { + std::size_t operator()(const OpenGL::FramebufferCacheKey& k) const noexcept { + return k.Hash(); + } +}; + +} // namespace std + +namespace OpenGL { + +class FramebufferCacheOpenGL { +public: + FramebufferCacheOpenGL(); + ~FramebufferCacheOpenGL(); + + GLuint GetFramebuffer(const FramebufferCacheKey& key); + +private: + OGLFramebuffer CreateFramebuffer(const FramebufferCacheKey& key); + + OpenGLState local_state; + std::unordered_map<FramebufferCacheKey, OGLFramebuffer> cache; +}; + +} // namespace OpenGL |