ENDIF()
MESSAGE(STATUS "${CMAKE_BUILD_TYPE} build.")
+if (CMAKE_BUILD_TYPE STREQUAL "Debug")
+ ADD_DEFINITIONS (-DDEBUG)
+ENDIF()
+
FIND_PACKAGE(Vulkan REQUIRED)
FIND_PACKAGE(GLFW3 REQUIRED)
INCLUDE(GNUInstallDirs)
-FILE(GLOB VKH_SRC src/*.c)
+FILE(GLOB sources src/*.c)
-ADD_LIBRARY(${PROJECT_NAME} SHARED ${VKH_SRC})
-
-SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES
- VERSION ${PROJECT_VERSION}
- SOVERSION 1
- PUBLIC_HEADER include/vkh.h
-)
-
-TARGET_INCLUDE_DIRECTORIES(${PROJECT_NAME} PRIVATE
+ADD_LIBRARY(objlib OBJECT ${sources})
+TARGET_INCLUDE_DIRECTORIES(objlib PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/include
${CMAKE_CURRENT_SOURCE_DIR}/src
)
+SET_PROPERTY(TARGET objlib PROPERTY POSITION_INDEPENDENT_CODE 1) #PIC option for shared lib
-TARGET_LINK_LIBRARIES(${PROJECT_NAME}
- ${Vulkan_LIBRARY}
- ${GLFW3_LIBRARY}
-)
+ADD_LIBRARY("${PROJECT_NAME}_shared" SHARED $<TARGET_OBJECTS:objlib>)
+ADD_LIBRARY("${PROJECT_NAME}_static" STATIC $<TARGET_OBJECTS:objlib>)
CONFIGURE_FILE(vkh.pc.in vkh.pc @ONLY)
-
INSTALL(FILES ${CMAKE_BINARY_DIR}/vkh.pc DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig)
-INSTALL(TARGETS ${PROJECT_NAME}
- LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
- PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
+FUNCTION (setup_lib LibName)
+ SET_TARGET_PROPERTIES(${LibName} PROPERTIES
+ VERSION ${PROJECT_VERSION}
+ SOVERSION 1
+ PUBLIC_HEADER include/vkh.h
+ )
+ TARGET_LINK_LIBRARIES(${LibName}
+ ${Vulkan_LIBRARY}
+ ${GLFW3_LIBRARY}
+ )
+ INSTALL(TARGETS ${LibName}
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
+ENDFUNCTION ()
+
+setup_lib ("${PROJECT_NAME}_static")
+setup_lib ("${PROJECT_NAME}_shared")
+
+
+#get_cmake_property(_variableNames VARIABLES)
+#foreach (_variableName ${_variableNames})
+#message(STATUS "${_variableName}=${${_variableName}}")
+#endforeach()
#define VK_CHECK_RESULT(f) \
{ \
- VkResult res = (f); \
- if (res != VK_SUCCESS) \
- { \
- printf("Fatal : VkResult is %d in %s at line %d\n", res, __FILE__, __LINE__); \
- assert(res == VK_SUCCESS); \
- } \
+ VkResult res = (f); \
+ if (res != VK_SUCCESS) \
+ { \
+ printf("Fatal : VkResult is %d in %s at line %d\n", res, __FILE__, __LINE__); \
+ assert(res == VK_SUCCESS); \
+ } \
}
+typedef struct _vkh_app_t* VkhApp;
typedef struct _vkh_device_t* VkhDevice;
typedef struct _vkh_image_t* VkhImage;
typedef struct _vkh_buffer_t* VkhBuffer;
///////////////////////////////
VkhImage vkh_image_create (VkhDevice pDev, VkFormat format, uint32_t width, uint32_t height, VkImageTiling tiling,
- VkMemoryPropertyFlags memprops, VkImageUsageFlags usage);
+ VkMemoryPropertyFlags memprops, VkImageUsageFlags usage);
VkhImage vkh_image_ms_create (VkhDevice pDev, VkFormat format, VkSampleCountFlagBits num_samples, uint32_t width, uint32_t height,
- VkMemoryPropertyFlags memprops, VkImageUsageFlags usage);
+ VkMemoryPropertyFlags memprops, VkImageUsageFlags usage);
VkhImage vkh_tex2d_array_create (VkhDevice pDev, VkFormat format, uint32_t width, uint32_t height, uint32_t layers,
- VkMemoryPropertyFlags memprops, VkImageUsageFlags usage);
+ VkMemoryPropertyFlags memprops, VkImageUsageFlags usage);
void vkh_image_create_descriptor(VkhImage img, VkImageViewType viewType, VkImageAspectFlags aspectFlags, VkFilter magFilter, VkFilter minFilter,
- VkSamplerMipmapMode mipmapMode, VkSamplerAddressMode addressMode);
+ VkSamplerMipmapMode mipmapMode, VkSamplerAddressMode addressMode);
void vkh_image_create_view (VkhImage img, VkImageViewType viewType, VkImageAspectFlags aspectFlags);
void vkh_image_create_sampler (VkhImage img, VkFilter magFilter, VkFilter minFilter,
- VkSamplerMipmapMode mipmapMode, VkSamplerAddressMode addressMode);
+ VkSamplerMipmapMode mipmapMode, VkSamplerAddressMode addressMode);
void vkh_image_set_layout (VkCommandBuffer cmdBuff, VkhImage image, VkImageAspectFlags aspectMask,
- VkImageLayout new_image_layout, VkPipelineStageFlags src_stages, VkPipelineStageFlags dest_stages);
+ VkImageLayout new_image_layout, VkPipelineStageFlags src_stages, VkPipelineStageFlags dest_stages);
void vkh_image_set_layout_subres(VkCommandBuffer cmdBuff, VkhImage image, VkImageSubresourceRange subresourceRange,
- VkImageLayout new_image_layout, VkPipelineStageFlags src_stages, VkPipelineStageFlags dest_stages);
+ VkImageLayout new_image_layout, VkPipelineStageFlags src_stages, VkPipelineStageFlags dest_stages);
void vkh_image_destroy (VkhImage img);
////////////////////////////////
VkhBuffer vkh_buffer_create (VkhDevice pDev, VkBufferUsageFlags usage,
- VkMemoryPropertyFlags memoryPropertyFlags, VkDeviceSize size);
+ VkMemoryPropertyFlags memoryPropertyFlags, VkDeviceSize size);
void vkh_buffer_destroy (VkhBuffer buff);
VkResult vkh_buffer_map (VkhBuffer buff);
void vkh_buffer_unmap (VkhBuffer buff);
void vkh_cmd_end (VkCommandBuffer cmdBuff);
void vkh_cmd_submit (VkQueue queue, VkCommandBuffer *pCmdBuff, VkFence fence);
void vkh_cmd_submit_with_semaphores(VkQueue queue, VkCommandBuffer *pCmdBuff, VkSemaphore waitSemaphore,
- VkSemaphore signalSemaphore, VkFence fence);
+ VkSemaphore signalSemaphore, VkFence fence);
VkPhysicalDevice vkh_find_phy (VkInstance inst, VkPhysicalDeviceType phyType);
VkShaderModule vkh_load_module(VkDevice dev, const char* path);
bool memory_type_from_properties(VkPhysicalDeviceMemoryProperties* memory_properties, uint32_t typeBits,
- VkFlags requirements_mask, uint32_t *typeIndex);
+ VkFlags requirements_mask, uint32_t *typeIndex);
char * read_spv(const char *filename, size_t *psize);
uint32_t* readFile(uint32_t* length, const char* filename);
void dumpLayerExts ();
void set_image_layout(VkCommandBuffer cmdBuff, VkImage image, VkImageAspectFlags aspectMask, VkImageLayout old_image_layout,
- VkImageLayout new_image_layout, VkPipelineStageFlags src_stages, VkPipelineStageFlags dest_stages);
+ VkImageLayout new_image_layout, VkPipelineStageFlags src_stages, VkPipelineStageFlags dest_stages);
void set_image_layout_subres(VkCommandBuffer cmdBuff, VkImage image, VkImageSubresourceRange subresourceRange, VkImageLayout old_image_layout,
- VkImageLayout new_image_layout, VkPipelineStageFlags src_stages, VkPipelineStageFlags dest_stages);
+ VkImageLayout new_image_layout, VkPipelineStageFlags src_stages, VkPipelineStageFlags dest_stages);
#endif
--- /dev/null
+#include "vkh_app.h"
+
+#define ENGINE_NAME "vkheplers"
+#define ENGINE_VERSION 1
+
+VkhApp vkh_app_create (const char* app_name, const char* extentions[], int ext_count) {
+ VkhApp app = (VkhApp)malloc(sizeof(vkh_app_t));
+
+ VkApplicationInfo infos = { .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO,
+ .pApplicationName = app_name,
+ .applicationVersion = 1,
+ .pEngineName = ENGINE_NAME,
+ .engineVersion = ENGINE_VERSION,
+ .apiVersion = VK_API_VERSION_1_0};
+#if DEBUG
+ const uint32_t enabledLayersCount = 1;
+ //const char* enabledLayers[] = {"VK_LAYER_LUNARG_core_validation"};
+ const char* enabledLayers[] = {"VK_LAYER_LUNARG_standard_validation"};
+#else
+ const uint32_t enabledLayersCount = 0;
+ const char* enabledLayers[] = NULL;
+#endif
+
+ VkInstanceCreateInfo inst_info = { .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
+ .pApplicationInfo = &infos,
+ .enabledExtensionCount = ext_count,
+ .ppEnabledExtensionNames = extentions,
+ .enabledLayerCount = enabledLayersCount,
+ .ppEnabledLayerNames = enabledLayers };
+
+ VK_CHECK_RESULT(vkCreateInstance (&inst_info, NULL, &app->inst));
+ return app;
+}
+
+void vkh_app_destroy (VkhApp app){
+ vkDestroyInstance (app->inst, NULL);
+ free (app);
+}
+
+VkPhysicalDevice vkh_app_select_phy (VkhApp app, VkPhysicalDeviceType preferedPhyType) {
+ uint32_t gpu_count = 0;
+
+ VK_CHECK_RESULT(vkEnumeratePhysicalDevices (app->inst, &gpu_count, NULL));
+
+ VkPhysicalDevice phys[gpu_count];
+
+ VK_CHECK_RESULT(vkEnumeratePhysicalDevices (app->inst, &gpu_count, &phys));
+
+ if (gpu_count == 1)
+ return phys[0];
+
+ for (int i=0; i<gpu_count; i++){
+ VkPhysicalDeviceProperties phy;
+ vkGetPhysicalDeviceProperties (phys[i], &phy);
+ if (phy.deviceType & preferedPhyType){
+ printf ("GPU: %s vulkan:%d.%d.%d driver:%d\n", phy.deviceName,
+ phy.apiVersion>>22, phy.apiVersion>>12&2048, phy.apiVersion&8191,
+ phy.driverVersion);
+ return phys[i];
+ }
+ }
+ fprintf (stderr, "No suitable GPU found\n");
+ exit (-1);
+}