18 #define VULKAN_HPP_SMART_HANDLE_IMPLICIT_CAST
20 #include "../utils/geometries.hpp"
21 #include "../utils/math.hpp"
22 #include "../utils/shaders.hpp"
23 #include "../utils/utils.hpp"
24 #include "SPIRV/GlslangToSpv.h"
28 #include <vulkan/vulkan_shared.hpp>
30 static char const * AppName =
"SharedHandles";
31 static char const * EngineName =
"Vulkan.hpp";
34 const vk::SharedRenderPass & renderPass,
35 const std::vector<vk::ImageView> & imageViews,
36 const vk::SharedImageView & depthImageView,
40 #if defined( VULKAN_HPP_SMART_HANDLE_IMPLICIT_CAST )
41 auto renderPassHandle = renderPass.get();
42 std::vector<vk::SharedFramebuffer> sharedFramebuffers;
43 std::vector<vk::Framebuffer> framebuffers =
vk::su::createFramebuffers( device, renderPassHandle, imageViews, depthImageView, extent );
45 auto renderPassHandle = renderPass.get();
46 std::vector<vk::SharedFramebuffer> sharedFramebuffers;
47 std::vector<vk::Framebuffer> framebuffers =
vk::su::createFramebuffers( device.get(), renderPassHandle, imageViews, depthImageView.get(), extent );
49 sharedFramebuffers.reserve( framebuffers.size() );
50 for (
auto & framebuffer : framebuffers )
52 sharedFramebuffers.emplace_back( framebuffer, device );
55 return sharedFramebuffers;
73 #if !defined( NDEBUG )
88 throw std::runtime_error(
"Failed to create window!" );
89 vk::SharedSurfaceKHR sharedSurface{ surface,
instance };
100 graphicsAndPresentQueueFamilyIndex.first,
101 graphicsAndPresentQueueFamilyIndex.second );
109 std::transform( swapChainData.
images.begin(),
110 swapChainData.
images.end(),
111 std::back_inserter(
images ),
113 return vk::SharedImage{ image, device, vk::SwapchainOwns::yes };
116 std::transform( swapChainData.imageViews.begin(),
117 swapChainData.imageViews.end(),
120 return vk::SharedImageView{ imageView, device };
125 graphicsQueue = vk::SharedQueue{ device->getQueue( graphicsAndPresentQueueFamilyIndex.first, 0 ), device };
127 presentQueue = vk::SharedQueue{ device->getQueue( graphicsAndPresentQueueFamilyIndex.second, 0 ), device };
131 depthImage = vk::SharedImage{ depthBufferData.image, device };
132 depthImageView = vk::SharedImageView{ depthBufferData.imageView, device };
133 depthMemory = vk::SharedDeviceMemory{ depthBufferData.deviceMemory, device };
141 framebuffers =
makeSharedFramebuffers( device, renderPass, swapChainData.imageViews, depthImageView, window.extent );
149 commandBuffer = vk::SharedCommandBuffer{
153 auto device_handle = device.get();
160 auto dsl = descriptorSetLayout.get();
164 glslang::InitializeProcess();
166 fragmentShaderModule =
168 glslang::FinalizeProcess();
170 descriptorPool = vk::SharedDescriptorPool{
175 descriptorSet = vk::SharedDescriptorSet{ device->allocateDescriptorSets( descriptorSetAllocateInfo ).front(), device, descriptorPool };
180 std::make_pair( vertexShaderModule.get(),
nullptr ),
181 std::make_pair( fragmentShaderModule.get(),
nullptr ),
182 sizeof( texturedCubeData[0] ),
183 { { vk::Format::eR32G32B32A32Sfloat, 0 }, { vk::Format::eR32G32Sfloat, 16 } },
186 pipelineLayout.get(),
193 assert( currentBufferR.
value < framebuffers.size() );
194 currentBuffer = currentBufferR.
value;
199 std::array<vk::ClearValue, 2> clearValues;
209 commandBuffer->setViewport( 0,
vk::Viewport( 0.0f, 0.0f,
static_cast<float>( extent.
width ),
static_cast<float>( extent.
height ), 0.0f, 1.0f ) );
215 commandBuffer->endRenderPass();
216 commandBuffer->end();
220 auto ias = imageAcquiredSemaphore.get();
221 auto comBuf = commandBuffer.get();
223 vk::SubmitInfo submitInfo( ias, waitDestinationStageMask, comBuf );
224 graphicsQueue->submit( submitInfo, drawFence.get() );
229 auto swap = swapChain.get();
235 default: assert(
false );
237 std::this_thread::sleep_for( std::chrono::milliseconds( 1000 ) );
253 uint32_t currentBuffer = 0;
290 auto device_handle = engine.
device.get();
315 device_handle, engine.
descriptorSet.get(), { { vk::DescriptorType::eUniformBuffer, uniformBufferData.buffer, VK_WHOLE_SIZE, {} } }, textureData );
316 engine.commandBuffer->end();
324 commandBuffer.
draw( 12 * 3, 1, 0, 0 );
342 Application() : window( AppName,
vk::Extent2D( 500, 500 ) ), engine( window.window ), asset( engine,
vk::Extent2D( 500, 500 ) ) {}
375 catch ( std::exception & err )
std::vector< vk::SharedFramebuffer > makeSharedFramebuffers(const vk::SharedDevice &device, const vk::SharedRenderPass &renderPass, const std::vector< vk::ImageView > &imageViews, const vk::SharedImageView &depthImageView, const vk::Extent2D &extent)
void cout(vk::SurfaceCapabilitiesKHR const &surfaceCapabilities)
vk::SharedDeviceMemory uniformBufferMemory
vk::SharedImage textureImage
vk::SharedSampler textureSampler
vk::SharedImageView textureImageView
vk::SharedDeviceMemory textureImageMemory
vk::SharedBuffer uniformBuffer
void draw(vk::CommandBuffer commandBuffer)
Asset(const Engine &engine, vk::Extent2D extent)
vk::SharedBuffer vertexBuffer
vk::SharedDeviceMemory vertexBufferMemory
vk::SharedDescriptorPool descriptorPool
vk::SharedInstance instance
vk::DescriptorSetAllocateInfo descriptorSetAllocateInfo
vk::SharedCommandPool commandPool
std::vector< vk::SharedImage > images
vk::SharedDescriptorSetLayout descriptorSetLayout
vk::PhysicalDevice physicalDevice
vk::SharedRenderPass renderPass
vk::SharedSemaphore imageAcquiredSemaphore
vk::SharedQueue presentQueue
vk::SharedImageView depthImageView
vk::SharedQueue graphicsQueue
Engine(const vk::su::WindowData &window)
std::vector< vk::SharedFramebuffer > framebuffers
void createDeviceAndSwapChain(const vk::su::WindowData &window)
vk::SharedDeviceMemory depthMemory
vk::SharedPipelineCache pipelineCache
vk::SharedSwapchainKHR swapChain
vk::SharedPipeline graphicsPipeline
void beginFrame(vk::Extent2D extent)
vk::SharedPipelineLayout pipelineLayout
vk::SharedDescriptorSet descriptorSet
vk::SharedFence drawFence
vk::SharedCommandBuffer commandBuffer
vk::SharedDebugUtilsMessengerEXT debugUtilsMessenger
vk::SharedShaderModule fragmentShaderModule
std::vector< vk::SharedImageView > imageViews
vk::SharedShaderModule vertexShaderModule
vk::SharedImage depthImage
Window(const char *windowName, vk::Extent2D extent)
vk::su::WindowData window
void draw(uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
void bindVertexBuffers(uint32_t firstBinding, uint32_t bindingCount, const vk::Buffer *pBuffers, const vk::DeviceSize *pOffsets, Dispatch const &d VULKAN_HPP_DEFAULT_DISPATCHER_ASSIGNMENT) const VULKAN_HPP_NOEXCEPT
virtual const char * what() const VULKAN_HPP_NOEXCEPT
std::vector< vk::Framebuffer > createFramebuffers(vk::Device const &device, vk::RenderPass &renderPass, std::vector< vk::ImageView > const &imageViews, vk::ImageView const &depthImageView, vk::Extent2D const &extent)
vk::DebugUtilsMessengerCreateInfoEXT makeDebugUtilsMessengerCreateInfoEXT()
void copyToDevice(vk::Device const &device, vk::DeviceMemory const &deviceMemory, T const *pData, size_t count, vk::DeviceSize stride=sizeof(T))
vk::ShaderModule createShaderModule(vk::Device const &device, vk::ShaderStageFlagBits shaderStage, std::string const &shaderText)
vk::RenderPass createRenderPass(vk::Device const &device, vk::Format colorFormat, vk::Format depthFormat, vk::AttachmentLoadOp loadOp, vk::ImageLayout colorFinalLayout)
vk::Pipeline createGraphicsPipeline(vk::Device const &device, vk::PipelineCache const &pipelineCache, std::pair< vk::ShaderModule, vk::SpecializationInfo const * > const &vertexShaderData, std::pair< vk::ShaderModule, vk::SpecializationInfo const * > const &fragmentShaderData, uint32_t vertexStride, std::vector< std::pair< vk::Format, uint32_t >> const &vertexInputAttributeFormatOffset, vk::FrontFace frontFace, bool depthBuffered, vk::PipelineLayout const &pipelineLayout, vk::RenderPass const &renderPass)
vk::Instance createInstance(std::string const &appName, std::string const &engineName, std::vector< std::string > const &layers, std::vector< std::string > const &extensions, uint32_t apiVersion)
const uint64_t FenceTimeout
vk::Device createDevice(vk::PhysicalDevice const &physicalDevice, uint32_t queueFamilyIndex, std::vector< std::string > const &extensions, vk::PhysicalDeviceFeatures const *physicalDeviceFeatures, void const *pNext)
vk::DescriptorSetLayout createDescriptorSetLayout(vk::Device const &device, std::vector< std::tuple< vk::DescriptorType, uint32_t, vk::ShaderStageFlags >> const &bindingData, vk::DescriptorSetLayoutCreateFlags flags)
WindowData createWindow(std::string const &windowName, vk::Extent2D const &extent)
std::pair< uint32_t, uint32_t > findGraphicsAndPresentQueueFamilyIndex(vk::PhysicalDevice physicalDevice, vk::SurfaceKHR const &surface)
void submitAndWait(vk::Device const &device, vk::Queue const &queue, vk::CommandBuffer const &commandBuffer)
std::vector< std::string > getInstanceExtensions()
void updateDescriptorSets(vk::Device const &device, vk::DescriptorSet const &descriptorSet, std::vector< std::tuple< vk::DescriptorType, vk::Buffer const &, vk::DeviceSize, vk::BufferView const & >> const &bufferData, vk::su::TextureData const &textureData, uint32_t bindingOffset)
glm::mat4x4 createModelViewProjectionClipMatrix(vk::Extent2D const &extent)
vk::DescriptorPool createDescriptorPool(vk::Device const &device, std::vector< vk::DescriptorPoolSize > const &poolSizes)
vk::SurfaceFormatKHR pickSurfaceFormat(std::vector< vk::SurfaceFormatKHR > const &formats)
std::vector< std::string > getDeviceExtensions()
VULKAN_HPP_INLINE void swap(UniqueHandle< Type, Dispatch > &lhs, UniqueHandle< Type, Dispatch > &rhs) VULKAN_HPP_NOEXCEPT
const std::string fragmentShaderText_T_C
const std::string vertexShaderText_PT_T
vk::DeviceMemory deviceMemory
vk::SwapchainKHR swapChain
std::vector< vk::Image > images
void setImage(vk::Device const &device, vk::CommandBuffer const &commandBuffer, ImageGenerator const &imageGenerator)
std::unique_ptr< ImageData > imageData
struct VkInstance_T * VkInstance