| 
									
										
										
										
											2023-08-13 04:03:17 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright (C) 2014 Patrick Mours | 
					
						
							|  |  |  |  * SPDX-License-Identifier: BSD-3-Clause | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "effect_expression.hpp"
 | 
					
						
							| 
									
										
										
										
											2023-09-04 12:38:08 +00:00
										 |  |  | #include <cstdint>
 | 
					
						
							| 
									
										
										
										
											2023-08-13 04:03:17 +00:00
										 |  |  | #include <unordered_set>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace reshadefx | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	/// <summary>
 | 
					
						
							|  |  |  | 	/// A list of supported texture types.
 | 
					
						
							|  |  |  | 	/// </summary>
 | 
					
						
							|  |  |  | 	enum class texture_type | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		texture_1d = 1, | 
					
						
							|  |  |  | 		texture_2d = 2, | 
					
						
							|  |  |  | 		texture_3d = 3 | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/// <summary>
 | 
					
						
							|  |  |  | 	/// A list of supported texture formats.
 | 
					
						
							|  |  |  | 	/// </summary>
 | 
					
						
							|  |  |  | 	enum class texture_format | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		unknown, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		r8, | 
					
						
							|  |  |  | 		r16, | 
					
						
							|  |  |  | 		r16f, | 
					
						
							|  |  |  | 		r32i, | 
					
						
							|  |  |  | 		r32u, | 
					
						
							|  |  |  | 		r32f, | 
					
						
							|  |  |  | 		rg8, | 
					
						
							|  |  |  | 		rg16, | 
					
						
							|  |  |  | 		rg16f, | 
					
						
							|  |  |  | 		rg32f, | 
					
						
							|  |  |  | 		rgba8, | 
					
						
							|  |  |  | 		rgba16, | 
					
						
							|  |  |  | 		rgba16f, | 
					
						
							|  |  |  | 		rgba32f, | 
					
						
							|  |  |  | 		rgb10a2 | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/// <summary>
 | 
					
						
							|  |  |  | 	/// A filtering type used for texture lookups.
 | 
					
						
							|  |  |  | 	/// </summary>
 | 
					
						
							|  |  |  | 	enum class filter_mode | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		min_mag_mip_point = 0, | 
					
						
							|  |  |  | 		min_mag_point_mip_linear = 0x1, | 
					
						
							|  |  |  | 		min_point_mag_linear_mip_point = 0x4, | 
					
						
							|  |  |  | 		min_point_mag_mip_linear = 0x5, | 
					
						
							|  |  |  | 		min_linear_mag_mip_point = 0x10, | 
					
						
							|  |  |  | 		min_linear_mag_point_mip_linear = 0x11, | 
					
						
							|  |  |  | 		min_mag_linear_mip_point = 0x14, | 
					
						
							|  |  |  | 		min_mag_mip_linear = 0x15 | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/// <summary>
 | 
					
						
							|  |  |  | 	/// Specifies behavior of sampling with texture coordinates outside an image.
 | 
					
						
							|  |  |  | 	/// </summary>
 | 
					
						
							|  |  |  | 	enum class texture_address_mode | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		wrap = 1, | 
					
						
							|  |  |  | 		mirror = 2, | 
					
						
							|  |  |  | 		clamp = 3, | 
					
						
							|  |  |  | 		border = 4 | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/// <summary>
 | 
					
						
							|  |  |  | 	/// Specifies RGB or alpha blending operations.
 | 
					
						
							|  |  |  | 	/// </summary>
 | 
					
						
							|  |  |  | 	enum class pass_blend_op : uint8_t | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		add = 1, | 
					
						
							|  |  |  | 		subtract, | 
					
						
							|  |  |  | 		reverse_subtract, | 
					
						
							|  |  |  | 		min, | 
					
						
							|  |  |  | 		max | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/// <summary>
 | 
					
						
							|  |  |  | 	/// Specifies blend factors, which modulate values between the pixel shader output and render target.
 | 
					
						
							|  |  |  | 	/// </summary>
 | 
					
						
							|  |  |  | 	enum class pass_blend_factor : uint8_t | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		zero = 0, | 
					
						
							|  |  |  | 		one = 1, | 
					
						
							|  |  |  | 		source_color, | 
					
						
							|  |  |  | 		one_minus_source_color, | 
					
						
							|  |  |  | 		dest_color, | 
					
						
							|  |  |  | 		one_minus_dest_color, | 
					
						
							|  |  |  | 		source_alpha, | 
					
						
							|  |  |  | 		one_minus_source_alpha, | 
					
						
							|  |  |  | 		dest_alpha, | 
					
						
							|  |  |  | 		one_minus_dest_alpha | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/// <summary>
 | 
					
						
							|  |  |  | 	/// Specifies the stencil operations that can be performed during depth-stencil testing.
 | 
					
						
							|  |  |  | 	/// </summary>
 | 
					
						
							|  |  |  | 	enum class pass_stencil_op : uint8_t | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		zero = 0, | 
					
						
							|  |  |  | 		keep, | 
					
						
							|  |  |  | 		replace, | 
					
						
							|  |  |  | 		increment_saturate, | 
					
						
							|  |  |  | 		decrement_saturate, | 
					
						
							|  |  |  | 		invert, | 
					
						
							|  |  |  | 		increment, | 
					
						
							|  |  |  | 		decrement | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/// <summary>
 | 
					
						
							|  |  |  | 	/// Specifies comparison options for depth-stencil testing.
 | 
					
						
							|  |  |  | 	/// </summary>
 | 
					
						
							|  |  |  | 	enum class pass_stencil_func : uint8_t | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		never, | 
					
						
							|  |  |  | 		less, | 
					
						
							|  |  |  | 		equal, | 
					
						
							|  |  |  | 		less_equal, | 
					
						
							|  |  |  | 		greater, | 
					
						
							|  |  |  | 		not_equal, | 
					
						
							|  |  |  | 		greater_equal, | 
					
						
							|  |  |  | 		always | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/// <summary>
 | 
					
						
							|  |  |  | 	/// Specifies the possible primitives.
 | 
					
						
							|  |  |  | 	/// </summary>
 | 
					
						
							|  |  |  | 	enum class primitive_topology : uint8_t | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		point_list = 1, | 
					
						
							|  |  |  | 		line_list, | 
					
						
							|  |  |  | 		line_strip, | 
					
						
							|  |  |  | 		triangle_list, | 
					
						
							|  |  |  | 		triangle_strip | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/// <summary>
 | 
					
						
							|  |  |  | 	/// A struct type defined in the effect code.
 | 
					
						
							|  |  |  | 	/// </summary>
 | 
					
						
							|  |  |  | 	struct struct_info | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		std::string name; | 
					
						
							|  |  |  | 		std::string unique_name; | 
					
						
							|  |  |  | 		std::vector<struct struct_member_info> member_list; | 
					
						
							|  |  |  | 		uint32_t definition = 0; | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/// <summary>
 | 
					
						
							|  |  |  | 	/// A struct field defined in the effect code.
 | 
					
						
							|  |  |  | 	/// </summary>
 | 
					
						
							|  |  |  | 	struct struct_member_info | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		reshadefx::type type; | 
					
						
							|  |  |  | 		std::string name; | 
					
						
							|  |  |  | 		std::string semantic; | 
					
						
							|  |  |  | 		reshadefx::location location; | 
					
						
							|  |  |  | 		uint32_t definition = 0; | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/// <summary>
 | 
					
						
							|  |  |  | 	/// An annotation attached to a variable.
 | 
					
						
							|  |  |  | 	/// </summary>
 | 
					
						
							|  |  |  | 	struct annotation | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		reshadefx::type type; | 
					
						
							|  |  |  | 		std::string name; | 
					
						
							|  |  |  | 		reshadefx::constant value; | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/// <summary>
 | 
					
						
							|  |  |  | 	/// A texture defined in the effect code.
 | 
					
						
							|  |  |  | 	/// </summary>
 | 
					
						
							|  |  |  | 	struct texture_info | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		uint32_t id = 0; | 
					
						
							|  |  |  | 		uint32_t binding = 0; | 
					
						
							|  |  |  | 		std::string name; | 
					
						
							|  |  |  | 		std::string semantic; | 
					
						
							|  |  |  | 		std::string unique_name; | 
					
						
							|  |  |  | 		std::vector<annotation> annotations; | 
					
						
							|  |  |  | 		texture_type type = texture_type::texture_2d; | 
					
						
							|  |  |  | 		uint32_t width = 1; | 
					
						
							|  |  |  | 		uint32_t height = 1; | 
					
						
							|  |  |  | 		uint16_t depth = 1; | 
					
						
							|  |  |  | 		uint16_t levels = 1; | 
					
						
							|  |  |  | 		texture_format format = texture_format::rgba8; | 
					
						
							|  |  |  | 		bool render_target = false; | 
					
						
							|  |  |  | 		bool storage_access = false; | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/// <summary>
 | 
					
						
							|  |  |  | 	/// A texture sampler defined in the effect code.
 | 
					
						
							|  |  |  | 	/// </summary>
 | 
					
						
							|  |  |  | 	struct sampler_info | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		uint32_t id = 0; | 
					
						
							|  |  |  | 		uint32_t binding = 0; | 
					
						
							|  |  |  | 		uint32_t texture_binding = 0; | 
					
						
							|  |  |  | 		std::string name; | 
					
						
							|  |  |  | 		reshadefx::type type; | 
					
						
							|  |  |  | 		std::string unique_name; | 
					
						
							|  |  |  | 		std::string texture_name; | 
					
						
							|  |  |  | 		std::vector<annotation> annotations; | 
					
						
							|  |  |  | 		filter_mode filter = filter_mode::min_mag_mip_linear; | 
					
						
							|  |  |  | 		texture_address_mode address_u = texture_address_mode::clamp; | 
					
						
							|  |  |  | 		texture_address_mode address_v = texture_address_mode::clamp; | 
					
						
							|  |  |  | 		texture_address_mode address_w = texture_address_mode::clamp; | 
					
						
							|  |  |  | 		float min_lod = -3.402823466e+38f; | 
					
						
							|  |  |  | 		float max_lod = +3.402823466e+38f; // FLT_MAX
 | 
					
						
							|  |  |  | 		float lod_bias = 0.0f; | 
					
						
							|  |  |  | 		uint8_t srgb = false; | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/// <summary>
 | 
					
						
							|  |  |  | 	/// A texture storage object defined in the effect code.
 | 
					
						
							|  |  |  | 	/// </summary>
 | 
					
						
							|  |  |  | 	struct storage_info | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		uint32_t id = 0; | 
					
						
							|  |  |  | 		uint32_t binding = 0; | 
					
						
							|  |  |  | 		std::string name; | 
					
						
							|  |  |  | 		reshadefx::type type; | 
					
						
							|  |  |  | 		std::string unique_name; | 
					
						
							|  |  |  | 		std::string texture_name; | 
					
						
							|  |  |  | 		uint16_t level = 0; | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/// <summary>
 | 
					
						
							|  |  |  | 	/// An uniform variable defined in the effect code.
 | 
					
						
							|  |  |  | 	/// </summary>
 | 
					
						
							|  |  |  | 	struct uniform_info | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		std::string name; | 
					
						
							|  |  |  | 		reshadefx::type type; | 
					
						
							|  |  |  | 		uint32_t size = 0; | 
					
						
							|  |  |  | 		uint32_t offset = 0; | 
					
						
							|  |  |  | 		std::vector<annotation> annotations; | 
					
						
							|  |  |  | 		bool has_initializer_value = false; | 
					
						
							|  |  |  | 		reshadefx::constant initializer_value; | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/// <summary>
 | 
					
						
							|  |  |  | 	/// Type of a shader entry point.
 | 
					
						
							|  |  |  | 	/// </summary>
 | 
					
						
							|  |  |  | 	enum class shader_type | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		vs, | 
					
						
							|  |  |  | 		ps, | 
					
						
							|  |  |  | 		cs, | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/// <summary>
 | 
					
						
							|  |  |  | 	/// A shader entry point function.
 | 
					
						
							|  |  |  | 	/// </summary>
 | 
					
						
							|  |  |  | 	struct entry_point | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		std::string name; | 
					
						
							|  |  |  | 		shader_type type; | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/// <summary>
 | 
					
						
							|  |  |  | 	/// A function defined in the effect code.
 | 
					
						
							|  |  |  | 	/// </summary>
 | 
					
						
							|  |  |  | 	struct function_info | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		uint32_t definition; | 
					
						
							|  |  |  | 		std::string name; | 
					
						
							|  |  |  | 		std::string unique_name; | 
					
						
							|  |  |  | 		reshadefx::type return_type; | 
					
						
							|  |  |  | 		std::string return_semantic; | 
					
						
							|  |  |  | 		std::vector<struct_member_info> parameter_list; | 
					
						
							|  |  |  | 		std::unordered_set<uint32_t> referenced_samplers; | 
					
						
							|  |  |  | 		std::unordered_set<uint32_t> referenced_storages; | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/// <summary>
 | 
					
						
							|  |  |  | 	/// A render pass with all its state info.
 | 
					
						
							|  |  |  | 	/// </summary>
 | 
					
						
							|  |  |  | 	struct pass_info | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		std::string name; | 
					
						
							|  |  |  | 		std::string render_target_names[8] = {}; | 
					
						
							|  |  |  | 		std::string vs_entry_point; | 
					
						
							|  |  |  | 		std::string ps_entry_point; | 
					
						
							|  |  |  | 		std::string cs_entry_point; | 
					
						
							|  |  |  | 		uint8_t generate_mipmaps = true; | 
					
						
							|  |  |  | 		uint8_t clear_render_targets = false; | 
					
						
							|  |  |  | 		uint8_t srgb_write_enable = false; | 
					
						
							|  |  |  | 		uint8_t blend_enable[8] = { false, false, false, false, false, false, false, false }; | 
					
						
							|  |  |  | 		uint8_t stencil_enable = false; | 
					
						
							|  |  |  | 		uint8_t color_write_mask[8] = { 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF }; | 
					
						
							|  |  |  | 		uint8_t stencil_read_mask = 0xFF; | 
					
						
							|  |  |  | 		uint8_t stencil_write_mask = 0xFF; | 
					
						
							|  |  |  | 		pass_blend_op blend_op[8] = { pass_blend_op::add, pass_blend_op::add, pass_blend_op::add, pass_blend_op::add, pass_blend_op::add, pass_blend_op::add, pass_blend_op::add, pass_blend_op::add }; | 
					
						
							|  |  |  | 		pass_blend_op blend_op_alpha[8] = { pass_blend_op::add, pass_blend_op::add, pass_blend_op::add, pass_blend_op::add, pass_blend_op::add, pass_blend_op::add, pass_blend_op::add, pass_blend_op::add }; | 
					
						
							|  |  |  | 		pass_blend_factor src_blend[8] = { pass_blend_factor::one, pass_blend_factor::one, pass_blend_factor::one, pass_blend_factor::one, pass_blend_factor::one, pass_blend_factor::one, pass_blend_factor::one, pass_blend_factor::one }; | 
					
						
							|  |  |  | 		pass_blend_factor dest_blend[8] = { pass_blend_factor::zero, pass_blend_factor::zero, pass_blend_factor::zero, pass_blend_factor::zero, pass_blend_factor::zero, pass_blend_factor::zero, pass_blend_factor::zero, pass_blend_factor::zero }; | 
					
						
							|  |  |  | 		pass_blend_factor src_blend_alpha[8] = { pass_blend_factor::one, pass_blend_factor::one, pass_blend_factor::one, pass_blend_factor::one, pass_blend_factor::one, pass_blend_factor::one, pass_blend_factor::one, pass_blend_factor::one }; | 
					
						
							|  |  |  | 		pass_blend_factor dest_blend_alpha[8] = { pass_blend_factor::zero, pass_blend_factor::zero, pass_blend_factor::zero, pass_blend_factor::zero, pass_blend_factor::zero, pass_blend_factor::zero, pass_blend_factor::zero, pass_blend_factor::zero }; | 
					
						
							|  |  |  | 		pass_stencil_func stencil_comparison_func = pass_stencil_func::always; | 
					
						
							|  |  |  | 		uint32_t stencil_reference_value = 0; | 
					
						
							|  |  |  | 		pass_stencil_op stencil_op_pass = pass_stencil_op::keep; | 
					
						
							|  |  |  | 		pass_stencil_op stencil_op_fail = pass_stencil_op::keep; | 
					
						
							|  |  |  | 		pass_stencil_op stencil_op_depth_fail = pass_stencil_op::keep; | 
					
						
							|  |  |  | 		uint32_t num_vertices = 3; | 
					
						
							|  |  |  | 		primitive_topology topology = primitive_topology::triangle_list; | 
					
						
							|  |  |  | 		uint32_t viewport_width = 0; | 
					
						
							|  |  |  | 		uint32_t viewport_height = 0; | 
					
						
							|  |  |  | 		uint32_t viewport_dispatch_z = 1; | 
					
						
							|  |  |  | 		std::vector<sampler_info> samplers; | 
					
						
							|  |  |  | 		std::vector<storage_info> storages; | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/// <summary>
 | 
					
						
							|  |  |  | 	/// A collection of passes that make up an effect.
 | 
					
						
							|  |  |  | 	/// </summary>
 | 
					
						
							|  |  |  | 	struct technique_info | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		std::string name; | 
					
						
							|  |  |  | 		std::vector<pass_info> passes; | 
					
						
							|  |  |  | 		std::vector<annotation> annotations; | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/// <summary>
 | 
					
						
							|  |  |  | 	/// In-memory representation of an effect file.
 | 
					
						
							|  |  |  | 	/// </summary>
 | 
					
						
							|  |  |  | 	struct module | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		std::vector<char> code; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		std::vector<entry_point> entry_points; | 
					
						
							|  |  |  | 		std::vector<texture_info> textures; | 
					
						
							|  |  |  | 		std::vector<sampler_info> samplers; | 
					
						
							|  |  |  | 		std::vector<storage_info> storages; | 
					
						
							|  |  |  | 		std::vector<uniform_info> uniforms, spec_constants; | 
					
						
							|  |  |  | 		std::vector<technique_info> techniques; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		uint32_t total_uniform_size = 0; | 
					
						
							|  |  |  | 		uint32_t num_texture_bindings = 0; | 
					
						
							|  |  |  | 		uint32_t num_sampler_bindings = 0; | 
					
						
							|  |  |  | 		uint32_t num_storage_bindings = 0; | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | } |