diff --git a/include/daxa/c/command_recorder.h b/include/daxa/c/command_recorder.h index 75b3e735..8baff5ca 100644 --- a/include/daxa/c/command_recorder.h +++ b/include/daxa/c/command_recorder.h @@ -18,7 +18,7 @@ typedef struct { void const * data; uint64_t size; - uint32_t offset; + uint32_t offset; // deprecated API 3.1 } daxa_PushConstantInfo; typedef struct diff --git a/include/daxa/c/core.h b/include/daxa/c/core.h index 8d2e7422..727457ab 100644 --- a/include/daxa/c/core.h +++ b/include/daxa/c/core.h @@ -24,9 +24,6 @@ #define _DAXA_TEST_PRINT(...) -#define DAXA_SHADERLANG_GLSL 1 -#define DAXA_SHADERLANG_SLANG 2 - static uint32_t const DAXA_ID_INDEX_BITS = 20; static uint32_t const DAXA_ID_INDEX_MASK = (1ull << 20) - 1ull; static uint32_t const DAXA_ID_INDEX_OFFSET = 0; @@ -232,6 +229,10 @@ daxa_u32mat4x4; #pragma warning(pop) #endif +static uint32_t const DAXA_MAX_PUSH_CONSTANT_WORD_SIZE = (32); +static uint32_t const DAXA_MAX_PUSH_CONSTANT_BYTE_SIZE = (DAXA_MAX_PUSH_CONSTANT_WORD_SIZE * 4); +static uint32_t const DAXA_PIPELINE_LAYOUT_COUNT = (DAXA_MAX_PUSH_CONSTANT_WORD_SIZE + 1); + // TODO(Raytracing): Should this say like this? static uint32_t const DAXA_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE = 0x00000001; static uint32_t const DAXA_GEOMETRY_INSTANCE_TRIANGLE_FLIP_FACING = 0x00000002; diff --git a/include/daxa/c/pipeline.h b/include/daxa/c/pipeline.h index 45395cb9..93436afc 100644 --- a/include/daxa/c/pipeline.h +++ b/include/daxa/c/pipeline.h @@ -50,6 +50,19 @@ typedef struct daxa_SmallString name; } daxa_RayTracingPipelineInfo; +static daxa_RayTracingPipelineInfo const DAXA_DEFAULT_RAY_TRACING_PIPELINE_INFO = { + .ray_gen_stages = DAXA_ZERO_INIT, + .miss_stages = DAXA_ZERO_INIT, + .callable_stages = DAXA_ZERO_INIT, + .intersection_stages = DAXA_ZERO_INIT, + .closest_hit_stages = DAXA_ZERO_INIT, + .any_hit_stages = DAXA_ZERO_INIT, + .shader_groups = DAXA_ZERO_INIT, + .max_ray_recursion_depth = DAXA_ZERO_INIT, + .push_constant_size = DAXA_MAX_PUSH_CONSTANT_BYTE_SIZE, + .name = DAXA_ZERO_INIT, +}; + DAXA_EXPORT daxa_RayTracingPipelineInfo const * daxa_ray_tracing_pipeline_info(daxa_RayTracingPipeline ray_tracing_pipeline); @@ -74,6 +87,12 @@ typedef struct daxa_SmallString name; } daxa_ComputePipelineInfo; +static daxa_ComputePipelineInfo const DAXA_DEFAULT_COMPUTE_PIPELINE_INFO = { + .shader_info = DAXA_ZERO_INIT, + .push_constant_size = DAXA_MAX_PUSH_CONSTANT_BYTE_SIZE, + .name = DAXA_ZERO_INIT, +}; + DAXA_EXPORT daxa_ComputePipelineInfo const * daxa_compute_pipeline_info(daxa_ComputePipeline compute_pipeline); @@ -192,6 +211,21 @@ typedef struct daxa_SmallString name; } daxa_RasterPipelineInfo; +static daxa_RasterPipelineInfo const DAXA_DEFAULT_RASTERIZER_PIPELINE_INFO = { + .mesh_shader_info = DAXA_ZERO_INIT, + .vertex_shader_info = DAXA_ZERO_INIT, + .tesselation_control_shader_info = DAXA_ZERO_INIT, + .tesselation_evaluation_shader_info = DAXA_ZERO_INIT, + .fragment_shader_info = DAXA_ZERO_INIT, + .task_shader_info = DAXA_ZERO_INIT, + .color_attachments = DAXA_ZERO_INIT, + .depth_test = DAXA_ZERO_INIT, + .tesselation = DAXA_ZERO_INIT, + .raster = DAXA_ZERO_INIT, + .push_constant_size = DAXA_MAX_PUSH_CONSTANT_BYTE_SIZE, + .name = DAXA_ZERO_INIT, +}; + DAXA_EXPORT daxa_RasterPipelineInfo const * daxa_raster_pipeline_info(daxa_RasterPipeline raster_pipeline); diff --git a/include/daxa/command_recorder.hpp b/include/daxa/command_recorder.hpp index 3e91b393..9e85f346 100644 --- a/include/daxa/command_recorder.hpp +++ b/include/daxa/command_recorder.hpp @@ -15,7 +15,7 @@ namespace daxa { void const * data = {}; u64 size = {}; - u32 offset = {}; + [[deprecated("parameter ignored. API: 3.1")]] u32 offset = {}; }; struct CommandRecorderInfo @@ -312,12 +312,11 @@ namespace daxa void push_constant_vptr(PushConstantInfo const & info); template - void push_constant(T const & constant, u32 offset = 0) + void push_constant(T const & constant, [[maybe_unused]] [[deprecated("parameter ignored. API: 3.1")]] u32 offset = 0) { push_constant_vptr({ .data = static_cast(&constant), .size = static_cast(sizeof(T)), - .offset = offset, }); } void set_pipeline(RasterPipeline const & pipeline); diff --git a/include/daxa/daxa.inl b/include/daxa/daxa.inl index 9ff33279..ca448891 100644 --- a/include/daxa/daxa.inl +++ b/include/daxa/daxa.inl @@ -8,30 +8,17 @@ #define DAXA_BUFFER_DEVICE_ADDRESS_BUFFER_BINDING 4 #define DAXA_ACCELERATION_STRUCTURE_BINDING 5 +#define DAXA_LANGUAGE_C 0 +#define DAXA_LANGUAGE_CPP 0 +#define DAXA_LANGUAGE_GLSL 2 +#define DAXA_LANGUAGE_SLANG 3 +#define DAXA_LANGUAGE_HLSL DAXA_LANGUAGE_SLANG + #if defined(_STDC_) // C -#define DAXA_SHADER 0 -#elif defined(__cplusplus) // C++ -#define DAXA_SHADER 0 -#elif defined(GL_core_profile) // GLSL -#define DAXA_SHADER 1 -#define DAXA_SHADERLANG DAXA_SHADERLANG_GLSL -#else // SLANG -#define DAXA_SHADER 1 -#define DAXA_SHADERLANG DAXA_SHADERLANG_SLANG -#endif -#if DAXA_SHADER -#define DAXA_SHADERLANG_GLSL 1 -#define DAXA_SHADERLANG_SLANG 2 -#if DAXA_SHADERLANG == DAXA_SHADERLANG_GLSL -#include -#elif DAXA_SHADERLANG == DAXA_SHADERLANG_SLANG -#include "daxa/daxa.slang" -#endif -#else -#if defined(_STDC_) +#define DAXA_SHADER 0 +#define DAXA_LANGUAGE DAXA_LANGUAGE_C #include - /// @brief Buffer ptr enable is ignored in c++. #define DAXA_DECL_BUFFER_PTR(STRUCT_TYPE) #define DAXA_DECL_BUFFER_PTR_ALIGN(STRUCT_TYPE, ALIGN) @@ -40,9 +27,11 @@ /// @brief Buffer ptr types map to the buffer device address type in daxa. #define daxa_BufferPtr(x) daxa_DeviceAddress -#else -#include +#elif defined(__cplusplus) // C++ +#define DAXA_SHADER 0 +#define DAXA_LANGUAGE DAXA_LANGUAGE_CPP +#include /// @brief Buffer ptr enable is ignored in c++. #define DAXA_DECL_BUFFER_PTR(STRUCT_TYPE) #define DAXA_DECL_BUFFER_PTR_ALIGN(STRUCT_TYPE, ALIGN) @@ -51,5 +40,16 @@ /// @brief Buffer ptr types map to the buffer device address type in daxa. #define daxa_BufferPtr(x) daxa::types::DeviceAddress -#endif -#endif +#elif defined(GL_core_profile) // GLSL + +#define DAXA_SHADER 1 +#define DAXA_LANGUAGE DAXA_LANGUAGE_GLSL +#include + +#else // SLANG + +#define DAXA_SHADER 1 +#define DAXA_LANGUAGE DAXA_LANGUAGE_SLANG +#include "daxa/daxa.slang" + +#endif \ No newline at end of file diff --git a/include/daxa/daxa.slang b/include/daxa/daxa.slang index 945b8eef..a0eccfe1 100644 --- a/include/daxa/daxa.slang +++ b/include/daxa/daxa.slang @@ -147,9 +147,19 @@ namespace daxa { return value == 0; } + SamplerState get() + { + return samplers[index()]; + } }; #if defined(DAXA_RAY_TRACING) + [[vk::binding(DAXA_ACCELERATION_STRUCTURE_BINDING, 0)]] RaytracingAccelerationStructure RayTracingAccelerationStructureTable[]; + extension RaytracingAccelerationStructure + { + static RaytracingAccelerationStructure get(daxa::TlasId i) { return RayTracingAccelerationStructureTable[i.index()]; } + } + struct TlasId { daxa_u64 value; @@ -165,13 +175,11 @@ namespace daxa { return value == 0; } + RaytracingAccelerationStructure get() + { + return RayTracingAccelerationStructureTable[index()]; + } }; - - [[vk::binding(DAXA_ACCELERATION_STRUCTURE_BINDING, 0)]] RaytracingAccelerationStructure RayTracingAccelerationStructureTable[]; - extension RaytracingAccelerationStructure - { - static RaytracingAccelerationStructure get(daxa::TlasId i) { return RayTracingAccelerationStructureTable[i.index()]; } - } #endif // DAXA_RAY_TRACING extension ByteAddressBuffer @@ -211,7 +219,7 @@ namespace daxa\ TYPE get_coherent() { return TYPE::get_coherent(id); }\ }; \ __generic\ - struct TYPE ## Idx\ + struct TYPE ## Index\ {\ ImageViewIndex index;\ TYPE get() { return TYPE::get(index); }\ diff --git a/include/daxa/device.hpp b/include/daxa/device.hpp index 401d221c..3b729af6 100644 --- a/include/daxa/device.hpp +++ b/include/daxa/device.hpp @@ -201,21 +201,21 @@ namespace daxa using Data = u32; }; using DeviceFlags = Flags; - struct [[deprecated("Use ExplicitFeatureFlags or ImplicitFeatureFlags instead")]] DeviceFlagBits + struct [[deprecated("Use ExplicitFeatureFlags or ImplicitFeatureFlags instead, API:3.1")]] DeviceFlagBits { - [[deprecated("Use ExplicitFeatureFlags or ImplicitFeatureFlags instead")]] static inline constexpr DeviceFlags NONE = {0x00000000}; - [[deprecated("Use ExplicitFeatureFlags or ImplicitFeatureFlags instead")]] static inline constexpr DeviceFlags BUFFER_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT = {0x1 << 0}; - [[deprecated("Use ExplicitFeatureFlags or ImplicitFeatureFlags instead")]] static inline constexpr DeviceFlags CONSERVATIVE_RASTERIZATION = {0x1 << 1}; - [[deprecated("Use ExplicitFeatureFlags or ImplicitFeatureFlags instead")]] static inline constexpr DeviceFlags MESH_SHADER = {0x1 << 2}; - [[deprecated("Use ExplicitFeatureFlags or ImplicitFeatureFlags instead")]] static inline constexpr DeviceFlags SHADER_ATOMIC64 = {0x1 << 3}; - [[deprecated("Use ExplicitFeatureFlags or ImplicitFeatureFlags instead")]] static inline constexpr DeviceFlags IMAGE_ATOMIC64 = {0x1 << 4}; - [[deprecated("Use ExplicitFeatureFlags or ImplicitFeatureFlags instead")]] static inline constexpr DeviceFlags VK_MEMORY_MODEL = {0x1 << 5}; - [[deprecated("Use ExplicitFeatureFlags or ImplicitFeatureFlags instead")]] static inline constexpr DeviceFlags RAY_TRACING = {0x1 << 6}; - [[deprecated("Use ExplicitFeatureFlags or ImplicitFeatureFlags instead")]] static inline constexpr DeviceFlags SHADER_FLOAT16 = {0x1 << 7}; - [[deprecated("Use ExplicitFeatureFlags or ImplicitFeatureFlags instead")]] static inline constexpr DeviceFlags ROBUST_BUFFER_ACCESS = {0x1 << 9}; - [[deprecated("Use ExplicitFeatureFlags or ImplicitFeatureFlags instead")]] static inline constexpr DeviceFlags ROBUST_IMAGE_ACCESS = {0x1 << 10}; - [[deprecated("Use ExplicitFeatureFlags or ImplicitFeatureFlags instead")]] static inline constexpr DeviceFlags DYNAMIC_STATE_3 = {0x1 << 11}; - [[deprecated("Use ExplicitFeatureFlags or ImplicitFeatureFlags instead")]] static inline constexpr DeviceFlags SHADER_ATOMIC_FLOAT = {0x1 << 12}; + [[deprecated("Use ExplicitFeatureFlags or ImplicitFeatureFlags instead, API:3.1")]] static inline constexpr DeviceFlags NONE = {0x00000000}; + [[deprecated("Use ExplicitFeatureFlags or ImplicitFeatureFlags instead, API:3.1")]] static inline constexpr DeviceFlags BUFFER_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT = {0x1 << 0}; + [[deprecated("Use ExplicitFeatureFlags or ImplicitFeatureFlags instead, API:3.1")]] static inline constexpr DeviceFlags CONSERVATIVE_RASTERIZATION = {0x1 << 1}; + [[deprecated("Use ExplicitFeatureFlags or ImplicitFeatureFlags instead, API:3.1")]] static inline constexpr DeviceFlags MESH_SHADER = {0x1 << 2}; + [[deprecated("Use ExplicitFeatureFlags or ImplicitFeatureFlags instead, API:3.1")]] static inline constexpr DeviceFlags SHADER_ATOMIC64 = {0x1 << 3}; + [[deprecated("Use ExplicitFeatureFlags or ImplicitFeatureFlags instead, API:3.1")]] static inline constexpr DeviceFlags IMAGE_ATOMIC64 = {0x1 << 4}; + [[deprecated("Use ExplicitFeatureFlags or ImplicitFeatureFlags instead, API:3.1")]] static inline constexpr DeviceFlags VK_MEMORY_MODEL = {0x1 << 5}; + [[deprecated("Use ExplicitFeatureFlags or ImplicitFeatureFlags instead, API:3.1")]] static inline constexpr DeviceFlags RAY_TRACING = {0x1 << 6}; + [[deprecated("Use ExplicitFeatureFlags or ImplicitFeatureFlags instead, API:3.1")]] static inline constexpr DeviceFlags SHADER_FLOAT16 = {0x1 << 7}; + [[deprecated("Use ExplicitFeatureFlags or ImplicitFeatureFlags instead, API:3.1")]] static inline constexpr DeviceFlags ROBUST_BUFFER_ACCESS = {0x1 << 9}; + [[deprecated("Use ExplicitFeatureFlags or ImplicitFeatureFlags instead, API:3.1")]] static inline constexpr DeviceFlags ROBUST_IMAGE_ACCESS = {0x1 << 10}; + [[deprecated("Use ExplicitFeatureFlags or ImplicitFeatureFlags instead, API:3.1")]] static inline constexpr DeviceFlags DYNAMIC_STATE_3 = {0x1 << 11}; + [[deprecated("Use ExplicitFeatureFlags or ImplicitFeatureFlags instead, API:3.1")]] static inline constexpr DeviceFlags SHADER_ATOMIC_FLOAT = {0x1 << 12}; }; #endif @@ -323,7 +323,7 @@ namespace daxa }; #if !DAXA_REMOVE_DEPRECATED - [[deprecated("Use create_device_2 and Instance::choose_device instead")]] DAXA_EXPORT_CXX auto default_device_score(DeviceProperties const & device_props) -> i32; + [[deprecated("Use create_device_2 and Instance::choose_device instead, API:3.1")]] DAXA_EXPORT_CXX auto default_device_score(DeviceProperties const & device_props) -> i32; struct [[deprecated("Use DeviceInfo2 instead")]] DeviceInfo { @@ -585,27 +585,27 @@ namespace daxa #if !DAXA_REMOVE_DEPRECATED /// DEPRECATED: - [[deprecated("Use tlas_build_sizes or as_build_sizes Instead")]] [[nodiscard]] auto get_tlas_build_sizes(TlasBuildInfo const & info) { return tlas_build_sizes(info); } - [[deprecated("Use blas_build_sizes or as_build_sizes Instead")]] [[nodiscard]] auto get_blas_build_sizes(BlasBuildInfo const & info) { return blas_build_sizes(info); } - [[deprecated("Use buffer_memory_requirements or memory_requirements Instead")]] [[nodiscard]] auto get_memory_requirements(BufferInfo const & info) const { return buffer_memory_requirements(info); } - [[deprecated("Use image_memory_requirements or memory_requirements Instead")]] [[nodiscard]] auto get_memory_requirements(ImageInfo const & info) const { return image_memory_requirements(info); } - [[deprecated("Use buffer_info or info instead")]] [[nodiscard]] auto info_buffer(BufferId id) const { return buffer_info(id); } - [[deprecated("Use image_info or info instead")]] [[nodiscard]] auto info_image(ImageId id) const { return image_info(id); } - [[deprecated("Use image_view_info or info instead")]] [[nodiscard]] auto info_image_view(ImageViewId id) const { return image_view_info(id); } - [[deprecated("Use sampler_info or info instead")]] [[nodiscard]] auto info_sampler(SamplerId id) const { return sampler_info(id); } - [[deprecated("Use tlas_info or info instead")]] [[nodiscard]] auto info_tlas(TlasId id) const { return tlas_info(id); } - [[deprecated("Use blas_info or info instead")]] [[nodiscard]] auto info_blas(BlasId id) const { return blas_info(id); } + [[deprecated("Use tlas_build_sizes or as_build_sizes Instead, API:3.0")]] [[nodiscard]] auto get_tlas_build_sizes(TlasBuildInfo const & info) { return tlas_build_sizes(info); } + [[deprecated("Use blas_build_sizes or as_build_sizes Instead, API:3.0")]] [[nodiscard]] auto get_blas_build_sizes(BlasBuildInfo const & info) { return blas_build_sizes(info); } + [[deprecated("Use buffer_memory_requirements or memory_requirements Instead, API:3.0")]] [[nodiscard]] auto get_memory_requirements(BufferInfo const & info) const { return buffer_memory_requirements(info); } + [[deprecated("Use image_memory_requirements or memory_requirements Instead, API:3.0")]] [[nodiscard]] auto get_memory_requirements(ImageInfo const & info) const { return image_memory_requirements(info); } + [[deprecated("Use buffer_info or info instead, API:3.0")]] [[nodiscard]] auto info_buffer(BufferId id) const { return buffer_info(id); } + [[deprecated("Use image_info or info instead, API:3.0")]] [[nodiscard]] auto info_image(ImageId id) const { return image_info(id); } + [[deprecated("Use image_view_info or info instead, API:3.0")]] [[nodiscard]] auto info_image_view(ImageViewId id) const { return image_view_info(id); } + [[deprecated("Use sampler_info or info instead, API:3.0")]] [[nodiscard]] auto info_sampler(SamplerId id) const { return sampler_info(id); } + [[deprecated("Use tlas_info or info instead, API:3.0")]] [[nodiscard]] auto info_tlas(TlasId id) const { return tlas_info(id); } + [[deprecated("Use blas_info or info instead, API:3.0")]] [[nodiscard]] auto info_blas(BlasId id) const { return blas_info(id); } template - [[deprecated("Use buffer_host_address_as instead")]] [[nodiscard]] auto get_host_address_as(BufferId id) const + [[deprecated("Use buffer_host_address_as instead, API:3.0")]] [[nodiscard]] auto get_host_address_as(BufferId id) const { return buffer_host_address_as(id); } - [[deprecated("Use buffer_host_address instead")]] [[nodiscard]] auto get_host_address(BufferId id) const { return buffer_host_address(id); } - [[deprecated("Use buffer_device_address or device_address instead")]] [[nodiscard]] auto get_device_address(BufferId id) const { return buffer_device_address(id); } - [[deprecated("Use blas_device_address or device_address instead")]] [[nodiscard]] auto get_device_address(BlasId id) const { return blas_device_address(id); } - [[deprecated("Use tlas_device_address or device_address instead")]] [[nodiscard]] auto get_device_address(TlasId id) const { return tlas_device_address(id); } + [[deprecated("Use buffer_host_address instead, API:3.0")]] [[nodiscard]] auto get_host_address(BufferId id) const { return buffer_host_address(id); } + [[deprecated("Use buffer_device_address or device_address instead, API:3.0")]] [[nodiscard]] auto get_device_address(BufferId id) const { return buffer_device_address(id); } + [[deprecated("Use blas_device_address or device_address instead, API:3.0")]] [[nodiscard]] auto get_device_address(BlasId id) const { return blas_device_address(id); } + [[deprecated("Use tlas_device_address or device_address instead, API:3.0")]] [[nodiscard]] auto get_device_address(TlasId id) const { return tlas_device_address(id); } #endif protected: diff --git a/include/daxa/instance.hpp b/include/daxa/instance.hpp index b9afc116..57b3b4e8 100644 --- a/include/daxa/instance.hpp +++ b/include/daxa/instance.hpp @@ -31,15 +31,15 @@ namespace daxa Instance() = default; #if !DAXA_REMOVE_DEPRECATED - [[deprecated("Use create_device_2 instead")]] [[nodiscard]] auto create_device(DeviceInfo const & device_info) -> Device; + [[deprecated("Use create_device_2 instead, API:3.0")]] [[nodiscard]] auto create_device(DeviceInfo const & device_info) -> Device; #endif [[nodiscard]] auto create_device_2(DeviceInfo2 const & device_info) -> Device; /// Convenience function to pick a physical device. /// Picks first supported device that satisfies the given device info and desired implicit features. - auto choose_device(ImplicitFeatureFlags desired_features, DeviceInfo2 const & base_info) -> DeviceInfo2; + [[nodiscard]] auto choose_device(ImplicitFeatureFlags desired_features, DeviceInfo2 const & base_info) -> DeviceInfo2; - auto list_devices_properties() -> std::span; + [[nodiscard]] auto list_devices_properties() -> std::span; /// THREADSAFETY: /// * reference MUST NOT be read after the object is destroyed. diff --git a/include/daxa/pipeline.hpp b/include/daxa/pipeline.hpp index 0d5df85e..adda27f3 100644 --- a/include/daxa/pipeline.hpp +++ b/include/daxa/pipeline.hpp @@ -61,8 +61,8 @@ namespace daxa Span closest_hit_shaders = {}; Span miss_hit_shaders = {}; Span shader_groups = {}; - u32 max_ray_recursion_depth; - u32 push_constant_size = {}; + u32 max_ray_recursion_depth = {}; + u32 push_constant_size = DAXA_MAX_PUSH_CONSTANT_BYTE_SIZE; SmallString name = {}; }; @@ -97,7 +97,7 @@ namespace daxa struct ComputePipelineInfo { ShaderInfo shader_info = {}; - u32 push_constant_size = {}; + u32 push_constant_size = DAXA_MAX_PUSH_CONSTANT_BYTE_SIZE; SmallString name = {}; }; @@ -191,7 +191,7 @@ namespace daxa Optional depth_test = {}; Optional tesselation = {}; RasterizerInfo raster = {}; - u32 push_constant_size = {}; + u32 push_constant_size = DAXA_MAX_PUSH_CONSTANT_BYTE_SIZE; SmallString name = {}; }; diff --git a/include/daxa/types.hpp b/include/daxa/types.hpp index f4fc853e..26ae3612 100644 --- a/include/daxa/types.hpp +++ b/include/daxa/types.hpp @@ -111,14 +111,14 @@ namespace daxa Optional(Optional const &) = default; Optional(T const & v) : m_value{v}, m_has_value{true} {} Optional(NoneT const &) : m_value{}, m_has_value{} {} - Optional & operator=(Optional const &) = default; - Optional & operator=(T const & v) + auto operator=(Optional const &) -> Optional& = default; + auto operator=(T const & v) -> Optional& { this->m_value = v; this->m_has_value = true; return *this; } - Optional & operator=(NoneT const &) + auto operator=(NoneT const &) -> Optional & { this->m_value = {}; this->m_has_value = {}; @@ -360,7 +360,7 @@ namespace daxa } } SmallString(SmallString const & other) = default; - SmallString & operator=(SmallString const & other) = default; + auto operator=(SmallString const & other) -> SmallString & = default; [[nodiscard]] auto view() const -> std::string_view { return {this->m_data.data(), static_cast(this->m_size)}; @@ -1198,7 +1198,7 @@ namespace daxa MAX_ENUM = 0x7fffffff, }; - auto to_string(Format format) -> std::string_view; + [[nodiscard]] DAXA_EXPORT_CXX auto to_string(Format format) -> std::string_view; template struct Flags final @@ -1237,7 +1237,7 @@ namespace daxa } [[nodiscard]] inline constexpr auto operator<=>(Flags const & other) const = default; - operator bool() const + constexpr operator bool() const { return data != 0; } @@ -1302,7 +1302,7 @@ namespace daxa static inline constexpr ImageUsageFlags FRAGMENT_SHADING_RATE_ATTACHMENT = {0x00000100}; }; - [[nodiscard]] auto to_string(ImageUsageFlags const &) -> std::string; + [[nodiscard]] DAXA_EXPORT_CXX auto to_string(ImageUsageFlags const &) -> std::string; struct MemoryFlagsProperties { @@ -1355,7 +1355,7 @@ namespace daxa MAX_ENUM = 0x7fffffff, }; - [[nodiscard]] auto to_string(ImageLayout layout) -> std::string_view; + [[nodiscard]] DAXA_EXPORT_CXX auto to_string(ImageLayout layout) -> std::string_view; struct DAXA_EXPORT_CXX ImageMipArraySlice { @@ -1372,7 +1372,7 @@ namespace daxa [[nodiscard]] auto subtract(ImageMipArraySlice const & slice) const -> std::tuple, usize>; }; - [[nodiscard]] auto to_string(ImageMipArraySlice image_mip_array_slice) -> std::string; + [[nodiscard]] DAXA_EXPORT_CXX auto to_string(ImageMipArraySlice image_mip_array_slice) -> std::string; struct DAXA_EXPORT_CXX ImageArraySlice { @@ -1387,7 +1387,7 @@ namespace daxa [[nodiscard]] auto contained_in(ImageMipArraySlice const & slice) const -> bool; }; - [[nodiscard]] auto to_string(ImageArraySlice image_array_slice) -> std::string; + [[nodiscard]] DAXA_EXPORT_CXX auto to_string(ImageArraySlice image_array_slice) -> std::string; struct DAXA_EXPORT_CXX ImageSlice { @@ -1402,7 +1402,7 @@ namespace daxa [[nodiscard]] auto contained_in(ImageArraySlice const & slice) const -> bool; }; - auto to_string(ImageSlice image_slice) -> std::string; + [[nodiscard]] DAXA_EXPORT_CXX auto to_string(ImageSlice image_slice) -> std::string; enum struct Filter { @@ -1469,7 +1469,7 @@ namespace daxa static inline constexpr AccessTypeFlags READ_WRITE = READ | WRITE; }; - [[nodiscard]] auto to_string(AccessTypeFlags flags) -> std::string; + [[nodiscard]] DAXA_EXPORT_CXX auto to_string(AccessTypeFlags flags) -> std::string; struct PipelineStageFlagsProperties { @@ -1508,7 +1508,7 @@ namespace daxa static inline constexpr PipelineStageFlags RAY_TRACING_SHADER = {0x00200000ull}; }; - [[nodiscard]] auto to_string(PipelineStageFlags flags) -> std::string; + [[nodiscard]] DAXA_EXPORT_CXX auto to_string(PipelineStageFlags flags) -> std::string; struct Access { @@ -1879,5 +1879,5 @@ namespace daxa TRANSFER }; - auto to_string(QueueFamily family) -> std::string_view; + [[nodiscard]] DAXA_EXPORT_CXX auto to_string(QueueFamily family) -> std::string_view; } // namespace daxa diff --git a/include/daxa/utils/mem.hpp b/include/daxa/utils/mem.hpp index 45eb3666..a737a6a0 100644 --- a/include/daxa/utils/mem.hpp +++ b/include/daxa/utils/mem.hpp @@ -40,7 +40,7 @@ namespace daxa /// @brief Allocates a section of a buffer with the size of T, writes the given T to the allocation. /// @return allocation. template - auto allocate_fill(T const & value, u32 alignment_requirement = 1) -> std::optional + auto allocate_fill(T const & value, u32 alignment_requirement = alignof(T)) -> std::optional { auto allocation_o = allocate(sizeof(T), alignment_requirement); if (allocation_o.has_value()) diff --git a/include/daxa/utils/pipeline_manager.hpp b/include/daxa/utils/pipeline_manager.hpp index e524705b..930253ec 100644 --- a/include/daxa/utils/pipeline_manager.hpp +++ b/include/daxa/utils/pipeline_manager.hpp @@ -42,7 +42,8 @@ namespace daxa u32 major, minor; }; - struct ShaderCompileOptions +#if !DAXA_REMOVE_DEPRECATED + struct [[deprecated("Use ShaderCompileInfo2 instead, API:3.1")]] ShaderCompileOptions { std::optional entry_point = {}; std::vector root_paths = {}; @@ -58,13 +59,13 @@ namespace daxa void inherit(ShaderCompileOptions const & other); }; - struct ShaderCompileInfo + struct [[deprecated("Use ShaderCompileInfo2 instead, API:3.1")]] ShaderCompileInfo { ShaderSource source = Monostate{}; ShaderCompileOptions compile_options = {}; }; - struct RayTracingPipelineCompileInfo + struct [[deprecated("Use RayTracingPipelineCompileInfo2 instead, API:3.1")]] RayTracingPipelineCompileInfo { std::vector ray_gen_infos = {}; std::vector intersection_infos = {}; @@ -78,14 +79,14 @@ namespace daxa std::string name = {}; }; - struct ComputePipelineCompileInfo + struct [[deprecated("Use ComputePipelineCompileInfo2 instead, API:3.1")]] ComputePipelineCompileInfo { ShaderCompileInfo shader_info = {}; u32 push_constant_size = {}; std::string name = {}; }; - struct RasterPipelineCompileInfo + struct [[deprecated("Use RasterPipelineCompileInfo2 instead, API:3.1")]] RasterPipelineCompileInfo { Optional mesh_shader_info = {}; Optional vertex_shader_info = {}; @@ -101,7 +102,7 @@ namespace daxa std::string name = {}; }; - struct PipelineManagerInfo + struct [[deprecated("Use PipelineManagerInfo2 instead, API:3.1")]] PipelineManagerInfo { Device device; ShaderCompileOptions shader_compile_options = {}; @@ -109,6 +110,74 @@ namespace daxa std::function custom_preprocessor = {}; std::string name = {}; }; +#endif + + struct ShaderCompileInfo2 + { + ShaderSource source = Monostate{}; + std::optional entry_point = {}; + std::optional language = {}; + std::vector defines = {}; + std::optional enable_debug_info = {}; + std::optional create_flags = {}; + std::optional required_subgroup_size = {}; + }; + + struct RayTracingPipelineCompileInfo2 + { + std::vector ray_gen_infos = {}; + std::vector intersection_infos = {}; + std::vector any_hit_infos = {}; + std::vector callable_infos = {}; + std::vector closest_hit_infos = {}; + std::vector miss_hit_infos = {}; + std::vector shader_groups_infos = {}; + u32 max_ray_recursion_depth = {}; + u32 push_constant_size = DAXA_MAX_PUSH_CONSTANT_BYTE_SIZE; + std::string name = {}; + }; + + // Future replacement for ComputePipelineCompileInfo on daxa 3.1 release. + struct ComputePipelineCompileInfo2 + { + ShaderSource source = Monostate{}; + std::optional entry_point = {}; + std::optional language = {}; + std::vector defines = {}; + std::optional enable_debug_info = {}; + std::optional create_flags = {}; + std::optional required_subgroup_size = {}; + u32 push_constant_size = DAXA_MAX_PUSH_CONSTANT_BYTE_SIZE; std::string name = {}; + }; + + struct RasterPipelineCompileInfo2 + { + Optional mesh_shader_info = {}; + Optional vertex_shader_info = {}; + Optional tesselation_control_shader_info = {}; + Optional tesselation_evaluation_shader_info = {}; + Optional fragment_shader_info = {}; + Optional task_shader_info = {}; + std::vector color_attachments = {}; + Optional depth_test = {}; + RasterizerInfo raster = {}; + TesselationInfo tesselation = {}; + u32 push_constant_size = DAXA_MAX_PUSH_CONSTANT_BYTE_SIZE; + std::string name = {}; + }; + + struct PipelineManagerInfo2 + { + Device device; + std::vector root_paths = {}; + std::optional write_out_preprocessed_code = {}; + std::optional write_out_spirv = {}; + std::optional spirv_cache_folder = {}; + ShaderCompileInfo2 default_shader_compile_info = {}; + bool register_null_pipelines_when_first_compile_fails = false; + std::function custom_preprocessor = {}; + std::string name = {}; + }; struct VirtualFileInfo { @@ -130,13 +199,19 @@ namespace daxa struct ImplPipelineManager; struct DAXA_EXPORT_CXX PipelineManager : ManagedPtr { - PipelineManager() = default; +#if !DAXA_REMOVE_DEPRECATED + [[deprecated("Use PipelineManager(PipelineManagerInfo2) instead, API:3.1")]] PipelineManager(PipelineManagerInfo info); + [[deprecated("Use add_ray_tracing_pipeline2 instead, API:3.1")]] auto add_ray_tracing_pipeline(RayTracingPipelineCompileInfo const & info) -> Result>; + [[deprecated("Use add_compute_pipeline2 instead, API:3.1")]] auto add_compute_pipeline(ComputePipelineCompileInfo info) -> Result>; + [[deprecated("Use add_raster_pipeline2 instead, API:3.1")]] auto add_raster_pipeline(RasterPipelineCompileInfo const & info) -> Result>; +#endif - PipelineManager(PipelineManagerInfo info); + PipelineManager() = default; + PipelineManager(PipelineManagerInfo2 info); - auto add_ray_tracing_pipeline(RayTracingPipelineCompileInfo const & info) -> Result>; - auto add_compute_pipeline(ComputePipelineCompileInfo const & info) -> Result>; - auto add_raster_pipeline(RasterPipelineCompileInfo const & info) -> Result>; + auto add_ray_tracing_pipeline2(RayTracingPipelineCompileInfo2 const & info) -> Result>; + auto add_compute_pipeline2(ComputePipelineCompileInfo2 info) -> Result>; + auto add_raster_pipeline2(RasterPipelineCompileInfo2 const & info) -> Result>; void remove_ray_tracing_pipeline(std::shared_ptr const & pipeline); void remove_compute_pipeline(std::shared_ptr const & pipeline); void remove_raster_pipeline(std::shared_ptr const & pipeline); diff --git a/include/daxa/utils/task_graph.hpp b/include/daxa/utils/task_graph.hpp index 72388ff6..5b44e037 100644 --- a/include/daxa/utils/task_graph.hpp +++ b/include/daxa/utils/task_graph.hpp @@ -82,6 +82,11 @@ namespace daxa /// This memory is used internally as well as by tasks via the TaskInterface::get_allocator(). /// Setting the size to 0, disables a few task list features but also eliminates the memory allocation. u32 staging_memory_pool_size = 262'144; // 2^16 bytes. + // Useful for debugging tools that are invisible to the graph. + daxa::ImageUsageFlags additional_transient_image_usage_flags = {}; + // Useful for reflection/ debugging. + std::function pre_task_callback = {}; + std::function post_task_callback = {}; std::string name = {}; }; @@ -138,7 +143,7 @@ namespace daxa { std::vector attachments = {}; std::function task = {}; - std::string_view name = "unnamed"; + std::string name = "unnamed"; }; struct InlineTask : ITask @@ -166,7 +171,48 @@ namespace daxa private: std::vector _attachments = {}; std::function _callback = {}; - std::string_view _name = {}; + std::string _name = {}; + }; + + template + struct InlineTaskWithHead : TaskHeadTaskT + { + TaskHeadTaskT::AttachmentViews views = {}; + std::function task = {}; + void callback(daxa::TaskInterface ti) + { + task(ti); + } + }; + + struct TaskBufferClearInfo + { + TaskBufferView buffer = {}; + u64 offset = {}; + u64 size = ~0ull; // default clears all + u32 clear_value = {}; + std::string_view name = {}; + }; + + struct TaskImageClearInfo + { + TaskImageView view = {}; + ClearValue clear_value = std::array{0u, 0u, 0u, 0u}; + std::string_view name = {}; + }; + + struct TaskBufferCopyInfo + { + TaskBufferView src = {}; + TaskBufferView dst = {}; + std::string_view name = {}; + }; + + struct TaskImageCopyInfo + { + TaskImageView src = {}; + TaskImageView dst = {}; + std::string_view name = {}; }; struct ImplTaskGraph; @@ -186,6 +232,15 @@ namespace daxa DAXA_EXPORT_CXX auto create_transient_buffer(TaskTransientBufferInfo const & info) -> TaskBufferView; DAXA_EXPORT_CXX auto create_transient_image(TaskTransientImageInfo const & info) -> TaskImageView; + DAXA_EXPORT_CXX auto transient_buffer_info(TaskBufferView const & transient) -> TaskTransientBufferInfo const &; + DAXA_EXPORT_CXX auto transient_image_info(TaskImageView const & transient) -> TaskTransientImageInfo const &; + + DAXA_EXPORT_CXX void clear_buffer(TaskBufferClearInfo const & info); + DAXA_EXPORT_CXX void clear_image(TaskImageClearInfo const & info); + + DAXA_EXPORT_CXX void copy_buffer_to_buffer(TaskBufferCopyInfo const & info); + DAXA_EXPORT_CXX void copy_image_to_image(TaskImageCopyInfo const & info); + template requires std::is_base_of_v void add_task(TTask const & task) @@ -206,7 +261,7 @@ namespace daxa { TaskBufferAttachmentInfo info; info.name = NoRefTTask::attachments()[i].value.buffer.name; - info.access = NoRefTTask::attachments()[i].value.buffer.access; + info.task_access = NoRefTTask::attachments()[i].value.buffer.task_access; info.shader_array_size = NoRefTTask::attachments()[i].value.buffer.shader_array_size; info.shader_as_address = NoRefTTask::attachments()[i].value.buffer.shader_as_address; info.view = daxa::get(task.views.views[i]); @@ -217,7 +272,7 @@ namespace daxa { TaskTlasAttachmentInfo info; info.name = NoRefTTask::attachments()[i].value.tlas.name; - info.access = NoRefTTask::attachments()[i].value.tlas.access; + info.task_access = NoRefTTask::attachments()[i].value.tlas.task_access; info.shader_as_address = NoRefTTask::attachments()[i].value.tlas.shader_as_address; info.view = daxa::get(task.views.views[i]); _attachments[i] = info; @@ -227,7 +282,7 @@ namespace daxa { TaskBlasAttachmentInfo info; info.name = NoRefTTask::attachments()[i].value.blas.name; - info.access = NoRefTTask::attachments()[i].value.blas.access; + info.task_access = NoRefTTask::attachments()[i].value.blas.task_access; info.view = daxa::get(task.views.views[i]); _attachments[i] = info; } @@ -236,7 +291,7 @@ namespace daxa { TaskImageAttachmentInfo info; info.name = NoRefTTask::attachments()[i].value.image.name; - info.access = NoRefTTask::attachments()[i].value.image.access; + info.task_access = NoRefTTask::attachments()[i].value.image.task_access; info.view_type = NoRefTTask::attachments()[i].value.image.view_type; info.shader_array_size = NoRefTTask::attachments()[i].value.image.shader_array_size; info.shader_array_type = NoRefTTask::attachments()[i].value.image.shader_array_type; diff --git a/include/daxa/utils/task_graph.inl b/include/daxa/utils/task_graph.inl index 3269bf98..ca9bc069 100644 --- a/include/daxa/utils/task_graph.inl +++ b/include/daxa/utils/task_graph.inl @@ -42,7 +42,7 @@ // DAXA 3.0 Task-Head-Shader interface: #if DAXA_SHADER -#if DAXA_SHADERLANG == DAXA_SHADERLANG_SLANG +#if DAXA_LANGUAGE == DAXA_LANGUAGE_SLANG #define DAXA_DECL_TASK_HEAD_BEGIN(HEAD_NAME) \ namespace HEAD_NAME \ { \ diff --git a/include/daxa/utils/task_graph_types.hpp b/include/daxa/utils/task_graph_types.hpp index 393336fc..93026e38 100644 --- a/include/daxa/utils/task_graph_types.hpp +++ b/include/daxa/utils/task_graph_types.hpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -82,7 +83,7 @@ namespace daxa MAX_ENUM = 0x7fffffff, }; - auto to_string(TaskBufferAccess const & usage) -> std::string_view; + [[nodiscard]] DAXA_EXPORT_CXX auto to_string(TaskBufferAccess const & usage) -> std::string_view; enum struct TaskBlasAccess { @@ -100,7 +101,7 @@ namespace daxa MAX_ENUM = 0x7fffffff, }; - auto to_string(TaskBlasAccess const & usage) -> std::string_view; + [[nodiscard]] DAXA_EXPORT_CXX auto to_string(TaskBlasAccess const & usage) -> std::string_view; enum struct TaskTlasAccess { @@ -128,11 +129,16 @@ namespace daxa MAX_ENUM = 0x7fffffff, }; - auto to_string(TaskTlasAccess const & usage) -> std::string_view; + [[nodiscard]] DAXA_EXPORT_CXX auto to_string(TaskTlasAccess const & usage) -> std::string_view; enum struct TaskImageAccess { NONE, + SHADER_SAMPLED, + SHADER_STORAGE_WRITE_ONLY, + SHADER_STORAGE_READ_ONLY, + SHADER_STORAGE_READ_WRITE, + SHADER_STORAGE_READ_WRITE_CONCURRENT, GRAPHICS_SHADER_SAMPLED, GRAPHICS_SHADER_STORAGE_WRITE_ONLY, GRAPHICS_SHADER_STORAGE_READ_ONLY, @@ -197,7 +203,7 @@ namespace daxa MAX_ENUM = 0x7fffffff, }; - auto to_string(TaskImageAccess const & usage) -> std::string_view; + [[nodiscard]] DAXA_EXPORT_CXX auto to_string(TaskImageAccess const & usage) -> std::string_view; using TaskResourceIndex = u32; @@ -213,7 +219,7 @@ namespace daxa auto operator<=>(TaskGPUResourceView const & other) const = default; }; - auto to_string(TaskGPUResourceView const & id) -> std::string; + [[nodiscard]] DAXA_EXPORT_CXX auto to_string(TaskGPUResourceView const & id) -> std::string; struct TaskBufferView : public TaskGPUResourceView { @@ -327,7 +333,8 @@ namespace daxa { using INDEX_TYPE = TaskBufferAttachmentIndex; char const * name = {}; - TaskBufferAccess access = {}; + TaskBufferAccess task_access = {}; + Access access = {}; u8 shader_array_size = {}; bool shader_as_address = {}; }; @@ -336,14 +343,16 @@ namespace daxa { using INDEX_TYPE = TaskBlasAttachmentIndex; char const * name = {}; - TaskBlasAccess access = {}; + TaskBlasAccess task_access = {}; + Access access = {}; }; struct TaskTlasAttachment { using INDEX_TYPE = TaskTlasAttachmentIndex; char const * name = {}; - TaskTlasAccess access = {}; + TaskTlasAccess task_access = {}; + Access access = {}; bool shader_as_address = {}; }; @@ -351,7 +360,8 @@ namespace daxa { using INDEX_TYPE = TaskImageAttachmentIndex; char const * name = {}; - TaskImageAccess access = {}; + TaskImageAccess task_access = {}; + Access access = {}; ImageViewType view_type = ImageViewType::MAX_ENUM; u8 shader_array_size = {}; bool shader_as_index = {}; @@ -589,9 +599,10 @@ namespace daxa TransferMemoryPool * allocator = {}; std::span attachment_shader_blob = {}; std::string_view task_name = {}; + usize task_index = {}; #if !DAXA_REMOVE_DEPRECATED - [[deprecated("Use AttachmentBlob(std::span) constructor instead")]] void assign_attachment_shader_blob(std::span arr) const + [[deprecated("Use AttachmentBlob(std::span) constructor instead, API:3.0")]] void assign_attachment_shader_blob(std::span arr) const { std::memcpy( arr.data(), @@ -811,32 +822,32 @@ namespace daxa return declared_attachments_count++; \ } -#define _DAXA_HELPER_TH_BUFFER(NAME, TASK_ACCESS, ...) \ - daxa::TaskBufferAttachmentIndex const NAME = \ - {add_attachment(daxa::TaskBufferAttachment{ \ - .name = #NAME, \ - .access = daxa::TaskBufferAccess::TASK_ACCESS, \ +#define _DAXA_HELPER_TH_BUFFER(NAME, TASK_ACCESS, ...) \ + daxa::TaskBufferAttachmentIndex const NAME = \ + {add_attachment(daxa::TaskBufferAttachment{ \ + .name = #NAME, \ + .task_access = daxa::TaskBufferAccess::TASK_ACCESS, \ __VA_ARGS__})}; -#define _DAXA_HELPER_TH_BLAS(NAME, TASK_ACCESS) \ - daxa::TaskBlasAttachmentIndex const NAME = \ - {add_attachment(daxa::TaskBlasAttachment{ \ - .name = #NAME, \ - .access = daxa::TaskBlasAccess::TASK_ACCESS, \ +#define _DAXA_HELPER_TH_BLAS(NAME, TASK_ACCESS) \ + daxa::TaskBlasAttachmentIndex const NAME = \ + {add_attachment(daxa::TaskBlasAttachment{ \ + .name = #NAME, \ + .task_access = daxa::TaskBlasAccess::TASK_ACCESS, \ })}; -#define _DAXA_HELPER_TH_TLAS(NAME, TASK_ACCESS, ...) \ - daxa::TaskTlasAttachmentIndex const NAME = \ - {add_attachment(daxa::TaskTlasAttachment{ \ - .name = #NAME, \ - .access = daxa::TaskTlasAccess::TASK_ACCESS, \ +#define _DAXA_HELPER_TH_TLAS(NAME, TASK_ACCESS, ...) \ + daxa::TaskTlasAttachmentIndex const NAME = \ + {add_attachment(daxa::TaskTlasAttachment{ \ + .name = #NAME, \ + .task_access = daxa::TaskTlasAccess::TASK_ACCESS, \ __VA_ARGS__})}; -#define _DAXA_HELPER_TH_IMAGE(NAME, TASK_ACCESS, ...) \ - daxa::TaskImageAttachmentIndex const NAME = \ - {add_attachment(daxa::TaskImageAttachment{ \ - .name = #NAME, \ - .access = daxa::TaskImageAccess::TASK_ACCESS, \ +#define _DAXA_HELPER_TH_IMAGE(NAME, TASK_ACCESS, ...) \ + daxa::TaskImageAttachmentIndex const NAME = \ + {add_attachment(daxa::TaskImageAttachment{ \ + .name = #NAME, \ + .task_access = daxa::TaskImageAccess::TASK_ACCESS, \ __VA_ARGS__})}; #define DAXA_DECL_TASK_HEAD_END \ @@ -886,7 +897,7 @@ namespace daxa #define DAXA_TH_IMAGE_TYPED(TASK_ACCESS, VIEW_TYPE, NAME) _DAXA_HELPER_TH_IMAGE(NAME, TASK_ACCESS, .view_type = VIEW_TYPE::IMAGE_VIEW_TYPE, .shader_array_size = 1, .shader_as_index = VIEW_TYPE::SHADER_INDEX32) #define DAXA_TH_IMAGE_TYPED_ARRAY(TASK_ACCESS, VIEW_TYPE, NAME, SIZE) _DAXA_HELPER_TH_IMAGE(NAME, TASK_ACCESS, .view_type = VIEW_TYPE::IMAGE_VIEW_TYPE, .shader_array_size = SIZE, .shader_as_index = VIEW_TYPE::SHADER_INDEX32) -#define DAXA_TH_IMAGE_TYPED_MIP_ARRAY(TASK_ACCESS, VIEW_TYPE, NAME, SIZE) _DAXA_HELPER_TH_IMAGE(NAME, TASK_ACCESS, .view_type = VIEW_TYPE::IMAGE_VIEW_TYPE, .shader_array_size = SIZE, .shader_array_type = daxa::TaskHeadImageArrayType::MIP_LEVELS, .shader_as_index = VIEW_TYPE::SHADER_INDEX32) +#define DAXA_TH_IMAGE_TYPED_MIP_ARRAY(TASK_ACCESS, VIEW_TYPE, NAME, SIZE) _DAXA_HELPER_TH_IMAGE(NAME, TASK_ACCESS, .view_type = VIEW_TYPE::IMAGE_VIEW_TYPE, .shader_array_size = SIZE, .shader_as_index = VIEW_TYPE::SHADER_INDEX32, .shader_array_type = daxa::TaskHeadImageArrayType::MIP_LEVELS) #define DAXA_TH_BUFFER(TASK_ACCESS, NAME) _DAXA_HELPER_TH_BUFFER(NAME, TASK_ACCESS, .shader_array_size = 0) #define DAXA_TH_BUFFER_ID(TASK_ACCESS, NAME) _DAXA_HELPER_TH_BUFFER(NAME, TASK_ACCESS, .shader_array_size = 1, .shader_as_address = false) @@ -1131,7 +1142,7 @@ namespace daxa { TaskBufferAttachmentInfo buf = {}; buf.name = "inline attachment"; - buf.access = access; + buf.task_access = access; buf.shader_array_size = 0; buf.shader_as_address = false; buf.view = view; @@ -1145,7 +1156,7 @@ namespace daxa { TaskBlasAttachmentInfo blas = {}; blas.name = "inline attachment"; - blas.access = access; + blas.task_access = access; blas.view = view; TaskAttachmentInfo info = {}; info.type = daxa::TaskAttachmentType::BLAS; @@ -1157,7 +1168,7 @@ namespace daxa { TaskTlasAttachmentInfo tlas = {}; tlas.name = "inline attachment"; - tlas.access = access; + tlas.task_access = access; tlas.view = view; tlas.shader_as_address = false; TaskAttachmentInfo info = {}; @@ -1170,7 +1181,7 @@ namespace daxa { TaskImageAttachmentInfo img = {}; img.name = "inline attachment"; - img.access = access; + img.task_access = access; img.view_type = daxa::ImageViewType::MAX_ENUM; img.shader_array_size = 0; img.view = view; @@ -1184,7 +1195,7 @@ namespace daxa { TaskImageAttachmentInfo img = {}; img.name = "inline attachment"; - img.access = access; + img.task_access = access; img.view_type = view_type; img.shader_array_size = 0; img.view = view; diff --git a/src/cpp_wrapper.cpp b/src/cpp_wrapper.cpp index b08f3aaf..6ff7df90 100644 --- a/src/cpp_wrapper.cpp +++ b/src/cpp_wrapper.cpp @@ -137,7 +137,7 @@ auto daxa_result_to_string(daxa_Result result) -> std::string_view case daxa_Result::DAXA_RESULT_DEVICE_DOES_NOT_SUPPORT_ACCELERATION_STRUCTURE_COUNT: return "DAXA_RESULT_DEVICE_DOES_NOT_SUPPORT_ACCELERATION_STRUCTURE_COUNT"; case daxa_Result::DAXA_RESULT_ERROR_NO_SUITABLE_DEVICE_FOUND: return "DAXA_RESULT_ERROR_NO_SUITABLE_DEVICE_FOUND"; case daxa_Result::DAXA_RESULT_MAX_ENUM: return "DAXA_RESULT_MAX_ENUM"; - default: return "UNIMPLEMENTED"; + default: return "UNIMPLEMENTED CASE"; } }; @@ -179,7 +179,6 @@ namespace daxa return ret; } -#if !DAXA_REMOVE_DEPRECATED auto Instance::create_device(DeviceInfo const & info) -> Device { Device ret = {}; @@ -190,7 +189,6 @@ namespace daxa "failed to create device"); return ret; } -#endif auto Instance::create_device_2(DeviceInfo2 const & info) -> Device { @@ -243,12 +241,10 @@ namespace daxa /// --- Begin Device --- -#if !DAXA_REMOVE_DEPRECATED auto default_device_score(DeviceProperties const & device_props) -> i32 { return daxa_default_device_score(r_cast(&device_props)); } -#endif auto Device::create_memory(MemoryBlockInfo const & info) -> MemoryBlock { @@ -1253,8 +1249,8 @@ namespace daxa case ImageLayout::TRANSFER_DST_OPTIMAL: return "TRANSFER_DST_OPTIMAL"; case ImageLayout::READ_ONLY_OPTIMAL: return "READ_ONLY_OPTIMAL"; case ImageLayout::ATTACHMENT_OPTIMAL: return "ATTACHMENT_OPTIMAL"; - case ImageLayout::PRESENT_SRC: return "PRESENT_SRC"; - default: DAXA_DBG_ASSERT_TRUE_M(false, "invalid ImageLayout"); + case ImageLayout::PRESENT_SRC: return "PRESENT_SRC"; + default: return "UNIMPLEMENTED CASE"; } return "invalid ImageLayout"; } @@ -1602,7 +1598,7 @@ namespace daxa case Format::PVRTC1_4BPP_SRGB_BLOCK_IMG: return "PVRTC1_4BPP_SRGB_BLOCK_IMG"; case Format::PVRTC2_2BPP_SRGB_BLOCK_IMG: return "PVRTC2_2BPP_SRGB_BLOCK_IMG"; case Format::PVRTC2_4BPP_SRGB_BLOCK_IMG: return "PVRTC2_4BPP_SRGB_BLOCK_IMG"; - default: return "unknown"; + default: return "UNIMPLEMENTED CASE"; } } diff --git a/src/impl_command_recorder.cpp b/src/impl_command_recorder.cpp index 1fdd7417..730a79ae 100644 --- a/src/impl_command_recorder.cpp +++ b/src/impl_command_recorder.cpp @@ -5,7 +5,6 @@ #include "impl_sync.hpp" #include "impl_device.hpp" -#include "impl_core.hpp" /// --- Begin Helpers --- @@ -249,7 +248,7 @@ auto daxa_cmd_set_rasterization_samples(daxa_CommandRecorder self, VkSampleCount { if (self->device->vkCmdSetRasterizationSamplesEXT == nullptr) { - return DAXA_RESULT_ERROR_EXTENSION_NOT_PRESENT; + _DAXA_RETURN_IF_ERROR(DAXA_RESULT_ERROR_EXTENSION_NOT_PRESENT, DAXA_RESULT_ERROR_EXTENSION_NOT_PRESENT); } daxa_cmd_flush_barriers(self); self->device->vkCmdSetRasterizationSamplesEXT(self->current_command_data.vk_cmd_buffer, samples); @@ -268,7 +267,7 @@ auto daxa_cmd_copy_buffer_to_buffer(daxa_CommandRecorder self, daxa_BufferCopyIn in_bounds = in_bounds && ((static_cast(vk_buffer_copy->dstOffset) + static_cast(vk_buffer_copy->size)) <= static_cast(dst_slot.info.size)); if (!in_bounds) { - return DAXA_RESULT_ERROR_COPY_OUT_OF_BOUNDS; + _DAXA_RETURN_IF_ERROR(DAXA_RESULT_ERROR_COPY_OUT_OF_BOUNDS, DAXA_RESULT_ERROR_COPY_OUT_OF_BOUNDS); } vkCmdCopyBuffer( self->current_command_data.vk_cmd_buffer, @@ -446,6 +445,12 @@ auto daxa_cmd_clear_buffer(daxa_CommandRecorder self, daxa_BufferClearInfo const { daxa_cmd_flush_barriers(self); DAXA_CHECK_AND_REMEMBER_IDS(self, info->buffer) + ImplBufferSlot const & dst_slot = self->device->slot(info->buffer); + bool const in_bounds = ((static_cast(info->offset) + static_cast(info->size)) <= static_cast(dst_slot.info.size)); + if (!in_bounds) + { + _DAXA_RETURN_IF_ERROR(DAXA_RESULT_ERROR_COPY_OUT_OF_BOUNDS, DAXA_RESULT_ERROR_COPY_OUT_OF_BOUNDS); + } vkCmdFillBuffer( self->current_command_data.vk_cmd_buffer, self->device->slot(info->buffer).vk_buffer, @@ -468,7 +473,7 @@ auto daxa_cmd_clear_image(daxa_CommandRecorder self, daxa_ImageClearInfo const * { if (!is_image_depth_stencil) { - return DAXA_RESULT_INVALID_CLEAR_VALUE; + _DAXA_RETURN_IF_ERROR(DAXA_RESULT_INVALID_CLEAR_VALUE, DAXA_RESULT_INVALID_CLEAR_VALUE); } VkImageSubresourceRange const sub_range = make_subresource_range(info->dst_slice, img_slot.aspect_flags); vkCmdClearDepthStencilImage( @@ -483,7 +488,7 @@ auto daxa_cmd_clear_image(daxa_CommandRecorder self, daxa_ImageClearInfo const * { if (is_image_depth_stencil) { - return DAXA_RESULT_INVALID_CLEAR_VALUE; + _DAXA_RETURN_IF_ERROR(DAXA_RESULT_INVALID_CLEAR_VALUE, DAXA_RESULT_INVALID_CLEAR_VALUE); } VkImageSubresourceRange const sub_range = make_subresource_range(info->dst_slice, img_slot.aspect_flags); vkCmdClearColorImage( @@ -635,7 +640,7 @@ auto daxa_cmd_push_constant(daxa_CommandRecorder self, daxa_PushConstantInfo con daxa_cmd_flush_barriers(self); if (daxa::holds_alternative(self->current_pipeline)) { - return DAXA_RESULT_NO_PIPELINE_BOUND; + _DAXA_RETURN_IF_ERROR(DAXA_RESULT_NO_PIPELINE_BOUND, DAXA_RESULT_NO_PIPELINE_BOUND); } VkPipelineLayout vk_pipeline_layout = {}; u32 current_pipeline_push_constant_size = {}; @@ -654,11 +659,15 @@ auto daxa_cmd_push_constant(daxa_CommandRecorder self, daxa_PushConstantInfo con current_pipeline_push_constant_size = (**pipeline).info.push_constant_size; vk_pipeline_layout = (**pipeline).vk_pipeline_layout; } - if (current_pipeline_push_constant_size < (info->offset + info->size)) + if (current_pipeline_push_constant_size < info->size) { - return DAXA_RESULT_PUSHCONSTANT_RANGE_EXCEEDED; + _DAXA_RETURN_IF_ERROR(DAXA_RESULT_PUSHCONSTANT_RANGE_EXCEEDED, DAXA_RESULT_PUSHCONSTANT_RANGE_EXCEEDED); } - vkCmdPushConstants(self->current_command_data.vk_cmd_buffer, vk_pipeline_layout, VK_SHADER_STAGE_ALL, info->offset, static_cast(info->size), info->data); + // Always write the whole range, fill with 0xFF to the size of the push constant. + // This makes validation and renderdoc happy as well as help debug uninitialized push constant data + std::array const_data = { std::byte{ 0xFF } }; + std::memcpy(const_data.data(), info->data, info->size); + vkCmdPushConstants(self->current_command_data.vk_cmd_buffer, vk_pipeline_layout, VK_SHADER_STAGE_ALL, 0, current_pipeline_push_constant_size, const_data.data()); return DAXA_RESULT_SUCCESS; } @@ -691,7 +700,7 @@ auto daxa_cmd_trace_rays(daxa_CommandRecorder self, daxa_TraceRaysInfo const * i // TODO: Check if those offsets are in range? if (!daxa::holds_alternative(self->current_pipeline)) { - return DAXA_RESULT_NO_RAYTRACING_PIPELINE_BOUND; + _DAXA_RETURN_IF_ERROR(DAXA_RESULT_NO_RAYTRACING_PIPELINE_BOUND, DAXA_RESULT_NO_RAYTRACING_PIPELINE_BOUND); } auto const & binding_table = info->shader_binding_table; auto raygen_handle = binding_table.raygen_region; @@ -717,7 +726,7 @@ auto daxa_cmd_trace_rays_indirect(daxa_CommandRecorder self, daxa_TraceRaysIndir // TODO: Check if those offsets are in range? if (!daxa::holds_alternative(self->current_pipeline)) { - return DAXA_RESULT_NO_RAYTRACING_PIPELINE_BOUND; + _DAXA_RETURN_IF_ERROR(DAXA_RESULT_NO_RAYTRACING_PIPELINE_BOUND, DAXA_RESULT_NO_RAYTRACING_PIPELINE_BOUND); } auto const & binding_table = info->shader_binding_table; auto raygen_handle = binding_table.raygen_region; @@ -743,7 +752,7 @@ auto daxa_cmd_dispatch(daxa_CommandRecorder self, daxa_DispatchInfo const * info // TODO: Check if those offsets are in range? if (!daxa::holds_alternative(self->current_pipeline)) { - return DAXA_RESULT_NO_COMPUTE_PIPELINE_BOUND; + _DAXA_RETURN_IF_ERROR(DAXA_RESULT_NO_COMPUTE_PIPELINE_BOUND, DAXA_RESULT_NO_COMPUTE_PIPELINE_BOUND); } vkCmdDispatch(self->current_command_data.vk_cmd_buffer, info->x, info->y, info->z); return DAXA_RESULT_SUCCESS; @@ -754,7 +763,7 @@ auto daxa_cmd_dispatch_indirect(daxa_CommandRecorder self, daxa_DispatchIndirect DAXA_CHECK_AND_REMEMBER_IDS(self, info->indirect_buffer) if (!daxa::holds_alternative(self->current_pipeline)) { - return DAXA_RESULT_NO_COMPUTE_PIPELINE_BOUND; + _DAXA_RETURN_IF_ERROR(DAXA_RESULT_NO_COMPUTE_PIPELINE_BOUND, DAXA_RESULT_NO_COMPUTE_PIPELINE_BOUND); } vkCmdDispatchIndirect(self->current_command_data.vk_cmd_buffer, self->device->slot(info->indirect_buffer).vk_buffer, info->offset); return DAXA_RESULT_SUCCESS; @@ -819,11 +828,11 @@ auto daxa_cmd_begin_renderpass(daxa_CommandRecorder self, daxa_RenderPassBeginIn { if (daxa_dvc_is_image_view_valid(self->device, info->color_attachments.data[i].image_view) == 0) { - return DAXA_RESULT_INVALID_IMAGE_VIEW_ID; + _DAXA_RETURN_IF_ERROR(DAXA_RESULT_INVALID_IMAGE_VIEW_ID, DAXA_RESULT_INVALID_IMAGE_VIEW_ID); } if (daxa_dvc_is_image_valid(self->device, self->device->slot(info->color_attachments.data[i].image_view).info.image) == 0) { - return DAXA_RESULT_INVALID_IMAGE_ID; + _DAXA_RETURN_IF_ERROR(DAXA_RESULT_INVALID_IMAGE_ID, DAXA_RESULT_INVALID_IMAGE_ID); } fill_rendering_attachment_info(info->color_attachments.data[i], vk_color_attachments.at(i)); } @@ -832,11 +841,11 @@ auto daxa_cmd_begin_renderpass(daxa_CommandRecorder self, daxa_RenderPassBeginIn { if (daxa_dvc_is_image_view_valid(self->device, info->depth_attachment.value.image_view) == 0) { - return DAXA_RESULT_INVALID_IMAGE_VIEW_ID; + _DAXA_RETURN_IF_ERROR(DAXA_RESULT_INVALID_IMAGE_VIEW_ID, DAXA_RESULT_INVALID_IMAGE_VIEW_ID); } if (daxa_dvc_is_image_valid(self->device, self->device->slot(info->depth_attachment.value.image_view).info.image) == 0) { - return DAXA_RESULT_INVALID_IMAGE_ID; + _DAXA_RETURN_IF_ERROR(DAXA_RESULT_INVALID_IMAGE_ID, DAXA_RESULT_INVALID_IMAGE_ID); } fill_rendering_attachment_info(info->depth_attachment.value, depth_attachment_info); }; @@ -845,11 +854,11 @@ auto daxa_cmd_begin_renderpass(daxa_CommandRecorder self, daxa_RenderPassBeginIn { if (daxa_dvc_is_image_view_valid(self->device, info->stencil_attachment.value.image_view) == 0) { - return DAXA_RESULT_INVALID_IMAGE_VIEW_ID; + _DAXA_RETURN_IF_ERROR(DAXA_RESULT_INVALID_IMAGE_VIEW_ID, DAXA_RESULT_INVALID_IMAGE_VIEW_ID); } if (daxa_dvc_is_image_valid(self->device, self->device->slot(info->stencil_attachment.value.image_view).info.image) == 0) { - return DAXA_RESULT_INVALID_IMAGE_ID; + _DAXA_RETURN_IF_ERROR(DAXA_RESULT_INVALID_IMAGE_ID, DAXA_RESULT_INVALID_IMAGE_ID); } fill_rendering_attachment_info(info->stencil_attachment.value, stencil_attachment_info); }; diff --git a/src/impl_core.hpp b/src/impl_core.hpp index ed097dbc..eebbbe20 100644 --- a/src/impl_core.hpp +++ b/src/impl_core.hpp @@ -44,6 +44,8 @@ #endif // INCLUDE ORDER MUST STAY LIKE THIS: +// ensure we always compile in the deprecated functions to avoid link issues +#define DAXA_REMOVE_DEPRECATED 0 #include #include #include @@ -65,9 +67,6 @@ auto r_cast(FROM_T * ptr) return reinterpret_cast(ptr); } -static inline constexpr u32 MAX_PUSH_CONSTANT_WORD_SIZE = {32}; -static inline constexpr u32 MAX_PUSH_CONSTANT_BYTE_SIZE = {MAX_PUSH_CONSTANT_WORD_SIZE * 4}; -static inline constexpr u32 PIPELINE_LAYOUT_COUNT = {MAX_PUSH_CONSTANT_WORD_SIZE + 1}; // TODO: WTF IS THIS?! static inline constexpr char const * MAX_PUSH_CONSTANT_SIZE_ERROR = {"push constant size is limited to 128 bytes/ 32 device words"}; static inline constexpr u32 GPU_TABLE_SET_BINDING = 0; diff --git a/src/impl_device.cpp b/src/impl_device.cpp index 4ec7282b..8d48f42d 100644 --- a/src/impl_device.cpp +++ b/src/impl_device.cpp @@ -70,7 +70,7 @@ namespace } } // namespace -auto daxa_ImplDevice::ImplQueue::initialize(VkDevice vk_device, u32 queue_family_index, u32 queue_index) -> daxa_Result +auto daxa_ImplDevice::ImplQueue::initialize(VkDevice vk_device) -> daxa_Result { VkSemaphoreTypeCreateInfo timeline_ci{ .sType = VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO, @@ -85,8 +85,7 @@ auto daxa_ImplDevice::ImplQueue::initialize(VkDevice vk_device, u32 queue_family .flags = {}, }; - this->vk_queue_family_index = queue_family_index; - vkGetDeviceQueue(vk_device, queue_family_index, queue_index, &this->vk_queue); + vkGetDeviceQueue(vk_device, vk_queue_family_index, queue_index, &this->vk_queue); daxa_Result result = DAXA_RESULT_SUCCESS; if (this->vk_queue == VK_NULL_HANDLE) { @@ -304,9 +303,19 @@ auto create_image_helper(daxa_Device self, daxa_ImageInfo const * info, daxa_Ima } }; + VkImageViewType vk_image_view_type = {}; + if (info->array_layer_count > 1) + { + vk_image_view_type = static_cast(info->dimensions + 3); + } + else + { + vk_image_view_type = static_cast(info->dimensions - 1); + } + ret.info = *info; ret.view_slot.info = std::bit_cast(ImageViewInfo{ - .type = static_cast(info->dimensions - 1), + .type = static_cast(vk_image_view_type), .format = std::bit_cast(ret.info.format), .image = {id}, .slice = ImageMipArraySlice{ @@ -318,16 +327,6 @@ auto create_image_helper(daxa_Device self, daxa_ImageInfo const * info, daxa_Ima .name = info->name.data, }); - VkImageViewType vk_image_view_type = {}; - if (info->array_layer_count > 1) - { - vk_image_view_type = static_cast(info->dimensions + 3); - } - else - { - vk_image_view_type = static_cast(info->dimensions - 1); - } - ret.aspect_flags = infer_aspect_from_format(info->format); VkImageViewCreateInfo vk_image_view_create_info{ .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, @@ -766,9 +765,6 @@ auto daxa_dvc_create_blas_from_buffer(daxa_Device self, daxa_BufferBlasInfo cons auto daxa_dvc_create_image_view(daxa_Device self, daxa_ImageViewInfo const * info, daxa_ImageViewId * out_id) -> daxa_Result { daxa_Result result = DAXA_RESULT_SUCCESS; - /// --- Begin Validation --- - - /// --- End Validation --- auto slot_opt = self->gpu_sro_table.image_slots.try_create_slot(); if (!slot_opt.has_value()) @@ -789,6 +785,25 @@ auto daxa_dvc_create_image_view(daxa_Device self, daxa_ImageViewInfo const * inf }; ImplImageSlot const & parent_image_slot = self->slot(info->image); + + /// --- Begin Validation --- + + if (info->slice.layer_count > 1) + { + bool const array_type = info->type == + VK_IMAGE_VIEW_TYPE_1D_ARRAY || + info->type == VK_IMAGE_VIEW_TYPE_2D_ARRAY || + info->type == VK_IMAGE_VIEW_TYPE_CUBE || + info->type == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY; + if (!array_type) + { + result = DAXA_RESULT_INVALID_IMAGE_VIEW_INFO; + } + } + _DAXA_RETURN_IF_ERROR(result,result); + + /// --- End Validation --- + image_slot = {}; auto & ret = image_slot.view_slot; ret.info = *info; @@ -1398,7 +1413,7 @@ auto daxa_ImplDevice::create_2(daxa_Instance instance, daxa_DeviceInfo2 const & } _DAXA_RETURN_IF_ERROR(result, result) - if (physical_device.features.physical_device_acceleration_structure_features_khr.accelerationStructure) + if ((properties.implicit_features & DAXA_IMPLICIT_FEATURE_FLAG_BASIC_RAY_TRACING) != 0) { if (self->info.max_allowed_acceleration_structures > self->properties.acceleration_structure_properties.value.max_descriptor_set_update_after_bind_acceleration_structures || self->info.max_allowed_acceleration_structures == 0) @@ -1523,7 +1538,8 @@ auto daxa_ImplDevice::create_2(daxa_Instance instance, daxa_DeviceInfo2 const & continue; } auto const vk_queue_family = self->queue_families[self->queues[i].family].vk_index; - result = self->queues[i].initialize(self->vk_device, vk_queue_family, self->queues[i].queue_index); + self->queues[i].vk_queue_family_index = vk_queue_family; + result = self->queues[i].initialize(self->vk_device); _DAXA_RETURN_IF_ERROR(result, result) } diff --git a/src/impl_device.hpp b/src/impl_device.hpp index 68d38176..4c8405de 100644 --- a/src/impl_device.hpp +++ b/src/impl_device.hpp @@ -119,22 +119,22 @@ struct daxa_ImplDevice final : public ImplHandle // atomically synchronized: std::atomic_uint64_t latest_pending_submit_timeline_value = {}; - auto initialize(VkDevice vk_device, u32 queue_family_index, u32 queue_index) -> daxa_Result; + auto initialize(VkDevice vk_device) -> daxa_Result; void cleanup(VkDevice device); auto get_oldest_pending_submit(VkDevice vk_device, std::optional & out) -> daxa_Result; }; std::array queues = { - ImplQueue{DAXA_QUEUE_FAMILY_MAIN, 0}, - ImplQueue{DAXA_QUEUE_FAMILY_COMPUTE, 0}, - ImplQueue{DAXA_QUEUE_FAMILY_COMPUTE, 1}, - ImplQueue{DAXA_QUEUE_FAMILY_COMPUTE, 2}, - ImplQueue{DAXA_QUEUE_FAMILY_COMPUTE, 3}, - ImplQueue{DAXA_QUEUE_FAMILY_COMPUTE, 4}, - ImplQueue{DAXA_QUEUE_FAMILY_COMPUTE, 5}, - ImplQueue{DAXA_QUEUE_FAMILY_COMPUTE, 6}, - ImplQueue{DAXA_QUEUE_FAMILY_COMPUTE, 7}, - ImplQueue{DAXA_QUEUE_FAMILY_TRANSFER, 0}, - ImplQueue{DAXA_QUEUE_FAMILY_TRANSFER, 1}, + ImplQueue{.family = DAXA_QUEUE_FAMILY_MAIN, .queue_index = 0}, + ImplQueue{.family = DAXA_QUEUE_FAMILY_COMPUTE, .queue_index = 0}, + ImplQueue{.family = DAXA_QUEUE_FAMILY_COMPUTE, .queue_index = 1}, + ImplQueue{.family = DAXA_QUEUE_FAMILY_COMPUTE, .queue_index = 2}, + ImplQueue{.family = DAXA_QUEUE_FAMILY_COMPUTE, .queue_index = 3}, + ImplQueue{.family = DAXA_QUEUE_FAMILY_COMPUTE, .queue_index = 4}, + ImplQueue{.family = DAXA_QUEUE_FAMILY_COMPUTE, .queue_index = 5}, + ImplQueue{.family = DAXA_QUEUE_FAMILY_COMPUTE, .queue_index = 6}, + ImplQueue{.family = DAXA_QUEUE_FAMILY_COMPUTE, .queue_index = 7}, + ImplQueue{.family = DAXA_QUEUE_FAMILY_TRANSFER, .queue_index = 0}, + ImplQueue{.family = DAXA_QUEUE_FAMILY_TRANSFER, .queue_index = 1}, }; auto get_queue(daxa_Queue queue) -> ImplQueue &; diff --git a/src/impl_features.hpp b/src/impl_features.hpp index 4ea33eb6..fb3346aa 100644 --- a/src/impl_features.hpp +++ b/src/impl_features.hpp @@ -1,9 +1,9 @@ #pragma once +#include "impl_core.hpp" #include #include -#include "impl_core.hpp" #include diff --git a/src/impl_gpu_resources.cpp b/src/impl_gpu_resources.cpp index b4c7e823..dea3de67 100644 --- a/src/impl_gpu_resources.cpp +++ b/src/impl_gpu_resources.cpp @@ -279,7 +279,7 @@ namespace daxa vkSetDebugUtilsObjectNameEXT(device, &name_info); } - for (usize i = 1; i < PIPELINE_LAYOUT_COUNT; ++i) + for (usize i = 1; i < DAXA_PIPELINE_LAYOUT_COUNT; ++i) { VkPushConstantRange const vk_push_constant_range{ .stageFlags = VK_SHADER_STAGE_ALL, @@ -366,7 +366,7 @@ namespace daxa DAXA_DBG_ASSERT_TRUE_M(buffer_slots.free_index_stack.size() == buffer_slots.next_index, print_remaining("Detected leaked buffers; not all buffers have been destroyed before destroying the device;", buffer_slots.pages)); DAXA_DBG_ASSERT_TRUE_M(image_slots.free_index_stack.size() == image_slots.next_index, print_remaining("Detected leaked images; not all images have been destroyed before destroying the device;", image_slots.pages)); DAXA_DBG_ASSERT_TRUE_M(sampler_slots.free_index_stack.size() == sampler_slots.next_index, print_remaining("Detected leaked samplers; not all samplers have been destroyed before destroying the device;", sampler_slots.pages)); - for (usize i = 0; i < PIPELINE_LAYOUT_COUNT; ++i) + for (usize i = 0; i < DAXA_PIPELINE_LAYOUT_COUNT; ++i) { vkDestroyPipelineLayout(device, pipeline_layouts.at(i), nullptr); } diff --git a/src/impl_gpu_resources.hpp b/src/impl_gpu_resources.hpp index 7ab74020..d3f1427c 100644 --- a/src/impl_gpu_resources.hpp +++ b/src/impl_gpu_resources.hpp @@ -243,8 +243,8 @@ namespace daxa VkDescriptorPool vk_descriptor_pool = {}; // Contains pipeline layouts with varying push constant range size. - // The first size is 0 word, second is 1 word, all others are a power of two (maximum is MAX_PUSH_CONSTANT_BYTE_SIZE). - std::array pipeline_layouts = {}; + // The first size is 0 word, second is 1 word, all others are a power of two (maximum is DAXA_MAX_PUSH_CONSTANT_BYTE_SIZE). + std::array pipeline_layouts = {}; auto initialize( u32 max_buffers, diff --git a/src/impl_instance.cpp b/src/impl_instance.cpp index 0ebf81de..c05cd6fa 100644 --- a/src/impl_instance.cpp +++ b/src/impl_instance.cpp @@ -126,7 +126,7 @@ auto daxa_instance_create_device(daxa_Instance self, daxa_DeviceInfo const * leg daxa_DeviceInfo2 info = {}; if (legacy_info->flags & DAXA_DEVICE_FLAG_BUFFER_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT) { - info.explicit_features = DAXA_EXPLICIT_FEATURE_FLAG_ACCELERATION_STRUCTURE_CAPTURE_REPLAY; + info.explicit_features = DAXA_EXPLICIT_FEATURE_FLAG_BUFFER_DEVICE_ADDRESS_CAPTURE_REPLAY; } if (legacy_info->flags & DAXA_DEVICE_FLAG_VK_MEMORY_MODEL) { diff --git a/src/impl_pipeline.hpp b/src/impl_pipeline.hpp index fae3a6e7..d77783e6 100644 --- a/src/impl_pipeline.hpp +++ b/src/impl_pipeline.hpp @@ -1,8 +1,7 @@ #pragma once -#include - #include "impl_core.hpp" +#include using namespace daxa; diff --git a/src/impl_swapchain.cpp b/src/impl_swapchain.cpp index 30420200..9dca66fb 100644 --- a/src/impl_swapchain.cpp +++ b/src/impl_swapchain.cpp @@ -362,7 +362,7 @@ auto daxa_ImplSwapchain::recreate() -> daxa_Result .name = this->info_name.c_str(), }; ImageId id = {}; - auto result = this->device->new_swapchain_image(swapchain_images[i], vk_surface_format.format, i, usage, image_info, &id); + result = this->device->new_swapchain_image(swapchain_images[i], vk_surface_format.format, i, usage, image_info, &id); _DAXA_RETURN_IF_ERROR(result, result) this->images[i] = id; diff --git a/src/impl_timeline_query.hpp b/src/impl_timeline_query.hpp index c931736f..b954ab95 100644 --- a/src/impl_timeline_query.hpp +++ b/src/impl_timeline_query.hpp @@ -2,9 +2,9 @@ #include +#include "impl_core.hpp" #include -#include "impl_core.hpp" namespace daxa { diff --git a/src/utils/impl_fsr2.hpp b/src/utils/impl_fsr2.hpp index 1c9f8a96..b7a5e5c9 100644 --- a/src/utils/impl_fsr2.hpp +++ b/src/utils/impl_fsr2.hpp @@ -1,8 +1,8 @@ #pragma once +#include "../impl_core.hpp" #include -#include "../impl_core.hpp" #include "../impl_device.hpp" #include diff --git a/src/utils/impl_imgui.cpp b/src/utils/impl_imgui.cpp index 4df301dc..0c992a39 100644 --- a/src/utils/impl_imgui.cpp +++ b/src/utils/impl_imgui.cpp @@ -536,29 +536,16 @@ auto main() -> int DAXA_SHADER_INCLUDE_DIR, "tests/0_common/shaders", }, + .write_out_shader_binary = "./", .language = daxa::ShaderLanguage::GLSL, + .enable_debug_info = false, }, .name = "pipeline_manager", }); - // std::shared_ptr imgui_pipeline = daxa::RasterPipelineCompileInfo compile_info{ - .vertex_shader_info = daxa::ShaderCompileInfo{ - .source = daxa::ShaderFile{"src/utils/impl_imgui.cpp"}, - .compile_options = { - .write_out_shader_binary = "./", - .language = daxa::ShaderLanguage::GLSL, - .enable_debug_info = false, - }, - }, - .fragment_shader_info = daxa::ShaderCompileInfo{ - .source = daxa::ShaderFile{"src/utils/impl_imgui.cpp"}, - .compile_options = daxa::ShaderCompileOptions{ - .write_out_shader_binary = "./", - .language = daxa::ShaderLanguage::GLSL, - .enable_debug_info = false, - }, - }, + .vertex_shader_info = daxa::ShaderCompileInfo{.source = daxa::ShaderFile{"src/utils/impl_imgui.cpp"}}, + .fragment_shader_info = daxa::ShaderCompileInfo{.source = daxa::ShaderFile{"src/utils/impl_imgui.cpp"}}, .color_attachments = {{.format = daxa::Format::R16G16B16A16_SFLOAT}}, .raster = {}, .push_constant_size = sizeof(Push), @@ -568,19 +555,19 @@ auto main() -> int auto result = pipeline_manager.add_raster_pipeline(compile_info); std::cout << result.to_string(); - auto vert_file = std::ifstream{"./imgui_pipeline.vert.spv", std::ios::binary}; - auto vert_size = std::filesystem::file_size("./imgui_pipeline.vert.spv"); + auto vert_file = std::ifstream{"./imgui_pipeline.vert.main.spv", std::ios::binary}; + auto vert_size = std::filesystem::file_size("./imgui_pipeline.vert.main.spv"); auto vert_bytes = std::vector(vert_size / sizeof(uint32_t)); vert_file.read(reinterpret_cast(vert_bytes.data()), static_cast(vert_size)); vert_file.close(); std::filesystem::remove("./imgui_pipeline.vert.spv"); - auto frag_file = std::ifstream{"./imgui_pipeline.frag.spv", std::ios::binary}; - auto frag_size = std::filesystem::file_size("./imgui_pipeline.frag.spv"); + auto frag_file = std::ifstream{"./imgui_pipeline.frag.main.spv", std::ios::binary}; + auto frag_size = std::filesystem::file_size("./imgui_pipeline.frag.main.spv"); auto frag_bytes = std::vector(frag_size / sizeof(uint32_t)); frag_file.read(reinterpret_cast(frag_bytes.data()), static_cast(frag_size)); frag_file.close(); - std::filesystem::remove("./imgui_pipeline.frag.spv"); + std::filesystem::remove("./imgui_pipeline.frag.main.spv"); // WITH GAMMA CORRECTION compile_info.fragment_shader_info.value().compile_options.defines = {{"GAMMA_CORRECTION", "TRUE"}}; @@ -588,13 +575,13 @@ auto main() -> int std::cout << result.to_string(); // vert is unchanged - std::filesystem::remove("./imgui_pipeline.vert.spv"); - auto gamma_frag_file = std::ifstream{"./imgui_pipeline.frag.spv", std::ios::binary}; - auto gamma_frag_size = std::filesystem::file_size("./imgui_pipeline.frag.spv"); + std::filesystem::remove("./imgui_pipeline.vert.main.spv"); + auto gamma_frag_file = std::ifstream{"./imgui_pipeline.frag.main.spv", std::ios::binary}; + auto gamma_frag_size = std::filesystem::file_size("./imgui_pipeline.frag.main.spv"); auto gamma_frag_bytes = std::vector(gamma_frag_size / sizeof(uint32_t)); gamma_frag_file.read(reinterpret_cast(gamma_frag_bytes.data()), static_cast(gamma_frag_size)); gamma_frag_file.close(); - std::filesystem::remove("./imgui_pipeline.frag.spv"); + std::filesystem::remove("./imgui_pipeline.frag.main.spv"); auto out_file = std::ofstream{"./src/utils/impl_imgui_spv.hpp", std::ofstream::trunc}; out_file << "#pragma once\n#include \n\n"; diff --git a/src/utils/impl_imgui_spv.hpp b/src/utils/impl_imgui_spv.hpp index e533c8ad..097b7726 100644 --- a/src/utils/impl_imgui_spv.hpp +++ b/src/utils/impl_imgui_spv.hpp @@ -1,19 +1,21 @@ #pragma once #include -static constexpr auto imgui_vert_spv = std::array{ +static constexpr auto imgui_vert_spv = std::array{ // clang-format off - 0x07230203, 0x00010500, 0x0008000b, 0x0000012d, 0x00000000, 0x00020011, 0x00000001, 0x00020011, - 0x0000000b, 0x00020011, 0x00000022, 0x00020011, 0x0000002b, 0x00020011, 0x0000002c, 0x00020011, - 0x0000002d, 0x00020011, 0x000014e3, 0x0006000b, 0x00000001, 0x4c534c47, 0x6474732e, 0x3035342e, - 0x00000000, 0x0003000e, 0x000014e4, 0x00000001, 0x0038000f, 0x00000000, 0x00000004, 0x6e69616d, - 0x00000000, 0x00000017, 0x00000020, 0x0000003d, 0x0000006b, 0x0000007d, 0x00000081, 0x00000082, - 0x00000083, 0x00000084, 0x00000088, 0x0000008c, 0x00000090, 0x00000094, 0x00000098, 0x0000009c, - 0x000000a0, 0x000000a4, 0x000000a8, 0x000000ac, 0x000000b0, 0x000000b4, 0x000000b8, 0x000000bc, - 0x000000c0, 0x000000c4, 0x000000c8, 0x000000cc, 0x000000d0, 0x000000d4, 0x000000d8, 0x000000dc, - 0x000000e0, 0x000000e4, 0x000000e8, 0x000000ec, 0x000000f0, 0x000000f4, 0x000000f8, 0x000000fc, - 0x00000100, 0x00000104, 0x00000108, 0x0000010c, 0x00000110, 0x00000114, 0x00000118, 0x0000011c, - 0x00000120, 0x00000124, 0x00000128, 0x0000012c, 0x00030003, 0x00000002, 0x000001cc, 0x00070004, + 0x07230203, 0x00010500, 0x0008000b, 0x0000015d, 0x00000000, 0x00020011, 0x00000001, 0x00020011, + 0x0000000b, 0x00020011, 0x0000001b, 0x00020011, 0x00000022, 0x00020011, 0x0000002b, 0x00020011, + 0x0000002c, 0x00020011, 0x0000002d, 0x00020011, 0x00000030, 0x00020011, 0x000014e3, 0x0006000b, + 0x00000001, 0x4c534c47, 0x6474732e, 0x3035342e, 0x00000000, 0x0003000e, 0x000014e4, 0x00000001, + 0x0044000f, 0x00000000, 0x00000004, 0x6e69616d, 0x00000000, 0x00000017, 0x00000020, 0x0000003d, + 0x0000006b, 0x0000007d, 0x00000081, 0x00000082, 0x00000083, 0x00000084, 0x00000088, 0x0000008c, + 0x00000090, 0x00000094, 0x00000098, 0x0000009c, 0x000000a0, 0x000000a4, 0x000000a8, 0x000000ac, + 0x000000b0, 0x000000b4, 0x000000b8, 0x000000bc, 0x000000c0, 0x000000c4, 0x000000c8, 0x000000cc, + 0x000000d0, 0x000000d4, 0x000000d8, 0x000000dc, 0x000000e0, 0x000000e4, 0x000000e8, 0x000000ec, + 0x000000f0, 0x000000f4, 0x000000f8, 0x000000fc, 0x00000100, 0x00000104, 0x00000108, 0x0000010c, + 0x00000110, 0x00000114, 0x00000118, 0x0000011c, 0x00000120, 0x00000124, 0x00000128, 0x0000012c, + 0x00000130, 0x00000134, 0x00000138, 0x0000013c, 0x00000140, 0x00000144, 0x00000148, 0x0000014c, + 0x00000150, 0x00000154, 0x00000158, 0x0000015c, 0x00030003, 0x00000002, 0x000001cc, 0x00070004, 0x455f4c47, 0x625f5458, 0x65666675, 0x65725f72, 0x65726566, 0x0065636e, 0x00080004, 0x455f4c47, 0x625f5458, 0x65666675, 0x65725f72, 0x65726566, 0x3265636e, 0x00000000, 0x00090004, 0x455f4c47, 0x635f5458, 0x72746e6f, 0x665f6c6f, 0x5f776f6c, 0x72747461, 0x74756269, 0x00007365, 0x00080004, @@ -113,274 +115,332 @@ static constexpr auto imgui_vert_spv = std::array{ 0x00656c62, 0x00090005, 0x00000124, 0x61786164, 0x7865745f, 0x65727574, 0x72414432, 0x54796172, 0x656c6261, 0x00000000, 0x00090005, 0x00000128, 0x61786164, 0x6574695f, 0x72757478, 0x41443265, 0x79617272, 0x6c626154, 0x00000065, 0x00090005, 0x0000012c, 0x61786164, 0x6574755f, 0x72757478, - 0x41443265, 0x79617272, 0x6c626154, 0x00000065, 0x00050048, 0x0000000f, 0x00000000, 0x00000023, - 0x00000000, 0x00050048, 0x00000010, 0x00000000, 0x00000023, 0x00000000, 0x00050048, 0x00000011, - 0x00000000, 0x00000023, 0x00000000, 0x00050048, 0x00000011, 0x00000001, 0x00000023, 0x00000008, - 0x00050048, 0x00000011, 0x00000002, 0x00000023, 0x00000010, 0x00050048, 0x00000011, 0x00000003, - 0x00000023, 0x00000014, 0x00050048, 0x00000011, 0x00000004, 0x00000023, 0x00000018, 0x00050048, - 0x00000011, 0x00000005, 0x00000023, 0x00000020, 0x00050048, 0x00000011, 0x00000006, 0x00000023, - 0x00000028, 0x00050048, 0x00000011, 0x00000007, 0x00000023, 0x00000030, 0x00050048, 0x00000012, - 0x00000000, 0x00000023, 0x00000000, 0x00050048, 0x00000012, 0x00000001, 0x00000023, 0x00000008, - 0x00050048, 0x00000012, 0x00000002, 0x00000023, 0x00000010, 0x00040048, 0x00000013, 0x00000000, - 0x00000018, 0x00050048, 0x00000013, 0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x00000013, - 0x00000002, 0x00040048, 0x00000014, 0x00000000, 0x00000018, 0x00050048, 0x00000014, 0x00000000, - 0x00000023, 0x00000000, 0x00030047, 0x00000014, 0x00000002, 0x00050048, 0x00000015, 0x00000000, - 0x00000023, 0x00000000, 0x00030047, 0x00000015, 0x00000002, 0x00040047, 0x00000020, 0x0000000b, - 0x0000002a, 0x00040047, 0x0000003d, 0x0000001e, 0x00000000, 0x00050048, 0x00000069, 0x00000000, - 0x0000000b, 0x00000000, 0x00050048, 0x00000069, 0x00000001, 0x0000000b, 0x00000001, 0x00050048, - 0x00000069, 0x00000002, 0x0000000b, 0x00000003, 0x00050048, 0x00000069, 0x00000003, 0x0000000b, - 0x00000004, 0x00030047, 0x00000069, 0x00000002, 0x00040047, 0x0000007a, 0x00000006, 0x00000008, - 0x00040048, 0x0000007b, 0x00000000, 0x00000013, 0x00040048, 0x0000007b, 0x00000000, 0x00000018, - 0x00050048, 0x0000007b, 0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000007b, 0x00000002, - 0x00040047, 0x0000007d, 0x00000022, 0x00000000, 0x00040047, 0x0000007d, 0x00000021, 0x00000004, - 0x00040047, 0x00000081, 0x00000022, 0x00000000, 0x00040047, 0x00000081, 0x00000021, 0x00000003, - 0x00040047, 0x00000082, 0x00000022, 0x00000000, 0x00040047, 0x00000082, 0x00000021, 0x00000003, - 0x00040047, 0x00000083, 0x00000022, 0x00000000, 0x00040047, 0x00000083, 0x00000021, 0x00000003, - 0x00040047, 0x00000084, 0x00000022, 0x00000000, 0x00040047, 0x00000084, 0x00000021, 0x00000003, - 0x00040047, 0x00000088, 0x00000022, 0x00000000, 0x00040047, 0x00000088, 0x00000021, 0x00000001, - 0x00040047, 0x0000008c, 0x00000022, 0x00000000, 0x00040047, 0x0000008c, 0x00000021, 0x00000001, - 0x00040047, 0x00000090, 0x00000022, 0x00000000, 0x00040047, 0x00000090, 0x00000021, 0x00000001, - 0x00040047, 0x00000094, 0x00000022, 0x00000000, 0x00040047, 0x00000094, 0x00000021, 0x00000002, - 0x00040047, 0x00000098, 0x00000022, 0x00000000, 0x00040047, 0x00000098, 0x00000021, 0x00000002, - 0x00040047, 0x0000009c, 0x00000022, 0x00000000, 0x00040047, 0x0000009c, 0x00000021, 0x00000002, - 0x00040047, 0x000000a0, 0x00000022, 0x00000000, 0x00040047, 0x000000a0, 0x00000021, 0x00000001, - 0x00040047, 0x000000a4, 0x00000022, 0x00000000, 0x00040047, 0x000000a4, 0x00000021, 0x00000001, - 0x00040047, 0x000000a8, 0x00000022, 0x00000000, 0x00040047, 0x000000a8, 0x00000021, 0x00000001, - 0x00040047, 0x000000ac, 0x00000022, 0x00000000, 0x00040047, 0x000000ac, 0x00000021, 0x00000002, - 0x00040047, 0x000000b0, 0x00000022, 0x00000000, 0x00040047, 0x000000b0, 0x00000021, 0x00000002, - 0x00040047, 0x000000b4, 0x00000022, 0x00000000, 0x00040047, 0x000000b4, 0x00000021, 0x00000002, - 0x00040047, 0x000000b8, 0x00000022, 0x00000000, 0x00040047, 0x000000b8, 0x00000021, 0x00000001, - 0x00040047, 0x000000bc, 0x00000022, 0x00000000, 0x00040047, 0x000000bc, 0x00000021, 0x00000001, - 0x00040047, 0x000000c0, 0x00000022, 0x00000000, 0x00040047, 0x000000c0, 0x00000021, 0x00000001, - 0x00040047, 0x000000c4, 0x00000022, 0x00000000, 0x00040047, 0x000000c4, 0x00000021, 0x00000002, - 0x00040047, 0x000000c8, 0x00000022, 0x00000000, 0x00040047, 0x000000c8, 0x00000021, 0x00000002, - 0x00040047, 0x000000cc, 0x00000022, 0x00000000, 0x00040047, 0x000000cc, 0x00000021, 0x00000002, - 0x00040047, 0x000000d0, 0x00000022, 0x00000000, 0x00040047, 0x000000d0, 0x00000021, 0x00000001, - 0x00040047, 0x000000d4, 0x00000022, 0x00000000, 0x00040047, 0x000000d4, 0x00000021, 0x00000001, - 0x00040047, 0x000000d8, 0x00000022, 0x00000000, 0x00040047, 0x000000d8, 0x00000021, 0x00000001, - 0x00040047, 0x000000dc, 0x00000022, 0x00000000, 0x00040047, 0x000000dc, 0x00000021, 0x00000002, - 0x00040047, 0x000000e0, 0x00000022, 0x00000000, 0x00040047, 0x000000e0, 0x00000021, 0x00000002, - 0x00040047, 0x000000e4, 0x00000022, 0x00000000, 0x00040047, 0x000000e4, 0x00000021, 0x00000002, - 0x00040047, 0x000000e8, 0x00000022, 0x00000000, 0x00040047, 0x000000e8, 0x00000021, 0x00000001, - 0x00040047, 0x000000ec, 0x00000022, 0x00000000, 0x00040047, 0x000000ec, 0x00000021, 0x00000001, - 0x00040047, 0x000000f0, 0x00000022, 0x00000000, 0x00040047, 0x000000f0, 0x00000021, 0x00000001, - 0x00040047, 0x000000f4, 0x00000022, 0x00000000, 0x00040047, 0x000000f4, 0x00000021, 0x00000002, - 0x00040047, 0x000000f8, 0x00000022, 0x00000000, 0x00040047, 0x000000f8, 0x00000021, 0x00000002, - 0x00040047, 0x000000fc, 0x00000022, 0x00000000, 0x00040047, 0x000000fc, 0x00000021, 0x00000002, - 0x00040047, 0x00000100, 0x00000022, 0x00000000, 0x00040047, 0x00000100, 0x00000021, 0x00000001, - 0x00040047, 0x00000104, 0x00000022, 0x00000000, 0x00040047, 0x00000104, 0x00000021, 0x00000001, - 0x00040047, 0x00000108, 0x00000022, 0x00000000, 0x00040047, 0x00000108, 0x00000021, 0x00000001, - 0x00040047, 0x0000010c, 0x00000022, 0x00000000, 0x00040047, 0x0000010c, 0x00000021, 0x00000002, - 0x00040047, 0x00000110, 0x00000022, 0x00000000, 0x00040047, 0x00000110, 0x00000021, 0x00000002, - 0x00040047, 0x00000114, 0x00000022, 0x00000000, 0x00040047, 0x00000114, 0x00000021, 0x00000002, - 0x00040047, 0x00000118, 0x00000022, 0x00000000, 0x00040047, 0x00000118, 0x00000021, 0x00000001, - 0x00040047, 0x0000011c, 0x00000022, 0x00000000, 0x00040047, 0x0000011c, 0x00000021, 0x00000001, - 0x00040047, 0x00000120, 0x00000022, 0x00000000, 0x00040047, 0x00000120, 0x00000021, 0x00000001, - 0x00040047, 0x00000124, 0x00000022, 0x00000000, 0x00040047, 0x00000124, 0x00000021, 0x00000002, - 0x00040047, 0x00000128, 0x00000022, 0x00000000, 0x00040047, 0x00000128, 0x00000021, 0x00000002, - 0x00040047, 0x0000012c, 0x00000022, 0x00000000, 0x00040047, 0x0000012c, 0x00000021, 0x00000002, - 0x00020013, 0x00000002, 0x00030021, 0x00000003, 0x00000002, 0x00030016, 0x00000006, 0x00000020, - 0x00040017, 0x00000007, 0x00000006, 0x00000002, 0x00040015, 0x00000008, 0x00000020, 0x00000000, - 0x0005001e, 0x00000009, 0x00000007, 0x00000007, 0x00000008, 0x00040020, 0x0000000a, 0x00000007, - 0x00000009, 0x00030027, 0x0000000c, 0x000014e5, 0x00030027, 0x0000000d, 0x000014e5, 0x00040015, - 0x0000000e, 0x00000040, 0x00000000, 0x0003001e, 0x0000000f, 0x0000000e, 0x0003001e, 0x00000010, - 0x0000000e, 0x000a001e, 0x00000011, 0x00000007, 0x00000007, 0x00000008, 0x00000008, 0x0000000c, - 0x0000000d, 0x0000000f, 0x00000010, 0x0005001e, 0x00000012, 0x00000007, 0x00000007, 0x00000008, - 0x0003001e, 0x00000013, 0x00000012, 0x00040020, 0x0000000c, 0x000014e5, 0x00000013, 0x0003001e, - 0x00000014, 0x00000008, 0x00040020, 0x0000000d, 0x000014e5, 0x00000014, 0x0003001e, 0x00000015, - 0x00000011, 0x00040020, 0x00000016, 0x00000009, 0x00000015, 0x0004003b, 0x00000016, 0x00000017, - 0x00000009, 0x00040015, 0x00000018, 0x00000020, 0x00000001, 0x0004002b, 0x00000018, 0x00000019, - 0x00000000, 0x0004002b, 0x00000018, 0x0000001a, 0x00000004, 0x00040020, 0x0000001b, 0x00000009, - 0x0000000c, 0x00040020, 0x0000001f, 0x00000001, 0x00000018, 0x0004003b, 0x0000001f, 0x00000020, - 0x00000001, 0x00040015, 0x00000022, 0x00000040, 0x00000001, 0x0005002b, 0x0000000e, 0x00000025, - 0x00000014, 0x00000000, 0x00040020, 0x00000029, 0x000014e5, 0x00000012, 0x00040020, 0x0000002d, - 0x00000007, 0x00000007, 0x0004002b, 0x00000018, 0x00000032, 0x00000001, 0x00040020, 0x00000035, - 0x00000007, 0x00000008, 0x0004002b, 0x00000018, 0x00000037, 0x00000002, 0x00040017, 0x0000003a, - 0x00000006, 0x00000004, 0x0004001e, 0x0000003b, 0x0000003a, 0x00000007, 0x00040020, 0x0000003c, - 0x00000003, 0x0000003b, 0x0004003b, 0x0000003c, 0x0000003d, 0x00000003, 0x0004002b, 0x00000008, - 0x00000040, 0x000000ff, 0x0004002b, 0x00000006, 0x00000043, 0x3f800000, 0x0004002b, 0x00000006, - 0x00000045, 0x437f0000, 0x0004002b, 0x00000008, 0x00000047, 0x00000000, 0x00040020, 0x00000048, - 0x00000003, 0x00000006, 0x0004002b, 0x00000018, 0x0000004b, 0x00000008, 0x0004002b, 0x00000008, - 0x00000051, 0x00000001, 0x0004002b, 0x00000018, 0x00000054, 0x00000010, 0x0004002b, 0x00000008, - 0x0000005a, 0x00000002, 0x0004002b, 0x00000018, 0x0000005d, 0x00000018, 0x0004002b, 0x00000008, - 0x00000063, 0x00000003, 0x00040020, 0x00000066, 0x00000003, 0x00000007, 0x0004001c, 0x00000068, - 0x00000006, 0x00000051, 0x0006001e, 0x00000069, 0x0000003a, 0x00000006, 0x00000068, 0x00000068, - 0x00040020, 0x0000006a, 0x00000003, 0x00000069, 0x0004003b, 0x0000006a, 0x0000006b, 0x00000003, - 0x00040020, 0x0000006d, 0x00000009, 0x00000007, 0x0004002b, 0x00000006, 0x00000074, 0x00000000, - 0x00040020, 0x00000078, 0x00000003, 0x0000003a, 0x0003001d, 0x0000007a, 0x0000000e, 0x0003001e, - 0x0000007b, 0x0000007a, 0x00040020, 0x0000007c, 0x0000000c, 0x0000007b, 0x0004003b, 0x0000007c, - 0x0000007d, 0x0000000c, 0x0002001a, 0x0000007e, 0x0004001c, 0x0000007f, 0x0000007e, 0x00000051, - 0x00040020, 0x00000080, 0x00000000, 0x0000007f, 0x0004003b, 0x00000080, 0x00000081, 0x00000000, - 0x0004003b, 0x00000080, 0x00000082, 0x00000000, 0x0004003b, 0x00000080, 0x00000083, 0x00000000, - 0x0004003b, 0x00000080, 0x00000084, 0x00000000, 0x00090019, 0x00000085, 0x00000006, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x00000086, 0x00000085, - 0x00000051, 0x00040020, 0x00000087, 0x00000000, 0x00000086, 0x0004003b, 0x00000087, 0x00000088, - 0x00000000, 0x00090019, 0x00000089, 0x00000018, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000002, 0x00000000, 0x0004001c, 0x0000008a, 0x00000089, 0x00000051, 0x00040020, 0x0000008b, - 0x00000000, 0x0000008a, 0x0004003b, 0x0000008b, 0x0000008c, 0x00000000, 0x00090019, 0x0000008d, - 0x00000008, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, - 0x0000008e, 0x0000008d, 0x00000051, 0x00040020, 0x0000008f, 0x00000000, 0x0000008e, 0x0004003b, - 0x0000008f, 0x00000090, 0x00000000, 0x00090019, 0x00000091, 0x00000006, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x00000092, 0x00000091, 0x00000051, - 0x00040020, 0x00000093, 0x00000000, 0x00000092, 0x0004003b, 0x00000093, 0x00000094, 0x00000000, - 0x00090019, 0x00000095, 0x00000018, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000001, - 0x00000000, 0x0004001c, 0x00000096, 0x00000095, 0x00000051, 0x00040020, 0x00000097, 0x00000000, - 0x00000096, 0x0004003b, 0x00000097, 0x00000098, 0x00000000, 0x00090019, 0x00000099, 0x00000008, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x0000009a, - 0x00000099, 0x00000051, 0x00040020, 0x0000009b, 0x00000000, 0x0000009a, 0x0004003b, 0x0000009b, - 0x0000009c, 0x00000000, 0x00090019, 0x0000009d, 0x00000006, 0x00000001, 0x00000000, 0x00000000, - 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x0000009e, 0x0000009d, 0x00000051, 0x00040020, - 0x0000009f, 0x00000000, 0x0000009e, 0x0004003b, 0x0000009f, 0x000000a0, 0x00000000, 0x00090019, - 0x000000a1, 0x00000018, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0x00000000, - 0x0004001c, 0x000000a2, 0x000000a1, 0x00000051, 0x00040020, 0x000000a3, 0x00000000, 0x000000a2, - 0x0004003b, 0x000000a3, 0x000000a4, 0x00000000, 0x00090019, 0x000000a5, 0x00000008, 0x00000001, - 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x000000a6, 0x000000a5, - 0x00000051, 0x00040020, 0x000000a7, 0x00000000, 0x000000a6, 0x0004003b, 0x000000a7, 0x000000a8, - 0x00000000, 0x00090019, 0x000000a9, 0x00000006, 0x00000001, 0x00000000, 0x00000000, 0x00000000, - 0x00000001, 0x00000000, 0x0004001c, 0x000000aa, 0x000000a9, 0x00000051, 0x00040020, 0x000000ab, - 0x00000000, 0x000000aa, 0x0004003b, 0x000000ab, 0x000000ac, 0x00000000, 0x00090019, 0x000000ad, - 0x00000018, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, - 0x000000ae, 0x000000ad, 0x00000051, 0x00040020, 0x000000af, 0x00000000, 0x000000ae, 0x0004003b, - 0x000000af, 0x000000b0, 0x00000000, 0x00090019, 0x000000b1, 0x00000008, 0x00000001, 0x00000000, - 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x000000b2, 0x000000b1, 0x00000051, - 0x00040020, 0x000000b3, 0x00000000, 0x000000b2, 0x0004003b, 0x000000b3, 0x000000b4, 0x00000000, - 0x00090019, 0x000000b5, 0x00000006, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000002, - 0x00000000, 0x0004001c, 0x000000b6, 0x000000b5, 0x00000051, 0x00040020, 0x000000b7, 0x00000000, - 0x000000b6, 0x0004003b, 0x000000b7, 0x000000b8, 0x00000000, 0x00090019, 0x000000b9, 0x00000018, - 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x000000ba, - 0x000000b9, 0x00000051, 0x00040020, 0x000000bb, 0x00000000, 0x000000ba, 0x0004003b, 0x000000bb, - 0x000000bc, 0x00000000, 0x00090019, 0x000000bd, 0x00000008, 0x00000002, 0x00000000, 0x00000000, - 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x000000be, 0x000000bd, 0x00000051, 0x00040020, - 0x000000bf, 0x00000000, 0x000000be, 0x0004003b, 0x000000bf, 0x000000c0, 0x00000000, 0x00090019, - 0x000000c1, 0x00000006, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, - 0x0004001c, 0x000000c2, 0x000000c1, 0x00000051, 0x00040020, 0x000000c3, 0x00000000, 0x000000c2, - 0x0004003b, 0x000000c3, 0x000000c4, 0x00000000, 0x00090019, 0x000000c5, 0x00000018, 0x00000002, - 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x000000c6, 0x000000c5, - 0x00000051, 0x00040020, 0x000000c7, 0x00000000, 0x000000c6, 0x0004003b, 0x000000c7, 0x000000c8, - 0x00000000, 0x00090019, 0x000000c9, 0x00000008, 0x00000002, 0x00000000, 0x00000000, 0x00000000, - 0x00000001, 0x00000000, 0x0004001c, 0x000000ca, 0x000000c9, 0x00000051, 0x00040020, 0x000000cb, - 0x00000000, 0x000000ca, 0x0004003b, 0x000000cb, 0x000000cc, 0x00000000, 0x00090019, 0x000000cd, - 0x00000006, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, - 0x000000ce, 0x000000cd, 0x00000051, 0x00040020, 0x000000cf, 0x00000000, 0x000000ce, 0x0004003b, - 0x000000cf, 0x000000d0, 0x00000000, 0x00090019, 0x000000d1, 0x00000018, 0x00000003, 0x00000000, - 0x00000000, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x000000d2, 0x000000d1, 0x00000051, - 0x00040020, 0x000000d3, 0x00000000, 0x000000d2, 0x0004003b, 0x000000d3, 0x000000d4, 0x00000000, - 0x00090019, 0x000000d5, 0x00000008, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000002, - 0x00000000, 0x0004001c, 0x000000d6, 0x000000d5, 0x00000051, 0x00040020, 0x000000d7, 0x00000000, - 0x000000d6, 0x0004003b, 0x000000d7, 0x000000d8, 0x00000000, 0x00090019, 0x000000d9, 0x00000006, - 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x000000da, - 0x000000d9, 0x00000051, 0x00040020, 0x000000db, 0x00000000, 0x000000da, 0x0004003b, 0x000000db, - 0x000000dc, 0x00000000, 0x00090019, 0x000000dd, 0x00000018, 0x00000003, 0x00000000, 0x00000000, - 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x000000de, 0x000000dd, 0x00000051, 0x00040020, - 0x000000df, 0x00000000, 0x000000de, 0x0004003b, 0x000000df, 0x000000e0, 0x00000000, 0x00090019, - 0x000000e1, 0x00000008, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, - 0x0004001c, 0x000000e2, 0x000000e1, 0x00000051, 0x00040020, 0x000000e3, 0x00000000, 0x000000e2, - 0x0004003b, 0x000000e3, 0x000000e4, 0x00000000, 0x00090019, 0x000000e5, 0x00000006, 0x00000003, - 0x00000000, 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x000000e6, 0x000000e5, - 0x00000051, 0x00040020, 0x000000e7, 0x00000000, 0x000000e6, 0x0004003b, 0x000000e7, 0x000000e8, - 0x00000000, 0x00090019, 0x000000e9, 0x00000018, 0x00000003, 0x00000000, 0x00000001, 0x00000000, - 0x00000002, 0x00000000, 0x0004001c, 0x000000ea, 0x000000e9, 0x00000051, 0x00040020, 0x000000eb, - 0x00000000, 0x000000ea, 0x0004003b, 0x000000eb, 0x000000ec, 0x00000000, 0x00090019, 0x000000ed, - 0x00000008, 0x00000003, 0x00000000, 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, - 0x000000ee, 0x000000ed, 0x00000051, 0x00040020, 0x000000ef, 0x00000000, 0x000000ee, 0x0004003b, - 0x000000ef, 0x000000f0, 0x00000000, 0x00090019, 0x000000f1, 0x00000006, 0x00000003, 0x00000000, - 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x000000f2, 0x000000f1, 0x00000051, - 0x00040020, 0x000000f3, 0x00000000, 0x000000f2, 0x0004003b, 0x000000f3, 0x000000f4, 0x00000000, - 0x00090019, 0x000000f5, 0x00000018, 0x00000003, 0x00000000, 0x00000001, 0x00000000, 0x00000001, - 0x00000000, 0x0004001c, 0x000000f6, 0x000000f5, 0x00000051, 0x00040020, 0x000000f7, 0x00000000, - 0x000000f6, 0x0004003b, 0x000000f7, 0x000000f8, 0x00000000, 0x00090019, 0x000000f9, 0x00000008, - 0x00000003, 0x00000000, 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x000000fa, - 0x000000f9, 0x00000051, 0x00040020, 0x000000fb, 0x00000000, 0x000000fa, 0x0004003b, 0x000000fb, - 0x000000fc, 0x00000000, 0x00090019, 0x000000fd, 0x00000006, 0x00000000, 0x00000000, 0x00000001, - 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x000000fe, 0x000000fd, 0x00000051, 0x00040020, - 0x000000ff, 0x00000000, 0x000000fe, 0x0004003b, 0x000000ff, 0x00000100, 0x00000000, 0x00090019, - 0x00000101, 0x00000018, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x00000002, 0x00000000, - 0x0004001c, 0x00000102, 0x00000101, 0x00000051, 0x00040020, 0x00000103, 0x00000000, 0x00000102, - 0x0004003b, 0x00000103, 0x00000104, 0x00000000, 0x00090019, 0x00000105, 0x00000008, 0x00000000, - 0x00000000, 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x00000106, 0x00000105, - 0x00000051, 0x00040020, 0x00000107, 0x00000000, 0x00000106, 0x0004003b, 0x00000107, 0x00000108, - 0x00000000, 0x00090019, 0x00000109, 0x00000006, 0x00000000, 0x00000000, 0x00000001, 0x00000000, - 0x00000001, 0x00000000, 0x0004001c, 0x0000010a, 0x00000109, 0x00000051, 0x00040020, 0x0000010b, - 0x00000000, 0x0000010a, 0x0004003b, 0x0000010b, 0x0000010c, 0x00000000, 0x00090019, 0x0000010d, - 0x00000018, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, - 0x0000010e, 0x0000010d, 0x00000051, 0x00040020, 0x0000010f, 0x00000000, 0x0000010e, 0x0004003b, - 0x0000010f, 0x00000110, 0x00000000, 0x00090019, 0x00000111, 0x00000008, 0x00000000, 0x00000000, - 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x00000112, 0x00000111, 0x00000051, - 0x00040020, 0x00000113, 0x00000000, 0x00000112, 0x0004003b, 0x00000113, 0x00000114, 0x00000000, - 0x00090019, 0x00000115, 0x00000006, 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x00000002, - 0x00000000, 0x0004001c, 0x00000116, 0x00000115, 0x00000051, 0x00040020, 0x00000117, 0x00000000, - 0x00000116, 0x0004003b, 0x00000117, 0x00000118, 0x00000000, 0x00090019, 0x00000119, 0x00000018, - 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x0000011a, - 0x00000119, 0x00000051, 0x00040020, 0x0000011b, 0x00000000, 0x0000011a, 0x0004003b, 0x0000011b, - 0x0000011c, 0x00000000, 0x00090019, 0x0000011d, 0x00000008, 0x00000001, 0x00000000, 0x00000001, - 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x0000011e, 0x0000011d, 0x00000051, 0x00040020, - 0x0000011f, 0x00000000, 0x0000011e, 0x0004003b, 0x0000011f, 0x00000120, 0x00000000, 0x00090019, - 0x00000121, 0x00000006, 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x00000001, 0x00000000, - 0x0004001c, 0x00000122, 0x00000121, 0x00000051, 0x00040020, 0x00000123, 0x00000000, 0x00000122, - 0x0004003b, 0x00000123, 0x00000124, 0x00000000, 0x00090019, 0x00000125, 0x00000018, 0x00000001, - 0x00000000, 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x00000126, 0x00000125, - 0x00000051, 0x00040020, 0x00000127, 0x00000000, 0x00000126, 0x0004003b, 0x00000127, 0x00000128, - 0x00000000, 0x00090019, 0x00000129, 0x00000008, 0x00000001, 0x00000000, 0x00000001, 0x00000000, - 0x00000001, 0x00000000, 0x0004001c, 0x0000012a, 0x00000129, 0x00000051, 0x00040020, 0x0000012b, - 0x00000000, 0x0000012a, 0x0004003b, 0x0000012b, 0x0000012c, 0x00000000, 0x00050036, 0x00000002, - 0x00000004, 0x00000000, 0x00000003, 0x000200f8, 0x00000005, 0x0004003b, 0x0000000a, 0x0000000b, - 0x00000007, 0x0004003b, 0x0000002d, 0x0000002e, 0x00000007, 0x0004003b, 0x0000002d, 0x00000031, - 0x00000007, 0x0004003b, 0x00000035, 0x00000036, 0x00000007, 0x00060041, 0x0000001b, 0x0000001c, - 0x00000017, 0x00000019, 0x0000001a, 0x0004003d, 0x0000000c, 0x0000001d, 0x0000001c, 0x00040075, - 0x0000000e, 0x0000001e, 0x0000001d, 0x0004003d, 0x00000018, 0x00000021, 0x00000020, 0x00040072, - 0x00000022, 0x00000023, 0x00000021, 0x0004007c, 0x0000000e, 0x00000024, 0x00000023, 0x00050084, - 0x0000000e, 0x00000026, 0x00000024, 0x00000025, 0x00050080, 0x0000000e, 0x00000027, 0x0000001e, - 0x00000026, 0x00040078, 0x0000000c, 0x00000028, 0x00000027, 0x00050041, 0x00000029, 0x0000002a, - 0x00000028, 0x00000019, 0x0006003d, 0x00000012, 0x0000002b, 0x0000002a, 0x00000002, 0x00000004, - 0x00040190, 0x00000009, 0x0000002c, 0x0000002b, 0x0003003e, 0x0000000b, 0x0000002c, 0x00050041, - 0x0000002d, 0x0000002f, 0x0000000b, 0x00000019, 0x0004003d, 0x00000007, 0x00000030, 0x0000002f, - 0x0003003e, 0x0000002e, 0x00000030, 0x00050041, 0x0000002d, 0x00000033, 0x0000000b, 0x00000032, - 0x0004003d, 0x00000007, 0x00000034, 0x00000033, 0x0003003e, 0x00000031, 0x00000034, 0x00050041, - 0x00000035, 0x00000038, 0x0000000b, 0x00000037, 0x0004003d, 0x00000008, 0x00000039, 0x00000038, - 0x0003003e, 0x00000036, 0x00000039, 0x0004003d, 0x00000008, 0x0000003e, 0x00000036, 0x000500c2, - 0x00000008, 0x0000003f, 0x0000003e, 0x00000019, 0x000500c7, 0x00000008, 0x00000041, 0x0000003f, - 0x00000040, 0x00040070, 0x00000006, 0x00000042, 0x00000041, 0x00050085, 0x00000006, 0x00000044, - 0x00000042, 0x00000043, 0x00050088, 0x00000006, 0x00000046, 0x00000044, 0x00000045, 0x00060041, - 0x00000048, 0x00000049, 0x0000003d, 0x00000019, 0x00000047, 0x0003003e, 0x00000049, 0x00000046, - 0x0004003d, 0x00000008, 0x0000004a, 0x00000036, 0x000500c2, 0x00000008, 0x0000004c, 0x0000004a, - 0x0000004b, 0x000500c7, 0x00000008, 0x0000004d, 0x0000004c, 0x00000040, 0x00040070, 0x00000006, - 0x0000004e, 0x0000004d, 0x00050085, 0x00000006, 0x0000004f, 0x0000004e, 0x00000043, 0x00050088, - 0x00000006, 0x00000050, 0x0000004f, 0x00000045, 0x00060041, 0x00000048, 0x00000052, 0x0000003d, - 0x00000019, 0x00000051, 0x0003003e, 0x00000052, 0x00000050, 0x0004003d, 0x00000008, 0x00000053, - 0x00000036, 0x000500c2, 0x00000008, 0x00000055, 0x00000053, 0x00000054, 0x000500c7, 0x00000008, - 0x00000056, 0x00000055, 0x00000040, 0x00040070, 0x00000006, 0x00000057, 0x00000056, 0x00050085, - 0x00000006, 0x00000058, 0x00000057, 0x00000043, 0x00050088, 0x00000006, 0x00000059, 0x00000058, - 0x00000045, 0x00060041, 0x00000048, 0x0000005b, 0x0000003d, 0x00000019, 0x0000005a, 0x0003003e, - 0x0000005b, 0x00000059, 0x0004003d, 0x00000008, 0x0000005c, 0x00000036, 0x000500c2, 0x00000008, - 0x0000005e, 0x0000005c, 0x0000005d, 0x000500c7, 0x00000008, 0x0000005f, 0x0000005e, 0x00000040, - 0x00040070, 0x00000006, 0x00000060, 0x0000005f, 0x00050085, 0x00000006, 0x00000061, 0x00000060, - 0x00000043, 0x00050088, 0x00000006, 0x00000062, 0x00000061, 0x00000045, 0x00060041, 0x00000048, - 0x00000064, 0x0000003d, 0x00000019, 0x00000063, 0x0003003e, 0x00000064, 0x00000062, 0x0004003d, - 0x00000007, 0x00000065, 0x00000031, 0x00050041, 0x00000066, 0x00000067, 0x0000003d, 0x00000032, - 0x0003003e, 0x00000067, 0x00000065, 0x0004003d, 0x00000007, 0x0000006c, 0x0000002e, 0x00060041, - 0x0000006d, 0x0000006e, 0x00000017, 0x00000019, 0x00000019, 0x0004003d, 0x00000007, 0x0000006f, - 0x0000006e, 0x00050085, 0x00000007, 0x00000070, 0x0000006c, 0x0000006f, 0x00060041, 0x0000006d, - 0x00000071, 0x00000017, 0x00000019, 0x00000032, 0x0004003d, 0x00000007, 0x00000072, 0x00000071, - 0x00050081, 0x00000007, 0x00000073, 0x00000070, 0x00000072, 0x00050051, 0x00000006, 0x00000075, - 0x00000073, 0x00000000, 0x00050051, 0x00000006, 0x00000076, 0x00000073, 0x00000001, 0x00070050, - 0x0000003a, 0x00000077, 0x00000075, 0x00000076, 0x00000074, 0x00000043, 0x00050041, 0x00000078, - 0x00000079, 0x0000006b, 0x00000019, 0x0003003e, 0x00000079, 0x00000077, 0x000100fd, 0x00010038, - + 0x41443265, 0x79617272, 0x6c626154, 0x00000065, 0x00070005, 0x00000130, 0x61786164, 0x616d695f, + 0x44326567, 0x6154534d, 0x00656c62, 0x00080005, 0x00000134, 0x61786164, 0x6d69695f, 0x32656761, + 0x54534d44, 0x656c6261, 0x00000000, 0x00080005, 0x00000138, 0x61786164, 0x6d69755f, 0x32656761, + 0x54534d44, 0x656c6261, 0x00000000, 0x00080005, 0x0000013c, 0x61786164, 0x7865745f, 0x65727574, + 0x534d4432, 0x6c626154, 0x00000065, 0x00080005, 0x00000140, 0x61786164, 0x6574695f, 0x72757478, + 0x4d443265, 0x62615453, 0x0000656c, 0x00080005, 0x00000144, 0x61786164, 0x6574755f, 0x72757478, + 0x4d443265, 0x62615453, 0x0000656c, 0x00090005, 0x00000148, 0x61786164, 0x616d695f, 0x44326567, + 0x7241534d, 0x54796172, 0x656c6261, 0x00000000, 0x00090005, 0x0000014c, 0x61786164, 0x6d69695f, + 0x32656761, 0x41534d44, 0x79617272, 0x6c626154, 0x00000065, 0x00090005, 0x00000150, 0x61786164, + 0x6d69755f, 0x32656761, 0x41534d44, 0x79617272, 0x6c626154, 0x00000065, 0x00090005, 0x00000154, + 0x61786164, 0x7865745f, 0x65727574, 0x534d4432, 0x61727241, 0x62615479, 0x0000656c, 0x00090005, + 0x00000158, 0x61786164, 0x6574695f, 0x72757478, 0x4d443265, 0x72724153, 0x61547961, 0x00656c62, + 0x00090005, 0x0000015c, 0x61786164, 0x6574755f, 0x72757478, 0x4d443265, 0x72724153, 0x61547961, + 0x00656c62, 0x00050048, 0x0000000f, 0x00000000, 0x00000023, 0x00000000, 0x00050048, 0x00000010, + 0x00000000, 0x00000023, 0x00000000, 0x00050048, 0x00000011, 0x00000000, 0x00000023, 0x00000000, + 0x00050048, 0x00000011, 0x00000001, 0x00000023, 0x00000008, 0x00050048, 0x00000011, 0x00000002, + 0x00000023, 0x00000010, 0x00050048, 0x00000011, 0x00000003, 0x00000023, 0x00000014, 0x00050048, + 0x00000011, 0x00000004, 0x00000023, 0x00000018, 0x00050048, 0x00000011, 0x00000005, 0x00000023, + 0x00000020, 0x00050048, 0x00000011, 0x00000006, 0x00000023, 0x00000028, 0x00050048, 0x00000011, + 0x00000007, 0x00000023, 0x00000030, 0x00050048, 0x00000012, 0x00000000, 0x00000023, 0x00000000, + 0x00050048, 0x00000012, 0x00000001, 0x00000023, 0x00000008, 0x00050048, 0x00000012, 0x00000002, + 0x00000023, 0x00000010, 0x00040048, 0x00000013, 0x00000000, 0x00000018, 0x00050048, 0x00000013, + 0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x00000013, 0x00000002, 0x00040048, 0x00000014, + 0x00000000, 0x00000018, 0x00050048, 0x00000014, 0x00000000, 0x00000023, 0x00000000, 0x00030047, + 0x00000014, 0x00000002, 0x00050048, 0x00000015, 0x00000000, 0x00000023, 0x00000000, 0x00030047, + 0x00000015, 0x00000002, 0x00040047, 0x00000020, 0x0000000b, 0x0000002a, 0x00040047, 0x0000003d, + 0x0000001e, 0x00000000, 0x00050048, 0x00000069, 0x00000000, 0x0000000b, 0x00000000, 0x00050048, + 0x00000069, 0x00000001, 0x0000000b, 0x00000001, 0x00050048, 0x00000069, 0x00000002, 0x0000000b, + 0x00000003, 0x00050048, 0x00000069, 0x00000003, 0x0000000b, 0x00000004, 0x00030047, 0x00000069, + 0x00000002, 0x00040047, 0x0000007a, 0x00000006, 0x00000008, 0x00040048, 0x0000007b, 0x00000000, + 0x00000013, 0x00040048, 0x0000007b, 0x00000000, 0x00000018, 0x00050048, 0x0000007b, 0x00000000, + 0x00000023, 0x00000000, 0x00030047, 0x0000007b, 0x00000002, 0x00040047, 0x0000007d, 0x00000022, + 0x00000000, 0x00040047, 0x0000007d, 0x00000021, 0x00000004, 0x00040047, 0x00000081, 0x00000022, + 0x00000000, 0x00040047, 0x00000081, 0x00000021, 0x00000003, 0x00040047, 0x00000082, 0x00000022, + 0x00000000, 0x00040047, 0x00000082, 0x00000021, 0x00000003, 0x00040047, 0x00000083, 0x00000022, + 0x00000000, 0x00040047, 0x00000083, 0x00000021, 0x00000003, 0x00040047, 0x00000084, 0x00000022, + 0x00000000, 0x00040047, 0x00000084, 0x00000021, 0x00000003, 0x00040047, 0x00000088, 0x00000022, + 0x00000000, 0x00040047, 0x00000088, 0x00000021, 0x00000001, 0x00040047, 0x0000008c, 0x00000022, + 0x00000000, 0x00040047, 0x0000008c, 0x00000021, 0x00000001, 0x00040047, 0x00000090, 0x00000022, + 0x00000000, 0x00040047, 0x00000090, 0x00000021, 0x00000001, 0x00040047, 0x00000094, 0x00000022, + 0x00000000, 0x00040047, 0x00000094, 0x00000021, 0x00000002, 0x00040047, 0x00000098, 0x00000022, + 0x00000000, 0x00040047, 0x00000098, 0x00000021, 0x00000002, 0x00040047, 0x0000009c, 0x00000022, + 0x00000000, 0x00040047, 0x0000009c, 0x00000021, 0x00000002, 0x00040047, 0x000000a0, 0x00000022, + 0x00000000, 0x00040047, 0x000000a0, 0x00000021, 0x00000001, 0x00040047, 0x000000a4, 0x00000022, + 0x00000000, 0x00040047, 0x000000a4, 0x00000021, 0x00000001, 0x00040047, 0x000000a8, 0x00000022, + 0x00000000, 0x00040047, 0x000000a8, 0x00000021, 0x00000001, 0x00040047, 0x000000ac, 0x00000022, + 0x00000000, 0x00040047, 0x000000ac, 0x00000021, 0x00000002, 0x00040047, 0x000000b0, 0x00000022, + 0x00000000, 0x00040047, 0x000000b0, 0x00000021, 0x00000002, 0x00040047, 0x000000b4, 0x00000022, + 0x00000000, 0x00040047, 0x000000b4, 0x00000021, 0x00000002, 0x00040047, 0x000000b8, 0x00000022, + 0x00000000, 0x00040047, 0x000000b8, 0x00000021, 0x00000001, 0x00040047, 0x000000bc, 0x00000022, + 0x00000000, 0x00040047, 0x000000bc, 0x00000021, 0x00000001, 0x00040047, 0x000000c0, 0x00000022, + 0x00000000, 0x00040047, 0x000000c0, 0x00000021, 0x00000001, 0x00040047, 0x000000c4, 0x00000022, + 0x00000000, 0x00040047, 0x000000c4, 0x00000021, 0x00000002, 0x00040047, 0x000000c8, 0x00000022, + 0x00000000, 0x00040047, 0x000000c8, 0x00000021, 0x00000002, 0x00040047, 0x000000cc, 0x00000022, + 0x00000000, 0x00040047, 0x000000cc, 0x00000021, 0x00000002, 0x00040047, 0x000000d0, 0x00000022, + 0x00000000, 0x00040047, 0x000000d0, 0x00000021, 0x00000001, 0x00040047, 0x000000d4, 0x00000022, + 0x00000000, 0x00040047, 0x000000d4, 0x00000021, 0x00000001, 0x00040047, 0x000000d8, 0x00000022, + 0x00000000, 0x00040047, 0x000000d8, 0x00000021, 0x00000001, 0x00040047, 0x000000dc, 0x00000022, + 0x00000000, 0x00040047, 0x000000dc, 0x00000021, 0x00000002, 0x00040047, 0x000000e0, 0x00000022, + 0x00000000, 0x00040047, 0x000000e0, 0x00000021, 0x00000002, 0x00040047, 0x000000e4, 0x00000022, + 0x00000000, 0x00040047, 0x000000e4, 0x00000021, 0x00000002, 0x00040047, 0x000000e8, 0x00000022, + 0x00000000, 0x00040047, 0x000000e8, 0x00000021, 0x00000001, 0x00040047, 0x000000ec, 0x00000022, + 0x00000000, 0x00040047, 0x000000ec, 0x00000021, 0x00000001, 0x00040047, 0x000000f0, 0x00000022, + 0x00000000, 0x00040047, 0x000000f0, 0x00000021, 0x00000001, 0x00040047, 0x000000f4, 0x00000022, + 0x00000000, 0x00040047, 0x000000f4, 0x00000021, 0x00000002, 0x00040047, 0x000000f8, 0x00000022, + 0x00000000, 0x00040047, 0x000000f8, 0x00000021, 0x00000002, 0x00040047, 0x000000fc, 0x00000022, + 0x00000000, 0x00040047, 0x000000fc, 0x00000021, 0x00000002, 0x00040047, 0x00000100, 0x00000022, + 0x00000000, 0x00040047, 0x00000100, 0x00000021, 0x00000001, 0x00040047, 0x00000104, 0x00000022, + 0x00000000, 0x00040047, 0x00000104, 0x00000021, 0x00000001, 0x00040047, 0x00000108, 0x00000022, + 0x00000000, 0x00040047, 0x00000108, 0x00000021, 0x00000001, 0x00040047, 0x0000010c, 0x00000022, + 0x00000000, 0x00040047, 0x0000010c, 0x00000021, 0x00000002, 0x00040047, 0x00000110, 0x00000022, + 0x00000000, 0x00040047, 0x00000110, 0x00000021, 0x00000002, 0x00040047, 0x00000114, 0x00000022, + 0x00000000, 0x00040047, 0x00000114, 0x00000021, 0x00000002, 0x00040047, 0x00000118, 0x00000022, + 0x00000000, 0x00040047, 0x00000118, 0x00000021, 0x00000001, 0x00040047, 0x0000011c, 0x00000022, + 0x00000000, 0x00040047, 0x0000011c, 0x00000021, 0x00000001, 0x00040047, 0x00000120, 0x00000022, + 0x00000000, 0x00040047, 0x00000120, 0x00000021, 0x00000001, 0x00040047, 0x00000124, 0x00000022, + 0x00000000, 0x00040047, 0x00000124, 0x00000021, 0x00000002, 0x00040047, 0x00000128, 0x00000022, + 0x00000000, 0x00040047, 0x00000128, 0x00000021, 0x00000002, 0x00040047, 0x0000012c, 0x00000022, + 0x00000000, 0x00040047, 0x0000012c, 0x00000021, 0x00000002, 0x00040047, 0x00000130, 0x00000022, + 0x00000000, 0x00040047, 0x00000130, 0x00000021, 0x00000001, 0x00040047, 0x00000134, 0x00000022, + 0x00000000, 0x00040047, 0x00000134, 0x00000021, 0x00000001, 0x00040047, 0x00000138, 0x00000022, + 0x00000000, 0x00040047, 0x00000138, 0x00000021, 0x00000001, 0x00040047, 0x0000013c, 0x00000022, + 0x00000000, 0x00040047, 0x0000013c, 0x00000021, 0x00000002, 0x00040047, 0x00000140, 0x00000022, + 0x00000000, 0x00040047, 0x00000140, 0x00000021, 0x00000002, 0x00040047, 0x00000144, 0x00000022, + 0x00000000, 0x00040047, 0x00000144, 0x00000021, 0x00000002, 0x00040047, 0x00000148, 0x00000022, + 0x00000000, 0x00040047, 0x00000148, 0x00000021, 0x00000001, 0x00040047, 0x0000014c, 0x00000022, + 0x00000000, 0x00040047, 0x0000014c, 0x00000021, 0x00000001, 0x00040047, 0x00000150, 0x00000022, + 0x00000000, 0x00040047, 0x00000150, 0x00000021, 0x00000001, 0x00040047, 0x00000154, 0x00000022, + 0x00000000, 0x00040047, 0x00000154, 0x00000021, 0x00000002, 0x00040047, 0x00000158, 0x00000022, + 0x00000000, 0x00040047, 0x00000158, 0x00000021, 0x00000002, 0x00040047, 0x0000015c, 0x00000022, + 0x00000000, 0x00040047, 0x0000015c, 0x00000021, 0x00000002, 0x00020013, 0x00000002, 0x00030021, + 0x00000003, 0x00000002, 0x00030016, 0x00000006, 0x00000020, 0x00040017, 0x00000007, 0x00000006, + 0x00000002, 0x00040015, 0x00000008, 0x00000020, 0x00000000, 0x0005001e, 0x00000009, 0x00000007, + 0x00000007, 0x00000008, 0x00040020, 0x0000000a, 0x00000007, 0x00000009, 0x00030027, 0x0000000c, + 0x000014e5, 0x00030027, 0x0000000d, 0x000014e5, 0x00040015, 0x0000000e, 0x00000040, 0x00000000, + 0x0003001e, 0x0000000f, 0x0000000e, 0x0003001e, 0x00000010, 0x0000000e, 0x000a001e, 0x00000011, + 0x00000007, 0x00000007, 0x00000008, 0x00000008, 0x0000000c, 0x0000000d, 0x0000000f, 0x00000010, + 0x0005001e, 0x00000012, 0x00000007, 0x00000007, 0x00000008, 0x0003001e, 0x00000013, 0x00000012, + 0x00040020, 0x0000000c, 0x000014e5, 0x00000013, 0x0003001e, 0x00000014, 0x00000008, 0x00040020, + 0x0000000d, 0x000014e5, 0x00000014, 0x0003001e, 0x00000015, 0x00000011, 0x00040020, 0x00000016, + 0x00000009, 0x00000015, 0x0004003b, 0x00000016, 0x00000017, 0x00000009, 0x00040015, 0x00000018, + 0x00000020, 0x00000001, 0x0004002b, 0x00000018, 0x00000019, 0x00000000, 0x0004002b, 0x00000018, + 0x0000001a, 0x00000004, 0x00040020, 0x0000001b, 0x00000009, 0x0000000c, 0x00040020, 0x0000001f, + 0x00000001, 0x00000018, 0x0004003b, 0x0000001f, 0x00000020, 0x00000001, 0x00040015, 0x00000022, + 0x00000040, 0x00000001, 0x0005002b, 0x0000000e, 0x00000025, 0x00000014, 0x00000000, 0x00040020, + 0x00000029, 0x000014e5, 0x00000012, 0x00040020, 0x0000002d, 0x00000007, 0x00000007, 0x0004002b, + 0x00000018, 0x00000032, 0x00000001, 0x00040020, 0x00000035, 0x00000007, 0x00000008, 0x0004002b, + 0x00000018, 0x00000037, 0x00000002, 0x00040017, 0x0000003a, 0x00000006, 0x00000004, 0x0004001e, + 0x0000003b, 0x0000003a, 0x00000007, 0x00040020, 0x0000003c, 0x00000003, 0x0000003b, 0x0004003b, + 0x0000003c, 0x0000003d, 0x00000003, 0x0004002b, 0x00000008, 0x00000040, 0x000000ff, 0x0004002b, + 0x00000006, 0x00000043, 0x3f800000, 0x0004002b, 0x00000006, 0x00000045, 0x437f0000, 0x0004002b, + 0x00000008, 0x00000047, 0x00000000, 0x00040020, 0x00000048, 0x00000003, 0x00000006, 0x0004002b, + 0x00000018, 0x0000004b, 0x00000008, 0x0004002b, 0x00000008, 0x00000051, 0x00000001, 0x0004002b, + 0x00000018, 0x00000054, 0x00000010, 0x0004002b, 0x00000008, 0x0000005a, 0x00000002, 0x0004002b, + 0x00000018, 0x0000005d, 0x00000018, 0x0004002b, 0x00000008, 0x00000063, 0x00000003, 0x00040020, + 0x00000066, 0x00000003, 0x00000007, 0x0004001c, 0x00000068, 0x00000006, 0x00000051, 0x0006001e, + 0x00000069, 0x0000003a, 0x00000006, 0x00000068, 0x00000068, 0x00040020, 0x0000006a, 0x00000003, + 0x00000069, 0x0004003b, 0x0000006a, 0x0000006b, 0x00000003, 0x00040020, 0x0000006d, 0x00000009, + 0x00000007, 0x0004002b, 0x00000006, 0x00000074, 0x00000000, 0x00040020, 0x00000078, 0x00000003, + 0x0000003a, 0x0003001d, 0x0000007a, 0x0000000e, 0x0003001e, 0x0000007b, 0x0000007a, 0x00040020, + 0x0000007c, 0x0000000c, 0x0000007b, 0x0004003b, 0x0000007c, 0x0000007d, 0x0000000c, 0x0002001a, + 0x0000007e, 0x0004001c, 0x0000007f, 0x0000007e, 0x00000051, 0x00040020, 0x00000080, 0x00000000, + 0x0000007f, 0x0004003b, 0x00000080, 0x00000081, 0x00000000, 0x0004003b, 0x00000080, 0x00000082, + 0x00000000, 0x0004003b, 0x00000080, 0x00000083, 0x00000000, 0x0004003b, 0x00000080, 0x00000084, + 0x00000000, 0x00090019, 0x00000085, 0x00000006, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000002, 0x00000000, 0x0004001c, 0x00000086, 0x00000085, 0x00000051, 0x00040020, 0x00000087, + 0x00000000, 0x00000086, 0x0004003b, 0x00000087, 0x00000088, 0x00000000, 0x00090019, 0x00000089, + 0x00000018, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, + 0x0000008a, 0x00000089, 0x00000051, 0x00040020, 0x0000008b, 0x00000000, 0x0000008a, 0x0004003b, + 0x0000008b, 0x0000008c, 0x00000000, 0x00090019, 0x0000008d, 0x00000008, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x0000008e, 0x0000008d, 0x00000051, + 0x00040020, 0x0000008f, 0x00000000, 0x0000008e, 0x0004003b, 0x0000008f, 0x00000090, 0x00000000, + 0x00090019, 0x00000091, 0x00000006, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000001, + 0x00000000, 0x0004001c, 0x00000092, 0x00000091, 0x00000051, 0x00040020, 0x00000093, 0x00000000, + 0x00000092, 0x0004003b, 0x00000093, 0x00000094, 0x00000000, 0x00090019, 0x00000095, 0x00000018, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x00000096, + 0x00000095, 0x00000051, 0x00040020, 0x00000097, 0x00000000, 0x00000096, 0x0004003b, 0x00000097, + 0x00000098, 0x00000000, 0x00090019, 0x00000099, 0x00000008, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x0000009a, 0x00000099, 0x00000051, 0x00040020, + 0x0000009b, 0x00000000, 0x0000009a, 0x0004003b, 0x0000009b, 0x0000009c, 0x00000000, 0x00090019, + 0x0000009d, 0x00000006, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0x00000000, + 0x0004001c, 0x0000009e, 0x0000009d, 0x00000051, 0x00040020, 0x0000009f, 0x00000000, 0x0000009e, + 0x0004003b, 0x0000009f, 0x000000a0, 0x00000000, 0x00090019, 0x000000a1, 0x00000018, 0x00000001, + 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x000000a2, 0x000000a1, + 0x00000051, 0x00040020, 0x000000a3, 0x00000000, 0x000000a2, 0x0004003b, 0x000000a3, 0x000000a4, + 0x00000000, 0x00090019, 0x000000a5, 0x00000008, 0x00000001, 0x00000000, 0x00000000, 0x00000000, + 0x00000002, 0x00000000, 0x0004001c, 0x000000a6, 0x000000a5, 0x00000051, 0x00040020, 0x000000a7, + 0x00000000, 0x000000a6, 0x0004003b, 0x000000a7, 0x000000a8, 0x00000000, 0x00090019, 0x000000a9, + 0x00000006, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, + 0x000000aa, 0x000000a9, 0x00000051, 0x00040020, 0x000000ab, 0x00000000, 0x000000aa, 0x0004003b, + 0x000000ab, 0x000000ac, 0x00000000, 0x00090019, 0x000000ad, 0x00000018, 0x00000001, 0x00000000, + 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x000000ae, 0x000000ad, 0x00000051, + 0x00040020, 0x000000af, 0x00000000, 0x000000ae, 0x0004003b, 0x000000af, 0x000000b0, 0x00000000, + 0x00090019, 0x000000b1, 0x00000008, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000001, + 0x00000000, 0x0004001c, 0x000000b2, 0x000000b1, 0x00000051, 0x00040020, 0x000000b3, 0x00000000, + 0x000000b2, 0x0004003b, 0x000000b3, 0x000000b4, 0x00000000, 0x00090019, 0x000000b5, 0x00000006, + 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x000000b6, + 0x000000b5, 0x00000051, 0x00040020, 0x000000b7, 0x00000000, 0x000000b6, 0x0004003b, 0x000000b7, + 0x000000b8, 0x00000000, 0x00090019, 0x000000b9, 0x00000018, 0x00000002, 0x00000000, 0x00000000, + 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x000000ba, 0x000000b9, 0x00000051, 0x00040020, + 0x000000bb, 0x00000000, 0x000000ba, 0x0004003b, 0x000000bb, 0x000000bc, 0x00000000, 0x00090019, + 0x000000bd, 0x00000008, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0x00000000, + 0x0004001c, 0x000000be, 0x000000bd, 0x00000051, 0x00040020, 0x000000bf, 0x00000000, 0x000000be, + 0x0004003b, 0x000000bf, 0x000000c0, 0x00000000, 0x00090019, 0x000000c1, 0x00000006, 0x00000002, + 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x000000c2, 0x000000c1, + 0x00000051, 0x00040020, 0x000000c3, 0x00000000, 0x000000c2, 0x0004003b, 0x000000c3, 0x000000c4, + 0x00000000, 0x00090019, 0x000000c5, 0x00000018, 0x00000002, 0x00000000, 0x00000000, 0x00000000, + 0x00000001, 0x00000000, 0x0004001c, 0x000000c6, 0x000000c5, 0x00000051, 0x00040020, 0x000000c7, + 0x00000000, 0x000000c6, 0x0004003b, 0x000000c7, 0x000000c8, 0x00000000, 0x00090019, 0x000000c9, + 0x00000008, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, + 0x000000ca, 0x000000c9, 0x00000051, 0x00040020, 0x000000cb, 0x00000000, 0x000000ca, 0x0004003b, + 0x000000cb, 0x000000cc, 0x00000000, 0x00090019, 0x000000cd, 0x00000006, 0x00000003, 0x00000000, + 0x00000000, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x000000ce, 0x000000cd, 0x00000051, + 0x00040020, 0x000000cf, 0x00000000, 0x000000ce, 0x0004003b, 0x000000cf, 0x000000d0, 0x00000000, + 0x00090019, 0x000000d1, 0x00000018, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000002, + 0x00000000, 0x0004001c, 0x000000d2, 0x000000d1, 0x00000051, 0x00040020, 0x000000d3, 0x00000000, + 0x000000d2, 0x0004003b, 0x000000d3, 0x000000d4, 0x00000000, 0x00090019, 0x000000d5, 0x00000008, + 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x000000d6, + 0x000000d5, 0x00000051, 0x00040020, 0x000000d7, 0x00000000, 0x000000d6, 0x0004003b, 0x000000d7, + 0x000000d8, 0x00000000, 0x00090019, 0x000000d9, 0x00000006, 0x00000003, 0x00000000, 0x00000000, + 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x000000da, 0x000000d9, 0x00000051, 0x00040020, + 0x000000db, 0x00000000, 0x000000da, 0x0004003b, 0x000000db, 0x000000dc, 0x00000000, 0x00090019, + 0x000000dd, 0x00000018, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, + 0x0004001c, 0x000000de, 0x000000dd, 0x00000051, 0x00040020, 0x000000df, 0x00000000, 0x000000de, + 0x0004003b, 0x000000df, 0x000000e0, 0x00000000, 0x00090019, 0x000000e1, 0x00000008, 0x00000003, + 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x000000e2, 0x000000e1, + 0x00000051, 0x00040020, 0x000000e3, 0x00000000, 0x000000e2, 0x0004003b, 0x000000e3, 0x000000e4, + 0x00000000, 0x00090019, 0x000000e5, 0x00000006, 0x00000003, 0x00000000, 0x00000001, 0x00000000, + 0x00000002, 0x00000000, 0x0004001c, 0x000000e6, 0x000000e5, 0x00000051, 0x00040020, 0x000000e7, + 0x00000000, 0x000000e6, 0x0004003b, 0x000000e7, 0x000000e8, 0x00000000, 0x00090019, 0x000000e9, + 0x00000018, 0x00000003, 0x00000000, 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, + 0x000000ea, 0x000000e9, 0x00000051, 0x00040020, 0x000000eb, 0x00000000, 0x000000ea, 0x0004003b, + 0x000000eb, 0x000000ec, 0x00000000, 0x00090019, 0x000000ed, 0x00000008, 0x00000003, 0x00000000, + 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x000000ee, 0x000000ed, 0x00000051, + 0x00040020, 0x000000ef, 0x00000000, 0x000000ee, 0x0004003b, 0x000000ef, 0x000000f0, 0x00000000, + 0x00090019, 0x000000f1, 0x00000006, 0x00000003, 0x00000000, 0x00000001, 0x00000000, 0x00000001, + 0x00000000, 0x0004001c, 0x000000f2, 0x000000f1, 0x00000051, 0x00040020, 0x000000f3, 0x00000000, + 0x000000f2, 0x0004003b, 0x000000f3, 0x000000f4, 0x00000000, 0x00090019, 0x000000f5, 0x00000018, + 0x00000003, 0x00000000, 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x000000f6, + 0x000000f5, 0x00000051, 0x00040020, 0x000000f7, 0x00000000, 0x000000f6, 0x0004003b, 0x000000f7, + 0x000000f8, 0x00000000, 0x00090019, 0x000000f9, 0x00000008, 0x00000003, 0x00000000, 0x00000001, + 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x000000fa, 0x000000f9, 0x00000051, 0x00040020, + 0x000000fb, 0x00000000, 0x000000fa, 0x0004003b, 0x000000fb, 0x000000fc, 0x00000000, 0x00090019, + 0x000000fd, 0x00000006, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x00000002, 0x00000000, + 0x0004001c, 0x000000fe, 0x000000fd, 0x00000051, 0x00040020, 0x000000ff, 0x00000000, 0x000000fe, + 0x0004003b, 0x000000ff, 0x00000100, 0x00000000, 0x00090019, 0x00000101, 0x00000018, 0x00000000, + 0x00000000, 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x00000102, 0x00000101, + 0x00000051, 0x00040020, 0x00000103, 0x00000000, 0x00000102, 0x0004003b, 0x00000103, 0x00000104, + 0x00000000, 0x00090019, 0x00000105, 0x00000008, 0x00000000, 0x00000000, 0x00000001, 0x00000000, + 0x00000002, 0x00000000, 0x0004001c, 0x00000106, 0x00000105, 0x00000051, 0x00040020, 0x00000107, + 0x00000000, 0x00000106, 0x0004003b, 0x00000107, 0x00000108, 0x00000000, 0x00090019, 0x00000109, + 0x00000006, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, + 0x0000010a, 0x00000109, 0x00000051, 0x00040020, 0x0000010b, 0x00000000, 0x0000010a, 0x0004003b, + 0x0000010b, 0x0000010c, 0x00000000, 0x00090019, 0x0000010d, 0x00000018, 0x00000000, 0x00000000, + 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x0000010e, 0x0000010d, 0x00000051, + 0x00040020, 0x0000010f, 0x00000000, 0x0000010e, 0x0004003b, 0x0000010f, 0x00000110, 0x00000000, + 0x00090019, 0x00000111, 0x00000008, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x00000001, + 0x00000000, 0x0004001c, 0x00000112, 0x00000111, 0x00000051, 0x00040020, 0x00000113, 0x00000000, + 0x00000112, 0x0004003b, 0x00000113, 0x00000114, 0x00000000, 0x00090019, 0x00000115, 0x00000006, + 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x00000116, + 0x00000115, 0x00000051, 0x00040020, 0x00000117, 0x00000000, 0x00000116, 0x0004003b, 0x00000117, + 0x00000118, 0x00000000, 0x00090019, 0x00000119, 0x00000018, 0x00000001, 0x00000000, 0x00000001, + 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x0000011a, 0x00000119, 0x00000051, 0x00040020, + 0x0000011b, 0x00000000, 0x0000011a, 0x0004003b, 0x0000011b, 0x0000011c, 0x00000000, 0x00090019, + 0x0000011d, 0x00000008, 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x00000002, 0x00000000, + 0x0004001c, 0x0000011e, 0x0000011d, 0x00000051, 0x00040020, 0x0000011f, 0x00000000, 0x0000011e, + 0x0004003b, 0x0000011f, 0x00000120, 0x00000000, 0x00090019, 0x00000121, 0x00000006, 0x00000001, + 0x00000000, 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x00000122, 0x00000121, + 0x00000051, 0x00040020, 0x00000123, 0x00000000, 0x00000122, 0x0004003b, 0x00000123, 0x00000124, + 0x00000000, 0x00090019, 0x00000125, 0x00000018, 0x00000001, 0x00000000, 0x00000001, 0x00000000, + 0x00000001, 0x00000000, 0x0004001c, 0x00000126, 0x00000125, 0x00000051, 0x00040020, 0x00000127, + 0x00000000, 0x00000126, 0x0004003b, 0x00000127, 0x00000128, 0x00000000, 0x00090019, 0x00000129, + 0x00000008, 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, + 0x0000012a, 0x00000129, 0x00000051, 0x00040020, 0x0000012b, 0x00000000, 0x0000012a, 0x0004003b, + 0x0000012b, 0x0000012c, 0x00000000, 0x00090019, 0x0000012d, 0x00000006, 0x00000001, 0x00000000, + 0x00000000, 0x00000001, 0x00000002, 0x00000000, 0x0004001c, 0x0000012e, 0x0000012d, 0x00000051, + 0x00040020, 0x0000012f, 0x00000000, 0x0000012e, 0x0004003b, 0x0000012f, 0x00000130, 0x00000000, + 0x00090019, 0x00000131, 0x00000018, 0x00000001, 0x00000000, 0x00000000, 0x00000001, 0x00000002, + 0x00000000, 0x0004001c, 0x00000132, 0x00000131, 0x00000051, 0x00040020, 0x00000133, 0x00000000, + 0x00000132, 0x0004003b, 0x00000133, 0x00000134, 0x00000000, 0x00090019, 0x00000135, 0x00000008, + 0x00000001, 0x00000000, 0x00000000, 0x00000001, 0x00000002, 0x00000000, 0x0004001c, 0x00000136, + 0x00000135, 0x00000051, 0x00040020, 0x00000137, 0x00000000, 0x00000136, 0x0004003b, 0x00000137, + 0x00000138, 0x00000000, 0x00090019, 0x00000139, 0x00000006, 0x00000001, 0x00000000, 0x00000000, + 0x00000001, 0x00000001, 0x00000000, 0x0004001c, 0x0000013a, 0x00000139, 0x00000051, 0x00040020, + 0x0000013b, 0x00000000, 0x0000013a, 0x0004003b, 0x0000013b, 0x0000013c, 0x00000000, 0x00090019, + 0x0000013d, 0x00000018, 0x00000001, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000000, + 0x0004001c, 0x0000013e, 0x0000013d, 0x00000051, 0x00040020, 0x0000013f, 0x00000000, 0x0000013e, + 0x0004003b, 0x0000013f, 0x00000140, 0x00000000, 0x00090019, 0x00000141, 0x00000008, 0x00000001, + 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000000, 0x0004001c, 0x00000142, 0x00000141, + 0x00000051, 0x00040020, 0x00000143, 0x00000000, 0x00000142, 0x0004003b, 0x00000143, 0x00000144, + 0x00000000, 0x00090019, 0x00000145, 0x00000006, 0x00000001, 0x00000000, 0x00000001, 0x00000001, + 0x00000002, 0x00000000, 0x0004001c, 0x00000146, 0x00000145, 0x00000051, 0x00040020, 0x00000147, + 0x00000000, 0x00000146, 0x0004003b, 0x00000147, 0x00000148, 0x00000000, 0x00090019, 0x00000149, + 0x00000018, 0x00000001, 0x00000000, 0x00000001, 0x00000001, 0x00000002, 0x00000000, 0x0004001c, + 0x0000014a, 0x00000149, 0x00000051, 0x00040020, 0x0000014b, 0x00000000, 0x0000014a, 0x0004003b, + 0x0000014b, 0x0000014c, 0x00000000, 0x00090019, 0x0000014d, 0x00000008, 0x00000001, 0x00000000, + 0x00000001, 0x00000001, 0x00000002, 0x00000000, 0x0004001c, 0x0000014e, 0x0000014d, 0x00000051, + 0x00040020, 0x0000014f, 0x00000000, 0x0000014e, 0x0004003b, 0x0000014f, 0x00000150, 0x00000000, + 0x00090019, 0x00000151, 0x00000006, 0x00000001, 0x00000000, 0x00000001, 0x00000001, 0x00000001, + 0x00000000, 0x0004001c, 0x00000152, 0x00000151, 0x00000051, 0x00040020, 0x00000153, 0x00000000, + 0x00000152, 0x0004003b, 0x00000153, 0x00000154, 0x00000000, 0x00090019, 0x00000155, 0x00000018, + 0x00000001, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000000, 0x0004001c, 0x00000156, + 0x00000155, 0x00000051, 0x00040020, 0x00000157, 0x00000000, 0x00000156, 0x0004003b, 0x00000157, + 0x00000158, 0x00000000, 0x00090019, 0x00000159, 0x00000008, 0x00000001, 0x00000000, 0x00000001, + 0x00000001, 0x00000001, 0x00000000, 0x0004001c, 0x0000015a, 0x00000159, 0x00000051, 0x00040020, + 0x0000015b, 0x00000000, 0x0000015a, 0x0004003b, 0x0000015b, 0x0000015c, 0x00000000, 0x00050036, + 0x00000002, 0x00000004, 0x00000000, 0x00000003, 0x000200f8, 0x00000005, 0x0004003b, 0x0000000a, + 0x0000000b, 0x00000007, 0x0004003b, 0x0000002d, 0x0000002e, 0x00000007, 0x0004003b, 0x0000002d, + 0x00000031, 0x00000007, 0x0004003b, 0x00000035, 0x00000036, 0x00000007, 0x00060041, 0x0000001b, + 0x0000001c, 0x00000017, 0x00000019, 0x0000001a, 0x0004003d, 0x0000000c, 0x0000001d, 0x0000001c, + 0x00040075, 0x0000000e, 0x0000001e, 0x0000001d, 0x0004003d, 0x00000018, 0x00000021, 0x00000020, + 0x00040072, 0x00000022, 0x00000023, 0x00000021, 0x0004007c, 0x0000000e, 0x00000024, 0x00000023, + 0x00050084, 0x0000000e, 0x00000026, 0x00000024, 0x00000025, 0x00050080, 0x0000000e, 0x00000027, + 0x0000001e, 0x00000026, 0x00040078, 0x0000000c, 0x00000028, 0x00000027, 0x00050041, 0x00000029, + 0x0000002a, 0x00000028, 0x00000019, 0x0006003d, 0x00000012, 0x0000002b, 0x0000002a, 0x00000002, + 0x00000004, 0x00040190, 0x00000009, 0x0000002c, 0x0000002b, 0x0003003e, 0x0000000b, 0x0000002c, + 0x00050041, 0x0000002d, 0x0000002f, 0x0000000b, 0x00000019, 0x0004003d, 0x00000007, 0x00000030, + 0x0000002f, 0x0003003e, 0x0000002e, 0x00000030, 0x00050041, 0x0000002d, 0x00000033, 0x0000000b, + 0x00000032, 0x0004003d, 0x00000007, 0x00000034, 0x00000033, 0x0003003e, 0x00000031, 0x00000034, + 0x00050041, 0x00000035, 0x00000038, 0x0000000b, 0x00000037, 0x0004003d, 0x00000008, 0x00000039, + 0x00000038, 0x0003003e, 0x00000036, 0x00000039, 0x0004003d, 0x00000008, 0x0000003e, 0x00000036, + 0x000500c2, 0x00000008, 0x0000003f, 0x0000003e, 0x00000019, 0x000500c7, 0x00000008, 0x00000041, + 0x0000003f, 0x00000040, 0x00040070, 0x00000006, 0x00000042, 0x00000041, 0x00050085, 0x00000006, + 0x00000044, 0x00000042, 0x00000043, 0x00050088, 0x00000006, 0x00000046, 0x00000044, 0x00000045, + 0x00060041, 0x00000048, 0x00000049, 0x0000003d, 0x00000019, 0x00000047, 0x0003003e, 0x00000049, + 0x00000046, 0x0004003d, 0x00000008, 0x0000004a, 0x00000036, 0x000500c2, 0x00000008, 0x0000004c, + 0x0000004a, 0x0000004b, 0x000500c7, 0x00000008, 0x0000004d, 0x0000004c, 0x00000040, 0x00040070, + 0x00000006, 0x0000004e, 0x0000004d, 0x00050085, 0x00000006, 0x0000004f, 0x0000004e, 0x00000043, + 0x00050088, 0x00000006, 0x00000050, 0x0000004f, 0x00000045, 0x00060041, 0x00000048, 0x00000052, + 0x0000003d, 0x00000019, 0x00000051, 0x0003003e, 0x00000052, 0x00000050, 0x0004003d, 0x00000008, + 0x00000053, 0x00000036, 0x000500c2, 0x00000008, 0x00000055, 0x00000053, 0x00000054, 0x000500c7, + 0x00000008, 0x00000056, 0x00000055, 0x00000040, 0x00040070, 0x00000006, 0x00000057, 0x00000056, + 0x00050085, 0x00000006, 0x00000058, 0x00000057, 0x00000043, 0x00050088, 0x00000006, 0x00000059, + 0x00000058, 0x00000045, 0x00060041, 0x00000048, 0x0000005b, 0x0000003d, 0x00000019, 0x0000005a, + 0x0003003e, 0x0000005b, 0x00000059, 0x0004003d, 0x00000008, 0x0000005c, 0x00000036, 0x000500c2, + 0x00000008, 0x0000005e, 0x0000005c, 0x0000005d, 0x000500c7, 0x00000008, 0x0000005f, 0x0000005e, + 0x00000040, 0x00040070, 0x00000006, 0x00000060, 0x0000005f, 0x00050085, 0x00000006, 0x00000061, + 0x00000060, 0x00000043, 0x00050088, 0x00000006, 0x00000062, 0x00000061, 0x00000045, 0x00060041, + 0x00000048, 0x00000064, 0x0000003d, 0x00000019, 0x00000063, 0x0003003e, 0x00000064, 0x00000062, + 0x0004003d, 0x00000007, 0x00000065, 0x00000031, 0x00050041, 0x00000066, 0x00000067, 0x0000003d, + 0x00000032, 0x0003003e, 0x00000067, 0x00000065, 0x0004003d, 0x00000007, 0x0000006c, 0x0000002e, + 0x00060041, 0x0000006d, 0x0000006e, 0x00000017, 0x00000019, 0x00000019, 0x0004003d, 0x00000007, + 0x0000006f, 0x0000006e, 0x00050085, 0x00000007, 0x00000070, 0x0000006c, 0x0000006f, 0x00060041, + 0x0000006d, 0x00000071, 0x00000017, 0x00000019, 0x00000032, 0x0004003d, 0x00000007, 0x00000072, + 0x00000071, 0x00050081, 0x00000007, 0x00000073, 0x00000070, 0x00000072, 0x00050051, 0x00000006, + 0x00000075, 0x00000073, 0x00000000, 0x00050051, 0x00000006, 0x00000076, 0x00000073, 0x00000001, + 0x00070050, 0x0000003a, 0x00000077, 0x00000075, 0x00000076, 0x00000074, 0x00000043, 0x00050041, + 0x00000078, 0x00000079, 0x0000006b, 0x00000019, 0x0003003e, 0x00000079, 0x00000077, 0x000100fd, + 0x00010038, // clang-format on }; -static constexpr auto imgui_frag_spv = std::array{ +static constexpr auto imgui_frag_spv = std::array{ // clang-format off - 0x07230203, 0x00010500, 0x0008000b, 0x00000143, 0x00000000, 0x00020011, 0x00000001, 0x00020011, - 0x0000000b, 0x00020011, 0x00000022, 0x00020011, 0x0000002b, 0x00020011, 0x0000002c, 0x00020011, - 0x0000002d, 0x00020011, 0x000014b6, 0x00020011, 0x000014e3, 0x0006000b, 0x00000001, 0x4c534c47, - 0x6474732e, 0x3035342e, 0x00000000, 0x0003000e, 0x000014e4, 0x00000001, 0x0037000f, 0x00000004, - 0x00000004, 0x6e69616d, 0x00000000, 0x0000005c, 0x00000060, 0x00000069, 0x00000074, 0x00000082, - 0x00000098, 0x0000009c, 0x0000009d, 0x0000009e, 0x000000a2, 0x000000a6, 0x000000aa, 0x000000ae, - 0x000000b2, 0x000000b6, 0x000000ba, 0x000000be, 0x000000c2, 0x000000c6, 0x000000ca, 0x000000ce, - 0x000000d2, 0x000000d6, 0x000000da, 0x000000de, 0x000000e2, 0x000000e6, 0x000000ea, 0x000000ee, - 0x000000f2, 0x000000f6, 0x000000fa, 0x000000fe, 0x00000102, 0x00000106, 0x0000010a, 0x0000010e, - 0x00000112, 0x00000116, 0x0000011a, 0x0000011e, 0x00000122, 0x00000126, 0x0000012a, 0x0000012e, - 0x00000132, 0x00000136, 0x0000013a, 0x0000013e, 0x00000142, 0x00030010, 0x00000004, 0x00000007, + 0x07230203, 0x00010500, 0x0008000b, 0x00000173, 0x00000000, 0x00020011, 0x00000001, 0x00020011, + 0x0000000b, 0x00020011, 0x0000001b, 0x00020011, 0x00000022, 0x00020011, 0x0000002b, 0x00020011, + 0x0000002c, 0x00020011, 0x0000002d, 0x00020011, 0x00000030, 0x00020011, 0x000014b6, 0x00020011, + 0x000014e3, 0x0006000b, 0x00000001, 0x4c534c47, 0x6474732e, 0x3035342e, 0x00000000, 0x0003000e, + 0x000014e4, 0x00000001, 0x0043000f, 0x00000004, 0x00000004, 0x6e69616d, 0x00000000, 0x0000005c, + 0x00000060, 0x00000069, 0x00000074, 0x00000082, 0x00000098, 0x0000009c, 0x0000009d, 0x0000009e, + 0x000000a2, 0x000000a6, 0x000000aa, 0x000000ae, 0x000000b2, 0x000000b6, 0x000000ba, 0x000000be, + 0x000000c2, 0x000000c6, 0x000000ca, 0x000000ce, 0x000000d2, 0x000000d6, 0x000000da, 0x000000de, + 0x000000e2, 0x000000e6, 0x000000ea, 0x000000ee, 0x000000f2, 0x000000f6, 0x000000fa, 0x000000fe, + 0x00000102, 0x00000106, 0x0000010a, 0x0000010e, 0x00000112, 0x00000116, 0x0000011a, 0x0000011e, + 0x00000122, 0x00000126, 0x0000012a, 0x0000012e, 0x00000132, 0x00000136, 0x0000013a, 0x0000013e, + 0x00000142, 0x00000146, 0x0000014a, 0x0000014e, 0x00000152, 0x00000156, 0x0000015a, 0x0000015e, + 0x00000162, 0x00000166, 0x0000016a, 0x0000016e, 0x00000172, 0x00030010, 0x00000004, 0x00000007, 0x00030003, 0x00000002, 0x000001cc, 0x00070004, 0x455f4c47, 0x625f5458, 0x65666675, 0x65725f72, 0x65726566, 0x0065636e, 0x00080004, 0x455f4c47, 0x625f5458, 0x65666675, 0x65725f72, 0x65726566, 0x3265636e, 0x00000000, 0x00090004, 0x455f4c47, 0x635f5458, 0x72746e6f, 0x665f6c6f, 0x5f776f6c, @@ -485,279 +545,337 @@ static constexpr auto imgui_frag_spv = std::array{ 0x00656c62, 0x00090005, 0x0000013a, 0x61786164, 0x7865745f, 0x65727574, 0x72414432, 0x54796172, 0x656c6261, 0x00000000, 0x00090005, 0x0000013e, 0x61786164, 0x6574695f, 0x72757478, 0x41443265, 0x79617272, 0x6c626154, 0x00000065, 0x00090005, 0x00000142, 0x61786164, 0x6574755f, 0x72757478, - 0x41443265, 0x79617272, 0x6c626154, 0x00000065, 0x00040047, 0x0000005c, 0x0000001e, 0x00000000, - 0x00040047, 0x00000060, 0x0000001e, 0x00000000, 0x00040047, 0x00000069, 0x00000022, 0x00000000, - 0x00040047, 0x00000069, 0x00000021, 0x00000002, 0x00050048, 0x0000006c, 0x00000000, 0x00000023, - 0x00000000, 0x00050048, 0x0000006d, 0x00000000, 0x00000023, 0x00000000, 0x00050048, 0x0000006e, - 0x00000000, 0x00000023, 0x00000000, 0x00050048, 0x0000006e, 0x00000001, 0x00000023, 0x00000008, - 0x00050048, 0x0000006e, 0x00000002, 0x00000023, 0x00000010, 0x00050048, 0x0000006e, 0x00000003, - 0x00000023, 0x00000014, 0x00050048, 0x0000006e, 0x00000004, 0x00000023, 0x00000018, 0x00050048, - 0x0000006e, 0x00000005, 0x00000023, 0x00000020, 0x00050048, 0x0000006e, 0x00000006, 0x00000023, - 0x00000028, 0x00050048, 0x0000006e, 0x00000007, 0x00000023, 0x00000030, 0x00050048, 0x0000006f, - 0x00000000, 0x00000023, 0x00000000, 0x00050048, 0x0000006f, 0x00000001, 0x00000023, 0x00000008, - 0x00050048, 0x0000006f, 0x00000002, 0x00000023, 0x00000010, 0x00040048, 0x00000070, 0x00000000, - 0x00000018, 0x00050048, 0x00000070, 0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x00000070, - 0x00000002, 0x00040048, 0x00000071, 0x00000000, 0x00000018, 0x00050048, 0x00000071, 0x00000000, - 0x00000023, 0x00000000, 0x00030047, 0x00000071, 0x00000002, 0x00050048, 0x00000072, 0x00000000, - 0x00000023, 0x00000000, 0x00030047, 0x00000072, 0x00000002, 0x00040047, 0x00000082, 0x00000022, - 0x00000000, 0x00040047, 0x00000082, 0x00000021, 0x00000003, 0x00040047, 0x00000095, 0x00000006, - 0x00000008, 0x00040048, 0x00000096, 0x00000000, 0x00000013, 0x00040048, 0x00000096, 0x00000000, - 0x00000018, 0x00050048, 0x00000096, 0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x00000096, - 0x00000002, 0x00040047, 0x00000098, 0x00000022, 0x00000000, 0x00040047, 0x00000098, 0x00000021, - 0x00000004, 0x00040047, 0x0000009c, 0x00000022, 0x00000000, 0x00040047, 0x0000009c, 0x00000021, - 0x00000003, 0x00040047, 0x0000009d, 0x00000022, 0x00000000, 0x00040047, 0x0000009d, 0x00000021, - 0x00000003, 0x00040047, 0x0000009e, 0x00000022, 0x00000000, 0x00040047, 0x0000009e, 0x00000021, - 0x00000003, 0x00040047, 0x000000a2, 0x00000022, 0x00000000, 0x00040047, 0x000000a2, 0x00000021, - 0x00000001, 0x00040047, 0x000000a6, 0x00000022, 0x00000000, 0x00040047, 0x000000a6, 0x00000021, - 0x00000001, 0x00040047, 0x000000aa, 0x00000022, 0x00000000, 0x00040047, 0x000000aa, 0x00000021, - 0x00000001, 0x00040047, 0x000000ae, 0x00000022, 0x00000000, 0x00040047, 0x000000ae, 0x00000021, - 0x00000002, 0x00040047, 0x000000b2, 0x00000022, 0x00000000, 0x00040047, 0x000000b2, 0x00000021, - 0x00000002, 0x00040047, 0x000000b6, 0x00000022, 0x00000000, 0x00040047, 0x000000b6, 0x00000021, - 0x00000002, 0x00040047, 0x000000ba, 0x00000022, 0x00000000, 0x00040047, 0x000000ba, 0x00000021, - 0x00000001, 0x00040047, 0x000000be, 0x00000022, 0x00000000, 0x00040047, 0x000000be, 0x00000021, - 0x00000001, 0x00040047, 0x000000c2, 0x00000022, 0x00000000, 0x00040047, 0x000000c2, 0x00000021, - 0x00000001, 0x00040047, 0x000000c6, 0x00000022, 0x00000000, 0x00040047, 0x000000c6, 0x00000021, - 0x00000002, 0x00040047, 0x000000ca, 0x00000022, 0x00000000, 0x00040047, 0x000000ca, 0x00000021, - 0x00000002, 0x00040047, 0x000000ce, 0x00000022, 0x00000000, 0x00040047, 0x000000ce, 0x00000021, - 0x00000001, 0x00040047, 0x000000d2, 0x00000022, 0x00000000, 0x00040047, 0x000000d2, 0x00000021, - 0x00000001, 0x00040047, 0x000000d6, 0x00000022, 0x00000000, 0x00040047, 0x000000d6, 0x00000021, - 0x00000001, 0x00040047, 0x000000da, 0x00000022, 0x00000000, 0x00040047, 0x000000da, 0x00000021, - 0x00000002, 0x00040047, 0x000000de, 0x00000022, 0x00000000, 0x00040047, 0x000000de, 0x00000021, - 0x00000002, 0x00040047, 0x000000e2, 0x00000022, 0x00000000, 0x00040047, 0x000000e2, 0x00000021, - 0x00000002, 0x00040047, 0x000000e6, 0x00000022, 0x00000000, 0x00040047, 0x000000e6, 0x00000021, - 0x00000001, 0x00040047, 0x000000ea, 0x00000022, 0x00000000, 0x00040047, 0x000000ea, 0x00000021, - 0x00000001, 0x00040047, 0x000000ee, 0x00000022, 0x00000000, 0x00040047, 0x000000ee, 0x00000021, - 0x00000001, 0x00040047, 0x000000f2, 0x00000022, 0x00000000, 0x00040047, 0x000000f2, 0x00000021, - 0x00000002, 0x00040047, 0x000000f6, 0x00000022, 0x00000000, 0x00040047, 0x000000f6, 0x00000021, - 0x00000002, 0x00040047, 0x000000fa, 0x00000022, 0x00000000, 0x00040047, 0x000000fa, 0x00000021, - 0x00000002, 0x00040047, 0x000000fe, 0x00000022, 0x00000000, 0x00040047, 0x000000fe, 0x00000021, - 0x00000001, 0x00040047, 0x00000102, 0x00000022, 0x00000000, 0x00040047, 0x00000102, 0x00000021, - 0x00000001, 0x00040047, 0x00000106, 0x00000022, 0x00000000, 0x00040047, 0x00000106, 0x00000021, - 0x00000001, 0x00040047, 0x0000010a, 0x00000022, 0x00000000, 0x00040047, 0x0000010a, 0x00000021, - 0x00000002, 0x00040047, 0x0000010e, 0x00000022, 0x00000000, 0x00040047, 0x0000010e, 0x00000021, - 0x00000002, 0x00040047, 0x00000112, 0x00000022, 0x00000000, 0x00040047, 0x00000112, 0x00000021, - 0x00000002, 0x00040047, 0x00000116, 0x00000022, 0x00000000, 0x00040047, 0x00000116, 0x00000021, - 0x00000001, 0x00040047, 0x0000011a, 0x00000022, 0x00000000, 0x00040047, 0x0000011a, 0x00000021, - 0x00000001, 0x00040047, 0x0000011e, 0x00000022, 0x00000000, 0x00040047, 0x0000011e, 0x00000021, - 0x00000001, 0x00040047, 0x00000122, 0x00000022, 0x00000000, 0x00040047, 0x00000122, 0x00000021, - 0x00000002, 0x00040047, 0x00000126, 0x00000022, 0x00000000, 0x00040047, 0x00000126, 0x00000021, - 0x00000002, 0x00040047, 0x0000012a, 0x00000022, 0x00000000, 0x00040047, 0x0000012a, 0x00000021, - 0x00000002, 0x00040047, 0x0000012e, 0x00000022, 0x00000000, 0x00040047, 0x0000012e, 0x00000021, - 0x00000001, 0x00040047, 0x00000132, 0x00000022, 0x00000000, 0x00040047, 0x00000132, 0x00000021, - 0x00000001, 0x00040047, 0x00000136, 0x00000022, 0x00000000, 0x00040047, 0x00000136, 0x00000021, - 0x00000001, 0x00040047, 0x0000013a, 0x00000022, 0x00000000, 0x00040047, 0x0000013a, 0x00000021, - 0x00000002, 0x00040047, 0x0000013e, 0x00000022, 0x00000000, 0x00040047, 0x0000013e, 0x00000021, - 0x00000002, 0x00040047, 0x00000142, 0x00000022, 0x00000000, 0x00040047, 0x00000142, 0x00000021, - 0x00000002, 0x00020013, 0x00000002, 0x00030021, 0x00000003, 0x00000002, 0x00040015, 0x00000006, - 0x00000040, 0x00000000, 0x0003001e, 0x00000007, 0x00000006, 0x00040020, 0x00000008, 0x00000007, - 0x00000007, 0x00040015, 0x00000009, 0x00000020, 0x00000000, 0x00040021, 0x0000000a, 0x00000009, - 0x00000008, 0x0003001e, 0x0000000e, 0x00000006, 0x00040020, 0x0000000f, 0x00000007, 0x0000000e, - 0x00040021, 0x00000010, 0x00000009, 0x0000000f, 0x00030016, 0x00000014, 0x00000020, 0x00040017, - 0x00000015, 0x00000014, 0x00000004, 0x00040020, 0x00000016, 0x00000007, 0x00000015, 0x00040021, - 0x00000017, 0x00000015, 0x00000016, 0x00040015, 0x0000001b, 0x00000020, 0x00000001, 0x0004002b, - 0x0000001b, 0x0000001c, 0x00000000, 0x00040020, 0x0000001d, 0x00000007, 0x00000006, 0x0005002b, - 0x00000006, 0x00000020, 0x000fffff, 0x00000000, 0x00040017, 0x0000002b, 0x00000014, 0x00000003, - 0x00040020, 0x0000002c, 0x00000007, 0x0000002b, 0x0004002b, 0x00000014, 0x00000032, 0x3d25aee6, - 0x0004002b, 0x00000014, 0x00000036, 0x00000000, 0x0004002b, 0x00000014, 0x00000037, 0x3f800000, - 0x0004002b, 0x00000014, 0x0000003d, 0x414eb852, 0x0004002b, 0x00000014, 0x00000042, 0x3d6147ae, - 0x0004002b, 0x00000014, 0x00000045, 0x3f870a3d, 0x0004002b, 0x00000014, 0x00000048, 0x4019999a, - 0x0006002c, 0x0000002b, 0x00000049, 0x00000048, 0x00000048, 0x00000048, 0x0004002b, 0x00000009, - 0x00000051, 0x00000003, 0x00040020, 0x00000052, 0x00000007, 0x00000014, 0x00040020, 0x0000005b, - 0x00000003, 0x00000015, 0x0004003b, 0x0000005b, 0x0000005c, 0x00000003, 0x00040017, 0x0000005d, - 0x00000014, 0x00000002, 0x0004001e, 0x0000005e, 0x00000015, 0x0000005d, 0x00040020, 0x0000005f, - 0x00000001, 0x0000005e, 0x0004003b, 0x0000005f, 0x00000060, 0x00000001, 0x00040020, 0x00000062, - 0x00000001, 0x00000015, 0x00090019, 0x00000066, 0x00000014, 0x00000001, 0x00000000, 0x00000000, - 0x00000000, 0x00000001, 0x00000000, 0x0003001d, 0x00000067, 0x00000066, 0x00040020, 0x00000068, - 0x00000000, 0x00000067, 0x0004003b, 0x00000068, 0x00000069, 0x00000000, 0x00030027, 0x0000006a, - 0x000014e5, 0x00030027, 0x0000006b, 0x000014e5, 0x0003001e, 0x0000006c, 0x00000006, 0x0003001e, - 0x0000006d, 0x00000006, 0x000a001e, 0x0000006e, 0x0000005d, 0x0000005d, 0x00000009, 0x00000009, - 0x0000006a, 0x0000006b, 0x0000006c, 0x0000006d, 0x0005001e, 0x0000006f, 0x0000005d, 0x0000005d, - 0x00000009, 0x0003001e, 0x00000070, 0x0000006f, 0x00040020, 0x0000006a, 0x000014e5, 0x00000070, - 0x0003001e, 0x00000071, 0x00000009, 0x00040020, 0x0000006b, 0x000014e5, 0x00000071, 0x0003001e, - 0x00000072, 0x0000006e, 0x00040020, 0x00000073, 0x00000009, 0x00000072, 0x0004003b, 0x00000073, - 0x00000074, 0x00000009, 0x0004002b, 0x0000001b, 0x00000075, 0x00000006, 0x00040020, 0x00000077, - 0x00000009, 0x0000006c, 0x00040020, 0x0000007c, 0x00000000, 0x00000066, 0x0002001a, 0x0000007f, - 0x0003001d, 0x00000080, 0x0000007f, 0x00040020, 0x00000081, 0x00000000, 0x00000080, 0x0004003b, - 0x00000081, 0x00000082, 0x00000000, 0x0004002b, 0x0000001b, 0x00000083, 0x00000007, 0x00040020, - 0x00000085, 0x00000009, 0x0000006d, 0x00040020, 0x0000008a, 0x00000000, 0x0000007f, 0x0003001b, - 0x0000008d, 0x00000066, 0x0004002b, 0x0000001b, 0x0000008f, 0x00000001, 0x00040020, 0x00000090, - 0x00000001, 0x0000005d, 0x0003001d, 0x00000095, 0x00000006, 0x0003001e, 0x00000096, 0x00000095, - 0x00040020, 0x00000097, 0x0000000c, 0x00000096, 0x0004003b, 0x00000097, 0x00000098, 0x0000000c, - 0x0004002b, 0x00000009, 0x00000099, 0x00000001, 0x0004001c, 0x0000009a, 0x0000007f, 0x00000099, - 0x00040020, 0x0000009b, 0x00000000, 0x0000009a, 0x0004003b, 0x0000009b, 0x0000009c, 0x00000000, - 0x0004003b, 0x0000009b, 0x0000009d, 0x00000000, 0x0004003b, 0x0000009b, 0x0000009e, 0x00000000, - 0x00090019, 0x0000009f, 0x00000014, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, - 0x00000000, 0x0004001c, 0x000000a0, 0x0000009f, 0x00000099, 0x00040020, 0x000000a1, 0x00000000, - 0x000000a0, 0x0004003b, 0x000000a1, 0x000000a2, 0x00000000, 0x00090019, 0x000000a3, 0x0000001b, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x000000a4, - 0x000000a3, 0x00000099, 0x00040020, 0x000000a5, 0x00000000, 0x000000a4, 0x0004003b, 0x000000a5, - 0x000000a6, 0x00000000, 0x00090019, 0x000000a7, 0x00000009, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x000000a8, 0x000000a7, 0x00000099, 0x00040020, - 0x000000a9, 0x00000000, 0x000000a8, 0x0004003b, 0x000000a9, 0x000000aa, 0x00000000, 0x00090019, - 0x000000ab, 0x00000014, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, - 0x0004001c, 0x000000ac, 0x000000ab, 0x00000099, 0x00040020, 0x000000ad, 0x00000000, 0x000000ac, - 0x0004003b, 0x000000ad, 0x000000ae, 0x00000000, 0x00090019, 0x000000af, 0x0000001b, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x000000b0, 0x000000af, - 0x00000099, 0x00040020, 0x000000b1, 0x00000000, 0x000000b0, 0x0004003b, 0x000000b1, 0x000000b2, - 0x00000000, 0x00090019, 0x000000b3, 0x00000009, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000001, 0x00000000, 0x0004001c, 0x000000b4, 0x000000b3, 0x00000099, 0x00040020, 0x000000b5, - 0x00000000, 0x000000b4, 0x0004003b, 0x000000b5, 0x000000b6, 0x00000000, 0x00090019, 0x000000b7, - 0x00000014, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, - 0x000000b8, 0x000000b7, 0x00000099, 0x00040020, 0x000000b9, 0x00000000, 0x000000b8, 0x0004003b, - 0x000000b9, 0x000000ba, 0x00000000, 0x00090019, 0x000000bb, 0x0000001b, 0x00000001, 0x00000000, - 0x00000000, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x000000bc, 0x000000bb, 0x00000099, - 0x00040020, 0x000000bd, 0x00000000, 0x000000bc, 0x0004003b, 0x000000bd, 0x000000be, 0x00000000, - 0x00090019, 0x000000bf, 0x00000009, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000002, - 0x00000000, 0x0004001c, 0x000000c0, 0x000000bf, 0x00000099, 0x00040020, 0x000000c1, 0x00000000, - 0x000000c0, 0x0004003b, 0x000000c1, 0x000000c2, 0x00000000, 0x00090019, 0x000000c3, 0x0000001b, - 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x000000c4, - 0x000000c3, 0x00000099, 0x00040020, 0x000000c5, 0x00000000, 0x000000c4, 0x0004003b, 0x000000c5, - 0x000000c6, 0x00000000, 0x00090019, 0x000000c7, 0x00000009, 0x00000001, 0x00000000, 0x00000000, - 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x000000c8, 0x000000c7, 0x00000099, 0x00040020, - 0x000000c9, 0x00000000, 0x000000c8, 0x0004003b, 0x000000c9, 0x000000ca, 0x00000000, 0x00090019, - 0x000000cb, 0x00000014, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0x00000000, - 0x0004001c, 0x000000cc, 0x000000cb, 0x00000099, 0x00040020, 0x000000cd, 0x00000000, 0x000000cc, - 0x0004003b, 0x000000cd, 0x000000ce, 0x00000000, 0x00090019, 0x000000cf, 0x0000001b, 0x00000002, - 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x000000d0, 0x000000cf, - 0x00000099, 0x00040020, 0x000000d1, 0x00000000, 0x000000d0, 0x0004003b, 0x000000d1, 0x000000d2, - 0x00000000, 0x00090019, 0x000000d3, 0x00000009, 0x00000002, 0x00000000, 0x00000000, 0x00000000, - 0x00000002, 0x00000000, 0x0004001c, 0x000000d4, 0x000000d3, 0x00000099, 0x00040020, 0x000000d5, - 0x00000000, 0x000000d4, 0x0004003b, 0x000000d5, 0x000000d6, 0x00000000, 0x00090019, 0x000000d7, - 0x00000014, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, - 0x000000d8, 0x000000d7, 0x00000099, 0x00040020, 0x000000d9, 0x00000000, 0x000000d8, 0x0004003b, - 0x000000d9, 0x000000da, 0x00000000, 0x00090019, 0x000000db, 0x0000001b, 0x00000002, 0x00000000, - 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x000000dc, 0x000000db, 0x00000099, - 0x00040020, 0x000000dd, 0x00000000, 0x000000dc, 0x0004003b, 0x000000dd, 0x000000de, 0x00000000, - 0x00090019, 0x000000df, 0x00000009, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, - 0x00000000, 0x0004001c, 0x000000e0, 0x000000df, 0x00000099, 0x00040020, 0x000000e1, 0x00000000, - 0x000000e0, 0x0004003b, 0x000000e1, 0x000000e2, 0x00000000, 0x00090019, 0x000000e3, 0x00000014, - 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x000000e4, - 0x000000e3, 0x00000099, 0x00040020, 0x000000e5, 0x00000000, 0x000000e4, 0x0004003b, 0x000000e5, - 0x000000e6, 0x00000000, 0x00090019, 0x000000e7, 0x0000001b, 0x00000003, 0x00000000, 0x00000000, - 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x000000e8, 0x000000e7, 0x00000099, 0x00040020, - 0x000000e9, 0x00000000, 0x000000e8, 0x0004003b, 0x000000e9, 0x000000ea, 0x00000000, 0x00090019, - 0x000000eb, 0x00000009, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0x00000000, - 0x0004001c, 0x000000ec, 0x000000eb, 0x00000099, 0x00040020, 0x000000ed, 0x00000000, 0x000000ec, - 0x0004003b, 0x000000ed, 0x000000ee, 0x00000000, 0x00090019, 0x000000ef, 0x00000014, 0x00000003, - 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x000000f0, 0x000000ef, - 0x00000099, 0x00040020, 0x000000f1, 0x00000000, 0x000000f0, 0x0004003b, 0x000000f1, 0x000000f2, - 0x00000000, 0x00090019, 0x000000f3, 0x0000001b, 0x00000003, 0x00000000, 0x00000000, 0x00000000, - 0x00000001, 0x00000000, 0x0004001c, 0x000000f4, 0x000000f3, 0x00000099, 0x00040020, 0x000000f5, - 0x00000000, 0x000000f4, 0x0004003b, 0x000000f5, 0x000000f6, 0x00000000, 0x00090019, 0x000000f7, - 0x00000009, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, - 0x000000f8, 0x000000f7, 0x00000099, 0x00040020, 0x000000f9, 0x00000000, 0x000000f8, 0x0004003b, - 0x000000f9, 0x000000fa, 0x00000000, 0x00090019, 0x000000fb, 0x00000014, 0x00000003, 0x00000000, - 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x000000fc, 0x000000fb, 0x00000099, - 0x00040020, 0x000000fd, 0x00000000, 0x000000fc, 0x0004003b, 0x000000fd, 0x000000fe, 0x00000000, - 0x00090019, 0x000000ff, 0x0000001b, 0x00000003, 0x00000000, 0x00000001, 0x00000000, 0x00000002, - 0x00000000, 0x0004001c, 0x00000100, 0x000000ff, 0x00000099, 0x00040020, 0x00000101, 0x00000000, - 0x00000100, 0x0004003b, 0x00000101, 0x00000102, 0x00000000, 0x00090019, 0x00000103, 0x00000009, - 0x00000003, 0x00000000, 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x00000104, - 0x00000103, 0x00000099, 0x00040020, 0x00000105, 0x00000000, 0x00000104, 0x0004003b, 0x00000105, - 0x00000106, 0x00000000, 0x00090019, 0x00000107, 0x00000014, 0x00000003, 0x00000000, 0x00000001, - 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x00000108, 0x00000107, 0x00000099, 0x00040020, - 0x00000109, 0x00000000, 0x00000108, 0x0004003b, 0x00000109, 0x0000010a, 0x00000000, 0x00090019, - 0x0000010b, 0x0000001b, 0x00000003, 0x00000000, 0x00000001, 0x00000000, 0x00000001, 0x00000000, - 0x0004001c, 0x0000010c, 0x0000010b, 0x00000099, 0x00040020, 0x0000010d, 0x00000000, 0x0000010c, - 0x0004003b, 0x0000010d, 0x0000010e, 0x00000000, 0x00090019, 0x0000010f, 0x00000009, 0x00000003, - 0x00000000, 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x00000110, 0x0000010f, - 0x00000099, 0x00040020, 0x00000111, 0x00000000, 0x00000110, 0x0004003b, 0x00000111, 0x00000112, - 0x00000000, 0x00090019, 0x00000113, 0x00000014, 0x00000000, 0x00000000, 0x00000001, 0x00000000, - 0x00000002, 0x00000000, 0x0004001c, 0x00000114, 0x00000113, 0x00000099, 0x00040020, 0x00000115, - 0x00000000, 0x00000114, 0x0004003b, 0x00000115, 0x00000116, 0x00000000, 0x00090019, 0x00000117, - 0x0000001b, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, - 0x00000118, 0x00000117, 0x00000099, 0x00040020, 0x00000119, 0x00000000, 0x00000118, 0x0004003b, - 0x00000119, 0x0000011a, 0x00000000, 0x00090019, 0x0000011b, 0x00000009, 0x00000000, 0x00000000, - 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x0000011c, 0x0000011b, 0x00000099, - 0x00040020, 0x0000011d, 0x00000000, 0x0000011c, 0x0004003b, 0x0000011d, 0x0000011e, 0x00000000, - 0x00090019, 0x0000011f, 0x00000014, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x00000001, - 0x00000000, 0x0004001c, 0x00000120, 0x0000011f, 0x00000099, 0x00040020, 0x00000121, 0x00000000, - 0x00000120, 0x0004003b, 0x00000121, 0x00000122, 0x00000000, 0x00090019, 0x00000123, 0x0000001b, - 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x00000124, - 0x00000123, 0x00000099, 0x00040020, 0x00000125, 0x00000000, 0x00000124, 0x0004003b, 0x00000125, - 0x00000126, 0x00000000, 0x00090019, 0x00000127, 0x00000009, 0x00000000, 0x00000000, 0x00000001, - 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x00000128, 0x00000127, 0x00000099, 0x00040020, - 0x00000129, 0x00000000, 0x00000128, 0x0004003b, 0x00000129, 0x0000012a, 0x00000000, 0x00090019, - 0x0000012b, 0x00000014, 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x00000002, 0x00000000, - 0x0004001c, 0x0000012c, 0x0000012b, 0x00000099, 0x00040020, 0x0000012d, 0x00000000, 0x0000012c, - 0x0004003b, 0x0000012d, 0x0000012e, 0x00000000, 0x00090019, 0x0000012f, 0x0000001b, 0x00000001, - 0x00000000, 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x00000130, 0x0000012f, - 0x00000099, 0x00040020, 0x00000131, 0x00000000, 0x00000130, 0x0004003b, 0x00000131, 0x00000132, - 0x00000000, 0x00090019, 0x00000133, 0x00000009, 0x00000001, 0x00000000, 0x00000001, 0x00000000, - 0x00000002, 0x00000000, 0x0004001c, 0x00000134, 0x00000133, 0x00000099, 0x00040020, 0x00000135, - 0x00000000, 0x00000134, 0x0004003b, 0x00000135, 0x00000136, 0x00000000, 0x00090019, 0x00000137, - 0x00000014, 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, - 0x00000138, 0x00000137, 0x00000099, 0x00040020, 0x00000139, 0x00000000, 0x00000138, 0x0004003b, - 0x00000139, 0x0000013a, 0x00000000, 0x00090019, 0x0000013b, 0x0000001b, 0x00000001, 0x00000000, - 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x0000013c, 0x0000013b, 0x00000099, - 0x00040020, 0x0000013d, 0x00000000, 0x0000013c, 0x0004003b, 0x0000013d, 0x0000013e, 0x00000000, - 0x00090019, 0x0000013f, 0x00000009, 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x00000001, - 0x00000000, 0x0004001c, 0x00000140, 0x0000013f, 0x00000099, 0x00040020, 0x00000141, 0x00000000, - 0x00000140, 0x0004003b, 0x00000141, 0x00000142, 0x00000000, 0x00050036, 0x00000002, 0x00000004, - 0x00000000, 0x00000003, 0x000200f8, 0x00000005, 0x0004003b, 0x00000016, 0x00000061, 0x00000007, - 0x0004003b, 0x00000008, 0x00000076, 0x00000007, 0x0004003b, 0x0000000f, 0x00000084, 0x00000007, - 0x00050041, 0x00000062, 0x00000063, 0x00000060, 0x0000001c, 0x0004003d, 0x00000015, 0x00000064, - 0x00000063, 0x0003003e, 0x00000061, 0x00000064, 0x00050039, 0x00000015, 0x00000065, 0x00000019, - 0x00000061, 0x00060041, 0x00000077, 0x00000078, 0x00000074, 0x0000001c, 0x00000075, 0x0004003d, - 0x0000006c, 0x00000079, 0x00000078, 0x00040190, 0x00000007, 0x0000007a, 0x00000079, 0x0003003e, - 0x00000076, 0x0000007a, 0x00050039, 0x00000009, 0x0000007b, 0x0000000c, 0x00000076, 0x00050041, - 0x0000007c, 0x0000007d, 0x00000069, 0x0000007b, 0x0004003d, 0x00000066, 0x0000007e, 0x0000007d, - 0x00060041, 0x00000085, 0x00000086, 0x00000074, 0x0000001c, 0x00000083, 0x0004003d, 0x0000006d, - 0x00000087, 0x00000086, 0x00040190, 0x0000000e, 0x00000088, 0x00000087, 0x0003003e, 0x00000084, - 0x00000088, 0x00050039, 0x00000009, 0x00000089, 0x00000012, 0x00000084, 0x00050041, 0x0000008a, - 0x0000008b, 0x00000082, 0x00000089, 0x0004003d, 0x0000007f, 0x0000008c, 0x0000008b, 0x00050056, - 0x0000008d, 0x0000008e, 0x0000007e, 0x0000008c, 0x00050041, 0x00000090, 0x00000091, 0x00000060, - 0x0000008f, 0x0004003d, 0x0000005d, 0x00000092, 0x00000091, 0x00050057, 0x00000015, 0x00000093, - 0x0000008e, 0x00000092, 0x00050085, 0x00000015, 0x00000094, 0x00000065, 0x00000093, 0x0003003e, - 0x0000005c, 0x00000094, 0x000100fd, 0x00010038, 0x00050036, 0x00000009, 0x0000000c, 0x00000000, - 0x0000000a, 0x00030037, 0x00000008, 0x0000000b, 0x000200f8, 0x0000000d, 0x00050041, 0x0000001d, - 0x0000001e, 0x0000000b, 0x0000001c, 0x0004003d, 0x00000006, 0x0000001f, 0x0000001e, 0x000500c7, - 0x00000006, 0x00000021, 0x0000001f, 0x00000020, 0x00040071, 0x00000009, 0x00000022, 0x00000021, - 0x000200fe, 0x00000022, 0x00010038, 0x00050036, 0x00000009, 0x00000012, 0x00000000, 0x00000010, - 0x00030037, 0x0000000f, 0x00000011, 0x000200f8, 0x00000013, 0x00050041, 0x0000001d, 0x00000025, - 0x00000011, 0x0000001c, 0x0004003d, 0x00000006, 0x00000026, 0x00000025, 0x000500c7, 0x00000006, - 0x00000027, 0x00000026, 0x00000020, 0x00040071, 0x00000009, 0x00000028, 0x00000027, 0x000200fe, - 0x00000028, 0x00010038, 0x00050036, 0x00000015, 0x00000019, 0x00000000, 0x00000017, 0x00030037, - 0x00000016, 0x00000018, 0x000200f8, 0x0000001a, 0x0004003b, 0x0000002c, 0x0000002d, 0x00000007, - 0x0004003b, 0x0000002c, 0x00000030, 0x00000007, 0x0004003b, 0x0000002c, 0x0000003b, 0x00000007, - 0x0004003b, 0x0000002c, 0x00000040, 0x00000007, 0x0004003b, 0x0000002c, 0x0000004b, 0x00000007, - 0x0004003d, 0x00000015, 0x0000002e, 0x00000018, 0x0008004f, 0x0000002b, 0x0000002f, 0x0000002e, - 0x0000002e, 0x00000000, 0x00000001, 0x00000002, 0x0003003e, 0x0000002d, 0x0000002f, 0x0004003d, - 0x0000002b, 0x00000031, 0x0000002d, 0x00060050, 0x0000002b, 0x00000033, 0x00000032, 0x00000032, - 0x00000032, 0x00050083, 0x0000002b, 0x00000034, 0x00000031, 0x00000033, 0x0006000c, 0x0000002b, - 0x00000035, 0x00000001, 0x00000009, 0x00000034, 0x00060050, 0x0000002b, 0x00000038, 0x00000036, - 0x00000036, 0x00000036, 0x00060050, 0x0000002b, 0x00000039, 0x00000037, 0x00000037, 0x00000037, - 0x0008000c, 0x0000002b, 0x0000003a, 0x00000001, 0x0000002b, 0x00000035, 0x00000038, 0x00000039, - 0x0003003e, 0x00000030, 0x0000003a, 0x0004003d, 0x0000002b, 0x0000003c, 0x0000002d, 0x00060050, - 0x0000002b, 0x0000003e, 0x0000003d, 0x0000003d, 0x0000003d, 0x00050088, 0x0000002b, 0x0000003f, - 0x0000003c, 0x0000003e, 0x0003003e, 0x0000003b, 0x0000003f, 0x0004003d, 0x0000002b, 0x00000041, - 0x0000002d, 0x00060050, 0x0000002b, 0x00000043, 0x00000042, 0x00000042, 0x00000042, 0x00050081, - 0x0000002b, 0x00000044, 0x00000041, 0x00000043, 0x00060050, 0x0000002b, 0x00000046, 0x00000045, - 0x00000045, 0x00000045, 0x00050088, 0x0000002b, 0x00000047, 0x00000044, 0x00000046, 0x0007000c, - 0x0000002b, 0x0000004a, 0x00000001, 0x0000001a, 0x00000047, 0x00000049, 0x0003003e, 0x00000040, - 0x0000004a, 0x0004003d, 0x0000002b, 0x0000004c, 0x0000003b, 0x0004003d, 0x0000002b, 0x0000004d, - 0x00000040, 0x0004003d, 0x0000002b, 0x0000004e, 0x00000030, 0x0008000c, 0x0000002b, 0x0000004f, - 0x00000001, 0x0000002e, 0x0000004c, 0x0000004d, 0x0000004e, 0x0003003e, 0x0000004b, 0x0000004f, - 0x0004003d, 0x0000002b, 0x00000050, 0x0000004b, 0x00050041, 0x00000052, 0x00000053, 0x00000018, - 0x00000051, 0x0004003d, 0x00000014, 0x00000054, 0x00000053, 0x00050051, 0x00000014, 0x00000055, - 0x00000050, 0x00000000, 0x00050051, 0x00000014, 0x00000056, 0x00000050, 0x00000001, 0x00050051, - 0x00000014, 0x00000057, 0x00000050, 0x00000002, 0x00070050, 0x00000015, 0x00000058, 0x00000055, - 0x00000056, 0x00000057, 0x00000054, 0x000200fe, 0x00000058, 0x00010038, + 0x41443265, 0x79617272, 0x6c626154, 0x00000065, 0x00070005, 0x00000146, 0x61786164, 0x616d695f, + 0x44326567, 0x6154534d, 0x00656c62, 0x00080005, 0x0000014a, 0x61786164, 0x6d69695f, 0x32656761, + 0x54534d44, 0x656c6261, 0x00000000, 0x00080005, 0x0000014e, 0x61786164, 0x6d69755f, 0x32656761, + 0x54534d44, 0x656c6261, 0x00000000, 0x00080005, 0x00000152, 0x61786164, 0x7865745f, 0x65727574, + 0x534d4432, 0x6c626154, 0x00000065, 0x00080005, 0x00000156, 0x61786164, 0x6574695f, 0x72757478, + 0x4d443265, 0x62615453, 0x0000656c, 0x00080005, 0x0000015a, 0x61786164, 0x6574755f, 0x72757478, + 0x4d443265, 0x62615453, 0x0000656c, 0x00090005, 0x0000015e, 0x61786164, 0x616d695f, 0x44326567, + 0x7241534d, 0x54796172, 0x656c6261, 0x00000000, 0x00090005, 0x00000162, 0x61786164, 0x6d69695f, + 0x32656761, 0x41534d44, 0x79617272, 0x6c626154, 0x00000065, 0x00090005, 0x00000166, 0x61786164, + 0x6d69755f, 0x32656761, 0x41534d44, 0x79617272, 0x6c626154, 0x00000065, 0x00090005, 0x0000016a, + 0x61786164, 0x7865745f, 0x65727574, 0x534d4432, 0x61727241, 0x62615479, 0x0000656c, 0x00090005, + 0x0000016e, 0x61786164, 0x6574695f, 0x72757478, 0x4d443265, 0x72724153, 0x61547961, 0x00656c62, + 0x00090005, 0x00000172, 0x61786164, 0x6574755f, 0x72757478, 0x4d443265, 0x72724153, 0x61547961, + 0x00656c62, 0x00040047, 0x0000005c, 0x0000001e, 0x00000000, 0x00040047, 0x00000060, 0x0000001e, + 0x00000000, 0x00040047, 0x00000069, 0x00000022, 0x00000000, 0x00040047, 0x00000069, 0x00000021, + 0x00000002, 0x00050048, 0x0000006c, 0x00000000, 0x00000023, 0x00000000, 0x00050048, 0x0000006d, + 0x00000000, 0x00000023, 0x00000000, 0x00050048, 0x0000006e, 0x00000000, 0x00000023, 0x00000000, + 0x00050048, 0x0000006e, 0x00000001, 0x00000023, 0x00000008, 0x00050048, 0x0000006e, 0x00000002, + 0x00000023, 0x00000010, 0x00050048, 0x0000006e, 0x00000003, 0x00000023, 0x00000014, 0x00050048, + 0x0000006e, 0x00000004, 0x00000023, 0x00000018, 0x00050048, 0x0000006e, 0x00000005, 0x00000023, + 0x00000020, 0x00050048, 0x0000006e, 0x00000006, 0x00000023, 0x00000028, 0x00050048, 0x0000006e, + 0x00000007, 0x00000023, 0x00000030, 0x00050048, 0x0000006f, 0x00000000, 0x00000023, 0x00000000, + 0x00050048, 0x0000006f, 0x00000001, 0x00000023, 0x00000008, 0x00050048, 0x0000006f, 0x00000002, + 0x00000023, 0x00000010, 0x00040048, 0x00000070, 0x00000000, 0x00000018, 0x00050048, 0x00000070, + 0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x00000070, 0x00000002, 0x00040048, 0x00000071, + 0x00000000, 0x00000018, 0x00050048, 0x00000071, 0x00000000, 0x00000023, 0x00000000, 0x00030047, + 0x00000071, 0x00000002, 0x00050048, 0x00000072, 0x00000000, 0x00000023, 0x00000000, 0x00030047, + 0x00000072, 0x00000002, 0x00040047, 0x00000082, 0x00000022, 0x00000000, 0x00040047, 0x00000082, + 0x00000021, 0x00000003, 0x00040047, 0x00000095, 0x00000006, 0x00000008, 0x00040048, 0x00000096, + 0x00000000, 0x00000013, 0x00040048, 0x00000096, 0x00000000, 0x00000018, 0x00050048, 0x00000096, + 0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x00000096, 0x00000002, 0x00040047, 0x00000098, + 0x00000022, 0x00000000, 0x00040047, 0x00000098, 0x00000021, 0x00000004, 0x00040047, 0x0000009c, + 0x00000022, 0x00000000, 0x00040047, 0x0000009c, 0x00000021, 0x00000003, 0x00040047, 0x0000009d, + 0x00000022, 0x00000000, 0x00040047, 0x0000009d, 0x00000021, 0x00000003, 0x00040047, 0x0000009e, + 0x00000022, 0x00000000, 0x00040047, 0x0000009e, 0x00000021, 0x00000003, 0x00040047, 0x000000a2, + 0x00000022, 0x00000000, 0x00040047, 0x000000a2, 0x00000021, 0x00000001, 0x00040047, 0x000000a6, + 0x00000022, 0x00000000, 0x00040047, 0x000000a6, 0x00000021, 0x00000001, 0x00040047, 0x000000aa, + 0x00000022, 0x00000000, 0x00040047, 0x000000aa, 0x00000021, 0x00000001, 0x00040047, 0x000000ae, + 0x00000022, 0x00000000, 0x00040047, 0x000000ae, 0x00000021, 0x00000002, 0x00040047, 0x000000b2, + 0x00000022, 0x00000000, 0x00040047, 0x000000b2, 0x00000021, 0x00000002, 0x00040047, 0x000000b6, + 0x00000022, 0x00000000, 0x00040047, 0x000000b6, 0x00000021, 0x00000002, 0x00040047, 0x000000ba, + 0x00000022, 0x00000000, 0x00040047, 0x000000ba, 0x00000021, 0x00000001, 0x00040047, 0x000000be, + 0x00000022, 0x00000000, 0x00040047, 0x000000be, 0x00000021, 0x00000001, 0x00040047, 0x000000c2, + 0x00000022, 0x00000000, 0x00040047, 0x000000c2, 0x00000021, 0x00000001, 0x00040047, 0x000000c6, + 0x00000022, 0x00000000, 0x00040047, 0x000000c6, 0x00000021, 0x00000002, 0x00040047, 0x000000ca, + 0x00000022, 0x00000000, 0x00040047, 0x000000ca, 0x00000021, 0x00000002, 0x00040047, 0x000000ce, + 0x00000022, 0x00000000, 0x00040047, 0x000000ce, 0x00000021, 0x00000001, 0x00040047, 0x000000d2, + 0x00000022, 0x00000000, 0x00040047, 0x000000d2, 0x00000021, 0x00000001, 0x00040047, 0x000000d6, + 0x00000022, 0x00000000, 0x00040047, 0x000000d6, 0x00000021, 0x00000001, 0x00040047, 0x000000da, + 0x00000022, 0x00000000, 0x00040047, 0x000000da, 0x00000021, 0x00000002, 0x00040047, 0x000000de, + 0x00000022, 0x00000000, 0x00040047, 0x000000de, 0x00000021, 0x00000002, 0x00040047, 0x000000e2, + 0x00000022, 0x00000000, 0x00040047, 0x000000e2, 0x00000021, 0x00000002, 0x00040047, 0x000000e6, + 0x00000022, 0x00000000, 0x00040047, 0x000000e6, 0x00000021, 0x00000001, 0x00040047, 0x000000ea, + 0x00000022, 0x00000000, 0x00040047, 0x000000ea, 0x00000021, 0x00000001, 0x00040047, 0x000000ee, + 0x00000022, 0x00000000, 0x00040047, 0x000000ee, 0x00000021, 0x00000001, 0x00040047, 0x000000f2, + 0x00000022, 0x00000000, 0x00040047, 0x000000f2, 0x00000021, 0x00000002, 0x00040047, 0x000000f6, + 0x00000022, 0x00000000, 0x00040047, 0x000000f6, 0x00000021, 0x00000002, 0x00040047, 0x000000fa, + 0x00000022, 0x00000000, 0x00040047, 0x000000fa, 0x00000021, 0x00000002, 0x00040047, 0x000000fe, + 0x00000022, 0x00000000, 0x00040047, 0x000000fe, 0x00000021, 0x00000001, 0x00040047, 0x00000102, + 0x00000022, 0x00000000, 0x00040047, 0x00000102, 0x00000021, 0x00000001, 0x00040047, 0x00000106, + 0x00000022, 0x00000000, 0x00040047, 0x00000106, 0x00000021, 0x00000001, 0x00040047, 0x0000010a, + 0x00000022, 0x00000000, 0x00040047, 0x0000010a, 0x00000021, 0x00000002, 0x00040047, 0x0000010e, + 0x00000022, 0x00000000, 0x00040047, 0x0000010e, 0x00000021, 0x00000002, 0x00040047, 0x00000112, + 0x00000022, 0x00000000, 0x00040047, 0x00000112, 0x00000021, 0x00000002, 0x00040047, 0x00000116, + 0x00000022, 0x00000000, 0x00040047, 0x00000116, 0x00000021, 0x00000001, 0x00040047, 0x0000011a, + 0x00000022, 0x00000000, 0x00040047, 0x0000011a, 0x00000021, 0x00000001, 0x00040047, 0x0000011e, + 0x00000022, 0x00000000, 0x00040047, 0x0000011e, 0x00000021, 0x00000001, 0x00040047, 0x00000122, + 0x00000022, 0x00000000, 0x00040047, 0x00000122, 0x00000021, 0x00000002, 0x00040047, 0x00000126, + 0x00000022, 0x00000000, 0x00040047, 0x00000126, 0x00000021, 0x00000002, 0x00040047, 0x0000012a, + 0x00000022, 0x00000000, 0x00040047, 0x0000012a, 0x00000021, 0x00000002, 0x00040047, 0x0000012e, + 0x00000022, 0x00000000, 0x00040047, 0x0000012e, 0x00000021, 0x00000001, 0x00040047, 0x00000132, + 0x00000022, 0x00000000, 0x00040047, 0x00000132, 0x00000021, 0x00000001, 0x00040047, 0x00000136, + 0x00000022, 0x00000000, 0x00040047, 0x00000136, 0x00000021, 0x00000001, 0x00040047, 0x0000013a, + 0x00000022, 0x00000000, 0x00040047, 0x0000013a, 0x00000021, 0x00000002, 0x00040047, 0x0000013e, + 0x00000022, 0x00000000, 0x00040047, 0x0000013e, 0x00000021, 0x00000002, 0x00040047, 0x00000142, + 0x00000022, 0x00000000, 0x00040047, 0x00000142, 0x00000021, 0x00000002, 0x00040047, 0x00000146, + 0x00000022, 0x00000000, 0x00040047, 0x00000146, 0x00000021, 0x00000001, 0x00040047, 0x0000014a, + 0x00000022, 0x00000000, 0x00040047, 0x0000014a, 0x00000021, 0x00000001, 0x00040047, 0x0000014e, + 0x00000022, 0x00000000, 0x00040047, 0x0000014e, 0x00000021, 0x00000001, 0x00040047, 0x00000152, + 0x00000022, 0x00000000, 0x00040047, 0x00000152, 0x00000021, 0x00000002, 0x00040047, 0x00000156, + 0x00000022, 0x00000000, 0x00040047, 0x00000156, 0x00000021, 0x00000002, 0x00040047, 0x0000015a, + 0x00000022, 0x00000000, 0x00040047, 0x0000015a, 0x00000021, 0x00000002, 0x00040047, 0x0000015e, + 0x00000022, 0x00000000, 0x00040047, 0x0000015e, 0x00000021, 0x00000001, 0x00040047, 0x00000162, + 0x00000022, 0x00000000, 0x00040047, 0x00000162, 0x00000021, 0x00000001, 0x00040047, 0x00000166, + 0x00000022, 0x00000000, 0x00040047, 0x00000166, 0x00000021, 0x00000001, 0x00040047, 0x0000016a, + 0x00000022, 0x00000000, 0x00040047, 0x0000016a, 0x00000021, 0x00000002, 0x00040047, 0x0000016e, + 0x00000022, 0x00000000, 0x00040047, 0x0000016e, 0x00000021, 0x00000002, 0x00040047, 0x00000172, + 0x00000022, 0x00000000, 0x00040047, 0x00000172, 0x00000021, 0x00000002, 0x00020013, 0x00000002, + 0x00030021, 0x00000003, 0x00000002, 0x00040015, 0x00000006, 0x00000040, 0x00000000, 0x0003001e, + 0x00000007, 0x00000006, 0x00040020, 0x00000008, 0x00000007, 0x00000007, 0x00040015, 0x00000009, + 0x00000020, 0x00000000, 0x00040021, 0x0000000a, 0x00000009, 0x00000008, 0x0003001e, 0x0000000e, + 0x00000006, 0x00040020, 0x0000000f, 0x00000007, 0x0000000e, 0x00040021, 0x00000010, 0x00000009, + 0x0000000f, 0x00030016, 0x00000014, 0x00000020, 0x00040017, 0x00000015, 0x00000014, 0x00000004, + 0x00040020, 0x00000016, 0x00000007, 0x00000015, 0x00040021, 0x00000017, 0x00000015, 0x00000016, + 0x00040015, 0x0000001b, 0x00000020, 0x00000001, 0x0004002b, 0x0000001b, 0x0000001c, 0x00000000, + 0x00040020, 0x0000001d, 0x00000007, 0x00000006, 0x0005002b, 0x00000006, 0x00000020, 0x000fffff, + 0x00000000, 0x00040017, 0x0000002b, 0x00000014, 0x00000003, 0x00040020, 0x0000002c, 0x00000007, + 0x0000002b, 0x0004002b, 0x00000014, 0x00000032, 0x3d25aee6, 0x0004002b, 0x00000014, 0x00000036, + 0x00000000, 0x0004002b, 0x00000014, 0x00000037, 0x3f800000, 0x0004002b, 0x00000014, 0x0000003d, + 0x414eb852, 0x0004002b, 0x00000014, 0x00000042, 0x3d6147ae, 0x0004002b, 0x00000014, 0x00000045, + 0x3f870a3d, 0x0004002b, 0x00000014, 0x00000048, 0x4019999a, 0x0006002c, 0x0000002b, 0x00000049, + 0x00000048, 0x00000048, 0x00000048, 0x0004002b, 0x00000009, 0x00000051, 0x00000003, 0x00040020, + 0x00000052, 0x00000007, 0x00000014, 0x00040020, 0x0000005b, 0x00000003, 0x00000015, 0x0004003b, + 0x0000005b, 0x0000005c, 0x00000003, 0x00040017, 0x0000005d, 0x00000014, 0x00000002, 0x0004001e, + 0x0000005e, 0x00000015, 0x0000005d, 0x00040020, 0x0000005f, 0x00000001, 0x0000005e, 0x0004003b, + 0x0000005f, 0x00000060, 0x00000001, 0x00040020, 0x00000062, 0x00000001, 0x00000015, 0x00090019, + 0x00000066, 0x00000014, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, + 0x0003001d, 0x00000067, 0x00000066, 0x00040020, 0x00000068, 0x00000000, 0x00000067, 0x0004003b, + 0x00000068, 0x00000069, 0x00000000, 0x00030027, 0x0000006a, 0x000014e5, 0x00030027, 0x0000006b, + 0x000014e5, 0x0003001e, 0x0000006c, 0x00000006, 0x0003001e, 0x0000006d, 0x00000006, 0x000a001e, + 0x0000006e, 0x0000005d, 0x0000005d, 0x00000009, 0x00000009, 0x0000006a, 0x0000006b, 0x0000006c, + 0x0000006d, 0x0005001e, 0x0000006f, 0x0000005d, 0x0000005d, 0x00000009, 0x0003001e, 0x00000070, + 0x0000006f, 0x00040020, 0x0000006a, 0x000014e5, 0x00000070, 0x0003001e, 0x00000071, 0x00000009, + 0x00040020, 0x0000006b, 0x000014e5, 0x00000071, 0x0003001e, 0x00000072, 0x0000006e, 0x00040020, + 0x00000073, 0x00000009, 0x00000072, 0x0004003b, 0x00000073, 0x00000074, 0x00000009, 0x0004002b, + 0x0000001b, 0x00000075, 0x00000006, 0x00040020, 0x00000077, 0x00000009, 0x0000006c, 0x00040020, + 0x0000007c, 0x00000000, 0x00000066, 0x0002001a, 0x0000007f, 0x0003001d, 0x00000080, 0x0000007f, + 0x00040020, 0x00000081, 0x00000000, 0x00000080, 0x0004003b, 0x00000081, 0x00000082, 0x00000000, + 0x0004002b, 0x0000001b, 0x00000083, 0x00000007, 0x00040020, 0x00000085, 0x00000009, 0x0000006d, + 0x00040020, 0x0000008a, 0x00000000, 0x0000007f, 0x0003001b, 0x0000008d, 0x00000066, 0x0004002b, + 0x0000001b, 0x0000008f, 0x00000001, 0x00040020, 0x00000090, 0x00000001, 0x0000005d, 0x0003001d, + 0x00000095, 0x00000006, 0x0003001e, 0x00000096, 0x00000095, 0x00040020, 0x00000097, 0x0000000c, + 0x00000096, 0x0004003b, 0x00000097, 0x00000098, 0x0000000c, 0x0004002b, 0x00000009, 0x00000099, + 0x00000001, 0x0004001c, 0x0000009a, 0x0000007f, 0x00000099, 0x00040020, 0x0000009b, 0x00000000, + 0x0000009a, 0x0004003b, 0x0000009b, 0x0000009c, 0x00000000, 0x0004003b, 0x0000009b, 0x0000009d, + 0x00000000, 0x0004003b, 0x0000009b, 0x0000009e, 0x00000000, 0x00090019, 0x0000009f, 0x00000014, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x000000a0, + 0x0000009f, 0x00000099, 0x00040020, 0x000000a1, 0x00000000, 0x000000a0, 0x0004003b, 0x000000a1, + 0x000000a2, 0x00000000, 0x00090019, 0x000000a3, 0x0000001b, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x000000a4, 0x000000a3, 0x00000099, 0x00040020, + 0x000000a5, 0x00000000, 0x000000a4, 0x0004003b, 0x000000a5, 0x000000a6, 0x00000000, 0x00090019, + 0x000000a7, 0x00000009, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0x00000000, + 0x0004001c, 0x000000a8, 0x000000a7, 0x00000099, 0x00040020, 0x000000a9, 0x00000000, 0x000000a8, + 0x0004003b, 0x000000a9, 0x000000aa, 0x00000000, 0x00090019, 0x000000ab, 0x00000014, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x000000ac, 0x000000ab, + 0x00000099, 0x00040020, 0x000000ad, 0x00000000, 0x000000ac, 0x0004003b, 0x000000ad, 0x000000ae, + 0x00000000, 0x00090019, 0x000000af, 0x0000001b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000001, 0x00000000, 0x0004001c, 0x000000b0, 0x000000af, 0x00000099, 0x00040020, 0x000000b1, + 0x00000000, 0x000000b0, 0x0004003b, 0x000000b1, 0x000000b2, 0x00000000, 0x00090019, 0x000000b3, + 0x00000009, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, + 0x000000b4, 0x000000b3, 0x00000099, 0x00040020, 0x000000b5, 0x00000000, 0x000000b4, 0x0004003b, + 0x000000b5, 0x000000b6, 0x00000000, 0x00090019, 0x000000b7, 0x00000014, 0x00000001, 0x00000000, + 0x00000000, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x000000b8, 0x000000b7, 0x00000099, + 0x00040020, 0x000000b9, 0x00000000, 0x000000b8, 0x0004003b, 0x000000b9, 0x000000ba, 0x00000000, + 0x00090019, 0x000000bb, 0x0000001b, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000002, + 0x00000000, 0x0004001c, 0x000000bc, 0x000000bb, 0x00000099, 0x00040020, 0x000000bd, 0x00000000, + 0x000000bc, 0x0004003b, 0x000000bd, 0x000000be, 0x00000000, 0x00090019, 0x000000bf, 0x00000009, + 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x000000c0, + 0x000000bf, 0x00000099, 0x00040020, 0x000000c1, 0x00000000, 0x000000c0, 0x0004003b, 0x000000c1, + 0x000000c2, 0x00000000, 0x00090019, 0x000000c3, 0x0000001b, 0x00000001, 0x00000000, 0x00000000, + 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x000000c4, 0x000000c3, 0x00000099, 0x00040020, + 0x000000c5, 0x00000000, 0x000000c4, 0x0004003b, 0x000000c5, 0x000000c6, 0x00000000, 0x00090019, + 0x000000c7, 0x00000009, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, + 0x0004001c, 0x000000c8, 0x000000c7, 0x00000099, 0x00040020, 0x000000c9, 0x00000000, 0x000000c8, + 0x0004003b, 0x000000c9, 0x000000ca, 0x00000000, 0x00090019, 0x000000cb, 0x00000014, 0x00000002, + 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x000000cc, 0x000000cb, + 0x00000099, 0x00040020, 0x000000cd, 0x00000000, 0x000000cc, 0x0004003b, 0x000000cd, 0x000000ce, + 0x00000000, 0x00090019, 0x000000cf, 0x0000001b, 0x00000002, 0x00000000, 0x00000000, 0x00000000, + 0x00000002, 0x00000000, 0x0004001c, 0x000000d0, 0x000000cf, 0x00000099, 0x00040020, 0x000000d1, + 0x00000000, 0x000000d0, 0x0004003b, 0x000000d1, 0x000000d2, 0x00000000, 0x00090019, 0x000000d3, + 0x00000009, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, + 0x000000d4, 0x000000d3, 0x00000099, 0x00040020, 0x000000d5, 0x00000000, 0x000000d4, 0x0004003b, + 0x000000d5, 0x000000d6, 0x00000000, 0x00090019, 0x000000d7, 0x00000014, 0x00000002, 0x00000000, + 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x000000d8, 0x000000d7, 0x00000099, + 0x00040020, 0x000000d9, 0x00000000, 0x000000d8, 0x0004003b, 0x000000d9, 0x000000da, 0x00000000, + 0x00090019, 0x000000db, 0x0000001b, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, + 0x00000000, 0x0004001c, 0x000000dc, 0x000000db, 0x00000099, 0x00040020, 0x000000dd, 0x00000000, + 0x000000dc, 0x0004003b, 0x000000dd, 0x000000de, 0x00000000, 0x00090019, 0x000000df, 0x00000009, + 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x000000e0, + 0x000000df, 0x00000099, 0x00040020, 0x000000e1, 0x00000000, 0x000000e0, 0x0004003b, 0x000000e1, + 0x000000e2, 0x00000000, 0x00090019, 0x000000e3, 0x00000014, 0x00000003, 0x00000000, 0x00000000, + 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x000000e4, 0x000000e3, 0x00000099, 0x00040020, + 0x000000e5, 0x00000000, 0x000000e4, 0x0004003b, 0x000000e5, 0x000000e6, 0x00000000, 0x00090019, + 0x000000e7, 0x0000001b, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0x00000000, + 0x0004001c, 0x000000e8, 0x000000e7, 0x00000099, 0x00040020, 0x000000e9, 0x00000000, 0x000000e8, + 0x0004003b, 0x000000e9, 0x000000ea, 0x00000000, 0x00090019, 0x000000eb, 0x00000009, 0x00000003, + 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x000000ec, 0x000000eb, + 0x00000099, 0x00040020, 0x000000ed, 0x00000000, 0x000000ec, 0x0004003b, 0x000000ed, 0x000000ee, + 0x00000000, 0x00090019, 0x000000ef, 0x00000014, 0x00000003, 0x00000000, 0x00000000, 0x00000000, + 0x00000001, 0x00000000, 0x0004001c, 0x000000f0, 0x000000ef, 0x00000099, 0x00040020, 0x000000f1, + 0x00000000, 0x000000f0, 0x0004003b, 0x000000f1, 0x000000f2, 0x00000000, 0x00090019, 0x000000f3, + 0x0000001b, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, + 0x000000f4, 0x000000f3, 0x00000099, 0x00040020, 0x000000f5, 0x00000000, 0x000000f4, 0x0004003b, + 0x000000f5, 0x000000f6, 0x00000000, 0x00090019, 0x000000f7, 0x00000009, 0x00000003, 0x00000000, + 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x000000f8, 0x000000f7, 0x00000099, + 0x00040020, 0x000000f9, 0x00000000, 0x000000f8, 0x0004003b, 0x000000f9, 0x000000fa, 0x00000000, + 0x00090019, 0x000000fb, 0x00000014, 0x00000003, 0x00000000, 0x00000001, 0x00000000, 0x00000002, + 0x00000000, 0x0004001c, 0x000000fc, 0x000000fb, 0x00000099, 0x00040020, 0x000000fd, 0x00000000, + 0x000000fc, 0x0004003b, 0x000000fd, 0x000000fe, 0x00000000, 0x00090019, 0x000000ff, 0x0000001b, + 0x00000003, 0x00000000, 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x00000100, + 0x000000ff, 0x00000099, 0x00040020, 0x00000101, 0x00000000, 0x00000100, 0x0004003b, 0x00000101, + 0x00000102, 0x00000000, 0x00090019, 0x00000103, 0x00000009, 0x00000003, 0x00000000, 0x00000001, + 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x00000104, 0x00000103, 0x00000099, 0x00040020, + 0x00000105, 0x00000000, 0x00000104, 0x0004003b, 0x00000105, 0x00000106, 0x00000000, 0x00090019, + 0x00000107, 0x00000014, 0x00000003, 0x00000000, 0x00000001, 0x00000000, 0x00000001, 0x00000000, + 0x0004001c, 0x00000108, 0x00000107, 0x00000099, 0x00040020, 0x00000109, 0x00000000, 0x00000108, + 0x0004003b, 0x00000109, 0x0000010a, 0x00000000, 0x00090019, 0x0000010b, 0x0000001b, 0x00000003, + 0x00000000, 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x0000010c, 0x0000010b, + 0x00000099, 0x00040020, 0x0000010d, 0x00000000, 0x0000010c, 0x0004003b, 0x0000010d, 0x0000010e, + 0x00000000, 0x00090019, 0x0000010f, 0x00000009, 0x00000003, 0x00000000, 0x00000001, 0x00000000, + 0x00000001, 0x00000000, 0x0004001c, 0x00000110, 0x0000010f, 0x00000099, 0x00040020, 0x00000111, + 0x00000000, 0x00000110, 0x0004003b, 0x00000111, 0x00000112, 0x00000000, 0x00090019, 0x00000113, + 0x00000014, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, + 0x00000114, 0x00000113, 0x00000099, 0x00040020, 0x00000115, 0x00000000, 0x00000114, 0x0004003b, + 0x00000115, 0x00000116, 0x00000000, 0x00090019, 0x00000117, 0x0000001b, 0x00000000, 0x00000000, + 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x00000118, 0x00000117, 0x00000099, + 0x00040020, 0x00000119, 0x00000000, 0x00000118, 0x0004003b, 0x00000119, 0x0000011a, 0x00000000, + 0x00090019, 0x0000011b, 0x00000009, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x00000002, + 0x00000000, 0x0004001c, 0x0000011c, 0x0000011b, 0x00000099, 0x00040020, 0x0000011d, 0x00000000, + 0x0000011c, 0x0004003b, 0x0000011d, 0x0000011e, 0x00000000, 0x00090019, 0x0000011f, 0x00000014, + 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x00000120, + 0x0000011f, 0x00000099, 0x00040020, 0x00000121, 0x00000000, 0x00000120, 0x0004003b, 0x00000121, + 0x00000122, 0x00000000, 0x00090019, 0x00000123, 0x0000001b, 0x00000000, 0x00000000, 0x00000001, + 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x00000124, 0x00000123, 0x00000099, 0x00040020, + 0x00000125, 0x00000000, 0x00000124, 0x0004003b, 0x00000125, 0x00000126, 0x00000000, 0x00090019, + 0x00000127, 0x00000009, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x00000001, 0x00000000, + 0x0004001c, 0x00000128, 0x00000127, 0x00000099, 0x00040020, 0x00000129, 0x00000000, 0x00000128, + 0x0004003b, 0x00000129, 0x0000012a, 0x00000000, 0x00090019, 0x0000012b, 0x00000014, 0x00000001, + 0x00000000, 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x0000012c, 0x0000012b, + 0x00000099, 0x00040020, 0x0000012d, 0x00000000, 0x0000012c, 0x0004003b, 0x0000012d, 0x0000012e, + 0x00000000, 0x00090019, 0x0000012f, 0x0000001b, 0x00000001, 0x00000000, 0x00000001, 0x00000000, + 0x00000002, 0x00000000, 0x0004001c, 0x00000130, 0x0000012f, 0x00000099, 0x00040020, 0x00000131, + 0x00000000, 0x00000130, 0x0004003b, 0x00000131, 0x00000132, 0x00000000, 0x00090019, 0x00000133, + 0x00000009, 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, + 0x00000134, 0x00000133, 0x00000099, 0x00040020, 0x00000135, 0x00000000, 0x00000134, 0x0004003b, + 0x00000135, 0x00000136, 0x00000000, 0x00090019, 0x00000137, 0x00000014, 0x00000001, 0x00000000, + 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x00000138, 0x00000137, 0x00000099, + 0x00040020, 0x00000139, 0x00000000, 0x00000138, 0x0004003b, 0x00000139, 0x0000013a, 0x00000000, + 0x00090019, 0x0000013b, 0x0000001b, 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x00000001, + 0x00000000, 0x0004001c, 0x0000013c, 0x0000013b, 0x00000099, 0x00040020, 0x0000013d, 0x00000000, + 0x0000013c, 0x0004003b, 0x0000013d, 0x0000013e, 0x00000000, 0x00090019, 0x0000013f, 0x00000009, + 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x00000140, + 0x0000013f, 0x00000099, 0x00040020, 0x00000141, 0x00000000, 0x00000140, 0x0004003b, 0x00000141, + 0x00000142, 0x00000000, 0x00090019, 0x00000143, 0x00000014, 0x00000001, 0x00000000, 0x00000000, + 0x00000001, 0x00000002, 0x00000000, 0x0004001c, 0x00000144, 0x00000143, 0x00000099, 0x00040020, + 0x00000145, 0x00000000, 0x00000144, 0x0004003b, 0x00000145, 0x00000146, 0x00000000, 0x00090019, + 0x00000147, 0x0000001b, 0x00000001, 0x00000000, 0x00000000, 0x00000001, 0x00000002, 0x00000000, + 0x0004001c, 0x00000148, 0x00000147, 0x00000099, 0x00040020, 0x00000149, 0x00000000, 0x00000148, + 0x0004003b, 0x00000149, 0x0000014a, 0x00000000, 0x00090019, 0x0000014b, 0x00000009, 0x00000001, + 0x00000000, 0x00000000, 0x00000001, 0x00000002, 0x00000000, 0x0004001c, 0x0000014c, 0x0000014b, + 0x00000099, 0x00040020, 0x0000014d, 0x00000000, 0x0000014c, 0x0004003b, 0x0000014d, 0x0000014e, + 0x00000000, 0x00090019, 0x0000014f, 0x00000014, 0x00000001, 0x00000000, 0x00000000, 0x00000001, + 0x00000001, 0x00000000, 0x0004001c, 0x00000150, 0x0000014f, 0x00000099, 0x00040020, 0x00000151, + 0x00000000, 0x00000150, 0x0004003b, 0x00000151, 0x00000152, 0x00000000, 0x00090019, 0x00000153, + 0x0000001b, 0x00000001, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000000, 0x0004001c, + 0x00000154, 0x00000153, 0x00000099, 0x00040020, 0x00000155, 0x00000000, 0x00000154, 0x0004003b, + 0x00000155, 0x00000156, 0x00000000, 0x00090019, 0x00000157, 0x00000009, 0x00000001, 0x00000000, + 0x00000000, 0x00000001, 0x00000001, 0x00000000, 0x0004001c, 0x00000158, 0x00000157, 0x00000099, + 0x00040020, 0x00000159, 0x00000000, 0x00000158, 0x0004003b, 0x00000159, 0x0000015a, 0x00000000, + 0x00090019, 0x0000015b, 0x00000014, 0x00000001, 0x00000000, 0x00000001, 0x00000001, 0x00000002, + 0x00000000, 0x0004001c, 0x0000015c, 0x0000015b, 0x00000099, 0x00040020, 0x0000015d, 0x00000000, + 0x0000015c, 0x0004003b, 0x0000015d, 0x0000015e, 0x00000000, 0x00090019, 0x0000015f, 0x0000001b, + 0x00000001, 0x00000000, 0x00000001, 0x00000001, 0x00000002, 0x00000000, 0x0004001c, 0x00000160, + 0x0000015f, 0x00000099, 0x00040020, 0x00000161, 0x00000000, 0x00000160, 0x0004003b, 0x00000161, + 0x00000162, 0x00000000, 0x00090019, 0x00000163, 0x00000009, 0x00000001, 0x00000000, 0x00000001, + 0x00000001, 0x00000002, 0x00000000, 0x0004001c, 0x00000164, 0x00000163, 0x00000099, 0x00040020, + 0x00000165, 0x00000000, 0x00000164, 0x0004003b, 0x00000165, 0x00000166, 0x00000000, 0x00090019, + 0x00000167, 0x00000014, 0x00000001, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000000, + 0x0004001c, 0x00000168, 0x00000167, 0x00000099, 0x00040020, 0x00000169, 0x00000000, 0x00000168, + 0x0004003b, 0x00000169, 0x0000016a, 0x00000000, 0x00090019, 0x0000016b, 0x0000001b, 0x00000001, + 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000000, 0x0004001c, 0x0000016c, 0x0000016b, + 0x00000099, 0x00040020, 0x0000016d, 0x00000000, 0x0000016c, 0x0004003b, 0x0000016d, 0x0000016e, + 0x00000000, 0x00090019, 0x0000016f, 0x00000009, 0x00000001, 0x00000000, 0x00000001, 0x00000001, + 0x00000001, 0x00000000, 0x0004001c, 0x00000170, 0x0000016f, 0x00000099, 0x00040020, 0x00000171, + 0x00000000, 0x00000170, 0x0004003b, 0x00000171, 0x00000172, 0x00000000, 0x00050036, 0x00000002, + 0x00000004, 0x00000000, 0x00000003, 0x000200f8, 0x00000005, 0x0004003b, 0x00000016, 0x00000061, + 0x00000007, 0x0004003b, 0x00000008, 0x00000076, 0x00000007, 0x0004003b, 0x0000000f, 0x00000084, + 0x00000007, 0x00050041, 0x00000062, 0x00000063, 0x00000060, 0x0000001c, 0x0004003d, 0x00000015, + 0x00000064, 0x00000063, 0x0003003e, 0x00000061, 0x00000064, 0x00050039, 0x00000015, 0x00000065, + 0x00000019, 0x00000061, 0x00060041, 0x00000077, 0x00000078, 0x00000074, 0x0000001c, 0x00000075, + 0x0004003d, 0x0000006c, 0x00000079, 0x00000078, 0x00040190, 0x00000007, 0x0000007a, 0x00000079, + 0x0003003e, 0x00000076, 0x0000007a, 0x00050039, 0x00000009, 0x0000007b, 0x0000000c, 0x00000076, + 0x00050041, 0x0000007c, 0x0000007d, 0x00000069, 0x0000007b, 0x0004003d, 0x00000066, 0x0000007e, + 0x0000007d, 0x00060041, 0x00000085, 0x00000086, 0x00000074, 0x0000001c, 0x00000083, 0x0004003d, + 0x0000006d, 0x00000087, 0x00000086, 0x00040190, 0x0000000e, 0x00000088, 0x00000087, 0x0003003e, + 0x00000084, 0x00000088, 0x00050039, 0x00000009, 0x00000089, 0x00000012, 0x00000084, 0x00050041, + 0x0000008a, 0x0000008b, 0x00000082, 0x00000089, 0x0004003d, 0x0000007f, 0x0000008c, 0x0000008b, + 0x00050056, 0x0000008d, 0x0000008e, 0x0000007e, 0x0000008c, 0x00050041, 0x00000090, 0x00000091, + 0x00000060, 0x0000008f, 0x0004003d, 0x0000005d, 0x00000092, 0x00000091, 0x00050057, 0x00000015, + 0x00000093, 0x0000008e, 0x00000092, 0x00050085, 0x00000015, 0x00000094, 0x00000065, 0x00000093, + 0x0003003e, 0x0000005c, 0x00000094, 0x000100fd, 0x00010038, 0x00050036, 0x00000009, 0x0000000c, + 0x00000000, 0x0000000a, 0x00030037, 0x00000008, 0x0000000b, 0x000200f8, 0x0000000d, 0x00050041, + 0x0000001d, 0x0000001e, 0x0000000b, 0x0000001c, 0x0004003d, 0x00000006, 0x0000001f, 0x0000001e, + 0x000500c7, 0x00000006, 0x00000021, 0x0000001f, 0x00000020, 0x00040071, 0x00000009, 0x00000022, + 0x00000021, 0x000200fe, 0x00000022, 0x00010038, 0x00050036, 0x00000009, 0x00000012, 0x00000000, + 0x00000010, 0x00030037, 0x0000000f, 0x00000011, 0x000200f8, 0x00000013, 0x00050041, 0x0000001d, + 0x00000025, 0x00000011, 0x0000001c, 0x0004003d, 0x00000006, 0x00000026, 0x00000025, 0x000500c7, + 0x00000006, 0x00000027, 0x00000026, 0x00000020, 0x00040071, 0x00000009, 0x00000028, 0x00000027, + 0x000200fe, 0x00000028, 0x00010038, 0x00050036, 0x00000015, 0x00000019, 0x00000000, 0x00000017, + 0x00030037, 0x00000016, 0x00000018, 0x000200f8, 0x0000001a, 0x0004003b, 0x0000002c, 0x0000002d, + 0x00000007, 0x0004003b, 0x0000002c, 0x00000030, 0x00000007, 0x0004003b, 0x0000002c, 0x0000003b, + 0x00000007, 0x0004003b, 0x0000002c, 0x00000040, 0x00000007, 0x0004003b, 0x0000002c, 0x0000004b, + 0x00000007, 0x0004003d, 0x00000015, 0x0000002e, 0x00000018, 0x0008004f, 0x0000002b, 0x0000002f, + 0x0000002e, 0x0000002e, 0x00000000, 0x00000001, 0x00000002, 0x0003003e, 0x0000002d, 0x0000002f, + 0x0004003d, 0x0000002b, 0x00000031, 0x0000002d, 0x00060050, 0x0000002b, 0x00000033, 0x00000032, + 0x00000032, 0x00000032, 0x00050083, 0x0000002b, 0x00000034, 0x00000031, 0x00000033, 0x0006000c, + 0x0000002b, 0x00000035, 0x00000001, 0x00000009, 0x00000034, 0x00060050, 0x0000002b, 0x00000038, + 0x00000036, 0x00000036, 0x00000036, 0x00060050, 0x0000002b, 0x00000039, 0x00000037, 0x00000037, + 0x00000037, 0x0008000c, 0x0000002b, 0x0000003a, 0x00000001, 0x0000002b, 0x00000035, 0x00000038, + 0x00000039, 0x0003003e, 0x00000030, 0x0000003a, 0x0004003d, 0x0000002b, 0x0000003c, 0x0000002d, + 0x00060050, 0x0000002b, 0x0000003e, 0x0000003d, 0x0000003d, 0x0000003d, 0x00050088, 0x0000002b, + 0x0000003f, 0x0000003c, 0x0000003e, 0x0003003e, 0x0000003b, 0x0000003f, 0x0004003d, 0x0000002b, + 0x00000041, 0x0000002d, 0x00060050, 0x0000002b, 0x00000043, 0x00000042, 0x00000042, 0x00000042, + 0x00050081, 0x0000002b, 0x00000044, 0x00000041, 0x00000043, 0x00060050, 0x0000002b, 0x00000046, + 0x00000045, 0x00000045, 0x00000045, 0x00050088, 0x0000002b, 0x00000047, 0x00000044, 0x00000046, + 0x0007000c, 0x0000002b, 0x0000004a, 0x00000001, 0x0000001a, 0x00000047, 0x00000049, 0x0003003e, + 0x00000040, 0x0000004a, 0x0004003d, 0x0000002b, 0x0000004c, 0x0000003b, 0x0004003d, 0x0000002b, + 0x0000004d, 0x00000040, 0x0004003d, 0x0000002b, 0x0000004e, 0x00000030, 0x0008000c, 0x0000002b, + 0x0000004f, 0x00000001, 0x0000002e, 0x0000004c, 0x0000004d, 0x0000004e, 0x0003003e, 0x0000004b, + 0x0000004f, 0x0004003d, 0x0000002b, 0x00000050, 0x0000004b, 0x00050041, 0x00000052, 0x00000053, + 0x00000018, 0x00000051, 0x0004003d, 0x00000014, 0x00000054, 0x00000053, 0x00050051, 0x00000014, + 0x00000055, 0x00000050, 0x00000000, 0x00050051, 0x00000014, 0x00000056, 0x00000050, 0x00000001, + 0x00050051, 0x00000014, 0x00000057, 0x00000050, 0x00000002, 0x00070050, 0x00000015, 0x00000058, + 0x00000055, 0x00000056, 0x00000057, 0x00000054, 0x000200fe, 0x00000058, 0x00010038, // clang-format on }; -static constexpr auto imgui_gamma_frag_spv = std::array{ +static constexpr auto imgui_gamma_frag_spv = std::array{ // clang-format off - 0x07230203, 0x00010500, 0x0008000b, 0x0000016e, 0x00000000, 0x00020011, 0x00000001, 0x00020011, - 0x0000000b, 0x00020011, 0x00000022, 0x00020011, 0x0000002b, 0x00020011, 0x0000002c, 0x00020011, - 0x0000002d, 0x00020011, 0x000014b6, 0x00020011, 0x000014e3, 0x0006000b, 0x00000001, 0x4c534c47, - 0x6474732e, 0x3035342e, 0x00000000, 0x0003000e, 0x000014e4, 0x00000001, 0x0037000f, 0x00000004, - 0x00000004, 0x6e69616d, 0x00000000, 0x00000084, 0x00000088, 0x00000091, 0x0000009c, 0x000000aa, - 0x000000c3, 0x000000c7, 0x000000c8, 0x000000c9, 0x000000cd, 0x000000d1, 0x000000d5, 0x000000d9, - 0x000000dd, 0x000000e1, 0x000000e5, 0x000000e9, 0x000000ed, 0x000000f1, 0x000000f5, 0x000000f9, - 0x000000fd, 0x00000101, 0x00000105, 0x00000109, 0x0000010d, 0x00000111, 0x00000115, 0x00000119, - 0x0000011d, 0x00000121, 0x00000125, 0x00000129, 0x0000012d, 0x00000131, 0x00000135, 0x00000139, - 0x0000013d, 0x00000141, 0x00000145, 0x00000149, 0x0000014d, 0x00000151, 0x00000155, 0x00000159, - 0x0000015d, 0x00000161, 0x00000165, 0x00000169, 0x0000016d, 0x00030010, 0x00000004, 0x00000007, + 0x07230203, 0x00010500, 0x0008000b, 0x0000019e, 0x00000000, 0x00020011, 0x00000001, 0x00020011, + 0x0000000b, 0x00020011, 0x0000001b, 0x00020011, 0x00000022, 0x00020011, 0x0000002b, 0x00020011, + 0x0000002c, 0x00020011, 0x0000002d, 0x00020011, 0x00000030, 0x00020011, 0x000014b6, 0x00020011, + 0x000014e3, 0x0006000b, 0x00000001, 0x4c534c47, 0x6474732e, 0x3035342e, 0x00000000, 0x0003000e, + 0x000014e4, 0x00000001, 0x0043000f, 0x00000004, 0x00000004, 0x6e69616d, 0x00000000, 0x00000084, + 0x00000088, 0x00000091, 0x0000009c, 0x000000aa, 0x000000c3, 0x000000c7, 0x000000c8, 0x000000c9, + 0x000000cd, 0x000000d1, 0x000000d5, 0x000000d9, 0x000000dd, 0x000000e1, 0x000000e5, 0x000000e9, + 0x000000ed, 0x000000f1, 0x000000f5, 0x000000f9, 0x000000fd, 0x00000101, 0x00000105, 0x00000109, + 0x0000010d, 0x00000111, 0x00000115, 0x00000119, 0x0000011d, 0x00000121, 0x00000125, 0x00000129, + 0x0000012d, 0x00000131, 0x00000135, 0x00000139, 0x0000013d, 0x00000141, 0x00000145, 0x00000149, + 0x0000014d, 0x00000151, 0x00000155, 0x00000159, 0x0000015d, 0x00000161, 0x00000165, 0x00000169, + 0x0000016d, 0x00000171, 0x00000175, 0x00000179, 0x0000017d, 0x00000181, 0x00000185, 0x00000189, + 0x0000018d, 0x00000191, 0x00000195, 0x00000199, 0x0000019d, 0x00030010, 0x00000004, 0x00000007, 0x00030003, 0x00000002, 0x000001cc, 0x00070004, 0x455f4c47, 0x625f5458, 0x65666675, 0x65725f72, 0x65726566, 0x0065636e, 0x00080004, 0x455f4c47, 0x625f5458, 0x65666675, 0x65725f72, 0x65726566, 0x3265636e, 0x00000000, 0x00090004, 0x455f4c47, 0x635f5458, 0x72746e6f, 0x665f6c6f, 0x5f776f6c, @@ -867,291 +985,347 @@ static constexpr auto imgui_gamma_frag_spv = std::array{ 0x00000165, 0x61786164, 0x7865745f, 0x65727574, 0x72414432, 0x54796172, 0x656c6261, 0x00000000, 0x00090005, 0x00000169, 0x61786164, 0x6574695f, 0x72757478, 0x41443265, 0x79617272, 0x6c626154, 0x00000065, 0x00090005, 0x0000016d, 0x61786164, 0x6574755f, 0x72757478, 0x41443265, 0x79617272, - 0x6c626154, 0x00000065, 0x00040047, 0x00000084, 0x0000001e, 0x00000000, 0x00040047, 0x00000088, - 0x0000001e, 0x00000000, 0x00040047, 0x00000091, 0x00000022, 0x00000000, 0x00040047, 0x00000091, - 0x00000021, 0x00000002, 0x00050048, 0x00000094, 0x00000000, 0x00000023, 0x00000000, 0x00050048, - 0x00000095, 0x00000000, 0x00000023, 0x00000000, 0x00050048, 0x00000096, 0x00000000, 0x00000023, - 0x00000000, 0x00050048, 0x00000096, 0x00000001, 0x00000023, 0x00000008, 0x00050048, 0x00000096, - 0x00000002, 0x00000023, 0x00000010, 0x00050048, 0x00000096, 0x00000003, 0x00000023, 0x00000014, - 0x00050048, 0x00000096, 0x00000004, 0x00000023, 0x00000018, 0x00050048, 0x00000096, 0x00000005, - 0x00000023, 0x00000020, 0x00050048, 0x00000096, 0x00000006, 0x00000023, 0x00000028, 0x00050048, - 0x00000096, 0x00000007, 0x00000023, 0x00000030, 0x00050048, 0x00000097, 0x00000000, 0x00000023, - 0x00000000, 0x00050048, 0x00000097, 0x00000001, 0x00000023, 0x00000008, 0x00050048, 0x00000097, - 0x00000002, 0x00000023, 0x00000010, 0x00040048, 0x00000098, 0x00000000, 0x00000018, 0x00050048, - 0x00000098, 0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x00000098, 0x00000002, 0x00040048, - 0x00000099, 0x00000000, 0x00000018, 0x00050048, 0x00000099, 0x00000000, 0x00000023, 0x00000000, - 0x00030047, 0x00000099, 0x00000002, 0x00050048, 0x0000009a, 0x00000000, 0x00000023, 0x00000000, - 0x00030047, 0x0000009a, 0x00000002, 0x00040047, 0x000000aa, 0x00000022, 0x00000000, 0x00040047, - 0x000000aa, 0x00000021, 0x00000003, 0x00040047, 0x000000c0, 0x00000006, 0x00000008, 0x00040048, - 0x000000c1, 0x00000000, 0x00000013, 0x00040048, 0x000000c1, 0x00000000, 0x00000018, 0x00050048, - 0x000000c1, 0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x000000c1, 0x00000002, 0x00040047, - 0x000000c3, 0x00000022, 0x00000000, 0x00040047, 0x000000c3, 0x00000021, 0x00000004, 0x00040047, - 0x000000c7, 0x00000022, 0x00000000, 0x00040047, 0x000000c7, 0x00000021, 0x00000003, 0x00040047, - 0x000000c8, 0x00000022, 0x00000000, 0x00040047, 0x000000c8, 0x00000021, 0x00000003, 0x00040047, - 0x000000c9, 0x00000022, 0x00000000, 0x00040047, 0x000000c9, 0x00000021, 0x00000003, 0x00040047, - 0x000000cd, 0x00000022, 0x00000000, 0x00040047, 0x000000cd, 0x00000021, 0x00000001, 0x00040047, - 0x000000d1, 0x00000022, 0x00000000, 0x00040047, 0x000000d1, 0x00000021, 0x00000001, 0x00040047, - 0x000000d5, 0x00000022, 0x00000000, 0x00040047, 0x000000d5, 0x00000021, 0x00000001, 0x00040047, - 0x000000d9, 0x00000022, 0x00000000, 0x00040047, 0x000000d9, 0x00000021, 0x00000002, 0x00040047, - 0x000000dd, 0x00000022, 0x00000000, 0x00040047, 0x000000dd, 0x00000021, 0x00000002, 0x00040047, - 0x000000e1, 0x00000022, 0x00000000, 0x00040047, 0x000000e1, 0x00000021, 0x00000002, 0x00040047, - 0x000000e5, 0x00000022, 0x00000000, 0x00040047, 0x000000e5, 0x00000021, 0x00000001, 0x00040047, - 0x000000e9, 0x00000022, 0x00000000, 0x00040047, 0x000000e9, 0x00000021, 0x00000001, 0x00040047, - 0x000000ed, 0x00000022, 0x00000000, 0x00040047, 0x000000ed, 0x00000021, 0x00000001, 0x00040047, - 0x000000f1, 0x00000022, 0x00000000, 0x00040047, 0x000000f1, 0x00000021, 0x00000002, 0x00040047, - 0x000000f5, 0x00000022, 0x00000000, 0x00040047, 0x000000f5, 0x00000021, 0x00000002, 0x00040047, - 0x000000f9, 0x00000022, 0x00000000, 0x00040047, 0x000000f9, 0x00000021, 0x00000001, 0x00040047, - 0x000000fd, 0x00000022, 0x00000000, 0x00040047, 0x000000fd, 0x00000021, 0x00000001, 0x00040047, - 0x00000101, 0x00000022, 0x00000000, 0x00040047, 0x00000101, 0x00000021, 0x00000001, 0x00040047, - 0x00000105, 0x00000022, 0x00000000, 0x00040047, 0x00000105, 0x00000021, 0x00000002, 0x00040047, - 0x00000109, 0x00000022, 0x00000000, 0x00040047, 0x00000109, 0x00000021, 0x00000002, 0x00040047, - 0x0000010d, 0x00000022, 0x00000000, 0x00040047, 0x0000010d, 0x00000021, 0x00000002, 0x00040047, - 0x00000111, 0x00000022, 0x00000000, 0x00040047, 0x00000111, 0x00000021, 0x00000001, 0x00040047, - 0x00000115, 0x00000022, 0x00000000, 0x00040047, 0x00000115, 0x00000021, 0x00000001, 0x00040047, - 0x00000119, 0x00000022, 0x00000000, 0x00040047, 0x00000119, 0x00000021, 0x00000001, 0x00040047, - 0x0000011d, 0x00000022, 0x00000000, 0x00040047, 0x0000011d, 0x00000021, 0x00000002, 0x00040047, - 0x00000121, 0x00000022, 0x00000000, 0x00040047, 0x00000121, 0x00000021, 0x00000002, 0x00040047, - 0x00000125, 0x00000022, 0x00000000, 0x00040047, 0x00000125, 0x00000021, 0x00000002, 0x00040047, - 0x00000129, 0x00000022, 0x00000000, 0x00040047, 0x00000129, 0x00000021, 0x00000001, 0x00040047, - 0x0000012d, 0x00000022, 0x00000000, 0x00040047, 0x0000012d, 0x00000021, 0x00000001, 0x00040047, - 0x00000131, 0x00000022, 0x00000000, 0x00040047, 0x00000131, 0x00000021, 0x00000001, 0x00040047, - 0x00000135, 0x00000022, 0x00000000, 0x00040047, 0x00000135, 0x00000021, 0x00000002, 0x00040047, - 0x00000139, 0x00000022, 0x00000000, 0x00040047, 0x00000139, 0x00000021, 0x00000002, 0x00040047, - 0x0000013d, 0x00000022, 0x00000000, 0x00040047, 0x0000013d, 0x00000021, 0x00000002, 0x00040047, - 0x00000141, 0x00000022, 0x00000000, 0x00040047, 0x00000141, 0x00000021, 0x00000001, 0x00040047, - 0x00000145, 0x00000022, 0x00000000, 0x00040047, 0x00000145, 0x00000021, 0x00000001, 0x00040047, - 0x00000149, 0x00000022, 0x00000000, 0x00040047, 0x00000149, 0x00000021, 0x00000001, 0x00040047, - 0x0000014d, 0x00000022, 0x00000000, 0x00040047, 0x0000014d, 0x00000021, 0x00000002, 0x00040047, - 0x00000151, 0x00000022, 0x00000000, 0x00040047, 0x00000151, 0x00000021, 0x00000002, 0x00040047, - 0x00000155, 0x00000022, 0x00000000, 0x00040047, 0x00000155, 0x00000021, 0x00000002, 0x00040047, - 0x00000159, 0x00000022, 0x00000000, 0x00040047, 0x00000159, 0x00000021, 0x00000001, 0x00040047, - 0x0000015d, 0x00000022, 0x00000000, 0x00040047, 0x0000015d, 0x00000021, 0x00000001, 0x00040047, - 0x00000161, 0x00000022, 0x00000000, 0x00040047, 0x00000161, 0x00000021, 0x00000001, 0x00040047, - 0x00000165, 0x00000022, 0x00000000, 0x00040047, 0x00000165, 0x00000021, 0x00000002, 0x00040047, - 0x00000169, 0x00000022, 0x00000000, 0x00040047, 0x00000169, 0x00000021, 0x00000002, 0x00040047, - 0x0000016d, 0x00000022, 0x00000000, 0x00040047, 0x0000016d, 0x00000021, 0x00000002, 0x00020013, - 0x00000002, 0x00030021, 0x00000003, 0x00000002, 0x00040015, 0x00000006, 0x00000040, 0x00000000, - 0x0003001e, 0x00000007, 0x00000006, 0x00040020, 0x00000008, 0x00000007, 0x00000007, 0x00040015, - 0x00000009, 0x00000020, 0x00000000, 0x00040021, 0x0000000a, 0x00000009, 0x00000008, 0x0003001e, - 0x0000000e, 0x00000006, 0x00040020, 0x0000000f, 0x00000007, 0x0000000e, 0x00040021, 0x00000010, - 0x00000009, 0x0000000f, 0x00030016, 0x00000014, 0x00000020, 0x00040017, 0x00000015, 0x00000014, - 0x00000004, 0x00040020, 0x00000016, 0x00000007, 0x00000015, 0x00040021, 0x00000017, 0x00000015, - 0x00000016, 0x00040015, 0x0000001e, 0x00000020, 0x00000001, 0x0004002b, 0x0000001e, 0x0000001f, - 0x00000000, 0x00040020, 0x00000020, 0x00000007, 0x00000006, 0x0005002b, 0x00000006, 0x00000023, - 0x000fffff, 0x00000000, 0x00040017, 0x0000002e, 0x00000014, 0x00000003, 0x00040020, 0x0000002f, - 0x00000007, 0x0000002e, 0x0004002b, 0x00000014, 0x00000035, 0x3d25aee6, 0x0004002b, 0x00000014, - 0x00000039, 0x00000000, 0x0004002b, 0x00000014, 0x0000003a, 0x3f800000, 0x0004002b, 0x00000014, - 0x00000040, 0x414eb852, 0x0004002b, 0x00000014, 0x00000045, 0x3d6147ae, 0x0004002b, 0x00000014, - 0x00000048, 0x3f870a3d, 0x0004002b, 0x00000014, 0x0000004b, 0x4019999a, 0x0006002c, 0x0000002e, - 0x0000004c, 0x0000004b, 0x0000004b, 0x0000004b, 0x0004002b, 0x00000009, 0x00000054, 0x00000003, - 0x00040020, 0x00000055, 0x00000007, 0x00000014, 0x0004002b, 0x00000014, 0x00000063, 0x3b4d2e1c, - 0x0004002b, 0x00000014, 0x0000006f, 0x3ed55555, 0x0006002c, 0x0000002e, 0x00000070, 0x0000006f, - 0x0000006f, 0x0000006f, 0x00040020, 0x00000083, 0x00000003, 0x00000015, 0x0004003b, 0x00000083, - 0x00000084, 0x00000003, 0x00040017, 0x00000085, 0x00000014, 0x00000002, 0x0004001e, 0x00000086, - 0x00000015, 0x00000085, 0x00040020, 0x00000087, 0x00000001, 0x00000086, 0x0004003b, 0x00000087, - 0x00000088, 0x00000001, 0x00040020, 0x0000008a, 0x00000001, 0x00000015, 0x00090019, 0x0000008e, - 0x00000014, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x0003001d, - 0x0000008f, 0x0000008e, 0x00040020, 0x00000090, 0x00000000, 0x0000008f, 0x0004003b, 0x00000090, - 0x00000091, 0x00000000, 0x00030027, 0x00000092, 0x000014e5, 0x00030027, 0x00000093, 0x000014e5, - 0x0003001e, 0x00000094, 0x00000006, 0x0003001e, 0x00000095, 0x00000006, 0x000a001e, 0x00000096, - 0x00000085, 0x00000085, 0x00000009, 0x00000009, 0x00000092, 0x00000093, 0x00000094, 0x00000095, - 0x0005001e, 0x00000097, 0x00000085, 0x00000085, 0x00000009, 0x0003001e, 0x00000098, 0x00000097, - 0x00040020, 0x00000092, 0x000014e5, 0x00000098, 0x0003001e, 0x00000099, 0x00000009, 0x00040020, - 0x00000093, 0x000014e5, 0x00000099, 0x0003001e, 0x0000009a, 0x00000096, 0x00040020, 0x0000009b, - 0x00000009, 0x0000009a, 0x0004003b, 0x0000009b, 0x0000009c, 0x00000009, 0x0004002b, 0x0000001e, - 0x0000009d, 0x00000006, 0x00040020, 0x0000009f, 0x00000009, 0x00000094, 0x00040020, 0x000000a4, - 0x00000000, 0x0000008e, 0x0002001a, 0x000000a7, 0x0003001d, 0x000000a8, 0x000000a7, 0x00040020, - 0x000000a9, 0x00000000, 0x000000a8, 0x0004003b, 0x000000a9, 0x000000aa, 0x00000000, 0x0004002b, - 0x0000001e, 0x000000ab, 0x00000007, 0x00040020, 0x000000ad, 0x00000009, 0x00000095, 0x00040020, - 0x000000b2, 0x00000000, 0x000000a7, 0x0003001b, 0x000000b5, 0x0000008e, 0x0004002b, 0x0000001e, - 0x000000b7, 0x00000001, 0x00040020, 0x000000b8, 0x00000001, 0x00000085, 0x0003001d, 0x000000c0, - 0x00000006, 0x0003001e, 0x000000c1, 0x000000c0, 0x00040020, 0x000000c2, 0x0000000c, 0x000000c1, - 0x0004003b, 0x000000c2, 0x000000c3, 0x0000000c, 0x0004002b, 0x00000009, 0x000000c4, 0x00000001, - 0x0004001c, 0x000000c5, 0x000000a7, 0x000000c4, 0x00040020, 0x000000c6, 0x00000000, 0x000000c5, - 0x0004003b, 0x000000c6, 0x000000c7, 0x00000000, 0x0004003b, 0x000000c6, 0x000000c8, 0x00000000, - 0x0004003b, 0x000000c6, 0x000000c9, 0x00000000, 0x00090019, 0x000000ca, 0x00000014, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x000000cb, 0x000000ca, - 0x000000c4, 0x00040020, 0x000000cc, 0x00000000, 0x000000cb, 0x0004003b, 0x000000cc, 0x000000cd, - 0x00000000, 0x00090019, 0x000000ce, 0x0000001e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000002, 0x00000000, 0x0004001c, 0x000000cf, 0x000000ce, 0x000000c4, 0x00040020, 0x000000d0, - 0x00000000, 0x000000cf, 0x0004003b, 0x000000d0, 0x000000d1, 0x00000000, 0x00090019, 0x000000d2, - 0x00000009, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, - 0x000000d3, 0x000000d2, 0x000000c4, 0x00040020, 0x000000d4, 0x00000000, 0x000000d3, 0x0004003b, - 0x000000d4, 0x000000d5, 0x00000000, 0x00090019, 0x000000d6, 0x00000014, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x000000d7, 0x000000d6, 0x000000c4, - 0x00040020, 0x000000d8, 0x00000000, 0x000000d7, 0x0004003b, 0x000000d8, 0x000000d9, 0x00000000, - 0x00090019, 0x000000da, 0x0000001e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000001, - 0x00000000, 0x0004001c, 0x000000db, 0x000000da, 0x000000c4, 0x00040020, 0x000000dc, 0x00000000, - 0x000000db, 0x0004003b, 0x000000dc, 0x000000dd, 0x00000000, 0x00090019, 0x000000de, 0x00000009, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x000000df, - 0x000000de, 0x000000c4, 0x00040020, 0x000000e0, 0x00000000, 0x000000df, 0x0004003b, 0x000000e0, - 0x000000e1, 0x00000000, 0x00090019, 0x000000e2, 0x00000014, 0x00000001, 0x00000000, 0x00000000, - 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x000000e3, 0x000000e2, 0x000000c4, 0x00040020, - 0x000000e4, 0x00000000, 0x000000e3, 0x0004003b, 0x000000e4, 0x000000e5, 0x00000000, 0x00090019, - 0x000000e6, 0x0000001e, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0x00000000, - 0x0004001c, 0x000000e7, 0x000000e6, 0x000000c4, 0x00040020, 0x000000e8, 0x00000000, 0x000000e7, - 0x0004003b, 0x000000e8, 0x000000e9, 0x00000000, 0x00090019, 0x000000ea, 0x00000009, 0x00000001, - 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x000000eb, 0x000000ea, - 0x000000c4, 0x00040020, 0x000000ec, 0x00000000, 0x000000eb, 0x0004003b, 0x000000ec, 0x000000ed, - 0x00000000, 0x00090019, 0x000000ee, 0x0000001e, 0x00000001, 0x00000000, 0x00000000, 0x00000000, - 0x00000001, 0x00000000, 0x0004001c, 0x000000ef, 0x000000ee, 0x000000c4, 0x00040020, 0x000000f0, - 0x00000000, 0x000000ef, 0x0004003b, 0x000000f0, 0x000000f1, 0x00000000, 0x00090019, 0x000000f2, - 0x00000009, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, - 0x000000f3, 0x000000f2, 0x000000c4, 0x00040020, 0x000000f4, 0x00000000, 0x000000f3, 0x0004003b, - 0x000000f4, 0x000000f5, 0x00000000, 0x00090019, 0x000000f6, 0x00000014, 0x00000002, 0x00000000, - 0x00000000, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x000000f7, 0x000000f6, 0x000000c4, - 0x00040020, 0x000000f8, 0x00000000, 0x000000f7, 0x0004003b, 0x000000f8, 0x000000f9, 0x00000000, - 0x00090019, 0x000000fa, 0x0000001e, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000002, - 0x00000000, 0x0004001c, 0x000000fb, 0x000000fa, 0x000000c4, 0x00040020, 0x000000fc, 0x00000000, - 0x000000fb, 0x0004003b, 0x000000fc, 0x000000fd, 0x00000000, 0x00090019, 0x000000fe, 0x00000009, - 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x000000ff, - 0x000000fe, 0x000000c4, 0x00040020, 0x00000100, 0x00000000, 0x000000ff, 0x0004003b, 0x00000100, - 0x00000101, 0x00000000, 0x00090019, 0x00000102, 0x00000014, 0x00000002, 0x00000000, 0x00000000, - 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x00000103, 0x00000102, 0x000000c4, 0x00040020, - 0x00000104, 0x00000000, 0x00000103, 0x0004003b, 0x00000104, 0x00000105, 0x00000000, 0x00090019, - 0x00000106, 0x0000001e, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, - 0x0004001c, 0x00000107, 0x00000106, 0x000000c4, 0x00040020, 0x00000108, 0x00000000, 0x00000107, - 0x0004003b, 0x00000108, 0x00000109, 0x00000000, 0x00090019, 0x0000010a, 0x00000009, 0x00000002, - 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x0000010b, 0x0000010a, - 0x000000c4, 0x00040020, 0x0000010c, 0x00000000, 0x0000010b, 0x0004003b, 0x0000010c, 0x0000010d, - 0x00000000, 0x00090019, 0x0000010e, 0x00000014, 0x00000003, 0x00000000, 0x00000000, 0x00000000, - 0x00000002, 0x00000000, 0x0004001c, 0x0000010f, 0x0000010e, 0x000000c4, 0x00040020, 0x00000110, - 0x00000000, 0x0000010f, 0x0004003b, 0x00000110, 0x00000111, 0x00000000, 0x00090019, 0x00000112, - 0x0000001e, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, - 0x00000113, 0x00000112, 0x000000c4, 0x00040020, 0x00000114, 0x00000000, 0x00000113, 0x0004003b, - 0x00000114, 0x00000115, 0x00000000, 0x00090019, 0x00000116, 0x00000009, 0x00000003, 0x00000000, - 0x00000000, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x00000117, 0x00000116, 0x000000c4, - 0x00040020, 0x00000118, 0x00000000, 0x00000117, 0x0004003b, 0x00000118, 0x00000119, 0x00000000, - 0x00090019, 0x0000011a, 0x00000014, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000001, - 0x00000000, 0x0004001c, 0x0000011b, 0x0000011a, 0x000000c4, 0x00040020, 0x0000011c, 0x00000000, - 0x0000011b, 0x0004003b, 0x0000011c, 0x0000011d, 0x00000000, 0x00090019, 0x0000011e, 0x0000001e, - 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x0000011f, - 0x0000011e, 0x000000c4, 0x00040020, 0x00000120, 0x00000000, 0x0000011f, 0x0004003b, 0x00000120, - 0x00000121, 0x00000000, 0x00090019, 0x00000122, 0x00000009, 0x00000003, 0x00000000, 0x00000000, - 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x00000123, 0x00000122, 0x000000c4, 0x00040020, - 0x00000124, 0x00000000, 0x00000123, 0x0004003b, 0x00000124, 0x00000125, 0x00000000, 0x00090019, - 0x00000126, 0x00000014, 0x00000003, 0x00000000, 0x00000001, 0x00000000, 0x00000002, 0x00000000, - 0x0004001c, 0x00000127, 0x00000126, 0x000000c4, 0x00040020, 0x00000128, 0x00000000, 0x00000127, - 0x0004003b, 0x00000128, 0x00000129, 0x00000000, 0x00090019, 0x0000012a, 0x0000001e, 0x00000003, - 0x00000000, 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x0000012b, 0x0000012a, - 0x000000c4, 0x00040020, 0x0000012c, 0x00000000, 0x0000012b, 0x0004003b, 0x0000012c, 0x0000012d, - 0x00000000, 0x00090019, 0x0000012e, 0x00000009, 0x00000003, 0x00000000, 0x00000001, 0x00000000, - 0x00000002, 0x00000000, 0x0004001c, 0x0000012f, 0x0000012e, 0x000000c4, 0x00040020, 0x00000130, - 0x00000000, 0x0000012f, 0x0004003b, 0x00000130, 0x00000131, 0x00000000, 0x00090019, 0x00000132, - 0x00000014, 0x00000003, 0x00000000, 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, - 0x00000133, 0x00000132, 0x000000c4, 0x00040020, 0x00000134, 0x00000000, 0x00000133, 0x0004003b, - 0x00000134, 0x00000135, 0x00000000, 0x00090019, 0x00000136, 0x0000001e, 0x00000003, 0x00000000, - 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x00000137, 0x00000136, 0x000000c4, - 0x00040020, 0x00000138, 0x00000000, 0x00000137, 0x0004003b, 0x00000138, 0x00000139, 0x00000000, - 0x00090019, 0x0000013a, 0x00000009, 0x00000003, 0x00000000, 0x00000001, 0x00000000, 0x00000001, - 0x00000000, 0x0004001c, 0x0000013b, 0x0000013a, 0x000000c4, 0x00040020, 0x0000013c, 0x00000000, - 0x0000013b, 0x0004003b, 0x0000013c, 0x0000013d, 0x00000000, 0x00090019, 0x0000013e, 0x00000014, - 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x0000013f, - 0x0000013e, 0x000000c4, 0x00040020, 0x00000140, 0x00000000, 0x0000013f, 0x0004003b, 0x00000140, - 0x00000141, 0x00000000, 0x00090019, 0x00000142, 0x0000001e, 0x00000000, 0x00000000, 0x00000001, - 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x00000143, 0x00000142, 0x000000c4, 0x00040020, - 0x00000144, 0x00000000, 0x00000143, 0x0004003b, 0x00000144, 0x00000145, 0x00000000, 0x00090019, - 0x00000146, 0x00000009, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x00000002, 0x00000000, - 0x0004001c, 0x00000147, 0x00000146, 0x000000c4, 0x00040020, 0x00000148, 0x00000000, 0x00000147, - 0x0004003b, 0x00000148, 0x00000149, 0x00000000, 0x00090019, 0x0000014a, 0x00000014, 0x00000000, - 0x00000000, 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x0000014b, 0x0000014a, - 0x000000c4, 0x00040020, 0x0000014c, 0x00000000, 0x0000014b, 0x0004003b, 0x0000014c, 0x0000014d, - 0x00000000, 0x00090019, 0x0000014e, 0x0000001e, 0x00000000, 0x00000000, 0x00000001, 0x00000000, - 0x00000001, 0x00000000, 0x0004001c, 0x0000014f, 0x0000014e, 0x000000c4, 0x00040020, 0x00000150, - 0x00000000, 0x0000014f, 0x0004003b, 0x00000150, 0x00000151, 0x00000000, 0x00090019, 0x00000152, - 0x00000009, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, - 0x00000153, 0x00000152, 0x000000c4, 0x00040020, 0x00000154, 0x00000000, 0x00000153, 0x0004003b, - 0x00000154, 0x00000155, 0x00000000, 0x00090019, 0x00000156, 0x00000014, 0x00000001, 0x00000000, - 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x00000157, 0x00000156, 0x000000c4, - 0x00040020, 0x00000158, 0x00000000, 0x00000157, 0x0004003b, 0x00000158, 0x00000159, 0x00000000, - 0x00090019, 0x0000015a, 0x0000001e, 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x00000002, - 0x00000000, 0x0004001c, 0x0000015b, 0x0000015a, 0x000000c4, 0x00040020, 0x0000015c, 0x00000000, - 0x0000015b, 0x0004003b, 0x0000015c, 0x0000015d, 0x00000000, 0x00090019, 0x0000015e, 0x00000009, - 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x0000015f, - 0x0000015e, 0x000000c4, 0x00040020, 0x00000160, 0x00000000, 0x0000015f, 0x0004003b, 0x00000160, - 0x00000161, 0x00000000, 0x00090019, 0x00000162, 0x00000014, 0x00000001, 0x00000000, 0x00000001, - 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x00000163, 0x00000162, 0x000000c4, 0x00040020, - 0x00000164, 0x00000000, 0x00000163, 0x0004003b, 0x00000164, 0x00000165, 0x00000000, 0x00090019, - 0x00000166, 0x0000001e, 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x00000001, 0x00000000, - 0x0004001c, 0x00000167, 0x00000166, 0x000000c4, 0x00040020, 0x00000168, 0x00000000, 0x00000167, - 0x0004003b, 0x00000168, 0x00000169, 0x00000000, 0x00090019, 0x0000016a, 0x00000009, 0x00000001, - 0x00000000, 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x0000016b, 0x0000016a, - 0x000000c4, 0x00040020, 0x0000016c, 0x00000000, 0x0000016b, 0x0004003b, 0x0000016c, 0x0000016d, - 0x00000000, 0x00050036, 0x00000002, 0x00000004, 0x00000000, 0x00000003, 0x000200f8, 0x00000005, - 0x0004003b, 0x00000016, 0x00000089, 0x00000007, 0x0004003b, 0x00000008, 0x0000009e, 0x00000007, - 0x0004003b, 0x0000000f, 0x000000ac, 0x00000007, 0x0004003b, 0x00000016, 0x000000bd, 0x00000007, - 0x00050041, 0x0000008a, 0x0000008b, 0x00000088, 0x0000001f, 0x0004003d, 0x00000015, 0x0000008c, - 0x0000008b, 0x0003003e, 0x00000089, 0x0000008c, 0x00050039, 0x00000015, 0x0000008d, 0x00000019, - 0x00000089, 0x00060041, 0x0000009f, 0x000000a0, 0x0000009c, 0x0000001f, 0x0000009d, 0x0004003d, - 0x00000094, 0x000000a1, 0x000000a0, 0x00040190, 0x00000007, 0x000000a2, 0x000000a1, 0x0003003e, - 0x0000009e, 0x000000a2, 0x00050039, 0x00000009, 0x000000a3, 0x0000000c, 0x0000009e, 0x00050041, - 0x000000a4, 0x000000a5, 0x00000091, 0x000000a3, 0x0004003d, 0x0000008e, 0x000000a6, 0x000000a5, - 0x00060041, 0x000000ad, 0x000000ae, 0x0000009c, 0x0000001f, 0x000000ab, 0x0004003d, 0x00000095, - 0x000000af, 0x000000ae, 0x00040190, 0x0000000e, 0x000000b0, 0x000000af, 0x0003003e, 0x000000ac, - 0x000000b0, 0x00050039, 0x00000009, 0x000000b1, 0x00000012, 0x000000ac, 0x00050041, 0x000000b2, - 0x000000b3, 0x000000aa, 0x000000b1, 0x0004003d, 0x000000a7, 0x000000b4, 0x000000b3, 0x00050056, - 0x000000b5, 0x000000b6, 0x000000a6, 0x000000b4, 0x00050041, 0x000000b8, 0x000000b9, 0x00000088, - 0x000000b7, 0x0004003d, 0x00000085, 0x000000ba, 0x000000b9, 0x00050057, 0x00000015, 0x000000bb, - 0x000000b6, 0x000000ba, 0x00050085, 0x00000015, 0x000000bc, 0x0000008d, 0x000000bb, 0x0003003e, - 0x00000084, 0x000000bc, 0x0004003d, 0x00000015, 0x000000be, 0x00000084, 0x0003003e, 0x000000bd, - 0x000000be, 0x00050039, 0x00000015, 0x000000bf, 0x0000001c, 0x000000bd, 0x0003003e, 0x00000084, - 0x000000bf, 0x000100fd, 0x00010038, 0x00050036, 0x00000009, 0x0000000c, 0x00000000, 0x0000000a, - 0x00030037, 0x00000008, 0x0000000b, 0x000200f8, 0x0000000d, 0x00050041, 0x00000020, 0x00000021, - 0x0000000b, 0x0000001f, 0x0004003d, 0x00000006, 0x00000022, 0x00000021, 0x000500c7, 0x00000006, - 0x00000024, 0x00000022, 0x00000023, 0x00040071, 0x00000009, 0x00000025, 0x00000024, 0x000200fe, - 0x00000025, 0x00010038, 0x00050036, 0x00000009, 0x00000012, 0x00000000, 0x00000010, 0x00030037, - 0x0000000f, 0x00000011, 0x000200f8, 0x00000013, 0x00050041, 0x00000020, 0x00000028, 0x00000011, - 0x0000001f, 0x0004003d, 0x00000006, 0x00000029, 0x00000028, 0x000500c7, 0x00000006, 0x0000002a, - 0x00000029, 0x00000023, 0x00040071, 0x00000009, 0x0000002b, 0x0000002a, 0x000200fe, 0x0000002b, - 0x00010038, 0x00050036, 0x00000015, 0x00000019, 0x00000000, 0x00000017, 0x00030037, 0x00000016, - 0x00000018, 0x000200f8, 0x0000001a, 0x0004003b, 0x0000002f, 0x00000030, 0x00000007, 0x0004003b, - 0x0000002f, 0x00000033, 0x00000007, 0x0004003b, 0x0000002f, 0x0000003e, 0x00000007, 0x0004003b, - 0x0000002f, 0x00000043, 0x00000007, 0x0004003b, 0x0000002f, 0x0000004e, 0x00000007, 0x0004003d, - 0x00000015, 0x00000031, 0x00000018, 0x0008004f, 0x0000002e, 0x00000032, 0x00000031, 0x00000031, - 0x00000000, 0x00000001, 0x00000002, 0x0003003e, 0x00000030, 0x00000032, 0x0004003d, 0x0000002e, - 0x00000034, 0x00000030, 0x00060050, 0x0000002e, 0x00000036, 0x00000035, 0x00000035, 0x00000035, - 0x00050083, 0x0000002e, 0x00000037, 0x00000034, 0x00000036, 0x0006000c, 0x0000002e, 0x00000038, - 0x00000001, 0x00000009, 0x00000037, 0x00060050, 0x0000002e, 0x0000003b, 0x00000039, 0x00000039, - 0x00000039, 0x00060050, 0x0000002e, 0x0000003c, 0x0000003a, 0x0000003a, 0x0000003a, 0x0008000c, - 0x0000002e, 0x0000003d, 0x00000001, 0x0000002b, 0x00000038, 0x0000003b, 0x0000003c, 0x0003003e, - 0x00000033, 0x0000003d, 0x0004003d, 0x0000002e, 0x0000003f, 0x00000030, 0x00060050, 0x0000002e, - 0x00000041, 0x00000040, 0x00000040, 0x00000040, 0x00050088, 0x0000002e, 0x00000042, 0x0000003f, - 0x00000041, 0x0003003e, 0x0000003e, 0x00000042, 0x0004003d, 0x0000002e, 0x00000044, 0x00000030, - 0x00060050, 0x0000002e, 0x00000046, 0x00000045, 0x00000045, 0x00000045, 0x00050081, 0x0000002e, - 0x00000047, 0x00000044, 0x00000046, 0x00060050, 0x0000002e, 0x00000049, 0x00000048, 0x00000048, - 0x00000048, 0x00050088, 0x0000002e, 0x0000004a, 0x00000047, 0x00000049, 0x0007000c, 0x0000002e, - 0x0000004d, 0x00000001, 0x0000001a, 0x0000004a, 0x0000004c, 0x0003003e, 0x00000043, 0x0000004d, - 0x0004003d, 0x0000002e, 0x0000004f, 0x0000003e, 0x0004003d, 0x0000002e, 0x00000050, 0x00000043, - 0x0004003d, 0x0000002e, 0x00000051, 0x00000033, 0x0008000c, 0x0000002e, 0x00000052, 0x00000001, - 0x0000002e, 0x0000004f, 0x00000050, 0x00000051, 0x0003003e, 0x0000004e, 0x00000052, 0x0004003d, - 0x0000002e, 0x00000053, 0x0000004e, 0x00050041, 0x00000055, 0x00000056, 0x00000018, 0x00000054, - 0x0004003d, 0x00000014, 0x00000057, 0x00000056, 0x00050051, 0x00000014, 0x00000058, 0x00000053, - 0x00000000, 0x00050051, 0x00000014, 0x00000059, 0x00000053, 0x00000001, 0x00050051, 0x00000014, - 0x0000005a, 0x00000053, 0x00000002, 0x00070050, 0x00000015, 0x0000005b, 0x00000058, 0x00000059, - 0x0000005a, 0x00000057, 0x000200fe, 0x0000005b, 0x00010038, 0x00050036, 0x00000015, 0x0000001c, - 0x00000000, 0x00000017, 0x00030037, 0x00000016, 0x0000001b, 0x000200f8, 0x0000001d, 0x0004003b, - 0x0000002f, 0x0000005e, 0x00000007, 0x0004003b, 0x0000002f, 0x00000061, 0x00000007, 0x0004003b, - 0x0000002f, 0x0000006a, 0x00000007, 0x0004003b, 0x0000002f, 0x0000006d, 0x00000007, 0x0004003b, - 0x0000002f, 0x00000075, 0x00000007, 0x0004003d, 0x00000015, 0x0000005f, 0x0000001b, 0x0008004f, - 0x0000002e, 0x00000060, 0x0000005f, 0x0000005f, 0x00000000, 0x00000001, 0x00000002, 0x0003003e, - 0x0000005e, 0x00000060, 0x0004003d, 0x0000002e, 0x00000062, 0x0000005e, 0x00060050, 0x0000002e, - 0x00000064, 0x00000063, 0x00000063, 0x00000063, 0x00050083, 0x0000002e, 0x00000065, 0x00000062, - 0x00000064, 0x0006000c, 0x0000002e, 0x00000066, 0x00000001, 0x00000009, 0x00000065, 0x00060050, - 0x0000002e, 0x00000067, 0x00000039, 0x00000039, 0x00000039, 0x00060050, 0x0000002e, 0x00000068, - 0x0000003a, 0x0000003a, 0x0000003a, 0x0008000c, 0x0000002e, 0x00000069, 0x00000001, 0x0000002b, - 0x00000066, 0x00000067, 0x00000068, 0x0003003e, 0x00000061, 0x00000069, 0x0004003d, 0x0000002e, - 0x0000006b, 0x0000005e, 0x0005008e, 0x0000002e, 0x0000006c, 0x0000006b, 0x00000040, 0x0003003e, - 0x0000006a, 0x0000006c, 0x0004003d, 0x0000002e, 0x0000006e, 0x0000005e, 0x0007000c, 0x0000002e, - 0x00000071, 0x00000001, 0x0000001a, 0x0000006e, 0x00000070, 0x0005008e, 0x0000002e, 0x00000072, - 0x00000071, 0x00000048, 0x00060050, 0x0000002e, 0x00000073, 0x00000045, 0x00000045, 0x00000045, - 0x00050083, 0x0000002e, 0x00000074, 0x00000072, 0x00000073, 0x0003003e, 0x0000006d, 0x00000074, - 0x0004003d, 0x0000002e, 0x00000076, 0x0000006a, 0x0004003d, 0x0000002e, 0x00000077, 0x0000006d, - 0x0004003d, 0x0000002e, 0x00000078, 0x00000061, 0x0008000c, 0x0000002e, 0x00000079, 0x00000001, - 0x0000002e, 0x00000076, 0x00000077, 0x00000078, 0x0003003e, 0x00000075, 0x00000079, 0x0004003d, - 0x0000002e, 0x0000007a, 0x00000075, 0x00050041, 0x00000055, 0x0000007b, 0x0000001b, 0x00000054, - 0x0004003d, 0x00000014, 0x0000007c, 0x0000007b, 0x00050051, 0x00000014, 0x0000007d, 0x0000007a, - 0x00000000, 0x00050051, 0x00000014, 0x0000007e, 0x0000007a, 0x00000001, 0x00050051, 0x00000014, - 0x0000007f, 0x0000007a, 0x00000002, 0x00070050, 0x00000015, 0x00000080, 0x0000007d, 0x0000007e, - 0x0000007f, 0x0000007c, 0x000200fe, 0x00000080, 0x00010038, + 0x6c626154, 0x00000065, 0x00070005, 0x00000171, 0x61786164, 0x616d695f, 0x44326567, 0x6154534d, + 0x00656c62, 0x00080005, 0x00000175, 0x61786164, 0x6d69695f, 0x32656761, 0x54534d44, 0x656c6261, + 0x00000000, 0x00080005, 0x00000179, 0x61786164, 0x6d69755f, 0x32656761, 0x54534d44, 0x656c6261, + 0x00000000, 0x00080005, 0x0000017d, 0x61786164, 0x7865745f, 0x65727574, 0x534d4432, 0x6c626154, + 0x00000065, 0x00080005, 0x00000181, 0x61786164, 0x6574695f, 0x72757478, 0x4d443265, 0x62615453, + 0x0000656c, 0x00080005, 0x00000185, 0x61786164, 0x6574755f, 0x72757478, 0x4d443265, 0x62615453, + 0x0000656c, 0x00090005, 0x00000189, 0x61786164, 0x616d695f, 0x44326567, 0x7241534d, 0x54796172, + 0x656c6261, 0x00000000, 0x00090005, 0x0000018d, 0x61786164, 0x6d69695f, 0x32656761, 0x41534d44, + 0x79617272, 0x6c626154, 0x00000065, 0x00090005, 0x00000191, 0x61786164, 0x6d69755f, 0x32656761, + 0x41534d44, 0x79617272, 0x6c626154, 0x00000065, 0x00090005, 0x00000195, 0x61786164, 0x7865745f, + 0x65727574, 0x534d4432, 0x61727241, 0x62615479, 0x0000656c, 0x00090005, 0x00000199, 0x61786164, + 0x6574695f, 0x72757478, 0x4d443265, 0x72724153, 0x61547961, 0x00656c62, 0x00090005, 0x0000019d, + 0x61786164, 0x6574755f, 0x72757478, 0x4d443265, 0x72724153, 0x61547961, 0x00656c62, 0x00040047, + 0x00000084, 0x0000001e, 0x00000000, 0x00040047, 0x00000088, 0x0000001e, 0x00000000, 0x00040047, + 0x00000091, 0x00000022, 0x00000000, 0x00040047, 0x00000091, 0x00000021, 0x00000002, 0x00050048, + 0x00000094, 0x00000000, 0x00000023, 0x00000000, 0x00050048, 0x00000095, 0x00000000, 0x00000023, + 0x00000000, 0x00050048, 0x00000096, 0x00000000, 0x00000023, 0x00000000, 0x00050048, 0x00000096, + 0x00000001, 0x00000023, 0x00000008, 0x00050048, 0x00000096, 0x00000002, 0x00000023, 0x00000010, + 0x00050048, 0x00000096, 0x00000003, 0x00000023, 0x00000014, 0x00050048, 0x00000096, 0x00000004, + 0x00000023, 0x00000018, 0x00050048, 0x00000096, 0x00000005, 0x00000023, 0x00000020, 0x00050048, + 0x00000096, 0x00000006, 0x00000023, 0x00000028, 0x00050048, 0x00000096, 0x00000007, 0x00000023, + 0x00000030, 0x00050048, 0x00000097, 0x00000000, 0x00000023, 0x00000000, 0x00050048, 0x00000097, + 0x00000001, 0x00000023, 0x00000008, 0x00050048, 0x00000097, 0x00000002, 0x00000023, 0x00000010, + 0x00040048, 0x00000098, 0x00000000, 0x00000018, 0x00050048, 0x00000098, 0x00000000, 0x00000023, + 0x00000000, 0x00030047, 0x00000098, 0x00000002, 0x00040048, 0x00000099, 0x00000000, 0x00000018, + 0x00050048, 0x00000099, 0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x00000099, 0x00000002, + 0x00050048, 0x0000009a, 0x00000000, 0x00000023, 0x00000000, 0x00030047, 0x0000009a, 0x00000002, + 0x00040047, 0x000000aa, 0x00000022, 0x00000000, 0x00040047, 0x000000aa, 0x00000021, 0x00000003, + 0x00040047, 0x000000c0, 0x00000006, 0x00000008, 0x00040048, 0x000000c1, 0x00000000, 0x00000013, + 0x00040048, 0x000000c1, 0x00000000, 0x00000018, 0x00050048, 0x000000c1, 0x00000000, 0x00000023, + 0x00000000, 0x00030047, 0x000000c1, 0x00000002, 0x00040047, 0x000000c3, 0x00000022, 0x00000000, + 0x00040047, 0x000000c3, 0x00000021, 0x00000004, 0x00040047, 0x000000c7, 0x00000022, 0x00000000, + 0x00040047, 0x000000c7, 0x00000021, 0x00000003, 0x00040047, 0x000000c8, 0x00000022, 0x00000000, + 0x00040047, 0x000000c8, 0x00000021, 0x00000003, 0x00040047, 0x000000c9, 0x00000022, 0x00000000, + 0x00040047, 0x000000c9, 0x00000021, 0x00000003, 0x00040047, 0x000000cd, 0x00000022, 0x00000000, + 0x00040047, 0x000000cd, 0x00000021, 0x00000001, 0x00040047, 0x000000d1, 0x00000022, 0x00000000, + 0x00040047, 0x000000d1, 0x00000021, 0x00000001, 0x00040047, 0x000000d5, 0x00000022, 0x00000000, + 0x00040047, 0x000000d5, 0x00000021, 0x00000001, 0x00040047, 0x000000d9, 0x00000022, 0x00000000, + 0x00040047, 0x000000d9, 0x00000021, 0x00000002, 0x00040047, 0x000000dd, 0x00000022, 0x00000000, + 0x00040047, 0x000000dd, 0x00000021, 0x00000002, 0x00040047, 0x000000e1, 0x00000022, 0x00000000, + 0x00040047, 0x000000e1, 0x00000021, 0x00000002, 0x00040047, 0x000000e5, 0x00000022, 0x00000000, + 0x00040047, 0x000000e5, 0x00000021, 0x00000001, 0x00040047, 0x000000e9, 0x00000022, 0x00000000, + 0x00040047, 0x000000e9, 0x00000021, 0x00000001, 0x00040047, 0x000000ed, 0x00000022, 0x00000000, + 0x00040047, 0x000000ed, 0x00000021, 0x00000001, 0x00040047, 0x000000f1, 0x00000022, 0x00000000, + 0x00040047, 0x000000f1, 0x00000021, 0x00000002, 0x00040047, 0x000000f5, 0x00000022, 0x00000000, + 0x00040047, 0x000000f5, 0x00000021, 0x00000002, 0x00040047, 0x000000f9, 0x00000022, 0x00000000, + 0x00040047, 0x000000f9, 0x00000021, 0x00000001, 0x00040047, 0x000000fd, 0x00000022, 0x00000000, + 0x00040047, 0x000000fd, 0x00000021, 0x00000001, 0x00040047, 0x00000101, 0x00000022, 0x00000000, + 0x00040047, 0x00000101, 0x00000021, 0x00000001, 0x00040047, 0x00000105, 0x00000022, 0x00000000, + 0x00040047, 0x00000105, 0x00000021, 0x00000002, 0x00040047, 0x00000109, 0x00000022, 0x00000000, + 0x00040047, 0x00000109, 0x00000021, 0x00000002, 0x00040047, 0x0000010d, 0x00000022, 0x00000000, + 0x00040047, 0x0000010d, 0x00000021, 0x00000002, 0x00040047, 0x00000111, 0x00000022, 0x00000000, + 0x00040047, 0x00000111, 0x00000021, 0x00000001, 0x00040047, 0x00000115, 0x00000022, 0x00000000, + 0x00040047, 0x00000115, 0x00000021, 0x00000001, 0x00040047, 0x00000119, 0x00000022, 0x00000000, + 0x00040047, 0x00000119, 0x00000021, 0x00000001, 0x00040047, 0x0000011d, 0x00000022, 0x00000000, + 0x00040047, 0x0000011d, 0x00000021, 0x00000002, 0x00040047, 0x00000121, 0x00000022, 0x00000000, + 0x00040047, 0x00000121, 0x00000021, 0x00000002, 0x00040047, 0x00000125, 0x00000022, 0x00000000, + 0x00040047, 0x00000125, 0x00000021, 0x00000002, 0x00040047, 0x00000129, 0x00000022, 0x00000000, + 0x00040047, 0x00000129, 0x00000021, 0x00000001, 0x00040047, 0x0000012d, 0x00000022, 0x00000000, + 0x00040047, 0x0000012d, 0x00000021, 0x00000001, 0x00040047, 0x00000131, 0x00000022, 0x00000000, + 0x00040047, 0x00000131, 0x00000021, 0x00000001, 0x00040047, 0x00000135, 0x00000022, 0x00000000, + 0x00040047, 0x00000135, 0x00000021, 0x00000002, 0x00040047, 0x00000139, 0x00000022, 0x00000000, + 0x00040047, 0x00000139, 0x00000021, 0x00000002, 0x00040047, 0x0000013d, 0x00000022, 0x00000000, + 0x00040047, 0x0000013d, 0x00000021, 0x00000002, 0x00040047, 0x00000141, 0x00000022, 0x00000000, + 0x00040047, 0x00000141, 0x00000021, 0x00000001, 0x00040047, 0x00000145, 0x00000022, 0x00000000, + 0x00040047, 0x00000145, 0x00000021, 0x00000001, 0x00040047, 0x00000149, 0x00000022, 0x00000000, + 0x00040047, 0x00000149, 0x00000021, 0x00000001, 0x00040047, 0x0000014d, 0x00000022, 0x00000000, + 0x00040047, 0x0000014d, 0x00000021, 0x00000002, 0x00040047, 0x00000151, 0x00000022, 0x00000000, + 0x00040047, 0x00000151, 0x00000021, 0x00000002, 0x00040047, 0x00000155, 0x00000022, 0x00000000, + 0x00040047, 0x00000155, 0x00000021, 0x00000002, 0x00040047, 0x00000159, 0x00000022, 0x00000000, + 0x00040047, 0x00000159, 0x00000021, 0x00000001, 0x00040047, 0x0000015d, 0x00000022, 0x00000000, + 0x00040047, 0x0000015d, 0x00000021, 0x00000001, 0x00040047, 0x00000161, 0x00000022, 0x00000000, + 0x00040047, 0x00000161, 0x00000021, 0x00000001, 0x00040047, 0x00000165, 0x00000022, 0x00000000, + 0x00040047, 0x00000165, 0x00000021, 0x00000002, 0x00040047, 0x00000169, 0x00000022, 0x00000000, + 0x00040047, 0x00000169, 0x00000021, 0x00000002, 0x00040047, 0x0000016d, 0x00000022, 0x00000000, + 0x00040047, 0x0000016d, 0x00000021, 0x00000002, 0x00040047, 0x00000171, 0x00000022, 0x00000000, + 0x00040047, 0x00000171, 0x00000021, 0x00000001, 0x00040047, 0x00000175, 0x00000022, 0x00000000, + 0x00040047, 0x00000175, 0x00000021, 0x00000001, 0x00040047, 0x00000179, 0x00000022, 0x00000000, + 0x00040047, 0x00000179, 0x00000021, 0x00000001, 0x00040047, 0x0000017d, 0x00000022, 0x00000000, + 0x00040047, 0x0000017d, 0x00000021, 0x00000002, 0x00040047, 0x00000181, 0x00000022, 0x00000000, + 0x00040047, 0x00000181, 0x00000021, 0x00000002, 0x00040047, 0x00000185, 0x00000022, 0x00000000, + 0x00040047, 0x00000185, 0x00000021, 0x00000002, 0x00040047, 0x00000189, 0x00000022, 0x00000000, + 0x00040047, 0x00000189, 0x00000021, 0x00000001, 0x00040047, 0x0000018d, 0x00000022, 0x00000000, + 0x00040047, 0x0000018d, 0x00000021, 0x00000001, 0x00040047, 0x00000191, 0x00000022, 0x00000000, + 0x00040047, 0x00000191, 0x00000021, 0x00000001, 0x00040047, 0x00000195, 0x00000022, 0x00000000, + 0x00040047, 0x00000195, 0x00000021, 0x00000002, 0x00040047, 0x00000199, 0x00000022, 0x00000000, + 0x00040047, 0x00000199, 0x00000021, 0x00000002, 0x00040047, 0x0000019d, 0x00000022, 0x00000000, + 0x00040047, 0x0000019d, 0x00000021, 0x00000002, 0x00020013, 0x00000002, 0x00030021, 0x00000003, + 0x00000002, 0x00040015, 0x00000006, 0x00000040, 0x00000000, 0x0003001e, 0x00000007, 0x00000006, + 0x00040020, 0x00000008, 0x00000007, 0x00000007, 0x00040015, 0x00000009, 0x00000020, 0x00000000, + 0x00040021, 0x0000000a, 0x00000009, 0x00000008, 0x0003001e, 0x0000000e, 0x00000006, 0x00040020, + 0x0000000f, 0x00000007, 0x0000000e, 0x00040021, 0x00000010, 0x00000009, 0x0000000f, 0x00030016, + 0x00000014, 0x00000020, 0x00040017, 0x00000015, 0x00000014, 0x00000004, 0x00040020, 0x00000016, + 0x00000007, 0x00000015, 0x00040021, 0x00000017, 0x00000015, 0x00000016, 0x00040015, 0x0000001e, + 0x00000020, 0x00000001, 0x0004002b, 0x0000001e, 0x0000001f, 0x00000000, 0x00040020, 0x00000020, + 0x00000007, 0x00000006, 0x0005002b, 0x00000006, 0x00000023, 0x000fffff, 0x00000000, 0x00040017, + 0x0000002e, 0x00000014, 0x00000003, 0x00040020, 0x0000002f, 0x00000007, 0x0000002e, 0x0004002b, + 0x00000014, 0x00000035, 0x3d25aee6, 0x0004002b, 0x00000014, 0x00000039, 0x00000000, 0x0004002b, + 0x00000014, 0x0000003a, 0x3f800000, 0x0004002b, 0x00000014, 0x00000040, 0x414eb852, 0x0004002b, + 0x00000014, 0x00000045, 0x3d6147ae, 0x0004002b, 0x00000014, 0x00000048, 0x3f870a3d, 0x0004002b, + 0x00000014, 0x0000004b, 0x4019999a, 0x0006002c, 0x0000002e, 0x0000004c, 0x0000004b, 0x0000004b, + 0x0000004b, 0x0004002b, 0x00000009, 0x00000054, 0x00000003, 0x00040020, 0x00000055, 0x00000007, + 0x00000014, 0x0004002b, 0x00000014, 0x00000063, 0x3b4d2e1c, 0x0004002b, 0x00000014, 0x0000006f, + 0x3ed55555, 0x0006002c, 0x0000002e, 0x00000070, 0x0000006f, 0x0000006f, 0x0000006f, 0x00040020, + 0x00000083, 0x00000003, 0x00000015, 0x0004003b, 0x00000083, 0x00000084, 0x00000003, 0x00040017, + 0x00000085, 0x00000014, 0x00000002, 0x0004001e, 0x00000086, 0x00000015, 0x00000085, 0x00040020, + 0x00000087, 0x00000001, 0x00000086, 0x0004003b, 0x00000087, 0x00000088, 0x00000001, 0x00040020, + 0x0000008a, 0x00000001, 0x00000015, 0x00090019, 0x0000008e, 0x00000014, 0x00000001, 0x00000000, + 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x0003001d, 0x0000008f, 0x0000008e, 0x00040020, + 0x00000090, 0x00000000, 0x0000008f, 0x0004003b, 0x00000090, 0x00000091, 0x00000000, 0x00030027, + 0x00000092, 0x000014e5, 0x00030027, 0x00000093, 0x000014e5, 0x0003001e, 0x00000094, 0x00000006, + 0x0003001e, 0x00000095, 0x00000006, 0x000a001e, 0x00000096, 0x00000085, 0x00000085, 0x00000009, + 0x00000009, 0x00000092, 0x00000093, 0x00000094, 0x00000095, 0x0005001e, 0x00000097, 0x00000085, + 0x00000085, 0x00000009, 0x0003001e, 0x00000098, 0x00000097, 0x00040020, 0x00000092, 0x000014e5, + 0x00000098, 0x0003001e, 0x00000099, 0x00000009, 0x00040020, 0x00000093, 0x000014e5, 0x00000099, + 0x0003001e, 0x0000009a, 0x00000096, 0x00040020, 0x0000009b, 0x00000009, 0x0000009a, 0x0004003b, + 0x0000009b, 0x0000009c, 0x00000009, 0x0004002b, 0x0000001e, 0x0000009d, 0x00000006, 0x00040020, + 0x0000009f, 0x00000009, 0x00000094, 0x00040020, 0x000000a4, 0x00000000, 0x0000008e, 0x0002001a, + 0x000000a7, 0x0003001d, 0x000000a8, 0x000000a7, 0x00040020, 0x000000a9, 0x00000000, 0x000000a8, + 0x0004003b, 0x000000a9, 0x000000aa, 0x00000000, 0x0004002b, 0x0000001e, 0x000000ab, 0x00000007, + 0x00040020, 0x000000ad, 0x00000009, 0x00000095, 0x00040020, 0x000000b2, 0x00000000, 0x000000a7, + 0x0003001b, 0x000000b5, 0x0000008e, 0x0004002b, 0x0000001e, 0x000000b7, 0x00000001, 0x00040020, + 0x000000b8, 0x00000001, 0x00000085, 0x0003001d, 0x000000c0, 0x00000006, 0x0003001e, 0x000000c1, + 0x000000c0, 0x00040020, 0x000000c2, 0x0000000c, 0x000000c1, 0x0004003b, 0x000000c2, 0x000000c3, + 0x0000000c, 0x0004002b, 0x00000009, 0x000000c4, 0x00000001, 0x0004001c, 0x000000c5, 0x000000a7, + 0x000000c4, 0x00040020, 0x000000c6, 0x00000000, 0x000000c5, 0x0004003b, 0x000000c6, 0x000000c7, + 0x00000000, 0x0004003b, 0x000000c6, 0x000000c8, 0x00000000, 0x0004003b, 0x000000c6, 0x000000c9, + 0x00000000, 0x00090019, 0x000000ca, 0x00000014, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000002, 0x00000000, 0x0004001c, 0x000000cb, 0x000000ca, 0x000000c4, 0x00040020, 0x000000cc, + 0x00000000, 0x000000cb, 0x0004003b, 0x000000cc, 0x000000cd, 0x00000000, 0x00090019, 0x000000ce, + 0x0000001e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, + 0x000000cf, 0x000000ce, 0x000000c4, 0x00040020, 0x000000d0, 0x00000000, 0x000000cf, 0x0004003b, + 0x000000d0, 0x000000d1, 0x00000000, 0x00090019, 0x000000d2, 0x00000009, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x000000d3, 0x000000d2, 0x000000c4, + 0x00040020, 0x000000d4, 0x00000000, 0x000000d3, 0x0004003b, 0x000000d4, 0x000000d5, 0x00000000, + 0x00090019, 0x000000d6, 0x00000014, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000001, + 0x00000000, 0x0004001c, 0x000000d7, 0x000000d6, 0x000000c4, 0x00040020, 0x000000d8, 0x00000000, + 0x000000d7, 0x0004003b, 0x000000d8, 0x000000d9, 0x00000000, 0x00090019, 0x000000da, 0x0000001e, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x000000db, + 0x000000da, 0x000000c4, 0x00040020, 0x000000dc, 0x00000000, 0x000000db, 0x0004003b, 0x000000dc, + 0x000000dd, 0x00000000, 0x00090019, 0x000000de, 0x00000009, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x000000df, 0x000000de, 0x000000c4, 0x00040020, + 0x000000e0, 0x00000000, 0x000000df, 0x0004003b, 0x000000e0, 0x000000e1, 0x00000000, 0x00090019, + 0x000000e2, 0x00000014, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0x00000000, + 0x0004001c, 0x000000e3, 0x000000e2, 0x000000c4, 0x00040020, 0x000000e4, 0x00000000, 0x000000e3, + 0x0004003b, 0x000000e4, 0x000000e5, 0x00000000, 0x00090019, 0x000000e6, 0x0000001e, 0x00000001, + 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x000000e7, 0x000000e6, + 0x000000c4, 0x00040020, 0x000000e8, 0x00000000, 0x000000e7, 0x0004003b, 0x000000e8, 0x000000e9, + 0x00000000, 0x00090019, 0x000000ea, 0x00000009, 0x00000001, 0x00000000, 0x00000000, 0x00000000, + 0x00000002, 0x00000000, 0x0004001c, 0x000000eb, 0x000000ea, 0x000000c4, 0x00040020, 0x000000ec, + 0x00000000, 0x000000eb, 0x0004003b, 0x000000ec, 0x000000ed, 0x00000000, 0x00090019, 0x000000ee, + 0x0000001e, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, + 0x000000ef, 0x000000ee, 0x000000c4, 0x00040020, 0x000000f0, 0x00000000, 0x000000ef, 0x0004003b, + 0x000000f0, 0x000000f1, 0x00000000, 0x00090019, 0x000000f2, 0x00000009, 0x00000001, 0x00000000, + 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x000000f3, 0x000000f2, 0x000000c4, + 0x00040020, 0x000000f4, 0x00000000, 0x000000f3, 0x0004003b, 0x000000f4, 0x000000f5, 0x00000000, + 0x00090019, 0x000000f6, 0x00000014, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000002, + 0x00000000, 0x0004001c, 0x000000f7, 0x000000f6, 0x000000c4, 0x00040020, 0x000000f8, 0x00000000, + 0x000000f7, 0x0004003b, 0x000000f8, 0x000000f9, 0x00000000, 0x00090019, 0x000000fa, 0x0000001e, + 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x000000fb, + 0x000000fa, 0x000000c4, 0x00040020, 0x000000fc, 0x00000000, 0x000000fb, 0x0004003b, 0x000000fc, + 0x000000fd, 0x00000000, 0x00090019, 0x000000fe, 0x00000009, 0x00000002, 0x00000000, 0x00000000, + 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x000000ff, 0x000000fe, 0x000000c4, 0x00040020, + 0x00000100, 0x00000000, 0x000000ff, 0x0004003b, 0x00000100, 0x00000101, 0x00000000, 0x00090019, + 0x00000102, 0x00000014, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, + 0x0004001c, 0x00000103, 0x00000102, 0x000000c4, 0x00040020, 0x00000104, 0x00000000, 0x00000103, + 0x0004003b, 0x00000104, 0x00000105, 0x00000000, 0x00090019, 0x00000106, 0x0000001e, 0x00000002, + 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x00000107, 0x00000106, + 0x000000c4, 0x00040020, 0x00000108, 0x00000000, 0x00000107, 0x0004003b, 0x00000108, 0x00000109, + 0x00000000, 0x00090019, 0x0000010a, 0x00000009, 0x00000002, 0x00000000, 0x00000000, 0x00000000, + 0x00000001, 0x00000000, 0x0004001c, 0x0000010b, 0x0000010a, 0x000000c4, 0x00040020, 0x0000010c, + 0x00000000, 0x0000010b, 0x0004003b, 0x0000010c, 0x0000010d, 0x00000000, 0x00090019, 0x0000010e, + 0x00000014, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, + 0x0000010f, 0x0000010e, 0x000000c4, 0x00040020, 0x00000110, 0x00000000, 0x0000010f, 0x0004003b, + 0x00000110, 0x00000111, 0x00000000, 0x00090019, 0x00000112, 0x0000001e, 0x00000003, 0x00000000, + 0x00000000, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x00000113, 0x00000112, 0x000000c4, + 0x00040020, 0x00000114, 0x00000000, 0x00000113, 0x0004003b, 0x00000114, 0x00000115, 0x00000000, + 0x00090019, 0x00000116, 0x00000009, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000002, + 0x00000000, 0x0004001c, 0x00000117, 0x00000116, 0x000000c4, 0x00040020, 0x00000118, 0x00000000, + 0x00000117, 0x0004003b, 0x00000118, 0x00000119, 0x00000000, 0x00090019, 0x0000011a, 0x00000014, + 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x0000011b, + 0x0000011a, 0x000000c4, 0x00040020, 0x0000011c, 0x00000000, 0x0000011b, 0x0004003b, 0x0000011c, + 0x0000011d, 0x00000000, 0x00090019, 0x0000011e, 0x0000001e, 0x00000003, 0x00000000, 0x00000000, + 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x0000011f, 0x0000011e, 0x000000c4, 0x00040020, + 0x00000120, 0x00000000, 0x0000011f, 0x0004003b, 0x00000120, 0x00000121, 0x00000000, 0x00090019, + 0x00000122, 0x00000009, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, + 0x0004001c, 0x00000123, 0x00000122, 0x000000c4, 0x00040020, 0x00000124, 0x00000000, 0x00000123, + 0x0004003b, 0x00000124, 0x00000125, 0x00000000, 0x00090019, 0x00000126, 0x00000014, 0x00000003, + 0x00000000, 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x00000127, 0x00000126, + 0x000000c4, 0x00040020, 0x00000128, 0x00000000, 0x00000127, 0x0004003b, 0x00000128, 0x00000129, + 0x00000000, 0x00090019, 0x0000012a, 0x0000001e, 0x00000003, 0x00000000, 0x00000001, 0x00000000, + 0x00000002, 0x00000000, 0x0004001c, 0x0000012b, 0x0000012a, 0x000000c4, 0x00040020, 0x0000012c, + 0x00000000, 0x0000012b, 0x0004003b, 0x0000012c, 0x0000012d, 0x00000000, 0x00090019, 0x0000012e, + 0x00000009, 0x00000003, 0x00000000, 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, + 0x0000012f, 0x0000012e, 0x000000c4, 0x00040020, 0x00000130, 0x00000000, 0x0000012f, 0x0004003b, + 0x00000130, 0x00000131, 0x00000000, 0x00090019, 0x00000132, 0x00000014, 0x00000003, 0x00000000, + 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x00000133, 0x00000132, 0x000000c4, + 0x00040020, 0x00000134, 0x00000000, 0x00000133, 0x0004003b, 0x00000134, 0x00000135, 0x00000000, + 0x00090019, 0x00000136, 0x0000001e, 0x00000003, 0x00000000, 0x00000001, 0x00000000, 0x00000001, + 0x00000000, 0x0004001c, 0x00000137, 0x00000136, 0x000000c4, 0x00040020, 0x00000138, 0x00000000, + 0x00000137, 0x0004003b, 0x00000138, 0x00000139, 0x00000000, 0x00090019, 0x0000013a, 0x00000009, + 0x00000003, 0x00000000, 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x0000013b, + 0x0000013a, 0x000000c4, 0x00040020, 0x0000013c, 0x00000000, 0x0000013b, 0x0004003b, 0x0000013c, + 0x0000013d, 0x00000000, 0x00090019, 0x0000013e, 0x00000014, 0x00000000, 0x00000000, 0x00000001, + 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x0000013f, 0x0000013e, 0x000000c4, 0x00040020, + 0x00000140, 0x00000000, 0x0000013f, 0x0004003b, 0x00000140, 0x00000141, 0x00000000, 0x00090019, + 0x00000142, 0x0000001e, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x00000002, 0x00000000, + 0x0004001c, 0x00000143, 0x00000142, 0x000000c4, 0x00040020, 0x00000144, 0x00000000, 0x00000143, + 0x0004003b, 0x00000144, 0x00000145, 0x00000000, 0x00090019, 0x00000146, 0x00000009, 0x00000000, + 0x00000000, 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x00000147, 0x00000146, + 0x000000c4, 0x00040020, 0x00000148, 0x00000000, 0x00000147, 0x0004003b, 0x00000148, 0x00000149, + 0x00000000, 0x00090019, 0x0000014a, 0x00000014, 0x00000000, 0x00000000, 0x00000001, 0x00000000, + 0x00000001, 0x00000000, 0x0004001c, 0x0000014b, 0x0000014a, 0x000000c4, 0x00040020, 0x0000014c, + 0x00000000, 0x0000014b, 0x0004003b, 0x0000014c, 0x0000014d, 0x00000000, 0x00090019, 0x0000014e, + 0x0000001e, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, + 0x0000014f, 0x0000014e, 0x000000c4, 0x00040020, 0x00000150, 0x00000000, 0x0000014f, 0x0004003b, + 0x00000150, 0x00000151, 0x00000000, 0x00090019, 0x00000152, 0x00000009, 0x00000000, 0x00000000, + 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x00000153, 0x00000152, 0x000000c4, + 0x00040020, 0x00000154, 0x00000000, 0x00000153, 0x0004003b, 0x00000154, 0x00000155, 0x00000000, + 0x00090019, 0x00000156, 0x00000014, 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x00000002, + 0x00000000, 0x0004001c, 0x00000157, 0x00000156, 0x000000c4, 0x00040020, 0x00000158, 0x00000000, + 0x00000157, 0x0004003b, 0x00000158, 0x00000159, 0x00000000, 0x00090019, 0x0000015a, 0x0000001e, + 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x0000015b, + 0x0000015a, 0x000000c4, 0x00040020, 0x0000015c, 0x00000000, 0x0000015b, 0x0004003b, 0x0000015c, + 0x0000015d, 0x00000000, 0x00090019, 0x0000015e, 0x00000009, 0x00000001, 0x00000000, 0x00000001, + 0x00000000, 0x00000002, 0x00000000, 0x0004001c, 0x0000015f, 0x0000015e, 0x000000c4, 0x00040020, + 0x00000160, 0x00000000, 0x0000015f, 0x0004003b, 0x00000160, 0x00000161, 0x00000000, 0x00090019, + 0x00000162, 0x00000014, 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x00000001, 0x00000000, + 0x0004001c, 0x00000163, 0x00000162, 0x000000c4, 0x00040020, 0x00000164, 0x00000000, 0x00000163, + 0x0004003b, 0x00000164, 0x00000165, 0x00000000, 0x00090019, 0x00000166, 0x0000001e, 0x00000001, + 0x00000000, 0x00000001, 0x00000000, 0x00000001, 0x00000000, 0x0004001c, 0x00000167, 0x00000166, + 0x000000c4, 0x00040020, 0x00000168, 0x00000000, 0x00000167, 0x0004003b, 0x00000168, 0x00000169, + 0x00000000, 0x00090019, 0x0000016a, 0x00000009, 0x00000001, 0x00000000, 0x00000001, 0x00000000, + 0x00000001, 0x00000000, 0x0004001c, 0x0000016b, 0x0000016a, 0x000000c4, 0x00040020, 0x0000016c, + 0x00000000, 0x0000016b, 0x0004003b, 0x0000016c, 0x0000016d, 0x00000000, 0x00090019, 0x0000016e, + 0x00000014, 0x00000001, 0x00000000, 0x00000000, 0x00000001, 0x00000002, 0x00000000, 0x0004001c, + 0x0000016f, 0x0000016e, 0x000000c4, 0x00040020, 0x00000170, 0x00000000, 0x0000016f, 0x0004003b, + 0x00000170, 0x00000171, 0x00000000, 0x00090019, 0x00000172, 0x0000001e, 0x00000001, 0x00000000, + 0x00000000, 0x00000001, 0x00000002, 0x00000000, 0x0004001c, 0x00000173, 0x00000172, 0x000000c4, + 0x00040020, 0x00000174, 0x00000000, 0x00000173, 0x0004003b, 0x00000174, 0x00000175, 0x00000000, + 0x00090019, 0x00000176, 0x00000009, 0x00000001, 0x00000000, 0x00000000, 0x00000001, 0x00000002, + 0x00000000, 0x0004001c, 0x00000177, 0x00000176, 0x000000c4, 0x00040020, 0x00000178, 0x00000000, + 0x00000177, 0x0004003b, 0x00000178, 0x00000179, 0x00000000, 0x00090019, 0x0000017a, 0x00000014, + 0x00000001, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000000, 0x0004001c, 0x0000017b, + 0x0000017a, 0x000000c4, 0x00040020, 0x0000017c, 0x00000000, 0x0000017b, 0x0004003b, 0x0000017c, + 0x0000017d, 0x00000000, 0x00090019, 0x0000017e, 0x0000001e, 0x00000001, 0x00000000, 0x00000000, + 0x00000001, 0x00000001, 0x00000000, 0x0004001c, 0x0000017f, 0x0000017e, 0x000000c4, 0x00040020, + 0x00000180, 0x00000000, 0x0000017f, 0x0004003b, 0x00000180, 0x00000181, 0x00000000, 0x00090019, + 0x00000182, 0x00000009, 0x00000001, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000000, + 0x0004001c, 0x00000183, 0x00000182, 0x000000c4, 0x00040020, 0x00000184, 0x00000000, 0x00000183, + 0x0004003b, 0x00000184, 0x00000185, 0x00000000, 0x00090019, 0x00000186, 0x00000014, 0x00000001, + 0x00000000, 0x00000001, 0x00000001, 0x00000002, 0x00000000, 0x0004001c, 0x00000187, 0x00000186, + 0x000000c4, 0x00040020, 0x00000188, 0x00000000, 0x00000187, 0x0004003b, 0x00000188, 0x00000189, + 0x00000000, 0x00090019, 0x0000018a, 0x0000001e, 0x00000001, 0x00000000, 0x00000001, 0x00000001, + 0x00000002, 0x00000000, 0x0004001c, 0x0000018b, 0x0000018a, 0x000000c4, 0x00040020, 0x0000018c, + 0x00000000, 0x0000018b, 0x0004003b, 0x0000018c, 0x0000018d, 0x00000000, 0x00090019, 0x0000018e, + 0x00000009, 0x00000001, 0x00000000, 0x00000001, 0x00000001, 0x00000002, 0x00000000, 0x0004001c, + 0x0000018f, 0x0000018e, 0x000000c4, 0x00040020, 0x00000190, 0x00000000, 0x0000018f, 0x0004003b, + 0x00000190, 0x00000191, 0x00000000, 0x00090019, 0x00000192, 0x00000014, 0x00000001, 0x00000000, + 0x00000001, 0x00000001, 0x00000001, 0x00000000, 0x0004001c, 0x00000193, 0x00000192, 0x000000c4, + 0x00040020, 0x00000194, 0x00000000, 0x00000193, 0x0004003b, 0x00000194, 0x00000195, 0x00000000, + 0x00090019, 0x00000196, 0x0000001e, 0x00000001, 0x00000000, 0x00000001, 0x00000001, 0x00000001, + 0x00000000, 0x0004001c, 0x00000197, 0x00000196, 0x000000c4, 0x00040020, 0x00000198, 0x00000000, + 0x00000197, 0x0004003b, 0x00000198, 0x00000199, 0x00000000, 0x00090019, 0x0000019a, 0x00000009, + 0x00000001, 0x00000000, 0x00000001, 0x00000001, 0x00000001, 0x00000000, 0x0004001c, 0x0000019b, + 0x0000019a, 0x000000c4, 0x00040020, 0x0000019c, 0x00000000, 0x0000019b, 0x0004003b, 0x0000019c, + 0x0000019d, 0x00000000, 0x00050036, 0x00000002, 0x00000004, 0x00000000, 0x00000003, 0x000200f8, + 0x00000005, 0x0004003b, 0x00000016, 0x00000089, 0x00000007, 0x0004003b, 0x00000008, 0x0000009e, + 0x00000007, 0x0004003b, 0x0000000f, 0x000000ac, 0x00000007, 0x0004003b, 0x00000016, 0x000000bd, + 0x00000007, 0x00050041, 0x0000008a, 0x0000008b, 0x00000088, 0x0000001f, 0x0004003d, 0x00000015, + 0x0000008c, 0x0000008b, 0x0003003e, 0x00000089, 0x0000008c, 0x00050039, 0x00000015, 0x0000008d, + 0x00000019, 0x00000089, 0x00060041, 0x0000009f, 0x000000a0, 0x0000009c, 0x0000001f, 0x0000009d, + 0x0004003d, 0x00000094, 0x000000a1, 0x000000a0, 0x00040190, 0x00000007, 0x000000a2, 0x000000a1, + 0x0003003e, 0x0000009e, 0x000000a2, 0x00050039, 0x00000009, 0x000000a3, 0x0000000c, 0x0000009e, + 0x00050041, 0x000000a4, 0x000000a5, 0x00000091, 0x000000a3, 0x0004003d, 0x0000008e, 0x000000a6, + 0x000000a5, 0x00060041, 0x000000ad, 0x000000ae, 0x0000009c, 0x0000001f, 0x000000ab, 0x0004003d, + 0x00000095, 0x000000af, 0x000000ae, 0x00040190, 0x0000000e, 0x000000b0, 0x000000af, 0x0003003e, + 0x000000ac, 0x000000b0, 0x00050039, 0x00000009, 0x000000b1, 0x00000012, 0x000000ac, 0x00050041, + 0x000000b2, 0x000000b3, 0x000000aa, 0x000000b1, 0x0004003d, 0x000000a7, 0x000000b4, 0x000000b3, + 0x00050056, 0x000000b5, 0x000000b6, 0x000000a6, 0x000000b4, 0x00050041, 0x000000b8, 0x000000b9, + 0x00000088, 0x000000b7, 0x0004003d, 0x00000085, 0x000000ba, 0x000000b9, 0x00050057, 0x00000015, + 0x000000bb, 0x000000b6, 0x000000ba, 0x00050085, 0x00000015, 0x000000bc, 0x0000008d, 0x000000bb, + 0x0003003e, 0x00000084, 0x000000bc, 0x0004003d, 0x00000015, 0x000000be, 0x00000084, 0x0003003e, + 0x000000bd, 0x000000be, 0x00050039, 0x00000015, 0x000000bf, 0x0000001c, 0x000000bd, 0x0003003e, + 0x00000084, 0x000000bf, 0x000100fd, 0x00010038, 0x00050036, 0x00000009, 0x0000000c, 0x00000000, + 0x0000000a, 0x00030037, 0x00000008, 0x0000000b, 0x000200f8, 0x0000000d, 0x00050041, 0x00000020, + 0x00000021, 0x0000000b, 0x0000001f, 0x0004003d, 0x00000006, 0x00000022, 0x00000021, 0x000500c7, + 0x00000006, 0x00000024, 0x00000022, 0x00000023, 0x00040071, 0x00000009, 0x00000025, 0x00000024, + 0x000200fe, 0x00000025, 0x00010038, 0x00050036, 0x00000009, 0x00000012, 0x00000000, 0x00000010, + 0x00030037, 0x0000000f, 0x00000011, 0x000200f8, 0x00000013, 0x00050041, 0x00000020, 0x00000028, + 0x00000011, 0x0000001f, 0x0004003d, 0x00000006, 0x00000029, 0x00000028, 0x000500c7, 0x00000006, + 0x0000002a, 0x00000029, 0x00000023, 0x00040071, 0x00000009, 0x0000002b, 0x0000002a, 0x000200fe, + 0x0000002b, 0x00010038, 0x00050036, 0x00000015, 0x00000019, 0x00000000, 0x00000017, 0x00030037, + 0x00000016, 0x00000018, 0x000200f8, 0x0000001a, 0x0004003b, 0x0000002f, 0x00000030, 0x00000007, + 0x0004003b, 0x0000002f, 0x00000033, 0x00000007, 0x0004003b, 0x0000002f, 0x0000003e, 0x00000007, + 0x0004003b, 0x0000002f, 0x00000043, 0x00000007, 0x0004003b, 0x0000002f, 0x0000004e, 0x00000007, + 0x0004003d, 0x00000015, 0x00000031, 0x00000018, 0x0008004f, 0x0000002e, 0x00000032, 0x00000031, + 0x00000031, 0x00000000, 0x00000001, 0x00000002, 0x0003003e, 0x00000030, 0x00000032, 0x0004003d, + 0x0000002e, 0x00000034, 0x00000030, 0x00060050, 0x0000002e, 0x00000036, 0x00000035, 0x00000035, + 0x00000035, 0x00050083, 0x0000002e, 0x00000037, 0x00000034, 0x00000036, 0x0006000c, 0x0000002e, + 0x00000038, 0x00000001, 0x00000009, 0x00000037, 0x00060050, 0x0000002e, 0x0000003b, 0x00000039, + 0x00000039, 0x00000039, 0x00060050, 0x0000002e, 0x0000003c, 0x0000003a, 0x0000003a, 0x0000003a, + 0x0008000c, 0x0000002e, 0x0000003d, 0x00000001, 0x0000002b, 0x00000038, 0x0000003b, 0x0000003c, + 0x0003003e, 0x00000033, 0x0000003d, 0x0004003d, 0x0000002e, 0x0000003f, 0x00000030, 0x00060050, + 0x0000002e, 0x00000041, 0x00000040, 0x00000040, 0x00000040, 0x00050088, 0x0000002e, 0x00000042, + 0x0000003f, 0x00000041, 0x0003003e, 0x0000003e, 0x00000042, 0x0004003d, 0x0000002e, 0x00000044, + 0x00000030, 0x00060050, 0x0000002e, 0x00000046, 0x00000045, 0x00000045, 0x00000045, 0x00050081, + 0x0000002e, 0x00000047, 0x00000044, 0x00000046, 0x00060050, 0x0000002e, 0x00000049, 0x00000048, + 0x00000048, 0x00000048, 0x00050088, 0x0000002e, 0x0000004a, 0x00000047, 0x00000049, 0x0007000c, + 0x0000002e, 0x0000004d, 0x00000001, 0x0000001a, 0x0000004a, 0x0000004c, 0x0003003e, 0x00000043, + 0x0000004d, 0x0004003d, 0x0000002e, 0x0000004f, 0x0000003e, 0x0004003d, 0x0000002e, 0x00000050, + 0x00000043, 0x0004003d, 0x0000002e, 0x00000051, 0x00000033, 0x0008000c, 0x0000002e, 0x00000052, + 0x00000001, 0x0000002e, 0x0000004f, 0x00000050, 0x00000051, 0x0003003e, 0x0000004e, 0x00000052, + 0x0004003d, 0x0000002e, 0x00000053, 0x0000004e, 0x00050041, 0x00000055, 0x00000056, 0x00000018, + 0x00000054, 0x0004003d, 0x00000014, 0x00000057, 0x00000056, 0x00050051, 0x00000014, 0x00000058, + 0x00000053, 0x00000000, 0x00050051, 0x00000014, 0x00000059, 0x00000053, 0x00000001, 0x00050051, + 0x00000014, 0x0000005a, 0x00000053, 0x00000002, 0x00070050, 0x00000015, 0x0000005b, 0x00000058, + 0x00000059, 0x0000005a, 0x00000057, 0x000200fe, 0x0000005b, 0x00010038, 0x00050036, 0x00000015, + 0x0000001c, 0x00000000, 0x00000017, 0x00030037, 0x00000016, 0x0000001b, 0x000200f8, 0x0000001d, + 0x0004003b, 0x0000002f, 0x0000005e, 0x00000007, 0x0004003b, 0x0000002f, 0x00000061, 0x00000007, + 0x0004003b, 0x0000002f, 0x0000006a, 0x00000007, 0x0004003b, 0x0000002f, 0x0000006d, 0x00000007, + 0x0004003b, 0x0000002f, 0x00000075, 0x00000007, 0x0004003d, 0x00000015, 0x0000005f, 0x0000001b, + 0x0008004f, 0x0000002e, 0x00000060, 0x0000005f, 0x0000005f, 0x00000000, 0x00000001, 0x00000002, + 0x0003003e, 0x0000005e, 0x00000060, 0x0004003d, 0x0000002e, 0x00000062, 0x0000005e, 0x00060050, + 0x0000002e, 0x00000064, 0x00000063, 0x00000063, 0x00000063, 0x00050083, 0x0000002e, 0x00000065, + 0x00000062, 0x00000064, 0x0006000c, 0x0000002e, 0x00000066, 0x00000001, 0x00000009, 0x00000065, + 0x00060050, 0x0000002e, 0x00000067, 0x00000039, 0x00000039, 0x00000039, 0x00060050, 0x0000002e, + 0x00000068, 0x0000003a, 0x0000003a, 0x0000003a, 0x0008000c, 0x0000002e, 0x00000069, 0x00000001, + 0x0000002b, 0x00000066, 0x00000067, 0x00000068, 0x0003003e, 0x00000061, 0x00000069, 0x0004003d, + 0x0000002e, 0x0000006b, 0x0000005e, 0x0005008e, 0x0000002e, 0x0000006c, 0x0000006b, 0x00000040, + 0x0003003e, 0x0000006a, 0x0000006c, 0x0004003d, 0x0000002e, 0x0000006e, 0x0000005e, 0x0007000c, + 0x0000002e, 0x00000071, 0x00000001, 0x0000001a, 0x0000006e, 0x00000070, 0x0005008e, 0x0000002e, + 0x00000072, 0x00000071, 0x00000048, 0x00060050, 0x0000002e, 0x00000073, 0x00000045, 0x00000045, + 0x00000045, 0x00050083, 0x0000002e, 0x00000074, 0x00000072, 0x00000073, 0x0003003e, 0x0000006d, + 0x00000074, 0x0004003d, 0x0000002e, 0x00000076, 0x0000006a, 0x0004003d, 0x0000002e, 0x00000077, + 0x0000006d, 0x0004003d, 0x0000002e, 0x00000078, 0x00000061, 0x0008000c, 0x0000002e, 0x00000079, + 0x00000001, 0x0000002e, 0x00000076, 0x00000077, 0x00000078, 0x0003003e, 0x00000075, 0x00000079, + 0x0004003d, 0x0000002e, 0x0000007a, 0x00000075, 0x00050041, 0x00000055, 0x0000007b, 0x0000001b, + 0x00000054, 0x0004003d, 0x00000014, 0x0000007c, 0x0000007b, 0x00050051, 0x00000014, 0x0000007d, + 0x0000007a, 0x00000000, 0x00050051, 0x00000014, 0x0000007e, 0x0000007a, 0x00000001, 0x00050051, + 0x00000014, 0x0000007f, 0x0000007a, 0x00000002, 0x00070050, 0x00000015, 0x00000080, 0x0000007d, + 0x0000007e, 0x0000007f, 0x0000007c, 0x000200fe, 0x00000080, 0x00010038, // clang-format on }; diff --git a/src/utils/impl_pipeline_manager.cpp b/src/utils/impl_pipeline_manager.cpp index a9adc330..b5b50455 100644 --- a/src/utils/impl_pipeline_manager.cpp +++ b/src/utils/impl_pipeline_manager.cpp @@ -1,7 +1,7 @@ #if DAXA_BUILT_WITH_UTILS_PIPELINE_MANAGER_GLSLANG || DAXA_BUILT_WITH_UTILS_PIPELINE_MANAGER_SLANG -#include "daxa/utils/pipeline_manager.hpp" #include "../impl_core.hpp" +#include "daxa/utils/pipeline_manager.hpp" #include "impl_pipeline_manager.hpp" #include @@ -187,6 +187,32 @@ static void shader_preprocess(std::string & file_str, std::filesystem::path cons namespace daxa { + auto compute2_to_shader_compile_info2(ComputePipelineCompileInfo2 const & src) -> ShaderCompileInfo2 + { + ShaderCompileInfo2 ret = {}; + ret.source = src.source; + ret.entry_point = src.entry_point; + ret.language = src.language; + ret.defines = src.defines; + ret.enable_debug_info = src.enable_debug_info; + ret.create_flags = src.create_flags; + ret.required_subgroup_size = src.required_subgroup_size; + return ret; + } + + auto upgrade_shader_compile_info(ShaderCompileInfo const & src) -> ShaderCompileInfo2 + { + ShaderCompileInfo2 ret = {}; + ret.source = src.source; + ret.entry_point = src.compile_options.entry_point; + ret.language = src.compile_options.language; + ret.defines = src.compile_options.defines; + ret.enable_debug_info = src.compile_options.enable_debug_info; + ret.create_flags = src.compile_options.create_flags; + ret.required_subgroup_size = src.compile_options.required_subgroup_size; + return ret; + } + #if DAXA_BUILT_WITH_UTILS_PIPELINE_MANAGER_GLSLANG class GlslangFileIncluder : public glslang::TShader::Includer { @@ -324,66 +350,266 @@ namespace namespace daxa { - void ShaderCompileOptions::inherit(ShaderCompileOptions const & other) + void inherit_shader_compile_options(auto & dst, auto const & src) { - if (!this->entry_point.has_value()) + if (!dst.entry_point.has_value()) { - this->entry_point = other.entry_point; + dst.entry_point = src.entry_point; } - if (!this->write_out_preprocessed_code.has_value()) + if (!dst.language.has_value()) { - this->write_out_preprocessed_code = other.write_out_preprocessed_code; + dst.language = src.language; } - if (!this->write_out_shader_binary.has_value()) + if (!dst.enable_debug_info.has_value()) { - this->write_out_shader_binary = other.write_out_shader_binary; + dst.enable_debug_info = src.enable_debug_info; } - if (!this->spirv_cache_folder.has_value()) + if (!dst.create_flags.has_value()) { - this->spirv_cache_folder = other.spirv_cache_folder; + dst.create_flags = src.create_flags; } - if (!this->language.has_value()) + if (!dst.required_subgroup_size.has_value()) { - this->language = other.language; + dst.required_subgroup_size = src.required_subgroup_size; } - if (!this->enable_debug_info.has_value()) + + dst.defines.insert(dst.defines.end(), src.defines.begin(), src.defines.end()); + } + + PipelineManager::PipelineManager(PipelineManagerInfo old_info) + { + PipelineManagerInfo2 info = {}; + info.device = old_info.device; + info.root_paths = old_info.shader_compile_options.root_paths; + info.write_out_preprocessed_code = old_info.shader_compile_options.write_out_preprocessed_code; + info.write_out_spirv = old_info.shader_compile_options.write_out_shader_binary; + info.spirv_cache_folder = old_info.shader_compile_options.spirv_cache_folder; + info.default_shader_compile_info.entry_point = old_info.shader_compile_options.entry_point; + info.default_shader_compile_info.language = old_info.shader_compile_options.language; + info.default_shader_compile_info.defines = old_info.shader_compile_options.defines; + info.default_shader_compile_info.enable_debug_info = old_info.shader_compile_options.enable_debug_info; + info.default_shader_compile_info.create_flags = old_info.shader_compile_options.create_flags; + info.default_shader_compile_info.required_subgroup_size = old_info.shader_compile_options.required_subgroup_size; + info.register_null_pipelines_when_first_compile_fails = old_info.register_null_pipelines_when_first_compile_fails; + info.custom_preprocessor = old_info.custom_preprocessor; + info.name = old_info.name; + this->object = new ImplPipelineManager{std::move(info)}; + } + + PipelineManager::PipelineManager(PipelineManagerInfo2 info) + { + this->object = new ImplPipelineManager{std::move(info)}; + } + + auto PipelineManager::add_ray_tracing_pipeline(RayTracingPipelineCompileInfo const & info) -> Result> + { + auto & impl = *r_cast(this->object); + + auto update_info_vector = [&](auto const & infos) { - this->enable_debug_info = other.enable_debug_info; - } - if (!this->create_flags.has_value()) + std::vector converted_infos = {}; + converted_infos.reserve(infos.size()); + for (auto const & info : infos) + { + converted_infos.push_back(upgrade_shader_compile_info(info)); + } + return converted_infos; + }; + RayTracingPipelineCompileInfo2 converted_info = {}; + converted_info.ray_gen_infos = update_info_vector(info.ray_gen_infos); + converted_info.intersection_infos = update_info_vector(info.intersection_infos); + converted_info.any_hit_infos = update_info_vector(info.any_hit_infos); + converted_info.callable_infos = update_info_vector(info.callable_infos); + converted_info.closest_hit_infos = update_info_vector(info.closest_hit_infos); + converted_info.miss_hit_infos = update_info_vector(info.miss_hit_infos); + converted_info.shader_groups_infos = info.shader_groups_infos; + converted_info.max_ray_recursion_depth = info.max_ray_recursion_depth; + converted_info.push_constant_size = info.push_constant_size; + converted_info.name = info.name; + + return this->add_ray_tracing_pipeline2(converted_info); + } + + template + void auto_complete_shader_compile_info(T & info) + { + if (!info.entry_point.has_value()) { - this->create_flags = other.create_flags; + info.entry_point = "main"; } - if (!this->required_subgroup_size.has_value()) + + if (daxa::holds_alternative(info.source) && !info.language.has_value()) { - this->required_subgroup_size = other.required_subgroup_size; + auto const & shader_file = daxa::get(info.source); + auto const shader_file_string = shader_file.path.filename().string(); + bool is_slang_file = false; + is_slang_file |= shader_file_string.ends_with(".hlslh"); + is_slang_file |= shader_file_string.ends_with(".hlsl"); + is_slang_file |= shader_file_string.ends_with(".slang"); + is_slang_file |= shader_file_string.ends_with(".slangh"); + bool is_glsl_file = false; + is_glsl_file |= shader_file_string.ends_with(".glsl"); + is_glsl_file |= shader_file_string.ends_with(".glslh"); + if (is_slang_file) + { + info.language = ShaderLanguage::SLANG; + } + if (is_glsl_file) + { + info.language = ShaderLanguage::GLSL; + } } - - this->root_paths.insert(this->root_paths.begin(), other.root_paths.begin(), other.root_paths.end()); - this->defines.insert(this->defines.end(), other.defines.begin(), other.defines.end()); } - PipelineManager::PipelineManager(PipelineManagerInfo info) + template + void auto_complete_pipeline_name(T & info) { - this->object = new ImplPipelineManager{std::move(info)}; + // For compute pipelines, insert a default name based on filename and entry. + if (daxa::holds_alternative(info.source) && info.name.empty()) + { + auto const & shader_file = daxa::get(info.source); + info.name = (shader_file.path.string() + "::") + info.entry_point.value(); + } } - auto PipelineManager::add_ray_tracing_pipeline(RayTracingPipelineCompileInfo const & info) -> Result> + auto PipelineManager::add_ray_tracing_pipeline2(RayTracingPipelineCompileInfo2 const & info) -> Result> { auto & impl = *r_cast(this->object); - return impl.add_ray_tracing_pipeline(info); + + // DAXA_DBG_ASSERT_TRUE_M(!daxa::holds_alternative(a_info.shader_info.source), "must provide shader source"); + auto modified_info = info; + std::array shader_infos = {&modified_info.ray_gen_infos, + &modified_info.intersection_infos, + &modified_info.any_hit_infos, + &modified_info.callable_infos, + &modified_info.closest_hit_infos, + &modified_info.miss_hit_infos}; + for (auto & infos : shader_infos) + { + for (auto & shader_compile_info : *infos) + { + auto_complete_shader_compile_info(shader_compile_info); + inherit_shader_compile_options(shader_compile_info, impl.info.default_shader_compile_info); + } + } + + auto pipe_result = impl.create_ray_tracing_pipeline(modified_info); + if (pipe_result.is_err()) + { + return Result>(pipe_result.m); + } + impl.ray_tracing_pipelines.push_back(pipe_result.value()); + if (impl.info.register_null_pipelines_when_first_compile_fails) + { + auto result = Result>(std::move(pipe_result.value().pipeline_ptr)); + result.m = std::move(pipe_result.m); + return result; + } + else + { + return Result>(std::move(pipe_result.value().pipeline_ptr)); + } + } + + auto PipelineManager::add_compute_pipeline(ComputePipelineCompileInfo a_info) -> Result> + { + ComputePipelineCompileInfo2 info = {}; + info.source = std::move(a_info.shader_info.source); + info.entry_point = std::move(a_info.shader_info.compile_options.entry_point); + info.language = std::move(a_info.shader_info.compile_options.language); + info.defines = std::move(a_info.shader_info.compile_options.defines); + info.enable_debug_info = std::move(a_info.shader_info.compile_options.enable_debug_info); + info.create_flags = std::move(a_info.shader_info.compile_options.create_flags); + info.required_subgroup_size = std::move(a_info.shader_info.compile_options.required_subgroup_size); + info.push_constant_size = std::move(a_info.push_constant_size); + info.name = std::move(a_info.name); + return this->add_compute_pipeline2(std::move(info)); } - auto PipelineManager::add_compute_pipeline(ComputePipelineCompileInfo const & info) -> Result> + auto PipelineManager::add_compute_pipeline2(ComputePipelineCompileInfo2 a_info) -> Result> { auto & impl = *r_cast(this->object); - return impl.add_compute_pipeline(info); + DAXA_DBG_ASSERT_TRUE_M(!daxa::holds_alternative(a_info.source), "must provide shader source"); + + auto m_info = std::move(a_info); + auto_complete_pipeline_name(m_info); + + auto_complete_shader_compile_info(m_info); + + inherit_shader_compile_options(m_info, impl.info.default_shader_compile_info); + auto pipe_result = impl.create_compute_pipeline(m_info); + if (pipe_result.is_err()) + { + return Result>(pipe_result.m); + } + impl.compute_pipelines.push_back(pipe_result.value()); + if (impl.info.register_null_pipelines_when_first_compile_fails) + { + auto result = Result>(std::move(pipe_result.value().pipeline_ptr)); + result.m = std::move(pipe_result.m); + return result; + } + else + { + return Result>(std::move(pipe_result.value().pipeline_ptr)); + } } auto PipelineManager::add_raster_pipeline(RasterPipelineCompileInfo const & info) -> Result> + { + RasterPipelineCompileInfo2 converted_info = {}; + converted_info.mesh_shader_info = info.mesh_shader_info.has_value() ? Optional(upgrade_shader_compile_info(info.mesh_shader_info.value())) : daxa::None; + converted_info.vertex_shader_info = info.vertex_shader_info.has_value() ? Optional(upgrade_shader_compile_info(info.vertex_shader_info.value())) : daxa::None; + converted_info.tesselation_control_shader_info = info.tesselation_control_shader_info.has_value() ? Optional(upgrade_shader_compile_info(info.tesselation_control_shader_info.value())) : daxa::None; + converted_info.tesselation_evaluation_shader_info = info.tesselation_evaluation_shader_info.has_value() ? Optional(upgrade_shader_compile_info(info.tesselation_evaluation_shader_info.value())) : daxa::None; + converted_info.fragment_shader_info = info.fragment_shader_info.has_value() ? Optional(upgrade_shader_compile_info(info.fragment_shader_info.value())) : daxa::None; + converted_info.task_shader_info = info.task_shader_info.has_value() ? Optional(upgrade_shader_compile_info(info.task_shader_info.value())) : daxa::None; + converted_info.color_attachments = info.color_attachments; + converted_info.depth_test = info.depth_test; + converted_info.raster = info.raster; + converted_info.tesselation = info.tesselation; + converted_info.push_constant_size = info.push_constant_size; + converted_info.name = info.name; + return add_raster_pipeline2(converted_info); + } + + auto PipelineManager::add_raster_pipeline2(RasterPipelineCompileInfo2 const & info) -> Result> { auto & impl = *r_cast(this->object); - return impl.add_raster_pipeline(info); + + auto modified_info = info; + auto const modified_shader_compile_infos = std::array *, 6>{ + &modified_info.vertex_shader_info, + &modified_info.tesselation_control_shader_info, + &modified_info.tesselation_evaluation_shader_info, + &modified_info.fragment_shader_info, + &modified_info.mesh_shader_info, + &modified_info.task_shader_info, + }; + for (auto * shader_compile_info : modified_shader_compile_infos) + { + if (shader_compile_info->has_value()) + { + auto_complete_shader_compile_info(shader_compile_info->value()); + inherit_shader_compile_options(shader_compile_info->value(), impl.info.default_shader_compile_info); + } + } + auto pipe_result = impl.create_raster_pipeline(modified_info); + if (pipe_result.is_err()) + { + return Result>(pipe_result.m); + } + impl.raster_pipelines.push_back(pipe_result.value()); + if (impl.info.register_null_pipelines_when_first_compile_fails) + { + auto result = Result>(std::move(pipe_result.value().pipeline_ptr)); + result.m = std::move(pipe_result.m); + return result; + } + else + { + return Result>(std::move(pipe_result.value().pipeline_ptr)); + } } void PipelineManager::remove_compute_pipeline(std::shared_ptr const & pipeline) @@ -425,20 +651,20 @@ namespace daxa static std::mutex glslang_init_mtx; static i32 pipeline_manager_count = 0; - ImplPipelineManager::ImplPipelineManager(PipelineManagerInfo && a_info) + ImplPipelineManager::ImplPipelineManager(PipelineManagerInfo2 && a_info) : info{std::move(a_info)} { - if (!this->info.shader_compile_options.entry_point.has_value()) + if (!this->info.default_shader_compile_info.entry_point.has_value()) { - this->info.shader_compile_options.entry_point = std::optional{"main"}; + this->info.default_shader_compile_info.entry_point = std::optional{"main"}; } - if (!this->info.shader_compile_options.language.has_value()) + if (!this->info.default_shader_compile_info.language.has_value()) { - this->info.shader_compile_options.language = std::optional{ShaderLanguage::GLSL}; + this->info.default_shader_compile_info.language = std::optional{ShaderLanguage::GLSL}; } - if (!this->info.shader_compile_options.enable_debug_info.has_value()) + if (!this->info.default_shader_compile_info.enable_debug_info.has_value()) { - this->info.shader_compile_options.enable_debug_info = {false}; + this->info.default_shader_compile_info.enable_debug_info = {false}; } { @@ -470,11 +696,11 @@ namespace daxa #endif } - auto ImplPipelineManager::create_ray_tracing_pipeline(RayTracingPipelineCompileInfo const & a_info) -> Result + auto ImplPipelineManager::create_ray_tracing_pipeline(RayTracingPipelineCompileInfo2 const & a_info) -> Result { - if (a_info.push_constant_size > MAX_PUSH_CONSTANT_BYTE_SIZE) + if (a_info.push_constant_size > DAXA_MAX_PUSH_CONSTANT_BYTE_SIZE) { - return Result(std::string("push constant size of ") + std::to_string(a_info.push_constant_size) + std::string(" exceeds the maximum size of ") + std::to_string(MAX_PUSH_CONSTANT_BYTE_SIZE)); + return Result(std::string("push constant size of ") + std::to_string(a_info.push_constant_size) + std::string(" exceeds the maximum size of ") + std::to_string(DAXA_MAX_PUSH_CONSTANT_BYTE_SIZE)); } if (a_info.push_constant_size % 4 != 0) { @@ -511,7 +737,7 @@ namespace daxa auto callable_shader_infos = std::vector{}; auto closest_hit_shader_infos = std::vector{}; auto miss_hit_shader_infos = std::vector{}; - using ElemT = std::tuple *, std::vector *, std::vector>> *, ShaderStage>; + using ElemT = std::tuple *, std::vector *, std::vector>> *, ShaderStage>; auto const result_shader_compile_infos = std::array{ ElemT{&pipe_result.info.ray_gen_infos, &ray_gen_shader_infos, &ray_gen_spirv_result, ShaderStage::RAY_GEN}, ElemT{&pipe_result.info.intersection_infos, &intersection_shader_infos, &intersection_spirv_result, ShaderStage::RAY_INTERSECT}, @@ -543,13 +769,13 @@ namespace daxa final_shader_info->push_back(daxa::ShaderInfo{ .byte_code = spv_results->back().value().data(), .byte_code_size = static_cast(spv_results->back().value().size()), - .create_flags = shader_compile_info.compile_options.create_flags.value_or(ShaderCreateFlagBits::NONE), + .create_flags = shader_compile_info.create_flags.value_or(ShaderCreateFlagBits::NONE), .required_subgroup_size = - shader_compile_info.compile_options.required_subgroup_size.has_value() ? Optional{shader_compile_info.compile_options.required_subgroup_size.value()} : daxa::None, + shader_compile_info.required_subgroup_size.has_value() ? Optional{shader_compile_info.required_subgroup_size.value()} : daxa::None, }); - if (shader_compile_info.compile_options.entry_point.has_value() && (shader_compile_info.compile_options.language != ShaderLanguage::SLANG)) + if (shader_compile_info.entry_point.has_value() && (shader_compile_info.language != ShaderLanguage::SLANG)) { - final_shader_info->back().entry_point = {shader_compile_info.compile_options.entry_point.value()}; + final_shader_info->back().entry_point = {shader_compile_info.entry_point.value()}; } } } @@ -565,11 +791,11 @@ namespace daxa return Result(std::move(pipe_result)); } - auto ImplPipelineManager::create_compute_pipeline(ComputePipelineCompileInfo const & a_info) -> Result + auto ImplPipelineManager::create_compute_pipeline(ComputePipelineCompileInfo2 const & a_info) -> Result { - if (a_info.push_constant_size > MAX_PUSH_CONSTANT_BYTE_SIZE) + if (a_info.push_constant_size > DAXA_MAX_PUSH_CONSTANT_BYTE_SIZE) { - return Result(std::string("push constant size of ") + std::to_string(a_info.push_constant_size) + std::string(" exceeds the maximum size of ") + std::to_string(MAX_PUSH_CONSTANT_BYTE_SIZE)); + return Result(std::string("push constant size of ") + std::to_string(a_info.push_constant_size) + std::string(" exceeds the maximum size of ") + std::to_string(DAXA_MAX_PUSH_CONSTANT_BYTE_SIZE)); } if (a_info.push_constant_size % 4 != 0) { @@ -582,7 +808,7 @@ namespace daxa .observed_hotload_files = {}, }; this->current_observed_hotload_files = &pipe_result.observed_hotload_files; - auto spirv_result = get_spirv(pipe_result.info.shader_info, pipe_result.info.name, ShaderStage::COMP); + auto spirv_result = get_spirv(compute2_to_shader_compile_info2(pipe_result.info), pipe_result.info.name, ShaderStage::COMP); if (spirv_result.is_err()) { if (this->info.register_null_pipelines_when_first_compile_fails) @@ -597,19 +823,17 @@ namespace daxa } } char const * entry_point = "main"; - if (a_info.shader_info.compile_options.entry_point.has_value() && a_info.shader_info.compile_options.language != ShaderLanguage::SLANG) + if (a_info.entry_point.has_value() && a_info.language != ShaderLanguage::SLANG) { - entry_point = a_info.shader_info.compile_options.entry_point.value().c_str(); + entry_point = a_info.entry_point.value().c_str(); } (*pipe_result.pipeline_ptr) = this->info.device.create_compute_pipeline({ .shader_info = { .byte_code = spirv_result.value().data(), .byte_code_size = static_cast(spirv_result.value().size()), - .create_flags = a_info.shader_info.compile_options.create_flags.value_or(ShaderCreateFlagBits::NONE), + .create_flags = a_info.create_flags.value_or(ShaderCreateFlagBits::NONE), .required_subgroup_size = - a_info.shader_info.compile_options.required_subgroup_size.has_value() - ? Optional{a_info.shader_info.compile_options.required_subgroup_size.value()} - : daxa::None, + a_info.required_subgroup_size.has_value() ? Optional{a_info.required_subgroup_size.value()} : daxa::None, .entry_point = entry_point, }, .push_constant_size = a_info.push_constant_size, @@ -618,11 +842,11 @@ namespace daxa return Result(std::move(pipe_result)); } - auto ImplPipelineManager::create_raster_pipeline(RasterPipelineCompileInfo const & a_info) -> Result + auto ImplPipelineManager::create_raster_pipeline(RasterPipelineCompileInfo2 const & a_info) -> Result { - if (a_info.push_constant_size > MAX_PUSH_CONSTANT_BYTE_SIZE) + if (a_info.push_constant_size > DAXA_MAX_PUSH_CONSTANT_BYTE_SIZE) { - return Result(std::string("push constant size of ") + std::to_string(a_info.push_constant_size) + std::string(" exceeds the maximum size of ") + std::to_string(MAX_PUSH_CONSTANT_BYTE_SIZE)); + return Result(std::string("push constant size of ") + std::to_string(a_info.push_constant_size) + std::string(" exceeds the maximum size of ") + std::to_string(DAXA_MAX_PUSH_CONSTANT_BYTE_SIZE)); } if (a_info.push_constant_size % 4 != 0) { @@ -649,7 +873,7 @@ namespace daxa auto tesselation_evaluation_spirv_result = daxa::Result>("useless string"); auto task_spirv_result = daxa::Result>("useless string"); auto mesh_spirv_result = daxa::Result>("useless string"); - using ElemT = std::tuple *, Optional *, daxa::Result> *, ShaderStage>; + using ElemT = std::tuple *, Optional *, daxa::Result> *, ShaderStage>; auto const result_shader_compile_infos = std::array{ ElemT{&pipe_result.info.vertex_shader_info, &raster_pipeline_info.vertex_shader_info, &vertex_spirv_result, ShaderStage::VERT}, ElemT{&pipe_result.info.fragment_shader_info, &raster_pipeline_info.fragment_shader_info, &fragment_spirv_result, ShaderStage::FRAG}, @@ -679,15 +903,13 @@ namespace daxa *final_shader_info = daxa::ShaderInfo{ .byte_code = spv_result->value().data(), .byte_code_size = static_cast(spv_result->value().size()), - .create_flags = pipe_result_shader_info->value().compile_options.create_flags.value_or(ShaderCreateFlagBits::NONE), + .create_flags = pipe_result_shader_info->value().create_flags.value_or(ShaderCreateFlagBits::NONE), .required_subgroup_size = - pipe_result_shader_info->value().compile_options.required_subgroup_size.has_value() - ? Optional{pipe_result_shader_info->value().compile_options.required_subgroup_size.value()} - : daxa::None, + pipe_result_shader_info->value().required_subgroup_size.has_value() ? Optional{pipe_result_shader_info->value().required_subgroup_size.value()} : daxa::None, }; - if (pipe_result_shader_info->value().compile_options.language != ShaderLanguage::SLANG) + if (pipe_result_shader_info->value().language != ShaderLanguage::SLANG) { - final_shader_info->value().entry_point = {pipe_result_shader_info->value().compile_options.entry_point.value()}; + final_shader_info->value().entry_point = {pipe_result_shader_info->value().entry_point.value()}; } } } @@ -695,112 +917,6 @@ namespace daxa return Result(std::move(pipe_result)); } - auto ImplPipelineManager::add_ray_tracing_pipeline(RayTracingPipelineCompileInfo const & a_info) -> Result> - { - // DAXA_DBG_ASSERT_TRUE_M(!daxa::holds_alternative(a_info.shader_info.source), "must provide shader source"); - auto modified_info = a_info; - for (auto & shader_compile_info : modified_info.ray_gen_infos) - { - shader_compile_info.compile_options.inherit(this->info.shader_compile_options); - } - for (auto & shader_compile_info : modified_info.intersection_infos) - { - shader_compile_info.compile_options.inherit(this->info.shader_compile_options); - } - for (auto & shader_compile_info : modified_info.any_hit_infos) - { - shader_compile_info.compile_options.inherit(this->info.shader_compile_options); - } - for (auto & shader_compile_info : modified_info.callable_infos) - { - shader_compile_info.compile_options.inherit(this->info.shader_compile_options); - } - for (auto & shader_compile_info : modified_info.closest_hit_infos) - { - shader_compile_info.compile_options.inherit(this->info.shader_compile_options); - } - for (auto & shader_compile_info : modified_info.miss_hit_infos) - { - shader_compile_info.compile_options.inherit(this->info.shader_compile_options); - } - - auto pipe_result = create_ray_tracing_pipeline(modified_info); - if (pipe_result.is_err()) - { - return Result>(pipe_result.m); - } - this->ray_tracing_pipelines.push_back(pipe_result.value()); - if (this->info.register_null_pipelines_when_first_compile_fails) - { - auto result = Result>(std::move(pipe_result.value().pipeline_ptr)); - result.m = std::move(pipe_result.m); - return result; - } - else - { - return Result>(std::move(pipe_result.value().pipeline_ptr)); - } - } - - auto ImplPipelineManager::add_compute_pipeline(ComputePipelineCompileInfo const & a_info) -> Result> - { - DAXA_DBG_ASSERT_TRUE_M(!daxa::holds_alternative(a_info.shader_info.source), "must provide shader source"); - auto modified_info = a_info; - modified_info.shader_info.compile_options.inherit(this->info.shader_compile_options); - auto pipe_result = create_compute_pipeline(modified_info); - if (pipe_result.is_err()) - { - return Result>(pipe_result.m); - } - this->compute_pipelines.push_back(pipe_result.value()); - if (this->info.register_null_pipelines_when_first_compile_fails) - { - auto result = Result>(std::move(pipe_result.value().pipeline_ptr)); - result.m = std::move(pipe_result.m); - return result; - } - else - { - return Result>(std::move(pipe_result.value().pipeline_ptr)); - } - } - - auto ImplPipelineManager::add_raster_pipeline(RasterPipelineCompileInfo const & a_info) -> Result> - { - auto modified_info = a_info; - auto const modified_shader_compile_infos = std::array *, 6>{ - &modified_info.vertex_shader_info, - &modified_info.tesselation_control_shader_info, - &modified_info.tesselation_evaluation_shader_info, - &modified_info.fragment_shader_info, - &modified_info.mesh_shader_info, - &modified_info.task_shader_info, - }; - for (auto * shader_compile_info : modified_shader_compile_infos) - { - if (shader_compile_info->has_value()) - { - shader_compile_info->value().compile_options.inherit(this->info.shader_compile_options); - } - } - auto pipe_result = create_raster_pipeline(modified_info); - if (pipe_result.is_err()) - { - return Result>(pipe_result.m); - } - this->raster_pipelines.push_back(pipe_result.value()); - if (this->info.register_null_pipelines_when_first_compile_fails) - { - auto result = Result>(std::move(pipe_result.value().pipeline_ptr)); - result.m = std::move(pipe_result.m); - return result; - } - else - { - return Result>(std::move(pipe_result.value().pipeline_ptr)); - } - } - void ImplPipelineManager::remove_ray_tracing_pipeline(std::shared_ptr const & pipeline) { auto pipeline_iter = std::find_if( @@ -1061,7 +1177,7 @@ namespace daxa return true; } - static auto hash_shader_info(std::string const & source_string, ShaderCompileOptions const & compile_options, ImplPipelineManager::ShaderStage shader_stage) -> uint64_t + auto ImplPipelineManager::hash_shader_info(std::string const & source_string, ShaderCompileInfo2 const & compile_options, ImplPipelineManager::ShaderStage shader_stage) -> uint64_t { auto result = uint64_t{}; @@ -1070,14 +1186,14 @@ namespace daxa return h1 ^ (h2 << 1); }; - auto hash_shader_compile_options = [&hash_combine](ShaderCompileOptions const & options) -> uint64_t + auto hash_shader_compile_options = [this, &hash_combine](ShaderCompileInfo2 const & options) -> uint64_t { auto result = uint64_t{}; if (options.entry_point.has_value()) { result = hash_combine(result, std::hash{}(options.entry_point.value())); } - for (auto const & path : options.root_paths) + for (auto const & path : this->info.root_paths) { result = hash_combine(result, std::hash{}(path.string())); } @@ -1228,7 +1344,7 @@ namespace daxa return Result>(std::string_view{"no cache found"}); } - auto ImplPipelineManager::get_spirv(ShaderCompileInfo const & shader_info, std::string const & debug_name_opt, ShaderStage shader_stage) -> Result> + auto ImplPipelineManager::get_spirv(ShaderCompileInfo2 const & shader_info, std::string const & debug_name_opt, ShaderStage shader_stage) -> Result> { // TODO: Not internally threadsafe current_shader_info = &shader_info; @@ -1273,10 +1389,10 @@ namespace daxa } // TODO: Test if this is slow, as it's not needed if there's no shader cache. - auto shader_info_hash = hash_shader_info(code.string, shader_info.compile_options, shader_stage); - if (shader_info.compile_options.spirv_cache_folder.has_value()) + auto shader_info_hash = hash_shader_info(code.string, shader_info, shader_stage); + if (this->info.spirv_cache_folder.has_value()) { - auto cache_ret = try_load_shader_cache(shader_info.compile_options.spirv_cache_folder.value(), shader_info_hash); + auto cache_ret = try_load_shader_cache(this->info.spirv_cache_folder.value(), shader_info_hash); if (cache_ret.is_ok()) { return cache_ret; @@ -1285,10 +1401,10 @@ namespace daxa Result> ret = Result>("No shader was compiled"); - DAXA_DBG_ASSERT_TRUE_M(shader_info.compile_options.language.has_value(), "How did this happen? You mustn't provide a nullopt for the language"); + DAXA_DBG_ASSERT_TRUE_M(shader_info.language.has_value(), "How did this happen? You mustn't provide a nullopt for the language"); - DAXA_DBG_ASSERT_TRUE_M(shader_info.compile_options.language.has_value(), "You must have a shader language set when compiling GLSL"); - switch (shader_info.compile_options.language.value()) + DAXA_DBG_ASSERT_TRUE_M(shader_info.language.has_value(), "You must have a shader language set when compiling GLSL"); + switch (shader_info.language.value()) { #if DAXA_BUILT_WITH_UTILS_PIPELINE_MANAGER_GLSLANG case ShaderLanguage::GLSL: @@ -1310,9 +1426,9 @@ namespace daxa } spirv = ret.value(); - if (shader_info.compile_options.spirv_cache_folder.has_value()) + if (this->info.spirv_cache_folder.has_value()) { - save_shader_cache(shader_info.compile_options.spirv_cache_folder.value(), shader_info_hash, spirv); + save_shader_cache(this->info.spirv_cache_folder.value(), shader_info_hash, spirv); } } current_shader_info = nullptr; @@ -1327,13 +1443,13 @@ namespace daxa name = shader_file->path.string(); } - if (shader_info.compile_options.write_out_shader_binary.has_value()) + if (this->info.write_out_spirv.has_value()) { std::replace(name.begin(), name.end(), '/', '_'); std::replace(name.begin(), name.end(), '\\', '_'); std::replace(name.begin(), name.end(), ':', '_'); - name = name + "." + std::string{stage_string(shader_stage)} + "." + shader_info.compile_options.entry_point.value() + ".spv"; - auto out_folder = shader_info.compile_options.write_out_shader_binary.value(); + name = name + "." + std::string{stage_string(shader_stage)} + "." + shader_info.entry_point.value() + ".spv"; + auto out_folder = this->info.write_out_spirv.value(); std::filesystem::create_directories(out_folder); std::ofstream ofs(out_folder / name, std::ios_base::trunc | std::ios_base::binary); ofs.write(r_cast(spirv.data()), static_cast(spirv.size() * 4)); @@ -1375,7 +1491,7 @@ namespace daxa std::filesystem::path potential_path; if (this->current_shader_info != nullptr) { - for (auto const & root : this->current_shader_info->compile_options.root_paths) + for (auto const & root : this->info.root_paths) { potential_path.clear(); potential_path = root / path; @@ -1387,7 +1503,7 @@ namespace daxa } else { - for (auto & root : this->info.shader_compile_options.root_paths) + for (auto & root : this->info.root_paths) { potential_path.clear(); potential_path = root / path; @@ -1443,7 +1559,7 @@ namespace daxa return Result(err); } - auto ImplPipelineManager::get_spirv_glslang([[maybe_unused]] ShaderCompileInfo const & shader_info, [[maybe_unused]] std::string const & debug_name_opt, [[maybe_unused]] ShaderStage shader_stage, [[maybe_unused]] ShaderCode const & code) -> Result> + auto ImplPipelineManager::get_spirv_glslang([[maybe_unused]] ShaderCompileInfo2 const & shader_info, [[maybe_unused]] std::string const & debug_name_opt, [[maybe_unused]] ShaderStage shader_stage, [[maybe_unused]] ShaderCode const & code) -> Result> { #if DAXA_BUILT_WITH_UTILS_PIPELINE_MANAGER_GLSLANG auto translate_shader_stage = [](ShaderStage stage) -> EShLanguage @@ -1520,7 +1636,7 @@ namespace daxa preamble += "#extension GL_GOOGLE_include_directive : enable\n"; preamble += "#extension GL_KHR_memory_scope_semantics : enable\n"; - for (auto const & shader_define : shader_info.compile_options.defines) + for (auto const & shader_define : shader_info.defines) { if (!shader_define.value.empty()) { @@ -1549,7 +1665,7 @@ namespace daxa auto const * source_cstr = source_str.c_str(); auto const * name_cstr = name.c_str(); - bool const use_debug_info = shader_info.compile_options.enable_debug_info.value_or(false); + bool const use_debug_info = shader_info.enable_debug_info.value_or(false); shader.setStringsWithLengthsAndNames(&source_cstr, nullptr, &name_cstr, 1); shader.setEntryPoint("main"); @@ -1566,13 +1682,13 @@ namespace daxa static constexpr int SHADER_VERSION = 460; - if (shader_info.compile_options.write_out_preprocessed_code.has_value()) + if (this->info.write_out_preprocessed_code.has_value()) { std::replace(name.begin(), name.end(), '/', '_'); std::replace(name.begin(), name.end(), '\\', '_'); std::replace(name.begin(), name.end(), ':', '_'); std::string const file_name = std::string("preprocessed_") + name + "." + std::string(shader_stage_string(shader_stage)); - auto out_folder = shader_info.compile_options.write_out_preprocessed_code.value(); + auto out_folder = this->info.write_out_preprocessed_code.value(); std::filesystem::create_directories(out_folder); auto filepath = out_folder / file_name; std::string preprocessed_result = {}; @@ -1618,7 +1734,7 @@ namespace daxa #endif } - auto ImplPipelineManager::get_spirv_slang([[maybe_unused]] ShaderCompileInfo const & shader_info, [[maybe_unused]] ShaderStage shader_stage, [[maybe_unused]] ShaderCode const & code) -> Result> + auto ImplPipelineManager::get_spirv_slang([[maybe_unused]] ShaderCompileInfo2 const & shader_info, [[maybe_unused]] ShaderStage shader_stage, [[maybe_unused]] ShaderCode const & code) -> Result> { #if DAXA_BUILT_WITH_UTILS_PIPELINE_MANAGER_SLANG auto session = Slang::ComPtr{}; @@ -1626,17 +1742,17 @@ namespace daxa { auto search_paths_strings = std::vector{}; auto search_paths = std::vector{}; - search_paths_strings.reserve(shader_info.compile_options.root_paths.size()); - search_paths.reserve(shader_info.compile_options.root_paths.size()); - for (auto const & path : shader_info.compile_options.root_paths) + search_paths_strings.reserve(this->info.root_paths.size()); + search_paths.reserve(this->info.root_paths.size()); + for (auto const & path : this->info.root_paths) { search_paths_strings.push_back(path.string()); search_paths.push_back(search_paths_strings.back().c_str()); } auto macros = std::vector{}; - macros.reserve(shader_info.compile_options.defines.size()); - for (auto const & [name, value] : shader_info.compile_options.defines) + macros.reserve(shader_info.defines.size()); + for (auto const & [name, value] : shader_info.defines) { macros.push_back({name.c_str(), value.c_str()}); } @@ -1671,12 +1787,13 @@ namespace daxa { return Result>(std::string_view{"internal error: session->createCompileRequest(&slangRequest) returned nullptr"}); } - std::array cmd_args = { + std::array cmd_args = { // https://github.com/shader-slang/slang/issues/3532 // Disables warning for aliasing bindings. // clang-format off "-warnings-disable", "39001", "-O0", + "-g2", // clang-format on }; slangRequest->processCommandLineArguments(cmd_args.data(), static_cast(cmd_args.size())); @@ -1718,7 +1835,7 @@ namespace daxa { auto * entry_refl = spReflection_getEntryPointByIndex(refl, i); auto const * entry_name = spReflectionEntryPoint_getName(entry_refl); - if (strcmp(entry_name, shader_info.compile_options.entry_point.value().c_str()) == 0) + if (strcmp(entry_name, shader_info.entry_point.value().c_str()) == 0) { entry_point_index = i; break; @@ -1726,7 +1843,7 @@ namespace daxa } if (entry_point_index == -1) { - return Result>(error_message_prefix + "Failed to find entry point '" + shader_info.compile_options.entry_point.value() + "' in module"); + return Result>(error_message_prefix + "Failed to find entry point '" + shader_info.entry_point.value() + "' in module"); } slangRequest->getModule(translationUnitIndex, shader_module.writeRef()); diff --git a/src/utils/impl_pipeline_manager.hpp b/src/utils/impl_pipeline_manager.hpp index cbd4ba3a..6c60be13 100644 --- a/src/utils/impl_pipeline_manager.hpp +++ b/src/utils/impl_pipeline_manager.hpp @@ -52,7 +52,7 @@ namespace daxa RAY_CALLABLE, }; - PipelineManagerInfo info = {}; + PipelineManagerInfo2 info = {}; std::vector current_seen_shader_files = {}; ShaderFileTimeSet * current_observed_hotload_files = nullptr; @@ -68,19 +68,20 @@ namespace daxa ShaderFileTimeSet observed_hotload_files = {}; }; - using ComputePipelineState = PipelineState; - using RasterPipelineState = PipelineState; - using RayTracingPipelineState = PipelineState; + using ComputePipelineState = PipelineState; + using RasterPipelineState = PipelineState; + using RayTracingPipelineState = PipelineState; std::vector compute_pipelines; std::vector raster_pipelines; std::vector ray_tracing_pipelines; + // COMMENT(pahrens): epic code // TODO(grundlett): Maybe make the pipeline compiler *internally* thread-safe! // This variable is accessed by the includer, which makes that not thread-safe // PipelineManager is still externally thread-safe. You can create as many // PipelineManagers from as many threads as you'd like! - ShaderCompileInfo const * current_shader_info = nullptr; + ShaderCompileInfo2 const * current_shader_info = nullptr; #if DAXA_BUILT_WITH_UTILS_PIPELINE_MANAGER_GLSLANG struct GlslangBackend @@ -103,15 +104,12 @@ namespace daxa spvtools::SpirvTools spirv_tools = spvtools::SpirvTools{SPV_ENV_VULKAN_1_3}; #endif - ImplPipelineManager(PipelineManagerInfo && a_info); + ImplPipelineManager(PipelineManagerInfo2 && a_info); ~ImplPipelineManager(); - auto create_ray_tracing_pipeline(RayTracingPipelineCompileInfo const & a_info) -> Result; - auto create_compute_pipeline(ComputePipelineCompileInfo const & a_info) -> Result; - auto create_raster_pipeline(RasterPipelineCompileInfo const & a_info) -> Result; - auto add_ray_tracing_pipeline(RayTracingPipelineCompileInfo const & a_info) -> Result>; - auto add_compute_pipeline(ComputePipelineCompileInfo const & a_info) -> Result>; - auto add_raster_pipeline(RasterPipelineCompileInfo const & a_info) -> Result>; + auto create_ray_tracing_pipeline(RayTracingPipelineCompileInfo2 const & a_info) -> Result; + auto create_compute_pipeline(ComputePipelineCompileInfo2 const & a_info) -> Result; + auto create_raster_pipeline(RasterPipelineCompileInfo2 const & a_info) -> Result; void remove_ray_tracing_pipeline(std::shared_ptr const & pipeline); void remove_compute_pipeline(std::shared_ptr const & pipeline); void remove_raster_pipeline(std::shared_ptr const & pipeline); @@ -124,9 +122,11 @@ namespace daxa auto full_path_to_file(std::filesystem::path const & path) -> Result; auto load_shader_source_from_file(std::filesystem::path const & path) -> Result; - auto get_spirv(ShaderCompileInfo const & shader_info, std::string const & debug_name_opt, ShaderStage shader_stage) -> Result>; - auto get_spirv_glslang(ShaderCompileInfo const & shader_info, std::string const & debug_name_opt, ShaderStage shader_stage, ShaderCode const & code) -> Result>; - auto get_spirv_slang(ShaderCompileInfo const & shader_info, ShaderStage shader_stage, ShaderCode const & code) -> Result>; + + auto hash_shader_info(std::string const & source_string, ShaderCompileInfo2 const & compile_options, ImplPipelineManager::ShaderStage shader_stage) -> uint64_t; + auto get_spirv(ShaderCompileInfo2 const & shader_info, std::string const & debug_name_opt, ShaderStage shader_stage) -> Result>; + auto get_spirv_glslang(ShaderCompileInfo2 const & shader_info, std::string const & debug_name_opt, ShaderStage shader_stage, ShaderCode const & code) -> Result>; + auto get_spirv_slang(ShaderCompileInfo2 const & shader_info, ShaderStage shader_stage, ShaderCode const & code) -> Result>; static auto zero_ref_callback(ImplHandle const * handle); }; diff --git a/src/utils/impl_task_graph.cpp b/src/utils/impl_task_graph.cpp index 6dd0db63..8baac3bd 100644 --- a/src/utils/impl_task_graph.cpp +++ b/src/utils/impl_task_graph.cpp @@ -100,6 +100,8 @@ namespace daxa { switch (access) { + + case TaskImageAccess::SHADER_SAMPLED: [[fallthrough]]; case TaskImageAccess::GRAPHICS_SHADER_SAMPLED: [[fallthrough]]; case TaskImageAccess::VERTEX_SHADER_SAMPLED: [[fallthrough]]; case TaskImageAccess::TESSELLATION_CONTROL_SHADER_SAMPLED: [[fallthrough]]; @@ -111,6 +113,10 @@ namespace daxa case TaskImageAccess::COMPUTE_SHADER_SAMPLED: case TaskImageAccess::RAY_TRACING_SHADER_SAMPLED: return ImageUsageFlagBits::SHADER_SAMPLED; + case TaskImageAccess::SHADER_STORAGE_WRITE_ONLY: [[fallthrough]]; + case TaskImageAccess::SHADER_STORAGE_READ_ONLY: [[fallthrough]]; + case TaskImageAccess::SHADER_STORAGE_READ_WRITE: [[fallthrough]]; + case TaskImageAccess::SHADER_STORAGE_READ_WRITE_CONCURRENT: [[fallthrough]]; case TaskImageAccess::GRAPHICS_SHADER_STORAGE_WRITE_ONLY: [[fallthrough]]; case TaskImageAccess::GRAPHICS_SHADER_STORAGE_READ_ONLY: [[fallthrough]]; case TaskImageAccess::GRAPHICS_SHADER_STORAGE_READ_WRITE: [[fallthrough]]; @@ -191,9 +197,15 @@ namespace daxa auto task_image_access_to_layout_access(TaskImageAccess const & access) -> std::tuple { + auto any_shader_stage = PipelineStageFlagBits::ALL_GRAPHICS | PipelineStageFlagBits::COMPUTE_SHADER | PipelineStageFlagBits::RAY_TRACING_SHADER; switch (access) { case TaskImageAccess::NONE: return {ImageLayout::UNDEFINED, {PipelineStageFlagBits::NONE, AccessTypeFlagBits::NONE}, TaskAccessConcurrency::EXCLUSIVE}; + case TaskImageAccess::SHADER_SAMPLED: return {ImageLayout::READ_ONLY_OPTIMAL, {any_shader_stage, AccessTypeFlagBits::READ}, TaskAccessConcurrency::CONCURRENT}; + case TaskImageAccess::SHADER_STORAGE_WRITE_ONLY: return {ImageLayout::GENERAL, {any_shader_stage, AccessTypeFlagBits::READ}, TaskAccessConcurrency::EXCLUSIVE}; + case TaskImageAccess::SHADER_STORAGE_READ_ONLY: return {ImageLayout::GENERAL, {any_shader_stage, AccessTypeFlagBits::READ}, TaskAccessConcurrency::CONCURRENT}; + case TaskImageAccess::SHADER_STORAGE_READ_WRITE: return {ImageLayout::GENERAL, {any_shader_stage, AccessTypeFlagBits::READ_WRITE}, TaskAccessConcurrency::EXCLUSIVE}; + case TaskImageAccess::SHADER_STORAGE_READ_WRITE_CONCURRENT: return {ImageLayout::GENERAL, {any_shader_stage, AccessTypeFlagBits::READ_WRITE}, TaskAccessConcurrency::CONCURRENT}; case TaskImageAccess::GRAPHICS_SHADER_SAMPLED: return {ImageLayout::READ_ONLY_OPTIMAL, {PipelineStageFlagBits::ALL_GRAPHICS, AccessTypeFlagBits::READ}, TaskAccessConcurrency::EXCLUSIVE}; case TaskImageAccess::GRAPHICS_SHADER_STORAGE_WRITE_ONLY: return {ImageLayout::GENERAL, {PipelineStageFlagBits::PipelineStageFlagBits::ALL_GRAPHICS, AccessTypeFlagBits::WRITE}, TaskAccessConcurrency::EXCLUSIVE}; case TaskImageAccess::GRAPHICS_SHADER_STORAGE_READ_ONLY: return {ImageLayout::GENERAL, {PipelineStageFlagBits::PipelineStageFlagBits::ALL_GRAPHICS, AccessTypeFlagBits::READ}, TaskAccessConcurrency::CONCURRENT}; @@ -272,7 +284,7 @@ namespace daxa case TaskBufferAccess::READ: return {{PipelineStageFlagBits::ALL_COMMANDS, AccessTypeFlagBits::READ}, TaskAccessConcurrency::EXCLUSIVE}; case TaskBufferAccess::WRITE: return {{PipelineStageFlagBits::ALL_COMMANDS, AccessTypeFlagBits::WRITE}, TaskAccessConcurrency::EXCLUSIVE}; case TaskBufferAccess::READ_WRITE: return {{PipelineStageFlagBits::ALL_COMMANDS, AccessTypeFlagBits::READ_WRITE}, TaskAccessConcurrency::EXCLUSIVE}; - case TaskBufferAccess::READ_WRITE_CONCURRENT: return {{PipelineStageFlagBits::ALL_COMMANDS, AccessTypeFlagBits::READ_WRITE}, TaskAccessConcurrency::EXCLUSIVE}; + case TaskBufferAccess::READ_WRITE_CONCURRENT: return {{PipelineStageFlagBits::ALL_COMMANDS, AccessTypeFlagBits::READ_WRITE}, TaskAccessConcurrency::CONCURRENT}; case TaskBufferAccess::GRAPHICS_SHADER_READ: return {{PipelineStageFlagBits::ALL_GRAPHICS, AccessTypeFlagBits::READ}, TaskAccessConcurrency::CONCURRENT}; case TaskBufferAccess::GRAPHICS_SHADER_WRITE: return {{PipelineStageFlagBits::PipelineStageFlagBits::ALL_GRAPHICS, AccessTypeFlagBits::WRITE}, TaskAccessConcurrency::EXCLUSIVE}; case TaskBufferAccess::GRAPHICS_SHADER_READ_WRITE: return {{PipelineStageFlagBits::PipelineStageFlagBits::ALL_GRAPHICS, AccessTypeFlagBits::READ_WRITE}, TaskAccessConcurrency::EXCLUSIVE}; @@ -301,7 +313,7 @@ namespace daxa case TaskBufferAccess::TESSELLATION_CONTROL_SHADER_WRITE: return {{PipelineStageFlagBits::TESSELLATION_CONTROL_SHADER, AccessTypeFlagBits::WRITE}, TaskAccessConcurrency::EXCLUSIVE}; case TaskBufferAccess::TESSELLATION_CONTROL_SHADER_READ_WRITE: return {{PipelineStageFlagBits::TESSELLATION_CONTROL_SHADER, AccessTypeFlagBits::READ_WRITE}, TaskAccessConcurrency::EXCLUSIVE}; case TaskBufferAccess::TESSELLATION_CONTROL_SHADER_READ_WRITE_CONCURRENT: return {{PipelineStageFlagBits::TESSELLATION_CONTROL_SHADER, AccessTypeFlagBits::READ_WRITE}, TaskAccessConcurrency::CONCURRENT}; - case TaskBufferAccess::TESSELLATION_EVALUATION_SHADER_READ: return {{PipelineStageFlagBits::TESSELLATION_EVALUATION_SHADER, AccessTypeFlagBits::READ}, TaskAccessConcurrency::EXCLUSIVE}; + case TaskBufferAccess::TESSELLATION_EVALUATION_SHADER_READ: return {{PipelineStageFlagBits::TESSELLATION_EVALUATION_SHADER, AccessTypeFlagBits::READ}, TaskAccessConcurrency::CONCURRENT}; case TaskBufferAccess::TESSELLATION_EVALUATION_SHADER_WRITE: return {{PipelineStageFlagBits::TESSELLATION_EVALUATION_SHADER, AccessTypeFlagBits::WRITE}, TaskAccessConcurrency::EXCLUSIVE}; case TaskBufferAccess::TESSELLATION_EVALUATION_SHADER_READ_WRITE: return {{PipelineStageFlagBits::TESSELLATION_EVALUATION_SHADER, AccessTypeFlagBits::READ_WRITE}, TaskAccessConcurrency::EXCLUSIVE}; case TaskBufferAccess::TESSELLATION_EVALUATION_SHADER_READ_WRITE_CONCURRENT: return {{PipelineStageFlagBits::TESSELLATION_EVALUATION_SHADER, AccessTypeFlagBits::READ_WRITE}, TaskAccessConcurrency::CONCURRENT}; @@ -402,13 +414,11 @@ namespace daxa case daxa::TaskBufferAccess::HOST_TRANSFER_READ: return std::string_view{"HOST_TRANSFER_READ"}; case daxa::TaskBufferAccess::HOST_TRANSFER_WRITE: return std::string_view{"HOST_TRANSFER_WRITE"}; case daxa::TaskBufferAccess::HOST_TRANSFER_READ_WRITE: return std::string_view{"HOST_TRANSFER_READ_WRITE"}; - case daxa::TaskBufferAccess::ACCELERATION_STRUCTURE_BUILD_READ: return std::string_view{"HOST_TACCELERATION_STRUCTURE_BUILD_READRANSFER_WRITE"}; + case daxa::TaskBufferAccess::ACCELERATION_STRUCTURE_BUILD_READ: return std::string_view{"ACCELERATION_STRUCTURE_BUILD_READ"}; case daxa::TaskBufferAccess::ACCELERATION_STRUCTURE_BUILD_WRITE: return std::string_view{"ACCELERATION_STRUCTURE_BUILD_WRITE"}; case daxa::TaskBufferAccess::ACCELERATION_STRUCTURE_BUILD_READ_WRITE: return std::string_view{"ACCELERATION_STRUCTURE_BUILD_READ_WRITE"}; - case daxa::TaskBufferAccess::MAX_ENUM: return std::string_view{"MAX_ENUM"}; - default: DAXA_DBG_ASSERT_TRUE_M(false, "unreachable"); + default: return std::string_view{"UNIMPLEMENTED CASE"}; } - return "invalid"; } auto to_string(TaskBlasAccess const & usage) -> std::string_view @@ -426,46 +436,61 @@ namespace daxa switch (usage) { case daxa::TaskImageAccess::NONE: return std::string_view{"NONE"}; + case daxa::TaskImageAccess::SHADER_SAMPLED: return std::string_view{"SHADER_SAMPLED"}; + case daxa::TaskImageAccess::SHADER_STORAGE_WRITE_ONLY: return std::string_view{"SHADER_STORAGE_WRITE_ONLY"}; + case daxa::TaskImageAccess::SHADER_STORAGE_READ_ONLY: return std::string_view{"SHADER_STORAGE_READ_ONLY"}; + case daxa::TaskImageAccess::SHADER_STORAGE_READ_WRITE: return std::string_view{"SHADER_STORAGE_READ_WRITE"}; + case daxa::TaskImageAccess::SHADER_STORAGE_READ_WRITE_CONCURRENT: return std::string_view{"SHADER_STORAGE_READ_WRITE_CONCURRENT"}; case daxa::TaskImageAccess::GRAPHICS_SHADER_SAMPLED: return std::string_view{"GRAPHICS_SHADER_SAMPLED"}; - case daxa::TaskImageAccess::GRAPHICS_SHADER_STORAGE_READ_WRITE: return std::string_view{"GRAPHICS_SHADER_STORAGE_READ_WRITE"}; case daxa::TaskImageAccess::GRAPHICS_SHADER_STORAGE_WRITE_ONLY: return std::string_view{"GRAPHICS_SHADER_STORAGE_WRITE_ONLY"}; case daxa::TaskImageAccess::GRAPHICS_SHADER_STORAGE_READ_ONLY: return std::string_view{"GRAPHICS_SHADER_STORAGE_READ_ONLY"}; + case daxa::TaskImageAccess::GRAPHICS_SHADER_STORAGE_READ_WRITE: return std::string_view{"GRAPHICS_SHADER_STORAGE_READ_WRITE"}; + case daxa::TaskImageAccess::GRAPHICS_SHADER_STORAGE_READ_WRITE_CONCURRENT: return std::string_view{"GRAPHICS_SHADER_STORAGE_READ_WRITE_CONCURRENT"}; case daxa::TaskImageAccess::COMPUTE_SHADER_SAMPLED: return std::string_view{"COMPUTE_SHADER_SAMPLED"}; case daxa::TaskImageAccess::COMPUTE_SHADER_STORAGE_WRITE_ONLY: return std::string_view{"COMPUTE_SHADER_STORAGE_WRITE_ONLY"}; case daxa::TaskImageAccess::COMPUTE_SHADER_STORAGE_READ_ONLY: return std::string_view{"COMPUTE_SHADER_STORAGE_READ_ONLY"}; case daxa::TaskImageAccess::COMPUTE_SHADER_STORAGE_READ_WRITE: return std::string_view{"COMPUTE_SHADER_STORAGE_READ_WRITE"}; + case daxa::TaskImageAccess::COMPUTE_SHADER_STORAGE_READ_WRITE_CONCURRENT: return std::string_view{"COMPUTE_SHADER_STORAGE_READ_WRITE_CONCURRENT"}; case daxa::TaskImageAccess::RAY_TRACING_SHADER_SAMPLED: return std::string_view{"RAY_TRACING_SHADER_SAMPLED"}; case daxa::TaskImageAccess::RAY_TRACING_SHADER_STORAGE_WRITE_ONLY: return std::string_view{"RAY_TRACING_SHADER_STORAGE_WRITE_ONLY"}; case daxa::TaskImageAccess::RAY_TRACING_SHADER_STORAGE_READ_ONLY: return std::string_view{"RAY_TRACING_SHADER_STORAGE_READ_ONLY"}; case daxa::TaskImageAccess::RAY_TRACING_SHADER_STORAGE_READ_WRITE: return std::string_view{"RAY_TRACING_SHADER_STORAGE_READ_WRITE"}; + case daxa::TaskImageAccess::RAY_TRACING_SHADER_STORAGE_READ_WRITE_CONCURRENT: return std::string_view{"RAY_TRACING_SHADER_STORAGE_READ_WRITE_CONCURRENT"}; case daxa::TaskImageAccess::TASK_SHADER_SAMPLED: return std::string_view{"TASK_SHADER_SAMPLED"}; case daxa::TaskImageAccess::TASK_SHADER_STORAGE_WRITE_ONLY: return std::string_view{"TASK_SHADER_STORAGE_WRITE_ONLY"}; case daxa::TaskImageAccess::TASK_SHADER_STORAGE_READ_ONLY: return std::string_view{"TASK_SHADER_STORAGE_READ_ONLY"}; case daxa::TaskImageAccess::TASK_SHADER_STORAGE_READ_WRITE: return std::string_view{"TASK_SHADER_STORAGE_READ_WRITE"}; + case daxa::TaskImageAccess::TASK_SHADER_STORAGE_READ_WRITE_CONCURRENT: return std::string_view{"TASK_SHADER_STORAGE_READ_WRITE_CONCURRENT"}; case daxa::TaskImageAccess::MESH_SHADER_SAMPLED: return std::string_view{"MESH_SHADER_SAMPLED"}; case daxa::TaskImageAccess::MESH_SHADER_STORAGE_WRITE_ONLY: return std::string_view{"MESH_SHADER_STORAGE_WRITE_ONLY"}; case daxa::TaskImageAccess::MESH_SHADER_STORAGE_READ_ONLY: return std::string_view{"MESH_SHADER_STORAGE_READ_ONLY"}; case daxa::TaskImageAccess::MESH_SHADER_STORAGE_READ_WRITE: return std::string_view{"MESH_SHADER_STORAGE_READ_WRITE"}; + case daxa::TaskImageAccess::MESH_SHADER_STORAGE_READ_WRITE_CONCURRENT: return std::string_view{"MESH_SHADER_STORAGE_READ_WRITE_CONCURRENT"}; case daxa::TaskImageAccess::VERTEX_SHADER_SAMPLED: return std::string_view{"VERTEX_SHADER_SAMPLED"}; case daxa::TaskImageAccess::VERTEX_SHADER_STORAGE_WRITE_ONLY: return std::string_view{"VERTEX_SHADER_STORAGE_WRITE_ONLY"}; case daxa::TaskImageAccess::VERTEX_SHADER_STORAGE_READ_ONLY: return std::string_view{"VERTEX_SHADER_STORAGE_READ_ONLY"}; case daxa::TaskImageAccess::VERTEX_SHADER_STORAGE_READ_WRITE: return std::string_view{"VERTEX_SHADER_STORAGE_READ_WRITE"}; + case daxa::TaskImageAccess::VERTEX_SHADER_STORAGE_READ_WRITE_CONCURRENT: return std::string_view{"VERTEX_SHADER_STORAGE_READ_WRITE_CONCURRENT"}; case daxa::TaskImageAccess::TESSELLATION_CONTROL_SHADER_SAMPLED: return std::string_view{"TESSELLATION_CONTROL_SHADER_SAMPLED"}; case daxa::TaskImageAccess::TESSELLATION_CONTROL_SHADER_STORAGE_WRITE_ONLY: return std::string_view{"TESSELLATION_CONTROL_SHADER_STORAGE_WRITE_ONLY"}; case daxa::TaskImageAccess::TESSELLATION_CONTROL_SHADER_STORAGE_READ_ONLY: return std::string_view{"TESSELLATION_CONTROL_SHADER_STORAGE_READ_ONLY"}; case daxa::TaskImageAccess::TESSELLATION_CONTROL_SHADER_STORAGE_READ_WRITE: return std::string_view{"TESSELLATION_CONTROL_SHADER_STORAGE_READ_WRITE"}; + case daxa::TaskImageAccess::TESSELLATION_CONTROL_SHADER_STORAGE_READ_WRITE_CONCURRENT: return std::string_view{"TESSELLATION_CONTROL_SHADER_STORAGE_READ_WRITE_CONCURRENT"}; case daxa::TaskImageAccess::TESSELLATION_EVALUATION_SHADER_SAMPLED: return std::string_view{"TESSELLATION_EVALUATION_SHADER_SAMPLED"}; case daxa::TaskImageAccess::TESSELLATION_EVALUATION_SHADER_STORAGE_WRITE_ONLY: return std::string_view{"TESSELLATION_EVALUATION_SHADER_STORAGE_WRITE_ONLY"}; case daxa::TaskImageAccess::TESSELLATION_EVALUATION_SHADER_STORAGE_READ_ONLY: return std::string_view{"TESSELLATION_EVALUATION_SHADER_STORAGE_READ_ONLY"}; case daxa::TaskImageAccess::TESSELLATION_EVALUATION_SHADER_STORAGE_READ_WRITE: return std::string_view{"TESSELLATION_EVALUATION_SHADER_STORAGE_READ_WRITE"}; + case daxa::TaskImageAccess::TESSELLATION_EVALUATION_SHADER_STORAGE_READ_WRITE_CONCURRENT: return std::string_view{"TESSELLATION_EVALUATION_SHADER_STORAGE_READ_WRITE_CONCURRENT"}; case daxa::TaskImageAccess::GEOMETRY_SHADER_SAMPLED: return std::string_view{"GEOMETRY_SHADER_SAMPLED"}; case daxa::TaskImageAccess::GEOMETRY_SHADER_STORAGE_WRITE_ONLY: return std::string_view{"GEOMETRY_SHADER_STORAGE_WRITE_ONLY"}; case daxa::TaskImageAccess::GEOMETRY_SHADER_STORAGE_READ_ONLY: return std::string_view{"GEOMETRY_SHADER_STORAGE_READ_ONLY"}; case daxa::TaskImageAccess::GEOMETRY_SHADER_STORAGE_READ_WRITE: return std::string_view{"GEOMETRY_SHADER_STORAGE_READ_WRITE"}; + case daxa::TaskImageAccess::GEOMETRY_SHADER_STORAGE_READ_WRITE_CONCURRENT: return std::string_view{"GEOMETRY_SHADER_STORAGE_READ_WRITE_CONCURRENT"}; case daxa::TaskImageAccess::FRAGMENT_SHADER_SAMPLED: return std::string_view{"FRAGMENT_SHADER_SAMPLED"}; case daxa::TaskImageAccess::FRAGMENT_SHADER_STORAGE_WRITE_ONLY: return std::string_view{"FRAGMENT_SHADER_STORAGE_WRITE_ONLY"}; case daxa::TaskImageAccess::FRAGMENT_SHADER_STORAGE_READ_ONLY: return std::string_view{"FRAGMENT_SHADER_STORAGE_READ_ONLY"}; case daxa::TaskImageAccess::FRAGMENT_SHADER_STORAGE_READ_WRITE: return std::string_view{"FRAGMENT_SHADER_STORAGE_READ_WRITE"}; + case daxa::TaskImageAccess::FRAGMENT_SHADER_STORAGE_READ_WRITE_CONCURRENT: return std::string_view{"FRAGMENT_SHADER_STORAGE_READ_WRITE_CONCURRENT"}; case daxa::TaskImageAccess::TRANSFER_READ: return std::string_view{"TRANSFER_READ"}; case daxa::TaskImageAccess::TRANSFER_WRITE: return std::string_view{"TRANSFER_WRITE"}; case daxa::TaskImageAccess::COLOR_ATTACHMENT: return std::string_view{"COLOR_ATTACHMENT"}; @@ -478,9 +503,8 @@ namespace daxa case daxa::TaskImageAccess::RESOLVE_WRITE: return std::string_view{"RESOLVE_WRITE"}; case daxa::TaskImageAccess::PRESENT: return std::string_view{"PRESENT"}; case daxa::TaskImageAccess::MAX_ENUM: return std::string_view{"MAX_ENUM"}; - default: DAXA_DBG_ASSERT_TRUE_M(false, "unreachable"); + default: return std::string_view{"UNIMPLEMENTED CASE"}; } - return "invalid"; } ImplPersistentTaskBufferBlasTlas::ImplPersistentTaskBufferBlasTlas(TaskBufferInfo a_info) @@ -966,6 +990,7 @@ namespace daxa permutation.image_infos.emplace_back(PerPermTaskImage{ .valid = permutation.active, .swapchain_semaphore_waited_upon = false, + .usage = impl.info.additional_transient_image_usage_flags, }); } @@ -978,26 +1003,150 @@ namespace daxa return task_image_view; } - // static inline constexpr std::array NULL_BUF_ARRAY = {}; - // auto ImplTaskGraph::get_actual_buffers(TaskBufferView id, TaskGraphPermutation const & perm) const -> std::span - // { - // if (id.is_null()) - // { - // return NULL_BUF_ARRAY; - // } - // auto const & global_buffer = global_buffer_infos.at(id.index); - // if (global_buffer.is_persistent()) - // { - // return {global_buffer.get_persistent().actual_buffers.data(), - // global_buffer.get_persistent().actual_buffers.size()}; - // } - // else - // { - // auto const & perm_buffer = perm.buffer_infos.at(id.index); - // DAXA_DBG_ASSERT_TRUE_M(perm_buffer.valid, "Can not get actual buffer - buffer is not valid in this permutation"); - // return {&perm_buffer.actual_id, 1}; - // } - // } + DAXA_EXPORT_CXX auto TaskGraph::transient_buffer_info(TaskBufferView const & transient) -> TaskTransientBufferInfo const & + { + ImplTaskGraph & impl = *reinterpret_cast(this->object); + DAXA_DBG_ASSERT_TRUE_M(!transient.is_persistent(), "given view must be transient"); + DAXA_DBG_ASSERT_TRUE_M(transient.task_graph_index == impl.unique_index, "given view must be created by the given task graph"); + DAXA_DBG_ASSERT_TRUE_M(transient.index < impl.global_buffer_infos.size(), "given view has invalid index"); + + return daxa::get(impl.global_buffer_infos.at(transient.index).task_buffer_data).info; + } + + DAXA_EXPORT_CXX auto TaskGraph::transient_image_info(TaskImageView const & transient) -> TaskTransientImageInfo const & + { + ImplTaskGraph & impl = *reinterpret_cast(this->object); + DAXA_DBG_ASSERT_TRUE_M(!transient.is_persistent(), "given view must be transient"); + DAXA_DBG_ASSERT_TRUE_M(transient.task_graph_index == impl.unique_index, "given view must be created by the given task graph"); + DAXA_DBG_ASSERT_TRUE_M(transient.index < impl.global_image_infos.size(), "given view has invalid index"); + + return daxa::get(impl.global_image_infos.at(transient.index).task_image_data).info; + } + + DAXA_EXPORT_CXX void TaskGraph::clear_buffer(TaskBufferClearInfo const & info) + { + ImplTaskGraph & impl = *reinterpret_cast(this->object); + + auto const view = impl.buffer_blas_tlas_id_to_local_id(info.buffer); + + TaskBufferClearInfo cinfo = info; + add_task(InlineTaskInfo{ + .attachments = {inl_attachment(TaskBufferAccess::TRANSFER_WRITE, view)}, + .task = [=](TaskInterface ti) + { + for (u32 runtime_buf = 0; runtime_buf < ti.get(TaskBufferAttachmentIndex{0}).ids.size(); ++runtime_buf) + { + auto actual_size = ti.info(TaskBufferAttachmentIndex{0}, runtime_buf).value().size; + DAXA_DBG_ASSERT_TRUE_M(cinfo.offset < actual_size, "clear buffer offset must be smaller then actual buffer size"); + auto size = std::min(actual_size, cinfo.size) - cinfo.offset; + ti.recorder.clear_buffer(BufferClearInfo{ + .buffer = ti.get(TaskBufferAttachmentIndex{0}).ids[runtime_buf], + .offset = cinfo.offset, + .size = size, + .clear_value = cinfo.clear_value, + }); + } + }, + .name = info.name.size() > 0 ? std::string(info.name) : std::string("clear buffer: ") + std::string(impl.global_buffer_infos.at(view.index).get_name()), + }); + } + + DAXA_EXPORT_CXX void TaskGraph::clear_image(TaskImageClearInfo const & info) + { + ImplTaskGraph & impl = *reinterpret_cast(this->object); + + auto const view = impl.id_to_local_id(info.view); + + TaskImageClearInfo cinfo = info; + add_task(InlineTaskInfo{ + .attachments = {inl_attachment(TaskImageAccess::TRANSFER_WRITE, info.view)}, + .task = [=](TaskInterface ti) + { + for (u32 runtime_img = 0; runtime_img < ti.get(TaskImageAttachmentIndex{0}).ids.size(); ++runtime_img) + { + ti.recorder.clear_image(ImageClearInfo{ + .clear_value = cinfo.clear_value, + .dst_image = ti.get(TaskImageAttachmentIndex{0}).ids[runtime_img], + .dst_slice = cinfo.view.slice, + }); + } + }, + .name = info.name.size() > 0 ? std::string(info.name) : std::string("clear image: ") + std::string(impl.global_image_infos.at(view.index).get_name()), + }); + } + + DAXA_EXPORT_CXX void TaskGraph::copy_buffer_to_buffer(TaskBufferCopyInfo const & info) + { + ImplTaskGraph & impl = *reinterpret_cast(this->object); + auto src = impl.buffer_blas_tlas_id_to_local_id(info.src); + auto dst = impl.buffer_blas_tlas_id_to_local_id(info.dst); + + auto src_i = TaskBufferAttachmentIndex{0}; + auto dst_i = TaskBufferAttachmentIndex{1}; + + add_task(InlineTaskInfo{ + .attachments = { + inl_attachment(TaskBufferAccess::TRANSFER_READ, src), + inl_attachment(TaskBufferAccess::TRANSFER_WRITE, dst), + }, + .task = [=](TaskInterface ti) + { + DAXA_DBG_ASSERT_TRUE_M(ti.get(src_i).ids.size() == ti.get(dst_i).ids.size(), "given src and dst must have the same number of runtime resources"); + for (u32 runtime_buf = 0; runtime_buf < ti.get(TaskImageAttachmentIndex{0}).ids.size(); ++runtime_buf) + { + DAXA_DBG_ASSERT_TRUE_M(ti.info(src_i, runtime_buf).value().size == ti.info(dst_i, runtime_buf).value().size, "given src and dst must have the same size"); + ti.recorder.copy_buffer_to_buffer(BufferCopyInfo{ + .src_buffer = ti.get(src_i).ids[runtime_buf], + .dst_buffer = ti.get(src_i).ids[runtime_buf], + .size = ti.info(src_i, runtime_buf).value().size, + }); + } + }, + .name = info.name.size() > 0 ? std::string(info.name) : std::string("copy ") + std::string(impl.global_buffer_infos.at(src.index).get_name()) + " to " + std::string(impl.global_buffer_infos.at(dst.index).get_name()), + }); + } + + DAXA_EXPORT_CXX void TaskGraph::copy_image_to_image(TaskImageCopyInfo const & info) + { + ImplTaskGraph & impl = *reinterpret_cast(this->object); + auto src = impl.id_to_local_id(info.src); + auto dst = impl.id_to_local_id(info.dst); + + auto src_i = TaskImageAttachmentIndex{0}; + auto dst_i = TaskImageAttachmentIndex{1}; + + add_task(InlineTaskInfo{ + .attachments = { + inl_attachment(TaskImageAccess::TRANSFER_READ, src), + inl_attachment(TaskImageAccess::TRANSFER_WRITE, dst), + }, + .task = [=, copy_slice = src.slice](TaskInterface ti) + { + DAXA_DBG_ASSERT_TRUE_M(ti.get(src_i).ids.size() == ti.get(dst_i).ids.size(), "given src and dst must have the same number of runtime resources"); + for (u32 runtime_img = 0; runtime_img < ti.get(TaskImageAttachmentIndex{0}).ids.size(); ++runtime_img) + { + DAXA_DBG_ASSERT_TRUE_M(ti.info(src_i, runtime_img).value().size == ti.info(dst_i, runtime_img).value().size, "given src and dst must have the same size"); + DAXA_DBG_ASSERT_TRUE_M(ti.info(src_i, runtime_img).value().array_layer_count == ti.info(dst_i, runtime_img).value().array_layer_count, "given src and dst must have the same array layer count"); + DAXA_DBG_ASSERT_TRUE_M(ti.info(src_i, runtime_img).value().mip_level_count == ti.info(dst_i, runtime_img).value().mip_level_count, "given src and dst must have the same mip level count"); + for (u32 mip = copy_slice.base_mip_level; mip < (copy_slice.base_mip_level + copy_slice.level_count); ++mip) + { + const ImageArraySlice array_copy_slice = ImageArraySlice::slice(dst.slice, mip); + ti.recorder.copy_image_to_image(ImageCopyInfo{ + .src_image = ti.get(src_i).ids[runtime_img], + .dst_image = ti.get(dst_i).ids[runtime_img], + .src_slice = array_copy_slice, + .dst_slice = array_copy_slice, + .extent = { + std::max(1u, ti.info(src_i, runtime_img).value().size.x >> mip), + std::max(1u, ti.info(src_i, runtime_img).value().size.y >> mip), + std::max(1u, ti.info(src_i, runtime_img).value().size.z >> mip), + }}); + } + } + }, + .name = info.name.size() > 0 ? std::string(info.name) : std::string("copy ") + std::string(impl.global_image_infos.at(src.index).get_name()) + " to " + std::string(impl.global_image_infos.at(dst.index).get_name()), + }); + } static inline constexpr std::array NULL_IMG_ARRAY = {}; @@ -1073,15 +1222,18 @@ namespace daxa for (u32 index = 0; index < actual_images.size(); ++index) { ImageMipArraySlice const full_slice = impl.info.device.image_view_info(actual_images[index].default_view()).value().slice; - auto name_sw = impl.info.device.image_info(actual_images[index]).value().name; - std::string const & name = {name_sw.data(), name_sw.size()}; [[maybe_unused]] bool const use_within_runtime_image_counts = (access_slice.base_mip_level + access_slice.level_count <= full_slice.base_mip_level + full_slice.level_count) && (access_slice.base_array_layer + access_slice.layer_count <= full_slice.base_array_layer + full_slice.layer_count); - [[maybe_unused]] std::string const error_message = - std::format(R"(task image argument (arg index: {}, task image: "{}", slice: {}) exceeds runtime image (index: {}, name: "{}") dimensions ({})!)", - use_index, task_name, to_string(access_slice), index, name, to_string(full_slice)); - DAXA_DBG_ASSERT_TRUE_M(use_within_runtime_image_counts, error_message); + if (!use_within_runtime_image_counts) + { + auto name_sw = impl.info.device.image_info(actual_images[index]).value().name; + std::string const & name = {name_sw.data(), name_sw.size()}; + [[maybe_unused]] std::string const error_message = + std::format(R"(task image argument (arg index: {}, task image: "{}", slice: {}) exceeds runtime image (index: {}, name: "{}") dimensions ({})!)", + use_index, task_name, to_string(access_slice), index, name, to_string(full_slice)); + DAXA_DBG_ASSERT_TRUE_M(use_within_runtime_image_counts, error_message); + } } #endif } @@ -1149,7 +1301,7 @@ namespace daxa imgs_last_exec.push_back(img); } validate_runtime_image_slice(*this, permutation, task_image_attach_index, tid.index, slice); - validate_image_attachs(*this, permutation, task_image_attach_index, tid.index, image_attach.access, task.base_task->name()); + validate_image_attachs(*this, permutation, task_image_attach_index, tid.index, image_attach.task_access, task.base_task->name()); for (auto & view : view_cache) { if (info.device.is_id_valid(view)) @@ -1168,29 +1320,29 @@ namespace daxa for (auto parent : actual_images) { ImageViewInfo view_info = info.device.image_view_info(parent.default_view()).value(); - ImageViewType const use_view_type = (image_attach.view_type != ImageViewType::MAX_ENUM) ? image_attach.view_type : view_info.type; - if (parent.default_view() == daxa::ImageViewId{}) + // Attachments that do not fill out the view type do not get a view generated! + if (image_attach.view_type != ImageViewType::MAX_ENUM) { - printf("bruh view\n"); - } - if (parent == daxa::ImageId{}) - { - printf("bruh image\n"); - } + ImageViewType const use_view_type = image_attach.view_type; - // When the use image view parameters match the default view, - // then use the default view id and avoid creating a new id here. - bool const is_use_default_slice = view_info.slice == slice; - bool const is_use_default_view_type = use_view_type == view_info.type; - if (is_use_default_slice && is_use_default_view_type) - { - view_cache.push_back(parent.default_view()); + // When the use image view parameters match the default view, + // then use the default view id and avoid creating a new id here. + bool const is_use_default_slice = view_info.slice == slice; + bool const is_use_default_view_type = use_view_type == view_info.type; + if (is_use_default_slice && is_use_default_view_type) + { + view_cache.push_back(parent.default_view()); + } + else + { + view_info.type = use_view_type; + view_info.slice = slice; + view_cache.push_back(info.device.create_image_view(view_info)); + } } else { - view_info.type = use_view_type; - view_info.slice = slice; - view_cache.push_back(info.device.create_image_view(view_info)); + view_cache.push_back({}); } } } @@ -1291,10 +1443,11 @@ namespace daxa #endif // #if DAXA_VALIDATION } - auto write_attachment_shader_blob(Device device, u32 data_size, std::span attachments) -> std::vector + constexpr usize ATTACHMENT_BLOB_MAX_SIZE = 8192; + + auto write_attachment_shader_blob(Device const & device, [[maybe_unused]] u32 data_size, std::span attachments) -> std::array { - std::vector attachment_shader_blob = {}; - attachment_shader_blob.resize(data_size); + std::array attachment_shader_blob = {}; usize shader_byte_blob_offset = 0; auto upalign = [&](size_t align_size) { @@ -1389,7 +1542,7 @@ namespace daxa return attachment_shader_blob; } - void ImplTaskGraph::execute_task(ImplTaskRuntimeInterface & impl_runtime, TaskGraphPermutation & permutation, u32 batch_index, TaskBatchId in_batch_task_index, TaskId task_id) + void ImplTaskGraph::execute_task(ImplTaskRuntimeInterface & impl_runtime, TaskGraphPermutation & permutation, usize batch_index, TaskBatchId in_batch_task_index, TaskId task_id) { // We always allow to reuse the last command list ONCE within the task callback. // When the get command list function is called in a task this is set to false. @@ -1410,25 +1563,42 @@ namespace daxa attach.view_ids = std::span{task.image_view_cache[index].data(), task.image_view_cache[index].size()}; validate_task_image_runtime_data(task, attach); }); - std::vector attachment_shader_blob = write_attachment_shader_blob( - info.device, - task.base_task->attachment_shader_blob_size(), - task.base_task->attachments()); + std::array attachment_shader_blob = + write_attachment_shader_blob( + info.device, + task.base_task->attachment_shader_blob_size(), + task.base_task->attachments() + ); impl_runtime.current_task = &task; if (this->info.enable_command_labels) { + static std::string tag = {}; + tag.clear(); + std::format_to(std::back_inserter(tag), "batch {} task {} \"{}\"", batch_index, in_batch_task_index, task.base_task->name()); + SmallString stag = SmallString{tag}; impl_runtime.recorder.begin_label({ .label_color = info.task_label_color, - .name = std::string("batch ") + std::to_string(batch_index) + std::string(" task ") + std::to_string(in_batch_task_index) + std::string(" \"") + std::string(task.base_task->name()) + std::string("\""), + .name = stag, }); } - task.base_task->callback(TaskInterface{ + auto interface = TaskInterface{ .device = this->info.device, .recorder = impl_runtime.recorder, .attachment_infos = task.base_task->attachments(), .allocator = this->staging_memory.has_value() ? &this->staging_memory.value() : nullptr, - .attachment_shader_blob = attachment_shader_blob, - }); + .attachment_shader_blob = { attachment_shader_blob.data(), task.base_task->attachment_shader_blob_size() }, + .task_name = task.base_task->name(), + .task_index = task_id, + }; + if (info.pre_task_callback) + { + info.pre_task_callback(interface); + } + task.base_task->callback(interface); + if (info.post_task_callback) + { + info.post_task_callback(interface); + } if (this->info.enable_command_labels) { impl_runtime.recorder.end_label(); @@ -1542,21 +1712,29 @@ namespace daxa return; } - auto [current_buffer_access, current_access_concurrency] = task_buffer_access_to_access(static_cast(attach.access)); + auto [current_buffer_access, current_access_concurrency] = task_buffer_access_to_access(static_cast(attach.task_access)); // Every other access (NONE, READ_WRITE, WRITE) are interpreted as writes in this context. - // TODO(msakmary): improve scheduling here to reorder reads in front of each other, respecting the last to read barrier if present! // When a buffer has been read in a previous use AND the current task also reads the buffer, // we must insert the task at or after the last use batch. - usize current_buffer_first_possible_batch_index = task_buffer.latest_access_batch_index; // When two buffer accesses intersect, we potentially need to insert a ner barrier or modify an existing barrier. // If the access is a read on read or a rw_concurrent on rw_concurrent, the task is still allowed within the same batch as the task of the previous access. // This means that two tasks reading from buffer X are allowed within the same batch, using the same barrier. // If they are not inserted within the same batch due to dependencies of other attachments, daxa will still reuse the barriers. // This is only possible for read write concurrent and read access sequences! AccessRelation relation{task_buffer, current_buffer_access, current_access_concurrency}; - if (!relation.are_both_read && !relation.are_both_rw_concurrent && !relation.is_previous_none) + usize current_buffer_first_possible_batch_index = 0; + if (relation.is_previous_none) + { + current_buffer_first_possible_batch_index = task_buffer.latest_access_batch_index; + } + else if (relation.are_both_concurrent && (task_buffer.latest_concurrent_sequence_start_batch != ~0u)) + { + // N following concurrent accesses are allowed to be reordered to any point within a concurrent access sequence. + current_buffer_first_possible_batch_index = task_buffer.latest_concurrent_sequence_start_batch; + } + else { - current_buffer_first_possible_batch_index += 1; + current_buffer_first_possible_batch_index = task_buffer.latest_access_batch_index + 1; } first_possible_batch_index = std::max(first_possible_batch_index, current_buffer_first_possible_batch_index); }, @@ -1581,7 +1759,7 @@ namespace daxa } } - auto [this_task_image_layout, this_task_image_access, current_access_concurrent] = task_image_access_to_layout_access(attach.access); + auto [this_task_image_layout, this_task_image_access, current_access_concurrent] = task_image_access_to_layout_access(attach.task_access); // As image subresources can be in different layouts and also different synchronization scopes, // we need to track these image ranges individually. for (ExtendedImageSliceState const & tracked_slice : task_image.last_slice_states) @@ -1596,16 +1774,25 @@ namespace daxa continue; } // Tasks are always shedules after or with the tasks they depend on. - usize current_image_first_possible_batch_index = tracked_slice.latest_access_batch_index; // When two image accesses intersect, we potentially need to insert a ner barrier or modify an existing barrier. // If the access is a read on read or a rw_concurrent on rw_concurrent, the task is still allowed within the same batch as the task of the previous access. // This means that two tasks reading from image X are allowed within the same batch, using the same barrier. // If they are not inserted within the same batch due to dependencies of other attachments, daxa will still reuse the barriers. // This is only possible for read write concurrent and read access sequences! AccessRelation relation{tracked_slice, this_task_image_access, current_access_concurrent, tracked_slice.state.latest_layout, this_task_image_layout}; - if (!relation.are_both_read_and_same_layout && !relation.are_both_rw_concurrent_and_same_layout) + usize current_image_first_possible_batch_index = 0; + if (relation.is_previous_none) + { + current_image_first_possible_batch_index = tracked_slice.latest_access_batch_index; + } + else if (relation.are_both_concurrent_and_same_layout && (tracked_slice.latest_concurrent_sequence_start_batch != ~0u)) + { + // N following concurrent accesses are allowed to be reordered to any point within a concurrent access sequence. + current_image_first_possible_batch_index = tracked_slice.latest_concurrent_sequence_start_batch; + } + else { - current_image_first_possible_batch_index += 1; + current_image_first_possible_batch_index = tracked_slice.latest_access_batch_index + 1; } first_possible_batch_index = std::max(first_possible_batch_index, current_image_first_possible_batch_index); } @@ -1842,11 +2029,12 @@ namespace daxa if (buffer_attach.view.is_null()) return; PerPermTaskBuffer & task_buffer = this->buffer_infos[buffer_attach.translated_view.index]; - auto [current_buffer_access, current_access_concurrency] = task_buffer_access_to_access(static_cast(buffer_attach.access)); + auto [current_buffer_access, current_access_concurrency] = task_buffer_access_to_access(static_cast(buffer_attach.task_access)); update_buffer_first_access(task_buffer, batch_index, current_submit_scope_index, current_buffer_access); // For transient buffers, we need to record first and last use so that we can later name their allocations. // TODO(msakmary, pahrens) We should think about how to combine this with update_buffer_first_access below since // they both overlap in what they are doing + buffer_attach.access = current_buffer_access; if (!task_graph_impl.global_buffer_infos.at(buffer_attach.translated_view.index).is_persistent()) { auto & buffer_first_use = task_buffer.lifetime.first_use; @@ -1930,6 +2118,7 @@ namespace daxa { // In an uninterrupted sequence of concurrent accesses we need to remember the fist concurrent access and the barrier. task_buffer.latest_concurrent_access_barrer_index = LastConcurrentAccessBarrierIndex{barrier_index}; + task_buffer.latest_concurrent_sequence_start_batch = batch_index; } } else @@ -1955,6 +2144,7 @@ namespace daxa { // In an uninterrupted sequence of concurrent accesses we need to remember the fist concurrent access and the barrier. task_buffer.latest_concurrent_access_barrer_index = LastConcurrentAccessSplitBarrierIndex{split_barrier_index}; + task_buffer.latest_concurrent_sequence_start_batch = batch_index; } } } @@ -1970,7 +2160,7 @@ namespace daxa if (image_attach.view.is_null()) return; auto const & used_image_t_id = image_attach.translated_view; - auto const & used_image_t_access = image_attach.access; + auto const & used_image_t_access = image_attach.task_access; auto const & initial_used_image_slice = image_attach.translated_view.slice; PerPermTaskImage & task_image = this->image_infos[used_image_t_id.index]; // For transient images we need to record first and last use so that we can later name their allocations @@ -2005,6 +2195,7 @@ namespace daxa task_image.create_flags |= view_type_to_create_flags(image_attach.view_type); auto [current_image_layout, current_image_access, current_access_concurrency] = task_image_access_to_layout_access(used_image_t_access); image_attach.layout = current_image_layout; + image_attach.access = current_image_access; // Now this seems strange, why would be need multiple current use slices, as we only have one here. // This is because when we intersect this slice with the tracked slices, we get an intersection and a rest. // We need to then test the rest against all the remaining tracked uses, @@ -2142,6 +2333,7 @@ namespace daxa // As the new access is a read we remember our barrier index, // So that potential future reads after this can reuse this barrier. ret_new_use_tracked_slice.latest_concurrent_access_barrer_index = LastConcurrentAccessBarrierIndex{barrier_index}; + ret_new_use_tracked_slice.latest_concurrent_sequence_start_batch = batch_index; } } else @@ -2171,6 +2363,7 @@ namespace daxa // Need to remember the first concurrent access. // In case of multiple concurrent accesses following on each other, the first barrier in the sequence can be reused for all accesses. ret_new_use_tracked_slice.latest_concurrent_access_barrer_index = LastConcurrentAccessSplitBarrierIndex{split_barrier_index}; + ret_new_use_tracked_slice.latest_concurrent_sequence_start_batch = batch_index; } } } @@ -3418,7 +3611,7 @@ namespace daxa task.base_task->attachments(), [&](u32, auto const & attach) { - auto [access, is_concurrent] = task_buffer_access_to_access(static_cast(attach.access)); + auto [access, is_concurrent] = task_buffer_access_to_access(static_cast(attach.task_access)); std::string_view type_str = buffer_blas_tlas_str(attach.translated_view, permutation); std::format_to(std::back_inserter(out), "{}{} argument:\n", indent, type_str); std::format_to(std::back_inserter(out), "{}access: ({})\n", indent, to_string(access)); @@ -3427,7 +3620,7 @@ namespace daxa }, [&](u32, TaskImageAttachmentInfo const & img) { - auto [layout, access, is_concurrent] = task_image_access_to_layout_access(img.access); + auto [layout, access, is_concurrent] = task_image_access_to_layout_access(img.task_access); std::format_to(std::back_inserter(out), "{}image argument:\n", indent); std::format_to(std::back_inserter(out), "{}access: ({})\n", indent, to_string(access)); std::format_to(std::back_inserter(out), "{}layout: {}\n", indent, to_string(layout)); diff --git a/src/utils/impl_task_graph.hpp b/src/utils/impl_task_graph.hpp index c46c142d..d18fb7b2 100644 --- a/src/utils/impl_task_graph.hpp +++ b/src/utils/impl_task_graph.hpp @@ -60,6 +60,11 @@ namespace daxa // When the last index was a read and an additional read is followed after, // we will combine all barriers into one, which is the first barrier that the first read generates. Variant latest_concurrent_access_barrer_index = Monostate{}; + // Used to reorder tasks to the earliest possible batch within the current concurrent scope. + // This is the first batch where the resource is completely usable in the access state given. + // This means all barriers are done even split barriers are done at this point. + /// WARNING: THIS DOES NOT MEAN THAT THIS IS THE FIRST BATCH AFTER THE PREVIOUS ACCESS. THE FIRST TASK TO USE THIS ACCESS DETERMINES THE START BATCH. THIS SHOULD BE IMPROVED. WE COULD FOR EXAMPLE STORE THE PRIOR DEPENDENCY TASKS/BATCHES FOR THE CURRENT CONCURRENT SEQUENCE! + usize latest_concurrent_sequence_start_batch = ~0u; std::variant actual_id = BufferId{}; ResourceLifetime lifetime = {}; @@ -76,6 +81,11 @@ namespace daxa // When the last index was a read and an additional read is followed after, // we will combine all barriers into one, which is the first barrier that the first read generates. Variant latest_concurrent_access_barrer_index = Monostate{}; + // Used to reorder tasks to the earliest possible batch within the current concurrent scope. + // This is the first batch where the resource is completely usable in the access state given. + // This means all barriers are done even split barriers are done at this point. + /// WARNING: THIS DOES NOT MEAN THAT THIS IS THE FIRST BATCH AFTER THE PREVIOUS ACCESS. THE FIRST TASK TO USE THIS ACCESS DETERMINES THE START BATCH. THIS SHOULD BE IMPROVED. WE COULD FOR EXAMPLE STORE THE PRIOR DEPENDENCY TASKS/BATCHES FOR THE CURRENT CONCURRENT SEQUENCE! + usize latest_concurrent_sequence_start_batch = ~0u; }; struct PerPermTaskImage @@ -488,7 +498,7 @@ namespace daxa auto id_to_local_id(TaskImageView id) const -> TaskImageView; void update_active_permutations(); void update_image_view_cache(ImplTask & task, TaskGraphPermutation const & permutation); - void execute_task(ImplTaskRuntimeInterface & impl_runtime, TaskGraphPermutation & permutation, u32 batch_index, TaskBatchId in_batch_task_index, TaskId task_id); + void execute_task(ImplTaskRuntimeInterface & impl_runtime, TaskGraphPermutation & permutation, usize batch_index, TaskBatchId in_batch_task_index, TaskId task_id); void insert_pre_batch_barriers(TaskGraphPermutation & permutation); void create_transient_runtime_buffers(TaskGraphPermutation & permutation); void create_transient_runtime_images(TaskGraphPermutation & permutation); diff --git a/tests/0_common/base_app.hpp b/tests/0_common/base_app.hpp index 126148e6..01e669d2 100644 --- a/tests/0_common/base_app.hpp +++ b/tests/0_common/base_app.hpp @@ -1,4 +1,5 @@ #pragma once +#define SAMPLE_SHADER_LANGUAGE DAXA_LANGUAGE_GLSL #include <0_common/window.hpp> @@ -20,10 +21,6 @@ using Clock = std::chrono::high_resolution_clock; #endif #define APPNAME_PREFIX(x) ("[" APPNAME "] " x) -#if !defined(DAXA_SHADERLANG) -#define DAXA_SHADERLANG DAXA_SHADERLANG_GLSL -#endif - template struct BaseApp : AppWindow { @@ -58,9 +55,9 @@ struct BaseApp : AppWindow DAXA_SAMPLE_PATH "/shaders", "tests/0_common/shaders", }, -#if DAXA_SHADERLANG == DAXA_SHADERLANG_GLSL +#if SAMPLE_SHADER_LANGUAGE == DAXA_LANGUAGE_GLSL .language = daxa::ShaderLanguage::GLSL, -#elif DAXA_SHADERLANG == DAXA_SHADERLANG_SLANG +#elif SAMPLE_SHADER_LANGUAGE == DAXA_LANGUAGE_SLANG .language = daxa::ShaderLanguage::SLANG, #endif .enable_debug_info = true, diff --git a/tests/2_daxa_api/10_raytracing/main.cpp b/tests/2_daxa_api/10_raytracing/main.cpp index 9d7efcad..8789c229 100644 --- a/tests/2_daxa_api/10_raytracing/main.cpp +++ b/tests/2_daxa_api/10_raytracing/main.cpp @@ -422,7 +422,6 @@ namespace tests // .shader_info = daxa::ShaderCompileInfo{ // .source = daxa::ShaderFile{"shaders.glsl"}, // }, - // .push_constant_size = sizeof(PushConstant), // .name = "ray query comp shader", // }; // comp_pipeline = pipeline_manager.add_compute_pipeline(compute_pipe_info).value(); @@ -543,7 +542,6 @@ namespace tests }, }, .max_ray_recursion_depth = 2, - .push_constant_size = sizeof(PushConstant), .name = "basic ray tracing pipeline", }; rt_pipeline = pipeline_manager.add_ray_tracing_pipeline(ray_tracing_pipe_info).value(); diff --git a/tests/2_daxa_api/11_mesh_shader/main.cpp b/tests/2_daxa_api/11_mesh_shader/main.cpp index 839878ba..8c2bf32d 100644 --- a/tests/2_daxa_api/11_mesh_shader/main.cpp +++ b/tests/2_daxa_api/11_mesh_shader/main.cpp @@ -1,3 +1,4 @@ +#define DAXA_REMOVE_DEPRECATED 0 #include #include #include @@ -148,7 +149,6 @@ auto main() -> int }, .color_attachments = {{.format = swapchain.get_format()}}, .raster = {.static_state_sample_count = daxa::None}, - // .push_constant_size = sizeof(DrawTri::attachment_shader_blob_size()), .name = "my pipeline", }); if (result.is_err()) diff --git a/tests/2_daxa_api/12_async_queues/main.cpp b/tests/2_daxa_api/12_async_queues/main.cpp index 4d326ee2..bc2ad381 100644 --- a/tests/2_daxa_api/12_async_queues/main.cpp +++ b/tests/2_daxa_api/12_async_queues/main.cpp @@ -113,8 +113,8 @@ namespace tests daxa::Instance instance = daxa::create_instance({}); daxa::Device device = instance.create_device_2(instance.choose_device({}, {})); - daxa::ExecutableCommandList commands = {}; { + daxa::ExecutableCommandList commands = {}; auto rec = device.create_command_recorder({}); commands = rec.complete_current_commands(); } @@ -330,7 +330,6 @@ namespace tests }, .color_attachments = {{.format = swapchain.get_format()}}, .raster = {.static_state_sample_count = daxa::None}, - // .push_constant_size = sizeof(DrawTri::attachment_shader_blob_size()), .name = "my pipeline", }); if (result.is_err()) diff --git a/tests/2_daxa_api/2_device/main.cpp b/tests/2_daxa_api/2_device/main.cpp index 6067dc31..1a788ee2 100644 --- a/tests/2_daxa_api/2_device/main.cpp +++ b/tests/2_daxa_api/2_device/main.cpp @@ -37,15 +37,16 @@ namespace tests daxa::ExplicitFeatureFlags required_explicit_features = {}; // Implicit features are ones that always get enabled when present. daxa::ImplicitFeatureFlags required_implicit_features = {}; - if (!(properties.explicit_features & required_explicit_features) || !(properties.implicit_features & required_implicit_features)) + if (((properties.explicit_features & required_explicit_features) != required_explicit_features) || + ((properties.implicit_features & required_implicit_features) != required_implicit_features)) { continue; } - + device_info.physical_device_index = i; break; } - + // Note there are a number of other qualities one should check for to choose a device other then missing features! // For this purpose daxa has an automatic device choose function: instance.choose_device() which takes required features and a device info to pick the first fit. // auto device = instance.create_device_2(instance.choose_device({}/* required implicit features */, device_info)); diff --git a/tests/2_daxa_api/6_task_graph/main.cpp b/tests/2_daxa_api/6_task_graph/main.cpp index 7eea3b85..b7fd5019 100644 --- a/tests/2_daxa_api/6_task_graph/main.cpp +++ b/tests/2_daxa_api/6_task_graph/main.cpp @@ -24,7 +24,7 @@ struct TestTask : TestTaskHead::Task { [[maybe_unused]] daxa::BufferId id = ti.get(AT.buffer0).ids[0]; [[maybe_unused]] char const * name = ti.get(AT.buffer0).name; - [[maybe_unused]] daxa::TaskBufferAccess access = ti.get(AT.buffer0).access; + [[maybe_unused]] daxa::TaskBufferAccess access = ti.get(AT.buffer0).task_access; [[maybe_unused]] u8 shader_array_size = ti.get(AT.buffer0).shader_array_size; [[maybe_unused]] bool shader_as_address = ti.get(AT.buffer0).shader_as_address; [[maybe_unused]] daxa::TaskBufferView view = ti.get(AT.buffer0).view; @@ -33,7 +33,7 @@ struct TestTask : TestTaskHead::Task // The Image Attachment info contents: { [[maybe_unused]] char const * name = ti.get(AT.image0).name; - [[maybe_unused]] daxa::TaskImageAccess access = ti.get(AT.image0).access; + [[maybe_unused]] daxa::TaskImageAccess access = ti.get(AT.image0).task_access; [[maybe_unused]] daxa::ImageViewType view_type = ti.get(AT.image0).view_type; [[maybe_unused]] u8 shader_array_size = ti.get(AT.image0).shader_array_size; [[maybe_unused]] daxa::TaskHeadImageArrayType shader_array_type = ti.get(AT.image0).shader_array_type; @@ -424,7 +424,6 @@ namespace tests .enable_debug_info = true, }, }, - .push_constant_size = sizeof(ShaderIntegrationTaskHead::AttachmentShaderBlob), .name = "compute_pipeline", }); auto compute_pipeline = compile_result.value(); diff --git a/tests/2_daxa_api/6_task_graph/mipmapping.hpp b/tests/2_daxa_api/6_task_graph/mipmapping.hpp index 06deb1e2..5286bb97 100644 --- a/tests/2_daxa_api/6_task_graph/mipmapping.hpp +++ b/tests/2_daxa_api/6_task_graph/mipmapping.hpp @@ -8,36 +8,6 @@ namespace tests DAXA_TH_IMAGE(TRANSFER_READ, REGULAR_2D, lower_mip) DAXA_TH_IMAGE(TRANSFER_WRITE, REGULAR_2D, higher_mip) DAXA_DECL_TASK_HEAD_END - struct MipMapTask : MipMapH::Task - { - AttachmentViews views = {}; - struct Info - { - u32 mip = {}; - std::array mip_size = {}; - std::array next_mip_size = {}; - } info = {}; - void callback(daxa::TaskInterface tri) - { - tri.recorder.blit_image_to_image({ - .src_image = tri.get(AT.lower_mip).ids[0], - .dst_image = tri.get(AT.higher_mip).ids[0], - .src_slice = { - .mip_level = info.mip, - .base_array_layer = 0, - .layer_count = 1, - }, - .src_offsets = {{{0, 0, 0}, {info.mip_size[0], info.mip_size[1], info.mip_size[2]}}}, - .dst_slice = { - .mip_level = info.mip + 1, - .base_array_layer = 0, - .layer_count = 1, - }, - .dst_offsets = {{{0, 0, 0}, {info.next_mip_size[0], info.next_mip_size[1], info.next_mip_size[2]}}}, - .filter = daxa::Filter::LINEAR, - }); - } - }; void mipmapping() { @@ -82,7 +52,6 @@ namespace tests std::shared_ptr compute_pipeline = [&]() { auto result = pipeline_manager.add_compute_pipeline({ .shader_info = {.source = daxa::ShaderFile{"mipmapping.glsl"}}, - .push_constant_size = sizeof(MipmappingComputePushConstant), .name = "compute_pipeline", }); std::cout << result.to_string() << std::endl; @@ -511,15 +480,22 @@ namespace tests for (u32 i = 0; i < image_info.mip_level_count - 1; ++i) { std::array next_mip_size = {std::max(1, mip_size[0] / 2), std::max(1, mip_size[1] / 2), std::max(1, mip_size[2] / 2)}; - new_task_graph.add_task(MipMapTask{ + new_task_graph.add_task(daxa::InlineTaskWithHead{ .views = std::array{ - daxa::attachment_view(MipMapH::AT.lower_mip, task_render_image.view().view({.base_mip_level = i})), - daxa::attachment_view(MipMapH::AT.higher_mip, task_render_image.view().view({.base_mip_level = i + 1})), + MipMapH::AT.lower_mip | task_render_image.view().view({.base_mip_level = i}), + MipMapH::AT.higher_mip | task_render_image.view().view({.base_mip_level = i + 1}), }, - .info = { - .mip = i, - .mip_size = mip_size, - .next_mip_size = next_mip_size, + .task = [=](daxa::TaskInterface ti) + { + ti.recorder.blit_image_to_image({ + .src_image = ti.get(MipMapH::AT.lower_mip).ids[0], + .dst_image = ti.get(MipMapH::AT.higher_mip).ids[0], + .src_slice = { .mip_level = i }, + .src_offsets = {{{0, 0, 0}, {mip_size[0], mip_size[1], mip_size[2]}}}, + .dst_slice = { .mip_level = i + 1 }, + .dst_offsets = {{{0, 0, 0}, {next_mip_size[0], next_mip_size[1], next_mip_size[2]}}}, + .filter = daxa::Filter::LINEAR, + }); }, }); mip_size = next_mip_size; diff --git a/tests/2_daxa_api/6_task_graph/transient_overlap.hpp b/tests/2_daxa_api/6_task_graph/transient_overlap.hpp index 8c6050e4..c153e554 100644 --- a/tests/2_daxa_api/6_task_graph/transient_overlap.hpp +++ b/tests/2_daxa_api/6_task_graph/transient_overlap.hpp @@ -129,7 +129,6 @@ namespace tests .compile_options = { .defines = std::vector{daxa::ShaderDefine{"TEST_IMAGE", "1"}}}, }, - .push_constant_size = sizeof(TestImagePush), .name = "test image pipeline", }; @@ -266,7 +265,6 @@ namespace tests .compile_options = { .defines = std::vector{daxa::ShaderDefine{"TEST_IMAGE", "1"}}}, }, - .push_constant_size = sizeof(TestImagePush), .name = "test image pipeline", }; @@ -419,7 +417,6 @@ namespace tests .compile_options = { .defines = std::vector{daxa::ShaderDefine{"TEST_IMAGE", "1"}}}, }, - .push_constant_size = sizeof(TestImagePush), .name = "test image", }; auto test_image_pipeline = pipeline_manager.add_compute_pipeline(test_image_pipeline_info).value(); @@ -428,7 +425,6 @@ namespace tests .shader_info = { .source = daxa::ShaderFile{"transient.glsl"}, }, - .push_constant_size = sizeof(TestImagePush), .name = "test buffer", }; auto test_buffer_pipeline = pipeline_manager.add_compute_pipeline(test_buffer_pipeline_info).value(); diff --git a/tests/2_daxa_api/7_pipeline_manager/main.cpp b/tests/2_daxa_api/7_pipeline_manager/main.cpp index ee99f113..41767e3c 100644 --- a/tests/2_daxa_api/7_pipeline_manager/main.cpp +++ b/tests/2_daxa_api/7_pipeline_manager/main.cpp @@ -92,7 +92,7 @@ namespace tests auto perf(daxa::Device & device) -> i32 { - daxa::PipelineManager pipeline_manager_ = daxa::PipelineManager({.device = device}); + daxa::PipelineManager pipeline_manager_ = daxa::PipelineManager(daxa::PipelineManagerInfo2{.device = device}); using Clock = std::chrono::high_resolution_clock; auto t0 = Clock::now(); diff --git a/tests/2_daxa_api/8_mem/main.cpp b/tests/2_daxa_api/8_mem/main.cpp index 9aac862d..d2df48e5 100644 --- a/tests/2_daxa_api/8_mem/main.cpp +++ b/tests/2_daxa_api/8_mem/main.cpp @@ -37,7 +37,7 @@ auto main() -> int }); // Can allocate anywhere in the frame with imediately available staging memory. - daxa::TransferMemoryPool::Allocation alloc = tmem.allocate(ELEMENT_COUNT, 8).value(); + daxa::TransferMemoryPool::Allocation alloc = tmem.allocate(ELEMENT_COUNT * sizeof(uint32_t), 8).value(); for (u32 i = 0; i < ELEMENT_COUNT; ++i) { // The Allocation provides a host pointer to the memory. diff --git a/tests/2_daxa_api/9_shader_integration/main.cpp b/tests/2_daxa_api/9_shader_integration/main.cpp index 6af997bf..29e5cccf 100644 --- a/tests/2_daxa_api/9_shader_integration/main.cpp +++ b/tests/2_daxa_api/9_shader_integration/main.cpp @@ -106,7 +106,6 @@ namespace tests .enable_debug_info = true, }, }, - .push_constant_size = sizeof(TestShaderTaskHead::AttachmentShaderBlob), .name = "compute_pipeline", }); auto compute_pipeline = compile_result.value(); @@ -195,7 +194,6 @@ namespace tests .enable_debug_info = true, }, }, - .push_constant_size = sizeof(BindlessTestPush), .name = "bindless_access", }); auto bindless_access = compile_result0.value(); @@ -206,7 +204,6 @@ namespace tests .enable_debug_info = true, }, }, - .push_constant_size = sizeof(BindlessTestFollowPush), .name = "bindless_access_followup", }); auto bindless_access_followup = compile_result1.value(); diff --git a/tests/3_samples/0_rectangle_cutting/main.cpp b/tests/3_samples/0_rectangle_cutting/main.cpp index 6657ca51..98d5c49e 100644 --- a/tests/3_samples/0_rectangle_cutting/main.cpp +++ b/tests/3_samples/0_rectangle_cutting/main.cpp @@ -72,7 +72,6 @@ struct App : AppWindow }, }}, .raster = {}, - .push_constant_size = sizeof(DrawPush), .name = ("raster_pipeline"), }).value(); // clang-format on diff --git a/tests/3_samples/1_mandelbrot/main.cpp b/tests/3_samples/1_mandelbrot/main.cpp index 2521b49f..105dd302 100644 --- a/tests/3_samples/1_mandelbrot/main.cpp +++ b/tests/3_samples/1_mandelbrot/main.cpp @@ -5,6 +5,8 @@ using namespace daxa::types; #include "shaders/shared.inl" +#define SHADER_LANGUAGE DAXA_LANGUAGE_SLANG + struct App : BaseApp { bool my_toggle = true; @@ -14,12 +16,12 @@ struct App : BaseApp { pipeline_manager.add_virtual_file({ .name = "custom file!!", -#if DAXA_SHADERLANG == DAXA_SHADERLANG_GLSL +#if SHADER_LANGUAGE == DAXA_LANGUAGE_GLSL .contents = R"( #pragma once #define MY_TOGGLE 1 )", -#elif DAXA_SHADERLANG == DAXA_SHADERLANG_SLANG +#elif SHADER_LANGUAGE == DAXA_LANGUAGE_SLANG .contents = R"(static const bool MY_TOGGLE = true;)", #endif }); @@ -28,12 +30,12 @@ struct App : BaseApp { pipeline_manager.add_virtual_file({ .name = "custom file!!", -#if DAXA_SHADERLANG == DAXA_SHADERLANG_GLSL +#if SHADER_LANGUAGE == DAXA_LANGUAGE_GLSL .contents = R"( #pragma once #define MY_TOGGLE 0 )", -#elif DAXA_SHADERLANG == DAXA_SHADERLANG_SLANG +#elif SHADER_LANGUAGE == DAXA_LANGUAGE_SLANG .contents = R"(static const bool MY_TOGGLE = false;)", #endif }); @@ -43,19 +45,13 @@ struct App : BaseApp // clang-format off std::shared_ptr compute_pipeline = [this]() { update_virtual_shader(); - return pipeline_manager.add_compute_pipeline({ -#if DAXA_SHADERLANG == DAXA_SHADERLANG_GLSL - .shader_info = {.source = daxa::ShaderFile{"compute.glsl"}}, -#elif DAXA_SHADERLANG == DAXA_SHADERLANG_SLANG - .shader_info = { - .source = daxa::ShaderFile{"compute.slang"}, - .compile_options = { - .entry_point = "entry_mandelbrot", - }, - }, + return pipeline_manager.add_compute_pipeline2({ +#if SHADER_LANGUAGE == DAXA_LANGUAGE_GLSL + .source = daxa::ShaderFile{"compute.glsl"}, +#elif SHADER_LANGUAGE == DAXA_LANGUAGE_SLANG + .source = daxa::ShaderFile{"compute.slang"}, + .entry_point = "entry_mandelbrot", #endif - .push_constant_size = sizeof(ComputePush), - .name = "compute_pipeline", }).value(); }(); // clang-format on diff --git a/tests/3_samples/1_mandelbrot/shaders/shared.inl b/tests/3_samples/1_mandelbrot/shaders/shared.inl index 30a459d1..9cc2940b 100644 --- a/tests/3_samples/1_mandelbrot/shaders/shared.inl +++ b/tests/3_samples/1_mandelbrot/shaders/shared.inl @@ -11,7 +11,7 @@ DAXA_DECL_BUFFER_PTR(GpuInput) struct ComputePush { -#if DAXA_SHADERLANG == DAXA_SHADERLANG_GLSL +#if DAXA_LANGUAGE == DAXA_LANGUAGE_GLSL daxa_ImageViewId image_id; daxa_BufferId input_buffer_id; daxa_BufferPtr(GpuInput) ptr; diff --git a/tests/3_samples/2_mpm_mls/main.cpp b/tests/3_samples/2_mpm_mls/main.cpp index 06202b27..18715906 100644 --- a/tests/3_samples/2_mpm_mls/main.cpp +++ b/tests/3_samples/2_mpm_mls/main.cpp @@ -1,4 +1,4 @@ -#define DAXA_SHADERLANG DAXA_SHADERLANG_GLSL +#define SAMPLE_SHADER_LANGUAGE DAXA_LANGUAGE_GLSL // #define DAXA_SIMULATION_WATER_MPM_MLS // #define DAXA_SIMULATION_MANY_MATERIALS #define DAXA_ATOMIC_FLOAT_FLAG @@ -81,12 +81,12 @@ struct App : BaseApp { pipeline_manager.add_virtual_file({ .name = "custom file!!", -#if DAXA_SHADERLANG == DAXA_SHADERLANG_GLSL +#if SAMPLE_SHADER_LANGUAGE == DAXA_LANGUAGE_GLSL .contents = R"( #pragma once #define MY_TOGGLE 1 )", -#elif DAXA_SHADERLANG == DAXA_SHADERLANG_SLANG +#elif SAMPLE_SHADER_LANGUAGE == DAXA_LANGUAGE_SLANG .contents = R"(static const bool MY_TOGGLE = true;)", #endif }); @@ -95,12 +95,12 @@ struct App : BaseApp { pipeline_manager.add_virtual_file({ .name = "custom file!!", -#if DAXA_SHADERLANG == DAXA_SHADERLANG_GLSL +#if SAMPLE_SHADER_LANGUAGE == DAXA_LANGUAGE_GLSL .contents = R"( #pragma once #define MY_TOGGLE 0 )", -#elif DAXA_SHADERLANG == DAXA_SHADERLANG_SLANG +#elif SAMPLE_SHADER_LANGUAGE == DAXA_LANGUAGE_SLANG .contents = R"(static const bool MY_TOGGLE = false;)", #endif }); @@ -111,7 +111,7 @@ struct App : BaseApp std::shared_ptr p2g_compute_pipeline = [this]() { update_virtual_shader(); return pipeline_manager.add_compute_pipeline({ -#if DAXA_SHADERLANG == DAXA_SHADERLANG_GLSL +#if SAMPLE_SHADER_LANGUAGE == DAXA_LANGUAGE_GLSL .shader_info = { .source = daxa::ShaderFile{"compute.glsl"}, .compile_options = { @@ -122,10 +122,9 @@ struct App : BaseApp #endif // DAXA_SIMULATION_WATER_MPM_MLS } }, -#elif DAXA_SHADERLANG == DAXA_SHADERLANG_SLANG +#elif SAMPLE_SHADER_LANGUAGE == DAXA_LANGUAGE_SLANG .shader_info = {.source = daxa::ShaderFile{"compute.slang"}, .compile_options = {.entry_point = "entry_MPM_P2G"}}, #endif - .push_constant_size = sizeof(ComputePush), .name = "p2g_compute_pipeline", }).value(); }(); @@ -136,17 +135,16 @@ struct App : BaseApp std::shared_ptr p2g_second_compute_pipeline = [this]() { update_virtual_shader(); return pipeline_manager.add_compute_pipeline({ -#if DAXA_SHADERLANG == DAXA_SHADERLANG_GLSL +#if SAMPLE_SHADER_LANGUAGE == DAXA_LANGUAGE_GLSL .shader_info = { .source = daxa::ShaderFile{"compute.glsl"}, .compile_options = { .defines = std::vector{daxa::ShaderDefine{"P2G_WATER_SECOND_COMPUTE_FLAG", "1"}}, } }, -#elif DAXA_SHADERLANG == DAXA_SHADERLANG_SLANG +#elif SAMPLE_SHADER_LANGUAGE == DAXA_LANGUAGE_SLANG .shader_info = {.source = daxa::ShaderFile{"compute.slang"}, .compile_options = {.entry_point = "entry_MPM_P2G"}}, #endif - .push_constant_size = sizeof(ComputePush), .name = "p2g_second_compute_pipeline", }).value(); }(); @@ -157,17 +155,16 @@ struct App : BaseApp std::shared_ptr grid_compute_pipeline = [this]() { update_virtual_shader(); return pipeline_manager.add_compute_pipeline({ -#if DAXA_SHADERLANG == DAXA_SHADERLANG_GLSL +#if SAMPLE_SHADER_LANGUAGE == DAXA_LANGUAGE_GLSL .shader_info = { .source = daxa::ShaderFile{"compute.glsl"}, .compile_options = { .defines = std::vector{daxa::ShaderDefine{"GRID_COMPUTE_FLAG", "1"}}, } }, -#elif DAXA_SHADERLANG == DAXA_SHADERLANG_SLANG +#elif SAMPLE_SHADER_LANGUAGE == DAXA_LANGUAGE_SLANG .shader_info = {.source = daxa::ShaderFile{"compute.slang"}, .compile_options = {.entry_point = "entry_MPM_grid"}}, #endif - .push_constant_size = sizeof(ComputePush), .name = "grid_compute_pipeline", }).value(); }(); @@ -177,7 +174,7 @@ struct App : BaseApp std::shared_ptr g2p_compute_pipeline = [this]() { update_virtual_shader(); return pipeline_manager.add_compute_pipeline({ -#if DAXA_SHADERLANG == DAXA_SHADERLANG_GLSL +#if SAMPLE_SHADER_LANGUAGE == DAXA_LANGUAGE_GLSL .shader_info = { .source = daxa::ShaderFile{"compute.glsl"}, .compile_options = { @@ -188,10 +185,9 @@ struct App : BaseApp #endif // DAXA_SIMULATION_WATER_MPM_MLS } }, -#elif DAXA_SHADERLANG == DAXA_SHADERLANG_SLANG +#elif SAMPLE_SHADER_LANGUAGE == DAXA_LANGUAGE_SLANG .shader_info = {.source = daxa::ShaderFile{"compute.slang"}, .compile_options = {.entry_point = "entry_MPM_G2P"}}, #endif - .push_constant_size = sizeof(ComputePush), .name = "g2p_compute_pipeline", }).value(); }(); @@ -201,19 +197,18 @@ struct App : BaseApp std::shared_ptr sphere_tracing_compute_pipeline = [this]() { update_virtual_shader(); return pipeline_manager.add_compute_pipeline({ -#if DAXA_SHADERLANG == DAXA_SHADERLANG_GLSL +#if SAMPLE_SHADER_LANGUAGE == DAXA_LANGUAGE_GLSL .shader_info = { .source = daxa::ShaderFile{"compute.glsl"}, .compile_options = { .defines = std::vector{daxa::ShaderDefine{"SPHERE_TRACING_FLAG", "1"}}, } }, -#elif DAXA_SHADERLANG == DAXA_SHADERLANG_SLANG +#elif SAMPLE_SHADER_LANGUAGE == DAXA_LANGUAGE_SLANG .shader_info = {.source = daxa::ShaderFile{"compute.slang"}, .compile_options = { .entry_point = "entry_sphere_tracing", },}, #endif - .push_constant_size = sizeof(ComputePush), .name = "sphere_tracing_compute_pipeline", }).value(); }(); @@ -224,9 +219,9 @@ struct App : BaseApp update_virtual_shader(); auto rt_gen_shader = daxa::ShaderCompileInfo{ -#if DAXA_SHADERLANG == DAXA_SHADERLANG_GLSL +#if SAMPLE_SHADER_LANGUAGE == DAXA_LANGUAGE_GLSL .source = daxa::ShaderFile{"raytracing.glsl"}, -#elif DAXA_SHADERLANG == DAXA_SHADERLANG_SLANG +#elif SAMPLE_SHADER_LANGUAGE == DAXA_LANGUAGE_SLANG .source = daxa::ShaderFile{"raytracing.slang"}, .compile_options = { .entry_point = "rayGenShader", @@ -235,9 +230,9 @@ struct App : BaseApp }; auto rt_miss_shader = daxa::ShaderCompileInfo{ -#if DAXA_SHADERLANG == DAXA_SHADERLANG_GLSL +#if SAMPLE_SHADER_LANGUAGE == DAXA_LANGUAGE_GLSL .source = daxa::ShaderFile{"raytracing.glsl"}, -#elif DAXA_SHADERLANG == DAXA_SHADERLANG_SLANG +#elif SAMPLE_SHADER_LANGUAGE == DAXA_LANGUAGE_SLANG .source = daxa::ShaderFile{"raytracing.slang"}, .compile_options = { .entry_point = "missShader", @@ -246,12 +241,12 @@ struct App : BaseApp }; auto rt_miss_shadow_shader = daxa::ShaderCompileInfo{ -#if DAXA_SHADERLANG == DAXA_SHADERLANG_GLSL +#if SAMPLE_SHADER_LANGUAGE == DAXA_LANGUAGE_GLSL .source = daxa::ShaderFile{"raytracing.glsl"}, .compile_options = { .defines = std::vector{daxa::ShaderDefine{"DAXA_SHADOW_RAY_FLAG", "1"}}, }, -#elif DAXA_SHADERLANG == DAXA_SHADERLANG_SLANG +#elif SAMPLE_SHADER_LANGUAGE == DAXA_LANGUAGE_SLANG .source = daxa::ShaderFile{"raytracing.slang"}, .compile_options = { .entry_point = "missShadowShader", @@ -260,9 +255,9 @@ struct App : BaseApp }; auto rt_closest_hit_shader = daxa::ShaderCompileInfo{ -#if DAXA_SHADERLANG == DAXA_SHADERLANG_GLSL +#if SAMPLE_SHADER_LANGUAGE == DAXA_LANGUAGE_GLSL .source = daxa::ShaderFile{"raytracing.glsl"}, -#elif DAXA_SHADERLANG == DAXA_SHADERLANG_SLANG +#elif SAMPLE_SHADER_LANGUAGE == DAXA_LANGUAGE_SLANG .source = daxa::ShaderFile{"raytracing.slang"}, .compile_options = { .entry_point = "closestHitShader", @@ -271,9 +266,9 @@ struct App : BaseApp }; auto rt_intersection_shader = daxa::ShaderCompileInfo{ -#if DAXA_SHADERLANG == DAXA_SHADERLANG_GLSL +#if SAMPLE_SHADER_LANGUAGE == DAXA_LANGUAGE_GLSL .source = daxa::ShaderFile{"raytracing.glsl"}, -#elif DAXA_SHADERLANG == DAXA_SHADERLANG_SLANG +#elif SAMPLE_SHADER_LANGUAGE == DAXA_LANGUAGE_SLANG .source = daxa::ShaderFile{"raytracing.slang"}, .compile_options = { .entry_point = "intersectionShader", @@ -317,7 +312,6 @@ struct App : BaseApp }, }, .max_ray_recursion_depth = 2, - .push_constant_size = sizeof(ComputePush), .name = "ray tracing pipeline", }).value(); }(); diff --git a/tests/3_samples/3_hello_triangle_compute/main.cpp b/tests/3_samples/3_hello_triangle_compute/main.cpp index 2159eab9..7836e02f 100644 --- a/tests/3_samples/3_hello_triangle_compute/main.cpp +++ b/tests/3_samples/3_hello_triangle_compute/main.cpp @@ -1,4 +1,5 @@ -#define DAXA_SHADERLANG DAXA_SHADERLANG_GLSL +#define SAMPLE_SHADER_LANGUAGE DAXA_LANGUAGE_GLSL + #define APPNAME "Daxa Sample: HelloTriangle Compute" #include <0_common/base_app.hpp> @@ -9,12 +10,11 @@ struct App : BaseApp { // clang-format off std::shared_ptr compute_pipeline = pipeline_manager.add_compute_pipeline({ -#if DAXA_SHADERLANG == DAXA_SHADERLANG_GLSL +#if SAMPLE_SHADER_LANGUAGE == DAXA_LANGUAGE_GLSL .shader_info = {.source = daxa::ShaderFile{"compute.glsl"}}, -#elif DAXA_SHADERLANG == DAXA_SHADERLANG_SLANG +#elif SAMPLE_SHADER_LANGUAGE == DAXA_LANGUAGE_SLANG .shader_info = {.source = daxa::ShaderFile{"compute.hlsl"}}, #endif - .push_constant_size = sizeof(ComputePush), .name = "compute_pipeline", }).value(); // clang-format on diff --git a/tests/3_samples/5_boids/main.cpp b/tests/3_samples/5_boids/main.cpp index 6d71a7fe..d7ea0866 100644 --- a/tests/3_samples/5_boids/main.cpp +++ b/tests/3_samples/5_boids/main.cpp @@ -69,12 +69,10 @@ struct App : AppWindow .fragment_shader_info = daxa::ShaderCompileInfo{.source = daxa::ShaderFile{"frag.glsl"}}, .color_attachments = {{.format = swapchain.get_format()}}, .raster = {}, - .push_constant_size = sizeof(DrawPushConstant), .name = ("draw_pipeline"), }).value(); std::shared_ptr update_boids_pipeline = pipeline_manager.add_compute_pipeline({ .shader_info = {.source = daxa::ShaderFile{"update_boids.glsl"}}, - .push_constant_size = sizeof(UpdateBoidsPushConstant), .name = ("draw_pipeline"), }).value(); // clang-format on @@ -162,10 +160,10 @@ struct App : AppWindow struct DrawBoidsTask : daxa::PartialTask<2, "DrawBoids"> { static inline daxa::TaskBufferAttachmentIndex const boids = add_attachment(daxa::TaskBufferAttachment{ - .access = daxa::TaskBufferAccess::VERTEX_SHADER_READ, + .task_access = daxa::TaskBufferAccess::VERTEX_SHADER_READ, }); static inline daxa::TaskImageAttachmentIndex const render_image = add_attachment(daxa::TaskImageAttachment{ - .access = daxa::TaskImageAccess::COLOR_ATTACHMENT, + .task_access = daxa::TaskImageAccess::COLOR_ATTACHMENT, }); AttachmentViews views = {}; std::shared_ptr draw_pipeline = {}; diff --git a/tests/4_hello_daxa/1_pink_screen/main.cpp b/tests/4_hello_daxa/1_pink_screen/main.cpp index 8911ca9e..27ecb7fb 100644 --- a/tests/4_hello_daxa/1_pink_screen/main.cpp +++ b/tests/4_hello_daxa/1_pink_screen/main.cpp @@ -99,8 +99,8 @@ auto main() -> int // These features pose no downsides, so they are always enabled when present. // We must check if the gpu supports the implicit features we want for the device. daxa::ImplicitFeatureFlags required_implicit_features = {}; - if ((required_explicit_features & properties.explicit_features) != required_explicit_features || - (required_implicit_features & properties.implicit_features) != required_implicit_features) + if (((properties.explicit_features & required_explicit_features) != required_explicit_features) || + ((properties.implicit_features & required_implicit_features) != required_implicit_features)) { continue; } diff --git a/tests/4_hello_daxa/2_triangle/main.cpp b/tests/4_hello_daxa/2_triangle/main.cpp index c6049d97..93a06df9 100644 --- a/tests/4_hello_daxa/2_triangle/main.cpp +++ b/tests/4_hello_daxa/2_triangle/main.cpp @@ -259,7 +259,6 @@ auto main() -> int .fragment_shader_info = daxa::ShaderCompileInfo{.source = daxa::ShaderFile{"main.glsl"}}, .color_attachments = {{.format = swapchain.get_format()}}, .raster = {}, - .push_constant_size = sizeof(MyPushConstant), .name = "my pipeline", }); if (result.is_err())