Mercurial > games > semicongine
comparison tests/test_text.nim @ 1399:dde74be11b49
did: continue a lot on glyph renderer
author | sam <sam@basx.dev> |
---|---|
date | Sun, 15 Dec 2024 00:21:12 +0700 |
parents | f7bf7a5cc1e7 |
children | 20602878744e |
comparison
equal
deleted
inserted
replaced
1398:f7bf7a5cc1e7 | 1399:dde74be11b49 |
---|---|
14 type FontDS = object | 14 type FontDS = object |
15 fontAtlas: Image[Gray] | 15 fontAtlas: Image[Gray] |
16 | 16 |
17 type EMPTY = object | 17 type EMPTY = object |
18 | 18 |
19 const N_GLYPHS = 200 | 19 const MAX_GLYPHS = 200 |
20 proc test_01_static_label_new(time: float32) = | 20 proc test_01_static_label_new(time: float32) = |
21 # var font = loadFont("Overhaul.ttf", lineHeightPixels = 160) | 21 # var font = loadFont("Overhaul.ttf", lineHeightPixels = 160) |
22 var font = loadFont("DejaVuSans.ttf", lineHeightPixels = 160) | 22 var font = loadFont[MAX_GLYPHS]("DejaVuSans.ttf", lineHeightPixels = 160) |
23 var renderdata = initRenderData() | 23 var renderdata = initRenderData() |
24 var pipeline = | 24 var pipeline = |
25 createPipeline[GlyphShader[N_GLYPHS]](renderPass = vulkan.swapchain.renderPass) | 25 createPipeline[GlyphShader[MAX_GLYPHS]](renderPass = vulkan.swapchain.renderPass) |
26 var (ds, glyphtable) = glyphDescriptorSet(font, N_GLYPHS) | 26 var glyphs = initGlyphs(1000) |
27 var glyphs = Glyphs( | |
28 position: asGPUArray( | |
29 [ | |
30 vec3(-1, 0, 0), | |
31 vec3(-0.6, 0, 0), | |
32 vec3(-0.3, 0, 0), | |
33 vec3(0, 0, 0), | |
34 vec3(0.3, 0, 0), | |
35 vec3(0.6, 0, 0), | |
36 ], | |
37 VertexBufferMapped, | |
38 ), | |
39 scale: asGPUArray([1'f32, 1'f32, 1'f32, 1'f32, 1'f32, 1'f32], VertexBufferMapped), | |
40 color: asGPUArray( | |
41 [ | |
42 vec4(1, 1, 0, 1), | |
43 vec4(0, 0, 1, 1), | |
44 vec4(1, 1, 1, 1), | |
45 vec4(1, 1, 0, 1), | |
46 vec4(0, 0, 1, 1), | |
47 vec4(1, 1, 1, 1), | |
48 ], | |
49 VertexBufferMapped, | |
50 ), | |
51 glyphIndex: asGPUArray( | |
52 [ | |
53 glyphtable[Rune('a')], | |
54 glyphtable[Rune('l')], | |
55 glyphtable[Rune('i')], | |
56 glyphtable[Rune('g')], | |
57 glyphtable[Rune('x')], | |
58 glyphtable[Rune('x')], | |
59 ], | |
60 VertexBufferMapped, | |
61 ), | |
62 ) | |
63 | 27 |
64 assignBuffers(renderdata, glyphs) | 28 assignBuffers(renderdata, glyphs) |
65 assignBuffers(renderdata, ds) | 29 assignBuffers(renderdata, font.descriptorSet) |
66 uploadImages(renderdata, ds) | 30 uploadImages(renderdata, font.descriptorSet) |
67 initDescriptorSet(renderdata, pipeline.layout(0), ds) | 31 initDescriptorSet(renderdata, pipeline.layout(0), font.descriptorSet) |
68 | 32 |
69 var start = getMonoTime() | 33 glyphs.set(font[], "semicongine".toRunes(), vec3()) |
70 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: | 34 |
71 withNextFrame(framebuffer, commandbuffer): | 35 glyphs.updateAllGPUBuffers(flush = true) |
72 bindDescriptorSet(commandbuffer, ds, 0, pipeline) | 36 |
73 withRenderPass( | 37 var start = getMonoTime() |
74 vulkan.swapchain.renderPass, | 38 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: |
75 framebuffer, | 39 withNextFrame(framebuffer, commandbuffer): |
76 commandbuffer, | 40 bindDescriptorSet(commandbuffer, font.descriptorSet, 0, pipeline) |
77 vulkan.swapchain.width, | 41 withRenderPass( |
78 vulkan.swapchain.height, | 42 vulkan.swapchain.renderPass, |
79 vec4(0, 0, 0, 0), | 43 framebuffer, |
80 ): | 44 commandbuffer, |
81 withPipeline(commandbuffer, pipeline): | 45 vulkan.swapchain.width, |
82 render( | 46 vulkan.swapchain.height, |
83 commandbuffer, | 47 vec4(0, 0, 0, 0), |
84 pipeline, | 48 ): |
85 EMPTY(), | 49 withPipeline(commandbuffer, pipeline): |
86 glyphs, | 50 renderGlyphs(commandbuffer, pipeline, glyphs) |
87 fixedVertexCount = 6, # fixedInstanceCount = 2, | |
88 ) | |
89 | 51 |
90 # cleanup | 52 # cleanup |
91 checkVkResult vkDeviceWaitIdle(vulkan.device) | 53 checkVkResult vkDeviceWaitIdle(vulkan.device) |
92 destroyPipeline(pipeline) | 54 destroyPipeline(pipeline) |
93 destroyRenderData(renderdata) | 55 destroyRenderData(renderdata) |
94 | 56 |
57 #[ | |
95 proc test_01_static_label(time: float32) = | 58 proc test_01_static_label(time: float32) = |
96 var font = loadFont("Overhaul.ttf", lineHeightPixels = 160) | 59 var font = loadFont[MAX_GLYPHS]("Overhaul.ttf", lineHeightPixels = 160) |
97 var renderdata = initRenderData() | 60 var renderdata = initRenderData() |
98 var pipeline = | 61 var pipeline = |
99 createPipeline[DefaultFontShader[FontDS]](renderPass = vulkan.swapchain.renderPass) | 62 createPipeline[GlyphShader[MAX_GLYPHS]](renderPass = vulkan.swapchain.renderPass) |
100 | 63 |
101 var ds = asDescriptorSetData(FontDS(fontAtlas: font.fontAtlas.copy())) | 64 var ds = asDescriptorSetData(FontDS(fontAtlas: font.fontAtlas.copy())) |
102 uploadImages(renderdata, ds) | 65 uploadImages(renderdata, ds) |
103 initDescriptorSet(renderdata, pipeline.layout(0), ds) | 66 initDescriptorSet(renderdata, pipeline.layout(0), ds) |
104 | 67 |
124 checkVkResult vkDeviceWaitIdle(vulkan.device) | 87 checkVkResult vkDeviceWaitIdle(vulkan.device) |
125 destroyPipeline(pipeline) | 88 destroyPipeline(pipeline) |
126 destroyRenderData(renderdata) | 89 destroyRenderData(renderdata) |
127 | 90 |
128 proc test_02_multiple_animated(time: float32) = | 91 proc test_02_multiple_animated(time: float32) = |
129 var font1 = loadFont("Overhaul.ttf", lineHeightPixels = 40) | 92 var font1 = loadFont[MAX_GLYPHS]("Overhaul.ttf", lineHeightPixels = 40) |
130 var font2 = loadFont("Overhaul.ttf", lineHeightPixels = 160) | 93 var font2 = loadFont[MAX_GLYPHS]("Overhaul.ttf", lineHeightPixels = 160) |
131 var font3 = loadFont("DejaVuSans.ttf", lineHeightPixels = 160) | 94 var font3 = loadFont[MAX_GLYPHS]("DejaVuSans.ttf", lineHeightPixels = 160) |
132 var renderdata = initRenderData() | 95 var renderdata = initRenderData() |
133 | 96 |
134 var pipeline = | 97 var pipeline = |
135 createPipeline[DefaultFontShader[FontDS]](renderPass = vulkan.swapchain.renderPass) | 98 createPipeline[GlyphShader[MAX_GLYPHS]](renderPass = vulkan.swapchain.renderPass) |
136 | 99 |
137 var ds1 = asDescriptorSetData(FontDS(fontAtlas: font1.fontAtlas.copy())) | 100 var ds1 = asDescriptorSetData(FontDS(fontAtlas: font1.fontAtlas.copy())) |
138 uploadImages(renderdata, ds1) | 101 uploadImages(renderdata, ds1) |
139 initDescriptorSet(renderdata, pipeline.layout(0), ds1) | 102 initDescriptorSet(renderdata, pipeline.layout(0), ds1) |
140 | 103 |
199 checkVkResult vkDeviceWaitIdle(vulkan.device) | 162 checkVkResult vkDeviceWaitIdle(vulkan.device) |
200 destroyPipeline(pipeline) | 163 destroyPipeline(pipeline) |
201 destroyRenderData(renderdata) | 164 destroyRenderData(renderdata) |
202 | 165 |
203 proc test_03_layouting(time: float32) = | 166 proc test_03_layouting(time: float32) = |
204 var font = loadFont("DejaVuSans.ttf", lineHeightPixels = 40) | 167 var font = loadFont[MAX_GLYPHS]("DejaVuSans.ttf", lineHeightPixels = 40) |
205 var renderdata = initRenderData() | 168 var renderdata = initRenderData() |
206 | 169 |
207 var pipeline = | 170 var pipeline = |
208 createPipeline[DefaultFontShader[FontDS]](renderPass = vulkan.swapchain.renderPass) | 171 createPipeline[GlyphShader[MAX_GLYPHS]](renderPass = vulkan.swapchain.renderPass) |
209 | 172 |
210 var ds = asDescriptorSetData(FontDS(fontAtlas: font.fontAtlas.copy())) | 173 var ds = asDescriptorSetData(FontDS(fontAtlas: font.fontAtlas.copy())) |
211 uploadImages(renderdata, ds) | 174 uploadImages(renderdata, ds) |
212 initDescriptorSet(renderdata, pipeline.layout(0), ds) | 175 initDescriptorSet(renderdata, pipeline.layout(0), ds) |
213 | 176 |
272 checkVkResult vkDeviceWaitIdle(vulkan.device) | 235 checkVkResult vkDeviceWaitIdle(vulkan.device) |
273 destroyPipeline(pipeline) | 236 destroyPipeline(pipeline) |
274 destroyRenderData(renderdata) | 237 destroyRenderData(renderdata) |
275 | 238 |
276 proc test_04_lots_of_texts(time: float32) = | 239 proc test_04_lots_of_texts(time: float32) = |
277 var font = loadFont("DejaVuSans.ttf", lineHeightPixels = 160) | 240 var font = loadFont[MAX_GLYPHS]("DejaVuSans.ttf", lineHeightPixels = 160) |
278 var renderdata = initRenderData() | 241 var renderdata = initRenderData() |
279 | 242 |
280 var pipeline = | 243 var pipeline = |
281 createPipeline[DefaultFontShader[FontDS]](renderPass = vulkan.swapchain.renderPass) | 244 createPipeline[GlyphShader[MAX_GLYPHS]](renderPass = vulkan.swapchain.renderPass) |
282 | 245 |
283 var ds = asDescriptorSetData(FontDS(fontAtlas: font.fontAtlas.copy())) | 246 var ds = asDescriptorSetData(FontDS(fontAtlas: font.fontAtlas.copy())) |
284 uploadImages(renderdata, ds) | 247 uploadImages(renderdata, ds) |
285 initDescriptorSet(renderdata, pipeline.layout(0), ds) | 248 initDescriptorSet(renderdata, pipeline.layout(0), ds) |
286 | 249 |
317 | 280 |
318 # cleanup | 281 # cleanup |
319 checkVkResult vkDeviceWaitIdle(vulkan.device) | 282 checkVkResult vkDeviceWaitIdle(vulkan.device) |
320 destroyPipeline(pipeline) | 283 destroyPipeline(pipeline) |
321 destroyRenderData(renderdata) | 284 destroyRenderData(renderdata) |
285 ]# | |
322 | 286 |
323 when isMainModule: | 287 when isMainModule: |
324 var time = 1000'f32 | 288 var time = 1000'f32 |
325 initVulkan() | 289 initVulkan() |
326 | 290 |