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