diff options
Diffstat (limited to 'ddl/Definitions.hs')
-rw-r--r-- | ddl/Definitions.hs | 479 |
1 files changed, 479 insertions, 0 deletions
diff --git a/ddl/Definitions.hs b/ddl/Definitions.hs new file mode 100644 index 0000000..9618407 --- /dev/null +++ b/ddl/Definitions.hs | |||
@@ -0,0 +1,479 @@ | |||
1 | {-# LANGUAGE OverloadedStrings #-} | ||
2 | module Definitions (modules) where | ||
3 | |||
4 | import Control.Monad.Writer | ||
5 | import Language | ||
6 | |||
7 | ir = do | ||
8 | -- type aliases | ||
9 | "StreamName" #= Int | ||
10 | "ProgramName" #= Int | ||
11 | "TextureName" #= Int | ||
12 | "SamplerName" #= Int | ||
13 | "UniformName" #= String | ||
14 | "SlotName" #= Int | ||
15 | "FrameBufferComponent" #= Int | ||
16 | "TextureUnit" #= Int | ||
17 | "RenderTargetName" #= Int | ||
18 | "TextureUnitMapping" #= Map "UniformName" "TextureUnit" | ||
19 | |||
20 | -- definitions | ||
21 | data_ "ArrayValue" $ do | ||
22 | const_ "VBoolArray" [Array Bool] | ||
23 | const_ "VIntArray" [Array Int32] | ||
24 | const_ "VWordArray" [Array Word32] | ||
25 | const_ "VFloatArray" [Array Float] | ||
26 | |||
27 | -- GPU type value reification, needed for shader codegen | ||
28 | data_ "Value" $ do | ||
29 | const_ "VBool" [Bool] | ||
30 | const_ "VV2B" [v2b] | ||
31 | const_ "VV3B" [v3b] | ||
32 | const_ "VV4B" [v4b] | ||
33 | const_ "VWord" [Word32] | ||
34 | const_ "VV2U" [v2u] | ||
35 | const_ "VV3U" [v3u] | ||
36 | const_ "VV4U" [v4u] | ||
37 | const_ "VInt" [Int32] | ||
38 | const_ "VV2I" [v2i] | ||
39 | const_ "VV3I" [v3i] | ||
40 | const_ "VV4I" [v4i] | ||
41 | const_ "VFloat" [Float] | ||
42 | const_ "VV2F" [v2f] | ||
43 | const_ "VV3F" [v3f] | ||
44 | const_ "VV4F" [v4f] | ||
45 | const_ "VM22F" [m22] | ||
46 | const_ "VM23F" [m23] | ||
47 | const_ "VM24F" [m24] | ||
48 | const_ "VM32F" [m32] | ||
49 | const_ "VM33F" [m33] | ||
50 | const_ "VM34F" [m34] | ||
51 | const_ "VM42F" [m42] | ||
52 | const_ "VM43F" [m43] | ||
53 | const_ "VM44F" [m44] | ||
54 | |||
55 | data_ "InputType" $ do | ||
56 | enum_ "Bool" | ||
57 | enum_ "V2B" | ||
58 | enum_ "V3B" | ||
59 | enum_ "V4B" | ||
60 | enum_ "Word" | ||
61 | enum_ "V2U" | ||
62 | enum_ "V3U" | ||
63 | enum_ "V4U" | ||
64 | enum_ "Int" | ||
65 | enum_ "V2I" | ||
66 | enum_ "V3I" | ||
67 | enum_ "V4I" | ||
68 | enum_ "Float" | ||
69 | enum_ "V2F" | ||
70 | enum_ "V3F" | ||
71 | enum_ "V4F" | ||
72 | enum_ "M22F" | ||
73 | enum_ "M23F" | ||
74 | enum_ "M24F" | ||
75 | enum_ "M32F" | ||
76 | enum_ "M33F" | ||
77 | enum_ "M34F" | ||
78 | enum_ "M42F" | ||
79 | enum_ "M43F" | ||
80 | enum_ "M44F" | ||
81 | -- shadow textures | ||
82 | enum_ "STexture1D" | ||
83 | enum_ "STexture2D" | ||
84 | enum_ "STextureCube" | ||
85 | enum_ "STexture1DArray" | ||
86 | enum_ "STexture2DArray" | ||
87 | enum_ "STexture2DRect" | ||
88 | -- float textures | ||
89 | enum_ "FTexture1D" | ||
90 | enum_ "FTexture2D" | ||
91 | enum_ "FTexture3D" | ||
92 | enum_ "FTextureCube" | ||
93 | enum_ "FTexture1DArray" | ||
94 | enum_ "FTexture2DArray" | ||
95 | enum_ "FTexture2DMS" | ||
96 | enum_ "FTexture2DMSArray" | ||
97 | enum_ "FTextureBuffer" | ||
98 | enum_ "FTexture2DRect" | ||
99 | -- int textures | ||
100 | enum_ "ITexture1D" | ||
101 | enum_ "ITexture2D" | ||
102 | enum_ "ITexture3D" | ||
103 | enum_ "ITextureCube" | ||
104 | enum_ "ITexture1DArray" | ||
105 | enum_ "ITexture2DArray" | ||
106 | enum_ "ITexture2DMS" | ||
107 | enum_ "ITexture2DMSArray" | ||
108 | enum_ "ITextureBuffer" | ||
109 | enum_ "ITexture2DRect" | ||
110 | -- uint textures | ||
111 | enum_ "UTexture1D" | ||
112 | enum_ "UTexture2D" | ||
113 | enum_ "UTexture3D" | ||
114 | enum_ "UTextureCube" | ||
115 | enum_ "UTexture1DArray" | ||
116 | enum_ "UTexture2DArray" | ||
117 | enum_ "UTexture2DMS" | ||
118 | enum_ "UTexture2DMSArray" | ||
119 | enum_ "UTextureBuffer" | ||
120 | enum_ "UTexture2DRect" | ||
121 | deriving_ [Haskell] [Eq,Ord] | ||
122 | |||
123 | data_ "PointSpriteCoordOrigin" $ do | ||
124 | enum_ "LowerLeft" | ||
125 | enum_ "UpperLeft" | ||
126 | |||
127 | data_ "PointSize" $ do | ||
128 | const_ "PointSize" [Float] | ||
129 | enum_ "ProgramPointSize" | ||
130 | |||
131 | data_ "PolygonOffset" $ do | ||
132 | enum_ "NoOffset" | ||
133 | const_ "Offset" [Float,Float] | ||
134 | |||
135 | data_ "FrontFace" $ do | ||
136 | enum_ "CCW" | ||
137 | enum_ "CW" | ||
138 | |||
139 | data_ "PolygonMode" $ do | ||
140 | const_ "PolygonPoint" ["PointSize"] | ||
141 | const_ "PolygonLine" [Float] | ||
142 | enum_ "PolygonFill" | ||
143 | |||
144 | data_ "ProvokingVertex" $ do | ||
145 | enum_ "FirstVertex" | ||
146 | enum_ "LastVertex" | ||
147 | |||
148 | data_ "CullMode" $ do | ||
149 | enum_ "CullNone" | ||
150 | const_ "CullFront" ["FrontFace"] | ||
151 | const_ "CullBack" ["FrontFace"] | ||
152 | |||
153 | data_ "ComparisonFunction" $ do | ||
154 | enum_ "Never" | ||
155 | enum_ "Less" | ||
156 | enum_ "Equal" | ||
157 | enum_ "Lequal" | ||
158 | enum_ "Greater" | ||
159 | enum_ "Notequal" | ||
160 | enum_ "Gequal" | ||
161 | enum_ "Always" | ||
162 | |||
163 | "DepthFunction" #= "ComparisonFunction" | ||
164 | |||
165 | data_ "StencilOperation" $ do | ||
166 | enum_ "OpZero" | ||
167 | enum_ "OpKeep" | ||
168 | enum_ "OpReplace" | ||
169 | enum_ "OpIncr" | ||
170 | enum_ "OpIncrWrap" | ||
171 | enum_ "OpDecr" | ||
172 | enum_ "OpDecrWrap" | ||
173 | enum_ "OpInvert" | ||
174 | |||
175 | data_ "BlendEquation" $ do | ||
176 | enum_ "FuncAdd" | ||
177 | enum_ "FuncSubtract" | ||
178 | enum_ "FuncReverseSubtract" | ||
179 | enum_ "Min" | ||
180 | enum_ "Max" | ||
181 | |||
182 | data_ "BlendingFactor" $ do | ||
183 | enum_ "Zero" | ||
184 | enum_ "One" | ||
185 | enum_ "SrcColor" | ||
186 | enum_ "OneMinusSrcColor" | ||
187 | enum_ "DstColor" | ||
188 | enum_ "OneMinusDstColor" | ||
189 | enum_ "SrcAlpha" | ||
190 | enum_ "OneMinusSrcAlpha" | ||
191 | enum_ "DstAlpha" | ||
192 | enum_ "OneMinusDstAlpha" | ||
193 | enum_ "ConstantColor" | ||
194 | enum_ "OneMinusConstantColor" | ||
195 | enum_ "ConstantAlpha" | ||
196 | enum_ "OneMinusConstantAlpha" | ||
197 | enum_ "SrcAlphaSaturate" | ||
198 | |||
199 | data_ "LogicOperation" $ do | ||
200 | enum_ "Clear" | ||
201 | enum_ "And" | ||
202 | enum_ "AndReverse" | ||
203 | enum_ "Copy" | ||
204 | enum_ "AndInverted" | ||
205 | enum_ "Noop" | ||
206 | enum_ "Xor" | ||
207 | enum_ "Or" | ||
208 | enum_ "Nor" | ||
209 | enum_ "Equiv" | ||
210 | enum_ "Invert" | ||
211 | enum_ "OrReverse" | ||
212 | enum_ "CopyInverted" | ||
213 | enum_ "OrInverted" | ||
214 | enum_ "Nand" | ||
215 | enum_ "Set" | ||
216 | |||
217 | data_ "StencilOps" $ do | ||
218 | constR_ "StencilOps" | ||
219 | [ "frontStencilOp" #:: "StencilOperation" -- Used for front faced triangles and other primitives. | ||
220 | , "backStencilOp" #:: "StencilOperation" -- Used for back faced triangles. | ||
221 | ] | ||
222 | |||
223 | data_ "StencilTest" $ do | ||
224 | constR_ "StencilTest" | ||
225 | [ "stencilComparision" #:: "ComparisonFunction" -- The function used to compare the @stencilReference@ and the stencil buffers value with. | ||
226 | , "stencilReference" #:: Int32 -- The value to compare with the stencil buffer's value. | ||
227 | , "stencilMask" #:: Word32 -- A bit mask with ones in each position that should be compared and written to the stencil buffer. | ||
228 | ] | ||
229 | |||
230 | data_ "StencilTests" $ do | ||
231 | const_ "StencilTests" ["StencilTest", "StencilTest"] | ||
232 | |||
233 | -- primitive types | ||
234 | data_ "FetchPrimitive" $ do | ||
235 | enum_ "Points" | ||
236 | enum_ "Lines" | ||
237 | enum_ "Triangles" | ||
238 | enum_ "LinesAdjacency" | ||
239 | enum_ "TrianglesAdjacency" | ||
240 | deriving_ [PureScript] [Show,Eq] | ||
241 | |||
242 | data_ "OutputPrimitive" $ do | ||
243 | enum_ "TrianglesOutput" | ||
244 | enum_ "LinesOutput" | ||
245 | enum_ "PointsOutput" | ||
246 | |||
247 | data_ "ColorArity" $ do | ||
248 | enum_ "Red" | ||
249 | enum_ "RG" | ||
250 | enum_ "RGB" | ||
251 | enum_ "RGBA" | ||
252 | deriving_ [PureScript] [Show] | ||
253 | |||
254 | data_ "Blending" $ do | ||
255 | enum_ "NoBlending" | ||
256 | const_ "BlendLogicOp" ["LogicOperation"] | ||
257 | constR_ "Blend" | ||
258 | [ "colorEqSrc" #:: "BlendEquation" | ||
259 | , "alphaEqSrc" #:: "BlendEquation" | ||
260 | , "colorFSrc" #:: "BlendingFactor" | ||
261 | , "colorFDst" #:: "BlendingFactor" | ||
262 | , "alphaFSrc" #:: "BlendingFactor" | ||
263 | , "alphaFDst" #:: "BlendingFactor" | ||
264 | , "color" #:: v4f | ||
265 | ] | ||
266 | |||
267 | data_ "RasterContext" $ do | ||
268 | const_ "PointCtx" ["PointSize", Float, "PointSpriteCoordOrigin"] | ||
269 | const_ "LineCtx" [Float, "ProvokingVertex"] | ||
270 | const_ "TriangleCtx" ["CullMode", "PolygonMode", "PolygonOffset", "ProvokingVertex"] | ||
271 | |||
272 | data_ "FragmentOperation" $ do | ||
273 | const_ "DepthOp" ["DepthFunction", Bool] | ||
274 | const_ "StencilOp" ["StencilTests", "StencilOps", "StencilOps"] | ||
275 | const_ "ColorOp" ["Blending", "Value"] | ||
276 | |||
277 | data_ "AccumulationContext" $ do | ||
278 | constR_ "AccumulationContext" | ||
279 | [ "accViewportName" #:: Maybe String | ||
280 | , "accOperations" #:: List "FragmentOperation" | ||
281 | ] | ||
282 | |||
283 | data_ "TextureDataType" $ do | ||
284 | const_ "FloatT" ["ColorArity"] | ||
285 | const_ "IntT" ["ColorArity"] | ||
286 | const_ "WordT" ["ColorArity"] | ||
287 | enum_ "ShadowT" | ||
288 | deriving_ [PureScript] [Show] | ||
289 | |||
290 | data_ "TextureType" $ do | ||
291 | const_ "Texture1D" ["TextureDataType", Int] | ||
292 | const_ "Texture2D" ["TextureDataType", Int] | ||
293 | const_ "Texture3D" ["TextureDataType"] | ||
294 | const_ "TextureCube" ["TextureDataType"] | ||
295 | const_ "TextureRect" ["TextureDataType"] | ||
296 | const_ "Texture2DMS" ["TextureDataType", Int, Int, Bool] | ||
297 | const_ "TextureBuffer" ["TextureDataType"] | ||
298 | |||
299 | data_ "MipMap" $ do | ||
300 | const_ "Mip" [Int,Int] -- Base level, Max level | ||
301 | enum_ "NoMip" | ||
302 | const_ "AutoMip" [Int,Int] -- Base level, Max level | ||
303 | |||
304 | data_ "Filter" $ do | ||
305 | enum_ "Nearest" | ||
306 | enum_ "Linear" | ||
307 | enum_ "NearestMipmapNearest" | ||
308 | enum_ "NearestMipmapLinear" | ||
309 | enum_ "LinearMipmapNearest" | ||
310 | enum_ "LinearMipmapLinear" | ||
311 | |||
312 | data_ "EdgeMode" $ do | ||
313 | enum_ "Repeat" | ||
314 | enum_ "MirroredRepeat" | ||
315 | enum_ "ClampToEdge" | ||
316 | enum_ "ClampToBorder" | ||
317 | |||
318 | data_ "ImageSemantic" $ do | ||
319 | enum_ "Depth" | ||
320 | enum_ "Stencil" | ||
321 | enum_ "Color" | ||
322 | deriving_ [Haskell] [Eq] | ||
323 | |||
324 | data_ "ImageRef" $ do | ||
325 | const_ "TextureImage" ["TextureName", Int, Maybe Int] -- Texture name, mip index, array index | ||
326 | const_ "Framebuffer" ["ImageSemantic"] | ||
327 | |||
328 | data_ "ClearImage" $ do | ||
329 | constR_ "ClearImage" | ||
330 | [ "imageSemantic" #:: "ImageSemantic" | ||
331 | , "clearValue" #:: "Value" | ||
332 | ] | ||
333 | |||
334 | data_ "Command" $ do | ||
335 | const_ "SetRasterContext" ["RasterContext"] | ||
336 | const_ "SetAccumulationContext" ["AccumulationContext"] | ||
337 | const_ "SetRenderTarget" ["RenderTargetName"] | ||
338 | const_ "SetProgram" ["ProgramName"] --TextureUnitMapping -- adding texture unit map to set program command seems to be better solution than the current one | ||
339 | const_ "SetSamplerUniform" ["UniformName", "TextureUnit"] -- hint: currently the texture unit mapping is encoded with this command | ||
340 | const_ "SetTexture" ["TextureUnit", "TextureName"] -- binds texture to the specified texture unit | ||
341 | const_ "SetSampler" ["TextureUnit", Maybe "SamplerName"] -- binds sampler to the specified texture unit | ||
342 | const_ "RenderSlot" ["SlotName"] | ||
343 | const_ "RenderStream" ["StreamName"] | ||
344 | const_ "ClearRenderTarget" [Array "ClearImage"] | ||
345 | const_ "GenerateMipMap" ["TextureUnit"] | ||
346 | const_ "SaveImage" ["FrameBufferComponent", "ImageRef"] -- from framebuffer component to texture (image) | ||
347 | const_ "LoadImage" ["ImageRef", "FrameBufferComponent"] -- from texture (image) to framebuffer component | ||
348 | |||
349 | data_ "SamplerDescriptor" $ do | ||
350 | constR_ "SamplerDescriptor" | ||
351 | [ "samplerWrapS" #:: "EdgeMode" | ||
352 | , "samplerWrapT" #:: Maybe "EdgeMode" | ||
353 | , "samplerWrapR" #:: Maybe "EdgeMode" | ||
354 | , "samplerMinFilter" #:: "Filter" | ||
355 | , "samplerMagFilter" #:: "Filter" | ||
356 | , "samplerBorderColor" #:: "Value" | ||
357 | , "samplerMinLod" #:: Maybe Float | ||
358 | , "samplerMaxLod" #:: Maybe Float | ||
359 | , "samplerLodBias" #:: Float | ||
360 | , "samplerCompareFunc" #:: Maybe "ComparisonFunction" | ||
361 | ] | ||
362 | |||
363 | data_ "TextureDescriptor" $ do -- texture size, type, array, mipmap | ||
364 | constR_ "TextureDescriptor" | ||
365 | [ "textureType" #:: "TextureType" | ||
366 | , "textureSize" #:: "Value" | ||
367 | , "textureSemantic" #:: "ImageSemantic" | ||
368 | , "textureSampler" #:: "SamplerDescriptor" | ||
369 | , "textureBaseLevel" #:: Int | ||
370 | , "textureMaxLevel" #:: Int | ||
371 | ] | ||
372 | |||
373 | data_ "Parameter" $ do | ||
374 | constR_ "Parameter" | ||
375 | [ "name" #:: String | ||
376 | , "ty" #:: "InputType" | ||
377 | ] | ||
378 | |||
379 | data_ "Program" $ do -- AST, input | ||
380 | constR_ "Program" | ||
381 | [ "programUniforms" #:: Map "UniformName" "InputType" -- uniform input (value based uniforms only / no textures) | ||
382 | , "programStreams" #:: Map "UniformName" "Parameter" -- vertex shader input attribute name -> (slot attribute name, attribute type) | ||
383 | , "programInTextures" #:: Map "UniformName" "InputType" -- all textures (uniform textures and render textures) referenced by the program | ||
384 | , "programOutput" #:: Array "Parameter" | ||
385 | , "vertexShader" #:: String | ||
386 | , "geometryShader" #:: Maybe String | ||
387 | , "fragmentShader" #:: String | ||
388 | ] | ||
389 | |||
390 | data_ "Slot" $ do -- input, primitive type | ||
391 | constR_ "Slot" | ||
392 | [ "slotName" #:: String | ||
393 | , "slotStreams" #:: Map String "InputType" | ||
394 | , "slotUniforms" #:: Map "UniformName" "InputType" | ||
395 | , "slotPrimitive" #:: "FetchPrimitive" | ||
396 | , "slotPrograms" #:: Array "ProgramName" | ||
397 | ] | ||
398 | |||
399 | data_ "StreamData" $ do | ||
400 | constR_ "StreamData" | ||
401 | [ "streamData" #:: Map String "ArrayValue" | ||
402 | , "streamType" #:: Map String "InputType" | ||
403 | , "streamPrimitive" #:: "FetchPrimitive" | ||
404 | , "streamPrograms" #:: Array "ProgramName" | ||
405 | ] | ||
406 | |||
407 | data_ "TargetItem" $ do | ||
408 | constR_ "TargetItem" | ||
409 | [ "targetSemantic" #:: "ImageSemantic" | ||
410 | , "targetRef" #:: Maybe "ImageRef" | ||
411 | ] | ||
412 | |||
413 | data_ "RenderTarget" $ do | ||
414 | constR_ "RenderTarget" | ||
415 | [ "renderTargets" #:: Array "TargetItem" -- render texture or default framebuffer (semantic, render texture for the program output) | ||
416 | ] | ||
417 | |||
418 | data_ "Backend" $ do | ||
419 | enum_ "WebGL1" | ||
420 | enum_ "OpenGL33" | ||
421 | |||
422 | data_ "Pipeline" $ do | ||
423 | constR_ "Pipeline" | ||
424 | [ "backend" #:: "Backend" | ||
425 | , "textures" #:: Array "TextureDescriptor" | ||
426 | , "samplers" #:: Array "SamplerDescriptor" | ||
427 | , "targets" #:: Array "RenderTarget" | ||
428 | , "programs" #:: Array "Program" | ||
429 | , "slots" #:: Array "Slot" | ||
430 | , "streams" #:: Array "StreamData" | ||
431 | , "commands" #:: Array "Command" | ||
432 | ] | ||
433 | deriving_ [Haskell] [Show] | ||
434 | |||
435 | mesh = do | ||
436 | data_ "MeshAttribute" $ do | ||
437 | const_ "A_Float" [Array Float] | ||
438 | const_ "A_V2F" [Array v2f] | ||
439 | const_ "A_V3F" [Array v3f] | ||
440 | const_ "A_V4F" [Array v4f] | ||
441 | const_ "A_M22F" [Array m22] | ||
442 | const_ "A_M33F" [Array m33] | ||
443 | const_ "A_M44F" [Array m44] | ||
444 | const_ "A_Int" [Array Int32] | ||
445 | const_ "A_Word" [Array Word32] | ||
446 | |||
447 | data_ "MeshPrimitive" $ do | ||
448 | enum_ "P_Points" | ||
449 | enum_ "P_TriangleStrip" | ||
450 | enum_ "P_Triangles" | ||
451 | const_ "P_TriangleStripI" [Array Int32] | ||
452 | const_ "P_TrianglesI" [Array Int32] | ||
453 | |||
454 | data_ "Mesh" $ do | ||
455 | constR_ "Mesh" | ||
456 | [ "mAttributes" #:: Map String "MeshAttribute" | ||
457 | , "mPrimitive" #:: "MeshPrimitive" | ||
458 | ] | ||
459 | |||
460 | typeInfo = do | ||
461 | data_ "TypeInfo" $ do | ||
462 | constR_ "TypeInfo" | ||
463 | [ "startLine" #:: Int | ||
464 | , "startColumn" #:: Int | ||
465 | , "endLine" #:: Int | ||
466 | , "endColumn" #:: Int | ||
467 | , "text" #:: String | ||
468 | ] | ||
469 | |||
470 | data_ "MyEither" $ do | ||
471 | const_ "MyLeft" ["TypeInfo", Array "TypeInfo"] | ||
472 | const_ "MyRight" ["Pipeline", Array "TypeInfo"] | ||
473 | |||
474 | modules = do | ||
475 | module_ "IR" ir | ||
476 | module_ "Mesh" mesh | ||
477 | module_ "TypeInfo" $ do | ||
478 | import_ ["IR"] | ||
479 | typeInfo | ||