annotate semiconginev2/rendering/shaders.nim @ 1247:c15770761865

add: gltf loading test, gltf loading for materials
author sam <sam@basx.dev>
date Wed, 24 Jul 2024 23:26:34 +0700
parents 42eeb59f3a43
children 01e9f41d35b1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1228
4e465583ea32 did: rename texture to image
sam <sam@basx.dev>
parents: 1218
diff changeset
1 func GlslType[T: SupportedGPUType|Image](value: T): string =
1192
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
2 when T is float32: "float"
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
3 elif T is float64: "double"
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
4 elif T is int8 or T is int16 or T is int32 or T is int64: "int"
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
5 elif T is uint8 or T is uint16 or T is uint32 or T is uint64: "uint"
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
6 elif T is TVec2[int32]: "ivec2"
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
7 elif T is TVec2[int64]: "ivec2"
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
8 elif T is TVec3[int32]: "ivec3"
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
9 elif T is TVec3[int64]: "ivec3"
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
10 elif T is TVec4[int32]: "ivec4"
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
11 elif T is TVec4[int64]: "ivec4"
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
12 elif T is TVec2[uint32]: "uvec2"
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
13 elif T is TVec2[uint64]: "uvec2"
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
14 elif T is TVec3[uint32]: "uvec3"
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
15 elif T is TVec3[uint64]: "uvec3"
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
16 elif T is TVec4[uint32]: "uvec4"
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
17 elif T is TVec4[uint64]: "uvec4"
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
18 elif T is TVec2[float32]: "vec2"
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
19 elif T is TVec2[float64]: "dvec2"
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
20 elif T is TVec3[float32]: "vec3"
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
21 elif T is TVec3[float64]: "dvec3"
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
22 elif T is TVec4[float32]: "vec4"
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
23 elif T is TVec4[float64]: "dvec4"
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
24 elif T is TMat2[float32]: "mat2"
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
25 elif T is TMat2[float64]: "dmat2"
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
26 elif T is TMat23[float32]: "mat23"
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
27 elif T is TMat23[float64]: "dmat23"
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
28 elif T is TMat32[float32]: "mat32"
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
29 elif T is TMat32[float64]: "dmat32"
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
30 elif T is TMat3[float32]: "mat3"
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
31 elif T is TMat3[float64]: "dmat3"
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
32 elif T is TMat34[float32]: "mat34"
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
33 elif T is TMat34[float64]: "dmat34"
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
34 elif T is TMat43[float32]: "mat43"
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
35 elif T is TMat43[float64]: "dmat43"
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
36 elif T is TMat4[float32]: "mat4"
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
37 elif T is TMat4[float64]: "dmat4"
1228
4e465583ea32 did: rename texture to image
sam <sam@basx.dev>
parents: 1218
diff changeset
38 elif T is Image: "sampler2D"
1247
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents: 1240
diff changeset
39 else:
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents: 1240
diff changeset
40 const n = typetraits.name(T)
c15770761865 add: gltf loading test, gltf loading for materials
sam <sam@basx.dev>
parents: 1240
diff changeset
41 {.error: "Unsupported data type on GPU: " & n.}
1192
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
42
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
43 func VkType[T: SupportedGPUType](value: T): VkFormat =
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
44 when T is float32: VK_FORMAT_R32_SFLOAT
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
45 elif T is float64: VK_FORMAT_R64_SFLOAT
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
46 elif T is int8: VK_FORMAT_R8_SINT
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
47 elif T is int16: VK_FORMAT_R16_SINT
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
48 elif T is int32: VK_FORMAT_R32_SINT
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
49 elif T is int64: VK_FORMAT_R64_SINT
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
50 elif T is uint8: VK_FORMAT_R8_UINT
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
51 elif T is uint16: VK_FORMAT_R16_UINT
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
52 elif T is uint32: VK_FORMAT_R32_UINT
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
53 elif T is uint64: VK_FORMAT_R64_UINT
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
54 elif T is TVec2[int32]: VK_FORMAT_R32G32_SINT
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
55 elif T is TVec2[int64]: VK_FORMAT_R64G64_SINT
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
56 elif T is TVec3[int32]: VK_FORMAT_R32G32B32_SINT
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
57 elif T is TVec3[int64]: VK_FORMAT_R64G64B64_SINT
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
58 elif T is TVec4[int32]: VK_FORMAT_R32G32B32A32_SINT
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
59 elif T is TVec4[int64]: VK_FORMAT_R64G64B64A64_SINT
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
60 elif T is TVec2[uint32]: VK_FORMAT_R32G32_UINT
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
61 elif T is TVec2[uint64]: VK_FORMAT_R64G64_UINT
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
62 elif T is TVec3[uint32]: VK_FORMAT_R32G32B32_UINT
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
63 elif T is TVec3[uint64]: VK_FORMAT_R64G64B64_UINT
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
64 elif T is TVec4[uint32]: VK_FORMAT_R32G32B32A32_UINT
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
65 elif T is TVec4[uint64]: VK_FORMAT_R64G64B64A64_UINT
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
66 elif T is TVec2[float32]: VK_FORMAT_R32G32_SFLOAT
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
67 elif T is TVec2[float64]: VK_FORMAT_R64G64_SFLOAT
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
68 elif T is TVec3[float32]: VK_FORMAT_R32G32B32_SFLOAT
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
69 elif T is TVec3[float64]: VK_FORMAT_R64G64B64_SFLOAT
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
70 elif T is TVec4[float32]: VK_FORMAT_R32G32B32A32_SFLOAT
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
71 elif T is TVec4[float64]: VK_FORMAT_R64G64B64A64_SFLOAT
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
72 elif T is TMat2[float32]: VK_FORMAT_R32G32_SFLOAT
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
73 elif T is TMat2[float64]: VK_FORMAT_R64G64_SFLOAT
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
74 elif T is TMat23[float32]: VK_FORMAT_R32G32B32_SFLOAT
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
75 elif T is TMat23[float64]: VK_FORMAT_R64G64B64_SFLOAT
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
76 elif T is TMat32[float32]: VK_FORMAT_R32G32_SFLOAT
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
77 elif T is TMat32[float64]: VK_FORMAT_R64G64_SFLOAT
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
78 elif T is TMat3[float32]: VK_FORMAT_R32G32B32_SFLOAT
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
79 elif T is TMat3[float64]: VK_FORMAT_R64G64B64_SFLOAT
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
80 elif T is TMat34[float32]: VK_FORMAT_R32G32B32A32_SFLOAT
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
81 elif T is TMat34[float64]: VK_FORMAT_R64G64B64A64_SFLOAT
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
82 elif T is TMat43[float32]: VK_FORMAT_R32G32B32_SFLOAT
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
83 elif T is TMat43[float64]: VK_FORMAT_R64G64B64_SFLOAT
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
84 elif T is TMat4[float32]: VK_FORMAT_R32G32B32A32_SFLOAT
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
85 elif T is TMat4[float64]: VK_FORMAT_R64G64B64A64_SFLOAT
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
86 else: {.error: "Unsupported data type on GPU".}
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
87
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
88
1228
4e465583ea32 did: rename texture to image
sam <sam@basx.dev>
parents: 1218
diff changeset
89 func NumberOfVertexInputAttributeDescriptors[T: SupportedGPUType|Image](value: T): uint32 =
1192
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
90 when T is TMat2[float32] or T is TMat2[float64] or T is TMat23[float32] or T is TMat23[float64]:
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
91 2
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
92 elif T is TMat32[float32] or T is TMat32[float64] or T is TMat3[float32] or T is TMat3[float64] or T is TMat34[float32] or T is TMat34[float64]:
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
93 3
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
94 elif T is TMat43[float32] or T is TMat43[float64] or T is TMat4[float32] or T is TMat4[float64]:
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
95 4
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
96 else:
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
97 1
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
98
1228
4e465583ea32 did: rename texture to image
sam <sam@basx.dev>
parents: 1218
diff changeset
99 func NLocationSlots[T: SupportedGPUType|Image](value: T): uint32 =
1192
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
100 #[
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
101 single location:
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
102 - any scalar
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
103 - any 16-bit vector
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
104 - any 32-bit vector
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
105 - any 64-bit vector that has max. 2 components
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
106 16-bit scalar and vector types, and
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
107 32-bit scalar and vector types, and
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
108 64-bit scalar and 2-component vector types.
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
109 two locations
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
110 64-bit three- and four-component vectors
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
111 ]#
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
112 when T is TVec3[int64] or
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
113 T is TVec4[int64] or
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
114 T is TVec3[uint64] or
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
115 T is TVec4[uint64] or
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
116 T is TVec3[float64] or
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
117 T is TVec4[float64] or
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
118 T is TMat23[float64] or
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
119 T is TMat3[float64] or
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
120 T is TMat34[float64] or
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
121 T is TMat43[float64] or
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
122 T is TMat4[float64]:
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
123 return 2
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
124 else:
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
125 return 1
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
126
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
127 proc generateShaderSource[TShader](shader: TShader): (string, string) {.compileTime.} =
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
128 const GLSL_VERSION = "450"
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
129 var vsInput: seq[string]
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
130 var vsOutput: seq[string]
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
131 var fsInput: seq[string]
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
132 var fsOutput: seq[string]
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
133 var uniforms: seq[string]
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
134 var samplers: seq[string]
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
135 var vsInputLocation = 0'u32
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
136 var passLocation = 0
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
137 var fsOutputLocation = 0
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
138
1205
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
139 var sawDescriptorSets = false
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
140 for fieldname, value in fieldPairs(shader):
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
141 # vertex shader inputs
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
142 when hasCustomPragma(value, VertexAttribute) or hasCustomPragma(value, InstanceAttribute):
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
143 assert typeof(value) is SupportedGPUType
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
144 vsInput.add "layout(location = " & $vsInputLocation & ") in " & GlslType(value) & " " & fieldname & ";"
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
145 for j in 0 ..< NumberOfVertexInputAttributeDescriptors(value):
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
146 vsInputLocation += NLocationSlots(value)
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
147
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
148 # intermediate values, passed between shaders
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
149 elif hasCustomPragma(value, Pass) or hasCustomPragma(value, PassFlat):
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
150 let flat = if hasCustomPragma(value, PassFlat): "flat " else: ""
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
151 vsOutput.add "layout(location = " & $passLocation & ") " & flat & "out " & GlslType(value) & " " & fieldname & ";"
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
152 fsInput.add "layout(location = " & $passLocation & ") " & flat & "in " & GlslType(value) & " " & fieldname & ";"
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
153 passLocation.inc
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
154
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
155 # fragment shader output
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
156 elif hasCustomPragma(value, ShaderOutput):
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
157 fsOutput.add &"layout(location = " & $fsOutputLocation & ") out " & GlslType(value) & " " & fieldname & ";"
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
158 fsOutputLocation.inc
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
159
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
160 # descriptor sets
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
161 # need to consider 4 cases: uniform block, texture, uniform block array, texture array
1205
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
162 elif hasCustomPragma(value, DescriptorSets):
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
163 assert not sawDescriptorSets, "Only one field with pragma DescriptorSets allowed per shader"
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
164 assert typeof(value) is tuple, "Descriptor field '" & fieldname & "' must be of type tuple"
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
165 assert tupleLen(typeof(value)) <= MAX_DESCRIPTORSETS, typetraits.name(TShader) & ": maximum " & $MAX_DESCRIPTORSETS & " allowed"
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
166 sawDescriptorSets = true
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
167 var descriptorSetIndex = 0
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
168 for descriptor in value.fields:
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
169
1205
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
170 var descriptorBinding = 0
1210
570ac1620fb6 fix: make uniform-block-arrays working
sam <sam@basx.dev>
parents: 1205
diff changeset
171
1205
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
172 for descriptorName, descriptorValue in fieldPairs(descriptor):
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
173
1228
4e465583ea32 did: rename texture to image
sam <sam@basx.dev>
parents: 1218
diff changeset
174 when typeof(descriptorValue) is Image:
1205
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
175 samplers.add "layout(set=" & $descriptorSetIndex & ", binding = " & $descriptorBinding & ") uniform " & GlslType(descriptorValue) & " " & descriptorName & ";"
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
176 descriptorBinding.inc
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
177
1205
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
178 elif typeof(descriptorValue) is GPUValue:
1210
570ac1620fb6 fix: make uniform-block-arrays working
sam <sam@basx.dev>
parents: 1205
diff changeset
179
1205
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
180 uniforms.add "layout(set=" & $descriptorSetIndex & ", binding = " & $descriptorBinding & ") uniform T" & descriptorName & " {"
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
181 when typeof(descriptorValue.data) is object:
1210
570ac1620fb6 fix: make uniform-block-arrays working
sam <sam@basx.dev>
parents: 1205
diff changeset
182
1205
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
183 for blockFieldName, blockFieldValue in descriptorValue.data.fieldPairs():
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
184 assert typeof(blockFieldValue) is SupportedGPUType, "uniform block field '" & blockFieldName & "' is not a SupportedGPUType"
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
185 uniforms.add " " & GlslType(blockFieldValue) & " " & blockFieldName & ";"
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
186 uniforms.add "} " & descriptorName & ";"
1210
570ac1620fb6 fix: make uniform-block-arrays working
sam <sam@basx.dev>
parents: 1205
diff changeset
187
570ac1620fb6 fix: make uniform-block-arrays working
sam <sam@basx.dev>
parents: 1205
diff changeset
188 else:
570ac1620fb6 fix: make uniform-block-arrays working
sam <sam@basx.dev>
parents: 1205
diff changeset
189 {.error: "Unsupported shader descriptor field " & descriptorName & " (must be object)".}
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
190 descriptorBinding.inc
1210
570ac1620fb6 fix: make uniform-block-arrays working
sam <sam@basx.dev>
parents: 1205
diff changeset
191
1205
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
192 elif typeof(descriptorValue) is array:
1210
570ac1620fb6 fix: make uniform-block-arrays working
sam <sam@basx.dev>
parents: 1205
diff changeset
193
1228
4e465583ea32 did: rename texture to image
sam <sam@basx.dev>
parents: 1218
diff changeset
194 when elementType(descriptorValue) is Image:
1210
570ac1620fb6 fix: make uniform-block-arrays working
sam <sam@basx.dev>
parents: 1205
diff changeset
195
1205
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
196 let arrayDecl = "[" & $typeof(descriptorValue).len & "]"
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
197 samplers.add "layout(set=" & $descriptorSetIndex & ", binding = " & $descriptorBinding & ") uniform " & GlslType(default(elementType(descriptorValue))) & " " & descriptorName & "" & arrayDecl & ";"
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
198 descriptorBinding.inc
1210
570ac1620fb6 fix: make uniform-block-arrays working
sam <sam@basx.dev>
parents: 1205
diff changeset
199
570ac1620fb6 fix: make uniform-block-arrays working
sam <sam@basx.dev>
parents: 1205
diff changeset
200 elif elementType(descriptorValue) is GPUValue:
570ac1620fb6 fix: make uniform-block-arrays working
sam <sam@basx.dev>
parents: 1205
diff changeset
201
570ac1620fb6 fix: make uniform-block-arrays working
sam <sam@basx.dev>
parents: 1205
diff changeset
202 uniforms.add "layout(set=" & $descriptorSetIndex & ", binding = " & $descriptorBinding & ") uniform T" & descriptorName & " {"
570ac1620fb6 fix: make uniform-block-arrays working
sam <sam@basx.dev>
parents: 1205
diff changeset
203
570ac1620fb6 fix: make uniform-block-arrays working
sam <sam@basx.dev>
parents: 1205
diff changeset
204 for blockFieldName, blockFieldValue in default(elementType(descriptorValue)).data.fieldPairs():
570ac1620fb6 fix: make uniform-block-arrays working
sam <sam@basx.dev>
parents: 1205
diff changeset
205 assert typeof(blockFieldValue) is SupportedGPUType, "uniform block field '" & blockFieldName & "' is not a SupportedGPUType"
570ac1620fb6 fix: make uniform-block-arrays working
sam <sam@basx.dev>
parents: 1205
diff changeset
206 uniforms.add " " & GlslType(blockFieldValue) & " " & blockFieldName & ";"
570ac1620fb6 fix: make uniform-block-arrays working
sam <sam@basx.dev>
parents: 1205
diff changeset
207 uniforms.add "} " & descriptorName & "[" & $descriptorValue.len & "];"
570ac1620fb6 fix: make uniform-block-arrays working
sam <sam@basx.dev>
parents: 1205
diff changeset
208 descriptorBinding.inc
570ac1620fb6 fix: make uniform-block-arrays working
sam <sam@basx.dev>
parents: 1205
diff changeset
209
1205
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
210 else:
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
211 {.error: "Unsupported shader descriptor field " & descriptorName.}
1210
570ac1620fb6 fix: make uniform-block-arrays working
sam <sam@basx.dev>
parents: 1205
diff changeset
212
1205
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
213 descriptorSetIndex.inc
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
214 elif fieldname in ["vertexCode", "fragmentCode"]:
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
215 discard
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
216 else:
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
217 {.error: "Unsupported shader field '" & typetraits.name(TShader) & "." & fieldname & "' of type " & typetraits.name(typeof(value)).}
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
218
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
219 result[0] = (@[&"#version {GLSL_VERSION}", "#extension GL_EXT_scalar_block_layout : require", ""] &
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
220 vsInput &
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
221 uniforms &
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
222 samplers &
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
223 vsOutput &
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
224 @[shader.vertexCode]).join("\n")
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
225
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
226 result[1] = (@[&"#version {GLSL_VERSION}", "#extension GL_EXT_scalar_block_layout : require", ""] &
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
227 fsInput &
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
228 uniforms &
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
229 samplers &
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
230 fsOutput &
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
231 @[shader.fragmentCode]).join("\n")
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
232
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
233 proc compileGlslToSPIRV(stage: VkShaderStageFlagBits, shaderSource: string): seq[uint32] {.compileTime.} =
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
234 func stage2string(stage: VkShaderStageFlagBits): string {.compileTime.} =
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
235 case stage
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
236 of VK_SHADER_STAGE_VERTEX_BIT: "vert"
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
237 of VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT: "tesc"
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
238 of VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT: "tese"
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
239 of VK_SHADER_STAGE_GEOMETRY_BIT: "geom"
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
240 of VK_SHADER_STAGE_FRAGMENT_BIT: "frag"
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
241 of VK_SHADER_STAGE_COMPUTE_BIT: "comp"
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
242 else: ""
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
243
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
244 when defined(nimcheck): # will not run if nimcheck is running
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
245 return result
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
246
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
247 let
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
248 stagename = stage2string(stage)
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
249 shaderHash = hash(shaderSource)
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
250 shaderfile = getTempDir() / &"shader_{shaderHash}.{stagename}"
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
251
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
252 if not shaderfile.fileExists:
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
253 echo "shader of type ", stage
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
254 for i, line in enumerate(shaderSource.splitlines()):
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
255 echo " ", i + 1, " ", line
1192
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
256 var glslExe = currentSourcePath.parentDir.parentDir.parentDir / "tools" / "glslangValidator"
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
257 when defined(windows):
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
258 glslExe = glslExe & "." & ExeExt
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
259 let command = &"{glslExe} --entry-point main -V --stdin -S {stagename} -o {shaderfile}"
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
260 echo "run: ", command
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
261 discard StaticExecChecked(
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
262 command = command,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
263 input = shaderSource
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
264 )
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
265 else:
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
266 echo &"shaderfile {shaderfile} is up-to-date"
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
267
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
268 when defined(mingw) and defined(linux): # required for crosscompilation, path separators get messed up
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
269 let shaderbinary = staticRead shaderfile.replace("\\", "/")
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
270 else:
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
271 let shaderbinary = staticRead shaderfile
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
272
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
273 var i = 0
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
274 while i < shaderbinary.len:
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
275 result.add(
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
276 (uint32(shaderbinary[i + 0]) shl 0) or
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
277 (uint32(shaderbinary[i + 1]) shl 8) or
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
278 (uint32(shaderbinary[i + 2]) shl 16) or
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
279 (uint32(shaderbinary[i + 3]) shl 24)
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
280 )
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
281 i += 4
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
282
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
283
1200
5c6491f28dcd did: simplify some swapchain stuff, add many destructor calls
sam <sam@basx.dev>
parents: 1192
diff changeset
284 proc CompileShader[TShader](shader: static TShader): (VkShaderModule, VkShaderModule) =
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
285 const (vertexShaderSource, fragmentShaderSource) = generateShaderSource(shader)
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
286
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
287 let vertexBinary = compileGlslToSPIRV(VK_SHADER_STAGE_VERTEX_BIT, vertexShaderSource)
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
288 let fragmentBinary = compileGlslToSPIRV(VK_SHADER_STAGE_FRAGMENT_BIT, fragmentShaderSource)
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
289
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
290 var createInfoVertex = VkShaderModuleCreateInfo(
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
291 sType: VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
292 codeSize: csize_t(vertexBinary.len * sizeof(uint32)),
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
293 pCode: vertexBinary.ToCPointer,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
294 )
1200
5c6491f28dcd did: simplify some swapchain stuff, add many destructor calls
sam <sam@basx.dev>
parents: 1192
diff changeset
295 checkVkResult vulkan.device.vkCreateShaderModule(addr(createInfoVertex), nil, addr(result[0]))
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
296 var createInfoFragment = VkShaderModuleCreateInfo(
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
297 sType: VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
298 codeSize: csize_t(fragmentBinary.len * sizeof(uint32)),
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
299 pCode: fragmentBinary.ToCPointer,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
300 )
1200
5c6491f28dcd did: simplify some swapchain stuff, add many destructor calls
sam <sam@basx.dev>
parents: 1192
diff changeset
301 checkVkResult vulkan.device.vkCreateShaderModule(addr(createInfoFragment), nil, addr(result[1]))
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
302
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
303 template ForVertexDataFields(shader: typed, fieldname, valuename, isinstancename, body: untyped): untyped =
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
304 for theFieldname, value in fieldPairs(shader):
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
305 when hasCustomPragma(value, VertexAttribute) or hasCustomPragma(value, InstanceAttribute):
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
306 when not typeof(value) is seq:
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
307 {.error: "field '" & theFieldname & "' needs to be a seq".}
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
308 when not typeof(value) is SupportedGPUType:
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
309 {.error: "field '" & theFieldname & "' is not a supported GPU type".}
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
310 block:
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
311 const `fieldname` {.inject.} = theFieldname
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
312 let `valuename` {.inject.} = value
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
313 const `isinstancename` {.inject.} = hasCustomPragma(value, InstanceAttribute)
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
314 body
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
315
1205
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
316 proc GetDescriptorSetCount[TShader](): uint32 =
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
317 for _, value in fieldPairs(default(TShader)):
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
318 when hasCustomPragma(value, DescriptorSets):
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
319 return tupleLen(typeof(value)).uint32
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
320
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
321 proc CreateDescriptorSetLayouts[TShader](): array[MAX_DESCRIPTORSETS, VkDescriptorSetLayout] =
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
322 var setNumber: int
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
323 for _, value in fieldPairs(default(TShader)):
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
324 when hasCustomPragma(value, DescriptorSets):
1210
570ac1620fb6 fix: make uniform-block-arrays working
sam <sam@basx.dev>
parents: 1205
diff changeset
325 for descriptorSet in value.fields:
1205
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
326 var layoutbindings: seq[VkDescriptorSetLayoutBinding]
1210
570ac1620fb6 fix: make uniform-block-arrays working
sam <sam@basx.dev>
parents: 1205
diff changeset
327 ForDescriptorFields(descriptorSet, fieldName, fieldValue, descriptorType, descriptorCount, descriptorBindingNumber):
1205
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
328 layoutbindings.add VkDescriptorSetLayoutBinding(
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
329 binding: descriptorBindingNumber,
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
330 descriptorType: descriptorType,
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
331 descriptorCount: descriptorCount,
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
332 stageFlags: VkShaderStageFlags(VK_SHADER_STAGE_ALL_GRAPHICS),
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
333 pImmutableSamplers: nil,
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
334 )
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
335 var layoutCreateInfo = VkDescriptorSetLayoutCreateInfo(
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
336 sType: VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
337 bindingCount: layoutbindings.len.uint32,
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
338 pBindings: layoutbindings.ToCPointer
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
339 )
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
340 checkVkResult vkCreateDescriptorSetLayout(
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
341 vulkan.device,
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
342 addr(layoutCreateInfo),
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
343 nil,
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
344 addr(result[setNumber])
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
345 )
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
346 inc setNumber
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
347
1192
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
348 proc CreatePipeline*[TShader](
1229
5dcb503ef0c0 did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents: 1228
diff changeset
349 renderPass: RenderPass,
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
350 topology: VkPrimitiveTopology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
351 polygonMode: VkPolygonMode = VK_POLYGON_MODE_FILL,
1231
70f6c1cfe005 add: incomplete cube demo
sam <sam@basx.dev>
parents: 1229
diff changeset
352 cullMode: openArray[VkCullModeFlagBits] = [VK_CULL_MODE_BACK_BIT],
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
353 frontFace: VkFrontFace = VK_FRONT_FACE_CLOCKWISE,
1240
42eeb59f3a43 add: more tests, line and point rendering
sam <sam@basx.dev>
parents: 1231
diff changeset
354 lineWidth = 1'f32,
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
355 ): Pipeline[TShader] =
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
356 # create pipeline
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
357
1192
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
358 const shader = default(TShader)
1200
5c6491f28dcd did: simplify some swapchain stuff, add many destructor calls
sam <sam@basx.dev>
parents: 1192
diff changeset
359 (result.vertexShaderModule, result.fragmentShaderModule) = CompileShader(shader)
1192
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
360
1205
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
361 var nSets = GetDescriptorSetCount[TShader]()
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
362 result.descriptorSetLayouts = CreateDescriptorSetLayouts[TShader]()
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
363 let pipelineLayoutInfo = VkPipelineLayoutCreateInfo(
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
364 sType: VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
1205
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
365 setLayoutCount: nSets,
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
366 pSetLayouts: if nSets == 0: nil else: result.descriptorSetLayouts.ToCPointer,
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
367 # pushConstantRangeCount: uint32(pushConstants.len),
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
368 # pPushConstantRanges: pushConstants.ToCPointer,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
369 )
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
370 checkVkResult vkCreatePipelineLayout(vulkan.device, addr(pipelineLayoutInfo), nil, addr(result.layout))
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
371
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
372 let stages = [
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
373 VkPipelineShaderStageCreateInfo(
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
374 sType: VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
375 stage: VK_SHADER_STAGE_VERTEX_BIT,
1200
5c6491f28dcd did: simplify some swapchain stuff, add many destructor calls
sam <sam@basx.dev>
parents: 1192
diff changeset
376 module: result.vertexShaderModule,
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
377 pName: "main",
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
378 ),
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
379 VkPipelineShaderStageCreateInfo(
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
380 sType: VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
381 stage: VK_SHADER_STAGE_FRAGMENT_BIT,
1200
5c6491f28dcd did: simplify some swapchain stuff, add many destructor calls
sam <sam@basx.dev>
parents: 1192
diff changeset
382 module: result.fragmentShaderModule,
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
383 pName: "main",
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
384 ),
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
385 ]
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
386 var
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
387 bindings: seq[VkVertexInputBindingDescription]
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
388 attributes: seq[VkVertexInputAttributeDescription]
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
389 var inputBindingNumber = 0'u32
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
390 var location = 0'u32
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
391 ForVertexDataFields(default(TShader), fieldname, value, isInstanceAttr):
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
392 bindings.add VkVertexInputBindingDescription(
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
393 binding: inputBindingNumber,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
394 stride: sizeof(value).uint32,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
395 inputRate: if isInstanceAttr: VK_VERTEX_INPUT_RATE_INSTANCE else: VK_VERTEX_INPUT_RATE_VERTEX,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
396 )
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
397 # allows to submit larger data structures like Mat44, for most other types will be 1
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
398 let perDescriptorSize = sizeof(value).uint32 div NumberOfVertexInputAttributeDescriptors(value)
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
399 for i in 0'u32 ..< NumberOfVertexInputAttributeDescriptors(value):
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
400 attributes.add VkVertexInputAttributeDescription(
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
401 binding: inputBindingNumber,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
402 location: location,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
403 format: VkType(value),
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
404 offset: i * perDescriptorSize,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
405 )
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
406 location += NLocationSlots(value)
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
407 inc inputBindingNumber
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
408
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
409 let
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
410 vertexInputInfo = VkPipelineVertexInputStateCreateInfo(
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
411 sType: VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
412 vertexBindingDescriptionCount: uint32(bindings.len),
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
413 pVertexBindingDescriptions: bindings.ToCPointer,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
414 vertexAttributeDescriptionCount: uint32(attributes.len),
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
415 pVertexAttributeDescriptions: attributes.ToCPointer,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
416 )
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
417 inputAssembly = VkPipelineInputAssemblyStateCreateInfo(
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
418 sType: VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
419 topology: topology,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
420 primitiveRestartEnable: false,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
421 )
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
422 viewportState = VkPipelineViewportStateCreateInfo(
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
423 sType: VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
424 viewportCount: 1,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
425 scissorCount: 1,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
426 )
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
427 rasterizer = VkPipelineRasterizationStateCreateInfo(
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
428 sType: VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
429 depthClampEnable: VK_FALSE,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
430 rasterizerDiscardEnable: VK_FALSE,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
431 polygonMode: polygonMode,
1240
42eeb59f3a43 add: more tests, line and point rendering
sam <sam@basx.dev>
parents: 1231
diff changeset
432 lineWidth: lineWidth,
1231
70f6c1cfe005 add: incomplete cube demo
sam <sam@basx.dev>
parents: 1229
diff changeset
433 cullMode: toBits cullMode,
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
434 frontFace: frontFace,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
435 depthBiasEnable: VK_FALSE,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
436 depthBiasConstantFactor: 0.0,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
437 depthBiasClamp: 0.0,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
438 depthBiasSlopeFactor: 0.0,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
439 )
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
440 multisampling = VkPipelineMultisampleStateCreateInfo(
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
441 sType: VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
442 sampleShadingEnable: VK_FALSE,
1229
5dcb503ef0c0 did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents: 1228
diff changeset
443 rasterizationSamples: renderPass.samples,
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
444 minSampleShading: 1.0,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
445 pSampleMask: nil,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
446 alphaToCoverageEnable: VK_FALSE,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
447 alphaToOneEnable: VK_FALSE,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
448 )
1229
5dcb503ef0c0 did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents: 1228
diff changeset
449 # will only be enabled it the renderpass actually uses a depth buffer
5dcb503ef0c0 did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents: 1228
diff changeset
450 depthStencil = VkPipelineDepthStencilStateCreateInfo(
5dcb503ef0c0 did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents: 1228
diff changeset
451 sType: VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,
5dcb503ef0c0 did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents: 1228
diff changeset
452 depthTestEnable: true,
5dcb503ef0c0 did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents: 1228
diff changeset
453 depthWriteEnable: true,
5dcb503ef0c0 did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents: 1228
diff changeset
454 depthCompareOp: VK_COMPARE_OP_LESS,
5dcb503ef0c0 did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents: 1228
diff changeset
455 depthBoundsTestEnable: false,
5dcb503ef0c0 did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents: 1228
diff changeset
456 stencilTestEnable: false,
5dcb503ef0c0 did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents: 1228
diff changeset
457 minDepthBounds: 0'f32,
5dcb503ef0c0 did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents: 1228
diff changeset
458 maxDepthBounds: 0'f32,
5dcb503ef0c0 did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents: 1228
diff changeset
459 )
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
460 colorBlendAttachment = VkPipelineColorBlendAttachmentState(
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
461 colorWriteMask: toBits [VK_COLOR_COMPONENT_R_BIT, VK_COLOR_COMPONENT_G_BIT, VK_COLOR_COMPONENT_B_BIT, VK_COLOR_COMPONENT_A_BIT],
1240
42eeb59f3a43 add: more tests, line and point rendering
sam <sam@basx.dev>
parents: 1231
diff changeset
462 blendEnable: true,
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
463 srcColorBlendFactor: VK_BLEND_FACTOR_SRC_ALPHA,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
464 dstColorBlendFactor: VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
465 colorBlendOp: VK_BLEND_OP_ADD,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
466 srcAlphaBlendFactor: VK_BLEND_FACTOR_ONE,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
467 dstAlphaBlendFactor: VK_BLEND_FACTOR_ZERO,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
468 alphaBlendOp: VK_BLEND_OP_ADD,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
469 )
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
470 colorBlending = VkPipelineColorBlendStateCreateInfo(
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
471 sType: VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
472 logicOpEnable: false,
1240
42eeb59f3a43 add: more tests, line and point rendering
sam <sam@basx.dev>
parents: 1231
diff changeset
473 logicOp: VK_LOGIC_OP_COPY,
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
474 attachmentCount: 1,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
475 pAttachments: addr(colorBlendAttachment),
1240
42eeb59f3a43 add: more tests, line and point rendering
sam <sam@basx.dev>
parents: 1231
diff changeset
476 blendConstants: [0'f32, 0'f32, 0'f32, 0'f32]
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
477 )
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
478 dynamicStates = [VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR]
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
479 dynamicState = VkPipelineDynamicStateCreateInfo(
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
480 sType: VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
481 dynamicStateCount: dynamicStates.len.uint32,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
482 pDynamicStates: dynamicStates.ToCPointer,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
483 )
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
484 let createInfo = VkGraphicsPipelineCreateInfo(
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
485 sType: VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
486 stageCount: 2,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
487 pStages: stages.ToCPointer,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
488 pVertexInputState: addr(vertexInputInfo),
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
489 pInputAssemblyState: addr(inputAssembly),
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
490 pViewportState: addr(viewportState),
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
491 pRasterizationState: addr(rasterizer),
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
492 pMultisampleState: addr(multisampling),
1229
5dcb503ef0c0 did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents: 1228
diff changeset
493 pDepthStencilState: if renderPass.depthBuffer: addr(depthStencil) else: nil,
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
494 pColorBlendState: addr(colorBlending),
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
495 pDynamicState: addr(dynamicState),
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
496 layout: result.layout,
1229
5dcb503ef0c0 did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents: 1228
diff changeset
497 renderPass: renderPass.vk,
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
498 subpass: 0,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
499 basePipelineHandle: VkPipeline(0),
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
500 basePipelineIndex: -1,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
501 )
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
502 checkVkResult vkCreateGraphicsPipelines(
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
503 vulkan.device,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
504 VkPipelineCache(0),
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
505 1,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
506 addr(createInfo),
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
507 nil,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
508 addr(result.vk)
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
509 )
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
510
1202
a8864fe6fe6e add: descriptor sets binding n stuff
sam <sam@basx.dev>
parents: 1201
diff changeset
511 template WithPipeline*(commandbuffer: VkCommandBuffer, pipeline: Pipeline, body: untyped): untyped =
a8864fe6fe6e add: descriptor sets binding n stuff
sam <sam@basx.dev>
parents: 1201
diff changeset
512 block:
a8864fe6fe6e add: descriptor sets binding n stuff
sam <sam@basx.dev>
parents: 1201
diff changeset
513 vkCmdBindPipeline(commandbuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline.vk)
a8864fe6fe6e add: descriptor sets binding n stuff
sam <sam@basx.dev>
parents: 1201
diff changeset
514 body
a8864fe6fe6e add: descriptor sets binding n stuff
sam <sam@basx.dev>
parents: 1201
diff changeset
515
1200
5c6491f28dcd did: simplify some swapchain stuff, add many destructor calls
sam <sam@basx.dev>
parents: 1192
diff changeset
516 proc DestroyPipeline*(pipeline: Pipeline) =
1201
d4a206b5e5b0 add: rest of the cleanup stuff
sam <sam@basx.dev>
parents: 1200
diff changeset
517
d4a206b5e5b0 add: rest of the cleanup stuff
sam <sam@basx.dev>
parents: 1200
diff changeset
518 for descriptorSetLayout in pipeline.descriptorSetLayouts:
d4a206b5e5b0 add: rest of the cleanup stuff
sam <sam@basx.dev>
parents: 1200
diff changeset
519 vkDestroyDescriptorSetLayout(vulkan.device, descriptorSetLayout, nil)
d4a206b5e5b0 add: rest of the cleanup stuff
sam <sam@basx.dev>
parents: 1200
diff changeset
520
1200
5c6491f28dcd did: simplify some swapchain stuff, add many destructor calls
sam <sam@basx.dev>
parents: 1192
diff changeset
521 vkDestroyShaderModule(vulkan.device, pipeline.vertexShaderModule, nil)
5c6491f28dcd did: simplify some swapchain stuff, add many destructor calls
sam <sam@basx.dev>
parents: 1192
diff changeset
522 vkDestroyShaderModule(vulkan.device, pipeline.fragmentShaderModule, nil)
1201
d4a206b5e5b0 add: rest of the cleanup stuff
sam <sam@basx.dev>
parents: 1200
diff changeset
523 vkDestroyPipelineLayout(vulkan.device, pipeline.layout, nil)
d4a206b5e5b0 add: rest of the cleanup stuff
sam <sam@basx.dev>
parents: 1200
diff changeset
524 vkDestroyPipeline(vulkan.device, pipeline.vk, nil)