mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-30 21:30:04 +00:00 
			
		
		
		
	Custom textures rewrite (#6452)
* common: Add thread pool from yuzu * Is really useful for asynchronous operations like shader compilation and custom textures, will be used in following PRs * core: Improve ImageInterface * Provide a default implementation so frontends don't have to duplicate code registering the lodepng version * Add a dds version too which we will use in the next commit * rasterizer_cache: Rewrite custom textures * There's just too much to talk about here, look at the PR description for more details * rasterizer_cache: Implement basic pack configuration file * custom_tex_manager: Flip dumped textures * custom_tex_manager: Optimize custom texture hashing * If no convertions are needed then we can hash the decoded data directly removing the needed for duplicate decode * custom_tex_manager: Implement asynchronous texture loading * The file loading and decoding is offloaded into worker threads, while the upload itself still occurs in the main thread to avoid having to manage shared contexts * Address review comments * custom_tex_manager: Introduce custom material support * video_core: Move custom textures to separate directory * Also split the files to make the code cleaner * gl_texture_runtime: Generate mipmaps for material * custom_tex_manager: Prevent memory overflow when preloading * externals: Add dds-ktx as submodule * string_util: Return vector from SplitString * No code benefits from passing it as an argument * custom_textures: Use json config file * gl_rasterizer: Only bind material for unit 0 * Address review comments
This commit is contained in:
		
							parent
							
								
									d16dce6d99
								
							
						
					
					
						commit
						06f3c90cfb
					
				
					 87 changed files with 2154 additions and 544 deletions
				
			
		
							
								
								
									
										65
									
								
								src/core/frontend/image_interface.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								src/core/frontend/image_interface.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,65 @@ | |||
| // Copyright 2023 Citra Emulator Project
 | ||||
| // Licensed under GPLv2 or any later version
 | ||||
| // Refer to the license.txt file included.
 | ||||
| 
 | ||||
| #define DDSKTX_IMPLEMENT | ||||
| #include <dds-ktx.h> | ||||
| #include <lodepng.h> | ||||
| #include "common/file_util.h" | ||||
| #include "common/logging/log.h" | ||||
| #include "core/frontend/image_interface.h" | ||||
| 
 | ||||
| namespace Frontend { | ||||
| 
 | ||||
| bool ImageInterface::DecodePNG(std::vector<u8>& dst, u32& width, u32& height, | ||||
|                                std::span<const u8> src) { | ||||
|     const u32 lodepng_ret = lodepng::decode(dst, width, height, src.data(), src.size()); | ||||
|     if (lodepng_ret) { | ||||
|         LOG_ERROR(Frontend, "Failed to decode because {}", lodepng_error_text(lodepng_ret)); | ||||
|         return false; | ||||
|     } | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
| bool ImageInterface::DecodeDDS(std::vector<u8>& dst, u32& width, u32& height, ddsktx_format& format, | ||||
|                                std::span<const u8> src) { | ||||
|     ddsktx_texture_info tc{}; | ||||
|     const int size = static_cast<int>(src.size()); | ||||
| 
 | ||||
|     if (!ddsktx_parse(&tc, src.data(), size, nullptr)) { | ||||
|         LOG_ERROR(Frontend, "Failed to decode"); | ||||
|         return false; | ||||
|     } | ||||
|     width = tc.width; | ||||
|     height = tc.height; | ||||
|     format = tc.format; | ||||
| 
 | ||||
|     ddsktx_sub_data sub_data{}; | ||||
|     ddsktx_get_sub(&tc, &sub_data, src.data(), size, 0, 0, 0); | ||||
| 
 | ||||
|     dst.resize(sub_data.size_bytes); | ||||
|     std::memcpy(dst.data(), sub_data.buff, sub_data.size_bytes); | ||||
| 
 | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
| bool ImageInterface::EncodePNG(const std::string& path, u32 width, u32 height, | ||||
|                                std::span<const u8> src) { | ||||
|     std::vector<u8> out; | ||||
|     const u32 lodepng_ret = lodepng::encode(out, src.data(), width, height); | ||||
|     if (lodepng_ret) { | ||||
|         LOG_ERROR(Frontend, "Failed to encode {} because {}", path, | ||||
|                   lodepng_error_text(lodepng_ret)); | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|     FileUtil::IOFile file{path, "wb"}; | ||||
|     if (file.WriteBytes(out.data(), out.size()) != out.size()) { | ||||
|         LOG_ERROR(Frontend, "Failed to save encode to path {}", path); | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
| } // namespace Frontend
 | ||||
|  | @ -4,21 +4,26 @@ | |||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| #include <span> | ||||
| #include <string> | ||||
| #include <vector> | ||||
| #include <dds-ktx.h> | ||||
| #include "common/common_types.h" | ||||
| 
 | ||||
| namespace Frontend { | ||||
| 
 | ||||
| /**
 | ||||
|  * Utility class that provides image decoding/encoding to the custom texture manager. | ||||
|  * Can be optionally overriden by frontends to provide a custom implementation. | ||||
|  */ | ||||
| class ImageInterface { | ||||
| public: | ||||
|     virtual ~ImageInterface() = default; | ||||
| 
 | ||||
|     // Error logging should be handled by the frontend
 | ||||
|     virtual bool DecodePNG(std::vector<u8>& dst, u32& width, u32& height, | ||||
|                            const std::string& path) = 0; | ||||
|     virtual bool EncodePNG(const std::string& path, const std::vector<u8>& src, u32 width, | ||||
|                            u32 height) = 0; | ||||
|     virtual bool DecodePNG(std::vector<u8>& dst, u32& width, u32& height, std::span<const u8> src); | ||||
|     virtual bool DecodeDDS(std::vector<u8>& dst, u32& width, u32& height, ddsktx_format& format, | ||||
|                            std::span<const u8> src); | ||||
|     virtual bool EncodePNG(const std::string& path, u32 width, u32 height, std::span<const u8> src); | ||||
| }; | ||||
| 
 | ||||
| } // namespace Frontend
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue