Advertisement
pusheax

Untitled

Mar 3rd, 2018
417
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.09 KB | None | 0 0
  1. #include "vkdepth.h"
  2. #include "vktex.h"
  3. #include "main.h"
  4.  
  5. s32 vkdepth_findSupportedFormat(VkFormat *outFormat, u32 numCandidates, VkFormat *candidates, VkImageTiling tiling, VkFormatFeatureFlags features) {
  6.     VkPhysicalDevice physicalDevice = vgmain_get_physical_device();
  7.  
  8.     for(u32 i = 0; i < numCandidates; i++) {
  9.         VkFormat format = candidates[i];
  10.         VkFormatProperties props;
  11.         vkGetPhysicalDeviceFormatProperties(physicalDevice, format, &props);
  12.  
  13.         if (tiling == VK_IMAGE_TILING_LINEAR && (props.linearTilingFeatures & features) == features) {
  14.             *outFormat = format;
  15.             return 0;
  16.         }
  17.         else if (tiling == VK_IMAGE_TILING_OPTIMAL && (props.optimalTilingFeatures & features) == features) {
  18.             *outFormat = format;
  19.             return 0;
  20.         }
  21.     }
  22.  
  23.     return -1;
  24. }
  25.  
  26. s32 vkdepth_findDepthFormat(VkFormat *outFormat) {
  27.     VkFormat candidates[3] = {VK_FORMAT_D32_SFLOAT, VK_FORMAT_D32_SFLOAT_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT};
  28.     return vkdepth_findSupportedFormat(
  29.         outFormat,
  30.         3,
  31.         candidates,
  32.         VK_IMAGE_TILING_OPTIMAL,
  33.         VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT
  34.         );
  35. }
  36.  
  37. u8 vkdepth_hasStencilComponent(VkFormat format) {
  38.     return format == VK_FORMAT_D32_SFLOAT_S8_UINT || format == VK_FORMAT_D24_UNORM_S8_UINT;
  39. }
  40.  
  41. s32 vkdepth_createDepthImage(VkImage *depthImage, VkDeviceMemory *depthImageMemory, VkImageView *depthImageView, VkCommandPool commandPool) {
  42.     VkExtent2D swapChainExtent = vgmain_get_swap_chain_extent();
  43.     VkFormat depthFormat;
  44.     if(vkdepth_findDepthFormat(&depthFormat) != 0) {
  45.         printf("Could not find depth format!\n");
  46.         return -1;
  47.     }
  48.  
  49.     //I added VK_IMAGE_USAGE_TRANSFER_SRC_BIT for downloading. But will it hurt performance?
  50.     vktex_create_image(depthImage, depthImageMemory, swapChainExtent.width, swapChainExtent.height, depthFormat, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
  51.     vktex_createImageView(depthImageView, *depthImage, depthFormat, VK_IMAGE_ASPECT_DEPTH_BIT);
  52.  
  53.     vktex_transitionImageLayoutDepth(*depthImage, depthFormat, VK_IMAGE_LAYOUT_UNDEFINED,
  54.                                 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
  55.                                 //VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
  56.                                 commandPool);
  57.  
  58.     return 0;
  59. }
  60.  
  61. s32 vkdepth_get_depth_data(r32 *outData) {
  62.     VkDevice device = vgmain_get_device();
  63.     VkQueue graphicsQueue = vgmain_get_graphics_queue();
  64.     VkImage depthImage = vgmain_get_depth_image();
  65.  
  66.     VkExtent2D extent = vgmain_get_swap_chain_extent();
  67.     VkDeviceSize imageSize = extent.width * extent.height * 4;
  68.  
  69.     //TODO create this buffer one time
  70.     VkBuffer stagingBuffer;
  71.     VkDeviceMemory stagingBufferMemory;
  72.  
  73.     //create staging buffer as src for image
  74.     vmem_createBuffer(&stagingBuffer, &stagingBufferMemory, imageSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
  75.  
  76.     VkCommandPool commandPool = vgmain_get_prim_command_pool();
  77.  
  78.     VkCommandBuffer commandBuffer = vkcmd_beginSingleTimeCommands(commandPool, device);
  79.  
  80.     VkBufferImageCopy region = {};
  81.     region.bufferOffset = 0;
  82.     region.bufferRowLength = 0;
  83.     region.bufferImageHeight = 0;
  84.     region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
  85.     region.imageSubresource.mipLevel = 0;
  86.     region.imageSubresource.baseArrayLayer = 0;
  87.     region.imageSubresource.layerCount = 1;
  88.     region.imageOffset = (VkOffset3D){0, 0, 0};
  89.     region.imageExtent = (VkExtent3D){
  90.         extent.width,
  91.         extent.height,
  92.         1
  93.     };
  94.  
  95.     //TODO does it work, transfering optimal layout to host coherent buffer?
  96.     vkCmdCopyImageToBuffer(commandBuffer, depthImage,
  97.                            VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
  98.                            //VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
  99.                            stagingBuffer, 1, &region);
  100.  
  101.     vkcmd_endSingleTimeCommands(commandBuffer, commandPool, device, graphicsQueue);
  102.  
  103.     //TODO do not copy, just use data as result
  104.     void *data;
  105.     vkMapMemory(device, stagingBufferMemory, 0, imageSize, 0, &data);
  106.     //memcpy(outData, data, imageSize);
  107.  
  108.     u32 imgX = 0;
  109.     u32 imgY = 0;
  110.     r32 *dataf = (r32*)data;
  111.     for(u32 y = 0; y < SCREEN_HEIGHT/2; y += 1, imgY += 2) {
  112.         imgX = 0;
  113.         for(u32 x = 0; x < 2 * SCREEN_WIDTH; x += 4, imgX += 2) {
  114.             outData[y*2*SCREEN_WIDTH + x + 0] = dataf[imgY     * SCREEN_WIDTH + imgX + 0];
  115.             outData[y*2*SCREEN_WIDTH + x + 1] = dataf[imgY     * SCREEN_WIDTH + imgX + 1];
  116.             outData[y*2*SCREEN_WIDTH + x + 2] = dataf[(imgY+1) * SCREEN_WIDTH + imgX + 0];
  117.             outData[y*2*SCREEN_WIDTH + x + 3] = dataf[(imgY+1) * SCREEN_WIDTH + imgX + 1];
  118.         }
  119.     }
  120.  
  121.     vkUnmapMemory(device, stagingBufferMemory);
  122.  
  123.     vkDestroyBuffer(device, stagingBuffer, nullptr);
  124.     vkFreeMemory(device, stagingBufferMemory, nullptr);
  125. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement