spirv-reflect-yaml 0.2 → 0.3
raw patch · 3 files changed
+114/−44 lines, 3 filesdep +spirv-enumdep ~spirv-reflect-types
Dependencies added: spirv-enum
Dependency ranges changed: spirv-reflect-types
Files
- ChangeLog.md +6/−0
- lib/Data/SpirV/Reflect/Yaml/Parsers.hs +103/−40
- spirv-reflect-yaml.cabal +5/−4
ChangeLog.md view
@@ -1,5 +1,11 @@ # Changelog for spirv-reflect-yaml +## [0.3] - 2024-07-07++* Update types and parser to `vulkan-sdk-1.3.283.0`.++[0.3]: https://gitlab.com/dpwiz/spirv-reflect/-/tree/v0.3-yaml+ ## [0.2] - 2022-09-04 * Update loader to match FFI types.
lib/Data/SpirV/Reflect/Yaml/Parsers.hs view
@@ -2,7 +2,10 @@ import Prelude hiding (id) +import Control.Applicative ((<|>)) import Data.Functor ((<&>))+import Data.Maybe (catMaybes)+import Data.SpirV.Enum qualified as SpirV import Data.Text (Text) import Data.Vector (Vector) import Data.Vector qualified as Vector@@ -16,11 +19,13 @@ import Data.SpirV.Reflect.DescriptorBinding qualified as DescriptorBinding import Data.SpirV.Reflect.DescriptorSet (DescriptorSet) import Data.SpirV.Reflect.DescriptorSet qualified as DescriptorSet-import Data.SpirV.Reflect.Enums qualified as Enums+import Data.SpirV.Reflect.Enums qualified as Reflect import Data.SpirV.Reflect.InterfaceVariable (InterfaceVariable) import Data.SpirV.Reflect.InterfaceVariable qualified as InterfaceVariable import Data.SpirV.Reflect.Module (Module) import Data.SpirV.Reflect.Module qualified as Module+import Data.SpirV.Reflect.SpecializationConstant (SpecializationConstant)+import Data.SpirV.Reflect.SpecializationConstant qualified as SpecializationConstant import Data.SpirV.Reflect.Traits qualified as Traits import Data.SpirV.Reflect.TypeDescription (TypeDescription) import Data.SpirV.Reflect.TypeDescription qualified as TypeDescription@@ -32,7 +37,7 @@ moduleP :: NodeParser Module moduleP = YAML.withMap "Module" \m -> do- generator <- m .: "generator" <&> Enums.Generator+ generator <- m .: "generator" <&> Reflect.Generator entry_point_name <- m .: "entry_point_name" entry_point_id <- m .: "entry_point_id" source_language <- m .: "source_language"@@ -44,29 +49,35 @@ input_variables <- m .? "input_variables" `seqOf` interfaceVariableP output_variables <- m .? "output_variables" `seqOf` interfaceVariableP push_constants <- m .? "push_constants" `seqOf` blockVariableP+ spec_constants <- m .? "spec_constants" `seqOf` specializationConstantP pure Module.Module{..} descriptorBindingP :: NodeParser DescriptorBinding descriptorBindingP = YAML.withMap "DescriptorBinding" \m -> do- spirv_id <- m .? "spirv_id"- name <- m .: "name"- binding <- m .: "binding"- input_attachment_index <- m .: "input_attachment_index"- set <- m .: "set"- descriptor_type <- m .: "descriptor_type" <&> Enums.DescriptorType- resource_type <- m .: "resource_type" <&> Enums.ResourceFlagBits- image <- m .: "image" >>= traitsImageP- block <- m .? "block" >>= traverse blockVariableP- array <- m .: "array" >>= traitsArrayP- count <- m .? "count"- accessed <- m .: "accessed"- uav_counter_id <- m .: "uav_counter_id"- uav_counter_binding <- m .? "uav_counter_binding" >>= traverse descriptorBindingP- type_description <- m .? "type_description" >>= traverse typeDescriptionP- word_offset <- m .: "word_offset" >>= descriptorBindingWordOffsetP- decoration_flags <- m .? "decoration_flags" <&> maybe Enums.DECORATION_NONE Enums.DecorationFlagBits+ spirv_id <- m .? "spirv_id"+ name <- m .| "name"+ binding <- m .: "binding"+ input_attachment_index <- m .: "input_attachment_index"+ set <- m .: "set"+ descriptor_type <- m .: "descriptor_type" <&> Reflect.DescriptorType+ resource_type <- m .: "resource_type" <&> Reflect.ResourceFlagBits+ image <- m .: "image" >>= traitsImageP+ block <- m .? "block" >>= traverse blockVariableP+ array <- m .: "array" >>= traitsArrayP+ count <- m .? "count"+ accessed <- m .: "accessed"+ uav_counter_id <- m .: "uav_counter_id"+ uav_counter_binding <- m .? "uav_counter_binding" >>= traverse descriptorBindingP+ byte_address_buffer_offsets <- m .? "byte_address_buffer_offsets" `seqOf` YAML.withInt "byte_address_buffer_offset" (pure . fromInteger)+ type_description <- m .? "type_description" >>= traverse typeDescriptionP+ word_offset <- m .: "word_offset" >>= descriptorBindingWordOffsetP+ decoration_flags <- m .? "decoration_flags" <&> maybe Reflect.DECORATION_NONE Reflect.DecorationFlagBits+ user_type <- m .? "user_type" >>= traverse userTypeP pure DescriptorBinding.DescriptorBinding{..} +userTypeP :: NodeParser Reflect.UserType+userTypeP = YAML.withStr "UserType" $ maybe (fail "Unknown UserType") pure . Reflect.userTypeId+ descriptorBindingWordOffsetP :: NodeParser DescriptorBinding.WordOffset descriptorBindingWordOffsetP = YAML.withMap "DescriptorBinding.WordOffset" \m -> do binding <- m .: "binding"@@ -75,14 +86,16 @@ typeDescriptionP :: NodeParser TypeDescription typeDescriptionP = YAML.withMap "TypeDescription" \m -> do- id <- m .? "id"- op <- m .? "op" <&> fmap Enums.Op- type_name <- m .? "type_name"- struct_member_name <- m .? "struct_member_name"- storage_class <- m .: "storage_class" <&> Enums.StorageClass- type_flags <- m .? "type_flags" <&> maybe Enums.TYPE_FLAG_UNDEFINED Enums.TypeFlagBits- traits <- m .: "traits" >>= traverse typeDescriptionTraitsP- members <- m .? "members" `seqOf` typeDescriptionP+ id <- m .? "id"+ op <- m .? "op" <&> fmap SpirV.Op+ type_name <- m .? "type_name"+ struct_member_name <- m .? "struct_member_name"+ storage_class <- m .: "storage_class" <&> SpirV.StorageClass+ type_flags <- m .? "type_flags" <&> maybe Reflect.TYPE_FLAG_UNDEFINED Reflect.TypeFlagBits+ traits <- m .: "traits" >>= traverse typeDescriptionTraitsP <&> \ts -> if ts == Just TypeDescription.emptyTraits then Nothing else ts+ copied <- m .? "copied" -- BUG: YAML has no "copied" field+ members <- m .? "members" `seqOfMaybes` alt forwardPointerP (fmap Just . typeDescriptionP) -- BUG: YAML uses `[forward pointer]` marker for recursive structures.+ struct_type_description <- m .? "struct_type_description" >>= traverse typeDescriptionP pure TypeDescription.TypeDescription{..} typeDescriptionTraitsP :: NodeParser TypeDescription.Traits@@ -103,14 +116,20 @@ spirv_id <- m .? "spirv_id" name <- m .? "name" location <- m .: "location"- storage_class <- m .: "storage_class" <&> Enums.StorageClass+ component <- m .? "component"+ storage_class <- m .: "storage_class" <&> SpirV.StorageClass semantic <- m .: "semantic"- decoration_flags <- m .: "decoration_flags" <&> Enums.DecorationFlagBits- built_in <- m .: "built_in" <&> Enums.BuiltIn+ decoration_flags <- m .: "decoration_flags" <&> Reflect.DecorationFlagBits numeric <- m .: "numeric" >>= traitsNumericP array <- m .: "array" >>= traitsArrayP- members <- m .? "members" `seqOf` interfaceVariableP- format <- m .: "format" <&> Enums.Format+ members <- m .? "members" `seqOfMaybes` alt (fmap Just . interfaceVariableP) recursiveP+ built_in <-+ -- BUG: https://github.com/KhronosGroup/SPIRV-Reflect/issues/269+ if null members then+ m .? "built_in" <&> fmap SpirV.BuiltIn+ else+ pure Nothing+ format <- m .: "format" <&> Reflect.Format type_description <- m .? "type_description" >>= traverse typeDescriptionP word_offset <- m .: "word_offset" >>= interfaceVariableWordOffsetP pure InterfaceVariable.InterfaceVariable{..}@@ -128,13 +147,26 @@ absolute_offset <- m .: "absolute_offset" size <- m .: "size" padded_size <- m .: "padded_size"- decorations <- m .: "decorations" <&> Enums.DecorationFlagBits+ decorations <- m .: "decorations" <&> Reflect.DecorationFlagBits numeric <- m .: "numeric" >>= traitsNumericP array <- m .: "array" >>= traitsArrayP- members <- m .? "members" `seqOf` blockVariableP+ members <- m .? "members" `seqOfMaybes` alt recursiveP (fmap Just . blockVariableP) type_description <- m .? "type_description" >>= traverse typeDescriptionP+ word_offset <- m .? "word_offset" >>= traverse blockVariableWordOffsetP pure BlockVariable.BlockVariable{..} +blockVariableWordOffsetP :: NodeParser BlockVariable.WordOffset+blockVariableWordOffsetP = YAML.withMap "BlockVariable.WordOffset" \m -> do+ offset <- m .: "offset"+ pure BlockVariable.WordOffset{..}++specializationConstantP :: NodeParser SpecializationConstant+specializationConstantP = YAML.withMap "SpecializationConstant" \m -> do+ spirv_id <- m .? "spirv_id"+ constant_id <- m .: "constant_id"+ name <- m .? "name"+ pure SpecializationConstant.SpecializationConstant{..}+ -------------- traitsNumericP :: NodeParser Traits.Numeric@@ -146,8 +178,8 @@ traitsScalarP :: NodeParser Traits.Scalar traitsScalarP = YAML.withMap "Scalar" \m -> do- width <- m .: "width"- signedness <- m .: "signedness"+ width <- m .: "width"+ signed <- m .: "signedness" <&> (/= (0 :: Word)) pure Traits.Scalar{..} traitsVectorP :: NodeParser Traits.Vector@@ -166,23 +198,36 @@ traitsArrayP = YAML.withMap "Array" \m -> do dims_count <- m .: "dims_count" dims <- m .: "dims" <&> Storable.fromList- stride <- m .? "stride"+ stride <- m .? "stride" <&> \stride -> if stride == Just 0 then Nothing else stride pure Traits.Array{..} traitsImageP :: NodeParser Traits.Image traitsImageP = YAML.withMap "Image" \m -> do- dim <- m .: "dim" <&> Enums.Dim+ dim <- m .: "dim" <&> SpirV.Dim depth <- m .: "depth" arrayed <- m .: "arrayed" ms <- m .: "ms" sampled <- m .: "sampled"- image_format <- m .: "image_format" <&> Enums.ImageFormat+ image_format <- m .: "image_format" <&> SpirV.ImageFormat pure Traits.Image{..} +recursiveP :: NodeParser (Maybe a)+recursiveP = \case+ YAML.Sequence _pos _tag [YAML.Scalar _pos2 (YAML.SStr "recursive")] -> pure Nothing+ _ -> fail "Unexpected token"++forwardPointerP :: NodeParser (Maybe a)+forwardPointerP = \case+ YAML.Sequence _pos _tag [YAML.Scalar _pos2 (YAML.SStr "forward pointer")] -> pure Nothing+ _ -> fail "Unexpected token"+ type NodeParser a = YAML.Node YAML.Pos -> YAML.Parser a +alt :: NodeParser a -> NodeParser a -> NodeParser a+alt a b n = a n <|> b n+ (.?) :: YAML.FromYAML a => YAML.Mapping YAML.Pos@@ -190,6 +235,13 @@ -> YAML.Parser (Maybe a) o .? v = o YAML..:? v +(.|)+ :: (YAML.FromYAML a, Monoid a)+ => YAML.Mapping YAML.Pos+ -> Text+ -> YAML.Parser a+o .| v = o YAML..:? v YAML..!= mempty+ seqOf :: YAML.Parser (Maybe (YAML.Node YAML.Pos)) -> NodeParser a@@ -199,4 +251,15 @@ Nothing -> pure mempty Just items ->- YAML.withSeq "seqOf" (traverse nodeP . Vector.fromList) items+ YAML.withSeq "seqOf" (fmap Vector.fromList . traverse nodeP) items++seqOfMaybes+ :: YAML.Parser (Maybe (YAML.Node YAML.Pos))+ -> NodeParser (Maybe a)+ -> YAML.Parser (Vector a)+seqOfMaybes mappingP nodeP =+ mappingP >>= \case+ Nothing ->+ pure mempty+ Just items ->+ YAML.withSeq "seqOf" (fmap (Vector.fromList . catMaybes) . traverse nodeP) items
spirv-reflect-yaml.cabal view
@@ -1,11 +1,11 @@ cabal-version: 1.12 --- This file has been generated from package.yaml by hpack version 0.34.4.+-- This file has been generated from package.yaml by hpack version 0.36.0. -- -- see: https://github.com/sol/hpack name: spirv-reflect-yaml-version: 0.2+version: 0.3 synopsis: YAML loader for spirv-reflect tool. category: Graphics author: IC Rainbow@@ -52,7 +52,8 @@ HsYAML , base >=4.7 && <5 , bytestring- , spirv-reflect-types >=0.2+ , spirv-enum ==0.1.*+ , spirv-reflect-types ==0.3.* , text , vector default-language: Haskell2010@@ -86,6 +87,6 @@ , spirv-reflect-yaml , tasty , tasty-hunit+ default-language: Haskell2010 if !flag(tests) buildable: False- default-language: Haskell2010