From 0a6e6ea1f72d4e27d6c371433d0af2cdfea2e40b Mon Sep 17 00:00:00 2001 From: Martin Date: Wed, 16 Aug 2023 13:19:46 +0200 Subject: [PATCH] [GLSL] Fix issue with image format names containing underscores --- src/Libs/FShade.GLSL/Assembler.fs | 26 +++++--- src/Tests/FShade.GLSL.Tests/Images.fs | 90 +++++++++++++++++++++++++++ 2 files changed, 108 insertions(+), 8 deletions(-) diff --git a/src/Libs/FShade.GLSL/Assembler.fs b/src/Libs/FShade.GLSL/Assembler.fs index 06cd9cb..fceee20 100644 --- a/src/Libs/FShade.GLSL/Assembler.fs +++ b/src/Libs/FShade.GLSL/Assembler.fs @@ -199,9 +199,6 @@ type Backend private(config : Config) = | "V4ui" -> "u" | _ -> "" - let fmt = tFmt.Name - - let name = if arr then sprintf "%simage%s%sArray" typePrefix dimStr msSuffix else sprintf "%simage%s%s" typePrefix dimStr msSuffix @@ -1428,17 +1425,30 @@ module Assembler = } + let private imageFormat = + let lookup = + LookupTable.lookupTable' [ + typeof, "r11f_g11f_b10f" + typeof, "rgb10_a2" + typeof, "rgb10_a2ui" + ] + + fun (t : Type) -> + match lookup t with + | Some fmt -> fmt + | _ -> t.Name + let private uniformLayout (isUniformBuffer : bool) (decorations : list) (set : int) (binding : int) = let decorations = decorations |> List.choose (fun d -> match d with - | UniformDecoration.Format t -> Some t.Name - | UniformDecoration.BufferBinding _ - | UniformDecoration.BufferDescriptorSet _ - | UniformDecoration.FieldIndex _ -> None + | UniformDecoration.Format t -> Some <| imageFormat t + | UniformDecoration.BufferBinding _ + | UniformDecoration.BufferDescriptorSet _ + | UniformDecoration.FieldIndex _ -> None ) - + let decorations = if binding >= 0 then (sprintf "binding = %d" binding) :: decorations else decorations diff --git a/src/Tests/FShade.GLSL.Tests/Images.fs b/src/Tests/FShade.GLSL.Tests/Images.fs index 58efcea..48fffe9 100644 --- a/src/Tests/FShade.GLSL.Tests/Images.fs +++ b/src/Tests/FShade.GLSL.Tests/Images.fs @@ -45,6 +45,45 @@ module ImageUniforms = member x.UIntImgCube : UIntImageCube = x?UIntFooCube member x.UIntImgCubeArray : UIntImageCubeArray = x?UIntFooCubeArray + member x.Img_rgba32f : Image1d = x?rgba32f + member x.Img_rgba16f : Image1d = x?rgba16f + member x.Img_rg32f : Image1d = x?rg32f + member x.Img_rg16f : Image1d = x?rg16f + member x.Img_r11g11b10f : Image1d = x?r11g11b10f + member x.Img_r32f : Image1d = x?r32f + member x.Img_r16f : Image1d = x?r16f + member x.Img_rgba16 : Image1d = x?rgba16 + member x.Img_rgb10a2 : Image1d = x?rgb10a2 + member x.Img_rgba8 : Image1d = x?rgba8 + member x.Img_rg16 : Image1d = x?rg16 + member x.Img_rg8 : Image1d = x?rg8 + member x.Img_r16 : Image1d = x?r16 + member x.Img_r8 : Image1d = x?r8 + member x.Img_rgba16_snorm : Image1d = x?rgba16_snorm + member x.Img_rgba8_snorm : Image1d = x?rgba8_snorm + member x.Img_rg16_snorm : Image1d = x?rg16_snorm + member x.Img_rg8_snorm : Image1d = x?rg8_snorm + member x.Img_r16_snorm : Image1d = x?r16_snorm + member x.Img_r8_snorm : Image1d = x?r8_snorm + member x.Img_rgba32ui : UIntImage1d = x?rgba32ui + member x.Img_rgba16ui : UIntImage1d = x?rgba16ui + member x.Img_rgb10a2ui : UIntImage1d = x?rgb10a2ui + member x.Img_rgba8ui : UIntImage1d = x?rgba8ui + member x.Img_rg32ui : UIntImage1d = x?rg32ui + member x.Img_rg16ui : UIntImage1d = x?rg16ui + member x.Img_rg8ui : UIntImage1d = x?rg8ui + member x.Img_r32ui : UIntImage1d = x?r32ui + member x.Img_r16ui : UIntImage1d = x?r16ui + member x.Img_r8ui : UIntImage1d = x?r8ui + member x.Img_rgba32i : IntImage1d = x?rgba32i + member x.Img_rgba16i : IntImage1d = x?rgba16i + member x.Img_rgba8i : IntImage1d = x?rgba8i + member x.Img_rg32i : IntImage1d = x?rg32i + member x.Img_rg16i : IntImage1d = x?rg16i + member x.Img_rg8i : IntImage1d = x?rg8i + member x.Img_r32i : IntImage1d = x?r32i + member x.Img_r16i : IntImage1d = x?r16i + member x.Img_r8i : IntImage1d = x?r8i [] let ``Size``() = @@ -470,3 +509,54 @@ let ``AtomicCompareExchange``() = } GLSL.shouldCompile [Effect.ofFunction fs] + +[] +let ``Formats``() = + Setup.Run() + + let fs (v : Vertex) = + fragment { + let _ = uniform.Img_rgba32f.Load 0 + let _ = uniform.Img_rgba16f.Load 0 + let _ = uniform.Img_rg32f.Load 0 + let _ = uniform.Img_rg16f.Load 0 + let _ = uniform.Img_r11g11b10f.Load 0 + let _ = uniform.Img_r32f.Load 0 + let _ = uniform.Img_r16f.Load 0 + let _ = uniform.Img_rgba16.Load 0 + let _ = uniform.Img_rgb10a2.Load 0 + let _ = uniform.Img_rgba8.Load 0 + let _ = uniform.Img_rg16.Load 0 + let _ = uniform.Img_rg8.Load 0 + let _ = uniform.Img_r16.Load 0 + let _ = uniform.Img_r8.Load 0 + let _ = uniform.Img_rgba16_snorm.Load 0 + let _ = uniform.Img_rgba8_snorm.Load 0 + let _ = uniform.Img_rg16_snorm.Load 0 + let _ = uniform.Img_rg8_snorm.Load 0 + let _ = uniform.Img_r16_snorm.Load 0 + let _ = uniform.Img_r8_snorm.Load 0 + let _ = uniform.Img_rgba32ui.Load 0 + let _ = uniform.Img_rgba16ui.Load 0 + let _ = uniform.Img_rgb10a2ui.Load 0 + let _ = uniform.Img_rgba8ui.Load 0 + let _ = uniform.Img_rg32ui.Load 0 + let _ = uniform.Img_rg16ui.Load 0 + let _ = uniform.Img_rg8ui.Load 0 + let _ = uniform.Img_r32ui.Load 0 + let _ = uniform.Img_r16ui.Load 0 + let _ = uniform.Img_r8ui.Load 0 + let _ = uniform.Img_rgba32i.Load 0 + let _ = uniform.Img_rgba16i.Load 0 + let _ = uniform.Img_rgba8i.Load 0 + let _ = uniform.Img_rg32i.Load 0 + let _ = uniform.Img_rg16i.Load 0 + let _ = uniform.Img_rg8i.Load 0 + let _ = uniform.Img_r32i.Load 0 + let _ = uniform.Img_r16i.Load 0 + let _ = uniform.Img_r8i.Load 0 + + return V3d.Zero + } + + GLSL.shouldCompile [Effect.ofFunction fs] \ No newline at end of file