annotate semiconginev2/rendering/shaders.nim @ 1252:01e9f41d35b1

add:support for push constants
author sam <sam@basx.dev>
date Fri, 26 Jul 2024 23:04:01 +0700
parents c15770761865
children c4f98eb4bb05
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]
1252
01e9f41d35b1 add:support for push constants
sam <sam@basx.dev>
parents: 1247
diff changeset
134 var pushConstants: seq[string]
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
135 var samplers: seq[string]
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
136 var vsInputLocation = 0'u32
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
137 var passLocation = 0
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
138 var fsOutputLocation = 0
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
139
1205
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
140 var sawDescriptorSets = false
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
141 for fieldname, value in fieldPairs(shader):
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
142 # vertex shader inputs
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
143 when hasCustomPragma(value, VertexAttribute) or hasCustomPragma(value, InstanceAttribute):
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
144 assert typeof(value) is SupportedGPUType
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
145 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
146 for j in 0 ..< NumberOfVertexInputAttributeDescriptors(value):
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
147 vsInputLocation += NLocationSlots(value)
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
148
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
149 # intermediate values, passed between shaders
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
150 elif hasCustomPragma(value, Pass) or hasCustomPragma(value, PassFlat):
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
151 let flat = if hasCustomPragma(value, PassFlat): "flat " else: ""
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
152 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
153 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
154 passLocation.inc
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
155
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
156 # fragment shader output
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
157 elif hasCustomPragma(value, ShaderOutput):
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
158 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
159 fsOutputLocation.inc
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
160
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
161 # descriptor sets
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
162 # 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
163 elif hasCustomPragma(value, DescriptorSets):
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
164 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
165 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
166 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
167 sawDescriptorSets = true
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
168 var descriptorSetIndex = 0
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
169 for descriptor in value.fields:
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
170
1205
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
171 var descriptorBinding = 0
1210
570ac1620fb6 fix: make uniform-block-arrays working
sam <sam@basx.dev>
parents: 1205
diff changeset
172
1205
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
173 for descriptorName, descriptorValue in fieldPairs(descriptor):
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
174
1228
4e465583ea32 did: rename texture to image
sam <sam@basx.dev>
parents: 1218
diff changeset
175 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
176 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
177 descriptorBinding.inc
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
178
1205
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
179 elif typeof(descriptorValue) is GPUValue:
1210
570ac1620fb6 fix: make uniform-block-arrays working
sam <sam@basx.dev>
parents: 1205
diff changeset
180
1205
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
181 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
182 when typeof(descriptorValue.data) is object:
1210
570ac1620fb6 fix: make uniform-block-arrays working
sam <sam@basx.dev>
parents: 1205
diff changeset
183
1205
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
184 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
185 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
186 uniforms.add " " & GlslType(blockFieldValue) & " " & blockFieldName & ";"
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
187 uniforms.add "} " & descriptorName & ";"
1210
570ac1620fb6 fix: make uniform-block-arrays working
sam <sam@basx.dev>
parents: 1205
diff changeset
188
570ac1620fb6 fix: make uniform-block-arrays working
sam <sam@basx.dev>
parents: 1205
diff changeset
189 else:
570ac1620fb6 fix: make uniform-block-arrays working
sam <sam@basx.dev>
parents: 1205
diff changeset
190 {.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
191 descriptorBinding.inc
1210
570ac1620fb6 fix: make uniform-block-arrays working
sam <sam@basx.dev>
parents: 1205
diff changeset
192
1205
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
193 elif typeof(descriptorValue) is array:
1210
570ac1620fb6 fix: make uniform-block-arrays working
sam <sam@basx.dev>
parents: 1205
diff changeset
194
1228
4e465583ea32 did: rename texture to image
sam <sam@basx.dev>
parents: 1218
diff changeset
195 when elementType(descriptorValue) is Image:
1210
570ac1620fb6 fix: make uniform-block-arrays working
sam <sam@basx.dev>
parents: 1205
diff changeset
196
1205
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
197 let arrayDecl = "[" & $typeof(descriptorValue).len & "]"
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
198 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
199 descriptorBinding.inc
1210
570ac1620fb6 fix: make uniform-block-arrays working
sam <sam@basx.dev>
parents: 1205
diff changeset
200
570ac1620fb6 fix: make uniform-block-arrays working
sam <sam@basx.dev>
parents: 1205
diff changeset
201 elif elementType(descriptorValue) is GPUValue:
570ac1620fb6 fix: make uniform-block-arrays working
sam <sam@basx.dev>
parents: 1205
diff changeset
202
570ac1620fb6 fix: make uniform-block-arrays working
sam <sam@basx.dev>
parents: 1205
diff changeset
203 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
204
570ac1620fb6 fix: make uniform-block-arrays working
sam <sam@basx.dev>
parents: 1205
diff changeset
205 for blockFieldName, blockFieldValue in default(elementType(descriptorValue)).data.fieldPairs():
570ac1620fb6 fix: make uniform-block-arrays working
sam <sam@basx.dev>
parents: 1205
diff changeset
206 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
207 uniforms.add " " & GlslType(blockFieldValue) & " " & blockFieldName & ";"
570ac1620fb6 fix: make uniform-block-arrays working
sam <sam@basx.dev>
parents: 1205
diff changeset
208 uniforms.add "} " & descriptorName & "[" & $descriptorValue.len & "];"
570ac1620fb6 fix: make uniform-block-arrays working
sam <sam@basx.dev>
parents: 1205
diff changeset
209 descriptorBinding.inc
570ac1620fb6 fix: make uniform-block-arrays working
sam <sam@basx.dev>
parents: 1205
diff changeset
210
1205
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
211 else:
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
212 {.error: "Unsupported shader descriptor field " & descriptorName.}
1210
570ac1620fb6 fix: make uniform-block-arrays working
sam <sam@basx.dev>
parents: 1205
diff changeset
213
1205
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
214 descriptorSetIndex.inc
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
215 elif fieldname in ["vertexCode", "fragmentCode"]:
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
216 discard
1252
01e9f41d35b1 add:support for push constants
sam <sam@basx.dev>
parents: 1247
diff changeset
217 elif hasCustomPragma(value, PushConstantAttribute):
01e9f41d35b1 add:support for push constants
sam <sam@basx.dev>
parents: 1247
diff changeset
218 assert pushConstants.len == 0, "Only one push constant value allowed"
01e9f41d35b1 add:support for push constants
sam <sam@basx.dev>
parents: 1247
diff changeset
219 assert value is object, "push constants need to be objects"
01e9f41d35b1 add:support for push constants
sam <sam@basx.dev>
parents: 1247
diff changeset
220 pushConstants.add "layout( push_constant ) uniform constants"
01e9f41d35b1 add:support for push constants
sam <sam@basx.dev>
parents: 1247
diff changeset
221 pushConstants.add "{"
01e9f41d35b1 add:support for push constants
sam <sam@basx.dev>
parents: 1247
diff changeset
222 for constFieldName, constFieldValue in value.fieldPairs():
01e9f41d35b1 add:support for push constants
sam <sam@basx.dev>
parents: 1247
diff changeset
223 assert typeof(constFieldValue) is SupportedGPUType, "push constant field '" & constFieldName & "' is not a SupportedGPUType"
01e9f41d35b1 add:support for push constants
sam <sam@basx.dev>
parents: 1247
diff changeset
224 pushConstants.add " " & GlslType(constFieldValue) & " " & constFieldName & ";"
01e9f41d35b1 add:support for push constants
sam <sam@basx.dev>
parents: 1247
diff changeset
225 pushConstants.add "} " & fieldname & ";"
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
226 else:
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
227 {.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
228
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
229 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
230 vsInput &
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
231 uniforms &
1252
01e9f41d35b1 add:support for push constants
sam <sam@basx.dev>
parents: 1247
diff changeset
232 pushConstants &
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
233 samplers &
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
234 vsOutput &
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
235 @[shader.vertexCode]).join("\n")
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
236
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
237 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
238 fsInput &
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
239 uniforms &
1252
01e9f41d35b1 add:support for push constants
sam <sam@basx.dev>
parents: 1247
diff changeset
240 pushConstants &
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
241 samplers &
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
242 fsOutput &
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
243 @[shader.fragmentCode]).join("\n")
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
244
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
245 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
246 func stage2string(stage: VkShaderStageFlagBits): string {.compileTime.} =
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
247 case stage
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
248 of VK_SHADER_STAGE_VERTEX_BIT: "vert"
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
249 of VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT: "tesc"
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
250 of VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT: "tese"
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
251 of VK_SHADER_STAGE_GEOMETRY_BIT: "geom"
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
252 of VK_SHADER_STAGE_FRAGMENT_BIT: "frag"
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
253 of VK_SHADER_STAGE_COMPUTE_BIT: "comp"
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
254 else: ""
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
255
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
256 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
257 return result
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
258
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
259 let
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
260 stagename = stage2string(stage)
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
261 shaderHash = hash(shaderSource)
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
262 shaderfile = getTempDir() / &"shader_{shaderHash}.{stagename}"
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
263
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
264 if not shaderfile.fileExists:
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
265 echo "shader of type ", stage
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
266 for i, line in enumerate(shaderSource.splitlines()):
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
267 echo " ", i + 1, " ", line
1192
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
268 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
269 when defined(windows):
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
270 glslExe = glslExe & "." & ExeExt
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
271 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
272 echo "run: ", command
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
273 discard StaticExecChecked(
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
274 command = command,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
275 input = shaderSource
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
276 )
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
277 else:
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
278 echo &"shaderfile {shaderfile} is up-to-date"
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
279
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
280 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
281 let shaderbinary = staticRead shaderfile.replace("\\", "/")
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
282 else:
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
283 let shaderbinary = staticRead shaderfile
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
284
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
285 var i = 0
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
286 while i < shaderbinary.len:
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
287 result.add(
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
288 (uint32(shaderbinary[i + 0]) shl 0) or
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
289 (uint32(shaderbinary[i + 1]) shl 8) or
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
290 (uint32(shaderbinary[i + 2]) shl 16) or
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
291 (uint32(shaderbinary[i + 3]) shl 24)
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
292 )
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
293 i += 4
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
294
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
295
1200
5c6491f28dcd did: simplify some swapchain stuff, add many destructor calls
sam <sam@basx.dev>
parents: 1192
diff changeset
296 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
297 const (vertexShaderSource, fragmentShaderSource) = generateShaderSource(shader)
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
298
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
299 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
300 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
301
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
302 var createInfoVertex = VkShaderModuleCreateInfo(
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
303 sType: VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
304 codeSize: csize_t(vertexBinary.len * sizeof(uint32)),
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
305 pCode: vertexBinary.ToCPointer,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
306 )
1200
5c6491f28dcd did: simplify some swapchain stuff, add many destructor calls
sam <sam@basx.dev>
parents: 1192
diff changeset
307 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
308 var createInfoFragment = VkShaderModuleCreateInfo(
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
309 sType: VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
310 codeSize: csize_t(fragmentBinary.len * sizeof(uint32)),
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
311 pCode: fragmentBinary.ToCPointer,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
312 )
1200
5c6491f28dcd did: simplify some swapchain stuff, add many destructor calls
sam <sam@basx.dev>
parents: 1192
diff changeset
313 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
314
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
315 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
316 for theFieldname, value in fieldPairs(shader):
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
317 when hasCustomPragma(value, VertexAttribute) or hasCustomPragma(value, InstanceAttribute):
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
318 when not typeof(value) is seq:
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
319 {.error: "field '" & theFieldname & "' needs to be a seq".}
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
320 when not typeof(value) is SupportedGPUType:
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
321 {.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
322 block:
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
323 const `fieldname` {.inject.} = theFieldname
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
324 let `valuename` {.inject.} = value
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
325 const `isinstancename` {.inject.} = hasCustomPragma(value, InstanceAttribute)
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
326 body
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
327
1205
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
328 proc GetDescriptorSetCount[TShader](): uint32 =
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
329 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
330 when hasCustomPragma(value, DescriptorSets):
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
331 return tupleLen(typeof(value)).uint32
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
332
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
333 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
334 var setNumber: int
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
335 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
336 when hasCustomPragma(value, DescriptorSets):
1210
570ac1620fb6 fix: make uniform-block-arrays working
sam <sam@basx.dev>
parents: 1205
diff changeset
337 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
338 var layoutbindings: seq[VkDescriptorSetLayoutBinding]
1210
570ac1620fb6 fix: make uniform-block-arrays working
sam <sam@basx.dev>
parents: 1205
diff changeset
339 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
340 layoutbindings.add VkDescriptorSetLayoutBinding(
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
341 binding: descriptorBindingNumber,
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
342 descriptorType: descriptorType,
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
343 descriptorCount: descriptorCount,
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
344 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
345 pImmutableSamplers: nil,
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
346 )
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
347 var layoutCreateInfo = VkDescriptorSetLayoutCreateInfo(
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
348 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
349 bindingCount: layoutbindings.len.uint32,
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
350 pBindings: layoutbindings.ToCPointer
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
351 )
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
352 checkVkResult vkCreateDescriptorSetLayout(
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
353 vulkan.device,
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
354 addr(layoutCreateInfo),
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
355 nil,
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
356 addr(result[setNumber])
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
357 )
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
358 inc setNumber
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
359
1192
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
360 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
361 renderPass: RenderPass,
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
362 topology: VkPrimitiveTopology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
363 polygonMode: VkPolygonMode = VK_POLYGON_MODE_FILL,
1231
70f6c1cfe005 add: incomplete cube demo
sam <sam@basx.dev>
parents: 1229
diff changeset
364 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
365 frontFace: VkFrontFace = VK_FRONT_FACE_CLOCKWISE,
1240
42eeb59f3a43 add: more tests, line and point rendering
sam <sam@basx.dev>
parents: 1231
diff changeset
366 lineWidth = 1'f32,
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
367 ): Pipeline[TShader] =
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
368 # create pipeline
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
369
1192
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
370 const shader = default(TShader)
1200
5c6491f28dcd did: simplify some swapchain stuff, add many destructor calls
sam <sam@basx.dev>
parents: 1192
diff changeset
371 (result.vertexShaderModule, result.fragmentShaderModule) = CompileShader(shader)
1192
90bf0cab1d02 did: so many, many things
sam <sam@basx.dev>
parents: 1190
diff changeset
372
1205
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
373 var nSets = GetDescriptorSetCount[TShader]()
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
374 result.descriptorSetLayouts = CreateDescriptorSetLayouts[TShader]()
1252
01e9f41d35b1 add:support for push constants
sam <sam@basx.dev>
parents: 1247
diff changeset
375
01e9f41d35b1 add:support for push constants
sam <sam@basx.dev>
parents: 1247
diff changeset
376 let pushConstant = VkPushConstantRange(
01e9f41d35b1 add:support for push constants
sam <sam@basx.dev>
parents: 1247
diff changeset
377 stageFlags: VkShaderStageFlags(VK_SHADER_STAGE_ALL_GRAPHICS),
01e9f41d35b1 add:support for push constants
sam <sam@basx.dev>
parents: 1247
diff changeset
378 offset: 0,
01e9f41d35b1 add:support for push constants
sam <sam@basx.dev>
parents: 1247
diff changeset
379 size: 128, # currently supported everywhere, places for two mat4
01e9f41d35b1 add:support for push constants
sam <sam@basx.dev>
parents: 1247
diff changeset
380 )
01e9f41d35b1 add:support for push constants
sam <sam@basx.dev>
parents: 1247
diff changeset
381
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
382 let pipelineLayoutInfo = VkPipelineLayoutCreateInfo(
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
383 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
384 setLayoutCount: nSets,
f7530247a21f did: improve descriptor-set handling, add simple descriptor set test
sam <sam@basx.dev>
parents: 1204
diff changeset
385 pSetLayouts: if nSets == 0: nil else: result.descriptorSetLayouts.ToCPointer,
1252
01e9f41d35b1 add:support for push constants
sam <sam@basx.dev>
parents: 1247
diff changeset
386 pushConstantRangeCount: 1,
01e9f41d35b1 add:support for push constants
sam <sam@basx.dev>
parents: 1247
diff changeset
387 pPushConstantRanges: addr(pushConstant),
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
388 )
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
389 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
390
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
391 let stages = [
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
392 VkPipelineShaderStageCreateInfo(
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
393 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
394 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
395 module: result.vertexShaderModule,
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
396 pName: "main",
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
397 ),
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
398 VkPipelineShaderStageCreateInfo(
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
399 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
400 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
401 module: result.fragmentShaderModule,
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
402 pName: "main",
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
403 ),
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
404 ]
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
405 var
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
406 bindings: seq[VkVertexInputBindingDescription]
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
407 attributes: seq[VkVertexInputAttributeDescription]
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
408 var inputBindingNumber = 0'u32
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
409 var location = 0'u32
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
410 ForVertexDataFields(default(TShader), fieldname, value, isInstanceAttr):
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
411 bindings.add VkVertexInputBindingDescription(
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
412 binding: inputBindingNumber,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
413 stride: sizeof(value).uint32,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
414 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
415 )
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
416 # 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
417 let perDescriptorSize = sizeof(value).uint32 div NumberOfVertexInputAttributeDescriptors(value)
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
418 for i in 0'u32 ..< NumberOfVertexInputAttributeDescriptors(value):
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
419 attributes.add VkVertexInputAttributeDescription(
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
420 binding: inputBindingNumber,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
421 location: location,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
422 format: VkType(value),
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
423 offset: i * perDescriptorSize,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
424 )
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
425 location += NLocationSlots(value)
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
426 inc inputBindingNumber
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
427
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
428 let
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
429 vertexInputInfo = VkPipelineVertexInputStateCreateInfo(
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
430 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
431 vertexBindingDescriptionCount: uint32(bindings.len),
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
432 pVertexBindingDescriptions: bindings.ToCPointer,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
433 vertexAttributeDescriptionCount: uint32(attributes.len),
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
434 pVertexAttributeDescriptions: attributes.ToCPointer,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
435 )
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
436 inputAssembly = VkPipelineInputAssemblyStateCreateInfo(
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
437 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
438 topology: topology,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
439 primitiveRestartEnable: false,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
440 )
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
441 viewportState = VkPipelineViewportStateCreateInfo(
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
442 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
443 viewportCount: 1,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
444 scissorCount: 1,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
445 )
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
446 rasterizer = VkPipelineRasterizationStateCreateInfo(
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
447 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
448 depthClampEnable: VK_FALSE,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
449 rasterizerDiscardEnable: VK_FALSE,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
450 polygonMode: polygonMode,
1240
42eeb59f3a43 add: more tests, line and point rendering
sam <sam@basx.dev>
parents: 1231
diff changeset
451 lineWidth: lineWidth,
1231
70f6c1cfe005 add: incomplete cube demo
sam <sam@basx.dev>
parents: 1229
diff changeset
452 cullMode: toBits cullMode,
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
453 frontFace: frontFace,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
454 depthBiasEnable: VK_FALSE,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
455 depthBiasConstantFactor: 0.0,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
456 depthBiasClamp: 0.0,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
457 depthBiasSlopeFactor: 0.0,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
458 )
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
459 multisampling = VkPipelineMultisampleStateCreateInfo(
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
460 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
461 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
462 rasterizationSamples: renderPass.samples,
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
463 minSampleShading: 1.0,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
464 pSampleMask: nil,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
465 alphaToCoverageEnable: VK_FALSE,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
466 alphaToOneEnable: VK_FALSE,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
467 )
1229
5dcb503ef0c0 did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents: 1228
diff changeset
468 # 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
469 depthStencil = VkPipelineDepthStencilStateCreateInfo(
5dcb503ef0c0 did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents: 1228
diff changeset
470 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
471 depthTestEnable: true,
5dcb503ef0c0 did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents: 1228
diff changeset
472 depthWriteEnable: true,
5dcb503ef0c0 did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents: 1228
diff changeset
473 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
474 depthBoundsTestEnable: false,
5dcb503ef0c0 did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents: 1228
diff changeset
475 stencilTestEnable: false,
5dcb503ef0c0 did: refactor renderpass a bit, enable depth buffering and msaa on offscreen-rendering
sam <sam@basx.dev>
parents: 1228
diff changeset
476 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
477 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
478 )
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
479 colorBlendAttachment = VkPipelineColorBlendAttachmentState(
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
480 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
481 blendEnable: true,
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
482 srcColorBlendFactor: VK_BLEND_FACTOR_SRC_ALPHA,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
483 dstColorBlendFactor: VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
484 colorBlendOp: VK_BLEND_OP_ADD,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
485 srcAlphaBlendFactor: VK_BLEND_FACTOR_ONE,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
486 dstAlphaBlendFactor: VK_BLEND_FACTOR_ZERO,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
487 alphaBlendOp: VK_BLEND_OP_ADD,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
488 )
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
489 colorBlending = VkPipelineColorBlendStateCreateInfo(
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
490 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
491 logicOpEnable: false,
1240
42eeb59f3a43 add: more tests, line and point rendering
sam <sam@basx.dev>
parents: 1231
diff changeset
492 logicOp: VK_LOGIC_OP_COPY,
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
493 attachmentCount: 1,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
494 pAttachments: addr(colorBlendAttachment),
1240
42eeb59f3a43 add: more tests, line and point rendering
sam <sam@basx.dev>
parents: 1231
diff changeset
495 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
496 )
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
497 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
498 dynamicState = VkPipelineDynamicStateCreateInfo(
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
499 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
500 dynamicStateCount: dynamicStates.len.uint32,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
501 pDynamicStates: dynamicStates.ToCPointer,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
502 )
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
503 let createInfo = VkGraphicsPipelineCreateInfo(
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
504 sType: VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
505 stageCount: 2,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
506 pStages: stages.ToCPointer,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
507 pVertexInputState: addr(vertexInputInfo),
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
508 pInputAssemblyState: addr(inputAssembly),
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
509 pViewportState: addr(viewportState),
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
510 pRasterizationState: addr(rasterizer),
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
511 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
512 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
513 pColorBlendState: addr(colorBlending),
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
514 pDynamicState: addr(dynamicState),
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
515 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
516 renderPass: renderPass.vk,
1190
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
517 subpass: 0,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
518 basePipelineHandle: VkPipeline(0),
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
519 basePipelineIndex: -1,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
520 )
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
521 checkVkResult vkCreateGraphicsPipelines(
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
522 vulkan.device,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
523 VkPipelineCache(0),
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
524 1,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
525 addr(createInfo),
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
526 nil,
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
527 addr(result.vk)
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
528 )
a3eb305bcac2 start of complete and total refactoring: the ULTIMATE
sam <sam@basx.dev>
parents:
diff changeset
529
1202
a8864fe6fe6e add: descriptor sets binding n stuff
sam <sam@basx.dev>
parents: 1201
diff changeset
530 template WithPipeline*(commandbuffer: VkCommandBuffer, pipeline: Pipeline, body: untyped): untyped =
a8864fe6fe6e add: descriptor sets binding n stuff
sam <sam@basx.dev>
parents: 1201
diff changeset
531 block:
a8864fe6fe6e add: descriptor sets binding n stuff
sam <sam@basx.dev>
parents: 1201
diff changeset
532 vkCmdBindPipeline(commandbuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline.vk)
a8864fe6fe6e add: descriptor sets binding n stuff
sam <sam@basx.dev>
parents: 1201
diff changeset
533 body
a8864fe6fe6e add: descriptor sets binding n stuff
sam <sam@basx.dev>
parents: 1201
diff changeset
534
1200
5c6491f28dcd did: simplify some swapchain stuff, add many destructor calls
sam <sam@basx.dev>
parents: 1192
diff changeset
535 proc DestroyPipeline*(pipeline: Pipeline) =
1201
d4a206b5e5b0 add: rest of the cleanup stuff
sam <sam@basx.dev>
parents: 1200
diff changeset
536
d4a206b5e5b0 add: rest of the cleanup stuff
sam <sam@basx.dev>
parents: 1200
diff changeset
537 for descriptorSetLayout in pipeline.descriptorSetLayouts:
d4a206b5e5b0 add: rest of the cleanup stuff
sam <sam@basx.dev>
parents: 1200
diff changeset
538 vkDestroyDescriptorSetLayout(vulkan.device, descriptorSetLayout, nil)
d4a206b5e5b0 add: rest of the cleanup stuff
sam <sam@basx.dev>
parents: 1200
diff changeset
539
1200
5c6491f28dcd did: simplify some swapchain stuff, add many destructor calls
sam <sam@basx.dev>
parents: 1192
diff changeset
540 vkDestroyShaderModule(vulkan.device, pipeline.vertexShaderModule, nil)
5c6491f28dcd did: simplify some swapchain stuff, add many destructor calls
sam <sam@basx.dev>
parents: 1192
diff changeset
541 vkDestroyShaderModule(vulkan.device, pipeline.fragmentShaderModule, nil)
1201
d4a206b5e5b0 add: rest of the cleanup stuff
sam <sam@basx.dev>
parents: 1200
diff changeset
542 vkDestroyPipelineLayout(vulkan.device, pipeline.layout, nil)
d4a206b5e5b0 add: rest of the cleanup stuff
sam <sam@basx.dev>
parents: 1200
diff changeset
543 vkDestroyPipeline(vulkan.device, pipeline.vk, nil)