GPU: Added registers for min and mag texture filters and implemented them in the hw renderer.
This commit is contained in:
		| @@ -119,6 +119,11 @@ struct Regs { | ||||
|             MirroredRepeat = 3, | ||||
|         }; | ||||
|  | ||||
|         enum TextureFilter : u32 { | ||||
|             Nearest = 0, | ||||
|             Linear  = 1 | ||||
|         }; | ||||
|  | ||||
|         union { | ||||
|             BitField< 0, 8, u32> r; | ||||
|             BitField< 8, 8, u32> g; | ||||
| @@ -132,6 +137,8 @@ struct Regs { | ||||
|         }; | ||||
|  | ||||
|         union { | ||||
|             BitField< 1, 1, TextureFilter> mag_filter; | ||||
|             BitField< 2, 1, TextureFilter> min_filter; | ||||
|             BitField< 8, 2, WrapMode> wrap_t; | ||||
|             BitField<12, 2, WrapMode> wrap_s; | ||||
|         }; | ||||
|   | ||||
| @@ -460,6 +460,7 @@ static void ProcessTriangleInternal(const VertexShader::OutputVertex& v0, | ||||
|                     u8* texture_data = Memory::GetPhysicalPointer(texture.config.GetPhysicalAddress()); | ||||
|                     auto info = DebugUtils::TextureInfo::FromPicaRegister(texture.config, texture.format); | ||||
|  | ||||
|                     // TODO: Apply the min and mag filters to the texture | ||||
|                     texture_color[i] = DebugUtils::LookupTexture(texture_data, s, t, info); | ||||
|                     DebugUtils::DumpTexture(texture.config, texture_data); | ||||
|                 } | ||||
|   | ||||
| @@ -31,9 +31,8 @@ void RasterizerCacheOpenGL::LoadAndBindTexture(OpenGLState &state, unsigned text | ||||
|         state.texture_units[texture_unit].texture_2d = new_texture->texture.handle; | ||||
|         state.Apply(); | ||||
|  | ||||
|         // TODO: Need to choose filters that correspond to PICA once register is declared | ||||
|         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); | ||||
|         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); | ||||
|         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, PicaToGL::TextureFilterMode(config.config.mag_filter)); | ||||
|         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, PicaToGL::TextureFilterMode(config.config.min_filter)); | ||||
|  | ||||
|         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, PicaToGL::WrapMode(config.config.wrap_s)); | ||||
|         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, PicaToGL::WrapMode(config.config.wrap_t)); | ||||
|   | ||||
| @@ -12,6 +12,33 @@ | ||||
|  | ||||
| namespace PicaToGL { | ||||
|  | ||||
| inline GLenum TextureFilterMode(Pica::Regs::TextureConfig::TextureFilter mode) { | ||||
|     static const GLenum filter_mode_table[] = { | ||||
|         GL_NEAREST,  // TextureFilter::Nearest | ||||
|         GL_LINEAR    // TextureFilter::Linear | ||||
|     }; | ||||
|  | ||||
|     // Range check table for input | ||||
|     if (mode >= ARRAY_SIZE(filter_mode_table)) { | ||||
|         LOG_CRITICAL(Render_OpenGL, "Unknown texture filtering mode %d", mode); | ||||
|         UNREACHABLE(); | ||||
|  | ||||
|         return GL_LINEAR; | ||||
|     } | ||||
|  | ||||
|     GLenum gl_mode = filter_mode_table[mode]; | ||||
|  | ||||
|     // Check for dummy values indicating an unknown mode | ||||
|     if (gl_mode == 0) { | ||||
|         LOG_CRITICAL(Render_OpenGL, "Unknown texture filtering mode %d", mode); | ||||
|         UNIMPLEMENTED(); | ||||
|  | ||||
|         return GL_LINEAR; | ||||
|     } | ||||
|  | ||||
|     return gl_mode; | ||||
| } | ||||
|  | ||||
| inline GLenum WrapMode(Pica::Regs::TextureConfig::WrapMode mode) { | ||||
|     static const GLenum wrap_mode_table[] = { | ||||
|         GL_CLAMP_TO_EDGE,  // WrapMode::ClampToEdge | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Subv
					Subv