summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar FernandoS272018-10-24 19:25:28 -0400
committerGravatar FernandoS272018-10-28 19:00:01 -0400
commit258f0f5c31decbb25eddde798b3a4bcc6a7cc6dd (patch)
tree8c805cb136b2d938f24e5aaaa2e7a3f723f4ccb1 /src
parentZero out memory region of recreated surface before flushing (diff)
downloadyuzu-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.cpp10
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.h1
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer_cache.h4
-rw-r--r--src/video_core/renderer_opengl/maxwell_to_gl.h28
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
138inline GLenum TextureFilterMode(Tegra::Texture::TextureFilter filter_mode) { 138inline 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
151inline GLenum WrapMode(Tegra::Texture::WrapMode wrap_mode) { 169inline 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: