forked from MoonsideGames/Refresh
				
			Compare commits
	
		
			131 Commits 
		
	
	
		
			submit_rew
			...
			main
		
	
	| Author | SHA1 | Date | 
|---|---|---|
|  | b78d01592b | |
|  | c99b4cdfa1 | |
|  | 2803e6d94e | |
|  | 30b5f1dd21 | |
|  | 4ce2d80f80 | |
|  | 27e9c741f8 | |
|  | c10ca98ccd | |
|  | d441424b7c | |
|  | 55c77def69 | |
|  | 2634359b48 | |
|  | 56e3eb2af5 | |
|  | 859fc3b9fa | |
|  | 05350a9332 | |
|  | 760c29699f | |
|  | 20636ec951 | |
|  | 7297eba889 | |
|  | b72b0b5fde | |
|  | fa92e9e08a | |
|  | 483c07f3a8 | |
|  | f01d5d817a | |
|  | 17aae46eae | |
|  | 1b3e954da8 | |
|  | 0989e45f88 | |
|  | 6e6fec5224 | |
|  | 34b2e437de | |
|  | d69bbbe818 | |
|  | 54a8ff122c | |
|  | a15e26b124 | |
|  | 172fa83417 | |
|  | a3949528eb | |
|  | f55968814f | |
|  | c978df6275 | |
|  | de42163673 | |
|  | 4f412b5c15 | |
|  | c3a5d9f417 | |
|  | 9631dc9f83 | |
|  | 5a2b07097a | |
|  | 1f9f7e0939 | |
|  | 4df0459b04 | |
|  | 0f29bf03e9 | |
|  | 74909b49c3 | |
|  | 3f5fe1ff67 | |
|  | 3fc743ce28 | |
|  | 153c3c3c60 | |
|  | decddae384 | |
|  | 2d66ec775b | |
|  | 8be8ce1062 | |
|  | 8eebd9c744 | |
|  | 1f2aaeed9f | |
|  | 6439516835 | |
|  | 89ba9c52ff | |
|  | e3ab5fadf8 | |
|  | 05900bee14 | |
|  | f7250ab12a | |
|  | 903192cb4c | |
|  | 4cdd6a497a | |
|  | 28b4253fdf | |
|  | e4215efe5e | |
|  | 329ffab6b8 | |
|  | 15b35fccfe | |
|  | ade74d73fe | |
|  | 124f202d2c | |
|  | 528abfad76 | |
|  | 59f9eeed36 | |
|  | 297f234957 | |
|  | 5f05ef02a0 | |
|  | c4b9798fc1 | |
|  | 5166ae87b2 | |
|  | 3c7755d8bf | |
|  | 9073f68e0a | |
|  | 403dcc6084 | |
|  | fabd31448b | |
|  | 9aaead40a3 | |
|  | 1a0beea402 | |
|  | 5176f790d8 | |
|  | f8bdf6fe1a | |
|  | 8f0ba8ffb2 | |
|  | 5568ce4949 | |
|  | f49c0ab190 | |
|  | 764de140cc | |
|  | 06ad0e1901 | |
|  | 83a59d7685 | |
|  | 5b27f600de | |
|  | d4693a9093 | |
|  | 2fb9a6931b | |
|  | c01ff21359 | |
|  | e5da75d33a | |
|  | 99e9dc5b8c | |
|  | 0e7720ccf6 | |
|  | 488cb8c535 | |
|  | 3007b4c989 | |
|  | 163adfb5cd | |
|  | f0b970496e | |
|  | 38d14fd99d | |
|  | 4bba0f99f9 | |
|  | acefc530fd | |
|  | 3820d458fe | |
|  | 7a0b0f5709 | |
|  | ce34f4a435 | |
|  | eb5617f40e | |
|  | 0380a96817 | |
|  | 22236607f7 | |
|  | 715ca591f6 | |
|  | 7b91c5a140 | |
|  | 2731d47419 | |
|  | 0fbf1b2546 | |
|  | f6b96fe34b | |
|  | 9422d4975f | |
|  | 435f56f6b7 | |
|  | 6302603b08 | |
|  | 5fe4c8dbf3 | |
|  | 67e3a8799c | |
|  | ee50c04428 | |
|  | 9eae69f96b | |
|  | 057a48e96f | |
|  | 61e83cfba8 | |
|  | e4ea104a88 | |
|  | 83c2372499 | |
|  | cb99489b3c | |
|  | d22bed8b76 | |
|  | 436b990d45 | |
|  | a26d3e3689 | |
|  | a38a9d461d | |
|  | 517399f5d9 | |
|  | 5187093ddc | |
|  | 336468cc31 | |
|  | 26a5ea91ba | |
|  | a531fb8593 | |
|  | a3aea0f796 | |
|  | 0319c26f6a | |
|  | 1d72fdb995 | 
|  | @ -0,0 +1,13 @@ | ||||||
|  | # EditorConfig is awesome: https://EditorConfig.org | ||||||
|  | 
 | ||||||
|  | # top-most EditorConfig file | ||||||
|  | root = true | ||||||
|  | 
 | ||||||
|  | [*] | ||||||
|  | indent_style = tab | ||||||
|  | insert_final_newline = true | ||||||
|  | trim_trailing_whitespace = true | ||||||
|  | 
 | ||||||
|  | [*.{c,h}] | ||||||
|  | charset = utf-8-bom | ||||||
|  | max_line_length = 100 | ||||||
|  | @ -7,9 +7,9 @@ project(Refresh C) | ||||||
| option(BUILD_SHARED_LIBS "Build shared library" ON) | option(BUILD_SHARED_LIBS "Build shared library" ON) | ||||||
| 
 | 
 | ||||||
| # Version | # Version | ||||||
| SET(LIB_MAJOR_VERSION "0") | SET(LIB_MAJOR_VERSION "1") | ||||||
| SET(LIB_MINOR_VERSION "1") | SET(LIB_MINOR_VERSION "15") | ||||||
| SET(LIB_REVISION "0") | SET(LIB_REVISION "4") | ||||||
| SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_REVISION}") | SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_REVISION}") | ||||||
| 
 | 
 | ||||||
| # Build Type | # Build Type | ||||||
|  | @ -60,6 +60,11 @@ if(NOT MSVC) | ||||||
| 	set_property(TARGET Refresh PROPERTY COMPILE_FLAGS "-std=gnu99 -Wall -Wno-strict-aliasing -pedantic") | 	set_property(TARGET Refresh PROPERTY COMPILE_FLAGS "-std=gnu99 -Wall -Wno-strict-aliasing -pedantic") | ||||||
| endif() | endif() | ||||||
| 
 | 
 | ||||||
|  | # Windows is silly and we need to manually include the Vulkan SDK | ||||||
|  | if(MSVC) | ||||||
|  | 	target_include_directories(Refresh PUBLIC $ENV{VULKAN_SDK}/include) | ||||||
|  | endif() | ||||||
|  | 
 | ||||||
| # Refresh folders as includes, for other targets to consume | # Refresh folders as includes, for other targets to consume | ||||||
| target_include_directories(Refresh PUBLIC | target_include_directories(Refresh PUBLIC | ||||||
| 	$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src> | 	$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src> | ||||||
|  |  | ||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							|  | @ -44,42 +44,45 @@ | ||||||
| extern "C" { | extern "C" { | ||||||
| #endif /* __cplusplus */ | #endif /* __cplusplus */ | ||||||
| 
 | 
 | ||||||
| /* Decodes PNG data into raw RGBA8 texture data.
 | /* Image Read API */ | ||||||
|  | 
 | ||||||
|  | /* Decodes image data into raw RGBA8 texture data.
 | ||||||
|  * |  * | ||||||
|  * w:		    Filled with the width of the image. |  * w:		    Filled with the width of the image. | ||||||
|  * h:		    Filled with the height of the image. |  * h:		    Filled with the height of the image. | ||||||
|  * numChannels: Filled with the number of channels in the image. |  * len:			Filled with the length of pixel data in bytes. | ||||||
|  * |  * | ||||||
|  * Returns a block of memory suitable for use with Refresh_SetTextureData2D. |  * Returns a block of memory suitable for use with Refresh_SetTextureData2D. | ||||||
|  * Be sure to free the memory with Refresh_Image_Free after use! |  * Be sure to free the memory with Refresh_Image_Free after use! | ||||||
|  */ |  */ | ||||||
| REFRESHAPI uint8_t* Refresh_Image_Load( | REFRESHAPI uint8_t* Refresh_Image_Load( | ||||||
|     char const *filename, | 	uint8_t *bufferPtr, | ||||||
|  | 	int32_t bufferLength, | ||||||
| 	int32_t *w, | 	int32_t *w, | ||||||
| 	int32_t *h, | 	int32_t *h, | ||||||
|     int32_t *numChannels | 	int32_t *len | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
| /* Frees memory returned by Refresh_Image_Load. (Do NOT free the memory yourself!)
 | /* Frees memory returned by Refresh_Image_Load. Do NOT free the memory yourself!
 | ||||||
|  * |  * | ||||||
|  * mem: A pointer previously returned by Refresh_Image_Load. |  * mem: A pointer previously returned by Refresh_Image_LoadPNG. | ||||||
|  */ |  */ | ||||||
| REFRESHAPI void Refresh_Image_Free(uint8_t *mem); | REFRESHAPI void Refresh_Image_Free(uint8_t *mem); | ||||||
| 
 | 
 | ||||||
| /* Image Write API */ | /* Image Write API */ | ||||||
| 
 | 
 | ||||||
| /* Encodes RGBA8 image data into PNG data.
 | /* Returns a buffer of PNG encoded from RGBA8 color data.
 | ||||||
|  * |  * | ||||||
|  * filename:    The filename that the image will be written to. |  * data:	The raw color data. | ||||||
|  * w:	        The width of the PNG data. |  * w:		The width of the color data. | ||||||
|  * h:	        The height of the PNG data. |  * h:		The height of the color data. | ||||||
|  * data:	    The raw RGBA8 image data. |  * len:		Filled with the length of PNG data in bytes. | ||||||
|  */ |  */ | ||||||
| REFRESHAPI void Refresh_Image_SavePNG( | REFRESHAPI void Refresh_Image_SavePNG( | ||||||
|     char const *filename, | 	const char* filename, | ||||||
|     int32_t w, | 	uint8_t* data, | ||||||
|     int32_t h, | 	int32_t w, | ||||||
| 	uint8_t *data | 	int32_t h | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
|  |  | ||||||
|  | @ -0,0 +1,268 @@ | ||||||
|  | using System; | ||||||
|  | using System.IO; | ||||||
|  | using System.Diagnostics; | ||||||
|  | 
 | ||||||
|  | partial class Program | ||||||
|  | { | ||||||
|  | 	struct CompileShaderData | ||||||
|  | 	{ | ||||||
|  | 		public string glslPath; | ||||||
|  | 		public string outputDir; | ||||||
|  | 		public bool preserveTemp; | ||||||
|  | 		public bool vulkan; | ||||||
|  | 		public bool d3d11; | ||||||
|  | 		public bool ps5; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	private static void DisplayHelpText() | ||||||
|  | 	{ | ||||||
|  | 		Console.WriteLine("Usage: refreshc <path-to-glsl-source | directory-with-glsl-source-files>"); | ||||||
|  | 		Console.WriteLine("Options:"); | ||||||
|  | 		Console.WriteLine("  --vulkan           Emit shader compatible with the Refresh Vulkan backend"); | ||||||
|  | 		Console.WriteLine("  --d3d11            Emit shader compatible with the Refresh D3D11 backend"); | ||||||
|  | 		Console.WriteLine("  --ps5              Emit shader compatible with the Refresh PS5 backend"); | ||||||
|  | 		Console.WriteLine("  --out dir          Write output file(s) to the directory `dir`"); | ||||||
|  | 		Console.WriteLine("  --preserve-temp    Do not delete the temp directory after compilation. Useful for debugging."); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public static int Main(string[] args) | ||||||
|  | 	{ | ||||||
|  | 		if (args.Length == 0) | ||||||
|  | 		{ | ||||||
|  | 			DisplayHelpText(); | ||||||
|  | 			return 1; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		CompileShaderData data = new CompileShaderData(); | ||||||
|  | 		string inputPath = null; | ||||||
|  | 
 | ||||||
|  | 		for (int i = 0; i < args.Length; i += 1) | ||||||
|  | 		{ | ||||||
|  | 			switch (args[i]) | ||||||
|  | 			{ | ||||||
|  | 				case "--vulkan": | ||||||
|  | 					data.vulkan = true; | ||||||
|  | 					break; | ||||||
|  | 
 | ||||||
|  | 				case "--d3d11": | ||||||
|  | 					data.d3d11 = true; | ||||||
|  | 					break; | ||||||
|  | 
 | ||||||
|  | 				case "--ps5": | ||||||
|  | 					data.ps5 = true; | ||||||
|  | 					break; | ||||||
|  | 
 | ||||||
|  | 				case "--out": | ||||||
|  | 					i += 1; | ||||||
|  | 					data.outputDir = args[i]; | ||||||
|  | 					break; | ||||||
|  | 
 | ||||||
|  | 				case "--preserve-temp": | ||||||
|  | 					data.preserveTemp = true; | ||||||
|  | 					break; | ||||||
|  | 
 | ||||||
|  | 				default: | ||||||
|  | 					if (inputPath == null) | ||||||
|  | 					{ | ||||||
|  | 						inputPath = args[i]; | ||||||
|  | 					} | ||||||
|  | 					else | ||||||
|  | 					{ | ||||||
|  | 						Console.WriteLine($"refreshc: Unknown parameter {args[i]}"); | ||||||
|  | 						return 1; | ||||||
|  | 					} | ||||||
|  | 					break; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if (!data.vulkan && !data.d3d11 && !data.ps5) | ||||||
|  | 		{ | ||||||
|  | 			Console.WriteLine($"refreshc: No Refresh platforms selected!"); | ||||||
|  | 			return 1; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | #if !PS5 | ||||||
|  | 		if (data.ps5) | ||||||
|  | 		{ | ||||||
|  | 			Console.WriteLine($"refreshc: `PS5` must be defined in the to target the PS5 backend!"); | ||||||
|  | 			return 1; | ||||||
|  | 		} | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 		if (data.outputDir == null) | ||||||
|  | 		{ | ||||||
|  | 			data.outputDir = Directory.GetCurrentDirectory(); | ||||||
|  | 		} | ||||||
|  | 		else if (!Directory.Exists(data.outputDir)) | ||||||
|  | 		{ | ||||||
|  | 			Console.WriteLine($"refreshc: Output directory {data.outputDir} does not exist"); | ||||||
|  | 			return 1; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if (Directory.Exists(inputPath)) | ||||||
|  | 		{ | ||||||
|  | 			// Loop over and compile each file in the directory | ||||||
|  | 			string[] files = Directory.GetFiles(inputPath); | ||||||
|  | 			foreach (string file in files) | ||||||
|  | 			{ | ||||||
|  | 				Console.WriteLine($"Compiling {file}"); | ||||||
|  | 				data.glslPath = file; | ||||||
|  | 				int res = CompileShader(ref data); | ||||||
|  | 				if (res != 0) | ||||||
|  | 				{ | ||||||
|  | 					return res; | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		else | ||||||
|  | 		{ | ||||||
|  | 			if (!File.Exists(inputPath)) | ||||||
|  | 			{ | ||||||
|  | 				Console.WriteLine($"refreshc: glsl source file or directory ({inputPath}) does not exist"); | ||||||
|  | 				return 1; | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			data.glslPath = inputPath; | ||||||
|  | 			int res = CompileShader(ref data); | ||||||
|  | 			if (res != 0) | ||||||
|  | 			{ | ||||||
|  | 				return res; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	static int CompileShader(ref CompileShaderData data) | ||||||
|  | 	{ | ||||||
|  | 		int res = 0; | ||||||
|  | 		string shaderName = Path.GetFileNameWithoutExtension(data.glslPath); | ||||||
|  | 		string shaderType = Path.GetExtension(data.glslPath); | ||||||
|  | 
 | ||||||
|  | 		if (shaderType != ".vert" && shaderType != ".frag" && shaderType != ".comp") | ||||||
|  | 		{ | ||||||
|  | 			Console.WriteLine("refreshc: Expected glsl source file with extension '.vert', '.frag', or '.comp'"); | ||||||
|  | 			return 1; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		// Create the temp directory, if needed | ||||||
|  | 		string tempDir = Path.Combine(Directory.GetCurrentDirectory(), "temp"); | ||||||
|  | 		if (!Directory.Exists(tempDir)) | ||||||
|  | 		{ | ||||||
|  | 			Directory.CreateDirectory(tempDir); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		// Compile to spirv | ||||||
|  | 		string spirvPath = Path.Combine(tempDir, $"{shaderName}.spv"); | ||||||
|  | 		res = CompileGlslToSpirv(data.glslPath, shaderName, spirvPath); | ||||||
|  | 		if (res != 0) | ||||||
|  | 		{ | ||||||
|  | 			goto cleanup; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if (data.d3d11 || data.ps5) | ||||||
|  | 		{ | ||||||
|  | 			// Transpile to hlsl | ||||||
|  | 			string hlslPath = Path.Combine(tempDir, $"{shaderName}.hlsl"); | ||||||
|  | 			res = TranslateSpirvToHlsl(spirvPath, hlslPath); | ||||||
|  | 			if (res != 0) | ||||||
|  | 			{ | ||||||
|  | 				goto cleanup; | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			// FIXME: Is there a cross-platform way to compile HLSL to DXBC? | ||||||
|  | 
 | ||||||
|  | #if PS5 | ||||||
|  | 			// Transpile to ps5, if requested | ||||||
|  | 			if (data.ps5) | ||||||
|  | 			{ | ||||||
|  | 				res = TranslateHlslToPS5(hlslPath, shaderName, shaderType, tempDir); | ||||||
|  | 				if (res != 0) | ||||||
|  | 				{ | ||||||
|  | 					goto cleanup; | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | #endif | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		// Create the output blob file | ||||||
|  | 		string outputFilepath = Path.Combine(data.outputDir, $"{shaderName}{shaderType}.refresh"); | ||||||
|  | 		using (FileStream fs = File.Create(outputFilepath)) | ||||||
|  | 		{ | ||||||
|  | 			using (BinaryWriter writer = new BinaryWriter(fs)) | ||||||
|  | 			{ | ||||||
|  | 				// Magic | ||||||
|  | 				writer.Write(new char[] { 'R', 'F', 'S', 'H'}); | ||||||
|  | 
 | ||||||
|  | 				if (data.vulkan) | ||||||
|  | 				{ | ||||||
|  | 					string inputPath = Path.Combine(tempDir, $"{shaderName}.spv"); | ||||||
|  | 					WriteShaderBlob(writer, inputPath, 1); | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
|  | #if PS5 | ||||||
|  | 				if (data.ps5) | ||||||
|  | 				{ | ||||||
|  | 					string ext = GetPS5ShaderFileExtension(); | ||||||
|  | 					string inputPath = Path.Combine(tempDir, $"{shaderName}{ext}"); | ||||||
|  | 					WriteShaderBlob(writer, inputPath, 2); | ||||||
|  | 				} | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 				if (data.d3d11) | ||||||
|  | 				{ | ||||||
|  | 					string inputPath = Path.Combine(tempDir, $"{shaderName}.hlsl"); | ||||||
|  | 					WriteShaderBlob(writer, inputPath, 3); | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 	cleanup: | ||||||
|  | 		// Clean up the temp directory | ||||||
|  | 		if (!data.preserveTemp) | ||||||
|  | 		{ | ||||||
|  | 			Directory.Delete(tempDir, true); | ||||||
|  | 		} | ||||||
|  | 		return res; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	static void WriteShaderBlob(BinaryWriter writer, string inputPath, byte backend) | ||||||
|  | 	{ | ||||||
|  | 		byte[] shaderBlob = File.ReadAllBytes(inputPath); | ||||||
|  | 		writer.Write(backend); // Corresponds to Refresh_Backend | ||||||
|  | 		writer.Write(shaderBlob.Length); | ||||||
|  | 		writer.Write(shaderBlob); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	static int CompileGlslToSpirv(string glslPath, string shaderName, string outputPath) | ||||||
|  | 	{ | ||||||
|  | 		Process glslc = Process.Start( | ||||||
|  | 			"glslc", | ||||||
|  | 			$"\"{glslPath}\" -o \"{outputPath}\"" | ||||||
|  | 		); | ||||||
|  | 		glslc.WaitForExit(); | ||||||
|  | 		if (glslc.ExitCode != 0) | ||||||
|  | 		{ | ||||||
|  | 			Console.WriteLine($"refreshc: Could not compile GLSL code"); | ||||||
|  | 			return 1; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	static int TranslateSpirvToHlsl(string spirvPath, string outputPath) | ||||||
|  | 	{ | ||||||
|  | 		Process spirvcross = Process.Start( | ||||||
|  | 			"spirv-cross", | ||||||
|  | 			$"\"{spirvPath}\" --hlsl --shader-model 50 --output \"{outputPath}\"" | ||||||
|  | 		); | ||||||
|  | 		spirvcross.WaitForExit(); | ||||||
|  | 		if (spirvcross.ExitCode != 0) | ||||||
|  | 		{ | ||||||
|  | 			Console.WriteLine($"refreshc: Could not translate SPIR-V to HLSL"); | ||||||
|  | 			return 1; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,10 @@ | ||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  | 
 | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <OutputType>Exe</OutputType> | ||||||
|  |     <TargetFramework>net7.0</TargetFramework> | ||||||
|  |     <TargetName>refreshc</TargetName> | ||||||
|  | 	<PublishAot>true</PublishAot> | ||||||
|  |   </PropertyGroup> | ||||||
|  | 
 | ||||||
|  | </Project> | ||||||
							
								
								
									
										1030
									
								
								src/Refresh.c
								
								
								
								
							
							
						
						
									
										1030
									
								
								src/Refresh.c
								
								
								
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							|  | @ -1,4 +1,4 @@ | ||||||
| /* Refresh - XNA-inspired 3D Graphics Library with modern capabilities
 | /* Refresh - XNA-inspired 3D Graphics Library with modern capabilities
 | ||||||
|  * |  * | ||||||
|  * Copyright (c) 2020 Evan Hemsley |  * Copyright (c) 2020 Evan Hemsley | ||||||
|  * |  * | ||||||
|  | @ -36,9 +36,15 @@ | ||||||
| 
 | 
 | ||||||
| /* Logging */ | /* Logging */ | ||||||
| 
 | 
 | ||||||
| extern void Refresh_LogInfo(const char *fmt, ...); | #ifdef __cplusplus | ||||||
| extern void Refresh_LogWarn(const char *fmt, ...); | extern "C" { | ||||||
| extern void Refresh_LogError(const char *fmt, ...); | #endif | ||||||
|  | void Refresh_LogInfo(const char *fmt, ...); | ||||||
|  | void Refresh_LogWarn(const char *fmt, ...); | ||||||
|  | void Refresh_LogError(const char *fmt, ...); | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } | ||||||
|  | #endif | ||||||
| 
 | 
 | ||||||
| /* Internal Helper Utilities */ | /* Internal Helper Utilities */ | ||||||
| 
 | 
 | ||||||
|  | @ -51,24 +57,31 @@ static inline uint32_t Texture_GetFormatSize( | ||||||
| 			return 8; | 			return 8; | ||||||
| 		case REFRESH_TEXTUREFORMAT_BC2: | 		case REFRESH_TEXTUREFORMAT_BC2: | ||||||
| 		case REFRESH_TEXTUREFORMAT_BC3: | 		case REFRESH_TEXTUREFORMAT_BC3: | ||||||
|  | 		case REFRESH_TEXTUREFORMAT_BC7: | ||||||
| 			return 16; | 			return 16; | ||||||
| 		case REFRESH_TEXTUREFORMAT_R8: | 		case REFRESH_TEXTUREFORMAT_R8: | ||||||
|  | 		case REFRESH_TEXTUREFORMAT_R8_UINT: | ||||||
| 			return 1; | 			return 1; | ||||||
| 		case REFRESH_TEXTUREFORMAT_R5G6B5: | 		case REFRESH_TEXTUREFORMAT_R5G6B5: | ||||||
| 		case REFRESH_TEXTUREFORMAT_B4G4R4A4: | 		case REFRESH_TEXTUREFORMAT_B4G4R4A4: | ||||||
| 		case REFRESH_TEXTUREFORMAT_A1R5G5B5: | 		case REFRESH_TEXTUREFORMAT_A1R5G5B5: | ||||||
| 		case REFRESH_TEXTUREFORMAT_R16_SFLOAT: | 		case REFRESH_TEXTUREFORMAT_R16_SFLOAT: | ||||||
| 		case REFRESH_TEXTUREFORMAT_R8G8_SNORM: | 		case REFRESH_TEXTUREFORMAT_R8G8_SNORM: | ||||||
|  | 		case REFRESH_TEXTUREFORMAT_R8G8_UINT: | ||||||
|  | 		case REFRESH_TEXTUREFORMAT_R16_UINT: | ||||||
| 			return 2; | 			return 2; | ||||||
| 		case REFRESH_TEXTUREFORMAT_R8G8B8A8: | 		case REFRESH_TEXTUREFORMAT_R8G8B8A8: | ||||||
| 		case REFRESH_TEXTUREFORMAT_R32_SFLOAT: | 		case REFRESH_TEXTUREFORMAT_R32_SFLOAT: | ||||||
| 		case REFRESH_TEXTUREFORMAT_R16G16_SFLOAT: | 		case REFRESH_TEXTUREFORMAT_R16G16_SFLOAT: | ||||||
| 		case REFRESH_TEXTUREFORMAT_R8G8B8A8_SNORM: | 		case REFRESH_TEXTUREFORMAT_R8G8B8A8_SNORM: | ||||||
| 		case REFRESH_TEXTUREFORMAT_A2R10G10B10: | 		case REFRESH_TEXTUREFORMAT_A2R10G10B10: | ||||||
|  | 		case REFRESH_TEXTUREFORMAT_R8G8B8A8_UINT: | ||||||
|  | 		case REFRESH_TEXTUREFORMAT_R16G16_UINT: | ||||||
| 			return 4; | 			return 4; | ||||||
| 		case REFRESH_TEXTUREFORMAT_R16G16B16A16_SFLOAT: | 		case REFRESH_TEXTUREFORMAT_R16G16B16A16_SFLOAT: | ||||||
| 		case REFRESH_TEXTUREFORMAT_R16G16B16A16: | 		case REFRESH_TEXTUREFORMAT_R16G16B16A16: | ||||||
| 		case REFRESH_TEXTUREFORMAT_R32G32_SFLOAT: | 		case REFRESH_TEXTUREFORMAT_R32G32_SFLOAT: | ||||||
|  | 		case REFRESH_TEXTUREFORMAT_R16G16B16A16_UINT: | ||||||
| 			return 8; | 			return 8; | ||||||
| 		case REFRESH_TEXTUREFORMAT_R32G32B32A32_SFLOAT: | 		case REFRESH_TEXTUREFORMAT_R32G32B32A32_SFLOAT: | ||||||
| 			return 16; | 			return 16; | ||||||
|  | @ -117,7 +130,8 @@ static inline uint32_t BytesPerRow( | ||||||
| 
 | 
 | ||||||
| 	if (	format == REFRESH_TEXTUREFORMAT_BC1 || | 	if (	format == REFRESH_TEXTUREFORMAT_BC1 || | ||||||
| 		format == REFRESH_TEXTUREFORMAT_BC2 || | 		format == REFRESH_TEXTUREFORMAT_BC2 || | ||||||
| 		format == REFRESH_TEXTUREFORMAT_BC3	) | 		format == REFRESH_TEXTUREFORMAT_BC3 || | ||||||
|  | 		format == REFRESH_TEXTUREFORMAT_BC7	) | ||||||
| 	{ | 	{ | ||||||
| 		blocksPerRow = (width + 3) / 4; | 		blocksPerRow = (width + 3) / 4; | ||||||
| 	} | 	} | ||||||
|  | @ -135,7 +149,8 @@ static inline int32_t BytesPerImage( | ||||||
| 
 | 
 | ||||||
| 	if (	format == REFRESH_TEXTUREFORMAT_BC1 || | 	if (	format == REFRESH_TEXTUREFORMAT_BC1 || | ||||||
| 		format == REFRESH_TEXTUREFORMAT_BC2 || | 		format == REFRESH_TEXTUREFORMAT_BC2 || | ||||||
| 		format == REFRESH_TEXTUREFORMAT_BC3	) | 		format == REFRESH_TEXTUREFORMAT_BC3 || | ||||||
|  | 		format == REFRESH_TEXTUREFORMAT_BC7 ) | ||||||
| 	{ | 	{ | ||||||
| 		blocksPerRow = (width + 3) / 4; | 		blocksPerRow = (width + 3) / 4; | ||||||
| 		blocksPerColumn = (height + 3) / 4; | 		blocksPerColumn = (height + 3) / 4; | ||||||
|  | @ -151,9 +166,10 @@ static inline int32_t BytesPerImage( | ||||||
| #define MAX_VERTEXTEXTURE_SAMPLERS	4 | #define MAX_VERTEXTEXTURE_SAMPLERS	4 | ||||||
| #define MAX_TOTAL_SAMPLERS		(MAX_TEXTURE_SAMPLERS + MAX_VERTEXTEXTURE_SAMPLERS) | #define MAX_TOTAL_SAMPLERS		(MAX_TEXTURE_SAMPLERS + MAX_VERTEXTEXTURE_SAMPLERS) | ||||||
| 
 | 
 | ||||||
| #define MAX_BUFFER_BINDINGS	        16 | #define MAX_BUFFER_BINDINGS			16 | ||||||
| 
 | 
 | ||||||
| #define MAX_COLOR_TARGET_BINDINGS	4 | #define MAX_COLOR_TARGET_BINDINGS	4 | ||||||
|  | #define MAX_PRESENT_COUNT			16 | ||||||
| 
 | 
 | ||||||
| /* Refresh_Device Definition */ | /* Refresh_Device Definition */ | ||||||
| 
 | 
 | ||||||
|  | @ -167,325 +183,350 @@ struct Refresh_Device | ||||||
| 
 | 
 | ||||||
| 	/* Drawing */ | 	/* Drawing */ | ||||||
| 
 | 
 | ||||||
| 	void (*Clear)( |  | ||||||
|         Refresh_Renderer *driverData, |  | ||||||
|         Refresh_CommandBuffer *commandBuffer, |  | ||||||
|         Refresh_Rect *clearRect, |  | ||||||
|         Refresh_ClearOptions options, |  | ||||||
|         Refresh_Vec4 *colors, |  | ||||||
|         uint32_t colorCount, |  | ||||||
|         Refresh_DepthStencilValue depthStencil |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	void (*DrawInstancedPrimitives)( | 	void (*DrawInstancedPrimitives)( | ||||||
|         Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
|         Refresh_CommandBuffer *commandBuffer, | 		Refresh_CommandBuffer *commandBuffer, | ||||||
|         uint32_t baseVertex, | 		uint32_t baseVertex, | ||||||
|         uint32_t startIndex, | 		uint32_t startIndex, | ||||||
|         uint32_t primitiveCount, | 		uint32_t primitiveCount, | ||||||
|         uint32_t instanceCount, | 		uint32_t instanceCount, | ||||||
|         uint32_t vertexParamOffset, | 		uint32_t vertexParamOffset, | ||||||
|         uint32_t fragmentParamOffset | 		uint32_t fragmentParamOffset | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	void (*DrawIndexedPrimitives)( | 	void (*DrawIndexedPrimitives)( | ||||||
|         Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
|         Refresh_CommandBuffer *commandBuffer, | 		Refresh_CommandBuffer *commandBuffer, | ||||||
|         uint32_t baseVertex, | 		uint32_t baseVertex, | ||||||
|         uint32_t startIndex, | 		uint32_t startIndex, | ||||||
|         uint32_t primitiveCount, | 		uint32_t primitiveCount, | ||||||
|         uint32_t vertexParamOffset, | 		uint32_t vertexParamOffset, | ||||||
|         uint32_t fragmentParamOffset | 		uint32_t fragmentParamOffset | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	void (*DrawPrimitives)( | 	void (*DrawPrimitives)( | ||||||
| 	    Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
|         Refresh_CommandBuffer *commandBuffer, | 		Refresh_CommandBuffer *commandBuffer, | ||||||
|         uint32_t vertexStart, | 		uint32_t vertexStart, | ||||||
|         uint32_t primitiveCount, | 		uint32_t primitiveCount, | ||||||
|         uint32_t vertexParamOffset, | 		uint32_t vertexParamOffset, | ||||||
|         uint32_t fragmentParamOffset | 		uint32_t fragmentParamOffset | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
|     void (*DispatchCompute)( | 	void (*DrawPrimitivesIndirect)( | ||||||
|         Refresh_Renderer *device, | 		Refresh_Renderer *driverData, | ||||||
|         Refresh_CommandBuffer *commandBuffer, | 		Refresh_CommandBuffer *commandBuffer, | ||||||
|         uint32_t groupCountX, | 		Refresh_Buffer *buffer, | ||||||
|         uint32_t groupCountY, | 		uint32_t offsetInBytes, | ||||||
|         uint32_t groupCountZ, | 		uint32_t drawCount, | ||||||
|         uint32_t computeParamOffset | 		uint32_t stride, | ||||||
|     ); | 		uint32_t vertexParamOffset, | ||||||
|  | 		uint32_t fragmentParamOffset | ||||||
|  | 	); | ||||||
| 
 | 
 | ||||||
|     /* State Creation */ | 	void (*DispatchCompute)( | ||||||
|  | 		Refresh_Renderer *device, | ||||||
|  | 		Refresh_CommandBuffer *commandBuffer, | ||||||
|  | 		uint32_t groupCountX, | ||||||
|  | 		uint32_t groupCountY, | ||||||
|  | 		uint32_t groupCountZ, | ||||||
|  | 		uint32_t computeParamOffset | ||||||
|  | 	); | ||||||
| 
 | 
 | ||||||
|     Refresh_RenderPass* (*CreateRenderPass)( | 	/* State Creation */ | ||||||
|         Refresh_Renderer *driverData, |  | ||||||
|         Refresh_RenderPassCreateInfo *renderPassCreateInfo |  | ||||||
|     ); |  | ||||||
| 
 | 
 | ||||||
|     Refresh_ComputePipeline* (*CreateComputePipeline)( | 	Refresh_ComputePipeline* (*CreateComputePipeline)( | ||||||
|         Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
|         Refresh_ComputePipelineCreateInfo *pipelineCreateInfo | 		Refresh_ComputeShaderInfo *computeShaderInfo | ||||||
|     ); | 	); | ||||||
| 
 | 
 | ||||||
|     Refresh_GraphicsPipeline* (*CreateGraphicsPipeline)( | 	Refresh_GraphicsPipeline* (*CreateGraphicsPipeline)( | ||||||
|         Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
|         Refresh_GraphicsPipelineCreateInfo *pipelineCreateInfo | 		Refresh_GraphicsPipelineCreateInfo *pipelineCreateInfo | ||||||
|     ); | 	); | ||||||
| 
 | 
 | ||||||
|     Refresh_Sampler* (*CreateSampler)( | 	Refresh_Sampler* (*CreateSampler)( | ||||||
|         Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
| 	    Refresh_SamplerStateCreateInfo *samplerStateCreateInfo | 		Refresh_SamplerStateCreateInfo *samplerStateCreateInfo | ||||||
|     ); | 	); | ||||||
| 
 | 
 | ||||||
|     Refresh_Framebuffer* (*CreateFramebuffer)( | 	Refresh_ShaderModule* (*CreateShaderModule)( | ||||||
|         Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
|         Refresh_FramebufferCreateInfo *framebufferCreateInfo | 		Refresh_ShaderModuleCreateInfo *shaderModuleCreateInfo | ||||||
|     ); | 	); | ||||||
| 
 | 
 | ||||||
|     Refresh_ShaderModule* (*CreateShaderModule)( | 	Refresh_Texture* (*CreateTexture)( | ||||||
|         Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
| 	    Refresh_ShaderModuleCreateInfo *shaderModuleCreateInfo | 		Refresh_TextureCreateInfo *textureCreateInfo | ||||||
|     ); | 	); | ||||||
| 
 | 
 | ||||||
|     Refresh_Texture* (*CreateTexture)( | 	Refresh_Buffer* (*CreateBuffer)( | ||||||
|         Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
|         Refresh_TextureCreateInfo *textureCreateInfo | 		Refresh_BufferUsageFlags usageFlags, | ||||||
|     ); | 		uint32_t sizeInBytes | ||||||
|  | 	); | ||||||
| 
 | 
 | ||||||
|     Refresh_RenderTarget* (*CreateRenderTarget)( | 	/* Setters */ | ||||||
|         Refresh_Renderer *driverData, |  | ||||||
|         Refresh_TextureSlice *textureSlice, |  | ||||||
|         Refresh_SampleCount multisampleCount |  | ||||||
|     ); |  | ||||||
| 
 | 
 | ||||||
|     Refresh_Buffer* (*CreateBuffer)( | 	void (*SetTextureData)( | ||||||
|         Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
|         Refresh_BufferUsageFlags usageFlags, | 		Refresh_CommandBuffer *commandBuffer, | ||||||
|         uint32_t sizeInBytes | 		Refresh_TextureSlice *textureSlice, | ||||||
|     ); | 		void *data, | ||||||
|  | 		uint32_t dataLengthInBytes | ||||||
|  | 	); | ||||||
| 
 | 
 | ||||||
|     /* Setters */ | 	void (*SetTextureDataYUV)( | ||||||
|  | 		Refresh_Renderer *driverData, | ||||||
|  | 		Refresh_CommandBuffer* commandBuffer, | ||||||
|  | 		Refresh_Texture *y, | ||||||
|  | 		Refresh_Texture *u, | ||||||
|  | 		Refresh_Texture *v, | ||||||
|  | 		uint32_t yWidth, | ||||||
|  | 		uint32_t yHeight, | ||||||
|  | 		uint32_t uvWidth, | ||||||
|  | 		uint32_t uvHeight, | ||||||
|  | 		void *yDataPtr, | ||||||
|  | 		void *uDataPtr, | ||||||
|  | 		void *vDataPtr, | ||||||
|  | 		uint32_t yDataLength, | ||||||
|  | 		uint32_t uvDataLength, | ||||||
|  | 		uint32_t yStride, | ||||||
|  | 		uint32_t uvStride | ||||||
|  | 	); | ||||||
| 
 | 
 | ||||||
|     void(*SetTextureData)( | 	void (*CopyTextureToTexture)( | ||||||
|         Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
|         Refresh_CommandBuffer *commandBuffer, | 		Refresh_CommandBuffer *commandBuffer, | ||||||
|         Refresh_TextureSlice *textureSlice, | 		Refresh_TextureSlice *sourceTextureSlice, | ||||||
|         void *data, | 		Refresh_TextureSlice *destinationTextureSlice, | ||||||
|         uint32_t dataLengthInBytes | 		Refresh_Filter filter | ||||||
|     ); | 	); | ||||||
| 
 | 
 | ||||||
|     void(*SetTextureDataYUV)( | 	void (*CopyTextureToBuffer)( | ||||||
|         Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
|         Refresh_CommandBuffer* commandBuffer, | 		Refresh_CommandBuffer *commandBuffer, | ||||||
|         Refresh_Texture *y, | 		Refresh_TextureSlice *textureSlice, | ||||||
|         Refresh_Texture *u, | 		Refresh_Buffer *buffer | ||||||
|         Refresh_Texture *v, | 	); | ||||||
|         uint32_t yWidth, |  | ||||||
|         uint32_t yHeight, |  | ||||||
|         uint32_t uvWidth, |  | ||||||
|         uint32_t uvHeight, |  | ||||||
|         void* data, |  | ||||||
|         uint32_t dataLength |  | ||||||
|     ); |  | ||||||
| 
 | 
 | ||||||
|     void(*CopyTextureToTexture)( | 	void (*SetBufferData)( | ||||||
|         Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
|         Refresh_CommandBuffer *commandBuffer, | 		Refresh_CommandBuffer *commandBuffer, | ||||||
|         Refresh_TextureSlice *sourceTextureSlice, | 		Refresh_Buffer *buffer, | ||||||
|         Refresh_TextureSlice *destinationTextureSlice, | 		uint32_t offsetInBytes, | ||||||
|         Refresh_Filter filter | 		void* data, | ||||||
|     ); | 		uint32_t dataLength | ||||||
|  | 	); | ||||||
| 
 | 
 | ||||||
|     void(*CopyTextureToBuffer)( | 	uint32_t (*PushVertexShaderUniforms)( | ||||||
|         Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
|         Refresh_CommandBuffer *commandBuffer, | 		Refresh_CommandBuffer *commandBuffer, | ||||||
|         Refresh_TextureSlice *textureSlice, | 		void *data, | ||||||
|         Refresh_Buffer *buffer | 		uint32_t dataLengthInBytes | ||||||
|     ); | 	); | ||||||
| 
 | 
 | ||||||
|     void(*SetBufferData)( | 	uint32_t (*PushFragmentShaderUniforms)( | ||||||
|         Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
|         Refresh_CommandBuffer *commandBuffer, | 		Refresh_CommandBuffer *commandBuffer, | ||||||
|         Refresh_Buffer *buffer, | 		void *data, | ||||||
|         uint32_t offsetInBytes, | 		uint32_t dataLengthInBytes | ||||||
|         void* data, | 	); | ||||||
|         uint32_t dataLength |  | ||||||
|     ); |  | ||||||
| 
 | 
 | ||||||
|     uint32_t(*PushVertexShaderUniforms)( | 	uint32_t (*PushComputeShaderUniforms)( | ||||||
|         Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
|         Refresh_CommandBuffer *commandBuffer, | 		Refresh_CommandBuffer *commandBuffer, | ||||||
|         void *data, | 		void *data, | ||||||
|         uint32_t dataLengthInBytes | 		uint32_t dataLengthInBytes | ||||||
|     ); | 	); | ||||||
| 
 | 
 | ||||||
|     uint32_t(*PushFragmentShaderUniforms)( | 	void (*BindVertexSamplers)( | ||||||
|         Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
|         Refresh_CommandBuffer *commandBuffer, | 		Refresh_CommandBuffer *commandBuffer, | ||||||
|         void *data, | 		Refresh_Texture **pTextures, | ||||||
|         uint32_t dataLengthInBytes | 		Refresh_Sampler **pSamplers | ||||||
|     ); | 	); | ||||||
| 
 | 
 | ||||||
|     uint32_t (*PushComputeShaderUniforms)( | 	void (*BindFragmentSamplers)( | ||||||
|         Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
|         Refresh_CommandBuffer *commandBuffer, | 		Refresh_CommandBuffer *commandBuffer, | ||||||
|         void *data, | 		Refresh_Texture **pTextures, | ||||||
|         uint32_t dataLengthInBytes | 		Refresh_Sampler **pSamplers | ||||||
|     ); | 	); | ||||||
| 
 | 
 | ||||||
|     void(*BindVertexSamplers)( | 	/* Getters */ | ||||||
|         Refresh_Renderer *driverData, |  | ||||||
|         Refresh_CommandBuffer *commandBuffer, |  | ||||||
|         Refresh_Texture **pTextures, |  | ||||||
|         Refresh_Sampler **pSamplers |  | ||||||
|     ); |  | ||||||
| 
 | 
 | ||||||
|     void(*BindFragmentSamplers)( | 	void (*GetBufferData)( | ||||||
|         Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
|         Refresh_CommandBuffer *commandBuffer, | 		Refresh_Buffer *buffer, | ||||||
|         Refresh_Texture **pTextures, | 		void *data, | ||||||
|         Refresh_Sampler **pSamplers | 		uint32_t dataLengthInBytes | ||||||
|     ); | 	); | ||||||
| 
 | 
 | ||||||
|     /* Getters */ | 	/* Disposal */ | ||||||
| 
 | 
 | ||||||
|     void(*GetBufferData)( | 	void (*QueueDestroyTexture)( | ||||||
|         Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
|         Refresh_Buffer *buffer, | 		Refresh_Texture *texture | ||||||
|         void *data, | 	); | ||||||
|         uint32_t dataLengthInBytes |  | ||||||
|     ); |  | ||||||
| 
 | 
 | ||||||
|     /* Disposal */ | 	void (*QueueDestroySampler)( | ||||||
|  | 		Refresh_Renderer *driverData, | ||||||
|  | 		Refresh_Sampler *sampler | ||||||
|  | 	); | ||||||
| 
 | 
 | ||||||
|     void(*QueueDestroyTexture)( | 	void (*QueueDestroyBuffer)( | ||||||
|         Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
|         Refresh_Texture *texture | 		Refresh_Buffer *buffer | ||||||
|     ); | 	); | ||||||
| 
 | 
 | ||||||
|     void(*QueueDestroySampler)( | 	void (*QueueDestroyShaderModule)( | ||||||
|         Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
|         Refresh_Sampler *sampler | 		Refresh_ShaderModule *shaderModule | ||||||
|     ); | 	); | ||||||
| 
 | 
 | ||||||
|     void(*QueueDestroyBuffer)( | 	void (*QueueDestroyComputePipeline)( | ||||||
|         Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
|         Refresh_Buffer *buffer | 		Refresh_ComputePipeline *computePipeline | ||||||
|     ); | 	); | ||||||
| 
 | 
 | ||||||
|     void(*QueueDestroyRenderTarget)( | 	void (*QueueDestroyGraphicsPipeline)( | ||||||
|         Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
| 	    Refresh_RenderTarget *renderTarget | 		Refresh_GraphicsPipeline *graphicsPipeline | ||||||
|     ); | 	); | ||||||
| 
 | 
 | ||||||
|     void(*QueueDestroyFramebuffer)( | 	/* Graphics State */ | ||||||
|         Refresh_Renderer *driverData, |  | ||||||
|         Refresh_Framebuffer *frameBuffer |  | ||||||
|     ); |  | ||||||
| 
 | 
 | ||||||
|     void(*QueueDestroyShaderModule)( | 	void (*BeginRenderPass)( | ||||||
|         Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
|         Refresh_ShaderModule *shaderModule | 		Refresh_CommandBuffer *commandBuffer, | ||||||
|     ); | 		Refresh_ColorAttachmentInfo *colorAttachmentInfos, | ||||||
|  | 		uint32_t colorAttachmentCount, | ||||||
|  | 		Refresh_DepthStencilAttachmentInfo *depthStencilAttachmentInfo | ||||||
|  | 	); | ||||||
| 
 | 
 | ||||||
|     void(*QueueDestroyRenderPass)( | 	void (*EndRenderPass)( | ||||||
|         Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
|         Refresh_RenderPass *renderPass | 		Refresh_CommandBuffer *commandBuffer | ||||||
|     ); | 	); | ||||||
| 
 | 
 | ||||||
|     void(*QueueDestroyComputePipeline)( | 	void (*SetViewport)( | ||||||
|         Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
|         Refresh_ComputePipeline *computePipeline | 		Refresh_CommandBuffer *commandBuffer, | ||||||
|     ); | 		Refresh_Viewport *viewport | ||||||
|  | 	); | ||||||
| 
 | 
 | ||||||
|     void(*QueueDestroyGraphicsPipeline)( | 	void (*SetScissor)( | ||||||
|         Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
|         Refresh_GraphicsPipeline *graphicsPipeline | 		Refresh_CommandBuffer *commandBuffer, | ||||||
|     ); | 		Refresh_Rect *scissor | ||||||
|  | 	); | ||||||
| 
 | 
 | ||||||
|     /* Graphics State */ | 	void (*BindGraphicsPipeline)( | ||||||
|  | 		Refresh_Renderer *driverData, | ||||||
|  | 		Refresh_CommandBuffer *commandBuffer, | ||||||
|  | 		Refresh_GraphicsPipeline *graphicsPipeline | ||||||
|  | 	); | ||||||
| 
 | 
 | ||||||
|     void(*BeginRenderPass)( | 	void (*BindVertexBuffers)( | ||||||
|         Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
|         Refresh_CommandBuffer *commandBuffer, | 		Refresh_CommandBuffer *commandBuffer, | ||||||
|         Refresh_RenderPass *renderPass, | 		uint32_t firstBinding, | ||||||
|         Refresh_Framebuffer *framebuffer, | 		uint32_t bindingCount, | ||||||
|         Refresh_Rect *renderArea, | 		Refresh_Buffer **pBuffers, | ||||||
|         Refresh_Vec4 *pColorClearValues, | 		uint64_t *pOffsets | ||||||
|         uint32_t colorClearCount, | 	); | ||||||
|         Refresh_DepthStencilValue *depthStencilClearValue |  | ||||||
|     ); |  | ||||||
| 
 | 
 | ||||||
|     void(*EndRenderPass)( | 	void (*BindIndexBuffer)( | ||||||
|         Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
|         Refresh_CommandBuffer *commandBuffer | 		Refresh_CommandBuffer *commandBuffer, | ||||||
|     ); | 		Refresh_Buffer *buffer, | ||||||
|  | 		uint64_t offset, | ||||||
|  | 		Refresh_IndexElementSize indexElementSize | ||||||
|  | 	); | ||||||
| 
 | 
 | ||||||
|     void(*BindGraphicsPipeline)( | 	void (*BindComputePipeline)( | ||||||
|         Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
|         Refresh_CommandBuffer *commandBuffer, | 		Refresh_CommandBuffer *commandBuffer, | ||||||
|         Refresh_GraphicsPipeline *graphicsPipeline | 		Refresh_ComputePipeline *computePipeline | ||||||
|     ); | 	); | ||||||
| 
 | 
 | ||||||
|     void(*BindVertexBuffers)( | 	void (*BindComputeBuffers)( | ||||||
|         Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
|         Refresh_CommandBuffer *commandBuffer, | 		Refresh_CommandBuffer *commandBuffer, | ||||||
|         uint32_t firstBinding, | 		Refresh_Buffer **pBuffers | ||||||
|         uint32_t bindingCount, | 	); | ||||||
|         Refresh_Buffer **pBuffers, |  | ||||||
|         uint64_t *pOffsets |  | ||||||
|     ); |  | ||||||
| 
 | 
 | ||||||
|     void(*BindIndexBuffer)( | 	void (*BindComputeTextures)( | ||||||
|         Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
|         Refresh_CommandBuffer *commandBuffer, | 		Refresh_CommandBuffer *commandBuffer, | ||||||
|         Refresh_Buffer *buffer, | 		Refresh_Texture **pTextures | ||||||
|         uint64_t offset, | 	); | ||||||
|         Refresh_IndexElementSize indexElementSize |  | ||||||
|     ); |  | ||||||
| 
 | 
 | ||||||
|     void(*BindComputePipeline)( | 	uint8_t (*ClaimWindow)( | ||||||
|         Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
|         Refresh_CommandBuffer *commandBuffer, | 		void *windowHandle, | ||||||
|         Refresh_ComputePipeline *computePipeline | 		Refresh_PresentMode presentMode | ||||||
|     ); | 	); | ||||||
| 
 | 
 | ||||||
|     void(*BindComputeBuffers)( | 	void (*UnclaimWindow)( | ||||||
|         Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
|         Refresh_CommandBuffer *commandBuffer, |  | ||||||
|         Refresh_Buffer **pBuffers |  | ||||||
|     ); |  | ||||||
| 
 |  | ||||||
|     void(*BindComputeTextures)( |  | ||||||
|         Refresh_Renderer *driverData, |  | ||||||
|         Refresh_CommandBuffer *commandBuffer, |  | ||||||
|         Refresh_Texture **pTextures |  | ||||||
|     ); |  | ||||||
| 
 |  | ||||||
|     Refresh_CommandBuffer* (*AcquireCommandBuffer)( |  | ||||||
|         Refresh_Renderer *driverData, |  | ||||||
|         uint8_t fixed |  | ||||||
|     ); |  | ||||||
| 
 |  | ||||||
|     void(*QueuePresent)( |  | ||||||
|         Refresh_Renderer *driverData, |  | ||||||
|         Refresh_CommandBuffer *commandBuffer, |  | ||||||
|         Refresh_TextureSlice *textureSlice, |  | ||||||
|         Refresh_Rect *destinationRectangle, |  | ||||||
|         Refresh_Filter filter, |  | ||||||
| 		void *windowHandle | 		void *windowHandle | ||||||
|     ); | 	); | ||||||
| 
 | 
 | ||||||
|     void(*Submit)( | 	Refresh_CommandBuffer* (*AcquireCommandBuffer)( | ||||||
|         Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData | ||||||
|         uint32_t commandBufferCount, | 	); | ||||||
|         Refresh_CommandBuffer **pCommandBuffers |  | ||||||
|     ); |  | ||||||
| 
 | 
 | ||||||
|     void(*Wait)( | 	Refresh_Texture* (*AcquireSwapchainTexture)( | ||||||
|         Refresh_Renderer *driverData | 		Refresh_Renderer *driverData, | ||||||
|     ); | 		Refresh_CommandBuffer *commandBuffer, | ||||||
|  | 		void *windowHandle, | ||||||
|  | 		uint32_t *pWidth, | ||||||
|  | 		uint32_t *pHeight | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	Refresh_TextureFormat (*GetSwapchainFormat)( | ||||||
|  | 		Refresh_Renderer *driverData, | ||||||
|  | 		void *windowHandle | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	void (*SetSwapchainPresentMode)( | ||||||
|  | 		Refresh_Renderer *driverData, | ||||||
|  | 		void *windowHandle, | ||||||
|  | 		Refresh_PresentMode presentMode | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	void (*Submit)( | ||||||
|  | 		Refresh_Renderer *driverData, | ||||||
|  | 		Refresh_CommandBuffer *commandBuffer | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	Refresh_Fence* (*SubmitAndAcquireFence)( | ||||||
|  | 		Refresh_Renderer *driverData, | ||||||
|  | 		Refresh_CommandBuffer *commandBuffer | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	void (*Wait)( | ||||||
|  | 		Refresh_Renderer *driverData | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	void (*WaitForFences)( | ||||||
|  | 		Refresh_Renderer *driverData, | ||||||
|  | 		uint8_t waitAll, | ||||||
|  | 		uint32_t fenceCount, | ||||||
|  | 		Refresh_Fence **pFences | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	int (*QueryFence)( | ||||||
|  | 		Refresh_Renderer *driverData, | ||||||
|  | 		Refresh_Fence *fence | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	void (*ReleaseFence)( | ||||||
|  | 		Refresh_Renderer *driverData, | ||||||
|  | 		Refresh_Fence *fence | ||||||
|  | 	); | ||||||
| 
 | 
 | ||||||
| 	/* Opaque pointer for the Driver */ | 	/* Opaque pointer for the Driver */ | ||||||
| 	Refresh_Renderer *driverData; | 	Refresh_Renderer *driverData; | ||||||
|  | @ -495,63 +536,68 @@ struct Refresh_Device | ||||||
| 	result->func = name##_##func; | 	result->func = name##_##func; | ||||||
| #define ASSIGN_DRIVER(name) \ | #define ASSIGN_DRIVER(name) \ | ||||||
| 	ASSIGN_DRIVER_FUNC(DestroyDevice, name) \ | 	ASSIGN_DRIVER_FUNC(DestroyDevice, name) \ | ||||||
| 	ASSIGN_DRIVER_FUNC(Clear, name) \ |  | ||||||
| 	ASSIGN_DRIVER_FUNC(DrawIndexedPrimitives, name) \ | 	ASSIGN_DRIVER_FUNC(DrawIndexedPrimitives, name) \ | ||||||
| 	ASSIGN_DRIVER_FUNC(DrawInstancedPrimitives, name) \ | 	ASSIGN_DRIVER_FUNC(DrawInstancedPrimitives, name) \ | ||||||
| 	ASSIGN_DRIVER_FUNC(DrawPrimitives, name) \ | 	ASSIGN_DRIVER_FUNC(DrawPrimitives, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(DispatchCompute, name) \ | 	ASSIGN_DRIVER_FUNC(DrawPrimitivesIndirect, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(CreateRenderPass, name) \ | 	ASSIGN_DRIVER_FUNC(DispatchCompute, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(CreateComputePipeline, name) \ | 	ASSIGN_DRIVER_FUNC(CreateComputePipeline, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(CreateGraphicsPipeline, name) \ | 	ASSIGN_DRIVER_FUNC(CreateGraphicsPipeline, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(CreateSampler, name) \ | 	ASSIGN_DRIVER_FUNC(CreateSampler, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(CreateFramebuffer, name) \ | 	ASSIGN_DRIVER_FUNC(CreateShaderModule, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(CreateShaderModule, name) \ | 	ASSIGN_DRIVER_FUNC(CreateTexture, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(CreateTexture, name) \ | 	ASSIGN_DRIVER_FUNC(CreateBuffer, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(CreateRenderTarget, name) \ | 	ASSIGN_DRIVER_FUNC(SetTextureData, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(CreateBuffer, name) \ | 	ASSIGN_DRIVER_FUNC(SetTextureDataYUV, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(SetTextureData, name) \ | 	ASSIGN_DRIVER_FUNC(CopyTextureToTexture, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(SetTextureDataYUV, name) \ | 	ASSIGN_DRIVER_FUNC(CopyTextureToBuffer, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(CopyTextureToTexture, name) \ | 	ASSIGN_DRIVER_FUNC(SetBufferData, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(CopyTextureToBuffer, name) \ | 	ASSIGN_DRIVER_FUNC(PushVertexShaderUniforms, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(SetBufferData, name) \ | 	ASSIGN_DRIVER_FUNC(PushFragmentShaderUniforms, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(PushVertexShaderUniforms, name) \ | 	ASSIGN_DRIVER_FUNC(PushComputeShaderUniforms, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(PushFragmentShaderUniforms, name) \ | 	ASSIGN_DRIVER_FUNC(BindVertexSamplers, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(PushComputeShaderUniforms, name) \ | 	ASSIGN_DRIVER_FUNC(BindFragmentSamplers, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(BindVertexSamplers, name) \ | 	ASSIGN_DRIVER_FUNC(GetBufferData, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(BindFragmentSamplers, name) \ | 	ASSIGN_DRIVER_FUNC(QueueDestroyTexture, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(GetBufferData, name) \ | 	ASSIGN_DRIVER_FUNC(QueueDestroySampler, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(QueueDestroyTexture, name) \ | 	ASSIGN_DRIVER_FUNC(QueueDestroyBuffer, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(QueueDestroySampler, name) \ | 	ASSIGN_DRIVER_FUNC(QueueDestroyShaderModule, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(QueueDestroyBuffer, name) \ | 	ASSIGN_DRIVER_FUNC(QueueDestroyComputePipeline, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(QueueDestroyRenderTarget, name) \ | 	ASSIGN_DRIVER_FUNC(QueueDestroyGraphicsPipeline, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(QueueDestroyFramebuffer, name) \ | 	ASSIGN_DRIVER_FUNC(BeginRenderPass, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(QueueDestroyShaderModule, name) \ | 	ASSIGN_DRIVER_FUNC(EndRenderPass, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(QueueDestroyRenderPass, name) \ | 	ASSIGN_DRIVER_FUNC(SetViewport, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(QueueDestroyComputePipeline, name) \ | 	ASSIGN_DRIVER_FUNC(SetScissor, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(QueueDestroyGraphicsPipeline, name) \ | 	ASSIGN_DRIVER_FUNC(BindGraphicsPipeline, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(BeginRenderPass, name) \ | 	ASSIGN_DRIVER_FUNC(BindVertexBuffers, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(EndRenderPass, name) \ | 	ASSIGN_DRIVER_FUNC(BindIndexBuffer, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(BindGraphicsPipeline, name) \ | 	ASSIGN_DRIVER_FUNC(BindComputePipeline, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(BindVertexBuffers, name) \ | 	ASSIGN_DRIVER_FUNC(BindComputeBuffers, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(BindIndexBuffer, name) \ | 	ASSIGN_DRIVER_FUNC(BindComputeTextures, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(BindComputePipeline, name) \ | 	ASSIGN_DRIVER_FUNC(ClaimWindow, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(BindComputeBuffers, name) \ | 	ASSIGN_DRIVER_FUNC(UnclaimWindow, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(BindComputeTextures, name) \ | 	ASSIGN_DRIVER_FUNC(AcquireCommandBuffer, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(AcquireCommandBuffer, name) \ | 	ASSIGN_DRIVER_FUNC(AcquireSwapchainTexture, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(QueuePresent, name) \ | 	ASSIGN_DRIVER_FUNC(GetSwapchainFormat, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(Submit, name) \ | 	ASSIGN_DRIVER_FUNC(SetSwapchainPresentMode, name) \ | ||||||
|     ASSIGN_DRIVER_FUNC(Wait, name) | 	ASSIGN_DRIVER_FUNC(Submit, name) \ | ||||||
|  | 	ASSIGN_DRIVER_FUNC(SubmitAndAcquireFence, name) \ | ||||||
|  | 	ASSIGN_DRIVER_FUNC(Wait, name) \ | ||||||
|  | 	ASSIGN_DRIVER_FUNC(WaitForFences, name) \ | ||||||
|  | 	ASSIGN_DRIVER_FUNC(QueryFence, name) \ | ||||||
|  | 	ASSIGN_DRIVER_FUNC(ReleaseFence, name) | ||||||
| 
 | 
 | ||||||
| typedef struct Refresh_Driver | typedef struct Refresh_Driver | ||||||
| { | { | ||||||
| 	const char *Name; | 	const char *Name; | ||||||
|  | 	uint8_t (*PrepareDriver)(uint32_t *flags); | ||||||
| 	Refresh_Device* (*CreateDevice)( | 	Refresh_Device* (*CreateDevice)( | ||||||
| 		Refresh_PresentationParameters *presentationParameters, | 		uint8_t debugMode | ||||||
|         uint8_t debugMode |  | ||||||
| 	); | 	); | ||||||
| } Refresh_Driver; | } Refresh_Driver; | ||||||
| 
 | 
 | ||||||
| extern Refresh_Driver VulkanDriver; | extern Refresh_Driver VulkanDriver; | ||||||
|  | extern Refresh_Driver PS5Driver; | ||||||
| 
 | 
 | ||||||
| #endif /* REFRESH_DRIVER_H */ | #endif /* REFRESH_DRIVER_H */ | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -0,0 +1,707 @@ | ||||||
|  | /* Refresh - XNA-inspired 3D Graphics Library with modern capabilities | ||||||
|  |  * | ||||||
|  |  * Copyright (c) 2020 Evan Hemsley | ||||||
|  |  * | ||||||
|  |  * This software is provided 'as-is', without any express or implied warranty. | ||||||
|  |  * In no event will the authors be held liable for any damages arising from | ||||||
|  |  * the use of this software. | ||||||
|  |  * | ||||||
|  |  * Permission is granted to anyone to use this software for any purpose, | ||||||
|  |  * including commercial applications, and to alter it and redistribute it | ||||||
|  |  * freely, subject to the following restrictions: | ||||||
|  |  * | ||||||
|  |  * 1. The origin of this software must not be misrepresented; you must not | ||||||
|  |  * claim that you wrote the original software. If you use this software in a | ||||||
|  |  * product, an acknowledgment in the product documentation would be | ||||||
|  |  * appreciated but is not required. | ||||||
|  |  * | ||||||
|  |  * 2. Altered source versions must be plainly marked as such, and must not be | ||||||
|  |  * misrepresented as being the original software. | ||||||
|  |  * | ||||||
|  |  * 3. This notice may not be removed or altered from any source distribution. | ||||||
|  |  * | ||||||
|  |  * Evan "cosmonaut" Hemsley <evan@moonside.games> | ||||||
|  |  * | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #if REFRESH_DRIVER_TEMPLATE | ||||||
|  | 
 | ||||||
|  | #include "Refresh_Driver.h" | ||||||
|  | 
 | ||||||
|  | #include <SDL.h> | ||||||
|  | 
 | ||||||
|  | #define NOT_IMPLEMENTED SDL_assert(0 && "Not implemented!"); | ||||||
|  | 
 | ||||||
|  | /* Conversions */ | ||||||
|  | 
 | ||||||
|  | static TEMPLATE_SURFACE_FORMAT_TYPE RefreshToTEMPLATE_SurfaceFormat[] = | ||||||
|  | { | ||||||
|  | 	0,	/* R8G8B8A8 */ | ||||||
|  | 	0,	/* B8G8R8A8 */ | ||||||
|  | 	0,	/* R5G6B5 */ | ||||||
|  | 	0,	/* A1R5G5B5 */ | ||||||
|  | 	0,	/* B4G4R4A4 */ | ||||||
|  | 	0,	/* BC1 */ | ||||||
|  | 	0,	/* BC3 */ | ||||||
|  | 	0,	/* BC5 */ | ||||||
|  | 	0,	/* R8G8_SNORM */ | ||||||
|  | 	0,	/* R8G8B8A8_SNORM */ | ||||||
|  | 	0,	/* A2R10G10B10 */ | ||||||
|  | 	0,	/* R16G16 */ | ||||||
|  | 	0,	/* R16G16B16A16 */ | ||||||
|  | 	0,	/* R8 */ | ||||||
|  | 	0,	/* R32_SFLOAT */ | ||||||
|  | 	0,	/* R32G32_SFLOAT */ | ||||||
|  | 	0,	/* R32G32B32A32_SFLOAT */ | ||||||
|  | 	0,	/* R16_SFLOAT */ | ||||||
|  | 	0,	/* R16G16_SFLOAT */ | ||||||
|  | 	0,	/* R16G16B16A16_SFLOAT */ | ||||||
|  | 	0,	/* D16 */ | ||||||
|  | 	0,	/* D32 */ | ||||||
|  | 	0,	/* D16S8 */ | ||||||
|  | 	0	/* D32S8 */ | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | static TEMPLATE_VERTEX_FORMAT_TYPE RefreshToTEMPLATE_VertexFormat[] = | ||||||
|  | { | ||||||
|  | 	0,	/* SINGLE */ | ||||||
|  | 	0,	/* VECTOR2 */ | ||||||
|  | 	0,	/* VECTOR3 */ | ||||||
|  | 	0,	/* VECTOR4 */ | ||||||
|  | 	0,	/* COLOR */ | ||||||
|  | 	0,	/* BYTE4 */ | ||||||
|  | 	0,	/* SHORT2 */ | ||||||
|  | 	0,	/* SHORT4 */ | ||||||
|  | 	0,	/* NORMALIZEDSHORT2 */ | ||||||
|  | 	0,	/* NORMALIZEDSHORT4 */ | ||||||
|  | 	0,	/* HALFVECTOR2 */ | ||||||
|  | 	0	/* HALFVECTOR4 */ | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | static TEMPLATE_INDEX_TYPE RefreshToTEMPLATE_IndexType[] = | ||||||
|  | { | ||||||
|  | 	0,	/* 16BIT */ | ||||||
|  | 	0	/* 32BIT */ | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | static TEMPLATE_PRIMITIVE_TYPE RefreshToTEMPLATE_PrimitiveType[] = | ||||||
|  | { | ||||||
|  | 	0,	/* POINTLIST */ | ||||||
|  | 	0,	/* LINELIST */ | ||||||
|  | 	0,	/* LINESTRIP */ | ||||||
|  | 	0,	/* TRIANGLELIST */ | ||||||
|  | 	0	/* TRIANGLESTRIP */ | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | static TEMPLATE_POLYGON_MODE_TYPE RefreshToTEMPLATE_PolygonMode[] = | ||||||
|  | { | ||||||
|  | 	0,	/* FILL */ | ||||||
|  | 	0,	/* LINE */ | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | static TEMPLATE_CULL_MODE_TYPE RefreshToTEMPLATE_CullMode[] = | ||||||
|  | { | ||||||
|  | 	0,	/* NONE */ | ||||||
|  | 	0,	/* FRONT */ | ||||||
|  | 	0,	/* BACK */ | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | static TEMPLATE_FRONT_FACE_TYPE RefreshToTEMPLATE_FrontFace[] = | ||||||
|  | { | ||||||
|  | 	0,	/* COUNTER_CLOCKWISE */ | ||||||
|  | 	0	/* CLOCKWISE */ | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | static TEMPLATE_BLEND_FACTOR_TYPE RefreshToTEMPLATE_BlendFactor[] = | ||||||
|  | { | ||||||
|  | 	0,	/* ZERO */ | ||||||
|  | 	0,	/* ONE */ | ||||||
|  | 	0,	/* SRC_COLOR */ | ||||||
|  | 	0,	/* ONE_MINUS_SRC_COLOR */ | ||||||
|  | 	0,	/* DST_COLOR */ | ||||||
|  | 	0,	/* ONE_MINUS_DST_COLOR */ | ||||||
|  | 	0,	/* SRC_ALPHA */ | ||||||
|  | 	0,	/* ONE_MINUS_SRC_ALPHA */ | ||||||
|  | 	0,	/* DST_ALPHA */ | ||||||
|  | 	0,	/* ONE_MINUS_DST_ALPHA */ | ||||||
|  | 	0,	/* CONSTANT_COLOR */ | ||||||
|  | 	0,	/* ONE_MINUS_CONSTANT_COLOR */ | ||||||
|  | 	0	/* SRC_ALPHA_SATURATE */ | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | static TEMPLATE_BLEND_OP_TYPE RefreshToTEMPLATE_BlendOp[] = | ||||||
|  | { | ||||||
|  | 	0,	/* ADD */ | ||||||
|  | 	0,	/* SUBTRACT */ | ||||||
|  | 	0,	/* REVERSE_SUBTRACT */ | ||||||
|  | 	0,	/* MIN */ | ||||||
|  | 	0	/* MAX */ | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | static TEMPLATE_COMPARE_OP_TYPE RefreshToTEMPLATE_CompareOp[] = | ||||||
|  | { | ||||||
|  | 	0,	/* NEVER */ | ||||||
|  | 	0,	/* LESS */ | ||||||
|  | 	0,	/* EQUAL */ | ||||||
|  | 	0,	/* LESS_OR_EQUAL */ | ||||||
|  | 	0,	/* GREATER */ | ||||||
|  | 	0,	/* NOT_EQUAL */ | ||||||
|  | 	0,	/* GREATER_OR_EQUAL */ | ||||||
|  | 	0	/* ALWAYS */ | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | static TEMPLATE_STENCIL_OP_TYPE RefreshToTEMPLATE_StencilOp[] = | ||||||
|  | { | ||||||
|  | 	0,	/* KEEP */ | ||||||
|  | 	0,	/* ZERO */ | ||||||
|  | 	0,	/* REPLACE */ | ||||||
|  | 	0,	/* INCREMENT_AND_CLAMP */ | ||||||
|  | 	0,	/* DECREMENT_AND_CLAMP */ | ||||||
|  | 	0,	/* INVERT */ | ||||||
|  | 	0,	/* INCREMENT_AND_WRAP */ | ||||||
|  | 	0	/* DECREMENT_AND_WRAP */ | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | static TEMPLATE_ATTACHMENT_LOAD_OP_TYPE RefreshToTEMPLATE_LoadOp[] = | ||||||
|  | { | ||||||
|  | 	0,	/* LOAD */ | ||||||
|  | 	0,	/* CLEAR */ | ||||||
|  | 	0	/* DONT_CARE */ | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | static TEMPLATE_ATTACHMENT_STORE_OP_TYPE RefreshToTEMPLATE_StoreOp[] = | ||||||
|  | { | ||||||
|  | 	0,	/* STORE */ | ||||||
|  | 	0	/* DONT_CARE */ | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | static TEMPLATE_SAMPLE_COUNT_TYPE RefreshToTEMPLATE_SampleCount[] = | ||||||
|  | { | ||||||
|  | 	0,	/* 1 */ | ||||||
|  | 	0,	/* 2 */ | ||||||
|  | 	0,	/* 4 */ | ||||||
|  | 	0,	/* 8 */ | ||||||
|  | 	0,	/* 16 */ | ||||||
|  | 	0,	/* 32 */ | ||||||
|  | 	0	/* 64 */ | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | static TEMPLATE_VERTEX_INPUT_RATE_TYPE RefreshToTEMPLATE_VertexInputRate[] = | ||||||
|  | { | ||||||
|  | 	0,	/* VERTEX */ | ||||||
|  | 	0	/* INSTANCE */ | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | static TEMPLATE_FILTER_TYPE RefreshToTEMPLATE_Filter[] = | ||||||
|  | { | ||||||
|  | 	0,	/* NEAREST */ | ||||||
|  | 	0,	/* LINEAR */ | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | static TEMPLATE_SAMPLER_MIPMAP_MODE_TYPE RefreshToTEMPLATE_SamplerMipmapMode[] = | ||||||
|  | { | ||||||
|  | 	0,	/* NEAREST */ | ||||||
|  | 	0	/* LINEAR */ | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | static TEMPLATE_SAMPLER_ADDRESS_MODE_TYPE RefreshToTEMPLATE_SamplerAddressMode[] = | ||||||
|  | { | ||||||
|  | 	0,	/* REPEAT */ | ||||||
|  | 	0,	/* MIRRORED_REPEAT */ | ||||||
|  | 	0,	/* CLAMP_TO_EDGE */ | ||||||
|  | 	0	/* CLAMP_TO_BORDER */ | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | static TEMPLATE_BORDER_COLOR_TYPE RefreshToTEMPLATE_BorderColor[] = | ||||||
|  | { | ||||||
|  | 	0,	/* FLOAT_TRANSPARENT_BLACK */ | ||||||
|  | 	0,	/* INT_TRANSPARENT_BLACK */ | ||||||
|  | 	0,	/* FLOAT_OPAQUE_BLACK */ | ||||||
|  | 	0,	/* INT_OPAQUE_BLACK */ | ||||||
|  | 	0,	/* FLOAT_OPAQUE_WHITE */ | ||||||
|  | 	0	/* INT_OPAQUE_WHITE */ | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /* Quit */ | ||||||
|  | 
 | ||||||
|  | static void TEMPLATE_DestroyDevice( | ||||||
|  | 	Refresh_Device *device | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* Drawing */ | ||||||
|  | 
 | ||||||
|  | static void TEMPLATE_DrawInstancedPrimitives( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	Refresh_CommandBuffer *commandBuffer, | ||||||
|  | 	uint32_t baseVertex, | ||||||
|  | 	uint32_t startIndex, | ||||||
|  | 	uint32_t primitiveCount, | ||||||
|  | 	uint32_t instanceCount, | ||||||
|  | 	uint32_t vertexParamOffset, | ||||||
|  | 	uint32_t fragmentParamOffset | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void TEMPLATE_DrawIndexedPrimitives( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	Refresh_CommandBuffer *commandBuffer, | ||||||
|  | 	uint32_t baseVertex, | ||||||
|  | 	uint32_t startIndex, | ||||||
|  | 	uint32_t primitiveCount, | ||||||
|  | 	uint32_t vertexParamOffset, | ||||||
|  | 	uint32_t fragmentParamOffset | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void TEMPLATE_DrawPrimitives( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	Refresh_CommandBuffer *commandBuffer, | ||||||
|  | 	uint32_t vertexStart, | ||||||
|  | 	uint32_t primitiveCount, | ||||||
|  | 	uint32_t vertexParamOffset, | ||||||
|  | 	uint32_t fragmentParamOffset | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void TEMPLATE_DrawPrimitivesIndirect( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	Refresh_CommandBuffer *commandBuffer, | ||||||
|  | 	Refresh_Buffer *buffer, | ||||||
|  | 	uint32_t offsetInBytes, | ||||||
|  | 	uint32_t drawCount, | ||||||
|  | 	uint32_t stride, | ||||||
|  | 	uint32_t vertexParamOffset, | ||||||
|  | 	uint32_t fragmentParamOffset | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void TEMPLATE_DispatchCompute( | ||||||
|  | 	Refresh_Renderer *device, | ||||||
|  | 	Refresh_CommandBuffer *commandBuffer, | ||||||
|  | 	uint32_t groupCountX, | ||||||
|  | 	uint32_t groupCountY, | ||||||
|  | 	uint32_t groupCountZ, | ||||||
|  | 	uint32_t computeParamOffset | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* State Creation */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | static Refresh_ComputePipeline* TEMPLATE_CreateComputePipeline( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	Refresh_ComputeShaderInfo *computeShaderInfo | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static Refresh_GraphicsPipeline* TEMPLATE_CreateGraphicsPipeline( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	Refresh_GraphicsPipelineCreateInfo *pipelineCreateInfo | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static Refresh_Sampler* TEMPLATE_CreateSampler( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	Refresh_SamplerStateCreateInfo *samplerStateCreateInfo | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static Refresh_ShaderModule* TEMPLATE_CreateShaderModule( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	Refresh_ShaderModuleCreateInfo *shaderModuleCreateInfo | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static Refresh_Texture* TEMPLATE_CreateTexture( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	Refresh_TextureCreateInfo *textureCreateInfo | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static Refresh_Buffer* TEMPLATE_CreateBuffer( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	Refresh_BufferUsageFlags usageFlags, | ||||||
|  | 	uint32_t sizeInBytes | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* Setters */ | ||||||
|  | 
 | ||||||
|  | static void TEMPLATE_SetTextureData( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	Refresh_CommandBuffer *commandBuffer, | ||||||
|  | 	Refresh_TextureSlice *textureSlice, | ||||||
|  | 	void *data, | ||||||
|  | 	uint32_t dataLengthInBytes | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void TEMPLATE_SetTextureDataYUV( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	Refresh_CommandBuffer* commandBuffer, | ||||||
|  | 	Refresh_Texture *y, | ||||||
|  | 	Refresh_Texture *u, | ||||||
|  | 	Refresh_Texture *v, | ||||||
|  | 	uint32_t yWidth, | ||||||
|  | 	uint32_t yHeight, | ||||||
|  | 	uint32_t uvWidth, | ||||||
|  | 	uint32_t uvHeight, | ||||||
|  | 	void *yDataPtr, | ||||||
|  | 	void *uDataPtr, | ||||||
|  | 	void *vDataPtr, | ||||||
|  | 	uint32_t yDataLength, | ||||||
|  | 	uint32_t uvDataLength, | ||||||
|  | 	uint32_t yStride, | ||||||
|  | 	uint32_t uvStride | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void TEMPLATE_CopyTextureToTexture( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	Refresh_CommandBuffer *commandBuffer, | ||||||
|  | 	Refresh_TextureSlice *sourceTextureSlice, | ||||||
|  | 	Refresh_TextureSlice *destinationTextureSlice, | ||||||
|  | 	Refresh_Filter filter | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void TEMPLATE_CopyTextureToBuffer( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	Refresh_CommandBuffer *commandBuffer, | ||||||
|  | 	Refresh_TextureSlice *textureSlice, | ||||||
|  | 	Refresh_Buffer *buffer | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void TEMPLATE_SetBufferData( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	Refresh_CommandBuffer *commandBuffer, | ||||||
|  | 	Refresh_Buffer *buffer, | ||||||
|  | 	uint32_t offsetInBytes, | ||||||
|  | 	void* data, | ||||||
|  | 	uint32_t dataLength | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static uint32_t TEMPLATE_PushVertexShaderUniforms( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	Refresh_CommandBuffer *commandBuffer, | ||||||
|  | 	void *data, | ||||||
|  | 	uint32_t dataLengthInBytes | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static uint32_t TEMPLATE_PushFragmentShaderUniforms( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	Refresh_CommandBuffer *commandBuffer, | ||||||
|  | 	void *data, | ||||||
|  | 	uint32_t dataLengthInBytes | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static uint32_t TEMPLATE_PushComputeShaderUniforms( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	Refresh_CommandBuffer *commandBuffer, | ||||||
|  | 	void *data, | ||||||
|  | 	uint32_t dataLengthInBytes | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void TEMPLATE_BindVertexSamplers( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	Refresh_CommandBuffer *commandBuffer, | ||||||
|  | 	Refresh_Texture **pTextures, | ||||||
|  | 	Refresh_Sampler **pSamplers | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void TEMPLATE_BindFragmentSamplers( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	Refresh_CommandBuffer *commandBuffer, | ||||||
|  | 	Refresh_Texture **pTextures, | ||||||
|  | 	Refresh_Sampler **pSamplers | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* Getters */ | ||||||
|  | 
 | ||||||
|  | static void TEMPLATE_GetBufferData( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	Refresh_Buffer *buffer, | ||||||
|  | 	void *data, | ||||||
|  | 	uint32_t dataLengthInBytes | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* Disposal */ | ||||||
|  | 
 | ||||||
|  | static void TEMPLATE_QueueDestroyTexture( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	Refresh_Texture *texture | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void TEMPLATE_QueueDestroySampler( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	Refresh_Sampler *sampler | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void TEMPLATE_QueueDestroyBuffer( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	Refresh_Buffer *buffer | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void TEMPLATE_QueueDestroyShaderModule( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	Refresh_ShaderModule *shaderModule | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void TEMPLATE_QueueDestroyComputePipeline( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	Refresh_ComputePipeline *computePipeline | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void TEMPLATE_QueueDestroyGraphicsPipeline( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	Refresh_GraphicsPipeline *graphicsPipeline | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* Graphics State */ | ||||||
|  | 
 | ||||||
|  | static Refresh_CommandBuffer* TEMPLATE_AcquireCommandBuffer( | ||||||
|  | 	Refresh_Renderer *driverData | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void TEMPLATE_BeginRenderPass( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	Refresh_CommandBuffer *commandBuffer, | ||||||
|  | 	Refresh_ColorAttachmentInfo *colorAttachmentInfos, | ||||||
|  | 	uint32_t colorAttachmentCount, | ||||||
|  | 	Refresh_DepthStencilAttachmentInfo *depthStencilAttachmentInfo | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void TEMPLATE_EndRenderPass( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	Refresh_CommandBuffer *commandBuffer | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void TEMPLATE_BindGraphicsPipeline( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	Refresh_CommandBuffer *commandBuffer, | ||||||
|  | 	Refresh_GraphicsPipeline *graphicsPipeline | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void TEMPLATE_SetViewport( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	Refresh_CommandBuffer *commandBuffer, | ||||||
|  | 	Refresh_Viewport *viewport | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void TEMPLATE_SetScissor( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	Refresh_CommandBuffer *commandBuffer, | ||||||
|  | 	Refresh_Rect *scissor | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void TEMPLATE_BindVertexBuffers( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	Refresh_CommandBuffer *commandBuffer, | ||||||
|  | 	uint32_t firstBinding, | ||||||
|  | 	uint32_t bindingCount, | ||||||
|  | 	Refresh_Buffer **pBuffers, | ||||||
|  | 	uint64_t *pOffsets | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void TEMPLATE_BindIndexBuffer( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	Refresh_CommandBuffer *commandBuffer, | ||||||
|  | 	Refresh_Buffer *buffer, | ||||||
|  | 	uint64_t offset, | ||||||
|  | 	Refresh_IndexElementSize indexElementSize | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* Compute State */ | ||||||
|  | 
 | ||||||
|  | static void TEMPLATE_BindComputePipeline( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	Refresh_CommandBuffer *commandBuffer, | ||||||
|  | 	Refresh_ComputePipeline *computePipeline | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void TEMPLATE_BindComputeBuffers( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	Refresh_CommandBuffer *commandBuffer, | ||||||
|  | 	Refresh_Buffer **pBuffers | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void TEMPLATE_BindComputeTextures( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	Refresh_CommandBuffer *commandBuffer, | ||||||
|  | 	Refresh_Texture **pTextures | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* Window and Swapchain Management */ | ||||||
|  | 
 | ||||||
|  | static uint8_t TEMPLATE_ClaimWindow( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	void *windowHandle, | ||||||
|  | 	Refresh_PresentMode presentMode | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void TEMPLATE_UnclaimWindow( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	void *windowHandle | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static Refresh_Texture* TEMPLATE_AcquireSwapchainTexture( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	Refresh_CommandBuffer *commandBuffer, | ||||||
|  | 	void *windowHandle, | ||||||
|  | 	uint32_t *pWidth, | ||||||
|  | 	uint32_t *pHeight | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static Refresh_TextureFormat TEMPLATE_GetSwapchainFormat( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	void *windowHandle | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void TEMPLATE_SetSwapchainPresentMode( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	void *windowHandle, | ||||||
|  | 	Refresh_PresentMode presentMode | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* Submission and Fences */ | ||||||
|  | 
 | ||||||
|  | static void TEMPLATE_Submit( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	Refresh_CommandBuffer *commandBuffer | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static Refresh_Fence* TEMPLATE_SubmitAndAcquireFence( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	Refresh_CommandBuffer *commandBuffer | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void TEMPLATE_Wait( | ||||||
|  | 	Refresh_Renderer *driverData | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void TEMPLATE_WaitForFences( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	uint8_t waitAll, | ||||||
|  | 	uint32_t fenceCount, | ||||||
|  | 	Refresh_Fence **pFences | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static int TEMPLATE_QueryFence( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	Refresh_Fence *fence | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void TEMPLATE_ReleaseFence( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	Refresh_Fence *fence | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* Device Creation */ | ||||||
|  | 
 | ||||||
|  | static uint8_t TEMPLATE_PrepareDriver( | ||||||
|  | 	uint32_t *flags | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static Refresh_Device* TEMPLATE_CreateDevice( | ||||||
|  | 	uint8_t debugMode | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | Refresh_Driver TEMPLATEDriver = { | ||||||
|  | 	"TEMPLATE", | ||||||
|  | 	TEMPLATE_PrepareDriver, | ||||||
|  | 	TEMPLATE_CreateDevice | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | #endif //REFRESH_DRIVER_TEMPLATE | ||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							|  | @ -89,9 +89,11 @@ VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdClearDepthStencilImage, (VkCommandBuff | ||||||
| VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdCopyBuffer, (VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount, const VkBufferCopy* pRegions)) | VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdCopyBuffer, (VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount, const VkBufferCopy* pRegions)) | ||||||
| VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdCopyBufferToImage, (VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkBufferImageCopy *pRegions)) | VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdCopyBufferToImage, (VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkBufferImageCopy *pRegions)) | ||||||
| VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdCopyImageToBuffer, (VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions)) | VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdCopyImageToBuffer, (VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions)) | ||||||
|  | VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdCopyImage, (VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy* pRegions)) | ||||||
| VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdDispatch, (VkCommandBuffer commandBuffer, uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ)) | VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdDispatch, (VkCommandBuffer commandBuffer, uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ)) | ||||||
| VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdDraw, (VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance)) | VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdDraw, (VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance)) | ||||||
| VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdDrawIndexed, (VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance)) | VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdDrawIndexed, (VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance)) | ||||||
|  | VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdDrawIndirect, (VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount, uint32_t stride)) | ||||||
| VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdEndRenderPass, (VkCommandBuffer commandBuffer)) | VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdEndRenderPass, (VkCommandBuffer commandBuffer)) | ||||||
| VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdPipelineBarrier, (VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers)) | VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdPipelineBarrier, (VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers)) | ||||||
| VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdResolveImage, (VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageResolve *pRegions)) | VULKAN_DEVICE_FUNCTION(BaseVK, void, vkCmdResolveImage, (VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageResolve *pRegions)) | ||||||
|  |  | ||||||
|  | @ -48,7 +48,6 @@ | ||||||
| #define floorf SDL_floorf | #define floorf SDL_floorf | ||||||
| #define ldexp SDL_scalbn | #define ldexp SDL_scalbn | ||||||
| #define pow SDL_pow | #define pow SDL_pow | ||||||
| #define strtol SDL_strtol |  | ||||||
| 
 | 
 | ||||||
| #ifdef memcmp | #ifdef memcmp | ||||||
| #undef memcmp | #undef memcmp | ||||||
|  | @ -74,13 +73,10 @@ | ||||||
| #undef strlen | #undef strlen | ||||||
| #endif | #endif | ||||||
| #define strlen SDL_strlen | #define strlen SDL_strlen | ||||||
| #ifdef strncmp |  | ||||||
| #undef strncmp |  | ||||||
| #endif |  | ||||||
| #define strncmp SDL_strncmp |  | ||||||
| 
 | 
 | ||||||
| /* These are per the Texture2D.FromStream spec */ | /* These are per the Texture2D.FromStream spec */ | ||||||
| #define STBI_ONLY_PNG | #define STBI_ONLY_PNG | ||||||
|  | #define STBI_ONLY_QOI | ||||||
| 
 | 
 | ||||||
| /* These are per the Texture2D.SaveAs* spec */ | /* These are per the Texture2D.SaveAs* spec */ | ||||||
| #define STBIW_ONLY_PNG | #define STBIW_ONLY_PNG | ||||||
|  | @ -89,57 +85,58 @@ | ||||||
| static void * | static void * | ||||||
| SDL_SIMDRealloc(void *mem, const size_t len) | SDL_SIMDRealloc(void *mem, const size_t len) | ||||||
| { | { | ||||||
|     const size_t alignment = SDL_SIMDGetAlignment(); | 	const size_t alignment = SDL_SIMDGetAlignment(); | ||||||
|     const size_t padding = alignment - (len % alignment); | 	const size_t padding = alignment - (len % alignment); | ||||||
|     const size_t padded = (padding != alignment) ? (len + padding) : len; | 	const size_t padded = (padding != alignment) ? (len + padding) : len; | ||||||
|     Uint8 *retval = (Uint8*) mem; | 	Uint8 *retval = (Uint8*) mem; | ||||||
|     void *oldmem = mem; | 	void *oldmem = mem; | ||||||
|     size_t memdiff, ptrdiff; | 	size_t memdiff, ptrdiff; | ||||||
|     Uint8 *ptr; | 	Uint8 *ptr; | ||||||
| 
 | 
 | ||||||
|     if (mem) { | 	if (mem) { | ||||||
|         void **realptr = (void **) mem; | 		void **realptr = (void **) mem; | ||||||
|         realptr--; | 		realptr--; | ||||||
|         mem = *(((void **) mem) - 1); | 		mem = *(((void **) mem) - 1); | ||||||
| 
 | 
 | ||||||
|         /* Check the delta between the real pointer and user pointer */ | 		/* Check the delta between the real pointer and user pointer */ | ||||||
|         memdiff = ((size_t) oldmem) - ((size_t) mem); | 		memdiff = ((size_t) oldmem) - ((size_t) mem); | ||||||
|     } | 	} | ||||||
| 
 | 
 | ||||||
|     ptr = (Uint8 *) SDL_realloc(mem, padded + alignment + sizeof (void *)); | 	ptr = (Uint8 *) SDL_realloc(mem, padded + alignment + sizeof (void *)); | ||||||
| 
 | 
 | ||||||
|     if (ptr == mem) { | 	if (ptr == mem) { | ||||||
|         return retval; /* Pointer didn't change, nothing to do */ | 		return retval; /* Pointer didn't change, nothing to do */ | ||||||
|     } | 	} | ||||||
|     if (ptr == NULL) { | 	if (ptr == NULL) { | ||||||
|         return NULL; /* Out of memory, bail! */ | 		return NULL; /* Out of memory, bail! */ | ||||||
|     } | 	} | ||||||
| 
 | 
 | ||||||
|     /* Store the actual malloc pointer right before our aligned pointer. */ | 	/* Store the actual malloc pointer right before our aligned pointer. */ | ||||||
|     retval = ptr + sizeof (void *); | 	retval = ptr + sizeof (void *); | ||||||
|     retval += alignment - (((size_t) retval) % alignment); | 	retval += alignment - (((size_t) retval) % alignment); | ||||||
| 
 | 
 | ||||||
|     /* Make sure the delta is the same! */ | 	/* Make sure the delta is the same! */ | ||||||
|     if (mem) { | 	if (mem) { | ||||||
|         ptrdiff = ((size_t) retval) - ((size_t) ptr); | 		ptrdiff = ((size_t) retval) - ((size_t) ptr); | ||||||
|         if (memdiff != ptrdiff) { /* Delta has changed, copy to new offset! */ | 		if (memdiff != ptrdiff) { /* Delta has changed, copy to new offset! */ | ||||||
|             oldmem = (void*) (((size_t) ptr) + memdiff); | 			oldmem = (void*) (((size_t) ptr) + memdiff); | ||||||
| 
 | 
 | ||||||
|             /* Even though the data past the old `len` is undefined, this is the
 | 			/* Even though the data past the old `len` is undefined, this is the
 | ||||||
|              * only length value we have, and it guarantees that we copy all the | 			 * only length value we have, and it guarantees that we copy all the | ||||||
|              * previous memory anyhow. | 			 * previous memory anyhow. | ||||||
|              */ | 			 */ | ||||||
|             SDL_memmove(retval, oldmem, len); | 			SDL_memmove(retval, oldmem, len); | ||||||
|         } | 		} | ||||||
|     } | 	} | ||||||
| 
 | 
 | ||||||
|     /* Actually store the malloc pointer, finally. */ | 	/* Actually store the malloc pointer, finally. */ | ||||||
|     *(((void **) retval) - 1) = ptr; | 	*(((void **) retval) - 1) = ptr; | ||||||
|     return retval; | 	return retval; | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #define STB_IMAGE_STATIC | #define STB_IMAGE_STATIC | ||||||
|  | #define STBI_NO_HDR | ||||||
| #define STBI_ASSERT SDL_assert | #define STBI_ASSERT SDL_assert | ||||||
| #define STBI_MALLOC SDL_SIMDAlloc | #define STBI_MALLOC SDL_SIMDAlloc | ||||||
| #define STBI_REALLOC SDL_SIMDRealloc | #define STBI_REALLOC SDL_SIMDRealloc | ||||||
|  | @ -190,28 +187,72 @@ static unsigned char* dgibson_stbi_zlib_compress( | ||||||
| /* Image Read API */ | /* Image Read API */ | ||||||
| 
 | 
 | ||||||
| uint8_t* Refresh_Image_Load( | uint8_t* Refresh_Image_Load( | ||||||
|     char const *filename, | 	uint8_t *bufferPtr, | ||||||
|  | 	int32_t bufferLength, | ||||||
| 	int32_t *w, | 	int32_t *w, | ||||||
| 	int32_t *h, | 	int32_t *h, | ||||||
|     int32_t *numChannels | 	int32_t *len | ||||||
| ) { | ) { | ||||||
|     return stbi_load(filename, w, h, numChannels, STBI_rgb_alpha); | 	uint8_t* result; | ||||||
|  | 	uint8_t* pixels; | ||||||
|  | 	int32_t format; | ||||||
|  | 	int32_t i; | ||||||
|  | 
 | ||||||
|  | 	result = stbi_load_from_memory( | ||||||
|  | 		bufferPtr, | ||||||
|  | 		bufferLength, | ||||||
|  | 		w, | ||||||
|  | 		h, | ||||||
|  | 		&format, | ||||||
|  | 		STBI_rgb_alpha | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	if (result == NULL) | ||||||
|  | 	{ | ||||||
|  | 		SDL_LogWarn(SDL_LOG_CATEGORY_ERROR, "Image loading failed: %s", stbi_failure_reason()); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/* Ensure that the alpha pixels are... well, actual alpha.
 | ||||||
|  | 	 * You think this looks stupid, but be assured: Your paint program is | ||||||
|  | 	 * almost certainly even stupider. | ||||||
|  | 	 * -flibit | ||||||
|  | 	 */ | ||||||
|  | 	pixels = result; | ||||||
|  | 	*len = (*w) * (*h) *4; | ||||||
|  | 	for (i = 0; i < *len; i += 4, pixels += 4) | ||||||
|  | 	{ | ||||||
|  | 		if (pixels[3] == 0) | ||||||
|  | 		{ | ||||||
|  | 			pixels[0] = 0; | ||||||
|  | 			pixels[1] = 1; | ||||||
|  | 			pixels[2] = 2; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return result; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Refresh_Image_Free(uint8_t *mem) | void Refresh_Image_Free(uint8_t *mem) | ||||||
| { | { | ||||||
|     stbi_image_free(mem); | 	SDL_SIMDFree(mem); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* Image Write API */ | /* Image Write API */ | ||||||
| 
 | 
 | ||||||
| void Refresh_Image_SavePNG( | void Refresh_Image_SavePNG( | ||||||
|     const char *filename, | 	const char* filename, | ||||||
|     int32_t w, | 	uint8_t* data, | ||||||
|     int32_t h, | 	int32_t w, | ||||||
| 	uint8_t *data | 	int32_t h | ||||||
| ) { | ) { | ||||||
|     stbi_write_png(filename, w, h, 4, data, w * 4); | 	stbi_write_png( | ||||||
|  | 		filename, | ||||||
|  | 		w, | ||||||
|  | 		h, | ||||||
|  | 		4, | ||||||
|  | 		data, | ||||||
|  | 		w * 4 | ||||||
|  | 	); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* vim: set noexpandtab shiftwidth=8 tabstop=8: */ | /* vim: set noexpandtab shiftwidth=8 tabstop=8: */ | ||||||
|  |  | ||||||
							
								
								
									
										598
									
								
								src/stb_image.h
								
								
								
								
							
							
						
						
									
										598
									
								
								src/stb_image.h
								
								
								
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Loading…
	
		Reference in New Issue