summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar bunnei2015-07-21 18:27:50 -0400
committerGravatar bunnei2015-07-21 18:27:50 -0400
commit3a5352baf8a5008a73a7f003265a4e36aaac8b39 (patch)
tree41ee1deefda790995bb471aecffaaca4b2fe574c /src
parentMerge pull request #962 from Subv/am_app (diff)
parentGPU: Added registers for min and mag texture filters and implemented them in ... (diff)
downloadyuzu-3a5352baf8a5008a73a7f003265a4e36aaac8b39.tar.gz
yuzu-3a5352baf8a5008a73a7f003265a4e36aaac8b39.tar.xz
yuzu-3a5352baf8a5008a73a7f003265a4e36aaac8b39.zip
Merge pull request #968 from Subv/texture_filtering
GPU: Added registers for min and mag texture filters
Diffstat (limited to 'src')
-rw-r--r--src/video_core/pica.h7
-rw-r--r--src/video_core/rasterizer.cpp1
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer_cache.cpp5
-rw-r--r--src/video_core/renderer_opengl/pica_to_gl.h27
4 files changed, 37 insertions, 3 deletions
diff --git a/src/video_core/pica.h b/src/video_core/pica.h
index 5da182794..aec6f0660 100644
--- a/src/video_core/pica.h
+++ b/src/video_core/pica.h
@@ -119,6 +119,11 @@ struct Regs {
119 MirroredRepeat = 3, 119 MirroredRepeat = 3,
120 }; 120 };
121 121
122 enum TextureFilter : u32 {
123 Nearest = 0,
124 Linear = 1
125 };
126
122 union { 127 union {
123 BitField< 0, 8, u32> r; 128 BitField< 0, 8, u32> r;
124 BitField< 8, 8, u32> g; 129 BitField< 8, 8, u32> g;
@@ -132,6 +137,8 @@ struct Regs {
132 }; 137 };
133 138
134 union { 139 union {
140 BitField< 1, 1, TextureFilter> mag_filter;
141 BitField< 2, 1, TextureFilter> min_filter;
135 BitField< 8, 2, WrapMode> wrap_t; 142 BitField< 8, 2, WrapMode> wrap_t;
136 BitField<12, 2, WrapMode> wrap_s; 143 BitField<12, 2, WrapMode> wrap_s;
137 }; 144 };
diff --git a/src/video_core/rasterizer.cpp b/src/video_core/rasterizer.cpp
index a6b7997ce..e2b90ad1c 100644
--- a/src/video_core/rasterizer.cpp
+++ b/src/video_core/rasterizer.cpp
@@ -460,6 +460,7 @@ static void ProcessTriangleInternal(const VertexShader::OutputVertex& v0,
460 u8* texture_data = Memory::GetPhysicalPointer(texture.config.GetPhysicalAddress()); 460 u8* texture_data = Memory::GetPhysicalPointer(texture.config.GetPhysicalAddress());
461 auto info = DebugUtils::TextureInfo::FromPicaRegister(texture.config, texture.format); 461 auto info = DebugUtils::TextureInfo::FromPicaRegister(texture.config, texture.format);
462 462
463 // TODO: Apply the min and mag filters to the texture
463 texture_color[i] = DebugUtils::LookupTexture(texture_data, s, t, info); 464 texture_color[i] = DebugUtils::LookupTexture(texture_data, s, t, info);
464 DebugUtils::DumpTexture(texture.config, texture_data); 465 DebugUtils::DumpTexture(texture.config, texture_data);
465 } 466 }
diff --git a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
index 2e4110a88..0e4f8e1ec 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
@@ -31,9 +31,8 @@ void RasterizerCacheOpenGL::LoadAndBindTexture(OpenGLState &state, unsigned text
31 state.texture_units[texture_unit].texture_2d = new_texture->texture.handle; 31 state.texture_units[texture_unit].texture_2d = new_texture->texture.handle;
32 state.Apply(); 32 state.Apply();
33 33
34 // TODO: Need to choose filters that correspond to PICA once register is declared 34 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, PicaToGL::TextureFilterMode(config.config.mag_filter));
35 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 35 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, PicaToGL::TextureFilterMode(config.config.min_filter));
36 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
37 36
38 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, PicaToGL::WrapMode(config.config.wrap_s)); 37 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, PicaToGL::WrapMode(config.config.wrap_s));
39 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, PicaToGL::WrapMode(config.config.wrap_t)); 38 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, PicaToGL::WrapMode(config.config.wrap_t));
diff --git a/src/video_core/renderer_opengl/pica_to_gl.h b/src/video_core/renderer_opengl/pica_to_gl.h
index 73f63c55d..3b562da86 100644
--- a/src/video_core/renderer_opengl/pica_to_gl.h
+++ b/src/video_core/renderer_opengl/pica_to_gl.h
@@ -12,6 +12,33 @@
12 12
13namespace PicaToGL { 13namespace PicaToGL {
14 14
15inline GLenum TextureFilterMode(Pica::Regs::TextureConfig::TextureFilter mode) {
16 static const GLenum filter_mode_table[] = {
17 GL_NEAREST, // TextureFilter::Nearest
18 GL_LINEAR // TextureFilter::Linear
19 };
20
21 // Range check table for input
22 if (mode >= ARRAY_SIZE(filter_mode_table)) {
23 LOG_CRITICAL(Render_OpenGL, "Unknown texture filtering mode %d", mode);
24 UNREACHABLE();
25
26 return GL_LINEAR;
27 }
28
29 GLenum gl_mode = filter_mode_table[mode];
30
31 // Check for dummy values indicating an unknown mode
32 if (gl_mode == 0) {
33 LOG_CRITICAL(Render_OpenGL, "Unknown texture filtering mode %d", mode);
34 UNIMPLEMENTED();
35
36 return GL_LINEAR;
37 }
38
39 return gl_mode;
40}
41
15inline GLenum WrapMode(Pica::Regs::TextureConfig::WrapMode mode) { 42inline GLenum WrapMode(Pica::Regs::TextureConfig::WrapMode mode) {
16 static const GLenum wrap_mode_table[] = { 43 static const GLenum wrap_mode_table[] = {
17 GL_CLAMP_TO_EDGE, // WrapMode::ClampToEdge 44 GL_CLAMP_TO_EDGE, // WrapMode::ClampToEdge