2018-05-07 12:28:11 +00:00
// Copyright(c) 2018, 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 : 09_InitDescriptorSet
// Initialize a descriptor set
# include <iostream>
# include "vulkan/vulkan.hpp"
# define GLM_FORCE_RADIANS
2018-08-17 15:47:48 +00:00
# pragma warning(disable:4201) // disable warning C4201: nonstandard extension used: nameless struct/union; needed to get glm/detail/type_vec?.hpp without warnings
2018-05-07 12:28:11 +00:00
# include <glm/gtc/matrix_transform.hpp>
static char const * AppName = " 09_InitDescriptorSet " ;
static char const * EngineName = " Vulkan.hpp " ;
2018-08-17 15:47:48 +00:00
int main ( int /*argc*/ , char * /*argv[]*/ )
2018-05-07 12:28:11 +00:00
{
try
{
vk : : ApplicationInfo appInfo ( AppName , 1 , EngineName , 1 , VK_API_VERSION_1_1 ) ;
vk : : InstanceCreateInfo instanceCreateInfo ( { } , & appInfo ) ;
vk : : UniqueInstance instance = vk : : createInstanceUnique ( instanceCreateInfo ) ;
std : : vector < vk : : PhysicalDevice > physicalDevices = instance - > enumeratePhysicalDevices ( ) ;
assert ( ! physicalDevices . empty ( ) ) ;
// determine a queueFamilyIndex that supports graphics
std : : vector < vk : : QueueFamilyProperties > queueFamilyProperties = physicalDevices [ 0 ] . getQueueFamilyProperties ( ) ;
size_t graphicsQueueFamilyIndex = std : : distance ( queueFamilyProperties . begin ( ) ,
std : : find_if ( queueFamilyProperties . begin ( ) ,
queueFamilyProperties . end ( ) ,
[ ] ( vk : : QueueFamilyProperties const & qfp ) { return qfp . queueFlags & vk : : QueueFlagBits : : eGraphics ; } ) ) ;
// create a device
float queuePriority = 0.0f ;
vk : : DeviceQueueCreateInfo deviceQueueCreateInfo ( { } , static_cast < uint32_t > ( graphicsQueueFamilyIndex ) , 1 , & queuePriority ) ;
vk : : UniqueDevice device = physicalDevices [ 0 ] . createDeviceUnique ( vk : : DeviceCreateInfo ( { } , 1 , & deviceQueueCreateInfo , 0 , nullptr ) ) ;
glm : : mat4x4 projection = glm : : perspective ( glm : : radians ( 45.0f ) , 1.0f , 0.1f , 100.0f ) ;
glm : : mat4x4 view = glm : : lookAt ( glm : : vec3 ( - 5.0f , 3.0f , - 10.0f ) , glm : : vec3 ( 0.0f , 0.0f , 0.0f ) , glm : : vec3 ( 0.0f , - 1.0f , 0.0f ) ) ;
glm : : mat4x4 model = glm : : mat4x4 ( 1.0f ) ;
glm : : mat4x4 clip = glm : : mat4x4 ( 1.0f , 0.0f , 0.0f , 0.0f , 0.0f , - 1.0f , 0.0f , 0.0f , 0.0f , 0.0f , 0.5f , 0.0f , 0.0f , 0.0f , 0.5f , 1.0f ) ; // vulkan clip space has inverted y and half z !
glm : : mat4x4 mvpc = clip * projection * view * model ;
vk : : UniqueBuffer buffer = device - > createBufferUnique ( vk : : BufferCreateInfo ( vk : : BufferCreateFlags ( ) , sizeof ( mvpc ) , vk : : BufferUsageFlagBits : : eUniformBuffer ) ) ;
// create a DescriptorSetLayout
vk : : DescriptorSetLayoutBinding descriptorSetLayoutBinding ( 0 , vk : : DescriptorType : : eUniformBuffer , 1 , vk : : ShaderStageFlagBits : : eVertex ) ;
vk : : UniqueDescriptorSetLayout descriptorSetLayout = device - > createDescriptorSetLayoutUnique ( vk : : DescriptorSetLayoutCreateInfo ( { } , 1 , & descriptorSetLayoutBinding ) ) ;
/* VULKAN_HPP_KEY_START */
// create a descriptor pool
vk : : DescriptorPoolSize poolSize ( vk : : DescriptorType : : eUniformBuffer , 1 ) ;
vk : : UniqueDescriptorPool descriptorPool = device - > createDescriptorPoolUnique ( vk : : DescriptorPoolCreateInfo ( vk : : DescriptorPoolCreateFlags ( ) , 1 , 1 , & poolSize ) ) ;
// allocate a descriptor set
std : : vector < vk : : UniqueDescriptorSet > descriptorSets = device - > allocateDescriptorSetsUnique ( vk : : DescriptorSetAllocateInfo ( descriptorPool . get ( ) , 1 , & descriptorSetLayout . get ( ) ) ) ;
vk : : DescriptorBufferInfo descriptorBufferInfo ( buffer . get ( ) , 0 , sizeof ( glm : : mat4x4 ) ) ;
device - > updateDescriptorSets ( vk : : WriteDescriptorSet ( descriptorSets [ 0 ] . get ( ) , 0 , 0 , 1 , vk : : DescriptorType : : eUniformBuffer , nullptr , & descriptorBufferInfo ) , { } ) ;
/* VULKAN_HPP_KEY_END */
}
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 ;
}