Guest User

Untitled

a guest
Oct 21st, 2017
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.50 KB | None | 0 0
  1. #version 450
  2.  
  3. #extension GL_ARB_separate_shader_objects: enable
  4.  
  5. layout (local_size_x = 16, local_size_y = 16) in;
  6. layout (binding = 0, rgba8) uniform image2D resultImage;
  7.  
  8.  
  9. void main(){
  10. imageStore(resultImage, ivec2(gl_GlobalInvocationID.xy), vec4(1, 1, 0, 1));
  11. }
  12.  
  13. namespace dynamic {
  14. namespace INTERNAL {
  15.  
  16. void Raytracer::init()
  17. {
  18. m_raytraceShader = std::make_unique<RaytraceShader>();
  19. }
  20.  
  21. Image Raytracer::execute()
  22. {
  23. vulkan::VulkanDevice& device = vulkan::vulkanManager.getDevice();
  24. vulkan::VulkanImage vulkanImage = m_raytraceShader->execute();
  25. vulkan::VulkanImageView imgView;
  26. vulkan::VulkanImageSampler imgSampler;
  27. imgView.init(vulkanImage.getImage(), VK_FORMAT_R8G8B8A8_UNORM, device);
  28. imgSampler.init(device);
  29. Image image(vulkanImage, imgSampler, imgView, graphicsManager.getWidth(), graphicsManager.getHeight());
  30.  
  31. return image;
  32. }
  33.  
  34. void Raytracer::initCommandBuffer()
  35. {
  36. m_raytraceShader->initCommandBuffer(m_pipeline);
  37. }
  38.  
  39. void Raytracer::initPipeline()
  40. {
  41. m_pipeline.init(*m_raytraceShader, m_raytraceShader->getDescriptorSet());
  42. }
  43.  
  44. void Raytracer::destroy()
  45. {
  46. m_pipeline.destroy();
  47. m_raytraceShader->destroy();
  48. }
  49.  
  50. RaytraceShader::RaytraceShader()
  51. : VulkanShader({ "comp.spv" }, { VK_SHADER_STAGE_COMPUTE_BIT }, vulkan::NO_REGISTRATION),
  52. m_imageDescriptor(0, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_SHADER_STAGE_COMPUTE_BIT)
  53. {
  54. m_descriptorSet.addDescriptor(m_imageDescriptor);
  55.  
  56. m_storageImage.init(graphicsManager.getWidth(), graphicsManager.getHeight(), VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_SAMPLED_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_IMAGE_LAYOUT_GENERAL);
  57. m_storageImageView.init(m_storageImage.getImage(), VK_FORMAT_R8G8B8A8_UNORM, vulkan::vulkanManager.getDevice());
  58. }
  59.  
  60. void RaytraceShader::updateDescriptors()
  61. {
  62. m_descriptorSet.updateDescriptor(m_imageDescriptor, m_storageImage, m_storageImageView);
  63. }
  64.  
  65. vulkan::VulkanImage RaytraceShader::execute()
  66. {
  67. m_cmdBuffer.execute();
  68.  
  69. return m_storageImage;
  70. }
  71.  
  72. void RaytraceShader::initCommandBuffer(const vulkan::VulkanComputePipeline& pipeline)
  73. {
  74. vulkan::VulkanCommandBuffer commandBuffer(vulkan::vulkanManager.getDevice().getComputeQueueIndex());
  75. commandBuffer.startCmdBuffer(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT);
  76.  
  77. vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, pipeline);
  78.  
  79. VkDescriptorSet set = m_descriptorSet.getDescriptorSet();
  80. vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, pipeline.getPipelineLayout(), 0, 1, &set, 0, nullptr);
  81. vkCmdDispatch(commandBuffer, graphicsManager.getWidth() / 16, graphicsManager.getHeight() / 16, 0);
  82.  
  83. commandBuffer.endCmdBuffer();
  84.  
  85. m_cmdBuffer = commandBuffer;
  86. }
  87.  
  88. void RaytraceShader::destroy()
  89. {
  90. m_storageImageView.destroy();
  91. }
  92.  
  93. }
  94. }
  95.  
  96. m_raytracer.init();
  97. INTERNAL::FullscreenTextureRenderer::initShader();
  98.  
  99. m_raytracer.initPipeline();
  100. m_raytracer.getShader()->updateDescriptors();
  101. m_raytracer.initCommandBuffer();
  102.  
  103. m_image = m_raytracer.execute();
  104.  
  105. INTERNAL::FullscreenTextureRenderer::loadImage(m_image);
Add Comment
Please, Sign In to add comment