2019-03-15 09:40:45 +00:00
// Copyright(c) 2019, NVIDIA CORPORATION. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// VulkanHpp Samples : 12_InitFrameBuffers
// Initialize framebuffers
# include "../utils/utils.hpp"
# include "vulkan/vulkan.hpp"
# include <iostream>
static char const * AppName = " 12_InitFrameBuffers " ;
static char const * EngineName = " Vulkan.hpp " ;
2019-03-19 14:35:08 +00:00
int main ( int /*argc*/ , char * * /*argv*/ )
2019-03-15 09:40:45 +00:00
{
try
{
vk : : UniqueInstance instance = vk : : su : : createInstance ( AppName , EngineName , vk : : su : : getInstanceExtensions ( ) ) ;
# if !defined(NDEBUG)
vk : : UniqueDebugReportCallbackEXT debugReportCallback = vk : : su : : createDebugReportCallback ( instance ) ;
# endif
2019-06-25 07:47:27 +00:00
vk : : PhysicalDevice physicalDevice = instance - > enumeratePhysicalDevices ( ) . front ( ) ;
2019-03-15 09:40:45 +00:00
2019-03-26 11:24:36 +00:00
vk : : su : : SurfaceData surfaceData ( instance , AppName , AppName , vk : : Extent2D ( 64 , 64 ) ) ;
2019-03-15 09:40:45 +00:00
2019-06-25 07:47:27 +00:00
std : : pair < uint32_t , uint32_t > graphicsAndPresentQueueFamilyIndex = vk : : su : : findGraphicsAndPresentQueueFamilyIndex ( physicalDevice , * surfaceData . surface ) ;
vk : : UniqueDevice device = vk : : su : : createDevice ( physicalDevice , graphicsAndPresentQueueFamilyIndex . first , vk : : su : : getDeviceExtensions ( ) ) ;
2019-03-15 09:40:45 +00:00
2019-06-25 07:47:27 +00:00
vk : : su : : SwapChainData swapChainData ( physicalDevice , device , * surfaceData . surface , surfaceData . extent , vk : : ImageUsageFlagBits : : eColorAttachment | vk : : ImageUsageFlagBits : : eTransferSrc ,
vk : : UniqueSwapchainKHR ( ) , graphicsAndPresentQueueFamilyIndex . first , graphicsAndPresentQueueFamilyIndex . second ) ;
2019-03-15 09:40:45 +00:00
2019-06-25 07:47:27 +00:00
vk : : su : : DepthBufferData depthBufferData ( physicalDevice , device , vk : : Format : : eD16Unorm , surfaceData . extent ) ;
2019-03-15 09:40:45 +00:00
2019-03-26 11:24:36 +00:00
vk : : UniqueRenderPass renderPass = vk : : su : : createRenderPass ( device , swapChainData . colorFormat , depthBufferData . format ) ;
2019-03-15 09:40:45 +00:00
/* VULKAN_KEY_START */
vk : : ImageView attachments [ 2 ] ;
2019-03-26 11:24:36 +00:00
attachments [ 1 ] = depthBufferData . imageView . get ( ) ;
2019-03-15 09:40:45 +00:00
std : : vector < vk : : UniqueFramebuffer > framebuffers ;
2019-03-26 11:24:36 +00:00
framebuffers . reserve ( swapChainData . imageViews . size ( ) ) ;
for ( auto const & view : swapChainData . imageViews )
2019-03-15 09:40:45 +00:00
{
attachments [ 0 ] = view . get ( ) ;
2019-03-26 11:24:36 +00:00
framebuffers . push_back ( device - > createFramebufferUnique ( vk : : FramebufferCreateInfo ( vk : : FramebufferCreateFlags ( ) , renderPass . get ( ) , 2 , attachments , surfaceData . extent . width , surfaceData . extent . height , 1 ) ) ) ;
2019-03-15 09:40:45 +00:00
}
// Note: No need to explicitly destroy the Framebuffers, as the destroy functions are called by the destructor of the UniqueFramebuffer on leaving this scope.
/* VULKAN_KEY_END */
# if defined(VK_USE_PLATFORM_WIN32_KHR)
2019-03-26 11:24:36 +00:00
DestroyWindow ( surfaceData . window ) ;
2019-03-15 09:40:45 +00:00
# else
# pragma error "unhandled platform"
# endif
}
catch ( vk : : SystemError err )
{
std : : cout < < " vk::SystemError: " < < err . what ( ) < < std : : endl ;
exit ( - 1 ) ;
}
catch ( std : : runtime_error err )
{
std : : cout < < " std::runtime_error: " < < err . what ( ) < < std : : endl ;
exit ( - 1 ) ;
}
catch ( . . . )
{
std : : cout < < " unknown error \n " ;
exit ( - 1 ) ;
}
return 0 ;
}