h&\      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMN O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v wxyz{|}~ Safe-Inferred.!$%&'()./014789;<> E vulkan-utilsCreate an expression which checks the function pointers for all the Vulkan commands depended upon by the specified list of function names.It returns a list of function names corresponding to those functions with null pointers.Your program can use this function to fail early if a command couldn't be loaded for some reason (missing extension or layer for example).!One can create a function called  checkCommands with the following:  [d| checkCommands = $(checkCommandsExp ['withInstance, 'cmdDraw, ...]) |] It has the type 'IsString a => Instance -> Device -> [a]It looks basically like inst dev -> [ name | True <- [ nullFunPtr == pVkCreateDevice inst , nullFunPtr == pVkCreateFence dev .. ] | name <- [ "vkCreateDevice" , "vkCreateFence" .. ] ]  vulkan-utilsGiven instance and device accessors and a function, find the function pointer accessor names which it depends oncommandNames ['pVkCreateDevice, 'pVkDestroyDevice] ['pVkCreateFence] (mkName "withDevice")[InstanceCmd Vulkan.Dynamic.pVkCreateDevice,InstanceCmd Vulkan.Dynamic.pVkDestroyDevice] vulkan-utilsGet the C name of a function6commandString (DeviceCmd (mkName "pVkCreateInstance"))"vkCreateInstance" vulkan-utilsA list of potential sets of vulkan commands this name depends on, not all of them will be valid names.commandCandidates "withDevice"["pVkAllocateDevice","pVkFreeDevice","pVkCreateDevice","pVkDestroyDevice"]&commandCandidates "waitSemaphoresSafe"["pVkWaitSemaphores"] commandCandidates "useCmdBuffer"'["pVkBeginCmdBuffer","pVkEndCmdBuffer"]!commandCandidates "withSemaphore"["pVkAllocateSemaphore","pVkFreeSemaphore","pVkCreateSemaphore","pVkDestroySemaphore"] vulkan-utils"Get the record accessors of a type.$(lift . fmap show =<< accessorNames ''Device)["Vulkan.Core10.Handles.deviceHandle","Vulkan.Core10.Handles.deviceCmds"] vulkan-utils The names of functions from the vulkan' package. Unknown commands are ignored Safe-Inferred*!$%&'()./014789;<> , vulkan-utilsA debug callback the same as  except it will call abort when -VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT is set. vulkan-utilsA debug callback which prints the message prefixed with "Validation: " to stderr. vulkan-utils Assign a name to a handle using , note that the VK_EXT_debug_utils extension must be enabled. Safe-Inferred+!$%&'()./014789;<> vulkan-utils%Convert an OpenGL format enum into a internalFormat 0x8051Just FORMAT_R8G8B8_UNORM Safe-Inferred*!$%&'()./014789;<>m Safe-Inferred*!$%&'()./014789;<> vulkan-utilsFrom a list of things, take all the required things and as many optional things as possible. vulkan-utilsLike .Will throw an 'IOError in the case of missing things. Details on missing things will be reported in stderr.5This is useful in dealing with layers and extensions.  vulkan-utils/Show valies as a union of their individual bitsshowBits @Int 5 "1 .|. 4"showBits @Int 0 "zeroBits"(import Vulkan.Core10.Enums.QueueFlagBits3showBits (QUEUE_COMPUTE_BIT .|. QUEUE_GRAPHICS_BIT)*"QUEUE_GRAPHICS_BIT .|. QUEUE_COMPUTE_BIT" vulkan-utilsThe list of bits which are set  vulkan-utils-Check if the intersection of bits is non-zero vulkan-utilsWhat do we have available vulkan-utilsOptional desired elements vulkan-utilsRequired desired elements vulkan-utils(Missing optional elements, Either (missing required elements) or (all required elements and as many optional elements as possible) vulkan-utils.What are we sorting (Used for a debug message) vulkan-utilsWhat do we have available vulkan-utilsOptional desired elements vulkan-utilsRequired desired elements vulkan-utilsAll the required elements and as many optional elements as possible, as well as the missing optional elements.   Safe-Inferred*!$%&'()./014789;<>F vulkan-utilsRequirements for a  to be assigned a family by .+To assign to a specific queue family index f: )queueSpecFamilyPredicate = i _ -> i == f To assign to any queue family which supports compute operations: let isComputeQueue q = QUEUE_COMPUTE_BIT .&&. queueFlags q in QueueSpec priority (_index q -> pure (isComputeQueue q))  vulkan-utilsGiven a  and a set of requirements for queues, calculate an assignment of queues to queue families and return information with which to create a . and also a function to extract the requested s from the device.,You may want to create a custom type with a % instance to store your queues like: data MyQueues q = MyQueues { computeQueue :: q , graphicsAndPresentQueue :: q , transferQueue :: q } myQueueSpecs :: MyQueues QueueSpec myQueueSpecs = MyQueues { computeQueue = QueueSpec 0.5 isComputeQueueFamily , graphicsAndPresentQueue = QueueSpec 1 isPresentQueueFamily , transferQueue = QueueSpec 1 isTransferOnlyQueueFamily } Note, this doesn't permit differentiating queue family assignment based on whether or not the queue is protected. vulkan-utilsDoes this queue have  set and not  or  vulkan-utils Just 1; "b" -> Just 2; _ -> Nothing}, \case {"b" -> Just 3; _ -> Nothing}, \case {"a" -> Just 4; _ -> Nothing}] [[2,3,4]] vulkan-utilsSelect an element from the list according to some predicate, and return that element along with the decremented list. vulkan-utilsA set of requirements for s to be created vulkan-utils A set of  s to pass to $A function to extract the requested  s from the  created with the s* if it wasn't possible to satisfy all the s vulkan-utilsHow many of each  are available vulkan-utilsWhich s can each element use vulkan-utilsA list of assignments, each element in this list has the length of the requirements list   Safe-Inferred-!$%&'()./014789;<>([ vulkan-utilsEnough information to focus on any structure within a Vulkan structure chain. vulkan-utilsIf the given structure can be found within a chain, return a lens to it. Otherwise, return . vulkan-utilsIs this chain empty?% vulkan-utils The minimum value to be accepted& vulkan-utilsThe value we got, less than unsatisfiedMinumum( vulkan-utilsAll the requirements were met) vulkan-utilsDidn't attempt this check because it required getPhysicalDeviceProperties2 which wasn't loaded* vulkan-utilsDidn't attempt this check because it required getPhysicalDeviceFeatures2 which wasn't loaded+ vulkan-utilsA Layer was not found, vulkan-utils2A device version didn't meet the minimum requested- vulkan-utils6The instance version didn't meet the minimum requested. vulkan-utils1A layer version didn't meet the minimum requested/ vulkan-utilsA feature was missing0 vulkan-utils&A propery was not an appropriate value1 vulkan-utilsA device extension was missing2 vulkan-utilsA device extension was found but the version didn't meet requirements3 vulkan-utils!An instance extension was missing4 vulkan-utilsAn instance extension was found but the version didn't meet requirements vulkan-utilsInsert the settings of the requirements in to the provided instance create info vulkan-utils Generate  from some requirements.The returned struct chain will enable all required features and extensions.7 vulkan-utilsGenerate a string describing which requirements were not met, if everything was satisfied return . vulkan-utilsMake a lookup function for extensions in layers. Ignores layers not present in the instance/device vulkan-utils#There is no Semigroup instance for  in base5 vulkan-utilsRequired requests vulkan-utilsOptional requests vulkan-utilsAn , this will be returned appropriately modified by the requirements6 vulkan-utilsRequired requests vulkan-utilsOptional requests vulkan-utilsA deviceCreateInfo with no extensions. If you need elements in the struct chain you can add them later with  vulkan-utilsLookup an extension vulkan-utilsThe requirement to test vulkan-utils The result vulkan-utilsPass  for ( extensions, pass a PhysicalDevice for  extensions.#$%&'(-.+43,)/*021567856'(-.+43,)/*021#$%&78 Safe-Inferred+!"$%&'()./014789;<>0(B vulkan-utilsLike C: except it will create a debug utils messenger (from the VK_EXT_debug_utils extension).If the VK_EXT_validation_features extension (from the VK_LAYER_KHRONOS_validation layer) is available is it will be enabled and best practices messages enabled.C vulkan-utils+Create an 'Instance from some requirements.Will throw an 'IOError in the case of unsatisfied non-optional requirements. Unsatisfied requirements will be listed on stderr.D vulkan-utils Create a  from some requirements.Will throw an 'IOError in the case of unsatisfied non-optional requirements. Unsatisfied requirements will be listed on stderr.E vulkan-utils Get a single ! deciding with a scoring functionPass a function which will extract any required values from a device in the spirit of parse-don't-validate. Also provide a function to compare these results for sorting multiple suitable devices.As an example, the suitability function could return a tuple of device memory and the compute queue family index, and the scoring function could be  to select devices based on their memory capacity. Consider using : to find your desired queues in the suitability function.%Pehaps also use the functionality in  and return the  too.)If no devices are deemed suitable then a  NoSuchThing  is thrown.F vulkan-utilsExtract the name of a  with B vulkan-utilsRequired vulkan-utilsOptionalC vulkan-utilsRequired vulkan-utilsOptionalD vulkan-utilsRequired vulkan-utilsOptionalE vulkan-utilsA suitability funcion for a ,  if it is not to be chosen. vulkan-utils$Scoring function to rate this result vulkan-utilsThe score and the deviceBCDEFCBDEF Safe-Inferred-!$%&'()./014789;<>=G vulkan-utils/Parse a requirement and produce an appropriate DeviceVersionRequirement s are specified by in the form  major. minor[. patch]DeviceFeatureRequirements are specified in the form  typename. and produce a % which checks and sets this feature.DevicePropertyRequirements are specified like feature requirements except with an additional description of the constraint. This may be any ofmyFunctionName: To check with an in-scope function taking the property type and returning > 1234: To indicate a minimum bound on a integral property>= 123?: To indicate an inclusive minimum bound on a integral property& SOMETHING_BIT: To indicate that the specified bit must be present in the bitmask valueDeviceExtensionRequirements are specified in the form  extensionname optionalversion.  extensionname must start with VK_,. The version will be compared against the  specVersion field of the ExtensionProperties record.Names may be qualified.8The separator between the type and member can be any of . :: : -> or any amount of spacelet r = [req|PhysicalDeviceRayTracingPipelineFeaturesKHR.rayTracingPipeline|] featureName r"PhysicalDeviceRayTracingPipelineFeaturesKHR.rayTracingPipeline"7let r = [req|PhysicalDeviceVulkan11Features.multiview|] featureName r*"PhysicalDeviceVulkan11Features.multiview"let r = [reqs| PhysicalDeviceTimelineSemaphoreFeatures.timelineSemaphore |]featureName <$> r=["PhysicalDeviceTimelineSemaphoreFeatures.timelineSemaphore"];let r = [req|PhysicalDeviceMultiviewFeatures.doesn'tExist|]... @ Couldn't find member "doesn'tExist" in Vulkan.Core11.Promoted_From_VK_KHR_multiview.PhysicalDeviceMultiviewFeatures...%let r = [req|Doesn'tExist.multiview|]..., @ Couldn't find type name "Doesn'tExist"...let r = [req|Either.multiview|]... @ Data.Either.Either doesn't seem to be the type of a record constructor...H vulkan-utilsLike H except that this parses a list of newline separated requirements It ignores Blank linesLines beginning with -- or # vulkan-utilsparse ""Nothingparse "Foo->bar"Just (Feature ["Foo"] "bar")parse "V.Foo.bar" Just (Feature ["V","Foo"] "bar")parse "V.E.Foo bar"$Just (Feature ["V","E","Foo"] "bar") parse "1.2"Just (Version 4202496) parse "1 2 1"Just (Version 4202497)parse "Foo.bar >= 10"&Just (Property ["Foo"] "bar" (GTE 10))parse "V.Foo.bar & A.B.C_BIT">NOPONP Safe-Inferred*!$%&'()./014789;<>?. vulkan-utils tool name vulkan-utilswarning vulkan-utilserror vulkan-utils'Spir-V bytecode with warnings or errors vulkan-utilsSpir-V bytecode  Safe-Inferred*!$%&'()./014789;<>?QRSRQS  Safe-Inferred-!$%&'()./014789;<>E T vulkan-utilsT< performs very simple interpolation of Haskell values into s.)Interpolated variables are prefixed with $3They can optionally be surrounded with braces like ${foo}5Interpolated variables are converted to strings with  To escape a $ use \$+let foo = 123 in $(interpExp "hello, $foo") "hello, 123"1let foo = "world" in $(interpExp "hello, \\$foo") "hello, $foo"4let foo = "world" in $(interpExp "hello\r\n\rworld")"hello\r\n\rworld" vulkan-utils=Extract variables and literals from string to be interpolatedparse ""[]parse "hello $world"[Right "hello ",Left "world"]parse "$hello$world"eft "hello",Left "world"] parse "$" [Right "$"] parse "hi" [Right "hi"] parse "h$hi"[Right "h",Left "hi"] parse "$$hi"[Right "$",Left "hi"] parse "$1" [Right "$1"] parse "$$$" [Right "$$$"] parse "\\" [Right "\\"] parse "\\$" [Right "$"] parse "\\$hi" [Right "$hi"]parse "\\\\$hi"[Right "\\$hi"] parse "\\hi"[Right "\\hi"]parse "$hi\\$foo"[Left "hi",Right "$foo"]parse "hello, \\$foo"[Right "hello, $foo"]parse "${fo'o}bar"[Left "fo'o",Right "bar"] parse "\\" [Right "\\"] parse "\\\\$" [Right "\\$"] parse "$" [Right "$"]TT Safe-Inferred*!$%&'()./014789;<>HI vulkan-utils9 is a QuasiQuoter which produces HLSL source code with a #line directive inserted so that error locations point to the correct location in the Haskell source file. It also permits basic string interpolation.)Interpolated variables are prefixed with $3They can optionally be surrounded with braces like ${foo}5Interpolated variables are converted to strings with  To escape a $ use \$An explicit example ( interactive is from doctest):6let foo = 450 :: Int in [hlsl|const float foo = $foo|]3"#line 77 \"\"\nconst float foo = 450"Note that line number will be thrown off if any of the interpolated variables contain newlines. Safe-Inferred*!$%&'()./014789;<>K vulkan-utils7 is a QuasiQuoter which produces GLSL source code with #line directives inserted so that error locations point to the correct location in the Haskell source file. It also permits basic string interpolation.)Interpolated variables are prefixed with $3They can optionally be surrounded with braces like ${foo}5Interpolated variables are converted to strings with  To escape a $ use \$An explicit example ( interactive is from doctest):5let version = 450 :: Int in [glsl|#version $version|]"#version 450\n#extension GL_GOOGLE_cpp_style_line_directive : enable\n#line 72 \"\"\n"Note that line number will be thrown off if any of the interpolated variables contain newlines. Safe-Inferred*!$%&'()./014789;<>L" Safe-Inferred*!$%&'()./014789;<>P  vulkan-utilsCompile a GLSL/HLSL shader to SPIR-V using glslc (from the shaderc project)Messages are converted to GHC warnings or errors depending on compilation success. vulkan-utils0Compile a GLSL/HLSL shader to spir-v using glslc vulkan-utils"Argument to pass to `--target-spv` vulkan-utils,Argument to specify between glsl/hlsl shader vulkan-utilsstage vulkan-utils6Argument to specify entry-point function name for hlsl vulkan-utilsglsl or hlsl shader code vulkan-utilsSpir-V bytecode vulkan-utilsSource location vulkan-utils"Argument to pass to `--target-spv` vulkan-utils,Argument to specify between glsl/hlsl shader vulkan-utilsstage vulkan-utils6Argument to specify entry-point function name for hlsl vulkan-utilsglsl or hlsl shader code vulkan-utils'Spir-V bytecode with warnings or errors  Safe-Inferred*!$%&'()./014789;<>aU vulkan-utilsU9 is a QuasiQuoter which produces HLSL source code with a #line directive inserted so that error locations point to the correct location in the Haskell source file. It also permits basic string interpolation.)Interpolated variables are prefixed with $3They can optionally be surrounded with braces like ${foo}5Interpolated variables are converted to strings with  To escape a $ use \$*It is intended to be used in concert with d like so myConstant = 3.141 -- Note that this will have to be in a different module myFragmentShader = $(compileShaderQ Nothing "frag" Nothing [hlsl| static const float myConstant = ${myConstant}; float main (){ return myConstant; } |]) An explicit example ( interactive is from doctest):6let foo = 450 :: Int in [hlsl|const float foo = $foo|]3"#line 57 \"\"\nconst float foo = 450"Note that line number will be thrown off if any of the interpolated variables contain newlines.V vulkan-utils*QuasiQuoter for creating a compute shader.Equivalent to calling 4$(compileShaderQ Nothing "comp" Nothing [hlsl|...|]) without interpolation support.W vulkan-utils+QuasiQuoter for creating a fragment shader.Equivalent to calling 4$(compileShaderQ Nothing "frag" Nothing [hlsl|...|]) without interpolation support.X vulkan-utils+QuasiQuoter for creating a geometry shader.Equivalent to calling 4$(compileShaderQ Nothing "geom" Nothing [hlsl|...|]) without interpolation support.Y vulkan-utils7QuasiQuoter for creating a tessellation control shader.Equivalent to calling 4$(compileShaderQ Nothing "tesc" Nothing [hlsl|...|]) without interpolation support.Z vulkan-utils:QuasiQuoter for creating a tessellation evaluation shader.Equivalent to calling 4$(compileShaderQ Nothing "tese" Nothing [hlsl|...|]) without interpolation support.[ vulkan-utils)QuasiQuoter for creating a vertex shader.Equivalent to calling 4$(compileShaderQ Nothing "vert" Nothing [hlsl|...|]) without interpolation support.\ vulkan-utils1QuasiQuoter for creating a ray generation shader.Equivalent to calling <$(compileShaderQ (Just "spv1.4") "rgen" Nothing [hlsl|...|]) without interpolation support.] vulkan-utils0QuasiQuoter for creating an intersection shader.Equivalent to calling <$(compileShaderQ (Just "spv1.4") "rint" Nothing [hlsl|...|]) without interpolation support.^ vulkan-utils+QuasiQuoter for creating an any-hit shader.Equivalent to calling =$(compileShaderQ (Just "spv1.4") "rahit" Nothing [hlsl|...|]) without interpolation support._ vulkan-utils.QuasiQuoter for creating a closest hit shader.Equivalent to calling =$(compileShaderQ (Just "spv1.4") "rchit" Nothing [hlsl|...|]) without interpolation support.` vulkan-utils'QuasiQuoter for creating a miss shader.Equivalent to calling =$(compileShaderQ (Just "spv1.4") "rmiss" Nothing [hlsl|...|]) without interpolation support.a vulkan-utils+QuasiQuoter for creating a callable shader.Equivalent to calling =$(compileShaderQ (Just "spv1.4") "rcall" Nothing [hlsl|...|]) without interpolation support.b vulkan-utils'QuasiQuoter for creating a task shader.Equivalent to calling 4$(compileShaderQ Nothing "task" Nothing [hlsl|...|]) without interpolation support.c vulkan-utils'QuasiQuoter for creating a mesh shader.Equivalent to calling 4$(compileShaderQ Nothing "mesh" Nothing [hlsl|...|]) without interpolation support.d vulkan-utils,Compile a HLSL shader to spir-v using glslc.Messages are converted to GHC warnings or errors depending on compilation success.e vulkan-utils,Compile a HLSL shader to spir-v using glslc.d vulkan-utils"Argument to pass to `--target-env` vulkan-utilsstage vulkan-utilsArgument to pass to `-fentry-point=` to specify entry-point function name vulkan-utilshlsl shader code vulkan-utilsSpir-V bytecodee vulkan-utilsSource location vulkan-utils"Argument to pass to `--target-env` vulkan-utilsstage vulkan-utilsArgument to pass to `-fentry-point=` to specify entry-point function name vulkan-utilshlsl shader code vulkan-utils'Spir-V bytecode with warnings or errorsUVWXYZ[\]^_`abcdeUVWXYZ[\]^_`abcde  Safe-Inferred*!$%&'()./014789;<>rf vulkan-utilsf7 is a QuasiQuoter which produces GLSL source code with #line directives inserted so that error locations point to the correct location in the Haskell source file. It also permits basic string interpolation.)Interpolated variables are prefixed with $3They can optionally be surrounded with braces like ${foo}5Interpolated variables are converted to strings with  To escape a $ use \$*It is intended to be used in concert with u like so myConstant = 3.141 -- Note that this will have to be in a different module myFragmentShader = $(compileShaderQ Nothing "frag" [glsl| #version 450 const float myConstant = ${myConstant}; main (){ } |]) An explicit example ( interactive is from doctest):5let version = 450 :: Int in [glsl|#version $version|]"#version 450\n#extension GL_GOOGLE_cpp_style_line_directive : enable\n#line 52 \"\"\n"Note that line number will be thrown off if any of the interpolated variables contain newlines.g vulkan-utils*QuasiQuoter for creating a compute shader.Equivalent to calling ,$(compileShaderQ Nothing "comp" [glsl|...|]) without interpolation support.h vulkan-utils+QuasiQuoter for creating a fragment shader.Equivalent to calling ,$(compileShaderQ Nothing "frag" [glsl|...|]) without interpolation support.i vulkan-utils+QuasiQuoter for creating a geometry shader.Equivalent to calling ,$(compileShaderQ Nothing "geom" [glsl|...|]) without interpolation support.j vulkan-utils7QuasiQuoter for creating a tessellation control shader.Equivalent to calling ,$(compileShaderQ Nothing "tesc" [glsl|...|]) without interpolation support.k vulkan-utils:QuasiQuoter for creating a tessellation evaluation shader.Equivalent to calling ,$(compileShaderQ Nothing "tese" [glsl|...|]) without interpolation support.l vulkan-utils)QuasiQuoter for creating a vertex shader.Equivalent to calling ,$(compileShaderQ Nothing "vert" [glsl|...|]) without interpolation support.m vulkan-utils1QuasiQuoter for creating a ray generation shader.Equivalent to calling 4$(compileShaderQ (Just "spv1.4") "rgen" [glsl|...|]) without interpolation support.n vulkan-utils0QuasiQuoter for creating an intersection shader.Equivalent to calling 4$(compileShaderQ (Just "spv1.4") "rint" [glsl|...|]) without interpolation support.o vulkan-utils+QuasiQuoter for creating an any-hit shader.Equivalent to calling 5$(compileShaderQ (Just "spv1.4") "rahit" [glsl|...|]) without interpolation support.p vulkan-utils.QuasiQuoter for creating a closest hit shader.Equivalent to calling 5$(compileShaderQ (Just "spv1.4") "rchit" [glsl|...|]) without interpolation support.q vulkan-utils'QuasiQuoter for creating a miss shader.Equivalent to calling 5$(compileShaderQ (Just "spv1.4") "rmiss" [glsl|...|]) without interpolation support.r vulkan-utils+QuasiQuoter for creating a callable shader.Equivalent to calling 5$(compileShaderQ (Just "spv1.4") "rcall" [glsl|...|]) without interpolation support.s vulkan-utils'QuasiQuoter for creating a task shader.Equivalent to calling ,$(compileShaderQ Nothing "task" [glsl|...|]) without interpolation support.t vulkan-utils'QuasiQuoter for creating a mesh shader.Equivalent to calling ,$(compileShaderQ Nothing "mesh" [glsl|...|]) without interpolation support.u vulkan-utils,Compile a GLSL shader to spir-v using glslc.Messages are converted to GHC warnings or errors depending on compilation success.v vulkan-utils,Compile a GLSL shader to spir-v using glslc.u vulkan-utils"Argument to pass to `--target-env` vulkan-utilsstage vulkan-utilsglsl shader code vulkan-utilsSpir-V bytecodev vulkan-utilsSource location vulkan-utils"Argument to pass to `--target-env` vulkan-utilsstage vulkan-utilsglsl shader code vulkan-utils'Spir-V bytecode with warnings or errorsfghijklmnopqrstuvfghijklmnopqrstuv Safe-Inferred*!$%&'()./014789;<>u vulkan-utilsw vulkan-utilsw9 is a QuasiQuoter which produces HLSL source code with a #line directive inserted so that error locations point to the correct location in the Haskell source file. It also permits basic string interpolation.)Interpolated variables are prefixed with $3They can optionally be surrounded with braces like ${foo}5Interpolated variables are converted to strings with  To escape a $ use \$*It is intended to be used in concert with  like so myConstant = 3.141 -- Note that this will have to be in a different module myFragmentShader = $(compileShaderQ Nothing "frag" (Just "main") [hlsl| static const float myConstant = ${myConstant}; float main (){ return myConstant; } |]) An explicit example ( interactive is from doctest):6let foo = 450 :: Int in [hlsl|const float foo = $foo|]3"#line 37 \"\"\nconst float foo = 450"Note that line number will be thrown off if any of the interpolated variables contain newlines.x vulkan-utils*QuasiQuoter for creating a compute shader.Equivalent to calling :$(compileShaderQ Nothing "comp" (Just "main") [hlsl|...|]) without interpolation support.y vulkan-utils+QuasiQuoter for creating a fragment shader.Equivalent to calling :$(compileShaderQ Nothing "frag" (Just "main") [hlsl|...|]) without interpolation support.z vulkan-utils+QuasiQuoter for creating a geometry shader.Equivalent to calling :$(compileShaderQ Nothing "geom" (Just "main") [hlsl|...|]) without interpolation support.{ vulkan-utils7QuasiQuoter for creating a tessellation control shader.Equivalent to calling :$(compileShaderQ Nothing "tesc" (Just "main") [hlsl|...|]) without interpolation support.| vulkan-utils:QuasiQuoter for creating a tessellation evaluation shader.Equivalent to calling :$(compileShaderQ Nothing "tese" (Just "main") [hlsl|...|]) without interpolation support.} vulkan-utils)QuasiQuoter for creating a vertex shader.Equivalent to calling :$(compileShaderQ Nothing "vert" (Just "main") [hlsl|...|]) without interpolation support.~ vulkan-utils1QuasiQuoter for creating a ray generation shader.Equivalent to calling $(compileShaderQ (Just "spirv1.4") "rgen" (Just "main") [hlsl|...|]) without interpolation support. vulkan-utils0QuasiQuoter for creating an intersection shader.Equivalent to calling $(compileShaderQ (Just "spirv1.4") "rint" (Just "main") [hlsl|...|]) without interpolation support. vulkan-utils+QuasiQuoter for creating an any-hit shader.Equivalent to calling $(compileShaderQ (Just "spirv1.4") "rahit" (Just "main") [hlsl|...|]) without interpolation support. vulkan-utils.QuasiQuoter for creating a closest hit shader.Equivalent to calling $(compileShaderQ (Just "spirv1.4") "rchit" (Just "main") [hlsl|...|]) without interpolation support. vulkan-utils'QuasiQuoter for creating a miss shader.Equivalent to calling $(compileShaderQ (Just "spirv1.4") "rmiss" (Just "main") [hlsl|...|]) without interpolation support. vulkan-utils+QuasiQuoter for creating a callable shader.Equivalent to calling $(compileShaderQ (Just "spirv1.4") "rcall" (Just "main") [hlsl|...|]) without interpolation support. vulkan-utils'QuasiQuoter for creating a task shader.Equivalent to calling :$(compileShaderQ Nothing "task" (Just "main") [hlsl|...|]) without interpolation support. vulkan-utils'QuasiQuoter for creating a mesh shader.Equivalent to calling :$(compileShaderQ Nothing "mesh" (Just "main") [hlsl|...|]) without interpolation support. vulkan-utils7Compile a HLSL shader to spir-v using glslangValidator.Messages are converted to GHC warnings or errors depending on compilation success. vulkan-utils7Compile a HLSL shader to spir-v using glslangValidator. vulkan-utils"Argument to pass to `--target-env` vulkan-utilsstage vulkan-utilsArgument name to pass to `-e name` to specify entry-point function name vulkan-utilshlsl shader code vulkan-utilsSpir-V bytecode vulkan-utilsSource location vulkan-utils"Argument to pass to `--target-env` vulkan-utilsstage vulkan-utilsArgument name to pass to `-e name` to specify entry-point function name vulkan-utilshlsl shader code vulkan-utils'Spir-V bytecode with warnings or errorswxyz{|}~wxyz{|}~ Safe-Inferred*!$%&'()./014789;<> vulkan-utils7 is a QuasiQuoter which produces GLSL source code with #line directives inserted so that error locations point to the correct location in the Haskell source file. It also permits basic string interpolation.)Interpolated variables are prefixed with $3They can optionally be surrounded with braces like ${foo}5Interpolated variables are converted to strings with  To escape a $ use \$*It is intended to be used in concert with  like so myConstant = 3.141 -- Note that this will have to be in a different module myFragmentShader = $(compileShaderQ Nothing "frag" Nothing [glsl| #version 450 const float myConstant = ${myConstant}; main (){ } |]) An explicit example ( interactive is from doctest):5let version = 450 :: Int in [glsl|#version $version|]"#version 450\n#extension GL_GOOGLE_cpp_style_line_directive : enable\n#line 32 \"\"\n"Note that line number will be thrown off if any of the interpolated variables contain newlines. vulkan-utils*QuasiQuoter for creating a compute shader.Equivalent to calling 4$(compileShaderQ Nothing "comp" Nothing [glsl|...|]) without interpolation support. vulkan-utils+QuasiQuoter for creating a fragment shader.Equivalent to calling 4$(compileShaderQ Nothing "frag" Nothing [glsl|...|]) without interpolation support. vulkan-utils+QuasiQuoter for creating a geometry shader.Equivalent to calling 4$(compileShaderQ Nothing "geom" Nothing [glsl|...|]) without interpolation support. vulkan-utils7QuasiQuoter for creating a tessellation control shader.Equivalent to calling 4$(compileShaderQ Nothing "tesc" Nothing [glsl|...|]) without interpolation support. vulkan-utils:QuasiQuoter for creating a tessellation evaluation shader.Equivalent to calling 4$(compileShaderQ Nothing "tese" Nothing [glsl|...|]) without interpolation support. vulkan-utils)QuasiQuoter for creating a vertex shader.Equivalent to calling 4$(compileShaderQ Nothing "vert" Nothing [glsl|...|]) without interpolation support. vulkan-utils1QuasiQuoter for creating a ray generation shader.Equivalent to calling >$(compileShaderQ (Just "spirv1.4") "rgen" Nothing [glsl|...|]) without interpolation support. vulkan-utils0QuasiQuoter for creating an intersection shader.Equivalent to calling >$(compileShaderQ (Just "spirv1.4") "rint" Nothing [glsl|...|]) without interpolation support. vulkan-utils+QuasiQuoter for creating an any-hit shader.Equivalent to calling ?$(compileShaderQ (Just "spirv1.4") "rahit" Nothing [glsl|...|]) without interpolation support. vulkan-utils.QuasiQuoter for creating a closest hit shader.Equivalent to calling ?$(compileShaderQ (Just "spirv1.4") "rchit" Nothing [glsl|...|]) without interpolation support. vulkan-utils'QuasiQuoter for creating a miss shader.Equivalent to calling ?$(compileShaderQ (Just "spirv1.4") "rmiss" Nothing [glsl|...|]) without interpolation support. vulkan-utils+QuasiQuoter for creating a callable shader.Equivalent to calling ?$(compileShaderQ (Just "spirv1.4") "rcall" Nothing [glsl|...|]) without interpolation support. vulkan-utils'QuasiQuoter for creating a task shader.Equivalent to calling 4$(compileShaderQ Nothing "task" Nothing [glsl|...|]) without interpolation support. vulkan-utils'QuasiQuoter for creating a mesh shader.Equivalent to calling 4$(compileShaderQ Nothing "mesh" Nothing [glsl|...|]) without interpolation support. vulkan-utils7Compile a GLSL shader to spir-v using glslangValidator.Messages are converted to GHC warnings or errors depending on compilation success. vulkan-utils7Compile a GLSL shader to spir-v using glslangValidator. vulkan-utils"Argument to pass to `--target-env` vulkan-utilsstage vulkan-utilsArgument name to pass to `-e name --source-entry-point main` to specify entry-point function name vulkan-utilsglsl shader code vulkan-utilsSpir-V bytecode vulkan-utilsSource location vulkan-utils"Argument to pass to `--target-env` vulkan-utilsstage vulkan-utilsArgument name to pass to `-e name --source-entry-point main` to specify entry-point function name vulkan-utilsglsl shader code vulkan-utils'Spir-V bytecode with warnings or errors !"#$%%&''())*+,-./01234567899:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ab c d e f g h i j k l m n o p q r s t u v w x y z { k l m n o p q r s t u v w x y zjklmnopqrstuvwxyz{klmnopqrstuvwxyz|}~ j{yzyz*vulkan-utils-0.5.10-2w4vLn82YdQ3FxNMluRpD1Vulkan.Utils.CommandCheckVulkan.Utils.DebugVulkan.Utils.FromGLVulkan.Utils.MiscVulkan.Utils.QueueAssignmentVulkan.Utils.RequirementsVulkan.Utils.InitializationVulkan.Utils.Requirements.TH%Vulkan.Utils.ShaderQQ.Backend.Glslang%Vulkan.Utils.ShaderQQ.Backend.Shaderc!Vulkan.Utils.ShaderQQ.Interpolate"Vulkan.Utils.ShaderQQ.HLSL.Shaderc"Vulkan.Utils.ShaderQQ.GLSL.Shaderc"Vulkan.Utils.ShaderQQ.HLSL.Glslang"Vulkan.Utils.ShaderQQ.GLSL.GlslangVulkan.Utils.Internal assignQueues Vulkan.Utils Requirements&Vulkan.Utils.ShaderQQ.Backend.InternalVulkan.Utils.ShaderQQ.HLSLVulkan.Utils.ShaderQQ.GLSL Vulkan.Utils.ShaderQQ.ShaderType.Vulkan.Utils.ShaderQQ.Backend.Shaderc.Internal.Vulkan.Utils.ShaderQQ.Backend.Glslang.InternalcheckCommandsExp$fEqDeviceOrInstanceCommand$fShowDeviceOrInstanceCommanddebugCallbackFatalPtrdebugCallbackPtr nameObjectinternalFormatpartitionOptReqpartitionOptReqIOshowBits.&&. QueueIndex$sel:unQueueIndex:QueueIndexQueueFamilyIndex($sel:unQueueFamilyIndex:QueueFamilyIndex QueueSpec%$sel:queueSpecQueuePriority:QueueSpec'$sel:queueSpecFamilyPredicate:QueueSpecisComputeQueueFamilyisGraphicsQueueFamilyisTransferQueueFamilyisTransferOnlyQueueFamilyisPresentQueueFamily$fEqQueueIndex$fOrdQueueIndex$fEnumQueueIndex$fShowQueueIndex$fEqQueueFamilyIndex$fOrdQueueFamilyIndex$fEnumQueueFamilyIndex$fShowQueueFamilyIndex Unsatisfied#$sel:unsatisfiedMinimum:Unsatisfied"$sel:unsatisfiedActual:UnsatisfiedRequirementResult SatisfiedUnattemptedPropertiesUnattemptedFeatures MissingLayerUnsatisfiedDeviceVersionUnsatisfiedInstanceVersionUnsatisfiedLayerVersionUnsatisfiedFeatureUnsatisfiedPropertyUnsatisfiedDeviceExtension!UnsatisfiedDeviceExtensionVersionUnsatisfiedInstanceExtension#UnsatisfiedInstanceExtensionVersioncheckInstanceRequirementscheckDeviceRequirementsrequirementReportprettyRequirementResult $fKnownChain:$fKnownChain[]$fDeviceFeatureChaines$fDevicePropertyChaines$fSemigroupHas$fEqRequirementResult$fOrdRequirementResult$fEqUnsatisfied$fOrdUnsatisfied#createDebugInstanceFromRequirementscreateInstanceFromRequirementscreateDeviceFromRequirementspickPhysicalDevicephysicalDeviceNamereqreqs $fShowRequest$fShowConstraint$fFunctorConstraint$fFoldableConstraint$fTraversableConstraintGlslangWarning GlslangErrorprocessGlslangMessagesShadercWarning ShadercErrorprocessShadercMessages interpExphlslcompfraggeomtesctesevertrgenrintrahitrchitrmissrcalltaskmeshcompileShaderQ compileShaderglsl commandNames commandStringcommandCandidates accessorNames$vulkan-3.22.1-2BmKL6X1knNGdrHenApXKY$Vulkan.Extensions.VK_EXT_debug_utilssetDebugUtilsObjectNameEXTVulkan.Core10.Enums.FormatFormatunsatisfiedConstraints noSuchThingsayErrbadQQsetBitsVulkan.Core10.HandlesQueuePhysicalDeviceDevicebaseData.Traversable Traversable!Vulkan.Core10.Enums.QueueFlagBitsQUEUE_TRANSFER_BITQUEUE_COMPUTE_BITQUEUE_GRAPHICS_BITassignselectVulkan.Core10.DeviceDeviceQueueCreateInfo createDevice GHC.MaybeNothingVulkan.Core10.ImageView$sel:a:ComponentMapping KnownChainhasknownChainNullmakeInstanceCreateInfomakeDeviceCreateInfoDeviceCreateInfogetLookupExtension catProductsData.Functor.ProductProduct"Vulkan.Core10.DeviceInitializationInstanceCreateInfoVulkan.CStruct.ExtendsextendSomeStructcheckDeviceRequestInstance Data.TuplefstGHC.IO.ExceptionIOErrorgetPhysicalDevicePropertiesVulkan.RequirementDeviceRequirementRequireDeviceFeatureghc-prim GHC.TypesBoolparsefilterCommentsexplicitRecordSetexplicitRecordGet overRecordmessageProcessGHC.BaseStringGHC.ShowshowinsertLineDirective ShaderTypeGLSLHLSL