mirror of
				https://github.com/hedge-dev/XenosRecomp.git
				synced 2025-10-30 07:12:17 +00:00 
			
		
		
		
	Remove bin2h, load shader include file from an argument instead.
This commit is contained in:
		
							parent
							
								
									5f6a8e6c2a
								
							
						
					
					
						commit
						02967c4144
					
				
					 6 changed files with 20 additions and 95 deletions
				
			
		
							
								
								
									
										1
									
								
								ShaderRecomp/.gitignore
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								ShaderRecomp/.gitignore
									
										
									
									
										vendored
									
									
								
							|  | @ -1 +0,0 @@ | ||||||
| *.hlsli.h |  | ||||||
|  | @ -1,8 +1,5 @@ | ||||||
| project(ShaderRecomp) | project(ShaderRecomp) | ||||||
| 
 | 
 | ||||||
| include(bin2h.cmake) |  | ||||||
| bin2h(SOURCE_FILE shader_common.hlsli HEADER_FILE shader_common.hlsli.h VARIABLE_NAME SHADER_COMMON_HLSLI) |  | ||||||
| 
 |  | ||||||
| add_executable(ShaderRecomp  | add_executable(ShaderRecomp  | ||||||
|     constant_table.h |     constant_table.h | ||||||
|     dxc_compiler.cpp |     dxc_compiler.cpp | ||||||
|  | @ -11,7 +8,6 @@ add_executable(ShaderRecomp | ||||||
|     pch.h |     pch.h | ||||||
|     shader.h |     shader.h | ||||||
|     shader_code.h |     shader_code.h | ||||||
|     shader_common.hlsli.h |  | ||||||
|     shader_recompiler.cpp |     shader_recompiler.cpp | ||||||
|     shader_recompiler.h) |     shader_recompiler.h) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,83 +0,0 @@ | ||||||
| # https://github.com/sivachandran/cmake-bin2h |  | ||||||
| include(CMakeParseArguments) |  | ||||||
| 
 |  | ||||||
| # Function to wrap a given string into multiple lines at the given column position. |  | ||||||
| # Parameters: |  | ||||||
| #   VARIABLE    - The name of the CMake variable holding the string. |  | ||||||
| #   AT_COLUMN   - The column position at which string will be wrapped. |  | ||||||
| function(WRAP_STRING) |  | ||||||
|     set(oneValueArgs VARIABLE AT_COLUMN) |  | ||||||
|     cmake_parse_arguments(WRAP_STRING "${options}" "${oneValueArgs}" "" ${ARGN}) |  | ||||||
| 
 |  | ||||||
|     string(LENGTH ${${WRAP_STRING_VARIABLE}} stringLength) |  | ||||||
|     math(EXPR offset "0") |  | ||||||
| 
 |  | ||||||
|     while(stringLength GREATER 0) |  | ||||||
| 
 |  | ||||||
|         if(stringLength GREATER ${WRAP_STRING_AT_COLUMN}) |  | ||||||
|             math(EXPR length "${WRAP_STRING_AT_COLUMN}") |  | ||||||
|         else() |  | ||||||
|             math(EXPR length "${stringLength}") |  | ||||||
|         endif() |  | ||||||
| 
 |  | ||||||
|         string(SUBSTRING ${${WRAP_STRING_VARIABLE}} ${offset} ${length} line) |  | ||||||
|         set(lines "${lines}\n${line}") |  | ||||||
| 
 |  | ||||||
|         math(EXPR stringLength "${stringLength} - ${length}") |  | ||||||
|         math(EXPR offset "${offset} + ${length}") |  | ||||||
|     endwhile() |  | ||||||
| 
 |  | ||||||
|     set(${WRAP_STRING_VARIABLE} "${lines}" PARENT_SCOPE) |  | ||||||
| endfunction() |  | ||||||
| 
 |  | ||||||
| # Function to embed contents of a file as byte array in C/C++ header file(.h). The header file |  | ||||||
| # will contain a byte array and integer variable holding the size of the array. |  | ||||||
| # Parameters |  | ||||||
| #   SOURCE_FILE     - The path of source file whose contents will be embedded in the header file. |  | ||||||
| #   VARIABLE_NAME   - The name of the variable for the byte array. The string "_SIZE" will be append |  | ||||||
| #                     to this name and will be used a variable name for size variable. |  | ||||||
| #   HEADER_FILE     - The path of header file. |  | ||||||
| #   APPEND          - If specified appends to the header file instead of overwriting it |  | ||||||
| #   NULL_TERMINATE  - If specified a null byte(zero) will be append to the byte array. This will be |  | ||||||
| #                     useful if the source file is a text file and we want to use the file contents |  | ||||||
| #                     as string. But the size variable holds size of the byte array without this |  | ||||||
| #                     null byte. |  | ||||||
| # Usage: |  | ||||||
| #   bin2h(SOURCE_FILE "Logo.png" HEADER_FILE "Logo.h" VARIABLE_NAME "LOGO_PNG") |  | ||||||
| function(BIN2H) |  | ||||||
|     set(options APPEND NULL_TERMINATE) |  | ||||||
|     set(oneValueArgs SOURCE_FILE VARIABLE_NAME HEADER_FILE) |  | ||||||
|     cmake_parse_arguments(BIN2H "${options}" "${oneValueArgs}" "" ${ARGN}) |  | ||||||
| 
 |  | ||||||
|     # reads source file contents as hex string |  | ||||||
|     file(READ ${BIN2H_SOURCE_FILE} hexString HEX) |  | ||||||
|     string(LENGTH ${hexString} hexStringLength) |  | ||||||
| 
 |  | ||||||
|     # appends null byte if asked |  | ||||||
|     if(BIN2H_NULL_TERMINATE) |  | ||||||
|         set(hexString "${hexString}00") |  | ||||||
|     endif() |  | ||||||
| 
 |  | ||||||
|     # wraps the hex string into multiple lines at column 32(i.e. 16 bytes per line) |  | ||||||
|     wrap_string(VARIABLE hexString AT_COLUMN 32) |  | ||||||
|     math(EXPR arraySize "${hexStringLength} / 2") |  | ||||||
| 
 |  | ||||||
|     # adds '0x' prefix and comma suffix before and after every byte respectively |  | ||||||
|     string(REGEX REPLACE "([0-9a-f][0-9a-f])" "0x\\1, " arrayValues ${hexString}) |  | ||||||
|     # removes trailing comma |  | ||||||
|     string(REGEX REPLACE ", $" "" arrayValues ${arrayValues}) |  | ||||||
| 
 |  | ||||||
|     # converts the variable name into proper C identifier |  | ||||||
|     string(MAKE_C_IDENTIFIER "${BIN2H_VARIABLE_NAME}" BIN2H_VARIABLE_NAME) |  | ||||||
| 
 |  | ||||||
|     # declares byte array and the length variables |  | ||||||
|     set(arrayDefinition "const char ${BIN2H_VARIABLE_NAME}[] = { ${arrayValues} };") |  | ||||||
|     set(arraySizeDefinition "const size_t ${BIN2H_VARIABLE_NAME}_SIZE = ${arraySize};") |  | ||||||
| 
 |  | ||||||
|     set(declarations "${arrayDefinition}\n\n${arraySizeDefinition}\n\n") |  | ||||||
|     if(BIN2H_APPEND) |  | ||||||
|         file(APPEND ${BIN2H_HEADER_FILE} "${declarations}") |  | ||||||
|     else() |  | ||||||
|         file(WRITE ${BIN2H_HEADER_FILE} "${declarations}") |  | ||||||
|     endif() |  | ||||||
| endfunction() |  | ||||||
|  | @ -45,6 +45,18 @@ int main(int argc, char** argv) | ||||||
|         argv[2] |         argv[2] | ||||||
| #endif | #endif | ||||||
|         ; |         ; | ||||||
|  |      | ||||||
|  |     const char* includeInput = | ||||||
|  | #ifdef SHADER_RECOMP_INCLUDE_INPUT | ||||||
|  |         SHADER_RECOMP_INCLUDE_INPUT | ||||||
|  | #else | ||||||
|  |         argv[3] | ||||||
|  | #endif | ||||||
|  |         ; | ||||||
|  | 
 | ||||||
|  |     size_t includeSize = 0; | ||||||
|  |     auto includeData = readAllBytes(includeInput, includeSize); | ||||||
|  |     std::string_view include(reinterpret_cast<const char*>(includeData.get()), includeSize); | ||||||
| 
 | 
 | ||||||
|     if (std::filesystem::is_directory(input)) |     if (std::filesystem::is_directory(input)) | ||||||
|     { |     { | ||||||
|  | @ -63,7 +75,7 @@ int main(int argc, char** argv) | ||||||
|                 size_t dataSize = shaderContainer->virtualSize + shaderContainer->physicalSize; |                 size_t dataSize = shaderContainer->virtualSize + shaderContainer->physicalSize; | ||||||
| 
 | 
 | ||||||
|                 if ((shaderContainer->flags & 0xFFFFFF00) == 0x102A1100 && |                 if ((shaderContainer->flags & 0xFFFFFF00) == 0x102A1100 && | ||||||
|                     dataSize < (fileSize - i) && |                     dataSize <= (fileSize - i) && | ||||||
|                     shaderContainer->field1C == 0 && |                     shaderContainer->field1C == 0 && | ||||||
|                     shaderContainer->field20 == 0) |                     shaderContainer->field20 == 0) | ||||||
|                 { |                 { | ||||||
|  | @ -95,7 +107,7 @@ int main(int argc, char** argv) | ||||||
| 
 | 
 | ||||||
|                 thread_local ShaderRecompiler recompiler; |                 thread_local ShaderRecompiler recompiler; | ||||||
|                 recompiler = {}; |                 recompiler = {}; | ||||||
|                 recompiler.recompile(shader.data); |                 recompiler.recompile(shader.data, include); | ||||||
| 
 | 
 | ||||||
|                 thread_local DxcCompiler dxcCompiler; |                 thread_local DxcCompiler dxcCompiler; | ||||||
|                 shader.dxil = dxcCompiler.compile(recompiler.out, recompiler.isPixelShader, false); |                 shader.dxil = dxcCompiler.compile(recompiler.out, recompiler.isPixelShader, false); | ||||||
|  | @ -170,7 +182,7 @@ int main(int argc, char** argv) | ||||||
|     { |     { | ||||||
|         ShaderRecompiler recompiler; |         ShaderRecompiler recompiler; | ||||||
|         size_t fileSize; |         size_t fileSize; | ||||||
|         recompiler.recompile(readAllBytes(input, fileSize).get()); |         recompiler.recompile(readAllBytes(input, fileSize).get(), include); | ||||||
|         writeAllBytes(output, recompiler.out.data(), recompiler.out.size()); |         writeAllBytes(output, recompiler.out.data(), recompiler.out.size()); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,4 @@ | ||||||
| #include "shader_recompiler.h" | #include "shader_recompiler.h" | ||||||
| #include "shader_common.hlsli.h" |  | ||||||
| 
 | 
 | ||||||
| static constexpr char SWIZZLES[] =  | static constexpr char SWIZZLES[] =  | ||||||
| {  | {  | ||||||
|  | @ -1042,14 +1041,16 @@ void ShaderRecompiler::recompile(const AluInstruction& instr) | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void ShaderRecompiler::recompile(const uint8_t* shaderData) | void ShaderRecompiler::recompile(const uint8_t* shaderData, const std::string_view& include) | ||||||
| { | { | ||||||
|     const auto shaderContainer = reinterpret_cast<const ShaderContainer*>(shaderData); |     const auto shaderContainer = reinterpret_cast<const ShaderContainer*>(shaderData); | ||||||
| 
 | 
 | ||||||
|     assert((shaderContainer->flags & 0xFFFFFF00) == 0x102A1100); |     assert((shaderContainer->flags & 0xFFFFFF00) == 0x102A1100); | ||||||
|     assert(shaderContainer->constantTableOffset != NULL); |     assert(shaderContainer->constantTableOffset != NULL); | ||||||
| 
 | 
 | ||||||
|     out += std::string_view(SHADER_COMMON_HLSLI, SHADER_COMMON_HLSLI_SIZE); |     out += include; | ||||||
|  |     out += '\n'; | ||||||
|  | 
 | ||||||
|     isPixelShader = (shaderContainer->flags & 0x1) == 0; |     isPixelShader = (shaderContainer->flags & 0x1) == 0; | ||||||
| 
 | 
 | ||||||
|     const auto constantTableContainer = reinterpret_cast<const ConstantTableContainer*>(shaderData + shaderContainer->constantTableOffset); |     const auto constantTableContainer = reinterpret_cast<const ConstantTableContainer*>(shaderData + shaderContainer->constantTableOffset); | ||||||
|  |  | ||||||
|  | @ -46,5 +46,5 @@ struct ShaderRecompiler : StringBuffer | ||||||
|     void recompile(const TextureFetchInstruction& instr, bool bicubic); |     void recompile(const TextureFetchInstruction& instr, bool bicubic); | ||||||
|     void recompile(const AluInstruction& instr); |     void recompile(const AluInstruction& instr); | ||||||
| 
 | 
 | ||||||
|     void recompile(const uint8_t* shaderData); |     void recompile(const uint8_t* shaderData, const std::string_view& include); | ||||||
| }; | }; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Skyth
						Skyth