diff options
| author | 2018-10-24 19:25:28 -0400 | |
|---|---|---|
| committer | 2018-10-28 19:00:01 -0400 | |
| commit | 258f0f5c31decbb25eddde798b3a4bcc6a7cc6dd (patch) | |
| tree | 8c805cb136b2d938f24e5aaaa2e7a3f723f4ccb1 /src | |
| parent | Zero out memory region of recreated surface before flushing (diff) | |
| download | yuzu-258f0f5c31decbb25eddde798b3a4bcc6a7cc6dd.tar.gz yuzu-258f0f5c31decbb25eddde798b3a4bcc6a7cc6dd.tar.xz yuzu-258f0f5c31decbb25eddde798b3a4bcc6a7cc6dd.zip | |
Implement Mip Filter
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 10 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.h | 1 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer_cache.h | 4 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/maxwell_to_gl.h | 28 |
4 files changed, 33 insertions, 10 deletions
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index cb180b93c..7bb5544fc 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp | |||
| @@ -731,11 +731,15 @@ void RasterizerOpenGL::SamplerInfo::SyncWithConfig(const Tegra::Texture::TSCEntr | |||
| 731 | 731 | ||
| 732 | if (mag_filter != config.mag_filter) { | 732 | if (mag_filter != config.mag_filter) { |
| 733 | mag_filter = config.mag_filter; | 733 | mag_filter = config.mag_filter; |
| 734 | glSamplerParameteri(s, GL_TEXTURE_MAG_FILTER, MaxwellToGL::TextureFilterMode(mag_filter)); | 734 | glSamplerParameteri( |
| 735 | s, GL_TEXTURE_MAG_FILTER, | ||
| 736 | MaxwellToGL::TextureFilterMode(mag_filter, Tegra::Texture::TextureMipmapFilter::None)); | ||
| 735 | } | 737 | } |
| 736 | if (min_filter != config.min_filter) { | 738 | if (min_filter != config.min_filter || mip_filter != config.mip_filter) { |
| 737 | min_filter = config.min_filter; | 739 | min_filter = config.min_filter; |
| 738 | glSamplerParameteri(s, GL_TEXTURE_MIN_FILTER, MaxwellToGL::TextureFilterMode(min_filter)); | 740 | mip_filter = config.mip_filter; |
| 741 | glSamplerParameteri(s, GL_TEXTURE_MIN_FILTER, | ||
| 742 | MaxwellToGL::TextureFilterMode(min_filter, mip_filter)); | ||
| 739 | } | 743 | } |
| 740 | 744 | ||
| 741 | if (wrap_u != config.wrap_u) { | 745 | if (wrap_u != config.wrap_u) { |
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.h b/src/video_core/renderer_opengl/gl_rasterizer.h index 5020a5392..7b0615125 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.h +++ b/src/video_core/renderer_opengl/gl_rasterizer.h | |||
| @@ -93,6 +93,7 @@ private: | |||
| 93 | private: | 93 | private: |
| 94 | Tegra::Texture::TextureFilter mag_filter; | 94 | Tegra::Texture::TextureFilter mag_filter; |
| 95 | Tegra::Texture::TextureFilter min_filter; | 95 | Tegra::Texture::TextureFilter min_filter; |
| 96 | Tegra::Texture::TextureMipmapFilter mip_filter; | ||
| 96 | Tegra::Texture::WrapMode wrap_u; | 97 | Tegra::Texture::WrapMode wrap_u; |
| 97 | Tegra::Texture::WrapMode wrap_v; | 98 | Tegra::Texture::WrapMode wrap_v; |
| 98 | Tegra::Texture::WrapMode wrap_p; | 99 | Tegra::Texture::WrapMode wrap_p; |
diff --git a/src/video_core/renderer_opengl/gl_rasterizer_cache.h b/src/video_core/renderer_opengl/gl_rasterizer_cache.h index 5bcd33156..68479d55a 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer_cache.h +++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.h | |||
| @@ -919,7 +919,7 @@ struct SurfaceParams { | |||
| 919 | u32 height = MipHeight(mip_level); | 919 | u32 height = MipHeight(mip_level); |
| 920 | u32 bh = block_height; | 920 | u32 bh = block_height; |
| 921 | // Magical block resizing algorithm, needs more testing. | 921 | // Magical block resizing algorithm, needs more testing. |
| 922 | while (bh != 1 && height / bh <= 16) { | 922 | while (bh > 1 && (height + bh - 1) / bh <= 16) { |
| 923 | bh = bh >> 1; | 923 | bh = bh >> 1; |
| 924 | } | 924 | } |
| 925 | return bh; | 925 | return bh; |
| @@ -929,7 +929,7 @@ struct SurfaceParams { | |||
| 929 | u32 depth = MipDepth(mip_level); | 929 | u32 depth = MipDepth(mip_level); |
| 930 | u32 bd = block_depth; | 930 | u32 bd = block_depth; |
| 931 | // Magical block resizing algorithm, needs more testing. | 931 | // Magical block resizing algorithm, needs more testing. |
| 932 | while (bd != 1 && depth / bd <= 16) { | 932 | while (bd > 1 && depth / bd <= 16) { |
| 933 | bd = bd >> 1; | 933 | bd = bd >> 1; |
| 934 | } | 934 | } |
| 935 | return bd; | 935 | return bd; |
diff --git a/src/video_core/renderer_opengl/maxwell_to_gl.h b/src/video_core/renderer_opengl/maxwell_to_gl.h index 0f6dcab2b..76c3b65bd 100644 --- a/src/video_core/renderer_opengl/maxwell_to_gl.h +++ b/src/video_core/renderer_opengl/maxwell_to_gl.h | |||
| @@ -135,12 +135,29 @@ inline GLenum PrimitiveTopology(Maxwell::PrimitiveTopology topology) { | |||
| 135 | return {}; | 135 | return {}; |
| 136 | } | 136 | } |
| 137 | 137 | ||
| 138 | inline GLenum TextureFilterMode(Tegra::Texture::TextureFilter filter_mode) { | 138 | inline GLenum TextureFilterMode(Tegra::Texture::TextureFilter filter_mode, |
| 139 | Tegra::Texture::TextureMipmapFilter mip_filter_mode) { | ||
| 139 | switch (filter_mode) { | 140 | switch (filter_mode) { |
| 140 | case Tegra::Texture::TextureFilter::Linear: | 141 | case Tegra::Texture::TextureFilter::Linear: { |
| 141 | return GL_LINEAR; | 142 | switch (mip_filter_mode) { |
| 142 | case Tegra::Texture::TextureFilter::Nearest: | 143 | case Tegra::Texture::TextureMipmapFilter::None: |
| 143 | return GL_NEAREST; | 144 | return GL_LINEAR; |
| 145 | case Tegra::Texture::TextureMipmapFilter::Nearest: | ||
| 146 | return GL_NEAREST_MIPMAP_LINEAR; | ||
| 147 | case Tegra::Texture::TextureMipmapFilter::Linear: | ||
| 148 | return GL_LINEAR_MIPMAP_LINEAR; | ||
| 149 | } | ||
| 150 | } | ||
| 151 | case Tegra::Texture::TextureFilter::Nearest: { | ||
| 152 | switch (mip_filter_mode) { | ||
| 153 | case Tegra::Texture::TextureMipmapFilter::None: | ||
| 154 | return GL_NEAREST; | ||
| 155 | case Tegra::Texture::TextureMipmapFilter::Nearest: | ||
| 156 | return GL_NEAREST_MIPMAP_NEAREST; | ||
| 157 | case Tegra::Texture::TextureMipmapFilter::Linear: | ||
| 158 | return GL_LINEAR_MIPMAP_NEAREST; | ||
| 159 | } | ||
| 160 | } | ||
| 144 | } | 161 | } |
| 145 | LOG_CRITICAL(Render_OpenGL, "Unimplemented texture filter mode={}", | 162 | LOG_CRITICAL(Render_OpenGL, "Unimplemented texture filter mode={}", |
| 146 | static_cast<u32>(filter_mode)); | 163 | static_cast<u32>(filter_mode)); |
| @@ -148,6 +165,7 @@ inline GLenum TextureFilterMode(Tegra::Texture::TextureFilter filter_mode) { | |||
| 148 | return {}; | 165 | return {}; |
| 149 | } | 166 | } |
| 150 | 167 | ||
| 168 | |||
| 151 | inline GLenum WrapMode(Tegra::Texture::WrapMode wrap_mode) { | 169 | inline GLenum WrapMode(Tegra::Texture::WrapMode wrap_mode) { |
| 152 | switch (wrap_mode) { | 170 | switch (wrap_mode) { |
| 153 | case Tegra::Texture::WrapMode::Wrap: | 171 | case Tegra::Texture::WrapMode::Wrap: |