forked from MoonsideGames/Refresh
				
			Compare commits
	
		
			92 Commits 
		
	
	
	| 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 | 
|  | @ -8,8 +8,8 @@ option(BUILD_SHARED_LIBS "Build shared library" ON) | ||||||
| 
 | 
 | ||||||
| # Version | # Version | ||||||
| SET(LIB_MAJOR_VERSION "1") | SET(LIB_MAJOR_VERSION "1") | ||||||
| SET(LIB_MINOR_VERSION "4") | 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 | ||||||
|  | @ -36,23 +36,11 @@ elseif(WIN32) | ||||||
| 	set(CMAKE_SHARED_LIBRARY_PREFIX "") | 	set(CMAKE_SHARED_LIBRARY_PREFIX "") | ||||||
| endif() | endif() | ||||||
| 
 | 
 | ||||||
| set(BUILD_D3D11 OFF) |  | ||||||
| 
 |  | ||||||
| if (WIN32) |  | ||||||
| 	set(BUILD_D3D11 ON) |  | ||||||
| endif() |  | ||||||
| 
 |  | ||||||
| # Defines | # Defines | ||||||
| add_definitions( | add_definitions( | ||||||
| 	-DREFRESH_DRIVER_VULKAN | 	-DREFRESH_DRIVER_VULKAN | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| if (BUILD_D3D11) |  | ||||||
| 	add_definitions( |  | ||||||
| 		-DREFRESH_DRIVER_D3D11 |  | ||||||
| 	) |  | ||||||
| endif() |  | ||||||
| 
 |  | ||||||
| # Source lists | # Source lists | ||||||
| add_library(Refresh | add_library(Refresh | ||||||
| 	# Public Headers | 	# Public Headers | ||||||
|  | @ -61,10 +49,8 @@ add_library(Refresh | ||||||
| 	# Internal Headers | 	# Internal Headers | ||||||
| 	src/Refresh_Driver.h | 	src/Refresh_Driver.h | ||||||
| 	src/Refresh_Driver_Vulkan_vkfuncs.h | 	src/Refresh_Driver_Vulkan_vkfuncs.h | ||||||
| 	src/Refresh_Driver_D3D11_cdefines.h |  | ||||||
| 	# Source Files | 	# Source Files | ||||||
| 	src/Refresh.c | 	src/Refresh.c | ||||||
| 	src/Refresh_Driver_D3D11.c |  | ||||||
| 	src/Refresh_Driver_Vulkan.c | 	src/Refresh_Driver_Vulkan.c | ||||||
| 	src/Refresh_Image.c | 	src/Refresh_Image.c | ||||||
| ) | ) | ||||||
|  | @ -74,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> | ||||||
|  |  | ||||||
|  | @ -55,8 +55,8 @@ extern "C" { | ||||||
| /* Version API */ | /* Version API */ | ||||||
| 
 | 
 | ||||||
| #define REFRESH_MAJOR_VERSION   1 | #define REFRESH_MAJOR_VERSION   1 | ||||||
| #define REFRESH_MINOR_VERSION	4 | #define REFRESH_MINOR_VERSION	15 | ||||||
| #define REFRESH_PATCH_VERSION	0 | #define REFRESH_PATCH_VERSION	4 | ||||||
| 
 | 
 | ||||||
| #define REFRESH_COMPILED_VERSION ( \ | #define REFRESH_COMPILED_VERSION ( \ | ||||||
| 	(REFRESH_MAJOR_VERSION * 100 * 100) + \ | 	(REFRESH_MAJOR_VERSION * 100 * 100) + \ | ||||||
|  | @ -76,6 +76,7 @@ typedef struct Refresh_ShaderModule Refresh_ShaderModule; | ||||||
| typedef struct Refresh_ComputePipeline Refresh_ComputePipeline; | typedef struct Refresh_ComputePipeline Refresh_ComputePipeline; | ||||||
| typedef struct Refresh_GraphicsPipeline Refresh_GraphicsPipeline; | typedef struct Refresh_GraphicsPipeline Refresh_GraphicsPipeline; | ||||||
| typedef struct Refresh_CommandBuffer Refresh_CommandBuffer; | typedef struct Refresh_CommandBuffer Refresh_CommandBuffer; | ||||||
|  | typedef struct Refresh_Fence Refresh_Fence; | ||||||
| 
 | 
 | ||||||
| typedef enum Refresh_PresentMode | typedef enum Refresh_PresentMode | ||||||
| { | { | ||||||
|  | @ -115,27 +116,38 @@ typedef enum Refresh_IndexElementSize | ||||||
| 
 | 
 | ||||||
| typedef enum Refresh_TextureFormat | typedef enum Refresh_TextureFormat | ||||||
| { | { | ||||||
| 	/* Color Formats */ | 	/* Unsigned Normalized Float Color Formats */ | ||||||
| 	REFRESH_TEXTUREFORMAT_R8G8B8A8, | 	REFRESH_TEXTUREFORMAT_R8G8B8A8, | ||||||
| 	REFRESH_TEXTUREFORMAT_B8G8R8A8, | 	REFRESH_TEXTUREFORMAT_B8G8R8A8, | ||||||
| 	REFRESH_TEXTUREFORMAT_R5G6B5, | 	REFRESH_TEXTUREFORMAT_R5G6B5, | ||||||
| 	REFRESH_TEXTUREFORMAT_A1R5G5B5, | 	REFRESH_TEXTUREFORMAT_A1R5G5B5, | ||||||
| 	REFRESH_TEXTUREFORMAT_B4G4R4A4, | 	REFRESH_TEXTUREFORMAT_B4G4R4A4, | ||||||
| 	REFRESH_TEXTUREFORMAT_BC1, |  | ||||||
| 	REFRESH_TEXTUREFORMAT_BC2, |  | ||||||
| 	REFRESH_TEXTUREFORMAT_BC3, |  | ||||||
| 	REFRESH_TEXTUREFORMAT_R8G8_SNORM, |  | ||||||
| 	REFRESH_TEXTUREFORMAT_R8G8B8A8_SNORM, |  | ||||||
| 	REFRESH_TEXTUREFORMAT_A2R10G10B10, | 	REFRESH_TEXTUREFORMAT_A2R10G10B10, | ||||||
| 	REFRESH_TEXTUREFORMAT_R16G16, | 	REFRESH_TEXTUREFORMAT_R16G16, | ||||||
| 	REFRESH_TEXTUREFORMAT_R16G16B16A16, | 	REFRESH_TEXTUREFORMAT_R16G16B16A16, | ||||||
| 	REFRESH_TEXTUREFORMAT_R8, | 	REFRESH_TEXTUREFORMAT_R8, | ||||||
| 	REFRESH_TEXTUREFORMAT_R32_SFLOAT, | 	/* Compressed Unsigned Normalized Float Color Formats */ | ||||||
| 	REFRESH_TEXTUREFORMAT_R32G32_SFLOAT, | 	REFRESH_TEXTUREFORMAT_BC1, | ||||||
| 	REFRESH_TEXTUREFORMAT_R32G32B32A32_SFLOAT, | 	REFRESH_TEXTUREFORMAT_BC2, | ||||||
|  | 	REFRESH_TEXTUREFORMAT_BC3, | ||||||
|  | 	REFRESH_TEXTUREFORMAT_BC7, | ||||||
|  | 	/* Signed Normalized Float Color Formats  */ | ||||||
|  | 	REFRESH_TEXTUREFORMAT_R8G8_SNORM, | ||||||
|  | 	REFRESH_TEXTUREFORMAT_R8G8B8A8_SNORM, | ||||||
|  | 	/* Signed Float Color Formats */ | ||||||
| 	REFRESH_TEXTUREFORMAT_R16_SFLOAT, | 	REFRESH_TEXTUREFORMAT_R16_SFLOAT, | ||||||
| 	REFRESH_TEXTUREFORMAT_R16G16_SFLOAT, | 	REFRESH_TEXTUREFORMAT_R16G16_SFLOAT, | ||||||
| 	REFRESH_TEXTUREFORMAT_R16G16B16A16_SFLOAT, | 	REFRESH_TEXTUREFORMAT_R16G16B16A16_SFLOAT, | ||||||
|  | 	REFRESH_TEXTUREFORMAT_R32_SFLOAT, | ||||||
|  | 	REFRESH_TEXTUREFORMAT_R32G32_SFLOAT, | ||||||
|  | 	REFRESH_TEXTUREFORMAT_R32G32B32A32_SFLOAT, | ||||||
|  | 	/* Unsigned Integer Color Formats */ | ||||||
|  | 	REFRESH_TEXTUREFORMAT_R8_UINT, | ||||||
|  | 	REFRESH_TEXTUREFORMAT_R8G8_UINT, | ||||||
|  | 	REFRESH_TEXTUREFORMAT_R8G8B8A8_UINT, | ||||||
|  | 	REFRESH_TEXTUREFORMAT_R16_UINT, | ||||||
|  | 	REFRESH_TEXTUREFORMAT_R16G16_UINT, | ||||||
|  | 	REFRESH_TEXTUREFORMAT_R16G16B16A16_UINT, | ||||||
| 	/* Depth Formats */ | 	/* Depth Formats */ | ||||||
| 	REFRESH_TEXTUREFORMAT_D16_UNORM, | 	REFRESH_TEXTUREFORMAT_D16_UNORM, | ||||||
| 	REFRESH_TEXTUREFORMAT_D32_SFLOAT, | 	REFRESH_TEXTUREFORMAT_D32_SFLOAT, | ||||||
|  | @ -147,7 +159,8 @@ typedef enum Refresh_TextureUsageFlagBits | ||||||
| { | { | ||||||
| 	REFRESH_TEXTUREUSAGE_SAMPLER_BIT              = 0x00000001, | 	REFRESH_TEXTUREUSAGE_SAMPLER_BIT              = 0x00000001, | ||||||
| 	REFRESH_TEXTUREUSAGE_COLOR_TARGET_BIT         = 0x00000002, | 	REFRESH_TEXTUREUSAGE_COLOR_TARGET_BIT         = 0x00000002, | ||||||
| 	REFRESH_TEXTUREUSAGE_DEPTH_STENCIL_TARGET_BIT = 0x00000004 | 	REFRESH_TEXTUREUSAGE_DEPTH_STENCIL_TARGET_BIT = 0x00000004, | ||||||
|  | 	REFRESH_TEXTUREUSAGE_COMPUTE_BIT              = 0X00000008 | ||||||
| } Refresh_TextureUsageFlagBits; | } Refresh_TextureUsageFlagBits; | ||||||
| 
 | 
 | ||||||
| typedef uint32_t Refresh_TextureUsageFlags; | typedef uint32_t Refresh_TextureUsageFlags; | ||||||
|  | @ -157,10 +170,7 @@ typedef enum Refresh_SampleCount | ||||||
| 	REFRESH_SAMPLECOUNT_1, | 	REFRESH_SAMPLECOUNT_1, | ||||||
| 	REFRESH_SAMPLECOUNT_2, | 	REFRESH_SAMPLECOUNT_2, | ||||||
| 	REFRESH_SAMPLECOUNT_4, | 	REFRESH_SAMPLECOUNT_4, | ||||||
| 	REFRESH_SAMPLECOUNT_8, | 	REFRESH_SAMPLECOUNT_8 | ||||||
| 	REFRESH_SAMPLECOUNT_16, |  | ||||||
| 	REFRESH_SAMPLECOUNT_32, |  | ||||||
| 	REFRESH_SAMPLECOUNT_64 |  | ||||||
| } Refresh_SampleCount; | } Refresh_SampleCount; | ||||||
| 
 | 
 | ||||||
| typedef enum Refresh_CubeMapFace | typedef enum Refresh_CubeMapFace | ||||||
|  | @ -177,7 +187,8 @@ typedef enum Refresh_BufferUsageFlagBits | ||||||
| { | { | ||||||
| 	REFRESH_BUFFERUSAGE_VERTEX_BIT 	 = 0x00000001, | 	REFRESH_BUFFERUSAGE_VERTEX_BIT 	 = 0x00000001, | ||||||
| 	REFRESH_BUFFERUSAGE_INDEX_BIT  	 = 0x00000002, | 	REFRESH_BUFFERUSAGE_INDEX_BIT  	 = 0x00000002, | ||||||
| 	REFRESH_BUFFERUSAGE_COMPUTE_BIT =	0x00000004 | 	REFRESH_BUFFERUSAGE_COMPUTE_BIT  = 0x00000004, | ||||||
|  | 	REFRESH_BUFFERUSAGE_INDIRECT_BIT = 0x00000008 | ||||||
| } Refresh_BufferUsageFlagBits; | } Refresh_BufferUsageFlagBits; | ||||||
| 
 | 
 | ||||||
| typedef uint32_t Refresh_BufferUsageFlags; | typedef uint32_t Refresh_BufferUsageFlags; | ||||||
|  | @ -271,11 +282,7 @@ typedef enum Refresh_BlendFactor | ||||||
| 	REFRESH_BLENDFACTOR_ONE_MINUS_DST_ALPHA, | 	REFRESH_BLENDFACTOR_ONE_MINUS_DST_ALPHA, | ||||||
| 	REFRESH_BLENDFACTOR_CONSTANT_COLOR, | 	REFRESH_BLENDFACTOR_CONSTANT_COLOR, | ||||||
| 	REFRESH_BLENDFACTOR_ONE_MINUS_CONSTANT_COLOR, | 	REFRESH_BLENDFACTOR_ONE_MINUS_CONSTANT_COLOR, | ||||||
| 	REFRESH_BLENDFACTOR_SRC_ALPHA_SATURATE, | 	REFRESH_BLENDFACTOR_SRC_ALPHA_SATURATE | ||||||
| 	REFRESH_BLENDFACTOR_SRC1_COLOR, |  | ||||||
| 	REFRESH_BLENDFACTOR_ONE_MINUS_SRC1_COLOR, |  | ||||||
| 	REFRESH_BLENDFACTOR_SRC1_ALPHA, |  | ||||||
| 	REFRESH_BLENDFACTOR_ONE_MINUS_SRC1_ALPHA |  | ||||||
| } Refresh_BlendFactor; | } Refresh_BlendFactor; | ||||||
| 
 | 
 | ||||||
| typedef enum Refresh_ColorComponentFlagBits | typedef enum Refresh_ColorComponentFlagBits | ||||||
|  | @ -319,6 +326,14 @@ typedef enum Refresh_BorderColor | ||||||
| 	REFRESH_BORDERCOLOR_INT_OPAQUE_WHITE | 	REFRESH_BORDERCOLOR_INT_OPAQUE_WHITE | ||||||
| } Refresh_BorderColor; | } Refresh_BorderColor; | ||||||
| 
 | 
 | ||||||
|  | typedef enum Refresh_Backend | ||||||
|  | { | ||||||
|  | 	REFRESH_BACKEND_DONTCARE, | ||||||
|  | 	REFRESH_BACKEND_VULKAN, | ||||||
|  | 	REFRESH_BACKEND_PS5, | ||||||
|  | 	REFRESH_BACKEND_INVALID | ||||||
|  | } Refresh_Backend; | ||||||
|  | 
 | ||||||
| /* Structures */ | /* Structures */ | ||||||
| 
 | 
 | ||||||
| typedef struct Refresh_DepthStencilValue | typedef struct Refresh_DepthStencilValue | ||||||
|  | @ -362,11 +377,13 @@ typedef struct Refresh_TextureSlice | ||||||
| 	uint32_t level; | 	uint32_t level; | ||||||
| } Refresh_TextureSlice; | } Refresh_TextureSlice; | ||||||
| 
 | 
 | ||||||
| typedef struct Refresh_PresentationParameters | typedef struct Refresh_IndirectDrawCommand | ||||||
| { | { | ||||||
| 	void* deviceWindowHandle; | 	uint32_t vertexCount; | ||||||
| 	Refresh_PresentMode presentMode; | 	uint32_t instanceCount; | ||||||
| } Refresh_PresentationParameters; | 	uint32_t firstVertex; | ||||||
|  | 	uint32_t firstInstance; | ||||||
|  | } Refresh_IndirectDrawCommand; | ||||||
| 
 | 
 | ||||||
| /* State structures */ | /* State structures */ | ||||||
| 
 | 
 | ||||||
|  | @ -434,12 +451,6 @@ typedef struct Refresh_ColorAttachmentBlendState | ||||||
| 	Refresh_ColorComponentFlags colorWriteMask; | 	Refresh_ColorComponentFlags colorWriteMask; | ||||||
| } Refresh_ColorAttachmentBlendState; | } Refresh_ColorAttachmentBlendState; | ||||||
| 
 | 
 | ||||||
| typedef struct Refresh_ComputePipelineLayoutCreateInfo |  | ||||||
| { |  | ||||||
| 	uint32_t bufferBindingCount; |  | ||||||
| 	uint32_t imageBindingCount; |  | ||||||
| } Refresh_ComputePipelineLayoutCreateInfo; |  | ||||||
| 
 |  | ||||||
| typedef struct Refresh_ShaderModuleCreateInfo | typedef struct Refresh_ShaderModuleCreateInfo | ||||||
| { | { | ||||||
| 	size_t codeSize; | 	size_t codeSize; | ||||||
|  | @ -452,8 +463,8 @@ typedef struct Refresh_TextureCreateInfo | ||||||
| 	uint32_t height; | 	uint32_t height; | ||||||
| 	uint32_t depth; | 	uint32_t depth; | ||||||
| 	uint8_t isCube; | 	uint8_t isCube; | ||||||
| 	Refresh_SampleCount sampleCount; |  | ||||||
| 	uint32_t levelCount; | 	uint32_t levelCount; | ||||||
|  | 	Refresh_SampleCount sampleCount; | ||||||
| 	Refresh_TextureFormat format; | 	Refresh_TextureFormat format; | ||||||
| 	Refresh_TextureUsageFlags usageFlags; | 	Refresh_TextureUsageFlags usageFlags; | ||||||
| } Refresh_TextureCreateInfo; | } Refresh_TextureCreateInfo; | ||||||
|  | @ -479,7 +490,6 @@ typedef struct Refresh_ComputeShaderInfo | ||||||
| 
 | 
 | ||||||
| typedef struct Refresh_RasterizerState | typedef struct Refresh_RasterizerState | ||||||
| { | { | ||||||
| 	uint8_t depthClampEnable; |  | ||||||
| 	Refresh_FillMode fillMode; | 	Refresh_FillMode fillMode; | ||||||
| 	Refresh_CullMode cullMode; | 	Refresh_CullMode cullMode; | ||||||
| 	Refresh_FrontFace frontFace; | 	Refresh_FrontFace frontFace; | ||||||
|  | @ -511,7 +521,6 @@ typedef struct Refresh_DepthStencilState | ||||||
| typedef struct Refresh_ColorAttachmentDescription | typedef struct Refresh_ColorAttachmentDescription | ||||||
| { | { | ||||||
| 	Refresh_TextureFormat format; | 	Refresh_TextureFormat format; | ||||||
| 	Refresh_SampleCount sampleCount; |  | ||||||
| 	Refresh_ColorAttachmentBlendState blendState; | 	Refresh_ColorAttachmentBlendState blendState; | ||||||
| } Refresh_ColorAttachmentDescription; | } Refresh_ColorAttachmentDescription; | ||||||
| 
 | 
 | ||||||
|  | @ -544,7 +553,6 @@ typedef struct Refresh_ColorAttachmentInfo | ||||||
| 	uint32_t depth; | 	uint32_t depth; | ||||||
| 	uint32_t layer; | 	uint32_t layer; | ||||||
| 	uint32_t level; | 	uint32_t level; | ||||||
| 	Refresh_SampleCount sampleCount; |  | ||||||
| 	Refresh_Vec4 clearColor; /* Can be ignored by RenderPass */ | 	Refresh_Vec4 clearColor; /* Can be ignored by RenderPass */ | ||||||
| 	Refresh_LoadOp loadOp; | 	Refresh_LoadOp loadOp; | ||||||
| 	Refresh_StoreOp storeOp; | 	Refresh_StoreOp storeOp; | ||||||
|  | @ -581,15 +589,29 @@ REFRESHAPI void Refresh_HookLogFunctions( | ||||||
| 	Refresh_LogFunc error | 	Refresh_LogFunc error | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
|  | /* Backend selection */ | ||||||
|  | 
 | ||||||
|  | /* Select the graphics API backend that Refresh should use.
 | ||||||
|  |  * | ||||||
|  |  * Note that Refresh is not required to select your preferred backend | ||||||
|  |  * if it detects an incompatibility. | ||||||
|  |  * | ||||||
|  |  * Returns the backend that will actually be used, and fills in a window flag bitmask. | ||||||
|  |  * This bitmask should be used to create all windows that the device claims. | ||||||
|  |  * | ||||||
|  |  * preferredBackend: The preferred backend that Refresh should select. | ||||||
|  |  * flags: A pointer to a bitflag value that will be filled in with required SDL_WindowFlags masks. | ||||||
|  |  */ | ||||||
|  | REFRESHAPI Refresh_Backend Refresh_SelectBackend(Refresh_Backend preferredBackend, uint32_t *flags); | ||||||
|  | 
 | ||||||
| /* Device */ | /* Device */ | ||||||
| 
 | 
 | ||||||
| /* Create a rendering context for use on the calling thread.
 | /* Create a rendering context for use on the calling thread.
 | ||||||
|  |  * You MUST have called Refresh_SelectDriver prior to calling this function. | ||||||
|  * |  * | ||||||
|  * presentationParameters: A window handle and presentation mode. |  | ||||||
|  * debugMode: Enable debug mode properties. |  * debugMode: Enable debug mode properties. | ||||||
|  */ |  */ | ||||||
| REFRESHAPI Refresh_Device* Refresh_CreateDevice( | REFRESHAPI Refresh_Device* Refresh_CreateDevice( | ||||||
| 	Refresh_PresentationParameters *presentationParameters, |  | ||||||
| 	uint8_t debugMode | 	uint8_t debugMode | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
|  | @ -652,6 +674,27 @@ REFRESHAPI void Refresh_DrawPrimitives( | ||||||
| 	uint32_t fragmentParamOffset | 	uint32_t fragmentParamOffset | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
|  | /* Similar to Refresh_DrawPrimitives, but draw parameters are set from a buffer.
 | ||||||
|  |  * The buffer layout should match the layout of Refresh_IndirectDrawCommand. | ||||||
|  |  * | ||||||
|  |  * buffer:              A buffer containing draw parameters. | ||||||
|  |  * offsetInBytes:       The offset to start reading from the draw buffer. | ||||||
|  |  * drawCount:           The number of draw parameter sets that should be read from the draw buffer. | ||||||
|  |  * stride:              The byte stride between sets of draw parameters. | ||||||
|  |  * vertexParamOffset:   The offset of the vertex shader param data. | ||||||
|  |  * fragmentParamOffset:	The offset of the fragment shader param data. | ||||||
|  |  */ | ||||||
|  | REFRESHAPI void Refresh_DrawPrimitivesIndirect( | ||||||
|  | 	Refresh_Device *device, | ||||||
|  | 	Refresh_CommandBuffer *commandBuffer, | ||||||
|  | 	Refresh_Buffer *buffer, | ||||||
|  | 	uint32_t offsetInBytes, | ||||||
|  | 	uint32_t drawCount, | ||||||
|  | 	uint32_t stride, | ||||||
|  | 	uint32_t vertexParamOffset, | ||||||
|  | 	uint32_t fragmentParamOffset | ||||||
|  | ); | ||||||
|  | 
 | ||||||
| /* Dispatches work compute items.
 | /* Dispatches work compute items.
 | ||||||
|  * |  * | ||||||
|  * groupCountX:			Number of local workgroups to dispatch in the X dimension. |  * groupCountX:			Number of local workgroups to dispatch in the X dimension. | ||||||
|  | @ -716,6 +759,11 @@ REFRESHAPI Refresh_Buffer* Refresh_CreateBuffer( | ||||||
| /* Setters */ | /* Setters */ | ||||||
| 
 | 
 | ||||||
| /* Uploads image data to a texture object.
 | /* Uploads image data to a texture object.
 | ||||||
|  |  * | ||||||
|  |  * NOTE: | ||||||
|  |  *	DO NOT expect this to execute in sequence relative to other commands! | ||||||
|  |  *	Calling SetTextureData in a command buffer that also references the | ||||||
|  |  *	texture may result in undefined behavior. | ||||||
|  * |  * | ||||||
|  * 	textureSlice:		The texture slice to be updated. |  * 	textureSlice:		The texture slice to be updated. | ||||||
|  * 	data:				A pointer to the image data. |  * 	data:				A pointer to the image data. | ||||||
|  | @ -738,8 +786,13 @@ REFRESHAPI void Refresh_SetTextureData( | ||||||
|  * yHeight:      The height of the Y plane. |  * yHeight:      The height of the Y plane. | ||||||
|  * uvWidth:      The width of the U/V planes. |  * uvWidth:      The width of the U/V planes. | ||||||
|  * uvHeight:     The height of the U/V planes. |  * uvHeight:     The height of the U/V planes. | ||||||
|  * data:	A pointer to the raw YUV image data. |  * yData:        A pointer to the raw Y image data. | ||||||
|  * dataLength:	The size of the image data in bytes. |  * uData:        A pointer to the raw U image data. | ||||||
|  |  * vData:        A pointer to the raw V image data. | ||||||
|  |  * yDataLength:  The size of the Y image data in bytes. | ||||||
|  |  * uvDataLength: The size of the UV image data in bytes. | ||||||
|  |  * yStride:      The length of a Y image data row in bytes. | ||||||
|  |  * uvStride:     The length of a UV image data row in bytes. | ||||||
|  */ |  */ | ||||||
| REFRESHAPI void Refresh_SetTextureDataYUV( | REFRESHAPI void Refresh_SetTextureDataYUV( | ||||||
| 	Refresh_Device *driverData, | 	Refresh_Device *driverData, | ||||||
|  | @ -751,8 +804,13 @@ REFRESHAPI void Refresh_SetTextureDataYUV( | ||||||
| 	uint32_t yHeight, | 	uint32_t yHeight, | ||||||
| 	uint32_t uvWidth, | 	uint32_t uvWidth, | ||||||
| 	uint32_t uvHeight, | 	uint32_t uvHeight, | ||||||
| 	void* data, | 	void *yDataPtr, | ||||||
| 	uint32_t dataLength | 	void *uDataPtr, | ||||||
|  | 	void *vDataPtr, | ||||||
|  | 	uint32_t yDataLength, | ||||||
|  | 	uint32_t uvDataLength, | ||||||
|  | 	uint32_t yStride, | ||||||
|  | 	uint32_t uvStride | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
| /* Performs an asynchronous texture-to-texture copy.
 | /* Performs an asynchronous texture-to-texture copy.
 | ||||||
|  | @ -951,11 +1009,6 @@ REFRESHAPI void Refresh_QueueDestroyGraphicsPipeline( | ||||||
| /* Begins a render pass.
 | /* Begins a render pass.
 | ||||||
|  * This will also set a default viewport and scissor state. |  * This will also set a default viewport and scissor state. | ||||||
|  * |  * | ||||||
|  * renderArea: |  | ||||||
|  * 		The area affected by the render pass. |  | ||||||
|  * 		All load, store and resolve operations are restricted |  | ||||||
|  * 		to the given rectangle. |  | ||||||
|  * 		If NULL, a sensible default will be chosen. |  | ||||||
|  * colorAttachmentInfos: |  * colorAttachmentInfos: | ||||||
|  * 		A pointer to an array of Refresh_ColorAttachmentInfo structures |  * 		A pointer to an array of Refresh_ColorAttachmentInfo structures | ||||||
|  * 		that contains render targets and clear values. May be NULL. |  * 		that contains render targets and clear values. May be NULL. | ||||||
|  | @ -965,7 +1018,6 @@ REFRESHAPI void Refresh_QueueDestroyGraphicsPipeline( | ||||||
| REFRESHAPI void Refresh_BeginRenderPass( | REFRESHAPI void Refresh_BeginRenderPass( | ||||||
| 	Refresh_Device *device, | 	Refresh_Device *device, | ||||||
| 	Refresh_CommandBuffer *commandBuffer, | 	Refresh_CommandBuffer *commandBuffer, | ||||||
| 	Refresh_Rect *renderArea, |  | ||||||
| 	Refresh_ColorAttachmentInfo *colorAttachmentInfos, | 	Refresh_ColorAttachmentInfo *colorAttachmentInfos, | ||||||
| 	uint32_t colorAttachmentCount, | 	uint32_t colorAttachmentCount, | ||||||
| 	Refresh_DepthStencilAttachmentInfo *depthStencilAttachmentInfo | 	Refresh_DepthStencilAttachmentInfo *depthStencilAttachmentInfo | ||||||
|  | @ -998,7 +1050,9 @@ REFRESHAPI void Refresh_SetScissor( | ||||||
| 	Refresh_Rect *scissor | 	Refresh_Rect *scissor | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
| /* Binds vertex buffers for use with subsequent draw calls. */ | /* Binds vertex buffers for use with subsequent draw calls.
 | ||||||
|  |  * Note that this may only be called after binding a graphics pipeline. | ||||||
|  |  */ | ||||||
| REFRESHAPI void Refresh_BindVertexBuffers( | REFRESHAPI void Refresh_BindVertexBuffers( | ||||||
| 	Refresh_Device *device, | 	Refresh_Device *device, | ||||||
| 	Refresh_CommandBuffer *commandBuffer, | 	Refresh_CommandBuffer *commandBuffer, | ||||||
|  | @ -1082,6 +1136,41 @@ REFRESHAPI void Refresh_BindComputeTextures( | ||||||
| 
 | 
 | ||||||
| /* Submission/Presentation */ | /* Submission/Presentation */ | ||||||
| 
 | 
 | ||||||
|  | /* Claims a window, creating a swapchain structure for it.
 | ||||||
|  |  * This function MUST be called before any swapchain functions | ||||||
|  |  * are called using the window. | ||||||
|  |  * | ||||||
|  |  * Returns 0 on swapchain creation failure. | ||||||
|  |  */ | ||||||
|  | REFRESHAPI uint8_t Refresh_ClaimWindow( | ||||||
|  | 	Refresh_Device *device, | ||||||
|  | 	void *windowHandle, | ||||||
|  | 	Refresh_PresentMode presentMode | ||||||
|  | ); | ||||||
|  | 
 | ||||||
|  | /* Unclaims a window, destroying the swapchain structure for it.
 | ||||||
|  |  * It is good practice to call this when a window is closed to | ||||||
|  |  * prevent memory bloat, but windows are automatically unclaimed | ||||||
|  |  * by DestroyDevice. | ||||||
|  |  */ | ||||||
|  | REFRESHAPI void Refresh_UnclaimWindow( | ||||||
|  | 	Refresh_Device *device, | ||||||
|  | 	void *windowHandle | ||||||
|  | ); | ||||||
|  | 
 | ||||||
|  | /* Changes the present mode of the swapchain for the given window. */ | ||||||
|  | REFRESHAPI void Refresh_SetSwapchainPresentMode( | ||||||
|  | 	Refresh_Device *device, | ||||||
|  | 	void *windowHandle, | ||||||
|  | 	Refresh_PresentMode presentMode | ||||||
|  | ); | ||||||
|  | 
 | ||||||
|  | /* Returns the format of the swapchain for the given window. */ | ||||||
|  | REFRESHAPI Refresh_TextureFormat Refresh_GetSwapchainFormat( | ||||||
|  | 	Refresh_Device *device, | ||||||
|  | 	void *windowHandle | ||||||
|  | ); | ||||||
|  | 
 | ||||||
| /* Returns an allocated Refresh_CommandBuffer* object.
 | /* Returns an allocated Refresh_CommandBuffer* object.
 | ||||||
|  * This command buffer is managed by the implementation and |  * This command buffer is managed by the implementation and | ||||||
|  * should NOT be freed by the user. |  * should NOT be freed by the user. | ||||||
|  | @ -1090,15 +1179,9 @@ REFRESHAPI void Refresh_BindComputeTextures( | ||||||
|  * 	A command buffer may only be used on the thread that |  * 	A command buffer may only be used on the thread that | ||||||
|  * 	it was acquired on. Using it on any other thread is an error. |  * 	it was acquired on. Using it on any other thread is an error. | ||||||
|  * |  * | ||||||
|  * fixed: |  | ||||||
|  * 	If a command buffer is designated as fixed, it can be |  | ||||||
|  * 	acquired once, have commands recorded into it, and |  | ||||||
|  * 	be re-submitted indefinitely. |  | ||||||
|  * |  | ||||||
|  */ |  */ | ||||||
| REFRESHAPI Refresh_CommandBuffer* Refresh_AcquireCommandBuffer( | REFRESHAPI Refresh_CommandBuffer* Refresh_AcquireCommandBuffer( | ||||||
| 	Refresh_Device *device, | 	Refresh_Device *device | ||||||
| 	uint8_t fixed |  | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
| /* Acquires a texture to use for presentation.
 | /* Acquires a texture to use for presentation.
 | ||||||
|  | @ -1121,24 +1204,53 @@ REFRESHAPI Refresh_Texture* Refresh_AcquireSwapchainTexture( | ||||||
| 	uint32_t *pHeight | 	uint32_t *pHeight | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
| /* Returns the format of the swapchain for the given window. */ |  | ||||||
| REFRESHAPI Refresh_TextureFormat Refresh_GetSwapchainFormat( |  | ||||||
| 	Refresh_Device *device, |  | ||||||
| 	void *windowHandle |  | ||||||
| ); |  | ||||||
| 
 |  | ||||||
| /* Submits all of the enqueued commands. */ | /* Submits all of the enqueued commands. */ | ||||||
| REFRESHAPI void Refresh_Submit( | REFRESHAPI void Refresh_Submit( | ||||||
| 	Refresh_Device* device, | 	Refresh_Device* device, | ||||||
| 	uint32_t commandBufferCount, | 	Refresh_CommandBuffer *commandBuffer | ||||||
| 	Refresh_CommandBuffer **pCommandBuffers |  | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
| /* Waits for all submissions to complete. */ | /* Submits a command buffer and acquires a fence.
 | ||||||
|  |  * You can use the fence to check if or wait until the command buffer has finished processing. | ||||||
|  |  * You are responsible for releasing this fence when you are done using it. | ||||||
|  |  */ | ||||||
|  | REFRESHAPI Refresh_Fence* Refresh_SubmitAndAcquireFence( | ||||||
|  | 	Refresh_Device* device, | ||||||
|  | 	Refresh_CommandBuffer *commandBuffer | ||||||
|  | ); | ||||||
|  | 
 | ||||||
|  | /* Waits for the device to become idle. */ | ||||||
| REFRESHAPI void Refresh_Wait( | REFRESHAPI void Refresh_Wait( | ||||||
| 	Refresh_Device *device | 	Refresh_Device *device | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
|  | /* Waits for given fences to be signaled.
 | ||||||
|  |  * | ||||||
|  |  * waitAll: If 0, waits for any fence to be signaled. If 1, waits for all fences to be signaled. | ||||||
|  |  * fenceCount: The number of fences being submitted. | ||||||
|  |  * pFences: An array of fences to be waited on. | ||||||
|  |  */ | ||||||
|  | REFRESHAPI void Refresh_WaitForFences( | ||||||
|  | 	Refresh_Device *device, | ||||||
|  | 	uint8_t waitAll, | ||||||
|  | 	uint32_t fenceCount, | ||||||
|  | 	Refresh_Fence **pFences | ||||||
|  | ); | ||||||
|  | 
 | ||||||
|  | /* Check the status of a fence. 1 means the fence is signaled. */ | ||||||
|  | REFRESHAPI int Refresh_QueryFence( | ||||||
|  | 	Refresh_Device *device, | ||||||
|  | 	Refresh_Fence *fence | ||||||
|  | ); | ||||||
|  | 
 | ||||||
|  | /* Allows the fence to be reused by future command buffer submissions.
 | ||||||
|  |  * If you do not release fences after acquiring them, you will cause unbounded resource growth. | ||||||
|  |  */ | ||||||
|  | REFRESHAPI void Refresh_ReleaseFence( | ||||||
|  | 	Refresh_Device *device, | ||||||
|  | 	Refresh_Fence *fence | ||||||
|  | ); | ||||||
|  | 
 | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| } | } | ||||||
| #endif /* __cplusplus */ | #endif /* __cplusplus */ | ||||||
|  |  | ||||||
|  | @ -44,44 +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 32-bit color data into PNG data.
 | /* Returns a buffer of PNG encoded from RGBA8 color data.
 | ||||||
|  * |  * | ||||||
|  * filename:    The filename that the image will be written to. |  | ||||||
|  * w:	        The width of the PNG data. |  | ||||||
|  * h:	        The height of the PNG data. |  | ||||||
|  * bgra:		Whether the data is in BGRA8 format. Otherwise will assume RBGA8. |  | ||||||
|  * data:	The raw color data. |  * data:	The raw color data. | ||||||
|  |  * w:		The width of the color data. | ||||||
|  |  * h:		The height of the color 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, | ||||||
|  | 	uint8_t* data, | ||||||
| 	int32_t w, | 	int32_t w, | ||||||
| 	int32_t h, | 	int32_t h | ||||||
| 	uint8_t bgra, |  | ||||||
| 	uint8_t *data |  | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
| #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> | ||||||
							
								
								
									
										276
									
								
								src/Refresh.c
								
								
								
								
							
							
						
						
									
										276
									
								
								src/Refresh.c
								
								
								
								
							|  | @ -33,14 +33,22 @@ | ||||||
| 
 | 
 | ||||||
| /* Drivers */ | /* Drivers */ | ||||||
| 
 | 
 | ||||||
| static const Refresh_Driver *drivers[] = { | #ifdef REFRESH_DRIVER_VULKAN | ||||||
| #if REFRESH_DRIVER_VULKAN | 	#define VULKAN_DRIVER &VulkanDriver | ||||||
| 	&VulkanDriver, | #else | ||||||
|  | 	#define VULKAN_DRIVER NULL | ||||||
| #endif | #endif | ||||||
| #if REFRESH_DRIVER_D3D11 | 
 | ||||||
| 	&D3D11Driver, | #ifdef REFRESH_DRIVER_PS5 | ||||||
|  | 	#define PS5_DRIVER &PS5Driver | ||||||
|  | #else | ||||||
|  | 	#define PS5_DRIVER NULL | ||||||
| #endif | #endif | ||||||
| 	NULL | 
 | ||||||
|  | static const Refresh_Driver *backends[] = { | ||||||
|  | 	NULL, | ||||||
|  | 	VULKAN_DRIVER, | ||||||
|  | 	PS5_DRIVER | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /* Logging */ | /* Logging */ | ||||||
|  | @ -129,42 +137,57 @@ uint32_t Refresh_LinkedVersion(void) | ||||||
| 
 | 
 | ||||||
| /* Driver Functions */ | /* Driver Functions */ | ||||||
| 
 | 
 | ||||||
| static int32_t selectedDriver = -1; | static Refresh_Backend selectedBackend = REFRESH_BACKEND_INVALID; | ||||||
|  | 
 | ||||||
|  | Refresh_Backend Refresh_SelectBackend(Refresh_Backend preferredBackend, uint32_t *flags) | ||||||
|  | { | ||||||
|  | 	uint32_t i; | ||||||
|  | 
 | ||||||
|  | 	if (preferredBackend != REFRESH_BACKEND_DONTCARE) | ||||||
|  | 	{ | ||||||
|  | 		if (backends[preferredBackend] == NULL) | ||||||
|  | 		{ | ||||||
|  | 			Refresh_LogWarn("Preferred backend was not compiled into this binary! Attempting to fall back!"); | ||||||
|  | 		} | ||||||
|  | 		else if (backends[preferredBackend]->PrepareDriver(flags)) | ||||||
|  | 		{ | ||||||
|  | 			selectedBackend = preferredBackend; | ||||||
|  | 			return selectedBackend; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/* Iterate until we find an appropriate backend. */ | ||||||
|  | 
 | ||||||
|  | 	for (i = 1; i < SDL_arraysize(backends); i += 1) | ||||||
|  | 	{ | ||||||
|  | 		if (i != preferredBackend && backends[i] != NULL && backends[i]->PrepareDriver(flags)) | ||||||
|  | 		{ | ||||||
|  | 			selectedBackend = i; | ||||||
|  | 			return i; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (backends[i] == NULL) | ||||||
|  | 	{ | ||||||
|  | 		Refresh_LogError("No supported Refresh backend found!"); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	selectedBackend = REFRESH_BACKEND_INVALID; | ||||||
|  | 	return REFRESH_BACKEND_INVALID; | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| Refresh_Device* Refresh_CreateDevice( | Refresh_Device* Refresh_CreateDevice( | ||||||
| 	Refresh_PresentationParameters *presentationParameters, |  | ||||||
| 	uint8_t debugMode | 	uint8_t debugMode | ||||||
| ) { | ) { | ||||||
| 	uint32_t result = 0; | 	if (selectedBackend == REFRESH_BACKEND_INVALID) | ||||||
| 	uint32_t i; |  | ||||||
| 	const char *hint = SDL_GetHint("REFRESH_FORCE_DRIVER"); |  | ||||||
| 	for (i = 0; drivers[i] != NULL; i += 1) |  | ||||||
| 	{ | 	{ | ||||||
| 		if (hint != NULL) | 		Refresh_LogError("Invalid backend selection. Did you call Refresh_SelectBackend?"); | ||||||
| 		{ |  | ||||||
| 			if (SDL_strcmp(hint, drivers[i]->Name) != 0) |  | ||||||
| 			{ |  | ||||||
| 				continue; |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		/* FIXME: add fallback driver handling */ |  | ||||||
| 		break; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if (drivers[i] == NULL) |  | ||||||
| 	{ |  | ||||||
| 		Refresh_LogError("No supported Refresh driver found!"); |  | ||||||
| 		return NULL; | 		return NULL; | ||||||
| 	} | 	} | ||||||
| 	else | 
 | ||||||
| 	{ | 	return backends[selectedBackend]->CreateDevice( | ||||||
| 		selectedDriver = i; |  | ||||||
| 		return drivers[selectedDriver]->CreateDevice( |  | ||||||
| 			presentationParameters, |  | ||||||
| 		debugMode | 		debugMode | ||||||
| 	); | 	); | ||||||
| 	} |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Refresh_DestroyDevice(Refresh_Device *device) | void Refresh_DestroyDevice(Refresh_Device *device) | ||||||
|  | @ -236,6 +259,29 @@ void Refresh_DrawPrimitives( | ||||||
| 	); | 	); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void Refresh_DrawPrimitivesIndirect( | ||||||
|  | 	Refresh_Device *device, | ||||||
|  | 	Refresh_CommandBuffer *commandBuffer, | ||||||
|  | 	Refresh_Buffer *buffer, | ||||||
|  | 	uint32_t offsetInBytes, | ||||||
|  | 	uint32_t drawCount, | ||||||
|  | 	uint32_t stride, | ||||||
|  | 	uint32_t vertexParamOffset, | ||||||
|  | 	uint32_t fragmentParamOffset | ||||||
|  | ) { | ||||||
|  | 	NULL_RETURN(device); | ||||||
|  | 	device->DrawPrimitivesIndirect( | ||||||
|  | 		device->driverData, | ||||||
|  | 		commandBuffer, | ||||||
|  | 		buffer, | ||||||
|  | 		offsetInBytes, | ||||||
|  | 		drawCount, | ||||||
|  | 		stride, | ||||||
|  | 		vertexParamOffset, | ||||||
|  | 		fragmentParamOffset | ||||||
|  | 	); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void Refresh_DispatchCompute( | void Refresh_DispatchCompute( | ||||||
| 	Refresh_Device *device, | 	Refresh_Device *device, | ||||||
| 	Refresh_CommandBuffer *commandBuffer, | 	Refresh_CommandBuffer *commandBuffer, | ||||||
|  | @ -292,10 +338,52 @@ Refresh_ShaderModule* Refresh_CreateShaderModule( | ||||||
| 	Refresh_Device *device, | 	Refresh_Device *device, | ||||||
| 	Refresh_ShaderModuleCreateInfo *shaderModuleCreateInfo | 	Refresh_ShaderModuleCreateInfo *shaderModuleCreateInfo | ||||||
| ) { | ) { | ||||||
|  | 	Refresh_ShaderModuleCreateInfo driverSpecificCreateInfo = { 0, NULL }; | ||||||
|  | 	uint8_t *bytes; | ||||||
|  | 	uint32_t i, size; | ||||||
|  | 
 | ||||||
| 	NULL_RETURN_NULL(device); | 	NULL_RETURN_NULL(device); | ||||||
|  | 
 | ||||||
|  | 	/* verify the magic number in the shader blob header */ | ||||||
|  | 	bytes = (uint8_t*) shaderModuleCreateInfo->byteCode; | ||||||
|  | 	if (bytes[0] != 'R' || bytes[1] != 'F' || bytes[2] != 'S' || bytes[3] != 'H') | ||||||
|  | 	{ | ||||||
|  | 		Refresh_LogError("Cannot parse malformed Refresh shader blob!"); | ||||||
|  | 		return NULL; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/* find the code for the selected backend */ | ||||||
|  | 	i = 4; | ||||||
|  | 	while (i < shaderModuleCreateInfo->codeSize) | ||||||
|  | 	{ | ||||||
|  | 		size = *((uint32_t*) &bytes[i + 1]); | ||||||
|  | 
 | ||||||
|  | 		if (bytes[i] == (uint8_t) selectedBackend) | ||||||
|  | 		{ | ||||||
|  | 			driverSpecificCreateInfo.codeSize = size; | ||||||
|  | 			driverSpecificCreateInfo.byteCode = (uint32_t*) &bytes[i + 1 + sizeof(uint32_t)]; | ||||||
|  | 			break; | ||||||
|  | 		} | ||||||
|  | 		else | ||||||
|  | 		{ | ||||||
|  | 			/* skip over the backend byte, the blob size, and the blob */ | ||||||
|  | 			i += 1 + sizeof(uint32_t) + size; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/* verify the shader blob supports the selected backend */ | ||||||
|  | 	if (driverSpecificCreateInfo.byteCode == NULL) | ||||||
|  | 	{ | ||||||
|  | 		Refresh_LogError( | ||||||
|  | 			"Cannot create shader module that does not contain shader code for the selected backend! " | ||||||
|  | 			"Recompile your shader and enable this backend." | ||||||
|  | 		); | ||||||
|  | 		return NULL; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	return device->CreateShaderModule( | 	return device->CreateShaderModule( | ||||||
| 		device->driverData, | 		device->driverData, | ||||||
| 		shaderModuleCreateInfo | 		&driverSpecificCreateInfo | ||||||
| 	); | 	); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -350,8 +438,13 @@ void Refresh_SetTextureDataYUV( | ||||||
| 	uint32_t yHeight, | 	uint32_t yHeight, | ||||||
| 	uint32_t uvWidth, | 	uint32_t uvWidth, | ||||||
| 	uint32_t uvHeight, | 	uint32_t uvHeight, | ||||||
| 	void* data, | 	void *yDataPtr, | ||||||
| 	uint32_t dataLength | 	void *uDataPtr, | ||||||
|  | 	void *vDataPtr, | ||||||
|  | 	uint32_t yDataLength, | ||||||
|  | 	uint32_t uvDataLength, | ||||||
|  | 	uint32_t yStride, | ||||||
|  | 	uint32_t uvStride | ||||||
| ) { | ) { | ||||||
| 	NULL_RETURN(device); | 	NULL_RETURN(device); | ||||||
| 	device->SetTextureDataYUV( | 	device->SetTextureDataYUV( | ||||||
|  | @ -364,8 +457,13 @@ void Refresh_SetTextureDataYUV( | ||||||
| 		yHeight, | 		yHeight, | ||||||
| 		uvWidth, | 		uvWidth, | ||||||
| 		uvHeight, | 		uvHeight, | ||||||
| 		data, | 		yDataPtr, | ||||||
| 		dataLength | 		uDataPtr, | ||||||
|  | 		vDataPtr, | ||||||
|  | 		yDataLength, | ||||||
|  | 		uvDataLength, | ||||||
|  | 		yStride, | ||||||
|  | 		uvStride | ||||||
| 	); | 	); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -579,7 +677,6 @@ void Refresh_QueueDestroyGraphicsPipeline( | ||||||
| void Refresh_BeginRenderPass( | void Refresh_BeginRenderPass( | ||||||
| 	Refresh_Device *device, | 	Refresh_Device *device, | ||||||
| 	Refresh_CommandBuffer *commandBuffer, | 	Refresh_CommandBuffer *commandBuffer, | ||||||
| 	Refresh_Rect *renderArea, |  | ||||||
| 	Refresh_ColorAttachmentInfo *colorAttachmentInfos, | 	Refresh_ColorAttachmentInfo *colorAttachmentInfos, | ||||||
| 	uint32_t colorAttachmentCount, | 	uint32_t colorAttachmentCount, | ||||||
| 	Refresh_DepthStencilAttachmentInfo *depthStencilAttachmentInfo | 	Refresh_DepthStencilAttachmentInfo *depthStencilAttachmentInfo | ||||||
|  | @ -588,7 +685,6 @@ void Refresh_BeginRenderPass( | ||||||
| 	device->BeginRenderPass( | 	device->BeginRenderPass( | ||||||
| 		device->driverData, | 		device->driverData, | ||||||
| 		commandBuffer, | 		commandBuffer, | ||||||
| 		renderArea, |  | ||||||
| 		colorAttachmentInfos, | 		colorAttachmentInfos, | ||||||
| 		colorAttachmentCount, | 		colorAttachmentCount, | ||||||
| 		depthStencilAttachmentInfo | 		depthStencilAttachmentInfo | ||||||
|  | @ -720,14 +816,36 @@ void Refresh_BindComputeTextures( | ||||||
| 	); | 	); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| Refresh_CommandBuffer* Refresh_AcquireCommandBuffer( | uint8_t Refresh_ClaimWindow( | ||||||
| 	Refresh_Device *device, | 	Refresh_Device *device, | ||||||
| 	uint8_t fixed | 	void *windowHandle, | ||||||
|  | 	Refresh_PresentMode presentMode | ||||||
|  | ) { | ||||||
|  | 	if (device == NULL) { return 0; } | ||||||
|  | 	return device->ClaimWindow( | ||||||
|  | 		device->driverData, | ||||||
|  | 		windowHandle, | ||||||
|  | 		presentMode | ||||||
|  | 	); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void Refresh_UnclaimWindow( | ||||||
|  | 	Refresh_Device *device, | ||||||
|  | 	void *windowHandle | ||||||
|  | ) { | ||||||
|  | 	NULL_RETURN(device); | ||||||
|  | 	device->UnclaimWindow( | ||||||
|  | 		device->driverData, | ||||||
|  | 		windowHandle | ||||||
|  | 	); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | Refresh_CommandBuffer* Refresh_AcquireCommandBuffer( | ||||||
|  | 	Refresh_Device *device | ||||||
| ) { | ) { | ||||||
| 	NULL_RETURN_NULL(device); | 	NULL_RETURN_NULL(device); | ||||||
| 	return device->AcquireCommandBuffer( | 	return device->AcquireCommandBuffer( | ||||||
| 		device->driverData, | 		device->driverData | ||||||
| 		fixed |  | ||||||
| 	); | 	); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -759,16 +877,38 @@ Refresh_TextureFormat Refresh_GetSwapchainFormat( | ||||||
| 	); | 	); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void Refresh_SetSwapchainPresentMode( | ||||||
|  | 	Refresh_Device *device, | ||||||
|  | 	void *windowHandle, | ||||||
|  | 	Refresh_PresentMode presentMode | ||||||
|  | ) { | ||||||
|  | 	NULL_RETURN(device); | ||||||
|  | 	device->SetSwapchainPresentMode( | ||||||
|  | 		device->driverData, | ||||||
|  | 		windowHandle, | ||||||
|  | 		presentMode | ||||||
|  | 	); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void Refresh_Submit( | void Refresh_Submit( | ||||||
| 	Refresh_Device *device, | 	Refresh_Device *device, | ||||||
| 	uint32_t commandBufferCount, | 	Refresh_CommandBuffer *commandBuffer | ||||||
| 	Refresh_CommandBuffer **pCommandBuffers |  | ||||||
| ) { | ) { | ||||||
| 	NULL_RETURN(device); | 	NULL_RETURN(device); | ||||||
| 	device->Submit( | 	device->Submit( | ||||||
| 		device->driverData, | 		device->driverData, | ||||||
| 		commandBufferCount, | 		commandBuffer | ||||||
| 		pCommandBuffers | 	); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | Refresh_Fence* Refresh_SubmitAndAcquireFence( | ||||||
|  | 	Refresh_Device *device, | ||||||
|  | 	Refresh_CommandBuffer *commandBuffer | ||||||
|  | ) { | ||||||
|  | 	NULL_RETURN_NULL(device); | ||||||
|  | 	return device->SubmitAndAcquireFence( | ||||||
|  | 		device->driverData, | ||||||
|  | 		commandBuffer | ||||||
| 	); | 	); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -781,4 +921,44 @@ void Refresh_Wait( | ||||||
| 	); | 	); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void Refresh_WaitForFences( | ||||||
|  | 	Refresh_Device *device, | ||||||
|  | 	uint8_t waitAll, | ||||||
|  | 	uint32_t fenceCount, | ||||||
|  | 	Refresh_Fence **pFences | ||||||
|  | ) { | ||||||
|  | 	NULL_RETURN(device); | ||||||
|  | 	device->WaitForFences( | ||||||
|  | 		device->driverData, | ||||||
|  | 		waitAll, | ||||||
|  | 		fenceCount, | ||||||
|  | 		pFences | ||||||
|  | 	); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int Refresh_QueryFence( | ||||||
|  | 	Refresh_Device *device, | ||||||
|  | 	Refresh_Fence *fence | ||||||
|  | ) { | ||||||
|  | 	if (device == NULL) { | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return device->QueryFence( | ||||||
|  | 		device->driverData, | ||||||
|  | 		fence | ||||||
|  | 	); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void Refresh_ReleaseFence( | ||||||
|  | 	Refresh_Device *device, | ||||||
|  | 	Refresh_Fence *fence | ||||||
|  | ) { | ||||||
|  | 	NULL_RETURN(device); | ||||||
|  | 	device->ReleaseFence( | ||||||
|  | 		device->driverData, | ||||||
|  | 		fence | ||||||
|  | 	); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /* vim: set noexpandtab shiftwidth=8 tabstop=8: */ | /* vim: set noexpandtab shiftwidth=8 tabstop=8: */ | ||||||
|  |  | ||||||
|  | @ -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; | ||||||
|  | @ -198,6 +213,17 @@ struct Refresh_Device | ||||||
| 		uint32_t fragmentParamOffset | 		uint32_t fragmentParamOffset | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
|  | 	void (*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 | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
| 	void (*DispatchCompute)( | 	void (*DispatchCompute)( | ||||||
| 		Refresh_Renderer *device, | 		Refresh_Renderer *device, | ||||||
| 		Refresh_CommandBuffer *commandBuffer, | 		Refresh_CommandBuffer *commandBuffer, | ||||||
|  | @ -242,7 +268,7 @@ struct Refresh_Device | ||||||
| 
 | 
 | ||||||
| 	/* Setters */ | 	/* Setters */ | ||||||
| 
 | 
 | ||||||
| 	void(*SetTextureData)( | 	void (*SetTextureData)( | ||||||
| 		Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
| 		Refresh_CommandBuffer *commandBuffer, | 		Refresh_CommandBuffer *commandBuffer, | ||||||
| 		Refresh_TextureSlice *textureSlice, | 		Refresh_TextureSlice *textureSlice, | ||||||
|  | @ -250,7 +276,7 @@ struct Refresh_Device | ||||||
| 		uint32_t dataLengthInBytes | 		uint32_t dataLengthInBytes | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	void(*SetTextureDataYUV)( | 	void (*SetTextureDataYUV)( | ||||||
| 		Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
| 		Refresh_CommandBuffer* commandBuffer, | 		Refresh_CommandBuffer* commandBuffer, | ||||||
| 		Refresh_Texture *y, | 		Refresh_Texture *y, | ||||||
|  | @ -260,11 +286,16 @@ struct Refresh_Device | ||||||
| 		uint32_t yHeight, | 		uint32_t yHeight, | ||||||
| 		uint32_t uvWidth, | 		uint32_t uvWidth, | ||||||
| 		uint32_t uvHeight, | 		uint32_t uvHeight, | ||||||
| 		void* data, | 		void *yDataPtr, | ||||||
| 		uint32_t dataLength | 		void *uDataPtr, | ||||||
|  | 		void *vDataPtr, | ||||||
|  | 		uint32_t yDataLength, | ||||||
|  | 		uint32_t uvDataLength, | ||||||
|  | 		uint32_t yStride, | ||||||
|  | 		uint32_t uvStride | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	void(*CopyTextureToTexture)( | 	void (*CopyTextureToTexture)( | ||||||
| 		Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
| 		Refresh_CommandBuffer *commandBuffer, | 		Refresh_CommandBuffer *commandBuffer, | ||||||
| 		Refresh_TextureSlice *sourceTextureSlice, | 		Refresh_TextureSlice *sourceTextureSlice, | ||||||
|  | @ -272,14 +303,14 @@ struct Refresh_Device | ||||||
| 		Refresh_Filter filter | 		Refresh_Filter filter | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	void(*CopyTextureToBuffer)( | 	void (*CopyTextureToBuffer)( | ||||||
| 		Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
| 		Refresh_CommandBuffer *commandBuffer, | 		Refresh_CommandBuffer *commandBuffer, | ||||||
| 		Refresh_TextureSlice *textureSlice, | 		Refresh_TextureSlice *textureSlice, | ||||||
| 		Refresh_Buffer *buffer | 		Refresh_Buffer *buffer | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	void(*SetBufferData)( | 	void (*SetBufferData)( | ||||||
| 		Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
| 		Refresh_CommandBuffer *commandBuffer, | 		Refresh_CommandBuffer *commandBuffer, | ||||||
| 		Refresh_Buffer *buffer, | 		Refresh_Buffer *buffer, | ||||||
|  | @ -288,14 +319,14 @@ struct Refresh_Device | ||||||
| 		uint32_t dataLength | 		uint32_t dataLength | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	uint32_t(*PushVertexShaderUniforms)( | 	uint32_t (*PushVertexShaderUniforms)( | ||||||
| 		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)( | 	uint32_t (*PushFragmentShaderUniforms)( | ||||||
| 		Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
| 		Refresh_CommandBuffer *commandBuffer, | 		Refresh_CommandBuffer *commandBuffer, | ||||||
| 		void *data, | 		void *data, | ||||||
|  | @ -309,14 +340,14 @@ struct Refresh_Device | ||||||
| 		uint32_t dataLengthInBytes | 		uint32_t dataLengthInBytes | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	void(*BindVertexSamplers)( | 	void (*BindVertexSamplers)( | ||||||
| 		Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
| 		Refresh_CommandBuffer *commandBuffer, | 		Refresh_CommandBuffer *commandBuffer, | ||||||
| 		Refresh_Texture **pTextures, | 		Refresh_Texture **pTextures, | ||||||
| 		Refresh_Sampler **pSamplers | 		Refresh_Sampler **pSamplers | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	void(*BindFragmentSamplers)( | 	void (*BindFragmentSamplers)( | ||||||
| 		Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
| 		Refresh_CommandBuffer *commandBuffer, | 		Refresh_CommandBuffer *commandBuffer, | ||||||
| 		Refresh_Texture **pTextures, | 		Refresh_Texture **pTextures, | ||||||
|  | @ -325,7 +356,7 @@ struct Refresh_Device | ||||||
| 
 | 
 | ||||||
| 	/* Getters */ | 	/* Getters */ | ||||||
| 
 | 
 | ||||||
| 	void(*GetBufferData)( | 	void (*GetBufferData)( | ||||||
| 		Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
| 		Refresh_Buffer *buffer, | 		Refresh_Buffer *buffer, | ||||||
| 		void *data, | 		void *data, | ||||||
|  | @ -334,71 +365,70 @@ struct Refresh_Device | ||||||
| 
 | 
 | ||||||
| 	/* Disposal */ | 	/* Disposal */ | ||||||
| 
 | 
 | ||||||
| 	void(*QueueDestroyTexture)( | 	void (*QueueDestroyTexture)( | ||||||
| 		Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
| 		Refresh_Texture *texture | 		Refresh_Texture *texture | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	void(*QueueDestroySampler)( | 	void (*QueueDestroySampler)( | ||||||
| 		Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
| 		Refresh_Sampler *sampler | 		Refresh_Sampler *sampler | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	void(*QueueDestroyBuffer)( | 	void (*QueueDestroyBuffer)( | ||||||
| 		Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
| 		Refresh_Buffer *buffer | 		Refresh_Buffer *buffer | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	void(*QueueDestroyShaderModule)( | 	void (*QueueDestroyShaderModule)( | ||||||
| 		Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
| 		Refresh_ShaderModule *shaderModule | 		Refresh_ShaderModule *shaderModule | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	void(*QueueDestroyComputePipeline)( | 	void (*QueueDestroyComputePipeline)( | ||||||
| 		Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
| 		Refresh_ComputePipeline *computePipeline | 		Refresh_ComputePipeline *computePipeline | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	void(*QueueDestroyGraphicsPipeline)( | 	void (*QueueDestroyGraphicsPipeline)( | ||||||
| 		Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
| 		Refresh_GraphicsPipeline *graphicsPipeline | 		Refresh_GraphicsPipeline *graphicsPipeline | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	/* Graphics State */ | 	/* Graphics State */ | ||||||
| 
 | 
 | ||||||
| 	void(*BeginRenderPass)( | 	void (*BeginRenderPass)( | ||||||
| 		Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
| 		Refresh_CommandBuffer *commandBuffer, | 		Refresh_CommandBuffer *commandBuffer, | ||||||
| 		Refresh_Rect *renderArea, |  | ||||||
| 		Refresh_ColorAttachmentInfo *colorAttachmentInfos, | 		Refresh_ColorAttachmentInfo *colorAttachmentInfos, | ||||||
| 		uint32_t colorAttachmentCount, | 		uint32_t colorAttachmentCount, | ||||||
| 		Refresh_DepthStencilAttachmentInfo *depthStencilAttachmentInfo | 		Refresh_DepthStencilAttachmentInfo *depthStencilAttachmentInfo | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	void(*EndRenderPass)( | 	void (*EndRenderPass)( | ||||||
| 		Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
| 		Refresh_CommandBuffer *commandBuffer | 		Refresh_CommandBuffer *commandBuffer | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	void(*SetViewport)( | 	void (*SetViewport)( | ||||||
| 		Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
| 		Refresh_CommandBuffer *commandBuffer, | 		Refresh_CommandBuffer *commandBuffer, | ||||||
| 		Refresh_Viewport *viewport | 		Refresh_Viewport *viewport | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	void(*SetScissor)( | 	void (*SetScissor)( | ||||||
| 		Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
| 		Refresh_CommandBuffer *commandBuffer, | 		Refresh_CommandBuffer *commandBuffer, | ||||||
| 		Refresh_Rect *scissor | 		Refresh_Rect *scissor | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	void(*BindGraphicsPipeline)( | 	void (*BindGraphicsPipeline)( | ||||||
| 		Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
| 		Refresh_CommandBuffer *commandBuffer, | 		Refresh_CommandBuffer *commandBuffer, | ||||||
| 		Refresh_GraphicsPipeline *graphicsPipeline | 		Refresh_GraphicsPipeline *graphicsPipeline | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	void(*BindVertexBuffers)( | 	void (*BindVertexBuffers)( | ||||||
| 		Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
| 		Refresh_CommandBuffer *commandBuffer, | 		Refresh_CommandBuffer *commandBuffer, | ||||||
| 		uint32_t firstBinding, | 		uint32_t firstBinding, | ||||||
|  | @ -407,7 +437,7 @@ struct Refresh_Device | ||||||
| 		uint64_t *pOffsets | 		uint64_t *pOffsets | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	void(*BindIndexBuffer)( | 	void (*BindIndexBuffer)( | ||||||
| 		Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
| 		Refresh_CommandBuffer *commandBuffer, | 		Refresh_CommandBuffer *commandBuffer, | ||||||
| 		Refresh_Buffer *buffer, | 		Refresh_Buffer *buffer, | ||||||
|  | @ -415,27 +445,37 @@ struct Refresh_Device | ||||||
| 		Refresh_IndexElementSize indexElementSize | 		Refresh_IndexElementSize indexElementSize | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	void(*BindComputePipeline)( | 	void (*BindComputePipeline)( | ||||||
| 		Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
| 		Refresh_CommandBuffer *commandBuffer, | 		Refresh_CommandBuffer *commandBuffer, | ||||||
| 		Refresh_ComputePipeline *computePipeline | 		Refresh_ComputePipeline *computePipeline | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	void(*BindComputeBuffers)( | 	void (*BindComputeBuffers)( | ||||||
| 		Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
| 		Refresh_CommandBuffer *commandBuffer, | 		Refresh_CommandBuffer *commandBuffer, | ||||||
| 		Refresh_Buffer **pBuffers | 		Refresh_Buffer **pBuffers | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	void(*BindComputeTextures)( | 	void (*BindComputeTextures)( | ||||||
| 		Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
| 		Refresh_CommandBuffer *commandBuffer, | 		Refresh_CommandBuffer *commandBuffer, | ||||||
| 		Refresh_Texture **pTextures | 		Refresh_Texture **pTextures | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	Refresh_CommandBuffer* (*AcquireCommandBuffer)( | 	uint8_t (*ClaimWindow)( | ||||||
| 		Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
| 		uint8_t fixed | 		void *windowHandle, | ||||||
|  | 		Refresh_PresentMode presentMode | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	void (*UnclaimWindow)( | ||||||
|  | 		Refresh_Renderer *driverData, | ||||||
|  | 		void *windowHandle | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	Refresh_CommandBuffer* (*AcquireCommandBuffer)( | ||||||
|  | 		Refresh_Renderer *driverData | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	Refresh_Texture* (*AcquireSwapchainTexture)( | 	Refresh_Texture* (*AcquireSwapchainTexture)( | ||||||
|  | @ -451,16 +491,43 @@ struct Refresh_Device | ||||||
| 		void *windowHandle | 		void *windowHandle | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	void(*Submit)( | 	void (*SetSwapchainPresentMode)( | ||||||
| 		Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData, | ||||||
| 		uint32_t commandBufferCount, | 		void *windowHandle, | ||||||
| 		Refresh_CommandBuffer **pCommandBuffers | 		Refresh_PresentMode presentMode | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	void(*Wait)( | 	void (*Submit)( | ||||||
|  | 		Refresh_Renderer *driverData, | ||||||
|  | 		Refresh_CommandBuffer *commandBuffer | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	Refresh_Fence* (*SubmitAndAcquireFence)( | ||||||
|  | 		Refresh_Renderer *driverData, | ||||||
|  | 		Refresh_CommandBuffer *commandBuffer | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	void (*Wait)( | ||||||
| 		Refresh_Renderer *driverData | 		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; | ||||||
| }; | }; | ||||||
|  | @ -472,6 +539,7 @@ struct Refresh_Device | ||||||
| 	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(DrawPrimitivesIndirect, name) \ | ||||||
| 	ASSIGN_DRIVER_FUNC(DispatchCompute, 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) \ | ||||||
|  | @ -506,23 +574,30 @@ struct Refresh_Device | ||||||
| 	ASSIGN_DRIVER_FUNC(BindComputePipeline, name) \ | 	ASSIGN_DRIVER_FUNC(BindComputePipeline, name) \ | ||||||
| 	ASSIGN_DRIVER_FUNC(BindComputeBuffers, name) \ | 	ASSIGN_DRIVER_FUNC(BindComputeBuffers, name) \ | ||||||
| 	ASSIGN_DRIVER_FUNC(BindComputeTextures, name) \ | 	ASSIGN_DRIVER_FUNC(BindComputeTextures, name) \ | ||||||
|  | 	ASSIGN_DRIVER_FUNC(ClaimWindow, name) \ | ||||||
|  | 	ASSIGN_DRIVER_FUNC(UnclaimWindow, name) \ | ||||||
| 	ASSIGN_DRIVER_FUNC(AcquireCommandBuffer, name) \ | 	ASSIGN_DRIVER_FUNC(AcquireCommandBuffer, name) \ | ||||||
| 	ASSIGN_DRIVER_FUNC(AcquireSwapchainTexture, name) \ | 	ASSIGN_DRIVER_FUNC(AcquireSwapchainTexture, name) \ | ||||||
| 	ASSIGN_DRIVER_FUNC(GetSwapchainFormat, name) \ | 	ASSIGN_DRIVER_FUNC(GetSwapchainFormat, name) \ | ||||||
|  | 	ASSIGN_DRIVER_FUNC(SetSwapchainPresentMode, name) \ | ||||||
| 	ASSIGN_DRIVER_FUNC(Submit, name) \ | 	ASSIGN_DRIVER_FUNC(Submit, name) \ | ||||||
| 	ASSIGN_DRIVER_FUNC(Wait, 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 D3D11Driver; | extern Refresh_Driver PS5Driver; | ||||||
| 
 | 
 | ||||||
| #endif /* REFRESH_DRIVER_H */ | #endif /* REFRESH_DRIVER_H */ | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							|  | @ -1,215 +0,0 @@ | ||||||
| /* 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> |  | ||||||
|  * |  | ||||||
|  */ |  | ||||||
| 
 |  | ||||||
| /* Function Pointer Signatures */ |  | ||||||
| typedef HRESULT(WINAPI* PFN_CREATE_DXGI_FACTORY)(const GUID* riid, void** ppFactory); |  | ||||||
| 
 |  | ||||||
|  /* IIDs (from https://magnumdb.com) */ |  | ||||||
| 
 |  | ||||||
| static const IID D3D_IID_IDXGIFactory1 = { 0x770aae78,0xf26f,0x4dba,{0xa8,0x29,0x25,0x3c,0x83,0xd1,0xb3,0x87} }; |  | ||||||
| static const IID D3D_IID_IDXGIFactory6 = { 0xc1b6694f,0xff09,0x44a9,{0xb0,0x3c,0x77,0x90,0x0a,0x0a,0x1d,0x17} }; |  | ||||||
| static const IID D3D_IID_IDXGIAdapter1 = { 0x29038f61,0x3839,0x4626,{0x91,0xfd,0x08,0x68,0x79,0x01,0x1a,0x05} }; |  | ||||||
| static const IID D3D_IID_ID3D11Texture2D = { 0x6f15aaf2,0xd208,0x4e89,{0x9a,0xb4,0x48,0x95,0x35,0xd3,0x4f,0x9c} }; |  | ||||||
| 
 |  | ||||||
| /* IDXGIFactory6 (taken from dxgi1_6.h, cleaned up a bit) */ |  | ||||||
| typedef enum |  | ||||||
| { |  | ||||||
| 	DXGI_FEATURE_PRESENT_ALLOW_TEARING = 0 |  | ||||||
| } DXGI_FEATURE; |  | ||||||
| 
 |  | ||||||
| typedef enum |  | ||||||
| { |  | ||||||
| 	DXGI_GPU_PREFERENCE_UNSPECIFIED = 0, |  | ||||||
| 	DXGI_GPU_PREFERENCE_MINIMUM_POWER = (DXGI_GPU_PREFERENCE_UNSPECIFIED + 1), |  | ||||||
| 	DXGI_GPU_PREFERENCE_HIGH_PERFORMANCE = (DXGI_GPU_PREFERENCE_MINIMUM_POWER + 1) |  | ||||||
| } DXGI_GPU_PREFERENCE; |  | ||||||
| 
 |  | ||||||
| typedef struct IDXGIFactory6 IDXGIFactory6; |  | ||||||
| typedef struct IDXGIFactory6Vtbl |  | ||||||
| { |  | ||||||
| 	HRESULT(STDMETHODCALLTYPE* QueryInterface)( |  | ||||||
| 		IDXGIFactory6* This, |  | ||||||
| 		REFIID riid, |  | ||||||
| 		void** ppvObject); |  | ||||||
| 
 |  | ||||||
| 	ULONG(STDMETHODCALLTYPE* AddRef)( |  | ||||||
| 		IDXGIFactory6* This); |  | ||||||
| 
 |  | ||||||
| 	ULONG(STDMETHODCALLTYPE* Release)( |  | ||||||
| 		IDXGIFactory6* This); |  | ||||||
| 
 |  | ||||||
| 	HRESULT(STDMETHODCALLTYPE* SetPrivateData)( |  | ||||||
| 		IDXGIFactory6* This, |  | ||||||
| 		REFGUID Name, |  | ||||||
| 		UINT DataSize, |  | ||||||
| 		const void* pData); |  | ||||||
| 
 |  | ||||||
| 	HRESULT(STDMETHODCALLTYPE* SetPrivateDataInterface)( |  | ||||||
| 		IDXGIFactory6* This, |  | ||||||
| 		REFGUID Name, |  | ||||||
| 		const IUnknown* pUnknown); |  | ||||||
| 
 |  | ||||||
| 	HRESULT(STDMETHODCALLTYPE* GetPrivateData)( |  | ||||||
| 		IDXGIFactory6* This, |  | ||||||
| 		REFGUID Name, |  | ||||||
| 		UINT* pDataSize, |  | ||||||
| 		void* pData); |  | ||||||
| 
 |  | ||||||
| 	HRESULT(STDMETHODCALLTYPE* GetParent)( |  | ||||||
| 		IDXGIFactory6* This, |  | ||||||
| 		REFIID riid, |  | ||||||
| 		void** ppParent); |  | ||||||
| 
 |  | ||||||
| 	HRESULT(STDMETHODCALLTYPE* EnumAdapters)( |  | ||||||
| 		IDXGIFactory6* This, |  | ||||||
| 		UINT Adapter, |  | ||||||
| 		IDXGIAdapter** ppAdapter); |  | ||||||
| 
 |  | ||||||
| 	HRESULT(STDMETHODCALLTYPE* MakeWindowAssociation)( |  | ||||||
| 		IDXGIFactory6* This, |  | ||||||
| 		HWND WindowHandle, |  | ||||||
| 		UINT Flags); |  | ||||||
| 
 |  | ||||||
| 	HRESULT(STDMETHODCALLTYPE* GetWindowAssociation)( |  | ||||||
| 		IDXGIFactory6* This, |  | ||||||
| 		HWND* pWindowHandle); |  | ||||||
| 
 |  | ||||||
| 	HRESULT(STDMETHODCALLTYPE* CreateSwapChain)( |  | ||||||
| 		IDXGIFactory6* This, |  | ||||||
| 		IUnknown* pDevice, |  | ||||||
| 		DXGI_SWAP_CHAIN_DESC* pDesc, |  | ||||||
| 		IDXGISwapChain** ppSwapChain); |  | ||||||
| 
 |  | ||||||
| 	HRESULT(STDMETHODCALLTYPE* CreateSoftwareAdapter)( |  | ||||||
| 		IDXGIFactory6* This, |  | ||||||
| 		HMODULE Module, |  | ||||||
| 		IDXGIAdapter** ppAdapter); |  | ||||||
| 
 |  | ||||||
| 	HRESULT(STDMETHODCALLTYPE* EnumAdapters1)( |  | ||||||
| 		IDXGIFactory6* This, |  | ||||||
| 		UINT Adapter, |  | ||||||
| 		IDXGIAdapter1** ppAdapter); |  | ||||||
| 
 |  | ||||||
| 	BOOL(STDMETHODCALLTYPE* IsCurrent)( |  | ||||||
| 		IDXGIFactory6* This); |  | ||||||
| 
 |  | ||||||
| 	BOOL(STDMETHODCALLTYPE* IsWindowedStereoEnabled)( |  | ||||||
| 		IDXGIFactory6* This); |  | ||||||
| 
 |  | ||||||
| 	HRESULT(STDMETHODCALLTYPE* CreateSwapChainForHwnd)( |  | ||||||
| 		IDXGIFactory6* This, |  | ||||||
| 		IUnknown* pDevice, |  | ||||||
| 		HWND hWnd, |  | ||||||
| 		void* pDesc, |  | ||||||
| 		void* pFullscreenDesc, |  | ||||||
| 		void* pRestrictToOutput, |  | ||||||
| 		void** ppSwapChain); |  | ||||||
| 
 |  | ||||||
| 	HRESULT(STDMETHODCALLTYPE* CreateSwapChainForCoreWindow)( |  | ||||||
| 		IDXGIFactory6* This, |  | ||||||
| 		IUnknown* pDevice, |  | ||||||
| 		IUnknown* pWindow, |  | ||||||
| 		void* pDesc, |  | ||||||
| 		void* pRestrictToOutput, |  | ||||||
| 		void** ppSwapChain); |  | ||||||
| 
 |  | ||||||
| 	HRESULT(STDMETHODCALLTYPE* GetSharedResourceAdapterLuid)( |  | ||||||
| 		IDXGIFactory6* This, |  | ||||||
| 		HANDLE hResource, |  | ||||||
| 		LUID* pLuid); |  | ||||||
| 
 |  | ||||||
| 	HRESULT(STDMETHODCALLTYPE* RegisterStereoStatusWindow)( |  | ||||||
| 		IDXGIFactory6* This, |  | ||||||
| 		HWND WindowHandle, |  | ||||||
| 		UINT wMsg, |  | ||||||
| 		DWORD* pdwCookie); |  | ||||||
| 
 |  | ||||||
| 	HRESULT(STDMETHODCALLTYPE* RegisterStereoStatusEvent)( |  | ||||||
| 		IDXGIFactory6* This, |  | ||||||
| 		HANDLE hEvent, |  | ||||||
| 		DWORD* pdwCookie); |  | ||||||
| 
 |  | ||||||
| 	void (STDMETHODCALLTYPE* UnregisterStereoStatus)( |  | ||||||
| 		IDXGIFactory6* This, |  | ||||||
| 		DWORD dwCookie); |  | ||||||
| 
 |  | ||||||
| 	HRESULT(STDMETHODCALLTYPE* RegisterOcclusionStatusWindow)( |  | ||||||
| 		IDXGIFactory6* This, |  | ||||||
| 		HWND WindowHandle, |  | ||||||
| 		UINT wMsg, |  | ||||||
| 		DWORD* pdwCookie); |  | ||||||
| 
 |  | ||||||
| 	HRESULT(STDMETHODCALLTYPE* RegisterOcclusionStatusEvent)( |  | ||||||
| 		IDXGIFactory6* This, |  | ||||||
| 		HANDLE hEvent, |  | ||||||
| 		DWORD* pdwCookie); |  | ||||||
| 
 |  | ||||||
| 	void (STDMETHODCALLTYPE* UnregisterOcclusionStatus)( |  | ||||||
| 		IDXGIFactory6* This, |  | ||||||
| 		DWORD dwCookie); |  | ||||||
| 
 |  | ||||||
| 	HRESULT(STDMETHODCALLTYPE* CreateSwapChainForComposition)( |  | ||||||
| 		IDXGIFactory6* This, |  | ||||||
| 		IUnknown* pDevice, |  | ||||||
| 		void* pDesc, |  | ||||||
| 		void* pRestrictToOutput, |  | ||||||
| 		void** ppSwapChain); |  | ||||||
| 
 |  | ||||||
| 	UINT(STDMETHODCALLTYPE* GetCreationFlags)( |  | ||||||
| 		IDXGIFactory6* This); |  | ||||||
| 
 |  | ||||||
| 	HRESULT(STDMETHODCALLTYPE* EnumAdapterByLuid)( |  | ||||||
| 		IDXGIFactory6* This, |  | ||||||
| 		LUID AdapterLuid, |  | ||||||
| 		REFIID riid, |  | ||||||
| 		void** ppvAdapter); |  | ||||||
| 
 |  | ||||||
| 	HRESULT(STDMETHODCALLTYPE* EnumWarpAdapter)( |  | ||||||
| 		IDXGIFactory6* This, |  | ||||||
| 		REFIID riid, |  | ||||||
| 		void** ppvAdapter); |  | ||||||
| 
 |  | ||||||
| 	HRESULT(STDMETHODCALLTYPE* CheckFeatureSupport)( |  | ||||||
| 		IDXGIFactory6* This, |  | ||||||
| 		DXGI_FEATURE Feature, |  | ||||||
| 		void* pFeatureSupportData, |  | ||||||
| 		UINT FeatureSupportDataSize); |  | ||||||
| 
 |  | ||||||
| 	HRESULT(STDMETHODCALLTYPE* EnumAdapterByGpuPreference)( |  | ||||||
| 		IDXGIFactory6* This, |  | ||||||
| 		UINT Adapter, |  | ||||||
| 		DXGI_GPU_PREFERENCE GpuPreference, |  | ||||||
| 		REFIID riid, |  | ||||||
| 		void** ppvAdapter); |  | ||||||
| } IDXGIFactory6Vtbl; |  | ||||||
| 
 |  | ||||||
| struct IDXGIFactory6 |  | ||||||
| { |  | ||||||
| 	struct IDXGIFactory6Vtbl* lpVtbl; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| #define IDXGIFactory6_EnumAdapterByGpuPreference(This,Adapter,GpuPreference,riid,ppvAdapter)	\ |  | ||||||
| 	( (This)->lpVtbl -> EnumAdapterByGpuPreference(This,Adapter,GpuPreference,riid,ppvAdapter) )  |  | ||||||
|  | @ -126,11 +126,7 @@ static TEMPLATE_BLEND_FACTOR_TYPE RefreshToTEMPLATE_BlendFactor[] = | ||||||
| 	0,	/* ONE_MINUS_DST_ALPHA */ | 	0,	/* ONE_MINUS_DST_ALPHA */ | ||||||
| 	0,	/* CONSTANT_COLOR */ | 	0,	/* CONSTANT_COLOR */ | ||||||
| 	0,	/* ONE_MINUS_CONSTANT_COLOR */ | 	0,	/* ONE_MINUS_CONSTANT_COLOR */ | ||||||
| 	0,	/* SRC_ALPHA_SATURATE */ | 	0	/* SRC_ALPHA_SATURATE */ | ||||||
| 	0,	/* SRC1_COLOR */ |  | ||||||
| 	0,	/* ONE_MINUS_SRC1_COLOR */ |  | ||||||
| 	0,	/* SRC1_ALPHA */ |  | ||||||
| 	0	/* ONE_MINUS_SRC1_ALPHA */ |  | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| static TEMPLATE_BLEND_OP_TYPE RefreshToTEMPLATE_BlendOp[] = | static TEMPLATE_BLEND_OP_TYPE RefreshToTEMPLATE_BlendOp[] = | ||||||
|  | @ -272,6 +268,19 @@ static void TEMPLATE_DrawPrimitives( | ||||||
| 	NOT_IMPLEMENTED | 	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( | static void TEMPLATE_DispatchCompute( | ||||||
| 	Refresh_Renderer *device, | 	Refresh_Renderer *device, | ||||||
| 	Refresh_CommandBuffer *commandBuffer, | 	Refresh_CommandBuffer *commandBuffer, | ||||||
|  | @ -351,8 +360,13 @@ static void TEMPLATE_SetTextureDataYUV( | ||||||
| 	uint32_t yHeight, | 	uint32_t yHeight, | ||||||
| 	uint32_t uvWidth, | 	uint32_t uvWidth, | ||||||
| 	uint32_t uvHeight, | 	uint32_t uvHeight, | ||||||
| 	void* data, | 	void *yDataPtr, | ||||||
| 	uint32_t dataLength | 	void *uDataPtr, | ||||||
|  | 	void *vDataPtr, | ||||||
|  | 	uint32_t yDataLength, | ||||||
|  | 	uint32_t uvDataLength, | ||||||
|  | 	uint32_t yStride, | ||||||
|  | 	uint32_t uvStride | ||||||
| ) { | ) { | ||||||
| 	NOT_IMPLEMENTED | 	NOT_IMPLEMENTED | ||||||
| } | } | ||||||
|  | @ -489,10 +503,15 @@ static void TEMPLATE_QueueDestroyGraphicsPipeline( | ||||||
| 
 | 
 | ||||||
| /* Graphics State */ | /* Graphics State */ | ||||||
| 
 | 
 | ||||||
|  | static Refresh_CommandBuffer* TEMPLATE_AcquireCommandBuffer( | ||||||
|  | 	Refresh_Renderer *driverData | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static void TEMPLATE_BeginRenderPass( | static void TEMPLATE_BeginRenderPass( | ||||||
| 	Refresh_Renderer *driverData, | 	Refresh_Renderer *driverData, | ||||||
| 	Refresh_CommandBuffer *commandBuffer, | 	Refresh_CommandBuffer *commandBuffer, | ||||||
| 	Refresh_Rect *renderArea, |  | ||||||
| 	Refresh_ColorAttachmentInfo *colorAttachmentInfos, | 	Refresh_ColorAttachmentInfo *colorAttachmentInfos, | ||||||
| 	uint32_t colorAttachmentCount, | 	uint32_t colorAttachmentCount, | ||||||
| 	Refresh_DepthStencilAttachmentInfo *depthStencilAttachmentInfo | 	Refresh_DepthStencilAttachmentInfo *depthStencilAttachmentInfo | ||||||
|  | @ -552,6 +571,8 @@ static void TEMPLATE_BindIndexBuffer( | ||||||
| 	NOT_IMPLEMENTED | 	NOT_IMPLEMENTED | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /* Compute State */ | ||||||
|  | 
 | ||||||
| static void TEMPLATE_BindComputePipeline( | static void TEMPLATE_BindComputePipeline( | ||||||
| 	Refresh_Renderer *driverData, | 	Refresh_Renderer *driverData, | ||||||
| 	Refresh_CommandBuffer *commandBuffer, | 	Refresh_CommandBuffer *commandBuffer, | ||||||
|  | @ -576,14 +597,24 @@ static void TEMPLATE_BindComputeTextures( | ||||||
| 	NOT_IMPLEMENTED | 	NOT_IMPLEMENTED | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static Refresh_CommandBuffer* TEMPLATE_AcquireCommandBuffer( | /* Window and Swapchain Management */ | ||||||
|  | 
 | ||||||
|  | static uint8_t TEMPLATE_ClaimWindow( | ||||||
| 	Refresh_Renderer *driverData, | 	Refresh_Renderer *driverData, | ||||||
| 	uint8_t fixed | 	void *windowHandle, | ||||||
|  | 	Refresh_PresentMode presentMode | ||||||
| ) { | ) { | ||||||
| 	NOT_IMPLEMENTED | 	NOT_IMPLEMENTED | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| Refresh_Texture* TEMPLATE_AcquireSwapchainTexture( | static void TEMPLATE_UnclaimWindow( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	void *windowHandle | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static Refresh_Texture* TEMPLATE_AcquireSwapchainTexture( | ||||||
| 	Refresh_Renderer *driverData, | 	Refresh_Renderer *driverData, | ||||||
| 	Refresh_CommandBuffer *commandBuffer, | 	Refresh_CommandBuffer *commandBuffer, | ||||||
| 	void *windowHandle, | 	void *windowHandle, | ||||||
|  | @ -593,17 +624,33 @@ Refresh_Texture* TEMPLATE_AcquireSwapchainTexture( | ||||||
| 	NOT_IMPLEMENTED | 	NOT_IMPLEMENTED | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| Refresh_TextureFormat TEMPLATE_GetSwapchainFormat( | static Refresh_TextureFormat TEMPLATE_GetSwapchainFormat( | ||||||
| 	Refresh_Renderer *driverData, | 	Refresh_Renderer *driverData, | ||||||
| 	void *windowHandle | 	void *windowHandle | ||||||
| ) { | ) { | ||||||
| 	NOT_IMPLEMENTED | 	NOT_IMPLEMENTED | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static void TEMPLATE_SetSwapchainPresentMode( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	void *windowHandle, | ||||||
|  | 	Refresh_PresentMode presentMode | ||||||
|  | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* Submission and Fences */ | ||||||
|  | 
 | ||||||
| static void TEMPLATE_Submit( | static void TEMPLATE_Submit( | ||||||
| 	Refresh_Renderer *driverData, | 	Refresh_Renderer *driverData, | ||||||
| 	uint32_t commandBufferCount, | 	Refresh_CommandBuffer *commandBuffer | ||||||
| 	Refresh_CommandBuffer **pCommandBuffers | ) { | ||||||
|  | 	NOT_IMPLEMENTED | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static Refresh_Fence* TEMPLATE_SubmitAndAcquireFence( | ||||||
|  | 	Refresh_Renderer *driverData, | ||||||
|  | 	Refresh_CommandBuffer *commandBuffer | ||||||
| ) { | ) { | ||||||
| 	NOT_IMPLEMENTED | 	NOT_IMPLEMENTED | ||||||
| } | } | ||||||
|  | @ -614,8 +661,38 @@ static void TEMPLATE_Wait( | ||||||
| 	NOT_IMPLEMENTED | 	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( | static Refresh_Device* TEMPLATE_CreateDevice( | ||||||
| 	Refresh_PresentationParameters *presentationParameters, |  | ||||||
| 	uint8_t debugMode | 	uint8_t debugMode | ||||||
| ) { | ) { | ||||||
| 	NOT_IMPLEMENTED | 	NOT_IMPLEMENTED | ||||||
|  | @ -623,6 +700,7 @@ static Refresh_Device* TEMPLATE_CreateDevice( | ||||||
| 
 | 
 | ||||||
| Refresh_Driver TEMPLATEDriver = { | Refresh_Driver TEMPLATEDriver = { | ||||||
| 	"TEMPLATE", | 	"TEMPLATE", | ||||||
|  | 	TEMPLATE_PrepareDriver, | ||||||
| 	TEMPLATE_CreateDevice | 	TEMPLATE_CreateDevice | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
										
											
												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 | ||||||
|  | @ -140,6 +136,7 @@ SDL_SIMDRealloc(void *mem, const size_t len) | ||||||
| #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,51 +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, | ||||||
|  | 	uint8_t* data, | ||||||
| 	int32_t w, | 	int32_t w, | ||||||
| 	int32_t h, | 	int32_t h | ||||||
| 	uint8_t bgra, |  | ||||||
| 	uint8_t *data |  | ||||||
| ) { | ) { | ||||||
| 	uint32_t i; | 	stbi_write_png( | ||||||
| 	uint8_t *bgraData; | 		filename, | ||||||
| 
 | 		w, | ||||||
| 	if (bgra) | 		h, | ||||||
| 	{ | 		4, | ||||||
| 		bgraData = SDL_malloc(w * h * 4); | 		data, | ||||||
| 
 | 		w * 4 | ||||||
| 		for (i = 0; i < w * h * 4; i += 4) | 	); | ||||||
| 		{ |  | ||||||
| 			bgraData[i]     = data[i + 2]; |  | ||||||
| 			bgraData[i + 1] = data[i + 1]; |  | ||||||
| 			bgraData[i + 2] = data[i]; |  | ||||||
| 			bgraData[i + 3] = data[i + 3]; |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		stbi_write_png(filename, w, h, 4, bgraData, w * 4); |  | ||||||
| 
 |  | ||||||
| 		SDL_free(bgraData); |  | ||||||
| 	} |  | ||||||
| 	else |  | ||||||
| 	{ |  | ||||||
| 		stbi_write_png(filename, w, h, 4, data, w * 4); |  | ||||||
| 	} |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* vim: set noexpandtab shiftwidth=8 tabstop=8: */ | /* vim: set noexpandtab shiftwidth=8 tabstop=8: */ | ||||||
|  |  | ||||||
							
								
								
									
										592
									
								
								src/stb_image.h
								
								
								
								
							
							
						
						
									
										592
									
								
								src/stb_image.h
								
								
								
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							|  | @ -8,29 +8,19 @@ EndProject | ||||||
| Global | Global | ||||||
| 	GlobalSection(SolutionConfigurationPlatforms) = preSolution | 	GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||||
| 		Debug|x64 = Debug|x64 | 		Debug|x64 = Debug|x64 | ||||||
| 		Debug|x86 = Debug|x86 |  | ||||||
| 		MinSizeRel|x64 = MinSizeRel|x64 | 		MinSizeRel|x64 = MinSizeRel|x64 | ||||||
| 		MinSizeRel|x86 = MinSizeRel|x86 |  | ||||||
| 		Release|x64 = Release|x64 | 		Release|x64 = Release|x64 | ||||||
| 		Release|x86 = Release|x86 |  | ||||||
| 		RelWithDebInfo|x64 = RelWithDebInfo|x64 | 		RelWithDebInfo|x64 = RelWithDebInfo|x64 | ||||||
| 		RelWithDebInfo|x86 = RelWithDebInfo|x86 |  | ||||||
| 	EndGlobalSection | 	EndGlobalSection | ||||||
| 	GlobalSection(ProjectConfigurationPlatforms) = postSolution | 	GlobalSection(ProjectConfigurationPlatforms) = postSolution | ||||||
| 		{6DB15344-E000-45CB-A48A-1D72F7D6E945}.Debug|x64.ActiveCfg = Debug|x64 | 		{6DB15344-E000-45CB-A48A-1D72F7D6E945}.Debug|x64.ActiveCfg = Debug|x64 | ||||||
| 		{6DB15344-E000-45CB-A48A-1D72F7D6E945}.Debug|x64.Build.0 = Debug|x64 | 		{6DB15344-E000-45CB-A48A-1D72F7D6E945}.Debug|x64.Build.0 = Debug|x64 | ||||||
| 		{6DB15344-E000-45CB-A48A-1D72F7D6E945}.Debug|x86.ActiveCfg = Debug|Win32 |  | ||||||
| 		{6DB15344-E000-45CB-A48A-1D72F7D6E945}.Debug|x86.Build.0 = Debug|Win32 |  | ||||||
| 		{6DB15344-E000-45CB-A48A-1D72F7D6E945}.MinSizeRel|x64.ActiveCfg = MinSizeRel|x64 | 		{6DB15344-E000-45CB-A48A-1D72F7D6E945}.MinSizeRel|x64.ActiveCfg = MinSizeRel|x64 | ||||||
| 		{6DB15344-E000-45CB-A48A-1D72F7D6E945}.MinSizeRel|x64.Build.0 = MinSizeRel|x64 | 		{6DB15344-E000-45CB-A48A-1D72F7D6E945}.MinSizeRel|x64.Build.0 = MinSizeRel|x64 | ||||||
| 		{6DB15344-E000-45CB-A48A-1D72F7D6E945}.MinSizeRel|x86.ActiveCfg = MinSizeRel|x64 |  | ||||||
| 		{6DB15344-E000-45CB-A48A-1D72F7D6E945}.Release|x64.ActiveCfg = Release|x64 | 		{6DB15344-E000-45CB-A48A-1D72F7D6E945}.Release|x64.ActiveCfg = Release|x64 | ||||||
| 		{6DB15344-E000-45CB-A48A-1D72F7D6E945}.Release|x64.Build.0 = Release|x64 | 		{6DB15344-E000-45CB-A48A-1D72F7D6E945}.Release|x64.Build.0 = Release|x64 | ||||||
| 		{6DB15344-E000-45CB-A48A-1D72F7D6E945}.Release|x86.ActiveCfg = Release|Win32 |  | ||||||
| 		{6DB15344-E000-45CB-A48A-1D72F7D6E945}.Release|x86.Build.0 = Release|Win32 |  | ||||||
| 		{6DB15344-E000-45CB-A48A-1D72F7D6E945}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64 | 		{6DB15344-E000-45CB-A48A-1D72F7D6E945}.RelWithDebInfo|x64.ActiveCfg = RelWithDebInfo|x64 | ||||||
| 		{6DB15344-E000-45CB-A48A-1D72F7D6E945}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64 | 		{6DB15344-E000-45CB-A48A-1D72F7D6E945}.RelWithDebInfo|x64.Build.0 = RelWithDebInfo|x64 | ||||||
| 		{6DB15344-E000-45CB-A48A-1D72F7D6E945}.RelWithDebInfo|x86.ActiveCfg = RelWithDebInfo|x64 |  | ||||||
| 	EndGlobalSection | 	EndGlobalSection | ||||||
| 	GlobalSection(SolutionProperties) = preSolution | 	GlobalSection(SolutionProperties) = preSolution | ||||||
| 		HideSolutionNode = FALSE | 		HideSolutionNode = FALSE | ||||||
|  |  | ||||||
|  | @ -61,9 +61,7 @@ | ||||||
|     <ClCompile> |     <ClCompile> | ||||||
|       <WarningLevel>Level3</WarningLevel> |       <WarningLevel>Level3</WarningLevel> | ||||||
|       <Optimization>Disabled</Optimization> |       <Optimization>Disabled</Optimization> | ||||||
|       <PreprocessorDefinitions>REFRESH_DRIVER_D3D11;REFRESH_DRIVER_VULKAN;%(PreprocessorDefinitions)</PreprocessorDefinitions> |       <PreprocessorDefinitions>REFRESH_DRIVER_VULKAN;%(PreprocessorDefinitions)</PreprocessorDefinitions> | ||||||
|       <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> |  | ||||||
|       </AdditionalIncludeDirectories> |  | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <Link> |     <Link> | ||||||
|       <GenerateDebugInformation>DebugFull</GenerateDebugInformation> |       <GenerateDebugInformation>DebugFull</GenerateDebugInformation> | ||||||
|  | @ -74,11 +72,9 @@ | ||||||
|     <ClCompile> |     <ClCompile> | ||||||
|       <WarningLevel>Level3</WarningLevel> |       <WarningLevel>Level3</WarningLevel> | ||||||
|       <Optimization>MaxSpeed</Optimization> |       <Optimization>MaxSpeed</Optimization> | ||||||
|       <PreprocessorDefinitions>REFRESH_DRIVER_D3D11;REFRESH_DRIVER_VULKAN;%(PreprocessorDefinitions)</PreprocessorDefinitions> |       <PreprocessorDefinitions>REFRESH_DRIVER_VULKAN;%(PreprocessorDefinitions)</PreprocessorDefinitions> | ||||||
|       <FunctionLevelLinking>true</FunctionLevelLinking> |       <FunctionLevelLinking>true</FunctionLevelLinking> | ||||||
|       <IntrinsicFunctions>true</IntrinsicFunctions> |       <IntrinsicFunctions>true</IntrinsicFunctions> | ||||||
|       <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> |  | ||||||
|       </AdditionalIncludeDirectories> |  | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <Link> |     <Link> | ||||||
|       <GenerateDebugInformation>true</GenerateDebugInformation> |       <GenerateDebugInformation>true</GenerateDebugInformation> | ||||||
|  | @ -88,7 +84,6 @@ | ||||||
|   </ItemDefinitionGroup> |   </ItemDefinitionGroup> | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|     <ClCompile Include="..\src\Refresh.c" /> |     <ClCompile Include="..\src\Refresh.c" /> | ||||||
|     <ClCompile Include="..\src\Refresh_Driver_D3D11.c" /> |  | ||||||
|     <ClCompile Include="..\src\Refresh_Driver_Vulkan.c" /> |     <ClCompile Include="..\src\Refresh_Driver_Vulkan.c" /> | ||||||
|     <ClCompile Include="..\src\Refresh_Image.c" /> |     <ClCompile Include="..\src\Refresh_Image.c" /> | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
|  | @ -96,7 +91,6 @@ | ||||||
|     <ClInclude Include="..\include\Refresh.h" /> |     <ClInclude Include="..\include\Refresh.h" /> | ||||||
|     <ClInclude Include="..\include\Refresh_Image.h" /> |     <ClInclude Include="..\include\Refresh_Image.h" /> | ||||||
|     <ClInclude Include="..\src\Refresh_Driver.h" /> |     <ClInclude Include="..\src\Refresh_Driver.h" /> | ||||||
|     <ClInclude Include="..\src\Refresh_Driver_D3D11_cdefines.h" /> |  | ||||||
|     <ClInclude Include="..\src\Refresh_Driver_Vulkan_vkfuncs.h" /> |     <ClInclude Include="..\src\Refresh_Driver_Vulkan_vkfuncs.h" /> | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
|   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> |   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> | ||||||
|  |  | ||||||
|  | @ -10,9 +10,6 @@ | ||||||
|     <ClCompile Include="..\src\Refresh_Image.c"> |     <ClCompile Include="..\src\Refresh_Image.c"> | ||||||
|       <Filter>Source Files</Filter> |       <Filter>Source Files</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|     <ClCompile Include="..\src\Refresh_Driver_D3D11.c"> |  | ||||||
|       <Filter>Source Files</Filter> |  | ||||||
|     </ClCompile> |  | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|     <ClInclude Include="..\include\Refresh.h"> |     <ClInclude Include="..\include\Refresh.h"> | ||||||
|  | @ -27,9 +24,6 @@ | ||||||
|     <ClInclude Include="..\include\Refresh_Image.h"> |     <ClInclude Include="..\include\Refresh_Image.h"> | ||||||
|       <Filter>Header Files</Filter> |       <Filter>Header Files</Filter> | ||||||
|     </ClInclude> |     </ClInclude> | ||||||
|     <ClInclude Include="..\src\Refresh_Driver_D3D11_cdefines.h"> |  | ||||||
|       <Filter>Header Files</Filter> |  | ||||||
|     </ClInclude> |  | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|     <Filter Include="Header Files"> |     <Filter Include="Header Files"> | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue