diff options
Diffstat (limited to 'src/video_core')
| -rw-r--r-- | src/video_core/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 94 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.h | 32 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_sampler_cache.cpp | 52 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_sampler_cache.h | 25 | 
5 files changed, 82 insertions, 123 deletions
| diff --git a/src/video_core/CMakeLists.txt b/src/video_core/CMakeLists.txt index 1a0cc6df1..6950e9d09 100644 --- a/src/video_core/CMakeLists.txt +++ b/src/video_core/CMakeLists.txt @@ -46,6 +46,8 @@ add_library(video_core STATIC      renderer_opengl/gl_rasterizer_cache.h      renderer_opengl/gl_resource_manager.cpp      renderer_opengl/gl_resource_manager.h +    renderer_opengl/gl_sampler_cache.cpp +    renderer_opengl/gl_sampler_cache.h      renderer_opengl/gl_shader_cache.cpp      renderer_opengl/gl_shader_cache.h      renderer_opengl/gl_shader_decompiler.cpp diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index 046fc935b..40b9f4809 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp @@ -103,12 +103,6 @@ struct FramebufferCacheKey {  RasterizerOpenGL::RasterizerOpenGL(Core::System& system, ScreenInfo& info)      : res_cache{*this}, shader_cache{*this, system}, global_cache{*this}, system{system},        screen_info{info}, buffer_cache(*this, STREAM_BUFFER_SIZE) { -    // Create sampler objects -    for (std::size_t i = 0; i < texture_samplers.size(); ++i) { -        texture_samplers[i].Create(); -        state.texture_units[i].sampler = texture_samplers[i].sampler.handle; -    } -      OpenGLState::ApplyDefaultState();      shader_program_manager = std::make_unique<GLShader::ProgramManager>(); @@ -807,92 +801,6 @@ bool RasterizerOpenGL::AccelerateDisplay(const Tegra::FramebufferConfig& config,      return true;  } -void RasterizerOpenGL::SamplerInfo::Create() { -    sampler.Create(); -    mag_filter = Tegra::Texture::TextureFilter::Linear; -    min_filter = Tegra::Texture::TextureFilter::Linear; -    wrap_u = Tegra::Texture::WrapMode::Wrap; -    wrap_v = Tegra::Texture::WrapMode::Wrap; -    wrap_p = Tegra::Texture::WrapMode::Wrap; -    use_depth_compare = false; -    depth_compare_func = Tegra::Texture::DepthCompareFunc::Never; - -    // OpenGL's default is GL_LINEAR_MIPMAP_LINEAR -    glSamplerParameteri(sampler.handle, GL_TEXTURE_MIN_FILTER, GL_LINEAR); -    glSamplerParameteri(sampler.handle, GL_TEXTURE_COMPARE_FUNC, GL_NEVER); - -    // Other attributes have correct defaults -} - -void RasterizerOpenGL::SamplerInfo::SyncWithConfig(const Tegra::Texture::TSCEntry& config) { -    const GLuint sampler_id = sampler.handle; -    if (mag_filter != config.mag_filter) { -        mag_filter = config.mag_filter; -        glSamplerParameteri( -            sampler_id, GL_TEXTURE_MAG_FILTER, -            MaxwellToGL::TextureFilterMode(mag_filter, Tegra::Texture::TextureMipmapFilter::None)); -    } -    if (min_filter != config.min_filter || mipmap_filter != config.mipmap_filter) { -        min_filter = config.min_filter; -        mipmap_filter = config.mipmap_filter; -        glSamplerParameteri(sampler_id, GL_TEXTURE_MIN_FILTER, -                            MaxwellToGL::TextureFilterMode(min_filter, mipmap_filter)); -    } - -    if (wrap_u != config.wrap_u) { -        wrap_u = config.wrap_u; -        glSamplerParameteri(sampler_id, GL_TEXTURE_WRAP_S, MaxwellToGL::WrapMode(wrap_u)); -    } -    if (wrap_v != config.wrap_v) { -        wrap_v = config.wrap_v; -        glSamplerParameteri(sampler_id, GL_TEXTURE_WRAP_T, MaxwellToGL::WrapMode(wrap_v)); -    } -    if (wrap_p != config.wrap_p) { -        wrap_p = config.wrap_p; -        glSamplerParameteri(sampler_id, GL_TEXTURE_WRAP_R, MaxwellToGL::WrapMode(wrap_p)); -    } - -    if (const bool enabled = config.depth_compare_enabled == 1; use_depth_compare != enabled) { -        use_depth_compare = enabled; -        glSamplerParameteri(sampler_id, GL_TEXTURE_COMPARE_MODE, -                            use_depth_compare ? GL_COMPARE_REF_TO_TEXTURE : GL_NONE); -    } - -    if (depth_compare_func != config.depth_compare_func) { -        depth_compare_func = config.depth_compare_func; -        glSamplerParameteri(sampler_id, GL_TEXTURE_COMPARE_FUNC, -                            MaxwellToGL::DepthCompareFunc(depth_compare_func)); -    } - -    if (const auto new_border_color = config.GetBorderColor(); border_color != new_border_color) { -        border_color = new_border_color; -        glSamplerParameterfv(sampler_id, GL_TEXTURE_BORDER_COLOR, border_color.data()); -    } - -    if (const float anisotropic = config.GetMaxAnisotropy(); max_anisotropic != anisotropic) { -        max_anisotropic = anisotropic; -        if (GLAD_GL_ARB_texture_filter_anisotropic) { -            glSamplerParameterf(sampler_id, GL_TEXTURE_MAX_ANISOTROPY, max_anisotropic); -        } else if (GLAD_GL_EXT_texture_filter_anisotropic) { -            glSamplerParameterf(sampler_id, GL_TEXTURE_MAX_ANISOTROPY_EXT, max_anisotropic); -        } -    } - -    if (const float min = config.GetMinLod(); min_lod != min) { -        min_lod = min; -        glSamplerParameterf(sampler_id, GL_TEXTURE_MIN_LOD, min_lod); -    } -    if (const float max = config.GetMaxLod(); max_lod != max) { -        max_lod = max; -        glSamplerParameterf(sampler_id, GL_TEXTURE_MAX_LOD, max_lod); -    } - -    if (const float bias = config.GetLodBias(); lod_bias != bias) { -        lod_bias = bias; -        glSamplerParameterf(sampler_id, GL_TEXTURE_LOD_BIAS, lod_bias); -    } -} -  void RasterizerOpenGL::SetupConstBuffers(Tegra::Engines::Maxwell3D::Regs::ShaderStage stage,                                           const Shader& shader, GLuint program_handle,                                           BaseBindings base_bindings) { @@ -988,7 +896,7 @@ void RasterizerOpenGL::SetupTextures(Maxwell::ShaderStage stage, const Shader& s          const auto texture = maxwell3d.GetStageTexture(stage, entry.GetOffset());          const u32 current_bindpoint = base_bindings.sampler + bindpoint; -        texture_samplers[current_bindpoint].SyncWithConfig(texture.tsc); +        state.texture_units[current_bindpoint].sampler = sampler_cache.GetSampler(texture.tsc);          if (Surface surface = res_cache.GetTextureSurface(texture, entry); surface) {              state.texture_units[current_bindpoint].texture = diff --git a/src/video_core/renderer_opengl/gl_rasterizer.h b/src/video_core/renderer_opengl/gl_rasterizer.h index 4de565321..faeeb58ef 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.h +++ b/src/video_core/renderer_opengl/gl_rasterizer.h @@ -28,6 +28,7 @@  #include "video_core/renderer_opengl/gl_primitive_assembler.h"  #include "video_core/renderer_opengl/gl_rasterizer_cache.h"  #include "video_core/renderer_opengl/gl_resource_manager.h" +#include "video_core/renderer_opengl/gl_sampler_cache.h"  #include "video_core/renderer_opengl/gl_shader_cache.h"  #include "video_core/renderer_opengl/gl_shader_gen.h"  #include "video_core/renderer_opengl/gl_shader_manager.h" @@ -80,34 +81,6 @@ public:                    "The maximum size of a global memory must be a multiple of the size of float");  private: -    class SamplerInfo { -    public: -        OGLSampler sampler; - -        /// Creates the sampler object, initializing its state so that it's in sync with the -        /// SamplerInfo struct. -        void Create(); -        /// Syncs the sampler object with the config, updating any necessary state. -        void SyncWithConfig(const Tegra::Texture::TSCEntry& info); - -    private: -        Tegra::Texture::TextureFilter mag_filter = Tegra::Texture::TextureFilter::Nearest; -        Tegra::Texture::TextureFilter min_filter = Tegra::Texture::TextureFilter::Nearest; -        Tegra::Texture::TextureMipmapFilter mipmap_filter = -            Tegra::Texture::TextureMipmapFilter::None; -        Tegra::Texture::WrapMode wrap_u = Tegra::Texture::WrapMode::ClampToEdge; -        Tegra::Texture::WrapMode wrap_v = Tegra::Texture::WrapMode::ClampToEdge; -        Tegra::Texture::WrapMode wrap_p = Tegra::Texture::WrapMode::ClampToEdge; -        bool use_depth_compare = false; -        Tegra::Texture::DepthCompareFunc depth_compare_func = -            Tegra::Texture::DepthCompareFunc::Always; -        GLvec4 border_color = {}; -        float min_lod = 0.0f; -        float max_lod = 16.0f; -        float lod_bias = 0.0f; -        float max_anisotropic = 1.0f; -    }; -      struct FramebufferConfigState {          bool using_color_fb{};          bool using_depth_fb{}; @@ -212,6 +185,7 @@ private:      RasterizerCacheOpenGL res_cache;      ShaderCacheOpenGL shader_cache;      GlobalRegionCacheOpenGL global_cache; +    SamplerCacheOpenGL sampler_cache;      Core::System& system; @@ -227,8 +201,6 @@ private:      FramebufferConfigState current_framebuffer_config_state;      std::pair<bool, bool> current_depth_stencil_usage{}; -    std::array<SamplerInfo, Tegra::Engines::Maxwell3D::Regs::NumTextureSamplers> texture_samplers; -      static constexpr std::size_t STREAM_BUFFER_SIZE = 128 * 1024 * 1024;      OGLBufferCache buffer_cache;      PrimitiveAssembler primitive_assembler{buffer_cache}; diff --git a/src/video_core/renderer_opengl/gl_sampler_cache.cpp b/src/video_core/renderer_opengl/gl_sampler_cache.cpp new file mode 100644 index 000000000..3ded5ecea --- /dev/null +++ b/src/video_core/renderer_opengl/gl_sampler_cache.cpp @@ -0,0 +1,52 @@ +// Copyright 2019 yuzu Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include "common/logging/log.h" +#include "video_core/renderer_opengl/gl_resource_manager.h" +#include "video_core/renderer_opengl/gl_sampler_cache.h" +#include "video_core/renderer_opengl/maxwell_to_gl.h" + +namespace OpenGL { + +SamplerCacheOpenGL::SamplerCacheOpenGL() = default; + +SamplerCacheOpenGL::~SamplerCacheOpenGL() = default; + +OGLSampler SamplerCacheOpenGL::CreateSampler(const Tegra::Texture::TSCEntry& tsc) const { +    OGLSampler sampler; +    sampler.Create(); + +    const GLuint sampler_id{sampler.handle}; +    glSamplerParameteri( +        sampler_id, GL_TEXTURE_MAG_FILTER, +        MaxwellToGL::TextureFilterMode(tsc.mag_filter, Tegra::Texture::TextureMipmapFilter::None)); +    glSamplerParameteri(sampler_id, GL_TEXTURE_MIN_FILTER, +                        MaxwellToGL::TextureFilterMode(tsc.min_filter, tsc.mipmap_filter)); +    glSamplerParameteri(sampler_id, GL_TEXTURE_WRAP_S, MaxwellToGL::WrapMode(tsc.wrap_u)); +    glSamplerParameteri(sampler_id, GL_TEXTURE_WRAP_T, MaxwellToGL::WrapMode(tsc.wrap_v)); +    glSamplerParameteri(sampler_id, GL_TEXTURE_WRAP_R, MaxwellToGL::WrapMode(tsc.wrap_p)); +    glSamplerParameteri(sampler_id, GL_TEXTURE_COMPARE_MODE, +                        tsc.depth_compare_enabled == 1 ? GL_COMPARE_REF_TO_TEXTURE : GL_NONE); +    glSamplerParameteri(sampler_id, GL_TEXTURE_COMPARE_FUNC, +                        MaxwellToGL::DepthCompareFunc(tsc.depth_compare_func)); +    glSamplerParameterfv(sampler_id, GL_TEXTURE_BORDER_COLOR, tsc.GetBorderColor().data()); +    glSamplerParameterf(sampler_id, GL_TEXTURE_MIN_LOD, tsc.GetMinLod()); +    glSamplerParameterf(sampler_id, GL_TEXTURE_MAX_LOD, tsc.GetMaxLod()); +    glSamplerParameterf(sampler_id, GL_TEXTURE_LOD_BIAS, tsc.GetLodBias()); +    if (GLAD_GL_ARB_texture_filter_anisotropic) { +        glSamplerParameterf(sampler_id, GL_TEXTURE_MAX_ANISOTROPY, tsc.GetMaxAnisotropy()); +    } else if (GLAD_GL_EXT_texture_filter_anisotropic) { +        glSamplerParameterf(sampler_id, GL_TEXTURE_MAX_ANISOTROPY_EXT, tsc.GetMaxAnisotropy()); +    } else if (tsc.GetMaxAnisotropy() != 1) { +        LOG_WARNING(Render_OpenGL, "Anisotropy not supported by host GPU driver"); +    } + +    return sampler; +} + +GLuint SamplerCacheOpenGL::ToSamplerType(const OGLSampler& sampler) const { +    return sampler.handle; +} + +} // namespace OpenGL diff --git a/src/video_core/renderer_opengl/gl_sampler_cache.h b/src/video_core/renderer_opengl/gl_sampler_cache.h new file mode 100644 index 000000000..defbc2d81 --- /dev/null +++ b/src/video_core/renderer_opengl/gl_sampler_cache.h @@ -0,0 +1,25 @@ +// Copyright 2019 yuzu Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include <glad/glad.h> + +#include "video_core/renderer_opengl/gl_resource_manager.h" +#include "video_core/sampler_cache.h" + +namespace OpenGL { + +class SamplerCacheOpenGL final : public VideoCommon::SamplerCache<GLuint, OGLSampler> { +public: +    explicit SamplerCacheOpenGL(); +    ~SamplerCacheOpenGL(); + +protected: +    OGLSampler CreateSampler(const Tegra::Texture::TSCEntry& tsc) const; + +    GLuint ToSamplerType(const OGLSampler& sampler) const; +}; + +} // namespace OpenGL | 
