comparison tests/test_text.nim @ 1423:3b8a736c45a7

did: put almost all global state into a single struct
author sam <sam@basx.dev>
date Thu, 09 Jan 2025 23:03:47 +0700
parents 5e5a3311ca44
children 676fc13685a9
comparison
equal deleted inserted replaced
1422:6f0c1b347403 1423:3b8a736c45a7
13 13
14 const MAX_CODEPOINTS = 200 14 const MAX_CODEPOINTS = 200
15 const FONTNAME = "Overhaul.ttf" 15 const FONTNAME = "Overhaul.ttf"
16 # const FONTNAME = "DejaVuSans.ttf" 16 # const FONTNAME = "DejaVuSans.ttf"
17 17
18 proc test_01_static_label(time: float32) = 18 proc test_01_static_label(time: float32, renderPass: RenderPass) =
19 var font = loadFont[MAX_CODEPOINTS](FONTNAME, lineHeightPixels = 200) 19 var font = loadFont[MAX_CODEPOINTS](FONTNAME, lineHeightPixels = 200)
20 var renderdata = initRenderData() 20 var renderdata = initRenderData()
21 var pipeline = createPipeline( 21 var pipeline = createPipeline(GlyphShader[MAX_CODEPOINTS](), renderPass = renderPass)
22 GlyphShader[MAX_CODEPOINTS](), renderPass = vulkan.swapchain.renderPass
23 )
24 var textbuffer = font.initTextBuffer(1000, renderdata, baseScale = 0.1) 22 var textbuffer = font.initTextBuffer(1000, renderdata, baseScale = 0.1)
25 23
26 font.upload(renderdata) 24 font.upload(renderdata)
27 font.addToPipeline(renderdata, pipeline) 25 font.addToPipeline(renderdata, pipeline)
28 26
29 # small drop-shadow 27 # small drop-shadow
30 discard textbuffer.add( 28 discard textbuffer.add(
31 "Hello semicongine!", 29 "Hello semicongine!",
32 vec3(0.009, -0.009 * getAspectRatio(), 0.002), 30 vec3(0.009, -0.009 * getAspectRatio(), 0.2),
33 color = vec4(0.02, 0.02, 0.02, 1), 31 color = vec4(0.02, 0.02, 0.02, 1),
34 scale = 1.01, 32 scale = 1.01,
35 ) 33 )
36 discard textbuffer.add("Hello semicongine!", vec3(0, 0, 0)) 34 discard textbuffer.add("Hello semicongine!", vec3(0, 0, 0.1))
37 35
38 var start = getMonoTime() 36 var start = getMonoTime()
39 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time: 37 while ((getMonoTime() - start).inMilliseconds().int / 1000) < time:
40 let t = getMonoTime() 38 let t = getMonoTime()
41 if windowWasResized(): 39 if windowWasResized():
42 textbuffer.refresh() 40 textbuffer.refresh()
43 41
44 withNextFrame(framebuffer, commandbuffer): 42 withNextFrame(framebuffer, commandbuffer):
45 font.bindTo(pipeline, commandbuffer) 43 font.bindTo(pipeline, commandbuffer)
46 withRenderPass( 44 withRenderPass(
47 vulkan.swapchain.renderPass, 45 renderPass,
48 framebuffer, 46 framebuffer,
49 commandbuffer, 47 commandbuffer,
50 vulkan.swapchain.width, 48 frameWidth(),
51 vulkan.swapchain.height, 49 frameHeight(),
52 vec4(0, 0, 0, 0), 50 vec4(0, 0, 0, 0),
53 ): 51 ):
54 withPipeline(commandbuffer, pipeline): 52 withPipeline(commandbuffer, pipeline):
55 renderTextBuffer(commandbuffer, pipeline, textbuffer) 53 renderTextBuffer(commandbuffer, pipeline, textbuffer)
56 54
57 # cleanup 55 # cleanup
58 checkVkResult vkDeviceWaitIdle(vulkan.device) 56 checkVkResult vkDeviceWaitIdle(engine().vulkan.device)
59 destroyPipeline(pipeline) 57 destroyPipeline(pipeline)
60 destroyRenderData(renderdata) 58 destroyRenderData(renderdata)
61 59
62 proc test_02_multi_counter(time: float32) = 60 proc test_02_multi_counter(time: float32, renderPass: RenderPass) =
63 var font1 = loadFont[MAX_CODEPOINTS]("Overhaul.ttf", lineHeightPixels = 40) 61 var font1 = loadFont[MAX_CODEPOINTS]("Overhaul.ttf", lineHeightPixels = 40)
64 var font2 = loadFont[MAX_CODEPOINTS]("Overhaul.ttf", lineHeightPixels = 160) 62 var font2 = loadFont[MAX_CODEPOINTS]("Overhaul.ttf", lineHeightPixels = 160)
65 var font3 = loadFont[MAX_CODEPOINTS]("DejaVuSans.ttf", lineHeightPixels = 160) 63 var font3 = loadFont[MAX_CODEPOINTS]("DejaVuSans.ttf", lineHeightPixels = 160)
66 var renderdata = initRenderData() 64 var renderdata = initRenderData()
67 65
68 var pipeline = createPipeline( 66 var pipeline = createPipeline(GlyphShader[MAX_CODEPOINTS](), renderPass = renderPass)
69 GlyphShader[MAX_CODEPOINTS](), renderPass = vulkan.swapchain.renderPass
70 )
71 67
72 font1.upload(renderdata) 68 font1.upload(renderdata)
73 font2.upload(renderdata) 69 font2.upload(renderdata)
74 font3.upload(renderdata) 70 font3.upload(renderdata)
75 font1.addToPipeline(renderdata, pipeline) 71 font1.addToPipeline(renderdata, pipeline)
99 textbuffer2.refresh() 95 textbuffer2.refresh()
100 textbuffer3.refresh() 96 textbuffer3.refresh()
101 97
102 withNextFrame(framebuffer, commandbuffer): 98 withNextFrame(framebuffer, commandbuffer):
103 withRenderPass( 99 withRenderPass(
104 vulkan.swapchain.renderPass, 100 renderPass,
105 framebuffer, 101 framebuffer,
106 commandbuffer, 102 commandbuffer,
107 vulkan.swapchain.width, 103 frameWidth(),
108 vulkan.swapchain.height, 104 frameHeight(),
109 vec4(0, 0, 0, 0), 105 vec4(0, 0, 0, 0),
110 ): 106 ):
111 withPipeline(commandbuffer, pipeline): 107 withPipeline(commandbuffer, pipeline):
112 bindDescriptorSet(commandbuffer, font1.descriptorSet, 3, pipeline) 108 bindDescriptorSet(commandbuffer, font1.descriptorSet, 3, pipeline)
113 renderTextBuffer(commandbuffer, pipeline, textbuffer1) 109 renderTextBuffer(commandbuffer, pipeline, textbuffer1)
115 renderTextBuffer(commandbuffer, pipeline, textbuffer2) 111 renderTextBuffer(commandbuffer, pipeline, textbuffer2)
116 bindDescriptorSet(commandbuffer, font3.descriptorSet, 3, pipeline) 112 bindDescriptorSet(commandbuffer, font3.descriptorSet, 3, pipeline)
117 renderTextBuffer(commandbuffer, pipeline, textbuffer3) 113 renderTextBuffer(commandbuffer, pipeline, textbuffer3)
118 114
119 # cleanup 115 # cleanup
120 checkVkResult vkDeviceWaitIdle(vulkan.device) 116 checkVkResult vkDeviceWaitIdle(engine().vulkan.device)
121 destroyPipeline(pipeline) 117 destroyPipeline(pipeline)
122 destroyRenderData(renderdata) 118 destroyRenderData(renderdata)
123 119
124 proc test_03_layouting(time: float32) = 120 proc test_03_layouting(time: float32, renderPass: RenderPass) =
125 var font = loadFont[MAX_CODEPOINTS]("DejaVuSans.ttf", lineHeightPixels = 160) 121 var font = loadFont[MAX_CODEPOINTS]("DejaVuSans.ttf", lineHeightPixels = 160)
126 var renderdata = initRenderData() 122 var renderdata = initRenderData()
127 123
128 var pipeline = createPipeline( 124 var pipeline = createPipeline(GlyphShader[MAX_CODEPOINTS](), renderPass = renderPass)
129 GlyphShader[MAX_CODEPOINTS](), renderPass = vulkan.swapchain.renderPass
130 )
131 125
132 font.upload(renderdata) 126 font.upload(renderdata)
133 font.addToPipeline(renderdata, pipeline) 127 font.addToPipeline(renderdata, pipeline)
134 128
135 var textbuffer = font.initTextBuffer(1000, renderdata, baseScale = 0.1) 129 var textbuffer = font.initTextBuffer(1000, renderdata, baseScale = 0.1)
157 textbuffer.refresh() 151 textbuffer.refresh()
158 152
159 withNextFrame(framebuffer, commandbuffer): 153 withNextFrame(framebuffer, commandbuffer):
160 bindDescriptorSet(commandbuffer, font.descriptorSet, 3, pipeline) 154 bindDescriptorSet(commandbuffer, font.descriptorSet, 3, pipeline)
161 withRenderPass( 155 withRenderPass(
162 vulkan.swapchain.renderPass, 156 renderPass,
163 framebuffer, 157 framebuffer,
164 commandbuffer, 158 commandbuffer,
165 vulkan.swapchain.width, 159 frameWidth(),
166 vulkan.swapchain.height, 160 frameHeight(),
167 vec4(0, 0, 0, 0), 161 vec4(0, 0, 0, 0),
168 ): 162 ):
169 withPipeline(commandbuffer, pipeline): 163 withPipeline(commandbuffer, pipeline):
170 renderTextBuffer(commandbuffer, pipeline, textbuffer) 164 renderTextBuffer(commandbuffer, pipeline, textbuffer)
171 165
172 # cleanup 166 # cleanup
173 checkVkResult vkDeviceWaitIdle(vulkan.device) 167 checkVkResult vkDeviceWaitIdle(engine().vulkan.device)
174 destroyPipeline(pipeline) 168 destroyPipeline(pipeline)
175 destroyRenderData(renderdata) 169 destroyRenderData(renderdata)
176 170
177 proc test_04_lots_of_texts(time: float32) = 171 proc test_04_lots_of_texts(time: float32, renderPass: RenderPass) =
178 var font = loadFont[MAX_CODEPOINTS]("DejaVuSans.ttf", lineHeightPixels = 160) 172 var font = loadFont[MAX_CODEPOINTS]("DejaVuSans.ttf", lineHeightPixels = 160)
179 var renderdata = initRenderData() 173 var renderdata = initRenderData()
180 174
181 var pipeline = createPipeline( 175 var pipeline = createPipeline(GlyphShader[MAX_CODEPOINTS](), renderPass = renderPass)
182 GlyphShader[MAX_CODEPOINTS](), renderPass = vulkan.swapchain.renderPass
183 )
184 176
185 font.upload(renderdata) 177 font.upload(renderdata)
186 font.addToPipeline(renderdata, pipeline) 178 font.addToPipeline(renderdata, pipeline)
187 179
188 var textbuffer = font.initTextBuffer(3000, renderdata, baseScale = 0.1) 180 var textbuffer = font.initTextBuffer(3000, renderdata, baseScale = 0.1)
189 181
190 for i in 0 ..< 1000: 182 for i in 0 ..< 1000:
191 discard textbuffer.add( 183 discard textbuffer.add(
192 $i, 184 $i,
193 vec3(rand(-0.8 .. 0.8), rand(-0.8 .. 0.8), rand(-0.1 .. 0.1)), 185 vec3(rand(-0.8 .. 0.8), rand(-0.8 .. 0.8), rand(0.1 .. 0.2)),
194 color = 186 color =
195 vec4(rand(0.5 .. 1.0), rand(0.5 .. 1.0), rand(0.5 .. 1.0), rand(0.5 .. 1.0)), 187 vec4(rand(0.5 .. 1.0), rand(0.5 .. 1.0), rand(0.5 .. 1.0), rand(0.5 .. 1.0)),
196 scale = rand(0.5'f32 .. 1.5'f32), 188 scale = rand(0.5'f32 .. 1.5'f32),
197 ) 189 )
198 190
205 withNextFrame(framebuffer, commandbuffer): 197 withNextFrame(framebuffer, commandbuffer):
206 if windowWasResized(): 198 if windowWasResized():
207 textbuffer.refresh() 199 textbuffer.refresh()
208 bindDescriptorSet(commandbuffer, font.descriptorSet, 3, pipeline) 200 bindDescriptorSet(commandbuffer, font.descriptorSet, 3, pipeline)
209 withRenderPass( 201 withRenderPass(
210 vulkan.swapchain.renderPass, 202 renderPass,
211 framebuffer, 203 framebuffer,
212 commandbuffer, 204 commandbuffer,
213 vulkan.swapchain.width, 205 frameWidth(),
214 vulkan.swapchain.height, 206 frameHeight(),
215 vec4(0, 0, 0, 0), 207 vec4(0, 0, 0, 0),
216 ): 208 ):
217 withPipeline(commandbuffer, pipeline): 209 withPipeline(commandbuffer, pipeline):
218 renderTextBuffer(commandbuffer, pipeline, textbuffer) 210 renderTextBuffer(commandbuffer, pipeline, textbuffer)
219 211
220 # cleanup 212 # cleanup
221 checkVkResult vkDeviceWaitIdle(vulkan.device) 213 checkVkResult vkDeviceWaitIdle(engine().vulkan.device)
222 destroyPipeline(pipeline) 214 destroyPipeline(pipeline)
223 destroyRenderData(renderdata) 215 destroyRenderData(renderdata)
224 216
225 when isMainModule: 217 when isMainModule:
226 var time = 3'f32 218 var time = 3'f32
227 initVulkan() 219 initEngine("Test text")
228 220
229 for depthBuffer in [true, false]: 221 # for depthBuffer in [true, false]:
230 var renderpass = createDirectPresentationRenderPass(depthBuffer = depthBuffer) 222 var renderpass = createDirectPresentationRenderPass(depthBuffer = true)
231 setupSwapchain(renderpass = renderpass) 223 setupSwapchain(renderpass = renderpass)
232 224
233 # tests a simple triangle with minimalistic shader and vertex format 225 # tests a simple triangle with minimalistic shader and vertex format
234 test_01_static_label(time) 226 test_01_static_label(time, renderpass)
235 test_02_multi_counter(time) 227 test_02_multi_counter(time, renderpass)
236 test_03_layouting(time) 228 test_03_layouting(time, renderpass)
237 test_04_lots_of_texts(time) 229 test_04_lots_of_texts(time, renderpass)
238 230
239 checkVkResult vkDeviceWaitIdle(vulkan.device) 231 checkVkResult vkDeviceWaitIdle(engine().vulkan.device)
240 vkDestroyRenderPass(vulkan.device, renderpass.vk, nil) 232 destroyRenderPass(renderpass)
241 clearSwapchain() 233 clearSwapchain()
242 234
243 destroyVulkan() 235 destroyVulkan()