{-# language CPP #-}
-- | = Name
--
-- VK_EXT_shader_object - device extension
--
-- = VK_EXT_shader_object
--
-- [__Name String__]
--     @VK_EXT_shader_object@
--
-- [__Extension Type__]
--     Device extension
--
-- [__Registered Extension Number__]
--     483
--
-- [__Revision__]
--     1
--
-- [__Ratification Status__]
--     Ratified
--
-- [__Extension and Version Dependencies__]
--             
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_get_physical_device_properties2 VK_KHR_get_physical_device_properties2>
--              or
--             
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#versions-1.1 Vulkan Version 1.1>
--          and
--         
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_dynamic_rendering VK_KHR_dynamic_rendering>
--     or
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#versions-1.3 Vulkan Version 1.3>
--
-- [__API Interactions__]
--
--     -   Interacts with VK_VERSION_1_1
--
--     -   Interacts with VK_VERSION_1_3
--
--     -   Interacts with VK_EXT_blend_operation_advanced
--
--     -   Interacts with VK_EXT_conservative_rasterization
--
--     -   Interacts with VK_EXT_depth_clamp_control
--
--     -   Interacts with VK_EXT_depth_clip_control
--
--     -   Interacts with VK_EXT_depth_clip_enable
--
--     -   Interacts with VK_EXT_fragment_density_map
--
--     -   Interacts with VK_EXT_line_rasterization
--
--     -   Interacts with VK_EXT_mesh_shader
--
--     -   Interacts with VK_EXT_provoking_vertex
--
--     -   Interacts with VK_EXT_sample_locations
--
--     -   Interacts with VK_EXT_subgroup_size_control
--
--     -   Interacts with VK_EXT_transform_feedback
--
--     -   Interacts with VK_KHR_device_group
--
--     -   Interacts with VK_KHR_fragment_shading_rate
--
--     -   Interacts with VK_NV_clip_space_w_scaling
--
--     -   Interacts with VK_NV_coverage_reduction_mode
--
--     -   Interacts with VK_NV_fragment_coverage_to_color
--
--     -   Interacts with VK_NV_framebuffer_mixed_samples
--
--     -   Interacts with VK_NV_mesh_shader
--
--     -   Interacts with VK_NV_representative_fragment_test
--
--     -   Interacts with VK_NV_shading_rate_image
--
--     -   Interacts with VK_NV_viewport_swizzle
--
-- [__Contact__]
--
--     -   Daniel Story
--         <https://github.com/KhronosGroup/Vulkan-Docs/issues/new?body=[VK_EXT_shader_object] @daniel-story%0A*Here describe the issue or question you have about the VK_EXT_shader_object extension* >
--
-- [__Extension Proposal__]
--     <https://github.com/KhronosGroup/Vulkan-Docs/tree/main/proposals/VK_EXT_shader_object.adoc VK_EXT_shader_object>
--
-- == Other Extension Metadata
--
-- [__Last Modified Date__]
--     2023-03-30
--
-- [__Interactions and External Dependencies__]
--
--     -   Interacts with @VK_EXT_extended_dynamic_state@
--
--     -   Interacts with @VK_EXT_extended_dynamic_state2@
--
--     -   Interacts with @VK_EXT_extended_dynamic_state3@
--
--     -   Interacts with @VK_EXT_vertex_input_dynamic_state@
--
-- [__IP Status__]
--     No known IP claims.
--
-- [__Contributors__]
--
--     -   Piers Daniell, NVIDIA
--
--     -   Sandy Jamieson, Nintendo
--
--     -   Žiga Markuš, LunarG
--
--     -   Tobias Hector, AMD
--
--     -   Alex Walters, Imagination
--
--     -   Shahbaz Youssefi, Google
--
--     -   Ralph Potter, Samsung
--
--     -   Jan-Harald Fredriksen, ARM
--
--     -   Connor Abott, Valve
--
--     -   Arseny Kapoulkine, Roblox
--
--     -   Patrick Doane, Activision
--
--     -   Jeff Leger, Qualcomm
--
--     -   Stu Smith, AMD
--
--     -   Chris Glover, Google
--
--     -   Ricardo Garcia, Igalia
--
--     -   Faith Ekstrand, Collabora
--
--     -   Timur Kristóf, Valve
--
--     -   Caterina Shablia, Collabora
--
--     -   Daniel Koch, NVIDIA
--
--     -   Alyssa Rosenzweig, Collabora
--
--     -   Mike Blumenkrantz, Valve
--
--     -   Samuel Pitoiset, Valve
--
--     -   Qun Lin, AMD
--
--     -   Spencer Fricke, LunarG
--
--     -   Soroush Faghihi Kashani, Imagination
--
-- == Description
--
-- This extension introduces a new 'Vulkan.Extensions.Handles.ShaderEXT'
-- object type which represents a single compiled shader stage. Shader
-- objects provide a more flexible alternative to
-- 'Vulkan.Core10.Handles.Pipeline' objects, which may be helpful in
-- certain use cases.
--
-- == New Object Types
--
-- -   'Vulkan.Extensions.Handles.ShaderEXT'
--
-- == New Commands
--
-- -   'cmdBindShadersEXT'
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state.cmdBindVertexBuffers2EXT'
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state3.cmdSetAlphaToCoverageEnableEXT'
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state3.cmdSetAlphaToOneEnableEXT'
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state3.cmdSetColorBlendEnableEXT'
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state3.cmdSetColorBlendEquationEXT'
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state3.cmdSetColorWriteMaskEXT'
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state.cmdSetCullModeEXT'
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state2.cmdSetDepthBiasEnableEXT'
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state.cmdSetDepthBoundsTestEnableEXT'
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state3.cmdSetDepthClampEnableEXT'
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state.cmdSetDepthCompareOpEXT'
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state.cmdSetDepthTestEnableEXT'
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state.cmdSetDepthWriteEnableEXT'
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state.cmdSetFrontFaceEXT'
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state2.cmdSetLogicOpEXT'
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state3.cmdSetLogicOpEnableEXT'
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state2.cmdSetPatchControlPointsEXT'
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state3.cmdSetPolygonModeEXT'
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state2.cmdSetPrimitiveRestartEnableEXT'
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state.cmdSetPrimitiveTopologyEXT'
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state3.cmdSetRasterizationSamplesEXT'
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state2.cmdSetRasterizerDiscardEnableEXT'
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state3.cmdSetSampleMaskEXT'
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state.cmdSetScissorWithCountEXT'
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state.cmdSetStencilOpEXT'
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state.cmdSetStencilTestEnableEXT'
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state3.cmdSetTessellationDomainOriginEXT'
--
-- -   'Vulkan.Extensions.VK_EXT_vertex_input_dynamic_state.cmdSetVertexInputEXT'
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state.cmdSetViewportWithCountEXT'
--
-- -   'createShadersEXT'
--
-- -   'destroyShaderEXT'
--
-- -   'getShaderBinaryDataEXT'
--
-- If
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_blend_operation_advanced VK_EXT_blend_operation_advanced>
-- is supported:
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state3.cmdSetColorBlendAdvancedEXT'
--
-- If
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_conservative_rasterization VK_EXT_conservative_rasterization>
-- is supported:
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state3.cmdSetConservativeRasterizationModeEXT'
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state3.cmdSetExtraPrimitiveOverestimationSizeEXT'
--
-- If
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_depth_clamp_control VK_EXT_depth_clamp_control>
-- is supported:
--
-- -   'Vulkan.Extensions.VK_EXT_depth_clamp_control.cmdSetDepthClampRangeEXT'
--
-- If
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_depth_clip_control VK_EXT_depth_clip_control>
-- is supported:
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state3.cmdSetDepthClipNegativeOneToOneEXT'
--
-- If
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_depth_clip_enable VK_EXT_depth_clip_enable>
-- is supported:
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state3.cmdSetDepthClipEnableEXT'
--
-- If
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_line_rasterization VK_EXT_line_rasterization>
-- is supported:
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state3.cmdSetLineRasterizationModeEXT'
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state3.cmdSetLineStippleEnableEXT'
--
-- If
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_provoking_vertex VK_EXT_provoking_vertex>
-- is supported:
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state3.cmdSetProvokingVertexModeEXT'
--
-- If
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_sample_locations VK_EXT_sample_locations>
-- is supported:
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state3.cmdSetSampleLocationsEnableEXT'
--
-- If
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_transform_feedback VK_EXT_transform_feedback>
-- is supported:
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state3.cmdSetRasterizationStreamEXT'
--
-- If
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_NV_clip_space_w_scaling VK_NV_clip_space_w_scaling>
-- is supported:
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state3.cmdSetViewportWScalingEnableNV'
--
-- If
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_NV_coverage_reduction_mode VK_NV_coverage_reduction_mode>
-- is supported:
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state3.cmdSetCoverageReductionModeNV'
--
-- If
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_NV_fragment_coverage_to_color VK_NV_fragment_coverage_to_color>
-- is supported:
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state3.cmdSetCoverageToColorEnableNV'
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state3.cmdSetCoverageToColorLocationNV'
--
-- If
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_NV_framebuffer_mixed_samples VK_NV_framebuffer_mixed_samples>
-- is supported:
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state3.cmdSetCoverageModulationModeNV'
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state3.cmdSetCoverageModulationTableEnableNV'
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state3.cmdSetCoverageModulationTableNV'
--
-- If
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_NV_representative_fragment_test VK_NV_representative_fragment_test>
-- is supported:
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state3.cmdSetRepresentativeFragmentTestEnableNV'
--
-- If
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_NV_shading_rate_image VK_NV_shading_rate_image>
-- is supported:
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state3.cmdSetShadingRateImageEnableNV'
--
-- If
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_NV_viewport_swizzle VK_NV_viewport_swizzle>
-- is supported:
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state3.cmdSetViewportSwizzleNV'
--
-- == New Structures
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state3.ColorBlendAdvancedEXT'
--
-- -   'Vulkan.Extensions.VK_EXT_extended_dynamic_state3.ColorBlendEquationEXT'
--
-- -   'ShaderCreateInfoEXT'
--
-- -   'Vulkan.Extensions.VK_EXT_vertex_input_dynamic_state.VertexInputAttributeDescription2EXT'
--
-- -   'Vulkan.Extensions.VK_EXT_vertex_input_dynamic_state.VertexInputBindingDescription2EXT'
--
-- -   Extending
--     'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.PhysicalDeviceFeatures2',
--     'Vulkan.Core10.Device.DeviceCreateInfo':
--
--     -   'PhysicalDeviceShaderObjectFeaturesEXT'
--
-- -   Extending
--     'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.PhysicalDeviceProperties2':
--
--     -   'PhysicalDeviceShaderObjectPropertiesEXT'
--
-- -   Extending
--     'Vulkan.Core10.ComputePipeline.PipelineShaderStageCreateInfo',
--     'ShaderCreateInfoEXT':
--
--     -   'ShaderRequiredSubgroupSizeCreateInfoEXT'
--
-- == New Enums
--
-- -   'ShaderCodeTypeEXT'
--
-- -   'ShaderCreateFlagBitsEXT'
--
-- == New Bitmasks
--
-- -   'ShaderCreateFlagsEXT'
--
-- == New Enum Constants
--
-- -   'EXT_SHADER_OBJECT_EXTENSION_NAME'
--
-- -   'EXT_SHADER_OBJECT_SPEC_VERSION'
--
-- -   Extending 'Vulkan.Core10.Enums.ObjectType.ObjectType':
--
--     -   'Vulkan.Core10.Enums.ObjectType.OBJECT_TYPE_SHADER_EXT'
--
-- -   Extending 'Vulkan.Core10.Enums.Result.Result':
--
--     -   'ERROR_INCOMPATIBLE_SHADER_BINARY_EXT'
--
--     -   'Vulkan.Core10.Enums.Result.INCOMPATIBLE_SHADER_BINARY_EXT'
--
-- -   Extending 'Vulkan.Core10.Enums.StructureType.StructureType':
--
--     -   'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_OBJECT_FEATURES_EXT'
--
--     -   'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_OBJECT_PROPERTIES_EXT'
--
--     -   'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_SHADER_CREATE_INFO_EXT'
--
--     -   'STRUCTURE_TYPE_SHADER_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT'
--
--     -   'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION_2_EXT'
--
--     -   'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_VERTEX_INPUT_BINDING_DESCRIPTION_2_EXT'
--
-- If
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_fragment_density_map VK_EXT_fragment_density_map>
-- is supported:
--
-- -   Extending 'ShaderCreateFlagBitsEXT':
--
--     -   'SHADER_CREATE_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT'
--
-- If
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_mesh_shader VK_EXT_mesh_shader>
-- or
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_NV_mesh_shader VK_NV_mesh_shader>
-- is supported:
--
-- -   Extending 'ShaderCreateFlagBitsEXT':
--
--     -   'SHADER_CREATE_NO_TASK_SHADER_BIT_EXT'
--
-- If
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_subgroup_size_control VK_EXT_subgroup_size_control>
-- or
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#versions-1.3 Vulkan Version 1.3>
-- is supported:
--
-- -   Extending 'ShaderCreateFlagBitsEXT':
--
--     -   'SHADER_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT'
--
--     -   'SHADER_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT'
--
-- If
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_device_group VK_KHR_device_group>
-- or
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#versions-1.1 Vulkan Version 1.1>
-- is supported:
--
-- -   Extending 'ShaderCreateFlagBitsEXT':
--
--     -   'SHADER_CREATE_DISPATCH_BASE_BIT_EXT'
--
-- If
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_KHR_fragment_shading_rate VK_KHR_fragment_shading_rate>
-- is supported:
--
-- -   Extending 'ShaderCreateFlagBitsEXT':
--
--     -   'SHADER_CREATE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_EXT'
--
-- == Examples
--
-- __Example 1__
--
-- Create linked pair of vertex and fragment shaders.
--
-- > // Logical device created with the shaderObject feature enabled
-- > VkDevice device;
-- >
-- > // SPIR-V shader code for a vertex shader, along with its size in bytes
-- > void* pVertexSpirv;
-- > size_t vertexSpirvSize;
-- >
-- > // SPIR-V shader code for a fragment shader, along with its size in bytes
-- > void* pFragmentSpirv;
-- > size_t fragmentSpirvSize;
-- >
-- > // Descriptor set layout compatible with the shaders
-- > VkDescriptorSetLayout descriptorSetLayout;
-- >
-- > VkShaderCreateInfoEXT shaderCreateInfos[2] =
-- > {
-- >     {
-- >         .sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO_EXT,
-- >         .pNext = NULL,
-- >         .flags = VK_SHADER_CREATE_LINK_STAGE_BIT_EXT,
-- >         .stage = VK_SHADER_STAGE_VERTEX_BIT,
-- >         .nextStage = VK_SHADER_STAGE_FRAGMENT_BIT,
-- >         .codeType = VK_SHADER_CODE_TYPE_SPIRV_EXT,
-- >         .codeSize = vertexSpirvSize,
-- >         .pCode = pVertexSpirv,
-- >         .pName = "main",
-- >         .setLayoutCount = 1,
-- >         .pSetLayouts = &descriptorSetLayout;
-- >         .pushConstantRangeCount = 0,
-- >         .pPushConstantRanges = NULL,
-- >         .pSpecializationInfo = NULL
-- >     },
-- >     {
-- >         .sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO_EXT,
-- >         .pNext = NULL,
-- >         .flags = VK_SHADER_CREATE_LINK_STAGE_BIT_EXT,
-- >         .stage = VK_SHADER_STAGE_FRAGMENT_BIT,
-- >         .nextStage = 0,
-- >         .codeType = VK_SHADER_CODE_TYPE_SPIRV_EXT,
-- >         .codeSize = fragmentSpirvSize,
-- >         .pCode = pFragmentSpirv,
-- >         .pName = "main",
-- >         .setLayoutCount = 1,
-- >         .pSetLayouts = &descriptorSetLayout;
-- >         .pushConstantRangeCount = 0,
-- >         .pPushConstantRanges = NULL,
-- >         .pSpecializationInfo = NULL
-- >     }
-- > };
-- >
-- > VkResult result;
-- > VkShaderEXT shaders[2];
-- >
-- > result = vkCreateShadersEXT(device, 2, &shaderCreateInfos, NULL, shaders);
-- > if (result != VK_SUCCESS)
-- > {
-- >     // Handle error
-- > }
--
-- Later, during command buffer recording, bind the linked shaders and
-- draw.
--
-- > // Command buffer in the recording state
-- > VkCommandBuffer commandBuffer;
-- >
-- > // Vertex and fragment shader objects created above
-- > VkShaderEXT shaders[2];
-- >
-- > // Assume vertex buffers, descriptor sets, etc. have been bound, and existing
-- > // state setting commands have been called to set all required state
-- >
-- > const VkShaderStageFlagBits stages[2] =
-- > {
-- >     VK_SHADER_STAGE_VERTEX_BIT,
-- >     VK_SHADER_STAGE_FRAGMENT_BIT
-- > };
-- >
-- > // Bind linked shaders
-- > vkCmdBindShadersEXT(commandBuffer, 2, stages, shaders);
-- >
-- > // Equivalent to the previous line. Linked shaders can be bound one at a time,
-- > // in any order:
-- > // vkCmdBindShadersEXT(commandBuffer, 1, &stages[1], &shaders[1]);
-- > // vkCmdBindShadersEXT(commandBuffer, 1, &stages[0], &shaders[0]);
-- >
-- > // The above is sufficient to draw if the device was created with the
-- > // tessellationShader and geometryShader features disabled. Otherwise, since
-- > // those stages should not execute, vkCmdBindShadersEXT() must be called at
-- > // least once with each of their stages in pStages before drawing:
-- >
-- > const VkShaderStageFlagBits unusedStages[3] =
-- > {
-- >     VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
-- >     VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
-- >     VK_SHADER_STAGE_GEOMETRY_BIT
-- > };
-- >
-- > // NULL pShaders is equivalent to an array of stageCount VK_NULL_HANDLE values,
-- > // meaning no shaders are bound to those stages, and that any previously bound
-- > // shaders are unbound
-- > vkCmdBindShadersEXT(commandBuffer, 3, unusedStages, NULL);
-- >
-- > // Graphics shader objects may only be used to draw inside dynamic render pass
-- > // instances begun with vkCmdBeginRendering(), assume one has already been begun
-- >
-- > // Draw a triangle
-- > vkCmdDraw(commandBuffer, 3, 1, 0, 0);
--
-- __Example 2__
--
-- Create unlinked vertex, geometry, and fragment shaders.
--
-- > // Logical device created with the shaderObject feature enabled
-- > VkDevice device;
-- >
-- > // SPIR-V shader code for vertex shaders, along with their sizes in bytes
-- > void* pVertexSpirv[2];
-- > size_t vertexSpirvSize[2];
-- >
-- > // SPIR-V shader code for a geometry shader, along with its size in bytes
-- > void pGeometrySpirv;
-- > size_t geometrySpirvSize;
-- >
-- > // SPIR-V shader code for fragment shaders, along with their sizes in bytes
-- > void* pFragmentSpirv[2];
-- > size_t fragmentSpirvSize[2];
-- >
-- > // Descriptor set layout compatible with the shaders
-- > VkDescriptorSetLayout descriptorSetLayout;
-- >
-- > VkShaderCreateInfoEXT shaderCreateInfos[5] =
-- > {
-- >     // Stage order does not matter
-- >     {
-- >         .sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO_EXT,
-- >         .pNext = NULL,
-- >         .flags = 0,
-- >         .stage = VK_SHADER_STAGE_GEOMETRY_BIT,
-- >         .nextStage = VK_SHADER_STAGE_FRAGMENT_BIT,
-- >         .codeType = VK_SHADER_CODE_TYPE_SPIRV_EXT,
-- >         .codeSize = pGeometrySpirv,
-- >         .pCode = geometrySpirvSize,
-- >         .pName = "main",
-- >         .setLayoutCount = 1,
-- >         .pSetLayouts = &descriptorSetLayout;
-- >         .pushConstantRangeCount = 0,
-- >         .pPushConstantRanges = NULL,
-- >         .pSpecializationInfo = NULL
-- >     },
-- >     {
-- >         .sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO_EXT,
-- >         .pNext = NULL,
-- >         .flags = 0,
-- >         .stage = VK_SHADER_STAGE_VERTEX_BIT,
-- >         .nextStage = VK_SHADER_STAGE_GEOMETRY_BIT,
-- >         .codeType = VK_SHADER_CODE_TYPE_SPIRV_EXT,
-- >         .codeSize = vertexSpirvSize[0],
-- >         .pCode = pVertexSpirv[0],
-- >         .pName = "main",
-- >         .setLayoutCount = 1,
-- >         .pSetLayouts = &descriptorSetLayout;
-- >         .pushConstantRangeCount = 0,
-- >         .pPushConstantRanges = NULL,
-- >         .pSpecializationInfo = NULL
-- >     },
-- >     {
-- >         .sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO_EXT,
-- >         .pNext = NULL,
-- >         .flags = 0,
-- >         .stage = VK_SHADER_STAGE_FRAGMENT_BIT,
-- >         .nextStage = 0,
-- >         .codeType = VK_SHADER_CODE_TYPE_SPIRV_EXT,
-- >         .codeSize = fragmentSpirvSize[0],
-- >         .pCode = pFragmentSpirv[0],
-- >         .pName = "main",
-- >         .setLayoutCount = 1,
-- >         .pSetLayouts = &descriptorSetLayout;
-- >         .pushConstantRangeCount = 0,
-- >         .pPushConstantRanges = NULL,
-- >         .pSpecializationInfo = NULL
-- >     },
-- >     {
-- >         .sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO_EXT,
-- >         .pNext = NULL,
-- >         .flags = 0,
-- >         .stage = VK_SHADER_STAGE_FRAGMENT_BIT,
-- >         .nextStage = 0,
-- >         .codeType = VK_SHADER_CODE_TYPE_SPIRV_EXT,
-- >         .codeSize = fragmentSpirvSize[1],
-- >         .pCode = pFragmentSpirv[1],
-- >         .pName = "main",
-- >         .setLayoutCount = 1,
-- >         .pSetLayouts = &descriptorSetLayout;
-- >         .pushConstantRangeCount = 0,
-- >         .pPushConstantRanges = NULL,
-- >         .pSpecializationInfo = NULL
-- >     },
-- >     {
-- >         .sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO_EXT,
-- >         .pNext = NULL,
-- >         .flags = 0,
-- >         .stage = VK_SHADER_STAGE_VERTEX_BIT,
-- >         // Suppose we want this vertex shader to be able to be followed by
-- >         // either a geometry shader or fragment shader:
-- >         .nextStage = VK_SHADER_STAGE_GEOMETRY_BIT | VK_SHADER_STAGE_FRAGMENT_BIT,
-- >         .codeType = VK_SHADER_CODE_TYPE_SPIRV_EXT,
-- >         .codeSize = vertexSpirvSize[1],
-- >         .pCode = pVertexSpirv[1],
-- >         .pName = "main",
-- >         .setLayoutCount = 1,
-- >         .pSetLayouts = &descriptorSetLayout;
-- >         .pushConstantRangeCount = 0,
-- >         .pPushConstantRanges = NULL,
-- >         .pSpecializationInfo = NULL
-- >     }
-- > };
-- >
-- > VkResult result;
-- > VkShaderEXT shaders[5];
-- >
-- > result = vkCreateShadersEXT(device, 5, &shaderCreateInfos, NULL, shaders);
-- > if (result != VK_SUCCESS)
-- > {
-- >     // Handle error
-- > }
--
-- Later, during command buffer recording, bind the linked shaders in
-- different combinations and draw.
--
-- > // Command buffer in the recording state
-- > VkCommandBuffer commandBuffer;
-- >
-- > // Vertex, geometry, and fragment shader objects created above
-- > VkShaderEXT shaders[5];
-- >
-- > // Assume vertex buffers, descriptor sets, etc. have been bound, and existing
-- > // state setting commands have been called to set all required state
-- >
-- > const VkShaderStageFlagBits stages[3] =
-- > {
-- >     // Any order is allowed
-- >     VK_SHADER_STAGE_FRAGMENT_BIT,
-- >     VK_SHADER_STAGE_VERTEX_BIT,
-- >     VK_SHADER_STAGE_GEOMETRY_BIT,
-- > };
-- >
-- > VkShaderEXT bindShaders[3] =
-- > {
-- >     shaders[2], // FS
-- >     shaders[1], // VS
-- >     shaders[0]  // GS
-- > };
-- >
-- > // Bind unlinked shaders
-- > vkCmdBindShadersEXT(commandBuffer, 3, stages, bindShaders);
-- >
-- > // Assume the tessellationShader feature is disabled, so vkCmdBindShadersEXT()
-- > // need not have been called with either tessellation stage
-- >
-- > // Graphics shader objects may only be used to draw inside dynamic render pass
-- > // instances begun with vkCmdBeginRendering(), assume one has already been begun
-- >
-- > // Draw a triangle
-- > vkCmdDraw(commandBuffer, 3, 1, 0, 0);
-- >
-- > // Bind a different unlinked fragment shader
-- > const VkShaderStageFlagBits fragmentStage = VK_SHADER_STAGE_FRAGMENT_BIT;
-- > vkCmdBindShadersEXT(commandBuffer, 1, &fragmentStage, &shaders[3]);
-- >
-- > // Draw another triangle
-- > vkCmdDraw(commandBuffer, 3, 1, 0, 0);
-- >
-- > // Bind a different unlinked vertex shader
-- > const VkShaderStageFlagBits vertexStage = VK_SHADER_STAGE_VERTEX_BIT;
-- > vkCmdBindShadersEXT(commandBuffer, 1, &vertexStage, &shaders[4]);
-- >
-- > // Draw another triangle
-- > vkCmdDraw(commandBuffer, 3, 1, 0, 0);
--
-- == Version History
--
-- -   Revision 1, 2023-03-30 (Daniel Story)
--
--     -   Initial draft
--
-- == See Also
--
-- No cross-references are available
--
-- == Document Notes
--
-- For more information, see the
-- <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#VK_EXT_shader_object Vulkan Specification>.
--
-- This page is a generated document. Fixes and changes should be made to
-- the generator scripts, not directly.
module Vulkan.Extensions.VK_EXT_shader_object  ( createShadersEXT
                                               , withShadersEXT
                                               , destroyShaderEXT
                                               , getShaderBinaryDataEXT
                                               , cmdBindShadersEXT
                                               , pattern STRUCTURE_TYPE_SHADER_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT
                                               , pattern ERROR_INCOMPATIBLE_SHADER_BINARY_EXT
                                               , PhysicalDeviceShaderObjectFeaturesEXT(..)
                                               , PhysicalDeviceShaderObjectPropertiesEXT(..)
                                               , ShaderCreateInfoEXT(..)
                                               , ShaderCreateFlagsEXT
                                               , ShaderCreateFlagBitsEXT( SHADER_CREATE_LINK_STAGE_BIT_EXT
                                                                        , SHADER_CREATE_64_BIT_INDEXING_BIT_EXT
                                                                        , SHADER_CREATE_INDIRECT_BINDABLE_BIT_EXT
                                                                        , SHADER_CREATE_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT
                                                                        , SHADER_CREATE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_EXT
                                                                        , SHADER_CREATE_DISPATCH_BASE_BIT_EXT
                                                                        , SHADER_CREATE_NO_TASK_SHADER_BIT_EXT
                                                                        , SHADER_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT
                                                                        , SHADER_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT
                                                                        , SHADER_CREATE_DESCRIPTOR_HEAP_BIT_EXT
                                                                        , ..
                                                                        )
                                               , ShaderCodeTypeEXT( SHADER_CODE_TYPE_BINARY_EXT
                                                                  , SHADER_CODE_TYPE_SPIRV_EXT
                                                                  , ..
                                                                  )
                                               , ShaderRequiredSubgroupSizeCreateInfoEXT
                                               , EXT_SHADER_OBJECT_SPEC_VERSION
                                               , pattern EXT_SHADER_OBJECT_SPEC_VERSION
                                               , EXT_SHADER_OBJECT_EXTENSION_NAME
                                               , pattern EXT_SHADER_OBJECT_EXTENSION_NAME
                                               , ShaderEXT(..)
                                               , ViewportSwizzleNV(..)
                                               , ColorBlendEquationEXT(..)
                                               , ColorBlendAdvancedEXT(..)
                                               , VertexInputBindingDescription2EXT(..)
                                               , VertexInputAttributeDescription2EXT(..)
                                               , DepthClampRangeEXT(..)
                                               , cmdSetPatchControlPointsEXT
                                               , cmdSetLogicOpEXT
                                               , cmdSetTessellationDomainOriginEXT
                                               , cmdSetDepthClampEnableEXT
                                               , cmdSetPolygonModeEXT
                                               , cmdSetRasterizationSamplesEXT
                                               , cmdSetSampleMaskEXT
                                               , cmdSetAlphaToCoverageEnableEXT
                                               , cmdSetAlphaToOneEnableEXT
                                               , cmdSetLogicOpEnableEXT
                                               , cmdSetColorBlendEnableEXT
                                               , cmdSetColorBlendEquationEXT
                                               , cmdSetColorWriteMaskEXT
                                               , cmdSetRasterizationStreamEXT
                                               , cmdSetConservativeRasterizationModeEXT
                                               , cmdSetExtraPrimitiveOverestimationSizeEXT
                                               , cmdSetDepthClipEnableEXT
                                               , cmdSetSampleLocationsEnableEXT
                                               , cmdSetColorBlendAdvancedEXT
                                               , cmdSetProvokingVertexModeEXT
                                               , cmdSetLineRasterizationModeEXT
                                               , cmdSetLineStippleEnableEXT
                                               , cmdSetDepthClipNegativeOneToOneEXT
                                               , cmdSetViewportWScalingEnableNV
                                               , cmdSetViewportSwizzleNV
                                               , cmdSetCoverageToColorEnableNV
                                               , cmdSetCoverageToColorLocationNV
                                               , cmdSetCoverageModulationModeNV
                                               , cmdSetCoverageModulationTableEnableNV
                                               , cmdSetCoverageModulationTableNV
                                               , cmdSetShadingRateImageEnableNV
                                               , cmdSetCoverageReductionModeNV
                                               , cmdSetRepresentativeFragmentTestEnableNV
                                               , cmdSetVertexInputEXT
                                               , cmdSetDepthClampRangeEXT
                                               , ViewportCoordinateSwizzleNV(..)
                                               , BlendOverlapEXT(..)
                                               , CoverageModulationModeNV(..)
                                               , CoverageReductionModeNV(..)
                                               , ConservativeRasterizationModeEXT(..)
                                               , ProvokingVertexModeEXT(..)
                                               , DepthClampModeEXT(..)
                                               , LineRasterizationModeEXT
                                               , cmdSetCullModeEXT
                                               , cmdSetFrontFaceEXT
                                               , cmdSetPrimitiveTopologyEXT
                                               , cmdSetViewportWithCountEXT
                                               , cmdSetScissorWithCountEXT
                                               , cmdBindVertexBuffers2EXT
                                               , cmdSetDepthTestEnableEXT
                                               , cmdSetDepthWriteEnableEXT
                                               , cmdSetDepthCompareOpEXT
                                               , cmdSetDepthBoundsTestEnableEXT
                                               , cmdSetStencilTestEnableEXT
                                               , cmdSetStencilOpEXT
                                               , cmdSetRasterizerDiscardEnableEXT
                                               , cmdSetDepthBiasEnableEXT
                                               , cmdSetPrimitiveRestartEnableEXT
                                               ) where

import Data.Bits (Bits)
import Data.Bits (FiniteBits)
import Vulkan.CStruct.Utils (FixedArray)
import Vulkan.Internal.Utils (enumReadPrec)
import Vulkan.Internal.Utils (enumShowsPrec)
import Vulkan.Internal.Utils (traceAroundEvent)
import Control.Exception.Base (bracket)
import Control.Monad (unless)
import Control.Monad.IO.Class (liftIO)
import Data.Foldable (traverse_)
import Data.Typeable (eqT)
import Foreign.Marshal.Alloc (allocaBytes)
import Foreign.Marshal.Alloc (callocBytes)
import Foreign.Marshal.Alloc (free)
import Foreign.Marshal.Utils (maybePeek)
import GHC.Base (when)
import GHC.IO (throwIO)
import GHC.Ptr (castPtr)
import GHC.Ptr (nullFunPtr)
import Foreign.Ptr (nullPtr)
import Foreign.Ptr (plusPtr)
import GHC.Show (showString)
import GHC.Show (showsPrec)
import Numeric (showHex)
import Data.ByteString (packCString)
import Data.ByteString (packCStringLen)
import Data.ByteString (useAsCString)
import Data.Coerce (coerce)
import Control.Monad.Trans.Class (lift)
import Control.Monad.Trans.Cont (evalContT)
import Data.Vector (generateM)
import qualified Data.Vector (imapM_)
import qualified Data.Vector (length)
import qualified Data.Vector (null)
import Foreign.C.Types (CSize(..))
import Vulkan.CStruct (FromCStruct)
import Vulkan.CStruct (FromCStruct(..))
import Vulkan.CStruct (ToCStruct)
import Vulkan.CStruct (ToCStruct(..))
import Vulkan.Zero (Zero)
import Vulkan.Zero (Zero(..))
import Control.Monad.IO.Class (MonadIO)
import Data.String (IsString)
import Data.Type.Equality ((:~:)(Refl))
import Data.Typeable (Typeable)
import Foreign.C.Types (CChar)
import Foreign.C.Types (CSize)
import Foreign.C.Types (CSize(..))
import Foreign.C.Types (CSize(CSize))
import Foreign.Storable (Storable)
import Foreign.Storable (Storable(peek))
import Foreign.Storable (Storable(poke))
import qualified Foreign.Storable (Storable(..))
import GHC.Generics (Generic)
import GHC.IO.Exception (IOErrorType(..))
import GHC.IO.Exception (IOException(..))
import Data.Int (Int32)
import Foreign.Ptr (FunPtr)
import Foreign.Ptr (Ptr)
import GHC.Read (Read(readPrec))
import GHC.Show (Show(showsPrec))
import Data.Word (Word32)
import Data.Word (Word64)
import Data.Word (Word8)
import Data.ByteString (ByteString)
import Data.Kind (Type)
import Control.Monad.Trans.Cont (ContT(..))
import Data.Vector (Vector)
import Vulkan.CStruct.Utils (advancePtrBytes)
import Vulkan.Core10.FundamentalTypes (bool32ToBool)
import Vulkan.Core10.FundamentalTypes (boolToBool32)
import Vulkan.CStruct.Extends (forgetExtensions)
import Vulkan.CStruct.Utils (peekByteStringFromSizedVectorPtr)
import Vulkan.CStruct.Utils (pokeFixedLengthByteString)
import Vulkan.CStruct.Extends (pokeSomeCStruct)
import Vulkan.NamedType ((:::))
import Vulkan.Core10.AllocationCallbacks (AllocationCallbacks)
import Vulkan.Core10.FundamentalTypes (Bool32)
import Vulkan.CStruct.Extends (Chain)
import Vulkan.Core10.Handles (CommandBuffer)
import Vulkan.Core10.Handles (CommandBuffer(..))
import Vulkan.Core10.Handles (CommandBuffer(CommandBuffer))
import Vulkan.Core10.Handles (CommandBuffer_T)
import {-# SOURCE #-} Vulkan.Extensions.VK_EXT_custom_resolve (CustomResolveCreateInfoEXT)
import Vulkan.Core10.Handles (DescriptorSetLayout)
import Vulkan.Core10.Handles (Device)
import Vulkan.Core10.Handles (Device(..))
import Vulkan.Core10.Handles (Device(Device))
import Vulkan.Dynamic (DeviceCmds(pVkCmdBindShadersEXT))
import Vulkan.Dynamic (DeviceCmds(pVkCreateShadersEXT))
import Vulkan.Dynamic (DeviceCmds(pVkDestroyShaderEXT))
import Vulkan.Dynamic (DeviceCmds(pVkGetShaderBinaryDataEXT))
import Vulkan.Core10.Handles (Device_T)
import Vulkan.CStruct.Extends (Extends)
import Vulkan.CStruct.Extends (Extendss)
import Vulkan.CStruct.Extends (Extensible(..))
import Vulkan.Core10.FundamentalTypes (Flags)
import Vulkan.CStruct.Extends (PeekChain)
import Vulkan.CStruct.Extends (PeekChain(..))
import Vulkan.Core13.Promoted_From_VK_EXT_subgroup_size_control (PipelineShaderStageRequiredSubgroupSizeCreateInfo)
import {-# SOURCE #-} Vulkan.Core13.Promoted_From_VK_EXT_subgroup_size_control (PipelineShaderStageRequiredSubgroupSizeCreateInfo)
import Vulkan.CStruct.Extends (PokeChain)
import Vulkan.CStruct.Extends (PokeChain(..))
import Vulkan.Core10.PipelineLayout (PushConstantRange)
import Vulkan.Core10.Enums.Result (Result)
import Vulkan.Core10.Enums.Result (Result(..))
import {-# SOURCE #-} Vulkan.Extensions.VK_EXT_descriptor_heap (ShaderDescriptorSetAndBindingMappingInfoEXT)
import Vulkan.Extensions.Handles (ShaderEXT)
import Vulkan.Extensions.Handles (ShaderEXT(..))
import Vulkan.Core10.Enums.ShaderStageFlagBits (ShaderStageFlagBits)
import Vulkan.Core10.Enums.ShaderStageFlagBits (ShaderStageFlagBits(..))
import Vulkan.Core10.Enums.ShaderStageFlagBits (ShaderStageFlags)
import Vulkan.CStruct.Extends (SomeStruct)
import Vulkan.Core10.ComputePipeline (SpecializationInfo)
import Vulkan.Core10.Enums.StructureType (StructureType)
import Vulkan.Core10.APIConstants (UUID_SIZE)
import {-# SOURCE #-} Vulkan.Extensions.VK_EXT_validation_features (ValidationFeaturesEXT)
import Vulkan.Exception (VulkanException(..))
import Vulkan.Core10.Enums.Result (Result(INCOMPATIBLE_SHADER_BINARY_EXT))
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_OBJECT_FEATURES_EXT))
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_OBJECT_PROPERTIES_EXT))
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO))
import Vulkan.Core10.Enums.StructureType (StructureType(STRUCTURE_TYPE_SHADER_CREATE_INFO_EXT))
import Vulkan.Core10.Enums.Result (Result(SUCCESS))
import Vulkan.Extensions.VK_EXT_extended_dynamic_state (cmdBindVertexBuffers2EXT)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state3 (cmdSetAlphaToCoverageEnableEXT)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state3 (cmdSetAlphaToOneEnableEXT)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state3 (cmdSetColorBlendAdvancedEXT)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state3 (cmdSetColorBlendEnableEXT)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state3 (cmdSetColorBlendEquationEXT)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state3 (cmdSetColorWriteMaskEXT)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state3 (cmdSetConservativeRasterizationModeEXT)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state3 (cmdSetCoverageModulationModeNV)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state3 (cmdSetCoverageModulationTableEnableNV)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state3 (cmdSetCoverageModulationTableNV)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state3 (cmdSetCoverageReductionModeNV)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state3 (cmdSetCoverageToColorEnableNV)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state3 (cmdSetCoverageToColorLocationNV)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state (cmdSetCullModeEXT)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state2 (cmdSetDepthBiasEnableEXT)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state (cmdSetDepthBoundsTestEnableEXT)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state3 (cmdSetDepthClampEnableEXT)
import Vulkan.Extensions.VK_EXT_depth_clamp_control (cmdSetDepthClampRangeEXT)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state3 (cmdSetDepthClipEnableEXT)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state3 (cmdSetDepthClipNegativeOneToOneEXT)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state (cmdSetDepthCompareOpEXT)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state (cmdSetDepthTestEnableEXT)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state (cmdSetDepthWriteEnableEXT)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state3 (cmdSetExtraPrimitiveOverestimationSizeEXT)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state (cmdSetFrontFaceEXT)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state3 (cmdSetLineRasterizationModeEXT)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state3 (cmdSetLineStippleEnableEXT)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state2 (cmdSetLogicOpEXT)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state3 (cmdSetLogicOpEnableEXT)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state2 (cmdSetPatchControlPointsEXT)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state3 (cmdSetPolygonModeEXT)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state2 (cmdSetPrimitiveRestartEnableEXT)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state (cmdSetPrimitiveTopologyEXT)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state3 (cmdSetProvokingVertexModeEXT)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state3 (cmdSetRasterizationSamplesEXT)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state3 (cmdSetRasterizationStreamEXT)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state2 (cmdSetRasterizerDiscardEnableEXT)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state3 (cmdSetRepresentativeFragmentTestEnableNV)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state3 (cmdSetSampleLocationsEnableEXT)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state3 (cmdSetSampleMaskEXT)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state (cmdSetScissorWithCountEXT)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state3 (cmdSetShadingRateImageEnableNV)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state (cmdSetStencilOpEXT)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state (cmdSetStencilTestEnableEXT)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state3 (cmdSetTessellationDomainOriginEXT)
import Vulkan.Extensions.VK_EXT_vertex_input_dynamic_state (cmdSetVertexInputEXT)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state3 (cmdSetViewportSwizzleNV)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state3 (cmdSetViewportWScalingEnableNV)
import Vulkan.Extensions.VK_EXT_extended_dynamic_state (cmdSetViewportWithCountEXT)
import Vulkan.Extensions.VK_EXT_blend_operation_advanced (BlendOverlapEXT(..))
import Vulkan.Extensions.VK_EXT_extended_dynamic_state3 (ColorBlendAdvancedEXT(..))
import Vulkan.Extensions.VK_EXT_extended_dynamic_state3 (ColorBlendEquationEXT(..))
import Vulkan.Extensions.VK_EXT_conservative_rasterization (ConservativeRasterizationModeEXT(..))
import Vulkan.Extensions.VK_NV_framebuffer_mixed_samples (CoverageModulationModeNV(..))
import Vulkan.Extensions.VK_NV_coverage_reduction_mode (CoverageReductionModeNV(..))
import Vulkan.Extensions.VK_EXT_depth_clamp_control (DepthClampModeEXT(..))
import Vulkan.Extensions.VK_EXT_depth_clamp_control (DepthClampRangeEXT(..))
import Vulkan.Extensions.VK_EXT_line_rasterization (LineRasterizationModeEXT)
import Vulkan.Extensions.VK_EXT_provoking_vertex (ProvokingVertexModeEXT(..))
import Vulkan.Extensions.Handles (ShaderEXT(..))
import Vulkan.Extensions.VK_EXT_vertex_input_dynamic_state (VertexInputAttributeDescription2EXT(..))
import Vulkan.Extensions.VK_EXT_vertex_input_dynamic_state (VertexInputBindingDescription2EXT(..))
import Vulkan.Extensions.VK_NV_viewport_swizzle (ViewportCoordinateSwizzleNV(..))
import Vulkan.Extensions.VK_NV_viewport_swizzle (ViewportSwizzleNV(..))
foreign import ccall
#if !defined(SAFE_FOREIGN_CALLS)
  unsafe
#endif
  "dynamic" mkVkCreateShadersEXT
  :: FunPtr (Ptr Device_T -> Word32 -> Ptr (SomeStruct ShaderCreateInfoEXT) -> Ptr AllocationCallbacks -> Ptr ShaderEXT -> IO Result) -> Ptr Device_T -> Word32 -> Ptr (SomeStruct ShaderCreateInfoEXT) -> Ptr AllocationCallbacks -> Ptr ShaderEXT -> IO Result

-- | vkCreateShadersEXT - Create one or more new shaders
--
-- = Description
--
-- When this function returns, whether or not it succeeds, it is guaranteed
-- that every element of @pShaders@ will have been overwritten by either
-- 'Vulkan.Core10.APIConstants.NULL_HANDLE' or a valid
-- 'Vulkan.Extensions.Handles.ShaderEXT' handle.
--
-- This means that whenever shader creation fails, the application /can/
-- determine which shader the returned error pertains to by locating the
-- first 'Vulkan.Core10.APIConstants.NULL_HANDLE' element in @pShaders@. It
-- also means that an application /can/ reliably clean up from a failed
-- call by iterating over the @pShaders@ array and destroying every element
-- that is not 'Vulkan.Core10.APIConstants.NULL_HANDLE'.
--
-- == Valid Usage
--
-- -   #VUID-vkCreateShadersEXT-stage-09670# If the @stage@ member of any
--     element of @pCreateInfos@ is
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_COMPUTE_BIT',
--     @device@ /must/ support at least one queue family with the
--     'Vulkan.Core10.Enums.QueueFlagBits.QUEUE_COMPUTE_BIT' capability
--
-- -   #VUID-vkCreateShadersEXT-stage-09671# If the @stage@ member of any
--     element of @pCreateInfos@ is
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TASK_BIT_EXT',
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_MESH_BIT_EXT',
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_VERTEX_BIT',
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TESSELLATION_CONTROL_BIT',
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TESSELLATION_EVALUATION_BIT',
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_GEOMETRY_BIT',
--     or
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_FRAGMENT_BIT',
--     @device@ /must/ support at least one queue family with the
--     'Vulkan.Core10.Enums.QueueFlagBits.QUEUE_GRAPHICS_BIT' capability
--
-- -   #VUID-vkCreateShadersEXT-None-08400# The
--     <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#features-shaderObject shaderObject>
--     feature /must/ be enabled
--
-- -   #VUID-vkCreateShadersEXT-pCreateInfos-08402# If the @flags@ member
--     of any element of @pCreateInfos@ includes
--     'SHADER_CREATE_LINK_STAGE_BIT_EXT', the @flags@ member of all other
--     elements of @pCreateInfos@ whose @stage@ is
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_VERTEX_BIT',
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TESSELLATION_CONTROL_BIT',
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TESSELLATION_EVALUATION_BIT',
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_GEOMETRY_BIT',
--     or
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_FRAGMENT_BIT'
--     /must/ also include 'SHADER_CREATE_LINK_STAGE_BIT_EXT'
--
-- -   #VUID-vkCreateShadersEXT-pCreateInfos-08403# If the @flags@ member
--     of any element of @pCreateInfos@ includes
--     'SHADER_CREATE_LINK_STAGE_BIT_EXT', the @flags@ member of all other
--     elements of @pCreateInfos@ whose @stage@ is
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TASK_BIT_EXT'
--     or
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_MESH_BIT_EXT'
--     /must/ also include 'SHADER_CREATE_LINK_STAGE_BIT_EXT'
--
-- -   #VUID-vkCreateShadersEXT-pCreateInfos-08404# If the @flags@ member
--     of any element of @pCreateInfos@ whose @stage@ is
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TASK_BIT_EXT'
--     or
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_MESH_BIT_EXT'
--     includes 'SHADER_CREATE_LINK_STAGE_BIT_EXT', there /must/ be no
--     member of @pCreateInfos@ whose @stage@ is
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_VERTEX_BIT'
--     and whose @flags@ member includes 'SHADER_CREATE_LINK_STAGE_BIT_EXT'
--
-- -   #VUID-vkCreateShadersEXT-pCreateInfos-08405# If there is any element
--     of @pCreateInfos@ whose @stage@ is
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_MESH_BIT_EXT'
--     and whose @flags@ member includes both
--     'SHADER_CREATE_LINK_STAGE_BIT_EXT' and
--     'SHADER_CREATE_NO_TASK_SHADER_BIT_EXT', there /must/ be no element
--     of @pCreateInfos@ whose @stage@ is
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TASK_BIT_EXT'
--     and whose @flags@ member includes 'SHADER_CREATE_LINK_STAGE_BIT_EXT'
--
-- -   #VUID-vkCreateShadersEXT-pCreateInfos-08409# For each element of
--     @pCreateInfos@ whose @flags@ member includes
--     'SHADER_CREATE_LINK_STAGE_BIT_EXT', if there is any other element of
--     @pCreateInfos@ whose @stage@ is logically later than the @stage@ of
--     the former and whose @flags@ member also includes
--     'SHADER_CREATE_LINK_STAGE_BIT_EXT', the @nextStage@ of the former
--     /must/ be equal to the @stage@ of the element with the logically
--     earliest @stage@ following the @stage@ of the former whose @flags@
--     member also includes 'SHADER_CREATE_LINK_STAGE_BIT_EXT'
--
-- -   #VUID-vkCreateShadersEXT-pCreateInfos-08410# The @stage@ member of
--     each element of @pCreateInfos@ whose @flags@ member includes
--     'SHADER_CREATE_LINK_STAGE_BIT_EXT' /must/ be unique
--
-- -   #VUID-vkCreateShadersEXT-pCreateInfos-08411# The @codeType@ member
--     of all elements of @pCreateInfos@ whose @flags@ member includes
--     'SHADER_CREATE_LINK_STAGE_BIT_EXT' /must/ be the same
--
-- -   #VUID-vkCreateShadersEXT-pCreateInfos-12224# If @pCreateInfos@
--     contains elements with both
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TESSELLATION_CONTROL_BIT'
--     and
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TESSELLATION_EVALUATION_BIT',
--     both elements\' @flags@ include 'SHADER_CREATE_LINK_STAGE_BIT_EXT',
--     both elements\' @codeType@ is 'SHADER_CODE_TYPE_SPIRV_EXT', at least
--     one /must/ contain an @OpExecutionMode@ instruction specifying the
--     orientation of triangles generated by the tessellator
--
-- -   #VUID-vkCreateShadersEXT-pCreateInfos-12225# If @pCreateInfos@
--     contains elements with both
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TESSELLATION_CONTROL_BIT'
--     and
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TESSELLATION_EVALUATION_BIT',
--     both elements\' @flags@ include 'SHADER_CREATE_LINK_STAGE_BIT_EXT',
--     both elements\' @codeType@ is 'SHADER_CODE_TYPE_SPIRV_EXT', at least
--     one /must/ contain an @OpExecutionMode@ instruction specifying the
--     spacing of segments on the edges of tessellated primitives
--
-- -   #VUID-vkCreateShadersEXT-pCreateInfos-08867# If @pCreateInfos@
--     contains elements with both
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TESSELLATION_CONTROL_BIT'
--     and
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TESSELLATION_EVALUATION_BIT',
--     both elements\' @flags@ include 'SHADER_CREATE_LINK_STAGE_BIT_EXT',
--     both elements\' @codeType@ is 'SHADER_CODE_TYPE_SPIRV_EXT', and both
--     stages contains an @OpExecutionMode@ instruction specifying the type
--     of subdivision, they /must/ be the same
--
-- -   #VUID-vkCreateShadersEXT-pCreateInfos-08868# If @pCreateInfos@
--     contains elements with both
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TESSELLATION_CONTROL_BIT'
--     and
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TESSELLATION_EVALUATION_BIT',
--     both elements\' @flags@ include 'SHADER_CREATE_LINK_STAGE_BIT_EXT',
--     both elements\' @codeType@ is 'SHADER_CODE_TYPE_SPIRV_EXT', and both
--     stages contains an @OpExecutionMode@ instruction specifying the
--     orientation of triangles, they /must/ be the same
--
-- -   #VUID-vkCreateShadersEXT-pCreateInfos-08870# If @pCreateInfos@
--     contains elements with both
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TESSELLATION_CONTROL_BIT'
--     and
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TESSELLATION_EVALUATION_BIT',
--     both elements\' @flags@ include 'SHADER_CREATE_LINK_STAGE_BIT_EXT',
--     both elements\' @codeType@ is 'SHADER_CODE_TYPE_SPIRV_EXT', and both
--     stages contains an @OpExecutionMode@ instruction specifying the
--     spacing of segments on the edges of tessellated primitives, they
--     /must/ be the same
--
-- -   #VUID-vkCreateShadersEXT-pCreateInfos-08871# If @pCreateInfos@
--     contains elements with both
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TESSELLATION_CONTROL_BIT'
--     and
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TESSELLATION_EVALUATION_BIT',
--     both elements\' @flags@ include 'SHADER_CREATE_LINK_STAGE_BIT_EXT',
--     both elements\' @codeType@ is 'SHADER_CODE_TYPE_SPIRV_EXT', and both
--     stages contains an @OpExecutionMode@ instruction specifying the
--     output patch size, they /must/ be the same
--
-- -   #VUID-vkCreateShadersEXT-pCreateInfos-09632# If @pCreateInfos@
--     contains a
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_MESH_BIT_EXT'
--     with @codeType@ of 'SHADER_CODE_TYPE_SPIRV_EXT' and
--     'SHADER_CREATE_NO_TASK_SHADER_BIT_EXT' is not set, then the mesh
--     shader’s entry point /must/ not declare a variable with a
--     @DrawIndex@ @BuiltIn@ decoration
--
-- -   #VUID-vkCreateShadersEXT-pCreateInfos-11413# If any element of
--     @pCreateInfos@ sets 'SHADER_CREATE_DESCRIPTOR_HEAP_BIT_EXT' and
--     includes embedded sampler mappings, there /must/ be less than
--     (<https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#limits-maxSamplerAllocationCount maxSamplerAllocationCount>
--     -
--     (<https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#limits-minSamplerHeapReservedRangeWithEmbedded minSamplerHeapReservedRangeWithEmbedded>
--     \/
--     <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#limits-samplerDescriptorSize samplerDescriptorSize>))
--     'Vulkan.Core10.Handles.Sampler' objects currently created on the
--     device
--
-- -   #VUID-vkCreateShadersEXT-pCreateInfos-11428# If any element of
--     @pCreateInfos@ sets 'SHADER_CREATE_DESCRIPTOR_HEAP_BIT_EXT' and
--     includes embedded sampler mappings, this command /must/ not cause
--     the total number of unique embedded samplers in pipelines and
--     shaders on this device to exceed
--     <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#limits-maxDescriptorHeapEmbeddedSamplers maxDescriptorHeapEmbeddedSamplers>
--
-- -   #VUID-vkCreateShadersEXT-flags-11472# If the @flags@ member of any
--     element of @pCreateInfos@ includes
--     'SHADER_CREATE_LINK_STAGE_BIT_EXT' and
--     'SHADER_CREATE_DESCRIPTOR_HEAP_BIT_EXT', the @flags@ member of all
--     other elements of @pCreateInfos@ whose @stage@ is
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_VERTEX_BIT',
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TESSELLATION_CONTROL_BIT',
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TESSELLATION_EVALUATION_BIT',
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_GEOMETRY_BIT',
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TASK_BIT_EXT',
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_MESH_BIT_EXT',
--     or
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_FRAGMENT_BIT'
--     /must/ also include 'SHADER_CREATE_DESCRIPTOR_HEAP_BIT_EXT'
--
-- == Valid Usage (Implicit)
--
-- -   #VUID-vkCreateShadersEXT-device-parameter# @device@ /must/ be a
--     valid 'Vulkan.Core10.Handles.Device' handle
--
-- -   #VUID-vkCreateShadersEXT-pCreateInfos-parameter# @pCreateInfos@
--     /must/ be a valid pointer to an array of @createInfoCount@ valid
--     'ShaderCreateInfoEXT' structures
--
-- -   #VUID-vkCreateShadersEXT-pAllocator-parameter# If @pAllocator@ is
--     not @NULL@, @pAllocator@ /must/ be a valid pointer to a valid
--     'Vulkan.Core10.AllocationCallbacks.AllocationCallbacks' structure
--
-- -   #VUID-vkCreateShadersEXT-pShaders-parameter# @pShaders@ /must/ be a
--     valid pointer to an array of @createInfoCount@
--     'Vulkan.Extensions.Handles.ShaderEXT' handles
--
-- -   #VUID-vkCreateShadersEXT-createInfoCount-arraylength#
--     @createInfoCount@ /must/ be greater than @0@
--
-- == Return Codes
--
-- [<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#fundamentals-successcodes Success>]
--
--     -   'Vulkan.Core10.Enums.Result.INCOMPATIBLE_SHADER_BINARY_EXT'
--
--     -   'Vulkan.Core10.Enums.Result.SUCCESS'
--
-- [<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#fundamentals-errorcodes Failure>]
--
--     -   'Vulkan.Core10.Enums.Result.ERROR_INITIALIZATION_FAILED'
--
--     -   'Vulkan.Core10.Enums.Result.ERROR_OUT_OF_DEVICE_MEMORY'
--
--     -   'Vulkan.Core10.Enums.Result.ERROR_OUT_OF_HOST_MEMORY'
--
--     -   'Vulkan.Core10.Enums.Result.ERROR_UNKNOWN'
--
--     -   'Vulkan.Core10.Enums.Result.ERROR_VALIDATION_FAILED'
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_shader_object VK_EXT_shader_object>,
-- 'Vulkan.Core10.AllocationCallbacks.AllocationCallbacks',
-- 'Vulkan.Core10.Handles.Device', 'ShaderCreateInfoEXT',
-- 'Vulkan.Extensions.Handles.ShaderEXT'
createShadersEXT :: forall io
                  . (MonadIO io)
                 => -- | @device@ is the logical device that creates the shader objects.
                    Device
                 -> -- | @pCreateInfos@ is a pointer to an array of 'ShaderCreateInfoEXT'
                    -- structures.
                    ("createInfos" ::: Vector (SomeStruct ShaderCreateInfoEXT))
                 -> -- | @pAllocator@ controls host memory allocation as described in the
                    -- <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#memory-allocation Memory Allocation>
                    -- chapter.
                    ("allocator" ::: Maybe AllocationCallbacks)
                 -> io (Result, ("shaders" ::: Vector ShaderEXT))
createShadersEXT :: forall (io :: * -> *).
MonadIO io =>
Device
-> ("createInfos" ::: Vector (SomeStruct ShaderCreateInfoEXT))
-> ("allocator" ::: Maybe AllocationCallbacks)
-> io (Result, "shaders" ::: Vector ShaderEXT)
createShadersEXT Device
device "createInfos" ::: Vector (SomeStruct ShaderCreateInfoEXT)
createInfos "allocator" ::: Maybe AllocationCallbacks
allocator = IO (Result, "shaders" ::: Vector ShaderEXT)
-> io (Result, "shaders" ::: Vector ShaderEXT)
forall a. IO a -> io a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Result, "shaders" ::: Vector ShaderEXT)
 -> io (Result, "shaders" ::: Vector ShaderEXT))
-> (ContT
      (Result, "shaders" ::: Vector ShaderEXT)
      IO
      (Result, "shaders" ::: Vector ShaderEXT)
    -> IO (Result, "shaders" ::: Vector ShaderEXT))
-> ContT
     (Result, "shaders" ::: Vector ShaderEXT)
     IO
     (Result, "shaders" ::: Vector ShaderEXT)
-> io (Result, "shaders" ::: Vector ShaderEXT)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ContT
  (Result, "shaders" ::: Vector ShaderEXT)
  IO
  (Result, "shaders" ::: Vector ShaderEXT)
-> IO (Result, "shaders" ::: Vector ShaderEXT)
forall (m :: * -> *) r. Monad m => ContT r m r -> m r
evalContT (ContT
   (Result, "shaders" ::: Vector ShaderEXT)
   IO
   (Result, "shaders" ::: Vector ShaderEXT)
 -> io (Result, "shaders" ::: Vector ShaderEXT))
-> ContT
     (Result, "shaders" ::: Vector ShaderEXT)
     IO
     (Result, "shaders" ::: Vector ShaderEXT)
-> io (Result, "shaders" ::: Vector ShaderEXT)
forall a b. (a -> b) -> a -> b
$ do
  let vkCreateShadersEXTPtr :: FunPtr
  (Ptr Device_T
   -> Word32
   -> Ptr (SomeStruct ShaderCreateInfoEXT)
   -> Ptr AllocationCallbacks
   -> Ptr ShaderEXT
   -> IO Result)
vkCreateShadersEXTPtr = DeviceCmds
-> FunPtr
     (Ptr Device_T
      -> Word32
      -> Ptr (SomeStruct ShaderCreateInfoEXT)
      -> Ptr AllocationCallbacks
      -> Ptr ShaderEXT
      -> IO Result)
pVkCreateShadersEXT (case Device
device of Device{DeviceCmds
deviceCmds :: DeviceCmds
deviceCmds :: Device -> DeviceCmds
deviceCmds} -> DeviceCmds
deviceCmds)
  IO () -> ContT (Result, "shaders" ::: Vector ShaderEXT) IO ()
forall (m :: * -> *) a.
Monad m =>
m a -> ContT (Result, "shaders" ::: Vector ShaderEXT) m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO () -> ContT (Result, "shaders" ::: Vector ShaderEXT) IO ())
-> IO () -> ContT (Result, "shaders" ::: Vector ShaderEXT) IO ()
forall a b. (a -> b) -> a -> b
$ Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (FunPtr
  (Ptr Device_T
   -> Word32
   -> Ptr (SomeStruct ShaderCreateInfoEXT)
   -> Ptr AllocationCallbacks
   -> Ptr ShaderEXT
   -> IO Result)
vkCreateShadersEXTPtr FunPtr
  (Ptr Device_T
   -> Word32
   -> Ptr (SomeStruct ShaderCreateInfoEXT)
   -> Ptr AllocationCallbacks
   -> Ptr ShaderEXT
   -> IO Result)
-> FunPtr
     (Ptr Device_T
      -> Word32
      -> Ptr (SomeStruct ShaderCreateInfoEXT)
      -> Ptr AllocationCallbacks
      -> Ptr ShaderEXT
      -> IO Result)
-> Bool
forall a. Eq a => a -> a -> Bool
/= FunPtr
  (Ptr Device_T
   -> Word32
   -> Ptr (SomeStruct ShaderCreateInfoEXT)
   -> Ptr AllocationCallbacks
   -> Ptr ShaderEXT
   -> IO Result)
forall a. FunPtr a
nullFunPtr) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$
    IOException -> IO ()
forall e a. (HasCallStack, Exception e) => e -> IO a
throwIO (IOException -> IO ()) -> IOException -> IO ()
forall a b. (a -> b) -> a -> b
$ Maybe Handle
-> IOErrorType
-> String
-> String
-> Maybe CInt
-> Maybe String
-> IOException
IOError Maybe Handle
forall a. Maybe a
Nothing IOErrorType
InvalidArgument String
"" String
"The function pointer for vkCreateShadersEXT is null" Maybe CInt
forall a. Maybe a
Nothing Maybe String
forall a. Maybe a
Nothing
  let vkCreateShadersEXT' :: Ptr Device_T
-> Word32
-> Ptr (SomeStruct ShaderCreateInfoEXT)
-> Ptr AllocationCallbacks
-> Ptr ShaderEXT
-> IO Result
vkCreateShadersEXT' = FunPtr
  (Ptr Device_T
   -> Word32
   -> Ptr (SomeStruct ShaderCreateInfoEXT)
   -> Ptr AllocationCallbacks
   -> Ptr ShaderEXT
   -> IO Result)
-> Ptr Device_T
-> Word32
-> Ptr (SomeStruct ShaderCreateInfoEXT)
-> Ptr AllocationCallbacks
-> Ptr ShaderEXT
-> IO Result
mkVkCreateShadersEXT FunPtr
  (Ptr Device_T
   -> Word32
   -> Ptr (SomeStruct ShaderCreateInfoEXT)
   -> Ptr AllocationCallbacks
   -> Ptr ShaderEXT
   -> IO Result)
vkCreateShadersEXTPtr
  pPCreateInfos <- ((Ptr (ShaderCreateInfoEXT (ZonkAny 0))
  -> IO (Result, "shaders" ::: Vector ShaderEXT))
 -> IO (Result, "shaders" ::: Vector ShaderEXT))
-> ContT
     (Result, "shaders" ::: Vector ShaderEXT)
     IO
     (Ptr (ShaderCreateInfoEXT (ZonkAny 0)))
forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((Ptr (ShaderCreateInfoEXT (ZonkAny 0))
   -> IO (Result, "shaders" ::: Vector ShaderEXT))
  -> IO (Result, "shaders" ::: Vector ShaderEXT))
 -> ContT
      (Result, "shaders" ::: Vector ShaderEXT)
      IO
      (Ptr (ShaderCreateInfoEXT (ZonkAny 0))))
-> ((Ptr (ShaderCreateInfoEXT (ZonkAny 0))
     -> IO (Result, "shaders" ::: Vector ShaderEXT))
    -> IO (Result, "shaders" ::: Vector ShaderEXT))
-> ContT
     (Result, "shaders" ::: Vector ShaderEXT)
     IO
     (Ptr (ShaderCreateInfoEXT (ZonkAny 0)))
forall a b. (a -> b) -> a -> b
$ forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes @(ShaderCreateInfoEXT _) ((("createInfos" ::: Vector (SomeStruct ShaderCreateInfoEXT)) -> Int
forall a. Vector a -> Int
Data.Vector.length ("createInfos" ::: Vector (SomeStruct ShaderCreateInfoEXT)
createInfos)) Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
96)
  Data.Vector.imapM_ (\Int
i SomeStruct ShaderCreateInfoEXT
e -> ((() -> IO (Result, "shaders" ::: Vector ShaderEXT))
 -> IO (Result, "shaders" ::: Vector ShaderEXT))
-> ContT (Result, "shaders" ::: Vector ShaderEXT) IO ()
forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((() -> IO (Result, "shaders" ::: Vector ShaderEXT))
  -> IO (Result, "shaders" ::: Vector ShaderEXT))
 -> ContT (Result, "shaders" ::: Vector ShaderEXT) IO ())
-> ((() -> IO (Result, "shaders" ::: Vector ShaderEXT))
    -> IO (Result, "shaders" ::: Vector ShaderEXT))
-> ContT (Result, "shaders" ::: Vector ShaderEXT) IO ()
forall a b. (a -> b) -> a -> b
$ Ptr (SomeStruct ShaderCreateInfoEXT)
-> SomeStruct ShaderCreateInfoEXT
-> IO (Result, "shaders" ::: Vector ShaderEXT)
-> IO (Result, "shaders" ::: Vector ShaderEXT)
forall (a :: [*] -> *) b.
(forall (es :: [*]).
 (Extendss a es, PokeChain es) =>
 ToCStruct (a es)) =>
Ptr (SomeStruct a) -> SomeStruct a -> IO b -> IO b
pokeSomeCStruct (Ptr (ShaderCreateInfoEXT (ZonkAny 1))
-> Ptr (SomeStruct ShaderCreateInfoEXT)
forall (a :: [*] -> *) (es :: [*]).
Ptr (a es) -> Ptr (SomeStruct a)
forgetExtensions (Ptr (ShaderCreateInfoEXT (ZonkAny 0))
pPCreateInfos Ptr (ShaderCreateInfoEXT (ZonkAny 0))
-> Int -> Ptr (ShaderCreateInfoEXT w)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` (Int
96 Int -> Int -> Int
forall a. Num a => a -> a -> a
* (Int
i)) :: Ptr (ShaderCreateInfoEXT _))) (SomeStruct ShaderCreateInfoEXT
e) (IO (Result, "shaders" ::: Vector ShaderEXT)
 -> IO (Result, "shaders" ::: Vector ShaderEXT))
-> ((() -> IO (Result, "shaders" ::: Vector ShaderEXT))
    -> IO (Result, "shaders" ::: Vector ShaderEXT))
-> (() -> IO (Result, "shaders" ::: Vector ShaderEXT))
-> IO (Result, "shaders" ::: Vector ShaderEXT)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((() -> IO (Result, "shaders" ::: Vector ShaderEXT))
-> () -> IO (Result, "shaders" ::: Vector ShaderEXT)
forall a b. (a -> b) -> a -> b
$ ())) (createInfos)
  pAllocator <- case (allocator) of
    "allocator" ::: Maybe AllocationCallbacks
Nothing -> Ptr AllocationCallbacks
-> ContT
     (Result, "shaders" ::: Vector ShaderEXT)
     IO
     (Ptr AllocationCallbacks)
forall a. a -> ContT (Result, "shaders" ::: Vector ShaderEXT) IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Ptr AllocationCallbacks
forall a. Ptr a
nullPtr
    Just AllocationCallbacks
j -> ((Ptr AllocationCallbacks
  -> IO (Result, "shaders" ::: Vector ShaderEXT))
 -> IO (Result, "shaders" ::: Vector ShaderEXT))
-> ContT
     (Result, "shaders" ::: Vector ShaderEXT)
     IO
     (Ptr AllocationCallbacks)
forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((Ptr AllocationCallbacks
   -> IO (Result, "shaders" ::: Vector ShaderEXT))
  -> IO (Result, "shaders" ::: Vector ShaderEXT))
 -> ContT
      (Result, "shaders" ::: Vector ShaderEXT)
      IO
      (Ptr AllocationCallbacks))
-> ((Ptr AllocationCallbacks
     -> IO (Result, "shaders" ::: Vector ShaderEXT))
    -> IO (Result, "shaders" ::: Vector ShaderEXT))
-> ContT
     (Result, "shaders" ::: Vector ShaderEXT)
     IO
     (Ptr AllocationCallbacks)
forall a b. (a -> b) -> a -> b
$ AllocationCallbacks
-> (Ptr AllocationCallbacks
    -> IO (Result, "shaders" ::: Vector ShaderEXT))
-> IO (Result, "shaders" ::: Vector ShaderEXT)
forall a b. ToCStruct a => a -> (Ptr a -> IO b) -> IO b
forall b.
AllocationCallbacks -> (Ptr AllocationCallbacks -> IO b) -> IO b
withCStruct (AllocationCallbacks
j)
  pPShaders <- ContT $ bracket (callocBytes @ShaderEXT ((fromIntegral ((fromIntegral (Data.Vector.length $ (createInfos)) :: Word32))) * 8)) free
  r <- lift $ traceAroundEvent "vkCreateShadersEXT" (vkCreateShadersEXT'
                                                       (deviceHandle (device))
                                                       ((fromIntegral (Data.Vector.length $ (createInfos)) :: Word32))
                                                       (forgetExtensions (pPCreateInfos))
                                                       pAllocator
                                                       (pPShaders))
  lift $ when (r < SUCCESS) (throwIO (VulkanException r))
  pShaders <- lift $ generateM (fromIntegral ((fromIntegral (Data.Vector.length $ (createInfos)) :: Word32))) (\Int
i -> forall a. Storable a => Ptr a -> IO a
peek @ShaderEXT ((Ptr ShaderEXT
pPShaders Ptr ShaderEXT -> Int -> Ptr ShaderEXT
forall a. Ptr a -> Int -> Ptr a
`advancePtrBytes` (Int
8 Int -> Int -> Int
forall a. Num a => a -> a -> a
* (Int
i)) :: Ptr ShaderEXT)))
  pure $ (r, pShaders)

-- | A convenience wrapper to make a compatible pair of calls to
-- 'createShadersEXT' and 'destroyShaderEXT'
--
-- To ensure that 'destroyShaderEXT' is always called: pass
-- 'Control.Exception.bracket' (or the allocate function from your
-- favourite resource management library) as the last argument.
-- To just extract the pair pass '(,)' as the last argument.
--
withShadersEXT :: forall io r . MonadIO io => Device -> Vector (SomeStruct ShaderCreateInfoEXT) -> Maybe AllocationCallbacks -> (io (Result, Vector ShaderEXT) -> ((Result, Vector ShaderEXT) -> io ()) -> r) -> r
withShadersEXT :: forall (io :: * -> *) r.
MonadIO io =>
Device
-> ("createInfos" ::: Vector (SomeStruct ShaderCreateInfoEXT))
-> ("allocator" ::: Maybe AllocationCallbacks)
-> (io (Result, "shaders" ::: Vector ShaderEXT)
    -> ((Result, "shaders" ::: Vector ShaderEXT) -> io ()) -> r)
-> r
withShadersEXT Device
device "createInfos" ::: Vector (SomeStruct ShaderCreateInfoEXT)
pCreateInfos "allocator" ::: Maybe AllocationCallbacks
pAllocator io (Result, "shaders" ::: Vector ShaderEXT)
-> ((Result, "shaders" ::: Vector ShaderEXT) -> io ()) -> r
b =
  io (Result, "shaders" ::: Vector ShaderEXT)
-> ((Result, "shaders" ::: Vector ShaderEXT) -> io ()) -> r
b (Device
-> ("createInfos" ::: Vector (SomeStruct ShaderCreateInfoEXT))
-> ("allocator" ::: Maybe AllocationCallbacks)
-> io (Result, "shaders" ::: Vector ShaderEXT)
forall (io :: * -> *).
MonadIO io =>
Device
-> ("createInfos" ::: Vector (SomeStruct ShaderCreateInfoEXT))
-> ("allocator" ::: Maybe AllocationCallbacks)
-> io (Result, "shaders" ::: Vector ShaderEXT)
createShadersEXT Device
device "createInfos" ::: Vector (SomeStruct ShaderCreateInfoEXT)
pCreateInfos "allocator" ::: Maybe AllocationCallbacks
pAllocator)
    (\(Result
_, "shaders" ::: Vector ShaderEXT
o1) -> (ShaderEXT -> io ()) -> ("shaders" ::: Vector ShaderEXT) -> io ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
(a -> f b) -> t a -> f ()
traverse_ (\ShaderEXT
o1Elem -> Device
-> ShaderEXT
-> ("allocator" ::: Maybe AllocationCallbacks)
-> io ()
forall (io :: * -> *).
MonadIO io =>
Device
-> ShaderEXT
-> ("allocator" ::: Maybe AllocationCallbacks)
-> io ()
destroyShaderEXT Device
device
                                                          ShaderEXT
o1Elem
                                                          "allocator" ::: Maybe AllocationCallbacks
pAllocator) "shaders" ::: Vector ShaderEXT
o1)


foreign import ccall
#if !defined(SAFE_FOREIGN_CALLS)
  unsafe
#endif
  "dynamic" mkVkDestroyShaderEXT
  :: FunPtr (Ptr Device_T -> ShaderEXT -> Ptr AllocationCallbacks -> IO ()) -> Ptr Device_T -> ShaderEXT -> Ptr AllocationCallbacks -> IO ()

-- | vkDestroyShaderEXT - Destroy a shader object
--
-- = Description
--
-- Destroying a shader object used by one or more command buffers in the
-- <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#commandbuffers-lifecycle recording or executable state>
-- causes those command buffers to move into the /invalid state/.
--
-- == Valid Usage
--
-- -   #VUID-vkDestroyShaderEXT-None-08481# The
--     <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#features-shaderObject shaderObject>
--     feature /must/ be enabled
--
-- -   #VUID-vkDestroyShaderEXT-shader-08482# All submitted commands that
--     refer to @shader@ /must/ have completed execution
--
-- -   #VUID-vkDestroyShaderEXT-pAllocator-08483# If
--     'Vulkan.Core10.AllocationCallbacks.AllocationCallbacks' were
--     provided when @shader@ was created, a compatible set of callbacks
--     /must/ be provided here
--
-- -   #VUID-vkDestroyShaderEXT-pAllocator-08484# If no
--     'Vulkan.Core10.AllocationCallbacks.AllocationCallbacks' were
--     provided when @shader@ was created, @pAllocator@ /must/ be @NULL@
--
-- == Valid Usage (Implicit)
--
-- -   #VUID-vkDestroyShaderEXT-device-parameter# @device@ /must/ be a
--     valid 'Vulkan.Core10.Handles.Device' handle
--
-- -   #VUID-vkDestroyShaderEXT-shader-parameter# If @shader@ is not
--     'Vulkan.Core10.APIConstants.NULL_HANDLE', @shader@ /must/ be a valid
--     'Vulkan.Extensions.Handles.ShaderEXT' handle
--
-- -   #VUID-vkDestroyShaderEXT-pAllocator-parameter# If @pAllocator@ is
--     not @NULL@, @pAllocator@ /must/ be a valid pointer to a valid
--     'Vulkan.Core10.AllocationCallbacks.AllocationCallbacks' structure
--
-- -   #VUID-vkDestroyShaderEXT-shader-parent# If @shader@ is a valid
--     handle, it /must/ have been created, allocated, or retrieved from
--     @device@
--
-- == Host Synchronization
--
-- -   Host access to @shader@ /must/ be externally synchronized
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_shader_object VK_EXT_shader_object>,
-- 'Vulkan.Core10.AllocationCallbacks.AllocationCallbacks',
-- 'Vulkan.Core10.Handles.Device', 'Vulkan.Extensions.Handles.ShaderEXT'
destroyShaderEXT :: forall io
                  . (MonadIO io)
                 => -- | @device@ is the logical device that destroys the shader object.
                    Device
                 -> -- | @shader@ is the handle of the shader object to destroy.
                    ShaderEXT
                 -> -- | @pAllocator@ controls host memory allocation as described in the
                    -- <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#memory-allocation Memory Allocation>
                    -- chapter.
                    ("allocator" ::: Maybe AllocationCallbacks)
                 -> io ()
destroyShaderEXT :: forall (io :: * -> *).
MonadIO io =>
Device
-> ShaderEXT
-> ("allocator" ::: Maybe AllocationCallbacks)
-> io ()
destroyShaderEXT Device
device ShaderEXT
shader "allocator" ::: Maybe AllocationCallbacks
allocator = IO () -> io ()
forall a. IO a -> io a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> io ())
-> (ContT () IO () -> IO ()) -> ContT () IO () -> io ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ContT () IO () -> IO ()
forall (m :: * -> *) r. Monad m => ContT r m r -> m r
evalContT (ContT () IO () -> io ()) -> ContT () IO () -> io ()
forall a b. (a -> b) -> a -> b
$ do
  let vkDestroyShaderEXTPtr :: FunPtr
  (Ptr Device_T -> ShaderEXT -> Ptr AllocationCallbacks -> IO ())
vkDestroyShaderEXTPtr = DeviceCmds
-> FunPtr
     (Ptr Device_T -> ShaderEXT -> Ptr AllocationCallbacks -> IO ())
pVkDestroyShaderEXT (case Device
device of Device{DeviceCmds
deviceCmds :: Device -> DeviceCmds
deviceCmds :: DeviceCmds
deviceCmds} -> DeviceCmds
deviceCmds)
  IO () -> ContT () IO ()
forall (m :: * -> *) a. Monad m => m a -> ContT () m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO () -> ContT () IO ()) -> IO () -> ContT () IO ()
forall a b. (a -> b) -> a -> b
$ Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (FunPtr
  (Ptr Device_T -> ShaderEXT -> Ptr AllocationCallbacks -> IO ())
vkDestroyShaderEXTPtr FunPtr
  (Ptr Device_T -> ShaderEXT -> Ptr AllocationCallbacks -> IO ())
-> FunPtr
     (Ptr Device_T -> ShaderEXT -> Ptr AllocationCallbacks -> IO ())
-> Bool
forall a. Eq a => a -> a -> Bool
/= FunPtr
  (Ptr Device_T -> ShaderEXT -> Ptr AllocationCallbacks -> IO ())
forall a. FunPtr a
nullFunPtr) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$
    IOException -> IO ()
forall e a. (HasCallStack, Exception e) => e -> IO a
throwIO (IOException -> IO ()) -> IOException -> IO ()
forall a b. (a -> b) -> a -> b
$ Maybe Handle
-> IOErrorType
-> String
-> String
-> Maybe CInt
-> Maybe String
-> IOException
IOError Maybe Handle
forall a. Maybe a
Nothing IOErrorType
InvalidArgument String
"" String
"The function pointer for vkDestroyShaderEXT is null" Maybe CInt
forall a. Maybe a
Nothing Maybe String
forall a. Maybe a
Nothing
  let vkDestroyShaderEXT' :: Ptr Device_T -> ShaderEXT -> Ptr AllocationCallbacks -> IO ()
vkDestroyShaderEXT' = FunPtr
  (Ptr Device_T -> ShaderEXT -> Ptr AllocationCallbacks -> IO ())
-> Ptr Device_T -> ShaderEXT -> Ptr AllocationCallbacks -> IO ()
mkVkDestroyShaderEXT FunPtr
  (Ptr Device_T -> ShaderEXT -> Ptr AllocationCallbacks -> IO ())
vkDestroyShaderEXTPtr
  pAllocator <- case ("allocator" ::: Maybe AllocationCallbacks
allocator) of
    "allocator" ::: Maybe AllocationCallbacks
Nothing -> Ptr AllocationCallbacks -> ContT () IO (Ptr AllocationCallbacks)
forall a. a -> ContT () IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Ptr AllocationCallbacks
forall a. Ptr a
nullPtr
    Just AllocationCallbacks
j -> ((Ptr AllocationCallbacks -> IO ()) -> IO ())
-> ContT () IO (Ptr AllocationCallbacks)
forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((Ptr AllocationCallbacks -> IO ()) -> IO ())
 -> ContT () IO (Ptr AllocationCallbacks))
-> ((Ptr AllocationCallbacks -> IO ()) -> IO ())
-> ContT () IO (Ptr AllocationCallbacks)
forall a b. (a -> b) -> a -> b
$ AllocationCallbacks -> (Ptr AllocationCallbacks -> IO ()) -> IO ()
forall a b. ToCStruct a => a -> (Ptr a -> IO b) -> IO b
forall b.
AllocationCallbacks -> (Ptr AllocationCallbacks -> IO b) -> IO b
withCStruct (AllocationCallbacks
j)
  lift $ traceAroundEvent "vkDestroyShaderEXT" (vkDestroyShaderEXT'
                                                  (deviceHandle (device))
                                                  (shader)
                                                  pAllocator)
  pure $ ()


foreign import ccall
#if !defined(SAFE_FOREIGN_CALLS)
  unsafe
#endif
  "dynamic" mkVkGetShaderBinaryDataEXT
  :: FunPtr (Ptr Device_T -> ShaderEXT -> Ptr CSize -> Ptr () -> IO Result) -> Ptr Device_T -> ShaderEXT -> Ptr CSize -> Ptr () -> IO Result

-- | vkGetShaderBinaryDataEXT - Get the binary shader code from a shader
-- object
--
-- = Description
--
-- If @pData@ is @NULL@, then the size of the binary shader code of the
-- shader object, in bytes, is returned in @pDataSize@. Otherwise,
-- @pDataSize@ /must/ point to a variable set by the application to the
-- size of the buffer, in bytes, pointed to by @pData@, and on return the
-- variable is overwritten with the amount of data actually written to
-- @pData@. If @pDataSize@ is less than the size of the binary shader code,
-- nothing is written to @pData@, and
-- 'Vulkan.Core10.Enums.Result.INCOMPLETE' will be returned instead of
-- 'Vulkan.Core10.Enums.Result.SUCCESS'.
--
-- The behavior of this command when @pDataSize@ is too small differs from
-- how some other getter-type commands work in Vulkan. Because shader
-- binary data is only usable in its entirety, it would never be useful for
-- the implementation to return partial data. Because of this, nothing is
-- written to @pData@ unless @pDataSize@ is large enough to fit the data in
-- its entirety.
--
-- This behavior is not consistent with the behavior described in
-- <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#fundamentals-binaryresults Opaque Binary Data Results>,
-- for historical reasons.
--
-- If the amount of data available is larger than the passed @pDataSize@,
-- the query returns a 'Vulkan.Core10.Enums.Result.INCOMPLETE' success
-- status instead of a
-- 'Vulkan.Core10.Enums.Result.ERROR_NOT_ENOUGH_SPACE_KHR' error status.
--
-- Binary shader code retrieved using 'getShaderBinaryDataEXT' /can/ be
-- passed to a subsequent call to 'createShadersEXT' on a compatible
-- physical device by specifying 'SHADER_CODE_TYPE_BINARY_EXT' in the
-- @codeType@ member of 'ShaderCreateInfoEXT'.
--
-- The shader code returned by repeated calls to this function with the
-- same 'Vulkan.Extensions.Handles.ShaderEXT' is guaranteed to be invariant
-- for the lifetime of the 'Vulkan.Extensions.Handles.ShaderEXT' object.
--
-- == Valid Usage
--
-- -   #VUID-vkGetShaderBinaryDataEXT-None-08461# The
--     <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#features-shaderObject shaderObject>
--     feature /must/ be enabled
--
-- -   #VUID-vkGetShaderBinaryDataEXT-None-08499# If @pData@ is not @NULL@,
--     it /must/ be aligned to @16@ bytes
--
-- == Valid Usage (Implicit)
--
-- -   #VUID-vkGetShaderBinaryDataEXT-device-parameter# @device@ /must/ be
--     a valid 'Vulkan.Core10.Handles.Device' handle
--
-- -   #VUID-vkGetShaderBinaryDataEXT-shader-parameter# @shader@ /must/ be
--     a valid 'Vulkan.Extensions.Handles.ShaderEXT' handle
--
-- -   #VUID-vkGetShaderBinaryDataEXT-pDataSize-parameter# @pDataSize@
--     /must/ be a valid pointer to a @size_t@ value
--
-- -   #VUID-vkGetShaderBinaryDataEXT-pData-parameter# If the value
--     referenced by @pDataSize@ is not @0@, and @pData@ is not @NULL@,
--     @pData@ /must/ be a valid pointer to an array of @pDataSize@ bytes
--
-- -   #VUID-vkGetShaderBinaryDataEXT-shader-parent# @shader@ /must/ have
--     been created, allocated, or retrieved from @device@
--
-- == Return Codes
--
-- [<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#fundamentals-successcodes Success>]
--
--     -   'Vulkan.Core10.Enums.Result.INCOMPLETE'
--
--     -   'Vulkan.Core10.Enums.Result.SUCCESS'
--
-- [<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#fundamentals-errorcodes Failure>]
--
--     -   'Vulkan.Core10.Enums.Result.ERROR_OUT_OF_DEVICE_MEMORY'
--
--     -   'Vulkan.Core10.Enums.Result.ERROR_OUT_OF_HOST_MEMORY'
--
--     -   'Vulkan.Core10.Enums.Result.ERROR_UNKNOWN'
--
--     -   'Vulkan.Core10.Enums.Result.ERROR_VALIDATION_FAILED'
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_shader_object VK_EXT_shader_object>,
-- 'Vulkan.Core10.Handles.Device', 'Vulkan.Extensions.Handles.ShaderEXT'
getShaderBinaryDataEXT :: forall io
                        . (MonadIO io)
                       => -- | @device@ is the logical device that shader object was created from.
                          Device
                       -> -- | @shader@ is the shader object to retrieve binary shader code from.
                          ShaderEXT
                       -> io (Result, ("data" ::: ByteString))
getShaderBinaryDataEXT :: forall (io :: * -> *).
MonadIO io =>
Device -> ShaderEXT -> io (Result, "data" ::: ByteString)
getShaderBinaryDataEXT Device
device ShaderEXT
shader = IO (Result, "data" ::: ByteString)
-> io (Result, "data" ::: ByteString)
forall a. IO a -> io a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Result, "data" ::: ByteString)
 -> io (Result, "data" ::: ByteString))
-> (ContT
      (Result, "data" ::: ByteString) IO (Result, "data" ::: ByteString)
    -> IO (Result, "data" ::: ByteString))
-> ContT
     (Result, "data" ::: ByteString) IO (Result, "data" ::: ByteString)
-> io (Result, "data" ::: ByteString)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ContT
  (Result, "data" ::: ByteString) IO (Result, "data" ::: ByteString)
-> IO (Result, "data" ::: ByteString)
forall (m :: * -> *) r. Monad m => ContT r m r -> m r
evalContT (ContT
   (Result, "data" ::: ByteString) IO (Result, "data" ::: ByteString)
 -> io (Result, "data" ::: ByteString))
-> ContT
     (Result, "data" ::: ByteString) IO (Result, "data" ::: ByteString)
-> io (Result, "data" ::: ByteString)
forall a b. (a -> b) -> a -> b
$ do
  let vkGetShaderBinaryDataEXTPtr :: FunPtr
  (Ptr Device_T -> ShaderEXT -> Ptr CSize -> Ptr () -> IO Result)
vkGetShaderBinaryDataEXTPtr = DeviceCmds
-> FunPtr
     (Ptr Device_T -> ShaderEXT -> Ptr CSize -> Ptr () -> IO Result)
pVkGetShaderBinaryDataEXT (case Device
device of Device{DeviceCmds
deviceCmds :: Device -> DeviceCmds
deviceCmds :: DeviceCmds
deviceCmds} -> DeviceCmds
deviceCmds)
  IO () -> ContT (Result, "data" ::: ByteString) IO ()
forall (m :: * -> *) a.
Monad m =>
m a -> ContT (Result, "data" ::: ByteString) m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO () -> ContT (Result, "data" ::: ByteString) IO ())
-> IO () -> ContT (Result, "data" ::: ByteString) IO ()
forall a b. (a -> b) -> a -> b
$ Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (FunPtr
  (Ptr Device_T -> ShaderEXT -> Ptr CSize -> Ptr () -> IO Result)
vkGetShaderBinaryDataEXTPtr FunPtr
  (Ptr Device_T -> ShaderEXT -> Ptr CSize -> Ptr () -> IO Result)
-> FunPtr
     (Ptr Device_T -> ShaderEXT -> Ptr CSize -> Ptr () -> IO Result)
-> Bool
forall a. Eq a => a -> a -> Bool
/= FunPtr
  (Ptr Device_T -> ShaderEXT -> Ptr CSize -> Ptr () -> IO Result)
forall a. FunPtr a
nullFunPtr) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$
    IOException -> IO ()
forall e a. (HasCallStack, Exception e) => e -> IO a
throwIO (IOException -> IO ()) -> IOException -> IO ()
forall a b. (a -> b) -> a -> b
$ Maybe Handle
-> IOErrorType
-> String
-> String
-> Maybe CInt
-> Maybe String
-> IOException
IOError Maybe Handle
forall a. Maybe a
Nothing IOErrorType
InvalidArgument String
"" String
"The function pointer for vkGetShaderBinaryDataEXT is null" Maybe CInt
forall a. Maybe a
Nothing Maybe String
forall a. Maybe a
Nothing
  let vkGetShaderBinaryDataEXT' :: Ptr Device_T -> ShaderEXT -> Ptr CSize -> Ptr () -> IO Result
vkGetShaderBinaryDataEXT' = FunPtr
  (Ptr Device_T -> ShaderEXT -> Ptr CSize -> Ptr () -> IO Result)
-> Ptr Device_T -> ShaderEXT -> Ptr CSize -> Ptr () -> IO Result
mkVkGetShaderBinaryDataEXT FunPtr
  (Ptr Device_T -> ShaderEXT -> Ptr CSize -> Ptr () -> IO Result)
vkGetShaderBinaryDataEXTPtr
  let device' :: Ptr Device_T
device' = Device -> Ptr Device_T
deviceHandle (Device
device)
  pPDataSize <- ((Ptr CSize -> IO (Result, "data" ::: ByteString))
 -> IO (Result, "data" ::: ByteString))
-> ContT (Result, "data" ::: ByteString) IO (Ptr CSize)
forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((Ptr CSize -> IO (Result, "data" ::: ByteString))
  -> IO (Result, "data" ::: ByteString))
 -> ContT (Result, "data" ::: ByteString) IO (Ptr CSize))
-> ((Ptr CSize -> IO (Result, "data" ::: ByteString))
    -> IO (Result, "data" ::: ByteString))
-> ContT (Result, "data" ::: ByteString) IO (Ptr CSize)
forall a b. (a -> b) -> a -> b
$ IO (Ptr CSize)
-> (Ptr CSize -> IO ())
-> (Ptr CSize -> IO (Result, "data" ::: ByteString))
-> IO (Result, "data" ::: ByteString)
forall a b c. IO a -> (a -> IO b) -> (a -> IO c) -> IO c
bracket (forall a. Int -> IO (Ptr a)
callocBytes @CSize Int
8) Ptr CSize -> IO ()
forall a. Ptr a -> IO ()
free
  r <- lift $ traceAroundEvent "vkGetShaderBinaryDataEXT" (vkGetShaderBinaryDataEXT'
                                                             device'
                                                             (shader)
                                                             (pPDataSize)
                                                             (nullPtr))
  lift $ when (r < SUCCESS) (throwIO (VulkanException r))
  pDataSize <- lift $ peek @CSize pPDataSize
  pPData <- ContT $ bracket (callocBytes @(()) (fromIntegral ((coerce @CSize @Word64 pDataSize)))) free
  r' <- lift $ traceAroundEvent "vkGetShaderBinaryDataEXT" (vkGetShaderBinaryDataEXT'
                                                              device'
                                                              (shader)
                                                              (pPDataSize)
                                                              (pPData))
  lift $ when (r' < SUCCESS) (throwIO (VulkanException r'))
  pDataSize'' <- lift $ peek @CSize pPDataSize
  pData' <- lift $ packCStringLen  ( castPtr @() @CChar pPData
                                   , (fromIntegral ((coerce @CSize @Word64 pDataSize''))) )
  pure $ ((r'), pData')


foreign import ccall
#if !defined(SAFE_FOREIGN_CALLS)
  unsafe
#endif
  "dynamic" mkVkCmdBindShadersEXT
  :: FunPtr (Ptr CommandBuffer_T -> Word32 -> Ptr ShaderStageFlagBits -> Ptr ShaderEXT -> IO ()) -> Ptr CommandBuffer_T -> Word32 -> Ptr ShaderStageFlagBits -> Ptr ShaderEXT -> IO ()

-- | vkCmdBindShadersEXT - Bind shader objects to a command buffer
--
-- = Description
--
-- When binding linked shaders, an application /may/ bind them in any
-- combination of one or more calls to 'cmdBindShadersEXT' (i.e., shaders
-- that were created linked together do not need to be bound in the same
-- 'cmdBindShadersEXT' call).
--
-- Any shader object bound to a particular stage /may/ be unbound by
-- setting its value in @pShaders@ to
-- 'Vulkan.Core10.APIConstants.NULL_HANDLE'. If @pShaders@ is @NULL@,
-- 'cmdBindShadersEXT' behaves as if @pShaders@ was an array of
-- @stageCount@ 'Vulkan.Core10.APIConstants.NULL_HANDLE' values (i.e., any
-- shaders bound to the stages specified in @pStages@ are unbound).
--
-- == Valid Usage
--
-- -   #VUID-vkCmdBindShadersEXT-None-08462# The
--     <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#features-shaderObject shaderObject>
--     feature /must/ be enabled
--
-- -   #VUID-vkCmdBindShadersEXT-pStages-08463# Every element of @pStages@
--     /must/ be unique
--
-- -   #VUID-vkCmdBindShadersEXT-pStages-08464# @pStages@ /must/ not
--     contain
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_ALL_GRAPHICS'
--     or 'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_ALL'
--
-- -   #VUID-vkCmdBindShadersEXT-pStages-08465# @pStages@ /must/ not
--     contain
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_RAYGEN_BIT_KHR',
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_ANY_HIT_BIT_KHR',
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_CLOSEST_HIT_BIT_KHR',
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_MISS_BIT_KHR',
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_INTERSECTION_BIT_KHR',
--     or
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_CALLABLE_BIT_KHR'
--
-- -   #VUID-vkCmdBindShadersEXT-pStages-08467# @pStages@ /must/ not
--     contain
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_SUBPASS_SHADING_BIT_HUAWEI'
--
-- -   #VUID-vkCmdBindShadersEXT-pStages-08468# @pStages@ /must/ not
--     contain
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_CLUSTER_CULLING_BIT_HUAWEI'
--
-- -   #VUID-vkCmdBindShadersEXT-pShaders-08469# For each element of
--     @pStages@, if @pShaders@ is not @NULL@, and the element of the
--     @pShaders@ array with the same index is not
--     'Vulkan.Core10.APIConstants.NULL_HANDLE', it /must/ have been
--     created with a @stage@ equal to the corresponding element of
--     @pStages@
--
-- -   #VUID-vkCmdBindShadersEXT-pShaders-08470# If @pStages@ contains both
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TASK_BIT_EXT'
--     and
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_VERTEX_BIT',
--     and @pShaders@ is not @NULL@, and the same index in @pShaders@ as
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TASK_BIT_EXT'
--     in @pStages@ is not 'Vulkan.Core10.APIConstants.NULL_HANDLE', the
--     same index in @pShaders@ as
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_VERTEX_BIT' in
--     @pStages@ /must/ be 'Vulkan.Core10.APIConstants.NULL_HANDLE'
--
-- -   #VUID-vkCmdBindShadersEXT-pShaders-08471# If @pStages@ contains both
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_MESH_BIT_EXT'
--     and
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_VERTEX_BIT',
--     and @pShaders@ is not @NULL@, and the same index in @pShaders@ as
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_MESH_BIT_EXT'
--     in @pStages@ is not 'Vulkan.Core10.APIConstants.NULL_HANDLE', the
--     same index in @pShaders@ as
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_VERTEX_BIT' in
--     @pStages@ /must/ be 'Vulkan.Core10.APIConstants.NULL_HANDLE'
--
-- -   #VUID-vkCmdBindShadersEXT-pShaders-08476# If @pStages@ contains
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_COMPUTE_BIT',
--     the 'Vulkan.Core10.Handles.CommandPool' that @commandBuffer@ was
--     allocated from /must/ support compute operations
--
-- -   #VUID-vkCmdBindShadersEXT-pShaders-08477# If @pStages@ contains
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_VERTEX_BIT',
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TESSELLATION_CONTROL_BIT',
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TESSELLATION_EVALUATION_BIT',
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_GEOMETRY_BIT',
--     or
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_FRAGMENT_BIT',
--     the 'Vulkan.Core10.Handles.CommandPool' that @commandBuffer@ was
--     allocated from /must/ support graphics operations
--
-- -   #VUID-vkCmdBindShadersEXT-pShaders-08478# If @pStages@ contains
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_MESH_BIT_EXT'
--     or
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TASK_BIT_EXT',
--     the 'Vulkan.Core10.Handles.CommandPool' that @commandBuffer@ was
--     allocated from /must/ support graphics operations
--
-- == Valid Usage (Implicit)
--
-- -   #VUID-vkCmdBindShadersEXT-commandBuffer-parameter# @commandBuffer@
--     /must/ be a valid 'Vulkan.Core10.Handles.CommandBuffer' handle
--
-- -   #VUID-vkCmdBindShadersEXT-pStages-parameter# @pStages@ /must/ be a
--     valid pointer to an array of @stageCount@ valid
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.ShaderStageFlagBits' values
--
-- -   #VUID-vkCmdBindShadersEXT-pShaders-parameter# If @pShaders@ is not
--     @NULL@, @pShaders@ /must/ be a valid pointer to an array of
--     @stageCount@ valid or 'Vulkan.Core10.APIConstants.NULL_HANDLE'
--     'Vulkan.Extensions.Handles.ShaderEXT' handles
--
-- -   #VUID-vkCmdBindShadersEXT-commandBuffer-recording# @commandBuffer@
--     /must/ be in the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#commandbuffers-lifecycle recording state>
--
-- -   #VUID-vkCmdBindShadersEXT-commandBuffer-cmdpool# The
--     'Vulkan.Core10.Handles.CommandPool' that @commandBuffer@ was
--     allocated from /must/ support
--     'Vulkan.Core10.Enums.QueueFlagBits.QUEUE_COMPUTE_BIT', or
--     'Vulkan.Core10.Enums.QueueFlagBits.QUEUE_GRAPHICS_BIT' operations
--
-- -   #VUID-vkCmdBindShadersEXT-videocoding# This command /must/ only be
--     called outside of a video coding scope
--
-- -   #VUID-vkCmdBindShadersEXT-stageCount-arraylength# @stageCount@
--     /must/ be greater than @0@
--
-- -   #VUID-vkCmdBindShadersEXT-commonparent# Both of @commandBuffer@, and
--     the elements of @pShaders@ that are valid handles of non-ignored
--     parameters /must/ have been created, allocated, or retrieved from
--     the same 'Vulkan.Core10.Handles.Device'
--
-- == Host Synchronization
--
-- -   Host access to @commandBuffer@ /must/ be externally synchronized
--
-- -   Host access to the 'Vulkan.Core10.Handles.CommandPool' that
--     @commandBuffer@ was allocated from /must/ be externally synchronized
--
-- == Command Properties
--
-- \'
--
-- +----------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------+
-- | <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VkCommandBufferLevel Command Buffer Levels> | <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#vkCmdBeginRenderPass Render Pass Scope> | <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#vkCmdBeginVideoCodingKHR Video Coding Scope> | <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VkQueueFlagBits Supported Queue Types> | <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#fundamentals-queueoperation-command-types Command Type> |
-- +============================================================================================================================+========================================================================================================================+=============================================================================================================================+=======================================================================================================================+========================================================================================================================================+
-- | Primary                                                                                                                    | Both                                                                                                                   | Outside                                                                                                                     | VK_QUEUE_COMPUTE_BIT                                                                                                  | State                                                                                                                                  |
-- | Secondary                                                                                                                  |                                                                                                                        |                                                                                                                             | VK_QUEUE_GRAPHICS_BIT                                                                                                 |                                                                                                                                        |
-- +----------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------+
--
-- == Conditional Rendering
--
-- vkCmdBindShadersEXT is not affected by
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#drawing-conditional-rendering conditional rendering>
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_shader_object VK_EXT_shader_object>,
-- 'Vulkan.Core10.Handles.CommandBuffer',
-- 'Vulkan.Extensions.Handles.ShaderEXT',
-- 'Vulkan.Core10.Enums.ShaderStageFlagBits.ShaderStageFlagBits'
cmdBindShadersEXT :: forall io
                   . (MonadIO io)
                  => -- | @commandBuffer@ is the command buffer that the shader object will be
                     -- bound to.
                     CommandBuffer
                  -> -- | @pStages@ is a pointer to an array of
                     -- 'Vulkan.Core10.Enums.ShaderStageFlagBits.ShaderStageFlagBits' values
                     -- specifying one stage per array index that is affected by the
                     -- corresponding value in the @pShaders@ array.
                     ("stages" ::: Vector ShaderStageFlagBits)
                  -> -- | @pShaders@ is a pointer to an array of
                     -- 'Vulkan.Extensions.Handles.ShaderEXT' handles and\/or
                     -- 'Vulkan.Core10.APIConstants.NULL_HANDLE' values describing the shader
                     -- binding operations to be performed on each stage in @pStages@.
                     ("shaders" ::: Vector ShaderEXT)
                  -> io ()
cmdBindShadersEXT :: forall (io :: * -> *).
MonadIO io =>
CommandBuffer
-> ("stages" ::: Vector ShaderStageFlagBits)
-> ("shaders" ::: Vector ShaderEXT)
-> io ()
cmdBindShadersEXT CommandBuffer
commandBuffer "stages" ::: Vector ShaderStageFlagBits
stages "shaders" ::: Vector ShaderEXT
shaders = IO () -> io ()
forall a. IO a -> io a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> io ())
-> (ContT () IO () -> IO ()) -> ContT () IO () -> io ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ContT () IO () -> IO ()
forall (m :: * -> *) r. Monad m => ContT r m r -> m r
evalContT (ContT () IO () -> io ()) -> ContT () IO () -> io ()
forall a b. (a -> b) -> a -> b
$ do
  let vkCmdBindShadersEXTPtr :: FunPtr
  (Ptr CommandBuffer_T
   -> Word32 -> Ptr ShaderStageFlagBits -> Ptr ShaderEXT -> IO ())
vkCmdBindShadersEXTPtr = DeviceCmds
-> FunPtr
     (Ptr CommandBuffer_T
      -> Word32 -> Ptr ShaderStageFlagBits -> Ptr ShaderEXT -> IO ())
pVkCmdBindShadersEXT (case CommandBuffer
commandBuffer of CommandBuffer{DeviceCmds
deviceCmds :: DeviceCmds
deviceCmds :: CommandBuffer -> DeviceCmds
deviceCmds} -> DeviceCmds
deviceCmds)
  IO () -> ContT () IO ()
forall (m :: * -> *) a. Monad m => m a -> ContT () m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO () -> ContT () IO ()) -> IO () -> ContT () IO ()
forall a b. (a -> b) -> a -> b
$ Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (FunPtr
  (Ptr CommandBuffer_T
   -> Word32 -> Ptr ShaderStageFlagBits -> Ptr ShaderEXT -> IO ())
vkCmdBindShadersEXTPtr FunPtr
  (Ptr CommandBuffer_T
   -> Word32 -> Ptr ShaderStageFlagBits -> Ptr ShaderEXT -> IO ())
-> FunPtr
     (Ptr CommandBuffer_T
      -> Word32 -> Ptr ShaderStageFlagBits -> Ptr ShaderEXT -> IO ())
-> Bool
forall a. Eq a => a -> a -> Bool
/= FunPtr
  (Ptr CommandBuffer_T
   -> Word32 -> Ptr ShaderStageFlagBits -> Ptr ShaderEXT -> IO ())
forall a. FunPtr a
nullFunPtr) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$
    IOException -> IO ()
forall e a. (HasCallStack, Exception e) => e -> IO a
throwIO (IOException -> IO ()) -> IOException -> IO ()
forall a b. (a -> b) -> a -> b
$ Maybe Handle
-> IOErrorType
-> String
-> String
-> Maybe CInt
-> Maybe String
-> IOException
IOError Maybe Handle
forall a. Maybe a
Nothing IOErrorType
InvalidArgument String
"" String
"The function pointer for vkCmdBindShadersEXT is null" Maybe CInt
forall a. Maybe a
Nothing Maybe String
forall a. Maybe a
Nothing
  let vkCmdBindShadersEXT' :: Ptr CommandBuffer_T
-> Word32 -> Ptr ShaderStageFlagBits -> Ptr ShaderEXT -> IO ()
vkCmdBindShadersEXT' = FunPtr
  (Ptr CommandBuffer_T
   -> Word32 -> Ptr ShaderStageFlagBits -> Ptr ShaderEXT -> IO ())
-> Ptr CommandBuffer_T
-> Word32
-> Ptr ShaderStageFlagBits
-> Ptr ShaderEXT
-> IO ()
mkVkCmdBindShadersEXT FunPtr
  (Ptr CommandBuffer_T
   -> Word32 -> Ptr ShaderStageFlagBits -> Ptr ShaderEXT -> IO ())
vkCmdBindShadersEXTPtr
  let pStagesLength :: Int
pStagesLength = ("stages" ::: Vector ShaderStageFlagBits) -> Int
forall a. Vector a -> Int
Data.Vector.length (("stages" ::: Vector ShaderStageFlagBits) -> Int)
-> ("stages" ::: Vector ShaderStageFlagBits) -> Int
forall a b. (a -> b) -> a -> b
$ ("stages" ::: Vector ShaderStageFlagBits
stages)
  let pShadersLength :: Int
pShadersLength = ("shaders" ::: Vector ShaderEXT) -> Int
forall a. Vector a -> Int
Data.Vector.length (("shaders" ::: Vector ShaderEXT) -> Int)
-> ("shaders" ::: Vector ShaderEXT) -> Int
forall a b. (a -> b) -> a -> b
$ ("shaders" ::: Vector ShaderEXT
shaders)
  IO () -> ContT () IO ()
forall (m :: * -> *) a. Monad m => m a -> ContT () m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO () -> ContT () IO ()) -> IO () -> ContT () IO ()
forall a b. (a -> b) -> a -> b
$ Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (Int -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
pShadersLength Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
pStagesLength Bool -> Bool -> Bool
|| Int
pShadersLength Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$
    IOException -> IO ()
forall e a. (HasCallStack, Exception e) => e -> IO a
throwIO (IOException -> IO ()) -> IOException -> IO ()
forall a b. (a -> b) -> a -> b
$ Maybe Handle
-> IOErrorType
-> String
-> String
-> Maybe CInt
-> Maybe String
-> IOException
IOError Maybe Handle
forall a. Maybe a
Nothing IOErrorType
InvalidArgument String
"" String
"pShaders and pStages must have the same length" Maybe CInt
forall a. Maybe a
Nothing Maybe String
forall a. Maybe a
Nothing
  pPStages <- ((Ptr ShaderStageFlagBits -> IO ()) -> IO ())
-> ContT () IO (Ptr ShaderStageFlagBits)
forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((Ptr ShaderStageFlagBits -> IO ()) -> IO ())
 -> ContT () IO (Ptr ShaderStageFlagBits))
-> ((Ptr ShaderStageFlagBits -> IO ()) -> IO ())
-> ContT () IO (Ptr ShaderStageFlagBits)
forall a b. (a -> b) -> a -> b
$ forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes @ShaderStageFlagBits ((("stages" ::: Vector ShaderStageFlagBits) -> Int
forall a. Vector a -> Int
Data.Vector.length ("stages" ::: Vector ShaderStageFlagBits
stages)) Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
4)
  lift $ Data.Vector.imapM_ (\Int
i ShaderStageFlagBits
e -> Ptr ShaderStageFlagBits -> ShaderStageFlagBits -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr ShaderStageFlagBits
pPStages Ptr ShaderStageFlagBits -> Int -> Ptr ShaderStageFlagBits
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` (Int
4 Int -> Int -> Int
forall a. Num a => a -> a -> a
* (Int
i)) :: Ptr ShaderStageFlagBits) (ShaderStageFlagBits
e)) (stages)
  pShaders <- if Data.Vector.null (shaders)
    then pure nullPtr
    else do
      pPShaders <- ContT $ allocaBytes @ShaderEXT (((Data.Vector.length (shaders))) * 8)
      lift $ Data.Vector.imapM_ (\Int
i ShaderEXT
e -> Ptr ShaderEXT -> ShaderEXT -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr ShaderEXT
pPShaders Ptr ShaderEXT -> Int -> Ptr ShaderEXT
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` (Int
8 Int -> Int -> Int
forall a. Num a => a -> a -> a
* (Int
i)) :: Ptr ShaderEXT) (ShaderEXT
e)) ((shaders))
      pure $ pPShaders
  lift $ traceAroundEvent "vkCmdBindShadersEXT" (vkCmdBindShadersEXT'
                                                   (commandBufferHandle (commandBuffer))
                                                   ((fromIntegral pStagesLength :: Word32))
                                                   (pPStages)
                                                   pShaders)
  pure $ ()


-- No documentation found for TopLevel "VK_STRUCTURE_TYPE_SHADER_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT"
pattern $mSTRUCTURE_TYPE_SHADER_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT :: forall {r}. StructureType -> ((# #) -> r) -> ((# #) -> r) -> r
$bSTRUCTURE_TYPE_SHADER_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT :: StructureType
STRUCTURE_TYPE_SHADER_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT = STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO


-- No documentation found for TopLevel "VK_ERROR_INCOMPATIBLE_SHADER_BINARY_EXT"
pattern $mERROR_INCOMPATIBLE_SHADER_BINARY_EXT :: forall {r}. Result -> ((# #) -> r) -> ((# #) -> r) -> r
$bERROR_INCOMPATIBLE_SHADER_BINARY_EXT :: Result
ERROR_INCOMPATIBLE_SHADER_BINARY_EXT = INCOMPATIBLE_SHADER_BINARY_EXT


-- | VkPhysicalDeviceShaderObjectFeaturesEXT - Structure describing whether
-- shader objects can be supported by an implementation
--
-- = Members
--
-- This structure describes the following feature:
--
-- = Description
--
-- If the 'PhysicalDeviceShaderObjectFeaturesEXT' structure is included in
-- the @pNext@ chain of the
-- 'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.PhysicalDeviceFeatures2'
-- structure passed to
-- 'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.getPhysicalDeviceFeatures2',
-- it is filled in to indicate whether each corresponding feature is
-- supported. If the application wishes to use a
-- 'Vulkan.Core10.Handles.Device' with any features described by
-- 'PhysicalDeviceShaderObjectFeaturesEXT', it /must/ add an instance of
-- the structure, with the desired feature members set to
-- 'Vulkan.Core10.FundamentalTypes.TRUE', to the @pNext@ chain of
-- 'Vulkan.Core10.Device.DeviceCreateInfo' when creating the
-- 'Vulkan.Core10.Handles.Device'.
--
-- == Valid Usage (Implicit)
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_shader_object VK_EXT_shader_object>,
-- 'Vulkan.Core10.FundamentalTypes.Bool32',
-- 'Vulkan.Core10.Enums.StructureType.StructureType'
data PhysicalDeviceShaderObjectFeaturesEXT = PhysicalDeviceShaderObjectFeaturesEXT
  { -- | #features-shaderObject# @shaderObject@ indicates whether the
    -- implementation supports
    -- <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#shaders-objects shader objects>.
    PhysicalDeviceShaderObjectFeaturesEXT -> Bool
shaderObject :: Bool }
  deriving (Typeable, PhysicalDeviceShaderObjectFeaturesEXT
-> PhysicalDeviceShaderObjectFeaturesEXT -> Bool
(PhysicalDeviceShaderObjectFeaturesEXT
 -> PhysicalDeviceShaderObjectFeaturesEXT -> Bool)
-> (PhysicalDeviceShaderObjectFeaturesEXT
    -> PhysicalDeviceShaderObjectFeaturesEXT -> Bool)
-> Eq PhysicalDeviceShaderObjectFeaturesEXT
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: PhysicalDeviceShaderObjectFeaturesEXT
-> PhysicalDeviceShaderObjectFeaturesEXT -> Bool
== :: PhysicalDeviceShaderObjectFeaturesEXT
-> PhysicalDeviceShaderObjectFeaturesEXT -> Bool
$c/= :: PhysicalDeviceShaderObjectFeaturesEXT
-> PhysicalDeviceShaderObjectFeaturesEXT -> Bool
/= :: PhysicalDeviceShaderObjectFeaturesEXT
-> PhysicalDeviceShaderObjectFeaturesEXT -> Bool
Eq)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (PhysicalDeviceShaderObjectFeaturesEXT)
#endif
deriving instance Show PhysicalDeviceShaderObjectFeaturesEXT

instance ToCStruct PhysicalDeviceShaderObjectFeaturesEXT where
  withCStruct :: forall b.
PhysicalDeviceShaderObjectFeaturesEXT
-> (Ptr PhysicalDeviceShaderObjectFeaturesEXT -> IO b) -> IO b
withCStruct PhysicalDeviceShaderObjectFeaturesEXT
x Ptr PhysicalDeviceShaderObjectFeaturesEXT -> IO b
f = Int -> (Ptr PhysicalDeviceShaderObjectFeaturesEXT -> IO b) -> IO b
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes Int
24 ((Ptr PhysicalDeviceShaderObjectFeaturesEXT -> IO b) -> IO b)
-> (Ptr PhysicalDeviceShaderObjectFeaturesEXT -> IO b) -> IO b
forall a b. (a -> b) -> a -> b
$ \Ptr PhysicalDeviceShaderObjectFeaturesEXT
p -> Ptr PhysicalDeviceShaderObjectFeaturesEXT
-> PhysicalDeviceShaderObjectFeaturesEXT -> IO b -> IO b
forall b.
Ptr PhysicalDeviceShaderObjectFeaturesEXT
-> PhysicalDeviceShaderObjectFeaturesEXT -> IO b -> IO b
forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b
pokeCStruct Ptr PhysicalDeviceShaderObjectFeaturesEXT
p PhysicalDeviceShaderObjectFeaturesEXT
x (Ptr PhysicalDeviceShaderObjectFeaturesEXT -> IO b
f Ptr PhysicalDeviceShaderObjectFeaturesEXT
p)
  pokeCStruct :: forall b.
Ptr PhysicalDeviceShaderObjectFeaturesEXT
-> PhysicalDeviceShaderObjectFeaturesEXT -> IO b -> IO b
pokeCStruct Ptr PhysicalDeviceShaderObjectFeaturesEXT
p PhysicalDeviceShaderObjectFeaturesEXT{Bool
shaderObject :: PhysicalDeviceShaderObjectFeaturesEXT -> Bool
shaderObject :: Bool
..} IO b
f = do
    Ptr StructureType -> StructureType -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceShaderObjectFeaturesEXT
p Ptr PhysicalDeviceShaderObjectFeaturesEXT
-> Int -> Ptr StructureType
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_OBJECT_FEATURES_EXT)
    Ptr (Ptr ()) -> Ptr () -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceShaderObjectFeaturesEXT
p Ptr PhysicalDeviceShaderObjectFeaturesEXT -> Int -> Ptr (Ptr ())
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
8 :: Ptr (Ptr ()))) (Ptr ()
forall a. Ptr a
nullPtr)
    Ptr Bool32 -> Bool32 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceShaderObjectFeaturesEXT
p Ptr PhysicalDeviceShaderObjectFeaturesEXT -> Int -> Ptr Bool32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr Bool32)) (Bool -> Bool32
boolToBool32 (Bool
shaderObject))
    IO b
f
  cStructSize :: Int
cStructSize = Int
24
  cStructAlignment :: Int
cStructAlignment = Int
8
  pokeZeroCStruct :: forall b. Ptr PhysicalDeviceShaderObjectFeaturesEXT -> IO b -> IO b
pokeZeroCStruct Ptr PhysicalDeviceShaderObjectFeaturesEXT
p IO b
f = do
    Ptr StructureType -> StructureType -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceShaderObjectFeaturesEXT
p Ptr PhysicalDeviceShaderObjectFeaturesEXT
-> Int -> Ptr StructureType
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_OBJECT_FEATURES_EXT)
    Ptr (Ptr ()) -> Ptr () -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceShaderObjectFeaturesEXT
p Ptr PhysicalDeviceShaderObjectFeaturesEXT -> Int -> Ptr (Ptr ())
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
8 :: Ptr (Ptr ()))) (Ptr ()
forall a. Ptr a
nullPtr)
    Ptr Bool32 -> Bool32 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceShaderObjectFeaturesEXT
p Ptr PhysicalDeviceShaderObjectFeaturesEXT -> Int -> Ptr Bool32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr Bool32)) (Bool -> Bool32
boolToBool32 (Bool
forall a. Zero a => a
zero))
    IO b
f

instance FromCStruct PhysicalDeviceShaderObjectFeaturesEXT where
  peekCStruct :: Ptr PhysicalDeviceShaderObjectFeaturesEXT
-> IO PhysicalDeviceShaderObjectFeaturesEXT
peekCStruct Ptr PhysicalDeviceShaderObjectFeaturesEXT
p = do
    shaderObject <- forall a. Storable a => Ptr a -> IO a
peek @Bool32 ((Ptr PhysicalDeviceShaderObjectFeaturesEXT
p Ptr PhysicalDeviceShaderObjectFeaturesEXT -> Int -> Ptr Bool32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr Bool32))
    pure $ PhysicalDeviceShaderObjectFeaturesEXT
             (bool32ToBool shaderObject)

instance Storable PhysicalDeviceShaderObjectFeaturesEXT where
  sizeOf :: PhysicalDeviceShaderObjectFeaturesEXT -> Int
sizeOf ~PhysicalDeviceShaderObjectFeaturesEXT
_ = Int
24
  alignment :: PhysicalDeviceShaderObjectFeaturesEXT -> Int
alignment ~PhysicalDeviceShaderObjectFeaturesEXT
_ = Int
8
  peek :: Ptr PhysicalDeviceShaderObjectFeaturesEXT
-> IO PhysicalDeviceShaderObjectFeaturesEXT
peek = Ptr PhysicalDeviceShaderObjectFeaturesEXT
-> IO PhysicalDeviceShaderObjectFeaturesEXT
forall a. FromCStruct a => Ptr a -> IO a
peekCStruct
  poke :: Ptr PhysicalDeviceShaderObjectFeaturesEXT
-> PhysicalDeviceShaderObjectFeaturesEXT -> IO ()
poke Ptr PhysicalDeviceShaderObjectFeaturesEXT
ptr PhysicalDeviceShaderObjectFeaturesEXT
poked = Ptr PhysicalDeviceShaderObjectFeaturesEXT
-> PhysicalDeviceShaderObjectFeaturesEXT -> IO () -> IO ()
forall b.
Ptr PhysicalDeviceShaderObjectFeaturesEXT
-> PhysicalDeviceShaderObjectFeaturesEXT -> IO b -> IO b
forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b
pokeCStruct Ptr PhysicalDeviceShaderObjectFeaturesEXT
ptr PhysicalDeviceShaderObjectFeaturesEXT
poked (() -> IO ()
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ())

instance Zero PhysicalDeviceShaderObjectFeaturesEXT where
  zero :: PhysicalDeviceShaderObjectFeaturesEXT
zero = Bool -> PhysicalDeviceShaderObjectFeaturesEXT
PhysicalDeviceShaderObjectFeaturesEXT
           Bool
forall a. Zero a => a
zero


-- | VkPhysicalDeviceShaderObjectPropertiesEXT - Structure describing shader
-- object properties supported by an implementation
--
-- = Description
--
-- The purpose and usage of the values of this structure are described in
-- greater detail in
-- <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#shaders-objects-binary-compatibility Binary Shader Compatibility>.
--
-- If the 'PhysicalDeviceShaderObjectPropertiesEXT' structure is included
-- in the @pNext@ chain of the
-- 'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.PhysicalDeviceProperties2'
-- structure passed to
-- 'Vulkan.Core11.Promoted_From_VK_KHR_get_physical_device_properties2.getPhysicalDeviceProperties2',
-- it is filled in with each corresponding implementation-dependent
-- property.
--
-- == Valid Usage (Implicit)
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_shader_object VK_EXT_shader_object>,
-- 'Vulkan.Core10.Enums.StructureType.StructureType'
data PhysicalDeviceShaderObjectPropertiesEXT = PhysicalDeviceShaderObjectPropertiesEXT
  { -- | #limits-shaderBinaryUUID# @shaderBinaryUUID@ is an array of
    -- 'Vulkan.Core10.APIConstants.UUID_SIZE' @uint8_t@ values representing a
    -- universally unique identifier for one or more implementations whose
    -- shader binaries are guaranteed to be compatible with each other.
    PhysicalDeviceShaderObjectPropertiesEXT -> "data" ::: ByteString
shaderBinaryUUID :: ByteString
  , -- | #limits-shaderBinaryVersion# @shaderBinaryVersion@ is an unsigned
    -- integer incremented to represent backwards compatible differences
    -- between implementations with the same @shaderBinaryUUID@.
    PhysicalDeviceShaderObjectPropertiesEXT -> Word32
shaderBinaryVersion :: Word32
  }
  deriving (Typeable)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (PhysicalDeviceShaderObjectPropertiesEXT)
#endif
deriving instance Show PhysicalDeviceShaderObjectPropertiesEXT

instance ToCStruct PhysicalDeviceShaderObjectPropertiesEXT where
  withCStruct :: forall b.
PhysicalDeviceShaderObjectPropertiesEXT
-> (Ptr PhysicalDeviceShaderObjectPropertiesEXT -> IO b) -> IO b
withCStruct PhysicalDeviceShaderObjectPropertiesEXT
x Ptr PhysicalDeviceShaderObjectPropertiesEXT -> IO b
f = Int
-> (Ptr PhysicalDeviceShaderObjectPropertiesEXT -> IO b) -> IO b
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes Int
40 ((Ptr PhysicalDeviceShaderObjectPropertiesEXT -> IO b) -> IO b)
-> (Ptr PhysicalDeviceShaderObjectPropertiesEXT -> IO b) -> IO b
forall a b. (a -> b) -> a -> b
$ \Ptr PhysicalDeviceShaderObjectPropertiesEXT
p -> Ptr PhysicalDeviceShaderObjectPropertiesEXT
-> PhysicalDeviceShaderObjectPropertiesEXT -> IO b -> IO b
forall b.
Ptr PhysicalDeviceShaderObjectPropertiesEXT
-> PhysicalDeviceShaderObjectPropertiesEXT -> IO b -> IO b
forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b
pokeCStruct Ptr PhysicalDeviceShaderObjectPropertiesEXT
p PhysicalDeviceShaderObjectPropertiesEXT
x (Ptr PhysicalDeviceShaderObjectPropertiesEXT -> IO b
f Ptr PhysicalDeviceShaderObjectPropertiesEXT
p)
  pokeCStruct :: forall b.
Ptr PhysicalDeviceShaderObjectPropertiesEXT
-> PhysicalDeviceShaderObjectPropertiesEXT -> IO b -> IO b
pokeCStruct Ptr PhysicalDeviceShaderObjectPropertiesEXT
p PhysicalDeviceShaderObjectPropertiesEXT{Word32
"data" ::: ByteString
shaderBinaryUUID :: PhysicalDeviceShaderObjectPropertiesEXT -> "data" ::: ByteString
shaderBinaryVersion :: PhysicalDeviceShaderObjectPropertiesEXT -> Word32
shaderBinaryUUID :: "data" ::: ByteString
shaderBinaryVersion :: Word32
..} IO b
f = do
    Ptr StructureType -> StructureType -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceShaderObjectPropertiesEXT
p Ptr PhysicalDeviceShaderObjectPropertiesEXT
-> Int -> Ptr StructureType
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_OBJECT_PROPERTIES_EXT)
    Ptr (Ptr ()) -> Ptr () -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceShaderObjectPropertiesEXT
p Ptr PhysicalDeviceShaderObjectPropertiesEXT -> Int -> Ptr (Ptr ())
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
8 :: Ptr (Ptr ()))) (Ptr ()
forall a. Ptr a
nullPtr)
    Ptr (FixedArray UUID_SIZE Word8)
-> ("data" ::: ByteString) -> IO ()
forall (n :: Nat).
KnownNat n =>
Ptr (FixedArray n Word8) -> ("data" ::: ByteString) -> IO ()
pokeFixedLengthByteString ((Ptr PhysicalDeviceShaderObjectPropertiesEXT
p Ptr PhysicalDeviceShaderObjectPropertiesEXT
-> Int -> Ptr (FixedArray UUID_SIZE Word8)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr (FixedArray UUID_SIZE Word8))) ("data" ::: ByteString
shaderBinaryUUID)
    Ptr Word32 -> Word32 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceShaderObjectPropertiesEXT
p Ptr PhysicalDeviceShaderObjectPropertiesEXT -> Int -> Ptr Word32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
32 :: Ptr Word32)) (Word32
shaderBinaryVersion)
    IO b
f
  cStructSize :: Int
cStructSize = Int
40
  cStructAlignment :: Int
cStructAlignment = Int
8
  pokeZeroCStruct :: forall b.
Ptr PhysicalDeviceShaderObjectPropertiesEXT -> IO b -> IO b
pokeZeroCStruct Ptr PhysicalDeviceShaderObjectPropertiesEXT
p IO b
f = do
    Ptr StructureType -> StructureType -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceShaderObjectPropertiesEXT
p Ptr PhysicalDeviceShaderObjectPropertiesEXT
-> Int -> Ptr StructureType
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_OBJECT_PROPERTIES_EXT)
    Ptr (Ptr ()) -> Ptr () -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceShaderObjectPropertiesEXT
p Ptr PhysicalDeviceShaderObjectPropertiesEXT -> Int -> Ptr (Ptr ())
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
8 :: Ptr (Ptr ()))) (Ptr ()
forall a. Ptr a
nullPtr)
    Ptr (FixedArray UUID_SIZE Word8)
-> ("data" ::: ByteString) -> IO ()
forall (n :: Nat).
KnownNat n =>
Ptr (FixedArray n Word8) -> ("data" ::: ByteString) -> IO ()
pokeFixedLengthByteString ((Ptr PhysicalDeviceShaderObjectPropertiesEXT
p Ptr PhysicalDeviceShaderObjectPropertiesEXT
-> Int -> Ptr (FixedArray UUID_SIZE Word8)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr (FixedArray UUID_SIZE Word8))) ("data" ::: ByteString
forall a. Monoid a => a
mempty)
    Ptr Word32 -> Word32 -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr PhysicalDeviceShaderObjectPropertiesEXT
p Ptr PhysicalDeviceShaderObjectPropertiesEXT -> Int -> Ptr Word32
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
32 :: Ptr Word32)) (Word32
forall a. Zero a => a
zero)
    IO b
f

instance FromCStruct PhysicalDeviceShaderObjectPropertiesEXT where
  peekCStruct :: Ptr PhysicalDeviceShaderObjectPropertiesEXT
-> IO PhysicalDeviceShaderObjectPropertiesEXT
peekCStruct Ptr PhysicalDeviceShaderObjectPropertiesEXT
p = do
    shaderBinaryUUID <- Ptr (FixedArray UUID_SIZE Word8) -> IO ("data" ::: ByteString)
forall (n :: Nat).
KnownNat n =>
Ptr (FixedArray n Word8) -> IO ("data" ::: ByteString)
peekByteStringFromSizedVectorPtr ((Ptr PhysicalDeviceShaderObjectPropertiesEXT
p Ptr PhysicalDeviceShaderObjectPropertiesEXT
-> Int -> Ptr (FixedArray UUID_SIZE Word8)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
16 :: Ptr (FixedArray UUID_SIZE Word8)))
    shaderBinaryVersion <- peek @Word32 ((p `plusPtr` 32 :: Ptr Word32))
    pure $ PhysicalDeviceShaderObjectPropertiesEXT
             shaderBinaryUUID shaderBinaryVersion

instance Storable PhysicalDeviceShaderObjectPropertiesEXT where
  sizeOf :: PhysicalDeviceShaderObjectPropertiesEXT -> Int
sizeOf ~PhysicalDeviceShaderObjectPropertiesEXT
_ = Int
40
  alignment :: PhysicalDeviceShaderObjectPropertiesEXT -> Int
alignment ~PhysicalDeviceShaderObjectPropertiesEXT
_ = Int
8
  peek :: Ptr PhysicalDeviceShaderObjectPropertiesEXT
-> IO PhysicalDeviceShaderObjectPropertiesEXT
peek = Ptr PhysicalDeviceShaderObjectPropertiesEXT
-> IO PhysicalDeviceShaderObjectPropertiesEXT
forall a. FromCStruct a => Ptr a -> IO a
peekCStruct
  poke :: Ptr PhysicalDeviceShaderObjectPropertiesEXT
-> PhysicalDeviceShaderObjectPropertiesEXT -> IO ()
poke Ptr PhysicalDeviceShaderObjectPropertiesEXT
ptr PhysicalDeviceShaderObjectPropertiesEXT
poked = Ptr PhysicalDeviceShaderObjectPropertiesEXT
-> PhysicalDeviceShaderObjectPropertiesEXT -> IO () -> IO ()
forall b.
Ptr PhysicalDeviceShaderObjectPropertiesEXT
-> PhysicalDeviceShaderObjectPropertiesEXT -> IO b -> IO b
forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b
pokeCStruct Ptr PhysicalDeviceShaderObjectPropertiesEXT
ptr PhysicalDeviceShaderObjectPropertiesEXT
poked (() -> IO ()
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ())

instance Zero PhysicalDeviceShaderObjectPropertiesEXT where
  zero :: PhysicalDeviceShaderObjectPropertiesEXT
zero = ("data" ::: ByteString)
-> Word32 -> PhysicalDeviceShaderObjectPropertiesEXT
PhysicalDeviceShaderObjectPropertiesEXT
           "data" ::: ByteString
forall a. Monoid a => a
mempty
           Word32
forall a. Zero a => a
zero


-- | VkShaderCreateInfoEXT - Structure specifying parameters of a newly
-- created shader
--
-- = Description
--
-- When specifying descriptor heap mappings, only mappings corresponding to
-- bindings that are actually present in the SPIR-V shader affect
-- compilation. Mappings are ignored when @codeType@ is
-- 'SHADER_CODE_TYPE_BINARY_EXT'. The resulting compiled binary from two
-- different SPIR-V shaders which would have identical bit patterns /must/
-- remain identical even if the mapping entries vary in any of the
-- following ways:
--
-- -   Different numbers of unused mapping structures
--
-- -   Different binding counts for unused bindings
--
-- -   Unused parameters in mapping structures (e.g. sampler offsets)
--
-- -   Ignored parameters in mapping structures
--
-- -   Different order of mapping structures, used or unused
--
-- Calculating the same offset in a mapping via different parameter values
-- is not guaranteed to provide identical results.
--
-- == Valid Usage
--
-- -   #VUID-VkShaderCreateInfoEXT-codeSize-08735# If @codeType@ is
--     'SHADER_CODE_TYPE_SPIRV_EXT', @codeSize@ /must/ be a multiple of 4
--
-- -   #VUID-VkShaderCreateInfoEXT-pCode-08736# If @codeType@ is
--     'SHADER_CODE_TYPE_SPIRV_EXT', @pCode@ /must/ point to valid SPIR-V
--     code, formatted and packed as described by the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#spirv-spec Khronos SPIR-V Specification>
--
-- -   #VUID-VkShaderCreateInfoEXT-pCode-08737# If @codeType@ is
--     'SHADER_CODE_TYPE_SPIRV_EXT', @pCode@ /must/ adhere to the
--     validation rules described by the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#spirvenv-module-validation Validation Rules within a Module>
--     section of the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#spirvenv-capabilities SPIR-V Environment>
--     appendix
--
-- -   #VUID-VkShaderCreateInfoEXT-pCode-08738# If @codeType@ is
--     'SHADER_CODE_TYPE_SPIRV_EXT', @pCode@ /must/ declare the @Shader@
--     capability for SPIR-V code
--
-- -   #VUID-VkShaderCreateInfoEXT-pCode-08739# If @codeType@ is
--     'SHADER_CODE_TYPE_SPIRV_EXT', @pCode@ /must/ not declare any
--     capability that is not supported by the API, as described by the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#spirvenv-module-validation Capabilities>
--     section of the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#spirvenv-capabilities SPIR-V Environment>
--     appendix
--
-- -   #VUID-VkShaderCreateInfoEXT-pCode-08740# If @codeType@ is
--     'SHADER_CODE_TYPE_SPIRV_EXT', and @pCode@ declares any of the
--     capabilities listed in the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#spirvenv-capabilities-table SPIR-V Environment>
--     appendix, one of the corresponding requirements /must/ be satisfied
--
-- -   #VUID-VkShaderCreateInfoEXT-pCode-08741# If @codeType@ is
--     'SHADER_CODE_TYPE_SPIRV_EXT', @pCode@ /must/ not declare any SPIR-V
--     extension that is not supported by the API, as described by the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#spirvenv-extensions Extension>
--     section of the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#spirvenv-capabilities SPIR-V Environment>
--     appendix
--
-- -   #VUID-VkShaderCreateInfoEXT-pCode-08742# If @codeType@ is
--     'SHADER_CODE_TYPE_SPIRV_EXT', and @pCode@ declares any of the SPIR-V
--     extensions listed in the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#spirvenv-extensions-table SPIR-V Environment>
--     appendix, one of the corresponding requirements /must/ be satisfied
--
-- -   #VUID-VkShaderCreateInfoEXT-descriptorHeap-11314# If the
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#features-descriptorHeap descriptorHeap>
--     feature is not enabled,
--     'Vulkan.Extensions.VK_EXT_descriptor_heap.ShaderDescriptorSetAndBindingMappingInfoEXT'::@mappingCount@
--     /must/ be 0
--
-- -   #VUID-VkShaderCreateInfoEXT-pNext-11315# If the @pNext@ chain
--     specifies a
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#descriptorheaps-bindings descriptor mapping>
--     using
--     'Vulkan.Extensions.VK_EXT_descriptor_heap.DESCRIPTOR_MAPPING_SOURCE_PUSH_DATA_EXT',
--     'Vulkan.Extensions.VK_EXT_descriptor_heap.DESCRIPTOR_MAPPING_SOURCE_SHADER_RECORD_DATA_EXT',
--     or
--     'Vulkan.Extensions.VK_EXT_descriptor_heap.DESCRIPTOR_MAPPING_SOURCE_RESOURCE_HEAP_DATA_EXT',
--     the mapped resource in the shader /must/ be a variable with a
--     structure type decorated with @Block@ in the @Uniform@ @Storage@
--     @Class@
--
-- -   #VUID-VkShaderCreateInfoEXT-pNext-11316# If the @pNext@ chain
--     specifies a
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#descriptorheaps-bindings descriptor mapping>
--     using
--     'Vulkan.Extensions.VK_EXT_descriptor_heap.DESCRIPTOR_MAPPING_SOURCE_PUSH_DATA_EXT',
--     the mapped structure /must/ not be larger than the sum of
--     @pushDataOffset@ used in the mapping and
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#limits-maxPushDataSize maxPushDataSize>
--
-- -   #VUID-VkShaderCreateInfoEXT-pNext-11317# If the @pNext@ chain
--     specifies a
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#descriptorheaps-bindings descriptor mapping>
--     using
--     'Vulkan.Extensions.VK_EXT_descriptor_heap.DESCRIPTOR_MAPPING_SOURCE_SHADER_RECORD_DATA_EXT',
--     the sum of mapped structure size and @shaderRecordDataOffset@ used
--     in the mapping /must/ not be larger than
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#limits-maxShaderGroupStride maxShaderGroupStride>
--
-- -   #VUID-VkShaderCreateInfoEXT-pNext-11318# If the @pNext@ chain
--     specifies a
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#descriptorheaps-bindings descriptor mapping>
--     using
--     'Vulkan.Extensions.VK_EXT_descriptor_heap.DESCRIPTOR_MAPPING_SOURCE_SHADER_RECORD_ADDRESS_EXT'
--     or
--     'Vulkan.Extensions.VK_EXT_descriptor_heap.DESCRIPTOR_MAPPING_SOURCE_PUSH_ADDRESS_EXT',
--     the mapped resource in the shader /must/ be one of:
--
--     -   A variable with a structure type decorated with @Block@ in the
--         @Uniform@ @Storage@ @Class@
--
--     -   A variable with a structure type decorated with @BufferBlock@ in
--         the @Uniform@ @Storage@ @Class@
--
--     -   A variable with a structure type decorated with @Block@ in the
--         @StorageBuffer@ @Storage@ @Class@
--
--     -   A @OpTypeAccelerationStructureKHR@ variable
--
--     -   A @OpTypeAccelerationStructureNV@ variable
--
-- -   #VUID-VkShaderCreateInfoEXT-pNext-11378# If the @pNext@ chain
--     specifies a
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#descriptorheaps-bindings descriptor mapping>
--     using
--     'Vulkan.Extensions.VK_EXT_descriptor_heap.DESCRIPTOR_MAPPING_SOURCE_PUSH_ADDRESS_EXT',
--     'Vulkan.Extensions.VK_EXT_descriptor_heap.DESCRIPTOR_MAPPING_SOURCE_SHADER_RECORD_ADDRESS_EXT',
--     or
--     'Vulkan.Extensions.VK_EXT_descriptor_heap.DESCRIPTOR_MAPPING_SOURCE_INDIRECT_ADDRESS_EXT',
--     the @OpArrayLength@ or @OpUntypedArrayLengthKHR@ instruction /must/
--     not be used on that resource
--
-- -   #VUID-VkShaderCreateInfoEXT-pNext-11399# If the @pNext@ chain
--     specifies a
--     <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#descriptorheaps-bindings descriptor mapping>
--     using
--     'Vulkan.Extensions.VK_EXT_descriptor_heap.DESCRIPTOR_MAPPING_SOURCE_HEAP_WITH_CONSTANT_OFFSET_EXT',
--     'Vulkan.Extensions.VK_EXT_descriptor_heap.DESCRIPTOR_MAPPING_SOURCE_HEAP_WITH_PUSH_INDEX_EXT',
--     'Vulkan.Extensions.VK_EXT_descriptor_heap.DESCRIPTOR_MAPPING_SOURCE_HEAP_WITH_SHADER_RECORD_INDEX_EXT',
--     'Vulkan.Extensions.VK_EXT_descriptor_heap.DESCRIPTOR_MAPPING_SOURCE_HEAP_WITH_INDIRECT_INDEX_EXT',
--     or
--     'Vulkan.Extensions.VK_EXT_descriptor_heap.DESCRIPTOR_MAPPING_SOURCE_HEAP_WITH_INDIRECT_INDEX_ARRAY_EXT',
--     and the mapped resource declaration is an array, the
--     @pEmbeddedSampler@ member of the corresponding mapping structure
--     /must/ be @NULL@
--
-- -   #VUID-VkShaderCreateInfoEXT-flags-08412# If @stage@ is not
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TASK_BIT_EXT',
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_MESH_BIT_EXT',
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_VERTEX_BIT',
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TESSELLATION_CONTROL_BIT',
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TESSELLATION_EVALUATION_BIT',
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_GEOMETRY_BIT',
--     or
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_FRAGMENT_BIT',
--     @flags@ /must/ not include 'SHADER_CREATE_LINK_STAGE_BIT_EXT'
--
-- -   #VUID-VkShaderCreateInfoEXT-flags-08486# If @stage@ is not
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_FRAGMENT_BIT',
--     @flags@ /must/ not include
--     'SHADER_CREATE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_EXT'
--
-- -   #VUID-VkShaderCreateInfoEXT-flags-08487# If the
--     <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#features-attachmentFragmentShadingRate attachmentFragmentShadingRate>
--     feature is not enabled, @flags@ /must/ not include
--     'SHADER_CREATE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_EXT'
--
-- -   #VUID-VkShaderCreateInfoEXT-flags-08488# If @stage@ is not
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_FRAGMENT_BIT',
--     @flags@ /must/ not include
--     'SHADER_CREATE_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT'
--
-- -   #VUID-VkShaderCreateInfoEXT-flags-08489# If the
--     <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#features-fragmentDensityMap fragmentDensityMap>
--     feature is not enabled, @flags@ /must/ not include
--     'SHADER_CREATE_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT'
--
-- -   #VUID-VkShaderCreateInfoEXT-flags-09404# If @flags@ includes
--     'SHADER_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT', the
--     <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#features-subgroupSizeControl subgroupSizeControl>
--     feature /must/ be enabled
--
-- -   #VUID-VkShaderCreateInfoEXT-flags-09405# If @flags@ includes
--     'SHADER_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT', the
--     <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#features-computeFullSubgroups computeFullSubgroups>
--     feature /must/ be enabled
--
-- -   #VUID-VkShaderCreateInfoEXT-flags-11005# If @flags@ includes
--     'SHADER_CREATE_INDIRECT_BINDABLE_BIT_EXT', then the
--     <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#features-deviceGeneratedCommands ::deviceGeneratedCommands>
--     feature /must/ be enabled
--
-- -   #VUID-VkShaderCreateInfoEXT-flags-11006# If @flags@ includes
--     'SHADER_CREATE_INDIRECT_BINDABLE_BIT_EXT', then the identified entry
--     point /must/ not specify @Xfb@ execution mode
--
-- -   #VUID-VkShaderCreateInfoEXT-flags-08992# If @flags@ includes
--     'SHADER_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT', @stage@ /must/ be
--     one of
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_MESH_BIT_EXT',
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TASK_BIT_EXT',
--     or
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_COMPUTE_BIT'
--
-- -   #VUID-VkShaderCreateInfoEXT-flags-08485# If @stage@ is not
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_COMPUTE_BIT',
--     @flags@ /must/ not include 'SHADER_CREATE_DISPATCH_BASE_BIT_EXT'
--
-- -   #VUID-VkShaderCreateInfoEXT-flags-08414# If @stage@ is not
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_MESH_BIT_EXT',
--     @flags@ /must/ not include 'SHADER_CREATE_NO_TASK_SHADER_BIT_EXT'
--
-- -   #VUID-VkShaderCreateInfoEXT-flags-08416# If @flags@ includes both
--     'SHADER_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT' and
--     'SHADER_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT', the local workgroup
--     size in the X dimension of the shader /must/ be a multiple of
--     <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#limits-maxSubgroupSize maxSubgroupSize>
--
-- -   #VUID-VkShaderCreateInfoEXT-flags-08417# If @flags@ includes
--     'SHADER_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT' but not
--     'SHADER_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT' and no
--     'ShaderRequiredSubgroupSizeCreateInfoEXT' structure is included in
--     the @pNext@ chain, the local workgroup size in the X dimension of
--     the shader /must/ be a multiple of
--     <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#limits-subgroupSize subgroupSize>
--
-- -   #VUID-VkShaderCreateInfoEXT-stage-08418# @stage@ /must/ not be
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_ALL_GRAPHICS'
--     or 'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_ALL'
--
-- -   #VUID-VkShaderCreateInfoEXT-stage-08419# If the
--     <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#features-tessellationShader tessellationShader>
--     feature is not enabled, @stage@ /must/ not be
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TESSELLATION_CONTROL_BIT'
--     or
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TESSELLATION_EVALUATION_BIT'
--
-- -   #VUID-VkShaderCreateInfoEXT-stage-08420# If the
--     <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#features-geometryShader geometryShader>
--     feature is not enabled, @stage@ /must/ not be
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_GEOMETRY_BIT'
--
-- -   #VUID-VkShaderCreateInfoEXT-stage-08421# If the
--     <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#features-taskShader taskShader>
--     feature is not enabled, @stage@ /must/ not be
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TASK_BIT_EXT'
--
-- -   #VUID-VkShaderCreateInfoEXT-stage-08422# If the
--     <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#features-meshShader meshShader>
--     feature is not enabled, @stage@ /must/ not be
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_MESH_BIT_EXT'
--
-- -   #VUID-VkShaderCreateInfoEXT-stage-08425# @stage@ /must/ not be
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_SUBPASS_SHADING_BIT_HUAWEI'
--
-- -   #VUID-VkShaderCreateInfoEXT-stage-08426# @stage@ /must/ not be
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_CLUSTER_CULLING_BIT_HUAWEI'
--
-- -   #VUID-VkShaderCreateInfoEXT-nextStage-08427# If @stage@ is
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_VERTEX_BIT',
--     @nextStage@ /must/ not include any bits other than
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TESSELLATION_CONTROL_BIT',
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_GEOMETRY_BIT',
--     and
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_FRAGMENT_BIT'
--
-- -   #VUID-VkShaderCreateInfoEXT-nextStage-08428# If the
--     <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#features-tessellationShader tessellationShader>
--     feature is not enabled, @nextStage@ /must/ not include
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TESSELLATION_CONTROL_BIT'
--     or
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TESSELLATION_EVALUATION_BIT'
--
-- -   #VUID-VkShaderCreateInfoEXT-nextStage-08429# If the
--     <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#features-geometryShader geometryShader>
--     feature is not enabled, @nextStage@ /must/ not include
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_GEOMETRY_BIT'
--
-- -   #VUID-VkShaderCreateInfoEXT-nextStage-08430# If @stage@ is
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TESSELLATION_CONTROL_BIT',
--     @nextStage@ /must/ not include any bits other than
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TESSELLATION_EVALUATION_BIT'
--
-- -   #VUID-VkShaderCreateInfoEXT-nextStage-08431# If @stage@ is
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TESSELLATION_EVALUATION_BIT',
--     @nextStage@ /must/ not include any bits other than
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_GEOMETRY_BIT'
--     and
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_FRAGMENT_BIT'
--
-- -   #VUID-VkShaderCreateInfoEXT-nextStage-08433# If @stage@ is
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_GEOMETRY_BIT',
--     @nextStage@ /must/ not include any bits other than
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_FRAGMENT_BIT'
--
-- -   #VUID-VkShaderCreateInfoEXT-nextStage-08434# If @stage@ is
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_FRAGMENT_BIT'
--     or
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_COMPUTE_BIT',
--     @nextStage@ /must/ be 0
--
-- -   #VUID-VkShaderCreateInfoEXT-nextStage-08435# If @stage@ is
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TASK_BIT_EXT',
--     @nextStage@ /must/ not include any bits other than
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_MESH_BIT_EXT'
--
-- -   #VUID-VkShaderCreateInfoEXT-nextStage-08436# If @stage@ is
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_MESH_BIT_EXT',
--     @nextStage@ /must/ not include any bits other than
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_FRAGMENT_BIT'
--
-- -   #VUID-VkShaderCreateInfoEXT-pName-08440# If @codeType@ is
--     'SHADER_CODE_TYPE_SPIRV_EXT', @pName@ /must/ be the name of an
--     @OpEntryPoint@ in @pCode@ with an execution model that matches
--     @stage@
--
-- -   #VUID-VkShaderCreateInfoEXT-pCode-08492# If @codeType@ is
--     'SHADER_CODE_TYPE_BINARY_EXT', @pCode@ /must/ be aligned to @16@
--     bytes
--
-- -   #VUID-VkShaderCreateInfoEXT-pCode-08493# If @codeType@ is
--     'SHADER_CODE_TYPE_SPIRV_EXT', @pCode@ /must/ be aligned to @4@ bytes
--
-- -   #VUID-VkShaderCreateInfoEXT-pCode-08448# If @codeType@ is
--     'SHADER_CODE_TYPE_SPIRV_EXT', and the identified entry point
--     includes any variable in its interface that is declared with the
--     @ClipDistance@ @BuiltIn@ decoration, that variable /must/ not have
--     an array size greater than
--     'Vulkan.Core10.DeviceInitialization.PhysicalDeviceLimits'::@maxClipDistances@
--
-- -   #VUID-VkShaderCreateInfoEXT-pCode-08449# If @codeType@ is
--     'SHADER_CODE_TYPE_SPIRV_EXT', and the identified entry point
--     includes any variable in its interface that is declared with the
--     @CullDistance@ @BuiltIn@ decoration, that variable /must/ not have
--     an array size greater than
--     'Vulkan.Core10.DeviceInitialization.PhysicalDeviceLimits'::@maxCullDistances@
--
-- -   #VUID-VkShaderCreateInfoEXT-pCode-08450# If @codeType@ is
--     'SHADER_CODE_TYPE_SPIRV_EXT', and the identified entry point
--     includes variables in its interface that are declared with the
--     @ClipDistance@ @BuiltIn@ decoration and variables in its interface
--     that are declared with the @CullDistance@ @BuiltIn@ decoration,
--     those variables /must/ not have array sizes which sum to more than
--     'Vulkan.Core10.DeviceInitialization.PhysicalDeviceLimits'::@maxCombinedClipAndCullDistances@
--
-- -   #VUID-VkShaderCreateInfoEXT-pCode-08451# If @codeType@ is
--     'SHADER_CODE_TYPE_SPIRV_EXT', and the identified entry point
--     includes any variable in its interface that is declared with the
--     'Vulkan.Core10.FundamentalTypes.SampleMask' @BuiltIn@ decoration,
--     that variable /must/ not have an array size greater than
--     'Vulkan.Core10.DeviceInitialization.PhysicalDeviceLimits'::@maxSampleMaskWords@
--
-- -   #VUID-VkShaderCreateInfoEXT-pCode-08453# If @codeType@ is
--     'SHADER_CODE_TYPE_SPIRV_EXT', and @stage@ is
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TESSELLATION_CONTROL_BIT'
--     or
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TESSELLATION_EVALUATION_BIT',
--     and the identified entry point has an @OpExecutionMode@ instruction
--     specifying a patch size with @OutputVertices@, the patch size /must/
--     be greater than @0@ and less than or equal to
--     'Vulkan.Core10.DeviceInitialization.PhysicalDeviceLimits'::@maxTessellationPatchSize@
--
-- -   #VUID-VkShaderCreateInfoEXT-pCode-08454# If @codeType@ is
--     'SHADER_CODE_TYPE_SPIRV_EXT', and @stage@ is
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_GEOMETRY_BIT',
--     the identified entry point /must/ have an @OpExecutionMode@
--     instruction specifying a maximum output vertex count that is greater
--     than @0@ and less than or equal to
--     'Vulkan.Core10.DeviceInitialization.PhysicalDeviceLimits'::@maxGeometryOutputVertices@
--
-- -   #VUID-VkShaderCreateInfoEXT-pCode-08455# If @codeType@ is
--     'SHADER_CODE_TYPE_SPIRV_EXT', and @stage@ is
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_GEOMETRY_BIT',
--     the identified entry point /must/ have an @OpExecutionMode@
--     instruction specifying an invocation count that is greater than @0@
--     and less than or equal to
--     'Vulkan.Core10.DeviceInitialization.PhysicalDeviceLimits'::@maxGeometryShaderInvocations@
--
-- -   #VUID-VkShaderCreateInfoEXT-pCode-08456# If @codeType@ is
--     'SHADER_CODE_TYPE_SPIRV_EXT', and @stage@ is a
--     <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#pipelines-graphics-subsets-pre-rasterization pre-rasterization shader stage>,
--     and the identified entry point writes to @Layer@ for any primitive,
--     it /must/ write the same value to @Layer@ for all vertices of a
--     given primitive
--
-- -   #VUID-VkShaderCreateInfoEXT-pCode-08457# If @codeType@ is
--     'SHADER_CODE_TYPE_SPIRV_EXT', and @stage@ is a
--     <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#pipelines-graphics-subsets-pre-rasterization pre-rasterization shader stage>,
--     and the identified entry point writes to @ViewportIndex@ for any
--     primitive, it /must/ write the same value to @ViewportIndex@ for all
--     vertices of a given primitive
--
-- -   #VUID-VkShaderCreateInfoEXT-pCode-08459# If @codeType@ is
--     'SHADER_CODE_TYPE_SPIRV_EXT', and @stage@ is
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_FRAGMENT_BIT',
--     and the identified entry point writes to @FragDepth@ in any
--     execution path, all execution paths that are not exclusive to helper
--     invocations /must/ either discard the fragment, or write or
--     initialize the value of @FragDepth@
--
-- -   #VUID-VkShaderCreateInfoEXT-pCode-08460# If @codeType@ is
--     'SHADER_CODE_TYPE_SPIRV_EXT', the shader code in @pCode@ /must/ be
--     valid as described by the
--     <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#spirv-spec Khronos SPIR-V Specification>
--     after applying the specializations provided in
--     @pSpecializationInfo@, if any, and then converting all
--     specialization constants into fixed constants
--
-- -   #VUID-VkShaderCreateInfoEXT-codeType-08872# If @codeType@ is
--     'SHADER_CODE_TYPE_SPIRV_EXT', and @stage@ is
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TESSELLATION_EVALUATION_BIT',
--     @pCode@ /must/ contain an @OpExecutionMode@ instruction specifying
--     the type of subdivision
--
-- -   #VUID-VkShaderCreateInfoEXT-codeType-12226# If @codeType@ is
--     'SHADER_CODE_TYPE_SPIRV_EXT', and @stage@ is
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.SHADER_STAGE_TESSELLATION_CONTROL_BIT',
--     @pCode@ /must/ contain an @OpExecutionMode@ instruction specifying
--     the output patch size
--
-- -   #VUID-VkShaderCreateInfoEXT-pPushConstantRanges-10063# Any two
--     elements of @pPushConstantRanges@ /must/ not include the same stage
--     in @stageFlags@
--
-- -   #VUID-VkShaderCreateInfoEXT-codeType-10064# If @codeType@ is
--     'SHADER_CODE_TYPE_SPIRV_EXT', @flags@ does not include
--     'SHADER_CREATE_DESCRIPTOR_HEAP_BIT_EXT' and if a push constant block
--     is declared in a shader, then an element of
--     @pPushConstantRanges->stageFlags@ /must/ match @stage@
--
-- -   #VUID-VkShaderCreateInfoEXT-codeType-10065# If @codeType@ is
--     'SHADER_CODE_TYPE_SPIRV_EXT', @flags@ does not include
--     'SHADER_CREATE_DESCRIPTOR_HEAP_BIT_EXT' and if a push constant block
--     is declared in a shader, the block must be contained inside the
--     element of @pPushConstantRanges@ that matches the stage
--
-- -   #VUID-VkShaderCreateInfoEXT-codeType-10383# If @codeType@ is
--     'SHADER_CODE_TYPE_SPIRV_EXT', @flags@ does not include
--     'SHADER_CREATE_DESCRIPTOR_HEAP_BIT_EXT' and a
--     <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#interfaces-resources resource variable>
--     is declared in a shader, the corresponding descriptor set in
--     @pSetLayouts@ /must/ match the shader stage
--
-- -   #VUID-VkShaderCreateInfoEXT-codeType-10384# If @codeType@ is
--     'SHADER_CODE_TYPE_SPIRV_EXT', @flags@ does not include
--     'SHADER_CREATE_DESCRIPTOR_HEAP_BIT_EXT' and a
--     <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#interfaces-resources resource variable>
--     is declared in a shader, and the descriptor type is not
--     'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_MUTABLE_EXT',
--     the corresponding descriptor set in @pSetLayouts@ /must/ match the
--     descriptor type
--
-- -   #VUID-VkShaderCreateInfoEXT-codeType-10385# If @codeType@ is
--     'SHADER_CODE_TYPE_SPIRV_EXT', @flags@ does not include
--     'SHADER_CREATE_DESCRIPTOR_HEAP_BIT_EXT' and a
--     <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#interfaces-resources resource variable>
--     is declared in a shader as an array, the corresponding descriptor
--     set in @pSetLayouts@ /must/ match the descriptor count
--
-- -   #VUID-VkShaderCreateInfoEXT-codeType-10386# If @codeType@ is
--     'SHADER_CODE_TYPE_SPIRV_EXT', @flags@ does not include
--     'SHADER_CREATE_DESCRIPTOR_HEAP_BIT_EXT' and a
--     <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#interfaces-resources resource variable>
--     is declared in a shader as an array of descriptors, then the
--     descriptor type of that variable /must/ not be
--     'Vulkan.Core10.Enums.DescriptorType.DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK'
--
-- -   #VUID-VkShaderCreateInfoEXT-flags-11758# If
--     <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#features-shader64BitIndexing shader64BitIndexing>
--     feature is not enabled, @flags@ /must/ not contain
--     'SHADER_CREATE_64_BIT_INDEXING_BIT_EXT'
--
-- -   #VUID-VkShaderCreateInfoEXT-setLayoutCount-12257# @setLayoutCount@
--     /must/ be less than or equal to
--     'Vulkan.Core10.DeviceInitialization.PhysicalDeviceLimits'::@maxBoundDescriptorSets@
--
-- -   #VUID-VkShaderCreateInfoEXT-flags-11290# If @flags@ includes
--     'SHADER_CREATE_DESCRIPTOR_HEAP_BIT_EXT', @setLayoutCount@ /must/ be
--     0
--
-- -   #VUID-VkShaderCreateInfoEXT-flags-11291# If @flags@ includes
--     'SHADER_CREATE_DESCRIPTOR_HEAP_BIT_EXT', @pSetLayouts@ /must/ be
--     @NULL@
--
-- -   #VUID-VkShaderCreateInfoEXT-flags-11370# If @flags@ includes
--     'SHADER_CREATE_DESCRIPTOR_HEAP_BIT_EXT', @pushConstantRangeCount@
--     /must/ be 0
--
-- -   #VUID-VkShaderCreateInfoEXT-flags-11371# If @flags@ includes
--     'SHADER_CREATE_DESCRIPTOR_HEAP_BIT_EXT', @pPushConstantRanges@
--     /must/ be @NULL@
--
-- -   #VUID-VkShaderCreateInfoEXT-flags-11292# If @flags@ includes
--     'SHADER_CREATE_DESCRIPTOR_HEAP_BIT_EXT', and @codeType@ is
--     'SHADER_CODE_TYPE_SPIRV_EXT', all shader variables in the
--     <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#interfaces-resources shader resource interface>
--     with a 'Vulkan.Core10.Handles.DescriptorSet' and @Binding@
--     decoration /must/ have a mapping declared in
--     'Vulkan.Extensions.VK_EXT_descriptor_heap.ShaderDescriptorSetAndBindingMappingInfoEXT'::pMappings
--
-- == Valid Usage (Implicit)
--
-- -   #VUID-VkShaderCreateInfoEXT-sType-sType# @sType@ /must/ be
--     'Vulkan.Core10.Enums.StructureType.STRUCTURE_TYPE_SHADER_CREATE_INFO_EXT'
--
-- -   #VUID-VkShaderCreateInfoEXT-pNext-pNext# Each @pNext@ member of any
--     structure (including this one) in the @pNext@ chain /must/ be either
--     @NULL@ or a pointer to a valid instance of
--     'Vulkan.Extensions.VK_EXT_custom_resolve.CustomResolveCreateInfoEXT',
--     'Vulkan.Core13.Promoted_From_VK_EXT_subgroup_size_control.PipelineShaderStageRequiredSubgroupSizeCreateInfo',
--     'Vulkan.Extensions.VK_EXT_descriptor_heap.ShaderDescriptorSetAndBindingMappingInfoEXT',
--     or
--     'Vulkan.Extensions.VK_EXT_validation_features.ValidationFeaturesEXT'
--
-- -   #VUID-VkShaderCreateInfoEXT-sType-unique# The @sType@ value of each
--     structure in the @pNext@ chain /must/ be unique
--
-- -   #VUID-VkShaderCreateInfoEXT-flags-parameter# @flags@ /must/ be a
--     valid combination of 'ShaderCreateFlagBitsEXT' values
--
-- -   #VUID-VkShaderCreateInfoEXT-stage-parameter# @stage@ /must/ be a
--     valid 'Vulkan.Core10.Enums.ShaderStageFlagBits.ShaderStageFlagBits'
--     value
--
-- -   #VUID-VkShaderCreateInfoEXT-nextStage-parameter# @nextStage@ /must/
--     be a valid combination of
--     'Vulkan.Core10.Enums.ShaderStageFlagBits.ShaderStageFlagBits' values
--
-- -   #VUID-VkShaderCreateInfoEXT-codeType-parameter# @codeType@ /must/ be
--     a valid 'ShaderCodeTypeEXT' value
--
-- -   #VUID-VkShaderCreateInfoEXT-pCode-parameter# @pCode@ /must/ be a
--     valid pointer to an array of @codeSize@ bytes
--
-- -   #VUID-VkShaderCreateInfoEXT-pName-parameter# If @pName@ is not
--     @NULL@, @pName@ /must/ be a null-terminated UTF-8 string
--
-- -   #VUID-VkShaderCreateInfoEXT-pSetLayouts-parameter# If
--     @setLayoutCount@ is not @0@, and @pSetLayouts@ is not @NULL@,
--     @pSetLayouts@ /must/ be a valid pointer to an array of
--     @setLayoutCount@ valid 'Vulkan.Core10.Handles.DescriptorSetLayout'
--     handles
--
-- -   #VUID-VkShaderCreateInfoEXT-pPushConstantRanges-parameter# If
--     @pushConstantRangeCount@ is not @0@, and @pPushConstantRanges@ is
--     not @NULL@, @pPushConstantRanges@ /must/ be a valid pointer to an
--     array of @pushConstantRangeCount@ valid
--     'Vulkan.Core10.PipelineLayout.PushConstantRange' structures
--
-- -   #VUID-VkShaderCreateInfoEXT-pSpecializationInfo-parameter# If
--     @pSpecializationInfo@ is not @NULL@, @pSpecializationInfo@ /must/ be
--     a valid pointer to a valid
--     'Vulkan.Core10.ComputePipeline.SpecializationInfo' structure
--
-- -   #VUID-VkShaderCreateInfoEXT-codeSize-arraylength# @codeSize@ /must/
--     be greater than @0@
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_shader_object VK_EXT_shader_object>,
-- 'Vulkan.Core10.Handles.DescriptorSetLayout',
-- 'Vulkan.Core10.PipelineLayout.PushConstantRange', 'ShaderCodeTypeEXT',
-- 'ShaderCreateFlagsEXT',
-- 'Vulkan.Core10.Enums.ShaderStageFlagBits.ShaderStageFlagBits',
-- 'Vulkan.Core10.Enums.ShaderStageFlagBits.ShaderStageFlags',
-- 'Vulkan.Core10.ComputePipeline.SpecializationInfo',
-- 'Vulkan.Core10.Enums.StructureType.StructureType', 'createShadersEXT'
data ShaderCreateInfoEXT (es :: [Type]) = ShaderCreateInfoEXT
  { -- | @pNext@ is @NULL@ or a pointer to a structure extending this structure.
    forall (es :: [*]). ShaderCreateInfoEXT es -> Chain es
next :: Chain es
  , -- | @flags@ is a bitmask of 'ShaderCreateFlagBitsEXT' describing additional
    -- parameters of the shader.
    forall (es :: [*]). ShaderCreateInfoEXT es -> ShaderCreateFlagsEXT
flags :: ShaderCreateFlagsEXT
  , -- | @stage@ is a
    -- 'Vulkan.Core10.Enums.ShaderStageFlagBits.ShaderStageFlagBits' value
    -- specifying a single shader stage.
    forall (es :: [*]). ShaderCreateInfoEXT es -> ShaderStageFlagBits
stage :: ShaderStageFlagBits
  , -- | @nextStage@ is a bitmask of
    -- 'Vulkan.Core10.Enums.ShaderStageFlagBits.ShaderStageFlagBits' specifying
    -- which stages /may/ be used as a logically next bound stage when drawing
    -- with the shader bound. A value of zero indicates this shader stage
    -- /must/ be the last one.
    forall (es :: [*]). ShaderCreateInfoEXT es -> ShaderStageFlagBits
nextStage :: ShaderStageFlags
  , -- | @codeType@ is a 'ShaderCodeTypeEXT' value specifying the type of the
    -- shader code pointed to be @pCode@.
    forall (es :: [*]). ShaderCreateInfoEXT es -> ShaderCodeTypeEXT
codeType :: ShaderCodeTypeEXT
  , -- | @codeSize@ is the size in bytes of the shader code pointed to be
    -- @pCode@.
    forall (es :: [*]). ShaderCreateInfoEXT es -> Word64
codeSize :: Word64
  , -- | @pCode@ is a pointer to the shader code to use to create the shader.
    forall (es :: [*]). ShaderCreateInfoEXT es -> Ptr ()
code :: Ptr ()
  , -- | @pName@ is a pointer to a null-terminated UTF-8 string specifying the
    -- entry point name of the shader for this stage.
    forall (es :: [*]).
ShaderCreateInfoEXT es -> Maybe ("data" ::: ByteString)
name :: Maybe ByteString
  , -- | @setLayoutCount@ is the number of descriptor set layouts pointed to by
    -- @pSetLayouts@.
    forall (es :: [*]). ShaderCreateInfoEXT es -> Word32
setLayoutCount :: Word32
  , -- | @pSetLayouts@ is a pointer to an array of
    -- 'Vulkan.Core10.Handles.DescriptorSetLayout' objects used by the shader
    -- stage. The implementation /must/ not access these objects outside of the
    -- duration of the command this structure is passed to.
    forall (es :: [*]).
ShaderCreateInfoEXT es -> Vector DescriptorSetLayout
setLayouts :: Vector DescriptorSetLayout
  , -- | @pushConstantRangeCount@ is the number of push constant ranges pointed
    -- to by @pPushConstantRanges@.
    forall (es :: [*]). ShaderCreateInfoEXT es -> Word32
pushConstantRangeCount :: Word32
  , -- | @pPushConstantRanges@ is a pointer to an array of
    -- 'Vulkan.Core10.PipelineLayout.PushConstantRange' structures used by the
    -- shader stage.
    forall (es :: [*]).
ShaderCreateInfoEXT es -> Vector PushConstantRange
pushConstantRanges :: Vector PushConstantRange
  , -- | @pSpecializationInfo@ is a pointer to a
    -- 'Vulkan.Core10.ComputePipeline.SpecializationInfo' structure, as
    -- described in
    -- <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#pipelines-specialization-constants Specialization Constants>,
    -- or @NULL@.
    forall (es :: [*]).
ShaderCreateInfoEXT es -> Maybe SpecializationInfo
specializationInfo :: Maybe SpecializationInfo
  }
  deriving (Typeable)
#if defined(GENERIC_INSTANCES)
deriving instance Generic (ShaderCreateInfoEXT (es :: [Type]))
#endif
deriving instance Show (Chain es) => Show (ShaderCreateInfoEXT es)

instance Extensible ShaderCreateInfoEXT where
  extensibleTypeName :: String
extensibleTypeName = String
"ShaderCreateInfoEXT"
  setNext :: forall (ds :: [*]) (es :: [*]).
ShaderCreateInfoEXT ds -> Chain es -> ShaderCreateInfoEXT es
setNext ShaderCreateInfoEXT{Maybe ("data" ::: ByteString)
Maybe SpecializationInfo
Word32
Word64
Ptr ()
Vector PushConstantRange
Vector DescriptorSetLayout
ShaderStageFlagBits
Chain ds
ShaderCodeTypeEXT
ShaderCreateFlagsEXT
next :: forall (es :: [*]). ShaderCreateInfoEXT es -> Chain es
flags :: forall (es :: [*]). ShaderCreateInfoEXT es -> ShaderCreateFlagsEXT
stage :: forall (es :: [*]). ShaderCreateInfoEXT es -> ShaderStageFlagBits
nextStage :: forall (es :: [*]). ShaderCreateInfoEXT es -> ShaderStageFlagBits
codeType :: forall (es :: [*]). ShaderCreateInfoEXT es -> ShaderCodeTypeEXT
codeSize :: forall (es :: [*]). ShaderCreateInfoEXT es -> Word64
code :: forall (es :: [*]). ShaderCreateInfoEXT es -> Ptr ()
name :: forall (es :: [*]).
ShaderCreateInfoEXT es -> Maybe ("data" ::: ByteString)
setLayoutCount :: forall (es :: [*]). ShaderCreateInfoEXT es -> Word32
setLayouts :: forall (es :: [*]).
ShaderCreateInfoEXT es -> Vector DescriptorSetLayout
pushConstantRangeCount :: forall (es :: [*]). ShaderCreateInfoEXT es -> Word32
pushConstantRanges :: forall (es :: [*]).
ShaderCreateInfoEXT es -> Vector PushConstantRange
specializationInfo :: forall (es :: [*]).
ShaderCreateInfoEXT es -> Maybe SpecializationInfo
next :: Chain ds
flags :: ShaderCreateFlagsEXT
stage :: ShaderStageFlagBits
nextStage :: ShaderStageFlagBits
codeType :: ShaderCodeTypeEXT
codeSize :: Word64
code :: Ptr ()
name :: Maybe ("data" ::: ByteString)
setLayoutCount :: Word32
setLayouts :: Vector DescriptorSetLayout
pushConstantRangeCount :: Word32
pushConstantRanges :: Vector PushConstantRange
specializationInfo :: Maybe SpecializationInfo
..} Chain es
next' = ShaderCreateInfoEXT{next :: Chain es
next = Chain es
next', Maybe ("data" ::: ByteString)
Maybe SpecializationInfo
Word32
Word64
Ptr ()
Vector PushConstantRange
Vector DescriptorSetLayout
ShaderStageFlagBits
ShaderCodeTypeEXT
ShaderCreateFlagsEXT
flags :: ShaderCreateFlagsEXT
stage :: ShaderStageFlagBits
nextStage :: ShaderStageFlagBits
codeType :: ShaderCodeTypeEXT
codeSize :: Word64
code :: Ptr ()
name :: Maybe ("data" ::: ByteString)
setLayoutCount :: Word32
setLayouts :: Vector DescriptorSetLayout
pushConstantRangeCount :: Word32
pushConstantRanges :: Vector PushConstantRange
specializationInfo :: Maybe SpecializationInfo
flags :: ShaderCreateFlagsEXT
stage :: ShaderStageFlagBits
nextStage :: ShaderStageFlagBits
codeType :: ShaderCodeTypeEXT
codeSize :: Word64
code :: Ptr ()
name :: Maybe ("data" ::: ByteString)
setLayoutCount :: Word32
setLayouts :: Vector DescriptorSetLayout
pushConstantRangeCount :: Word32
pushConstantRanges :: Vector PushConstantRange
specializationInfo :: Maybe SpecializationInfo
..}
  getNext :: forall (es :: [*]). ShaderCreateInfoEXT es -> Chain es
getNext ShaderCreateInfoEXT{Maybe ("data" ::: ByteString)
Maybe SpecializationInfo
Word32
Word64
Ptr ()
Vector PushConstantRange
Vector DescriptorSetLayout
ShaderStageFlagBits
Chain es
ShaderCodeTypeEXT
ShaderCreateFlagsEXT
next :: forall (es :: [*]). ShaderCreateInfoEXT es -> Chain es
flags :: forall (es :: [*]). ShaderCreateInfoEXT es -> ShaderCreateFlagsEXT
stage :: forall (es :: [*]). ShaderCreateInfoEXT es -> ShaderStageFlagBits
nextStage :: forall (es :: [*]). ShaderCreateInfoEXT es -> ShaderStageFlagBits
codeType :: forall (es :: [*]). ShaderCreateInfoEXT es -> ShaderCodeTypeEXT
codeSize :: forall (es :: [*]). ShaderCreateInfoEXT es -> Word64
code :: forall (es :: [*]). ShaderCreateInfoEXT es -> Ptr ()
name :: forall (es :: [*]).
ShaderCreateInfoEXT es -> Maybe ("data" ::: ByteString)
setLayoutCount :: forall (es :: [*]). ShaderCreateInfoEXT es -> Word32
setLayouts :: forall (es :: [*]).
ShaderCreateInfoEXT es -> Vector DescriptorSetLayout
pushConstantRangeCount :: forall (es :: [*]). ShaderCreateInfoEXT es -> Word32
pushConstantRanges :: forall (es :: [*]).
ShaderCreateInfoEXT es -> Vector PushConstantRange
specializationInfo :: forall (es :: [*]).
ShaderCreateInfoEXT es -> Maybe SpecializationInfo
next :: Chain es
flags :: ShaderCreateFlagsEXT
stage :: ShaderStageFlagBits
nextStage :: ShaderStageFlagBits
codeType :: ShaderCodeTypeEXT
codeSize :: Word64
code :: Ptr ()
name :: Maybe ("data" ::: ByteString)
setLayoutCount :: Word32
setLayouts :: Vector DescriptorSetLayout
pushConstantRangeCount :: Word32
pushConstantRanges :: Vector PushConstantRange
specializationInfo :: Maybe SpecializationInfo
..} = Chain es
next
  extends :: forall e b proxy. Typeable e => proxy e -> (Extends ShaderCreateInfoEXT e => b) -> Maybe b
  extends :: forall e b (proxy :: * -> *).
Typeable e =>
proxy e -> (Extends ShaderCreateInfoEXT e => b) -> Maybe b
extends proxy e
_ Extends ShaderCreateInfoEXT e => b
f
    | Just e :~: ShaderDescriptorSetAndBindingMappingInfoEXT
Refl <- forall {k} (a :: k) (b :: k).
(Typeable a, Typeable b) =>
Maybe (a :~: b)
forall a b. (Typeable a, Typeable b) => Maybe (a :~: b)
eqT @e @ShaderDescriptorSetAndBindingMappingInfoEXT = b -> Maybe b
forall a. a -> Maybe a
Just b
Extends ShaderCreateInfoEXT e => b
f
    | Just e :~: CustomResolveCreateInfoEXT
Refl <- forall {k} (a :: k) (b :: k).
(Typeable a, Typeable b) =>
Maybe (a :~: b)
forall a b. (Typeable a, Typeable b) => Maybe (a :~: b)
eqT @e @CustomResolveCreateInfoEXT = b -> Maybe b
forall a. a -> Maybe a
Just b
Extends ShaderCreateInfoEXT e => b
f
    | Just e :~: PipelineShaderStageRequiredSubgroupSizeCreateInfo
Refl <- forall {k} (a :: k) (b :: k).
(Typeable a, Typeable b) =>
Maybe (a :~: b)
forall a b. (Typeable a, Typeable b) => Maybe (a :~: b)
eqT @e @PipelineShaderStageRequiredSubgroupSizeCreateInfo = b -> Maybe b
forall a. a -> Maybe a
Just b
Extends ShaderCreateInfoEXT e => b
f
    | Just e :~: ValidationFeaturesEXT
Refl <- forall {k} (a :: k) (b :: k).
(Typeable a, Typeable b) =>
Maybe (a :~: b)
forall a b. (Typeable a, Typeable b) => Maybe (a :~: b)
eqT @e @ValidationFeaturesEXT = b -> Maybe b
forall a. a -> Maybe a
Just b
Extends ShaderCreateInfoEXT e => b
f
    | Bool
otherwise = Maybe b
forall a. Maybe a
Nothing

instance ( Extendss ShaderCreateInfoEXT es
         , PokeChain es ) => ToCStruct (ShaderCreateInfoEXT es) where
  withCStruct :: forall b.
ShaderCreateInfoEXT es
-> (Ptr (ShaderCreateInfoEXT es) -> IO b) -> IO b
withCStruct ShaderCreateInfoEXT es
x Ptr (ShaderCreateInfoEXT es) -> IO b
f = Int -> (Ptr (ShaderCreateInfoEXT es) -> IO b) -> IO b
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes Int
96 ((Ptr (ShaderCreateInfoEXT es) -> IO b) -> IO b)
-> (Ptr (ShaderCreateInfoEXT es) -> IO b) -> IO b
forall a b. (a -> b) -> a -> b
$ \Ptr (ShaderCreateInfoEXT es)
p -> Ptr (ShaderCreateInfoEXT es)
-> ShaderCreateInfoEXT es -> IO b -> IO b
forall b.
Ptr (ShaderCreateInfoEXT es)
-> ShaderCreateInfoEXT es -> IO b -> IO b
forall a b. ToCStruct a => Ptr a -> a -> IO b -> IO b
pokeCStruct Ptr (ShaderCreateInfoEXT es)
p ShaderCreateInfoEXT es
x (Ptr (ShaderCreateInfoEXT es) -> IO b
f Ptr (ShaderCreateInfoEXT es)
p)
  pokeCStruct :: forall b.
Ptr (ShaderCreateInfoEXT es)
-> ShaderCreateInfoEXT es -> IO b -> IO b
pokeCStruct Ptr (ShaderCreateInfoEXT es)
p ShaderCreateInfoEXT{Maybe ("data" ::: ByteString)
Maybe SpecializationInfo
Word32
Word64
Ptr ()
Vector PushConstantRange
Vector DescriptorSetLayout
ShaderStageFlagBits
Chain es
ShaderCodeTypeEXT
ShaderCreateFlagsEXT
next :: forall (es :: [*]). ShaderCreateInfoEXT es -> Chain es
flags :: forall (es :: [*]). ShaderCreateInfoEXT es -> ShaderCreateFlagsEXT
stage :: forall (es :: [*]). ShaderCreateInfoEXT es -> ShaderStageFlagBits
nextStage :: forall (es :: [*]). ShaderCreateInfoEXT es -> ShaderStageFlagBits
codeType :: forall (es :: [*]). ShaderCreateInfoEXT es -> ShaderCodeTypeEXT
codeSize :: forall (es :: [*]). ShaderCreateInfoEXT es -> Word64
code :: forall (es :: [*]). ShaderCreateInfoEXT es -> Ptr ()
name :: forall (es :: [*]).
ShaderCreateInfoEXT es -> Maybe ("data" ::: ByteString)
setLayoutCount :: forall (es :: [*]). ShaderCreateInfoEXT es -> Word32
setLayouts :: forall (es :: [*]).
ShaderCreateInfoEXT es -> Vector DescriptorSetLayout
pushConstantRangeCount :: forall (es :: [*]). ShaderCreateInfoEXT es -> Word32
pushConstantRanges :: forall (es :: [*]).
ShaderCreateInfoEXT es -> Vector PushConstantRange
specializationInfo :: forall (es :: [*]).
ShaderCreateInfoEXT es -> Maybe SpecializationInfo
next :: Chain es
flags :: ShaderCreateFlagsEXT
stage :: ShaderStageFlagBits
nextStage :: ShaderStageFlagBits
codeType :: ShaderCodeTypeEXT
codeSize :: Word64
code :: Ptr ()
name :: Maybe ("data" ::: ByteString)
setLayoutCount :: Word32
setLayouts :: Vector DescriptorSetLayout
pushConstantRangeCount :: Word32
pushConstantRanges :: Vector PushConstantRange
specializationInfo :: Maybe SpecializationInfo
..} IO b
f = ContT b IO b -> IO b
forall (m :: * -> *) r. Monad m => ContT r m r -> m r
evalContT (ContT b IO b -> IO b) -> ContT b IO b -> IO b
forall a b. (a -> b) -> a -> b
$ do
    IO () -> ContT b IO ()
forall (m :: * -> *) a. Monad m => m a -> ContT b m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO ()
forall a b. (a -> b) -> a -> b
$ Ptr StructureType -> StructureType -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr (ShaderCreateInfoEXT es)
p Ptr (ShaderCreateInfoEXT es) -> Int -> Ptr StructureType
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_SHADER_CREATE_INFO_EXT)
    pNext'' <- (Ptr (Chain es) -> Ptr ())
-> ContT b IO (Ptr (Chain es)) -> ContT b IO (Ptr ())
forall a b. (a -> b) -> ContT b IO a -> ContT b IO b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Ptr (Chain es) -> Ptr ()
forall a b. Ptr a -> Ptr b
castPtr (ContT b IO (Ptr (Chain es)) -> ContT b IO (Ptr ()))
-> (((Ptr (Chain es) -> IO b) -> IO b)
    -> ContT b IO (Ptr (Chain es)))
-> ((Ptr (Chain es) -> IO b) -> IO b)
-> ContT b IO (Ptr ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Ptr (Chain es) -> IO b) -> IO b) -> ContT b IO (Ptr (Chain es))
forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((Ptr (Chain es) -> IO b) -> IO b) -> ContT b IO (Ptr ()))
-> ((Ptr (Chain es) -> IO b) -> IO b) -> ContT b IO (Ptr ())
forall a b. (a -> b) -> a -> b
$ Chain es -> (Ptr (Chain es) -> IO b) -> IO b
forall (es :: [*]) a.
PokeChain es =>
Chain es -> (Ptr (Chain es) -> IO a) -> IO a
forall a. Chain es -> (Ptr (Chain es) -> IO a) -> IO a
withChain (Chain es
next)
    lift $ poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) pNext''
    lift $ poke ((p `plusPtr` 16 :: Ptr ShaderCreateFlagsEXT)) (flags)
    lift $ poke ((p `plusPtr` 20 :: Ptr ShaderStageFlagBits)) (stage)
    lift $ poke ((p `plusPtr` 24 :: Ptr ShaderStageFlags)) (nextStage)
    lift $ poke ((p `plusPtr` 28 :: Ptr ShaderCodeTypeEXT)) (codeType)
    lift $ poke ((p `plusPtr` 32 :: Ptr CSize)) (CSize (codeSize))
    lift $ poke ((p `plusPtr` 40 :: Ptr (Ptr ()))) (code)
    pName'' <- case (name) of
      Maybe ("data" ::: ByteString)
Nothing -> Ptr CChar -> ContT b IO (Ptr CChar)
forall a. a -> ContT b IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Ptr CChar
forall a. Ptr a
nullPtr
      Just "data" ::: ByteString
j -> ((Ptr CChar -> IO b) -> IO b) -> ContT b IO (Ptr CChar)
forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((Ptr CChar -> IO b) -> IO b) -> ContT b IO (Ptr CChar))
-> ((Ptr CChar -> IO b) -> IO b) -> ContT b IO (Ptr CChar)
forall a b. (a -> b) -> a -> b
$ ("data" ::: ByteString) -> (Ptr CChar -> IO b) -> IO b
forall a. ("data" ::: ByteString) -> (Ptr CChar -> IO a) -> IO a
useAsCString ("data" ::: ByteString
j)
    lift $ poke ((p `plusPtr` 48 :: Ptr (Ptr CChar))) pName''
    let pSetLayoutsLength = Vector DescriptorSetLayout -> Int
forall a. Vector a -> Int
Data.Vector.length (Vector DescriptorSetLayout -> Int)
-> Vector DescriptorSetLayout -> Int
forall a b. (a -> b) -> a -> b
$ (Vector DescriptorSetLayout
setLayouts)
    setLayoutCount'' <- lift $ if (setLayoutCount) == 0
      then pure $ fromIntegral pSetLayoutsLength
      else do
        unless (fromIntegral pSetLayoutsLength == (setLayoutCount) || pSetLayoutsLength == 0) $
          throwIO $ IOError Nothing InvalidArgument "" "pSetLayouts must be empty or have 'setLayoutCount' elements" Nothing Nothing
        pure (setLayoutCount)
    lift $ poke ((p `plusPtr` 56 :: Ptr Word32)) (setLayoutCount'')
    pSetLayouts'' <- if Data.Vector.null (setLayouts)
      then pure nullPtr
      else do
        pPSetLayouts <- ContT $ allocaBytes @DescriptorSetLayout (((Data.Vector.length (setLayouts))) * 8)
        lift $ Data.Vector.imapM_ (\Int
i DescriptorSetLayout
e -> Ptr DescriptorSetLayout -> DescriptorSetLayout -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr DescriptorSetLayout
pPSetLayouts Ptr DescriptorSetLayout -> Int -> Ptr DescriptorSetLayout
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` (Int
8 Int -> Int -> Int
forall a. Num a => a -> a -> a
* (Int
i)) :: Ptr DescriptorSetLayout) (DescriptorSetLayout
e)) ((setLayouts))
        pure $ pPSetLayouts
    lift $ poke ((p `plusPtr` 64 :: Ptr (Ptr DescriptorSetLayout))) pSetLayouts''
    let pPushConstantRangesLength = Vector PushConstantRange -> Int
forall a. Vector a -> Int
Data.Vector.length (Vector PushConstantRange -> Int)
-> Vector PushConstantRange -> Int
forall a b. (a -> b) -> a -> b
$ (Vector PushConstantRange
pushConstantRanges)
    pushConstantRangeCount'' <- lift $ if (pushConstantRangeCount) == 0
      then pure $ fromIntegral pPushConstantRangesLength
      else do
        unless (fromIntegral pPushConstantRangesLength == (pushConstantRangeCount) || pPushConstantRangesLength == 0) $
          throwIO $ IOError Nothing InvalidArgument "" "pPushConstantRanges must be empty or have 'pushConstantRangeCount' elements" Nothing Nothing
        pure (pushConstantRangeCount)
    lift $ poke ((p `plusPtr` 72 :: Ptr Word32)) (pushConstantRangeCount'')
    pPushConstantRanges'' <- if Data.Vector.null (pushConstantRanges)
      then pure nullPtr
      else do
        pPPushConstantRanges <- ContT $ allocaBytes @PushConstantRange (((Data.Vector.length (pushConstantRanges))) * 12)
        lift $ Data.Vector.imapM_ (\Int
i PushConstantRange
e -> Ptr PushConstantRange -> PushConstantRange -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke (Ptr PushConstantRange
pPPushConstantRanges Ptr PushConstantRange -> Int -> Ptr PushConstantRange
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` (Int
12 Int -> Int -> Int
forall a. Num a => a -> a -> a
* (Int
i)) :: Ptr PushConstantRange) (PushConstantRange
e)) ((pushConstantRanges))
        pure $ pPPushConstantRanges
    lift $ poke ((p `plusPtr` 80 :: Ptr (Ptr PushConstantRange))) pPushConstantRanges''
    pSpecializationInfo'' <- case (specializationInfo) of
      Maybe SpecializationInfo
Nothing -> Ptr SpecializationInfo -> ContT b IO (Ptr SpecializationInfo)
forall a. a -> ContT b IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Ptr SpecializationInfo
forall a. Ptr a
nullPtr
      Just SpecializationInfo
j -> ((Ptr SpecializationInfo -> IO b) -> IO b)
-> ContT b IO (Ptr SpecializationInfo)
forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((Ptr SpecializationInfo -> IO b) -> IO b)
 -> ContT b IO (Ptr SpecializationInfo))
-> ((Ptr SpecializationInfo -> IO b) -> IO b)
-> ContT b IO (Ptr SpecializationInfo)
forall a b. (a -> b) -> a -> b
$ SpecializationInfo -> (Ptr SpecializationInfo -> IO b) -> IO b
forall a b. ToCStruct a => a -> (Ptr a -> IO b) -> IO b
forall b.
SpecializationInfo -> (Ptr SpecializationInfo -> IO b) -> IO b
withCStruct (SpecializationInfo
j)
    lift $ poke ((p `plusPtr` 88 :: Ptr (Ptr SpecializationInfo))) pSpecializationInfo''
    lift $ f
  cStructSize :: Int
cStructSize = Int
96
  cStructAlignment :: Int
cStructAlignment = Int
8
  pokeZeroCStruct :: forall b. Ptr (ShaderCreateInfoEXT es) -> IO b -> IO b
pokeZeroCStruct Ptr (ShaderCreateInfoEXT es)
p IO b
f = ContT b IO b -> IO b
forall (m :: * -> *) r. Monad m => ContT r m r -> m r
evalContT (ContT b IO b -> IO b) -> ContT b IO b -> IO b
forall a b. (a -> b) -> a -> b
$ do
    IO () -> ContT b IO ()
forall (m :: * -> *) a. Monad m => m a -> ContT b m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO () -> ContT b IO ()) -> IO () -> ContT b IO ()
forall a b. (a -> b) -> a -> b
$ Ptr StructureType -> StructureType -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((Ptr (ShaderCreateInfoEXT es)
p Ptr (ShaderCreateInfoEXT es) -> Int -> Ptr StructureType
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0 :: Ptr StructureType)) (StructureType
STRUCTURE_TYPE_SHADER_CREATE_INFO_EXT)
    pNext' <- (Ptr (Chain es) -> Ptr ())
-> ContT b IO (Ptr (Chain es)) -> ContT b IO (Ptr ())
forall a b. (a -> b) -> ContT b IO a -> ContT b IO b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Ptr (Chain es) -> Ptr ()
forall a b. Ptr a -> Ptr b
castPtr (ContT b IO (Ptr (Chain es)) -> ContT b IO (Ptr ()))
-> (((Ptr (Chain es) -> IO b) -> IO b)
    -> ContT b IO (Ptr (Chain es)))
-> ((Ptr (Chain es) -> IO b) -> IO b)
-> ContT b IO (Ptr ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Ptr (Chain es) -> IO b) -> IO b) -> ContT b IO (Ptr (Chain es))
forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((Ptr (Chain es) -> IO b) -> IO b) -> ContT b IO (Ptr ()))
-> ((Ptr (Chain es) -> IO b) -> IO b) -> ContT b IO (Ptr ())
forall a b. (a -> b) -> a -> b
$ forall (es :: [*]) a.
PokeChain es =>
(Ptr (Chain es) -> IO a) -> IO a
withZeroChain @es
    lift $ poke ((p `plusPtr` 8 :: Ptr (Ptr ()))) pNext'
    lift $ poke ((p `plusPtr` 20 :: Ptr ShaderStageFlagBits)) (zero)
    lift $ poke ((p `plusPtr` 28 :: Ptr ShaderCodeTypeEXT)) (zero)
    lift $ poke ((p `plusPtr` 32 :: Ptr CSize)) (CSize (zero))
    lift $ poke ((p `plusPtr` 40 :: Ptr (Ptr ()))) (zero)
    lift $ f

instance ( Extendss ShaderCreateInfoEXT es
         , PeekChain es ) => FromCStruct (ShaderCreateInfoEXT es) where
  peekCStruct :: Ptr (ShaderCreateInfoEXT es) -> IO (ShaderCreateInfoEXT es)
peekCStruct Ptr (ShaderCreateInfoEXT es)
p = do
    pNext <- forall a. Storable a => Ptr a -> IO a
peek @(Ptr ()) ((Ptr (ShaderCreateInfoEXT es)
p Ptr (ShaderCreateInfoEXT es) -> Int -> Ptr (Ptr ())
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
8 :: Ptr (Ptr ())))
    next <- peekChain (castPtr pNext)
    flags <- peek @ShaderCreateFlagsEXT ((p `plusPtr` 16 :: Ptr ShaderCreateFlagsEXT))
    stage <- peek @ShaderStageFlagBits ((p `plusPtr` 20 :: Ptr ShaderStageFlagBits))
    nextStage <- peek @ShaderStageFlags ((p `plusPtr` 24 :: Ptr ShaderStageFlags))
    codeType <- peek @ShaderCodeTypeEXT ((p `plusPtr` 28 :: Ptr ShaderCodeTypeEXT))
    codeSize <- peek @CSize ((p `plusPtr` 32 :: Ptr CSize))
    pCode <- peek @(Ptr ()) ((p `plusPtr` 40 :: Ptr (Ptr ())))
    pName <- peek @(Ptr CChar) ((p `plusPtr` 48 :: Ptr (Ptr CChar)))
    pName' <- maybePeek (\Ptr CChar
j -> Ptr CChar -> IO ("data" ::: ByteString)
packCString (Ptr CChar
j)) pName
    setLayoutCount <- peek @Word32 ((p `plusPtr` 56 :: Ptr Word32))
    pSetLayouts <- peek @(Ptr DescriptorSetLayout) ((p `plusPtr` 64 :: Ptr (Ptr DescriptorSetLayout)))
    let pSetLayoutsLength = if Ptr DescriptorSetLayout
pSetLayouts Ptr DescriptorSetLayout -> Ptr DescriptorSetLayout -> Bool
forall a. Eq a => a -> a -> Bool
== Ptr DescriptorSetLayout
forall a. Ptr a
nullPtr then Int
0 else (Word32 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
setLayoutCount)
    pSetLayouts' <- generateM pSetLayoutsLength (\Int
i -> forall a. Storable a => Ptr a -> IO a
peek @DescriptorSetLayout ((Ptr DescriptorSetLayout
pSetLayouts Ptr DescriptorSetLayout -> Int -> Ptr DescriptorSetLayout
forall a. Ptr a -> Int -> Ptr a
`advancePtrBytes` (Int
8 Int -> Int -> Int
forall a. Num a => a -> a -> a
* (Int
i)) :: Ptr DescriptorSetLayout)))
    pushConstantRangeCount <- peek @Word32 ((p `plusPtr` 72 :: Ptr Word32))
    pPushConstantRanges <- peek @(Ptr PushConstantRange) ((p `plusPtr` 80 :: Ptr (Ptr PushConstantRange)))
    let pPushConstantRangesLength = if Ptr PushConstantRange
pPushConstantRanges Ptr PushConstantRange -> Ptr PushConstantRange -> Bool
forall a. Eq a => a -> a -> Bool
== Ptr PushConstantRange
forall a. Ptr a
nullPtr then Int
0 else (Word32 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
pushConstantRangeCount)
    pPushConstantRanges' <- generateM pPushConstantRangesLength (\Int
i -> forall a. FromCStruct a => Ptr a -> IO a
peekCStruct @PushConstantRange ((Ptr PushConstantRange
pPushConstantRanges Ptr PushConstantRange -> Int -> Ptr PushConstantRange
forall a. Ptr a -> Int -> Ptr a
`advancePtrBytes` (Int
12 Int -> Int -> Int
forall a. Num a => a -> a -> a
* (Int
i)) :: Ptr PushConstantRange)))
    pSpecializationInfo <- peek @(Ptr SpecializationInfo) ((p `plusPtr` 88 :: Ptr (Ptr SpecializationInfo)))
    pSpecializationInfo' <- maybePeek (\Ptr SpecializationInfo
j -> forall a. FromCStruct a => Ptr a -> IO a
peekCStruct @SpecializationInfo (Ptr SpecializationInfo
j)) pSpecializationInfo
    pure $ ShaderCreateInfoEXT
             next
             flags
             stage
             nextStage
             codeType
             (coerce @CSize @Word64 codeSize)
             pCode
             pName'
             setLayoutCount
             pSetLayouts'
             pushConstantRangeCount
             pPushConstantRanges'
             pSpecializationInfo'

instance es ~ '[] => Zero (ShaderCreateInfoEXT es) where
  zero :: ShaderCreateInfoEXT es
zero = Chain es
-> ShaderCreateFlagsEXT
-> ShaderStageFlagBits
-> ShaderStageFlagBits
-> ShaderCodeTypeEXT
-> Word64
-> Ptr ()
-> Maybe ("data" ::: ByteString)
-> Word32
-> Vector DescriptorSetLayout
-> Word32
-> Vector PushConstantRange
-> Maybe SpecializationInfo
-> ShaderCreateInfoEXT es
forall (es :: [*]).
Chain es
-> ShaderCreateFlagsEXT
-> ShaderStageFlagBits
-> ShaderStageFlagBits
-> ShaderCodeTypeEXT
-> Word64
-> Ptr ()
-> Maybe ("data" ::: ByteString)
-> Word32
-> Vector DescriptorSetLayout
-> Word32
-> Vector PushConstantRange
-> Maybe SpecializationInfo
-> ShaderCreateInfoEXT es
ShaderCreateInfoEXT
           ()
           ShaderCreateFlagsEXT
forall a. Zero a => a
zero
           ShaderStageFlagBits
forall a. Zero a => a
zero
           ShaderStageFlagBits
forall a. Zero a => a
zero
           ShaderCodeTypeEXT
forall a. Zero a => a
zero
           Word64
forall a. Zero a => a
zero
           Ptr ()
forall a. Zero a => a
zero
           Maybe ("data" ::: ByteString)
forall a. Maybe a
Nothing
           Word32
forall a. Zero a => a
zero
           Vector DescriptorSetLayout
forall a. Monoid a => a
mempty
           Word32
forall a. Zero a => a
zero
           Vector PushConstantRange
forall a. Monoid a => a
mempty
           Maybe SpecializationInfo
forall a. Maybe a
Nothing


type ShaderCreateFlagsEXT = ShaderCreateFlagBitsEXT

-- | VkShaderCreateFlagBitsEXT - Bitmask controlling how a shader object is
-- created
--
-- = Description
--
-- -   'SHADER_CREATE_LINK_STAGE_BIT_EXT' specifies that a shader is linked
--     to all other shaders created in the same 'createShadersEXT' call
--     whose 'ShaderCreateInfoEXT' structures\' @flags@ include
--     'SHADER_CREATE_LINK_STAGE_BIT_EXT'.
--
-- -   'SHADER_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT' specifies that
--     the
--     <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#interfaces-builtin-variables-sgs SubgroupSize>
--     /may/ vary in a task, mesh, or compute shader.
--
-- -   'SHADER_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT' specifies that the
--     subgroup sizes /must/ be launched with all invocations active in a
--     task, mesh, or compute shader.
--
-- -   'SHADER_CREATE_NO_TASK_SHADER_BIT_EXT' specifies that a mesh shader
--     /must/ only be used without a task shader. Otherwise, the mesh
--     shader /must/ only be used with a task shader.
--
-- -   'SHADER_CREATE_DISPATCH_BASE_BIT_EXT' specifies that a compute
--     shader /can/ be used with
--     'Vulkan.Core11.Promoted_From_VK_KHR_device_group.cmdDispatchBase'
--     with a non-zero base workgroup.
--
-- -   'SHADER_CREATE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_EXT' specifies
--     that a fragment shader /can/ be used with a fragment shading rate
--     attachment.
--
-- -   'SHADER_CREATE_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT' specifies
--     that a fragment shader /can/ be used with a fragment density map
--     attachment.
--
-- -   'SHADER_CREATE_INDIRECT_BINDABLE_BIT_EXT' specifies that the shader
--     /can/ be used in combination with
--     <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#device-generated-commands>.
--
-- -   'SHADER_CREATE_64_BIT_INDEXING_BIT_EXT' specifies that the shader
--     enables
--     <https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#spirvenv-64bindexing 64-bit indexing>.
--
-- -   'SHADER_CREATE_DESCRIPTOR_HEAP_BIT_EXT' specifies that the shader
--     will use descriptor heap mappings instead of descriptor set layouts.
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_shader_object VK_EXT_shader_object>,
-- 'ShaderCreateFlagsEXT'
newtype ShaderCreateFlagBitsEXT = ShaderCreateFlagBitsEXT Flags
  deriving newtype (ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT -> Bool
(ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT -> Bool)
-> (ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT -> Bool)
-> Eq ShaderCreateFlagsEXT
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT -> Bool
== :: ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT -> Bool
$c/= :: ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT -> Bool
/= :: ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT -> Bool
Eq, Eq ShaderCreateFlagsEXT
Eq ShaderCreateFlagsEXT =>
(ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT -> Ordering)
-> (ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT -> Bool)
-> (ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT -> Bool)
-> (ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT -> Bool)
-> (ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT -> Bool)
-> (ShaderCreateFlagsEXT
    -> ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT)
-> (ShaderCreateFlagsEXT
    -> ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT)
-> Ord ShaderCreateFlagsEXT
ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT -> Bool
ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT -> Ordering
ShaderCreateFlagsEXT
-> ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT -> Ordering
compare :: ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT -> Ordering
$c< :: ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT -> Bool
< :: ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT -> Bool
$c<= :: ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT -> Bool
<= :: ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT -> Bool
$c> :: ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT -> Bool
> :: ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT -> Bool
$c>= :: ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT -> Bool
>= :: ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT -> Bool
$cmax :: ShaderCreateFlagsEXT
-> ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT
max :: ShaderCreateFlagsEXT
-> ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT
$cmin :: ShaderCreateFlagsEXT
-> ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT
min :: ShaderCreateFlagsEXT
-> ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT
Ord, Ptr ShaderCreateFlagsEXT -> IO ShaderCreateFlagsEXT
Ptr ShaderCreateFlagsEXT -> Int -> IO ShaderCreateFlagsEXT
Ptr ShaderCreateFlagsEXT -> Int -> ShaderCreateFlagsEXT -> IO ()
Ptr ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT -> IO ()
ShaderCreateFlagsEXT -> Int
(ShaderCreateFlagsEXT -> Int)
-> (ShaderCreateFlagsEXT -> Int)
-> (Ptr ShaderCreateFlagsEXT -> Int -> IO ShaderCreateFlagsEXT)
-> (Ptr ShaderCreateFlagsEXT
    -> Int -> ShaderCreateFlagsEXT -> IO ())
-> (forall b. Ptr b -> Int -> IO ShaderCreateFlagsEXT)
-> (forall b. Ptr b -> Int -> ShaderCreateFlagsEXT -> IO ())
-> (Ptr ShaderCreateFlagsEXT -> IO ShaderCreateFlagsEXT)
-> (Ptr ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT -> IO ())
-> Storable ShaderCreateFlagsEXT
forall b. Ptr b -> Int -> IO ShaderCreateFlagsEXT
forall b. Ptr b -> Int -> ShaderCreateFlagsEXT -> IO ()
forall a.
(a -> Int)
-> (a -> Int)
-> (Ptr a -> Int -> IO a)
-> (Ptr a -> Int -> a -> IO ())
-> (forall b. Ptr b -> Int -> IO a)
-> (forall b. Ptr b -> Int -> a -> IO ())
-> (Ptr a -> IO a)
-> (Ptr a -> a -> IO ())
-> Storable a
$csizeOf :: ShaderCreateFlagsEXT -> Int
sizeOf :: ShaderCreateFlagsEXT -> Int
$calignment :: ShaderCreateFlagsEXT -> Int
alignment :: ShaderCreateFlagsEXT -> Int
$cpeekElemOff :: Ptr ShaderCreateFlagsEXT -> Int -> IO ShaderCreateFlagsEXT
peekElemOff :: Ptr ShaderCreateFlagsEXT -> Int -> IO ShaderCreateFlagsEXT
$cpokeElemOff :: Ptr ShaderCreateFlagsEXT -> Int -> ShaderCreateFlagsEXT -> IO ()
pokeElemOff :: Ptr ShaderCreateFlagsEXT -> Int -> ShaderCreateFlagsEXT -> IO ()
$cpeekByteOff :: forall b. Ptr b -> Int -> IO ShaderCreateFlagsEXT
peekByteOff :: forall b. Ptr b -> Int -> IO ShaderCreateFlagsEXT
$cpokeByteOff :: forall b. Ptr b -> Int -> ShaderCreateFlagsEXT -> IO ()
pokeByteOff :: forall b. Ptr b -> Int -> ShaderCreateFlagsEXT -> IO ()
$cpeek :: Ptr ShaderCreateFlagsEXT -> IO ShaderCreateFlagsEXT
peek :: Ptr ShaderCreateFlagsEXT -> IO ShaderCreateFlagsEXT
$cpoke :: Ptr ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT -> IO ()
poke :: Ptr ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT -> IO ()
Storable, ShaderCreateFlagsEXT
ShaderCreateFlagsEXT -> Zero ShaderCreateFlagsEXT
forall a. a -> Zero a
$czero :: ShaderCreateFlagsEXT
zero :: ShaderCreateFlagsEXT
Zero, Eq ShaderCreateFlagsEXT
ShaderCreateFlagsEXT
Eq ShaderCreateFlagsEXT =>
(ShaderCreateFlagsEXT
 -> ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT)
-> (ShaderCreateFlagsEXT
    -> ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT)
-> (ShaderCreateFlagsEXT
    -> ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT)
-> (ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT)
-> (ShaderCreateFlagsEXT -> Int -> ShaderCreateFlagsEXT)
-> (ShaderCreateFlagsEXT -> Int -> ShaderCreateFlagsEXT)
-> ShaderCreateFlagsEXT
-> (Int -> ShaderCreateFlagsEXT)
-> (ShaderCreateFlagsEXT -> Int -> ShaderCreateFlagsEXT)
-> (ShaderCreateFlagsEXT -> Int -> ShaderCreateFlagsEXT)
-> (ShaderCreateFlagsEXT -> Int -> ShaderCreateFlagsEXT)
-> (ShaderCreateFlagsEXT -> Int -> Bool)
-> (ShaderCreateFlagsEXT -> Maybe Int)
-> (ShaderCreateFlagsEXT -> Int)
-> (ShaderCreateFlagsEXT -> Bool)
-> (ShaderCreateFlagsEXT -> Int -> ShaderCreateFlagsEXT)
-> (ShaderCreateFlagsEXT -> Int -> ShaderCreateFlagsEXT)
-> (ShaderCreateFlagsEXT -> Int -> ShaderCreateFlagsEXT)
-> (ShaderCreateFlagsEXT -> Int -> ShaderCreateFlagsEXT)
-> (ShaderCreateFlagsEXT -> Int -> ShaderCreateFlagsEXT)
-> (ShaderCreateFlagsEXT -> Int -> ShaderCreateFlagsEXT)
-> (ShaderCreateFlagsEXT -> Int)
-> Bits ShaderCreateFlagsEXT
Int -> ShaderCreateFlagsEXT
ShaderCreateFlagsEXT -> Bool
ShaderCreateFlagsEXT -> Int
ShaderCreateFlagsEXT -> Maybe Int
ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT
ShaderCreateFlagsEXT -> Int -> Bool
ShaderCreateFlagsEXT -> Int -> ShaderCreateFlagsEXT
ShaderCreateFlagsEXT
-> ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT
forall a.
Eq a =>
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> a
-> (Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> Bool)
-> (a -> Maybe Int)
-> (a -> Int)
-> (a -> Bool)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int)
-> Bits a
$c.&. :: ShaderCreateFlagsEXT
-> ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT
.&. :: ShaderCreateFlagsEXT
-> ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT
$c.|. :: ShaderCreateFlagsEXT
-> ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT
.|. :: ShaderCreateFlagsEXT
-> ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT
$cxor :: ShaderCreateFlagsEXT
-> ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT
xor :: ShaderCreateFlagsEXT
-> ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT
$ccomplement :: ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT
complement :: ShaderCreateFlagsEXT -> ShaderCreateFlagsEXT
$cshift :: ShaderCreateFlagsEXT -> Int -> ShaderCreateFlagsEXT
shift :: ShaderCreateFlagsEXT -> Int -> ShaderCreateFlagsEXT
$crotate :: ShaderCreateFlagsEXT -> Int -> ShaderCreateFlagsEXT
rotate :: ShaderCreateFlagsEXT -> Int -> ShaderCreateFlagsEXT
$czeroBits :: ShaderCreateFlagsEXT
zeroBits :: ShaderCreateFlagsEXT
$cbit :: Int -> ShaderCreateFlagsEXT
bit :: Int -> ShaderCreateFlagsEXT
$csetBit :: ShaderCreateFlagsEXT -> Int -> ShaderCreateFlagsEXT
setBit :: ShaderCreateFlagsEXT -> Int -> ShaderCreateFlagsEXT
$cclearBit :: ShaderCreateFlagsEXT -> Int -> ShaderCreateFlagsEXT
clearBit :: ShaderCreateFlagsEXT -> Int -> ShaderCreateFlagsEXT
$ccomplementBit :: ShaderCreateFlagsEXT -> Int -> ShaderCreateFlagsEXT
complementBit :: ShaderCreateFlagsEXT -> Int -> ShaderCreateFlagsEXT
$ctestBit :: ShaderCreateFlagsEXT -> Int -> Bool
testBit :: ShaderCreateFlagsEXT -> Int -> Bool
$cbitSizeMaybe :: ShaderCreateFlagsEXT -> Maybe Int
bitSizeMaybe :: ShaderCreateFlagsEXT -> Maybe Int
$cbitSize :: ShaderCreateFlagsEXT -> Int
bitSize :: ShaderCreateFlagsEXT -> Int
$cisSigned :: ShaderCreateFlagsEXT -> Bool
isSigned :: ShaderCreateFlagsEXT -> Bool
$cshiftL :: ShaderCreateFlagsEXT -> Int -> ShaderCreateFlagsEXT
shiftL :: ShaderCreateFlagsEXT -> Int -> ShaderCreateFlagsEXT
$cunsafeShiftL :: ShaderCreateFlagsEXT -> Int -> ShaderCreateFlagsEXT
unsafeShiftL :: ShaderCreateFlagsEXT -> Int -> ShaderCreateFlagsEXT
$cshiftR :: ShaderCreateFlagsEXT -> Int -> ShaderCreateFlagsEXT
shiftR :: ShaderCreateFlagsEXT -> Int -> ShaderCreateFlagsEXT
$cunsafeShiftR :: ShaderCreateFlagsEXT -> Int -> ShaderCreateFlagsEXT
unsafeShiftR :: ShaderCreateFlagsEXT -> Int -> ShaderCreateFlagsEXT
$crotateL :: ShaderCreateFlagsEXT -> Int -> ShaderCreateFlagsEXT
rotateL :: ShaderCreateFlagsEXT -> Int -> ShaderCreateFlagsEXT
$crotateR :: ShaderCreateFlagsEXT -> Int -> ShaderCreateFlagsEXT
rotateR :: ShaderCreateFlagsEXT -> Int -> ShaderCreateFlagsEXT
$cpopCount :: ShaderCreateFlagsEXT -> Int
popCount :: ShaderCreateFlagsEXT -> Int
Bits, Bits ShaderCreateFlagsEXT
Bits ShaderCreateFlagsEXT =>
(ShaderCreateFlagsEXT -> Int)
-> (ShaderCreateFlagsEXT -> Int)
-> (ShaderCreateFlagsEXT -> Int)
-> FiniteBits ShaderCreateFlagsEXT
ShaderCreateFlagsEXT -> Int
forall b.
Bits b =>
(b -> Int) -> (b -> Int) -> (b -> Int) -> FiniteBits b
$cfiniteBitSize :: ShaderCreateFlagsEXT -> Int
finiteBitSize :: ShaderCreateFlagsEXT -> Int
$ccountLeadingZeros :: ShaderCreateFlagsEXT -> Int
countLeadingZeros :: ShaderCreateFlagsEXT -> Int
$ccountTrailingZeros :: ShaderCreateFlagsEXT -> Int
countTrailingZeros :: ShaderCreateFlagsEXT -> Int
FiniteBits)

-- No documentation found for Nested "VkShaderCreateFlagBitsEXT" "VK_SHADER_CREATE_LINK_STAGE_BIT_EXT"
pattern $mSHADER_CREATE_LINK_STAGE_BIT_EXT :: forall {r}.
ShaderCreateFlagsEXT -> ((# #) -> r) -> ((# #) -> r) -> r
$bSHADER_CREATE_LINK_STAGE_BIT_EXT :: ShaderCreateFlagsEXT
SHADER_CREATE_LINK_STAGE_BIT_EXT = ShaderCreateFlagBitsEXT 0x00000001

-- No documentation found for Nested "VkShaderCreateFlagBitsEXT" "VK_SHADER_CREATE_64_BIT_INDEXING_BIT_EXT"
pattern $mSHADER_CREATE_64_BIT_INDEXING_BIT_EXT :: forall {r}.
ShaderCreateFlagsEXT -> ((# #) -> r) -> ((# #) -> r) -> r
$bSHADER_CREATE_64_BIT_INDEXING_BIT_EXT :: ShaderCreateFlagsEXT
SHADER_CREATE_64_BIT_INDEXING_BIT_EXT = ShaderCreateFlagBitsEXT 0x00008000

-- No documentation found for Nested "VkShaderCreateFlagBitsEXT" "VK_SHADER_CREATE_INDIRECT_BINDABLE_BIT_EXT"
pattern $mSHADER_CREATE_INDIRECT_BINDABLE_BIT_EXT :: forall {r}.
ShaderCreateFlagsEXT -> ((# #) -> r) -> ((# #) -> r) -> r
$bSHADER_CREATE_INDIRECT_BINDABLE_BIT_EXT :: ShaderCreateFlagsEXT
SHADER_CREATE_INDIRECT_BINDABLE_BIT_EXT = ShaderCreateFlagBitsEXT 0x00000080

-- No documentation found for Nested "VkShaderCreateFlagBitsEXT" "VK_SHADER_CREATE_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT"
pattern $mSHADER_CREATE_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT :: forall {r}.
ShaderCreateFlagsEXT -> ((# #) -> r) -> ((# #) -> r) -> r
$bSHADER_CREATE_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT :: ShaderCreateFlagsEXT
SHADER_CREATE_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT = ShaderCreateFlagBitsEXT 0x00000040

-- No documentation found for Nested "VkShaderCreateFlagBitsEXT" "VK_SHADER_CREATE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_EXT"
pattern $mSHADER_CREATE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_EXT :: forall {r}.
ShaderCreateFlagsEXT -> ((# #) -> r) -> ((# #) -> r) -> r
$bSHADER_CREATE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_EXT :: ShaderCreateFlagsEXT
SHADER_CREATE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_EXT = ShaderCreateFlagBitsEXT 0x00000020

-- No documentation found for Nested "VkShaderCreateFlagBitsEXT" "VK_SHADER_CREATE_DISPATCH_BASE_BIT_EXT"
pattern $mSHADER_CREATE_DISPATCH_BASE_BIT_EXT :: forall {r}.
ShaderCreateFlagsEXT -> ((# #) -> r) -> ((# #) -> r) -> r
$bSHADER_CREATE_DISPATCH_BASE_BIT_EXT :: ShaderCreateFlagsEXT
SHADER_CREATE_DISPATCH_BASE_BIT_EXT = ShaderCreateFlagBitsEXT 0x00000010

-- No documentation found for Nested "VkShaderCreateFlagBitsEXT" "VK_SHADER_CREATE_NO_TASK_SHADER_BIT_EXT"
pattern $mSHADER_CREATE_NO_TASK_SHADER_BIT_EXT :: forall {r}.
ShaderCreateFlagsEXT -> ((# #) -> r) -> ((# #) -> r) -> r
$bSHADER_CREATE_NO_TASK_SHADER_BIT_EXT :: ShaderCreateFlagsEXT
SHADER_CREATE_NO_TASK_SHADER_BIT_EXT = ShaderCreateFlagBitsEXT 0x00000008

-- No documentation found for Nested "VkShaderCreateFlagBitsEXT" "VK_SHADER_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT"
pattern $mSHADER_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT :: forall {r}.
ShaderCreateFlagsEXT -> ((# #) -> r) -> ((# #) -> r) -> r
$bSHADER_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT :: ShaderCreateFlagsEXT
SHADER_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT = ShaderCreateFlagBitsEXT 0x00000004

-- No documentation found for Nested "VkShaderCreateFlagBitsEXT" "VK_SHADER_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT"
pattern $mSHADER_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT :: forall {r}.
ShaderCreateFlagsEXT -> ((# #) -> r) -> ((# #) -> r) -> r
$bSHADER_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT :: ShaderCreateFlagsEXT
SHADER_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT = ShaderCreateFlagBitsEXT 0x00000002

-- No documentation found for Nested "VkShaderCreateFlagBitsEXT" "VK_SHADER_CREATE_DESCRIPTOR_HEAP_BIT_EXT"
pattern $mSHADER_CREATE_DESCRIPTOR_HEAP_BIT_EXT :: forall {r}.
ShaderCreateFlagsEXT -> ((# #) -> r) -> ((# #) -> r) -> r
$bSHADER_CREATE_DESCRIPTOR_HEAP_BIT_EXT :: ShaderCreateFlagsEXT
SHADER_CREATE_DESCRIPTOR_HEAP_BIT_EXT = ShaderCreateFlagBitsEXT 0x00000400

conNameShaderCreateFlagBitsEXT :: String
conNameShaderCreateFlagBitsEXT :: String
conNameShaderCreateFlagBitsEXT = String
"ShaderCreateFlagBitsEXT"

enumPrefixShaderCreateFlagBitsEXT :: String
enumPrefixShaderCreateFlagBitsEXT :: String
enumPrefixShaderCreateFlagBitsEXT = String
"SHADER_CREATE_"

showTableShaderCreateFlagBitsEXT :: [(ShaderCreateFlagBitsEXT, String)]
showTableShaderCreateFlagBitsEXT :: [(ShaderCreateFlagsEXT, String)]
showTableShaderCreateFlagBitsEXT =
  [
    ( ShaderCreateFlagsEXT
SHADER_CREATE_LINK_STAGE_BIT_EXT
    , String
"LINK_STAGE_BIT_EXT"
    )
  ,
    ( ShaderCreateFlagsEXT
SHADER_CREATE_64_BIT_INDEXING_BIT_EXT
    , String
"64_BIT_INDEXING_BIT_EXT"
    )
  ,
    ( ShaderCreateFlagsEXT
SHADER_CREATE_INDIRECT_BINDABLE_BIT_EXT
    , String
"INDIRECT_BINDABLE_BIT_EXT"
    )
  ,
    ( ShaderCreateFlagsEXT
SHADER_CREATE_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT
    , String
"FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT"
    )
  ,
    ( ShaderCreateFlagsEXT
SHADER_CREATE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_EXT
    , String
"FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_EXT"
    )
  ,
    ( ShaderCreateFlagsEXT
SHADER_CREATE_DISPATCH_BASE_BIT_EXT
    , String
"DISPATCH_BASE_BIT_EXT"
    )
  ,
    ( ShaderCreateFlagsEXT
SHADER_CREATE_NO_TASK_SHADER_BIT_EXT
    , String
"NO_TASK_SHADER_BIT_EXT"
    )
  ,
    ( ShaderCreateFlagsEXT
SHADER_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT
    , String
"REQUIRE_FULL_SUBGROUPS_BIT_EXT"
    )
  ,
    ( ShaderCreateFlagsEXT
SHADER_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT
    , String
"ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT"
    )
  ,
    ( ShaderCreateFlagsEXT
SHADER_CREATE_DESCRIPTOR_HEAP_BIT_EXT
    , String
"DESCRIPTOR_HEAP_BIT_EXT"
    )
  ]

instance Show ShaderCreateFlagBitsEXT where
  showsPrec :: Int -> ShaderCreateFlagsEXT -> ShowS
showsPrec =
    String
-> [(ShaderCreateFlagsEXT, String)]
-> String
-> (ShaderCreateFlagsEXT -> Word32)
-> (Word32 -> ShowS)
-> Int
-> ShaderCreateFlagsEXT
-> ShowS
forall a i.
Eq a =>
String
-> [(a, String)]
-> String
-> (a -> i)
-> (i -> ShowS)
-> Int
-> a
-> ShowS
enumShowsPrec
      String
enumPrefixShaderCreateFlagBitsEXT
      [(ShaderCreateFlagsEXT, String)]
showTableShaderCreateFlagBitsEXT
      String
conNameShaderCreateFlagBitsEXT
      (\(ShaderCreateFlagBitsEXT Word32
x) -> Word32
x)
      (\Word32
x -> String -> ShowS
showString String
"0x" ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word32 -> ShowS
forall a. Integral a => a -> ShowS
showHex Word32
x)

instance Read ShaderCreateFlagBitsEXT where
  readPrec :: ReadPrec ShaderCreateFlagsEXT
readPrec =
    String
-> [(ShaderCreateFlagsEXT, String)]
-> String
-> (Word32 -> ShaderCreateFlagsEXT)
-> ReadPrec ShaderCreateFlagsEXT
forall i a.
Read i =>
String -> [(a, String)] -> String -> (i -> a) -> ReadPrec a
enumReadPrec
      String
enumPrefixShaderCreateFlagBitsEXT
      [(ShaderCreateFlagsEXT, String)]
showTableShaderCreateFlagBitsEXT
      String
conNameShaderCreateFlagBitsEXT
      Word32 -> ShaderCreateFlagsEXT
ShaderCreateFlagBitsEXT

-- | VkShaderCodeTypeEXT - Indicate a shader code type
--
-- = Description
--
-- -   'SHADER_CODE_TYPE_BINARY_EXT' specifies shader code in an opaque,
--     implementation-defined binary format specific to the physical
--     device.
--
-- -   'SHADER_CODE_TYPE_SPIRV_EXT' specifies shader code in SPIR-V format.
--
-- = See Also
--
-- <https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_shader_object VK_EXT_shader_object>,
-- 'ShaderCreateInfoEXT'
newtype ShaderCodeTypeEXT = ShaderCodeTypeEXT Int32
  deriving newtype (ShaderCodeTypeEXT -> ShaderCodeTypeEXT -> Bool
(ShaderCodeTypeEXT -> ShaderCodeTypeEXT -> Bool)
-> (ShaderCodeTypeEXT -> ShaderCodeTypeEXT -> Bool)
-> Eq ShaderCodeTypeEXT
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ShaderCodeTypeEXT -> ShaderCodeTypeEXT -> Bool
== :: ShaderCodeTypeEXT -> ShaderCodeTypeEXT -> Bool
$c/= :: ShaderCodeTypeEXT -> ShaderCodeTypeEXT -> Bool
/= :: ShaderCodeTypeEXT -> ShaderCodeTypeEXT -> Bool
Eq, Eq ShaderCodeTypeEXT
Eq ShaderCodeTypeEXT =>
(ShaderCodeTypeEXT -> ShaderCodeTypeEXT -> Ordering)
-> (ShaderCodeTypeEXT -> ShaderCodeTypeEXT -> Bool)
-> (ShaderCodeTypeEXT -> ShaderCodeTypeEXT -> Bool)
-> (ShaderCodeTypeEXT -> ShaderCodeTypeEXT -> Bool)
-> (ShaderCodeTypeEXT -> ShaderCodeTypeEXT -> Bool)
-> (ShaderCodeTypeEXT -> ShaderCodeTypeEXT -> ShaderCodeTypeEXT)
-> (ShaderCodeTypeEXT -> ShaderCodeTypeEXT -> ShaderCodeTypeEXT)
-> Ord ShaderCodeTypeEXT
ShaderCodeTypeEXT -> ShaderCodeTypeEXT -> Bool
ShaderCodeTypeEXT -> ShaderCodeTypeEXT -> Ordering
ShaderCodeTypeEXT -> ShaderCodeTypeEXT -> ShaderCodeTypeEXT
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: ShaderCodeTypeEXT -> ShaderCodeTypeEXT -> Ordering
compare :: ShaderCodeTypeEXT -> ShaderCodeTypeEXT -> Ordering
$c< :: ShaderCodeTypeEXT -> ShaderCodeTypeEXT -> Bool
< :: ShaderCodeTypeEXT -> ShaderCodeTypeEXT -> Bool
$c<= :: ShaderCodeTypeEXT -> ShaderCodeTypeEXT -> Bool
<= :: ShaderCodeTypeEXT -> ShaderCodeTypeEXT -> Bool
$c> :: ShaderCodeTypeEXT -> ShaderCodeTypeEXT -> Bool
> :: ShaderCodeTypeEXT -> ShaderCodeTypeEXT -> Bool
$c>= :: ShaderCodeTypeEXT -> ShaderCodeTypeEXT -> Bool
>= :: ShaderCodeTypeEXT -> ShaderCodeTypeEXT -> Bool
$cmax :: ShaderCodeTypeEXT -> ShaderCodeTypeEXT -> ShaderCodeTypeEXT
max :: ShaderCodeTypeEXT -> ShaderCodeTypeEXT -> ShaderCodeTypeEXT
$cmin :: ShaderCodeTypeEXT -> ShaderCodeTypeEXT -> ShaderCodeTypeEXT
min :: ShaderCodeTypeEXT -> ShaderCodeTypeEXT -> ShaderCodeTypeEXT
Ord, Ptr ShaderCodeTypeEXT -> IO ShaderCodeTypeEXT
Ptr ShaderCodeTypeEXT -> Int -> IO ShaderCodeTypeEXT
Ptr ShaderCodeTypeEXT -> Int -> ShaderCodeTypeEXT -> IO ()
Ptr ShaderCodeTypeEXT -> ShaderCodeTypeEXT -> IO ()
ShaderCodeTypeEXT -> Int
(ShaderCodeTypeEXT -> Int)
-> (ShaderCodeTypeEXT -> Int)
-> (Ptr ShaderCodeTypeEXT -> Int -> IO ShaderCodeTypeEXT)
-> (Ptr ShaderCodeTypeEXT -> Int -> ShaderCodeTypeEXT -> IO ())
-> (forall b. Ptr b -> Int -> IO ShaderCodeTypeEXT)
-> (forall b. Ptr b -> Int -> ShaderCodeTypeEXT -> IO ())
-> (Ptr ShaderCodeTypeEXT -> IO ShaderCodeTypeEXT)
-> (Ptr ShaderCodeTypeEXT -> ShaderCodeTypeEXT -> IO ())
-> Storable ShaderCodeTypeEXT
forall b. Ptr b -> Int -> IO ShaderCodeTypeEXT
forall b. Ptr b -> Int -> ShaderCodeTypeEXT -> IO ()
forall a.
(a -> Int)
-> (a -> Int)
-> (Ptr a -> Int -> IO a)
-> (Ptr a -> Int -> a -> IO ())
-> (forall b. Ptr b -> Int -> IO a)
-> (forall b. Ptr b -> Int -> a -> IO ())
-> (Ptr a -> IO a)
-> (Ptr a -> a -> IO ())
-> Storable a
$csizeOf :: ShaderCodeTypeEXT -> Int
sizeOf :: ShaderCodeTypeEXT -> Int
$calignment :: ShaderCodeTypeEXT -> Int
alignment :: ShaderCodeTypeEXT -> Int
$cpeekElemOff :: Ptr ShaderCodeTypeEXT -> Int -> IO ShaderCodeTypeEXT
peekElemOff :: Ptr ShaderCodeTypeEXT -> Int -> IO ShaderCodeTypeEXT
$cpokeElemOff :: Ptr ShaderCodeTypeEXT -> Int -> ShaderCodeTypeEXT -> IO ()
pokeElemOff :: Ptr ShaderCodeTypeEXT -> Int -> ShaderCodeTypeEXT -> IO ()
$cpeekByteOff :: forall b. Ptr b -> Int -> IO ShaderCodeTypeEXT
peekByteOff :: forall b. Ptr b -> Int -> IO ShaderCodeTypeEXT
$cpokeByteOff :: forall b. Ptr b -> Int -> ShaderCodeTypeEXT -> IO ()
pokeByteOff :: forall b. Ptr b -> Int -> ShaderCodeTypeEXT -> IO ()
$cpeek :: Ptr ShaderCodeTypeEXT -> IO ShaderCodeTypeEXT
peek :: Ptr ShaderCodeTypeEXT -> IO ShaderCodeTypeEXT
$cpoke :: Ptr ShaderCodeTypeEXT -> ShaderCodeTypeEXT -> IO ()
poke :: Ptr ShaderCodeTypeEXT -> ShaderCodeTypeEXT -> IO ()
Storable, ShaderCodeTypeEXT
ShaderCodeTypeEXT -> Zero ShaderCodeTypeEXT
forall a. a -> Zero a
$czero :: ShaderCodeTypeEXT
zero :: ShaderCodeTypeEXT
Zero)

-- No documentation found for Nested "VkShaderCodeTypeEXT" "VK_SHADER_CODE_TYPE_BINARY_EXT"
pattern $mSHADER_CODE_TYPE_BINARY_EXT :: forall {r}. ShaderCodeTypeEXT -> ((# #) -> r) -> ((# #) -> r) -> r
$bSHADER_CODE_TYPE_BINARY_EXT :: ShaderCodeTypeEXT
SHADER_CODE_TYPE_BINARY_EXT = ShaderCodeTypeEXT 0

-- No documentation found for Nested "VkShaderCodeTypeEXT" "VK_SHADER_CODE_TYPE_SPIRV_EXT"
pattern $mSHADER_CODE_TYPE_SPIRV_EXT :: forall {r}. ShaderCodeTypeEXT -> ((# #) -> r) -> ((# #) -> r) -> r
$bSHADER_CODE_TYPE_SPIRV_EXT :: ShaderCodeTypeEXT
SHADER_CODE_TYPE_SPIRV_EXT = ShaderCodeTypeEXT 1

{-# COMPLETE
  SHADER_CODE_TYPE_BINARY_EXT
  , SHADER_CODE_TYPE_SPIRV_EXT ::
    ShaderCodeTypeEXT
  #-}

conNameShaderCodeTypeEXT :: String
conNameShaderCodeTypeEXT :: String
conNameShaderCodeTypeEXT = String
"ShaderCodeTypeEXT"

enumPrefixShaderCodeTypeEXT :: String
enumPrefixShaderCodeTypeEXT :: String
enumPrefixShaderCodeTypeEXT = String
"SHADER_CODE_TYPE_"

showTableShaderCodeTypeEXT :: [(ShaderCodeTypeEXT, String)]
showTableShaderCodeTypeEXT :: [(ShaderCodeTypeEXT, String)]
showTableShaderCodeTypeEXT =
  [ (ShaderCodeTypeEXT
SHADER_CODE_TYPE_BINARY_EXT, String
"BINARY_EXT")
  , (ShaderCodeTypeEXT
SHADER_CODE_TYPE_SPIRV_EXT, String
"SPIRV_EXT")
  ]

instance Show ShaderCodeTypeEXT where
  showsPrec :: Int -> ShaderCodeTypeEXT -> ShowS
showsPrec =
    String
-> [(ShaderCodeTypeEXT, String)]
-> String
-> (ShaderCodeTypeEXT -> Int32)
-> (Int32 -> ShowS)
-> Int
-> ShaderCodeTypeEXT
-> ShowS
forall a i.
Eq a =>
String
-> [(a, String)]
-> String
-> (a -> i)
-> (i -> ShowS)
-> Int
-> a
-> ShowS
enumShowsPrec
      String
enumPrefixShaderCodeTypeEXT
      [(ShaderCodeTypeEXT, String)]
showTableShaderCodeTypeEXT
      String
conNameShaderCodeTypeEXT
      (\(ShaderCodeTypeEXT Int32
x) -> Int32
x)
      (Int -> Int32 -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec Int
11)

instance Read ShaderCodeTypeEXT where
  readPrec :: ReadPrec ShaderCodeTypeEXT
readPrec =
    String
-> [(ShaderCodeTypeEXT, String)]
-> String
-> (Int32 -> ShaderCodeTypeEXT)
-> ReadPrec ShaderCodeTypeEXT
forall i a.
Read i =>
String -> [(a, String)] -> String -> (i -> a) -> ReadPrec a
enumReadPrec
      String
enumPrefixShaderCodeTypeEXT
      [(ShaderCodeTypeEXT, String)]
showTableShaderCodeTypeEXT
      String
conNameShaderCodeTypeEXT
      Int32 -> ShaderCodeTypeEXT
ShaderCodeTypeEXT

-- No documentation found for TopLevel "VkShaderRequiredSubgroupSizeCreateInfoEXT"
type ShaderRequiredSubgroupSizeCreateInfoEXT = PipelineShaderStageRequiredSubgroupSizeCreateInfo


type EXT_SHADER_OBJECT_SPEC_VERSION = 1

-- No documentation found for TopLevel "VK_EXT_SHADER_OBJECT_SPEC_VERSION"
pattern EXT_SHADER_OBJECT_SPEC_VERSION :: forall a . Integral a => a
pattern $mEXT_SHADER_OBJECT_SPEC_VERSION :: forall {r} {a}.
Integral a =>
a -> ((# #) -> r) -> ((# #) -> r) -> r
$bEXT_SHADER_OBJECT_SPEC_VERSION :: forall a. Integral a => a
EXT_SHADER_OBJECT_SPEC_VERSION = 1


type EXT_SHADER_OBJECT_EXTENSION_NAME = "VK_EXT_shader_object"

-- No documentation found for TopLevel "VK_EXT_SHADER_OBJECT_EXTENSION_NAME"
pattern EXT_SHADER_OBJECT_EXTENSION_NAME :: forall a . (Eq a, IsString a) => a
pattern $mEXT_SHADER_OBJECT_EXTENSION_NAME :: forall {r} {a}.
(Eq a, IsString a) =>
a -> ((# #) -> r) -> ((# #) -> r) -> r
$bEXT_SHADER_OBJECT_EXTENSION_NAME :: forall a. (Eq a, IsString a) => a
EXT_SHADER_OBJECT_EXTENSION_NAME = "VK_EXT_shader_object"