@@ -39,10 +39,6 @@ void onFrameSizeChanged(int width, int height)
39
39
pipeline->getDynamicState ()->applyDynamicViewport ({0 , 0 , (float )width, (float )height, 0 , 1 });
40
40
}
41
41
42
- void clear_ (VkImage image, VkCommandBuffer command);
43
-
44
-
45
-
46
42
int main ()
47
43
{
48
44
VK_ContextConfig config;
@@ -94,16 +90,13 @@ int main()
94
90
95
91
auto image = context->createImage (" ../images/cat.png" );
96
92
97
- // transitionImageLayout(image->getImage(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, 0);
98
-
99
93
auto command = context->getCommandPool ()->beginSingleTimeCommands ();
100
- clear_ (image->getImage (), command);
101
94
context->getCommandPool ()->endSingleTimeCommands (command, context->getGraphicQueue ());
102
95
103
96
auto imageViewCreateInfo = VK_ImageView::createImageViewCreateInfo (image->getImage (),
104
97
VK_FORMAT_R8G8B8A8_SRGB);
105
98
auto imageView = context->createImageView (imageViewCreateInfo);
106
- shaderSet->addImageView (imageView);
99
+ shaderSet->addImageView (imageView, 1 );
107
100
108
101
context->initVulkanContext ();
109
102
pipeline = context->createPipeline (shaderSet);
@@ -121,282 +114,3 @@ int main()
121
114
122
115
return 0 ;
123
116
}
124
-
125
- void clear_ (VkImage image, VkCommandBuffer command)
126
- {
127
- /* VkImageMemoryBarrier textureBarrier = {};
128
- textureBarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
129
- textureBarrier.pNext = NULL;
130
- textureBarrier.srcAccessMask = VK_ACCESS_SHADER_READ_BIT;
131
- textureBarrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
132
- textureBarrier.oldLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
133
- textureBarrier.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;//VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
134
- textureBarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
135
- textureBarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
136
- textureBarrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
137
- textureBarrier.subresourceRange.baseMipLevel = 0;
138
- textureBarrier.subresourceRange.levelCount = 1;
139
- textureBarrier.subresourceRange.baseArrayLayer = 0;
140
- textureBarrier.subresourceRange.layerCount = 1;
141
- textureBarrier.image = image;
142
- vkCmdPipelineBarrier(command, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, NULL, 0, NULL, 1,
143
- &textureBarrier);
144
-
145
- std::cout << 111 << std::endl;*/
146
-
147
- VkImageSubresourceRange srRange = {};
148
- srRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
149
- srRange.baseMipLevel = 0 ;
150
- srRange.levelCount = VK_REMAINING_MIP_LEVELS;
151
- srRange.baseArrayLayer = 0 ;
152
- srRange.layerCount = VK_REMAINING_ARRAY_LAYERS;
153
-
154
- VkClearColorValue clearColor;
155
- clearColor.float32 [0 ] = 0 .0f ;
156
- clearColor.float32 [1 ] = 1 .0f ;
157
- clearColor.float32 [2 ] = 0 .0f ;
158
- clearColor.float32 [3 ] = 1 .0f ;
159
- vkCmdClearColorImage (command, image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clearColor, 1 , &srRange);
160
-
161
- }
162
-
163
- /*
164
- void set_image_layout(VkCommandBuffer command, VkImage image, VkImageAspectFlags aspectMask, VkImageLayout old_image_layout,
165
- VkImageLayout new_image_layout, VkPipelineStageFlags src_stages, VkPipelineStageFlags dest_stages)
166
- {
167
- VkImageMemoryBarrier image_memory_barrier = {};
168
- image_memory_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
169
- image_memory_barrier.pNext = NULL;
170
- image_memory_barrier.srcAccessMask = 0;
171
- image_memory_barrier.dstAccessMask = 0;
172
- image_memory_barrier.oldLayout = old_image_layout;
173
- image_memory_barrier.newLayout = new_image_layout;
174
- image_memory_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
175
- image_memory_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
176
- image_memory_barrier.image = image;
177
- image_memory_barrier.subresourceRange.aspectMask = aspectMask;
178
- image_memory_barrier.subresourceRange.baseMipLevel = 0;
179
- image_memory_barrier.subresourceRange.levelCount = 1;
180
- image_memory_barrier.subresourceRange.baseArrayLayer = 0;
181
- image_memory_barrier.subresourceRange.layerCount = 1;
182
-
183
- switch (old_image_layout) {
184
- case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL:
185
- image_memory_barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
186
- break;
187
-
188
- case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL:
189
- image_memory_barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
190
- break;
191
-
192
- case VK_IMAGE_LAYOUT_PREINITIALIZED:
193
- image_memory_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
194
- break;
195
-
196
- default:
197
- break;
198
- }
199
-
200
- switch (new_image_layout) {
201
- case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL:
202
- image_memory_barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
203
- break;
204
-
205
- case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL:
206
- image_memory_barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
207
- break;
208
-
209
- case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
210
- image_memory_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
211
- break;
212
-
213
- case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL:
214
- image_memory_barrier.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
215
- break;
216
-
217
- case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL:
218
- image_memory_barrier.dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
219
- break;
220
-
221
- default:
222
- break;
223
- }
224
-
225
- vkCmdPipelineBarrier(command, src_stages, dest_stages, 0, 0, NULL, 0, NULL, 1, &image_memory_barrier);
226
- }
227
-
228
-
229
- void write_ppm(VK_Context* context, VkImage image)
230
- {
231
- string filename;
232
- VkResult res;
233
-
234
- auto width = context->getSwapChainExtent().width;
235
- auto height = context->getSwapChainExtent().height;
236
- auto format = context->getSwapChainFormat();
237
- auto device = context->getDevice();
238
-
239
- VkImageCreateInfo image_create_info = {};
240
- image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
241
- image_create_info.pNext = NULL;
242
- image_create_info.imageType = VK_IMAGE_TYPE_2D;
243
- image_create_info.format = context->getSwapChainFormat();
244
- image_create_info.extent.width = width;
245
- image_create_info.extent.height = height;
246
- image_create_info.extent.depth = 1;
247
- image_create_info.mipLevels = 1;
248
- image_create_info.arrayLayers = 1;
249
- image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
250
- image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
251
- image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
252
- image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
253
- image_create_info.queueFamilyIndexCount = 0;
254
- image_create_info.pQueueFamilyIndices = NULL;
255
- image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
256
- image_create_info.flags = 0;
257
-
258
- VkMemoryAllocateInfo mem_alloc = {};
259
- mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
260
- mem_alloc.pNext = NULL;
261
- mem_alloc.allocationSize = 0;
262
- mem_alloc.memoryTypeIndex = 0;
263
-
264
- VkImage mappableImage;
265
- VkDeviceMemory mappableMemory;
266
-
267
- res = vkCreateImage(device, &image_create_info, NULL, &mappableImage);
268
- assert(res == VK_SUCCESS);
269
-
270
- VkMemoryRequirements mem_reqs;
271
- vkGetImageMemoryRequirements(device, mappableImage, &mem_reqs);
272
-
273
- mem_alloc.allocationSize = mem_reqs.size;
274
-
275
- res = vkAllocateMemory(device, &mem_alloc, NULL, &(mappableMemory));
276
- assert(res == VK_SUCCESS);
277
-
278
-
279
- res = vkBindImageMemory(device, mappableImage, mappableMemory, 0);
280
- assert(res == VK_SUCCESS);
281
-
282
- auto command = context->getCommandPool()->beginSingleTimeCommands();
283
-
284
- set_image_layout(command, mappableImage, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_UNDEFINED,
285
- VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
286
-
287
- set_image_layout(command, image, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,
288
- VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
289
-
290
- VkImageCopy copy_region;
291
- copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
292
- copy_region.srcSubresource.mipLevel = 0;
293
- copy_region.srcSubresource.baseArrayLayer = 0;
294
- copy_region.srcSubresource.layerCount = 1;
295
- copy_region.srcOffset.x = 0;
296
- copy_region.srcOffset.y = 0;
297
- copy_region.srcOffset.z = 0;
298
- copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
299
- copy_region.dstSubresource.mipLevel = 0;
300
- copy_region.dstSubresource.baseArrayLayer = 0;
301
- copy_region.dstSubresource.layerCount = 1;
302
- copy_region.dstOffset.x = 0;
303
- copy_region.dstOffset.y = 0;
304
- copy_region.dstOffset.z = 0;
305
- copy_region.extent.width = width;
306
- copy_region.extent.height = height;
307
- copy_region.extent.depth = 1;
308
-
309
- vkCmdCopyImage(command, image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, mappableImage,
310
- VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ©_region);
311
-
312
- set_image_layout(command, mappableImage, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL,
313
- VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_HOST_BIT);
314
- */
315
-
316
- /*
317
- res = vkEndCommandBuffer(command);
318
- assert(res == VK_SUCCESS);
319
- const VkCommandBuffer cmd_bufs[] = {command};
320
- VkFenceCreateInfo fenceInfo;
321
- VkFence cmdFence;
322
- fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
323
- fenceInfo.pNext = NULL;
324
- fenceInfo.flags = 0;
325
- vkCreateFence(device, &fenceInfo, NULL, &cmdFence);
326
-
327
- VkSubmitInfo submit_info[1] = {};
328
- submit_info[0].pNext = NULL;
329
- submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
330
- submit_info[0].waitSemaphoreCount = 0;
331
- submit_info[0].pWaitSemaphores = NULL;
332
- submit_info[0].pWaitDstStageMask = NULL;
333
- submit_info[0].commandBufferCount = 1;
334
- submit_info[0].pCommandBuffers = cmd_bufs;
335
- submit_info[0].signalSemaphoreCount = 0;
336
- submit_info[0].pSignalSemaphores = NULL;
337
-
338
- res = vkQueueSubmit(context->getGraphicQueue(), 1, submit_info, cmdFence);
339
- assert(res == VK_SUCCESS);
340
-
341
- do {
342
- res = vkWaitForFences(device, 1, &cmdFence, VK_TRUE, ~0);
343
- } while (res == VK_TIMEOUT);
344
- assert(res == VK_SUCCESS);
345
- */
346
- /*
347
- context->getCommandPool()->endSingleTimeCommands(command, context->getGraphicQueue());
348
-
349
- //vkDestroyFence(device, cmdFence, NULL);
350
-
351
- filename = "2.ppm";
352
-
353
- VkImageSubresource subres = {};
354
- subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
355
- subres.mipLevel = 0;
356
- subres.arrayLayer = 0;
357
- VkSubresourceLayout sr_layout;
358
- vkGetImageSubresourceLayout(device, mappableImage, &subres, &sr_layout);
359
-
360
- char *ptr;
361
- res = vkMapMemory(device, mappableMemory, 0, mem_reqs.size, 0, (void **)&ptr);
362
- assert(res == VK_SUCCESS);
363
-
364
- ptr += sr_layout.offset;
365
- std::ofstream file(filename.c_str(), ios::binary);
366
-
367
- file << "P6\n";
368
- file << width << " ";
369
- file << height << "\n";
370
- file << 255 << "\n";
371
-
372
- for (size_t y = 0; y < height; y++)
373
- {
374
- const int *row = (const int *)ptr;
375
- int swapped;
376
-
377
- if (format == VK_FORMAT_B8G8R8A8_UNORM || format == VK_FORMAT_B8G8R8A8_SRGB) {
378
- for (size_t x = 0; x < width; x++) {
379
- swapped = (*row & 0xff00ff00) | (*row & 0x000000ff) << 16 | (*row & 0x00ff0000) >> 16;
380
- file.write((char *)&swapped, 3);
381
- row++;
382
- }
383
- } else if (format == VK_FORMAT_R8G8B8A8_UNORM) {
384
- for (size_t x = 0; x < width; x++) {
385
- file.write((char *)row, 3);
386
- row++;
387
- }
388
- } else {
389
- printf("Unrecognized image format - will not write image files");
390
- break;
391
- }
392
-
393
- ptr += sr_layout.rowPitch;
394
- }
395
-
396
- file.close();
397
- vkUnmapMemory(device, mappableMemory);
398
- vkDestroyImage(device, mappableImage, NULL);
399
- vkFreeMemory(device, mappableMemory, NULL);
400
- }
401
- */
402
-
0 commit comments