diff --git a/CMakeLists.txt b/CMakeLists.txt index a8526ee..3b64bef 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -89,6 +89,9 @@ add_subdirectory(hydra) include_directories(hydra/include) target_link_libraries(kraken hydra) +# ---- Vulkan ---- +find_package(Vulkan REQUIRED) +target_link_libraries(kraken Vulkan::Vulkan) # ---- OpenGL ---- find_package(OpenGL REQUIRED) diff --git a/kraken/KRContext.cpp b/kraken/KRContext.cpp index fc75f09..f52238e 100755 --- a/kraken/KRContext.cpp +++ b/kraken/KRContext.cpp @@ -47,7 +47,9 @@ const char *KRContext::extension_names[KRENGINE_NUM_EXTENSIONS] = { KRContext::log_callback *KRContext::s_log_callback = NULL; void *KRContext::s_log_callback_user_data = NULL; -KRContext::KRContext() : m_streamer(*this) +KRContext::KRContext() + : m_streamer(*this) + , m_vulkanInstance(VK_NULL_HANDLE) { m_streamingEnabled = false; #ifdef __APPLE__ @@ -282,8 +284,11 @@ void KRContext::loadResource(const std::string &file_name, KRDataBlock *data) { } else if(extension.compare("obj") == 0) { KRResource::LoadObj(*this, file_name); #if !TARGET_OS_IPHONE +/* + // FINDME, TODO, HACK! - Uncomment } else if(extension.compare("fbx") == 0) { KRResource::LoadFbx(*this, file_name); +*/ } else if(extension.compare("blend") == 0) { KRResource::LoadBlenderScene(*this, file_name); #endif @@ -387,20 +392,20 @@ void KRContext::getMemoryStats(long &free_memory) void KRContext::doStreaming() { - if(m_streamingEnabled) { - /* - long free_memory = KRENGINE_GPU_MEM_TARGET; - long total_memory = KRENGINE_GPU_MEM_MAX; - */ - /* + if (m_streamingEnabled) { + /* + long free_memory = KRENGINE_GPU_MEM_TARGET; + long total_memory = KRENGINE_GPU_MEM_MAX; + */ + /* #if TARGET_OS_IPHONE // FINDME, TODO, HACK! - Experimental code, need to expose through engine parameters const long KRENGINE_RESERVE_MEMORY = 0x4000000; // 64MB - + getMemoryStats(free_memory); free_memory = KRCLAMP(free_memory - KRENGINE_RESERVE_MEMORY, 0, KRENGINE_GPU_MEM_TARGET); total_memory = KRMIN(KRENGINE_GPU_MEM_MAX, free_memory * 3 / 4 + m_pTextureManager->getMemUsed() + m_pMeshManager->getMemUsed()); - + #endif */ /* @@ -411,7 +416,7 @@ void KRContext::doStreaming() free_memory = 0; } */ - + /* // FINDME, TODO - Experimental code, need to expose through engine parameters const long MEMORY_WARNING_THROTTLE2_FRAMES = 30; @@ -421,31 +426,75 @@ void KRContext::doStreaming() free_memory /= 2; } */ - + /* m_pMeshManager->doStreaming(total_memory, free_memory); m_pTextureManager->doStreaming(total_memory, free_memory); */ - - - long streaming_start_frame = m_current_frame; - - long memoryRemaining = KRENGINE_GPU_MEM_TARGET; - long memoryRemainingThisFrame = KRENGINE_GPU_MEM_MAX - m_pTextureManager->getMemUsed() - m_pMeshManager->getMemUsed(); - long memoryRemainingThisFrameStart = memoryRemainingThisFrame; - m_pMeshManager->doStreaming(memoryRemaining, memoryRemainingThisFrame); - m_pTextureManager->doStreaming(memoryRemaining, memoryRemainingThisFrame); - - if(memoryRemainingThisFrame == memoryRemainingThisFrameStart && memoryRemainingThisFrame > 0) { - m_last_fully_streamed_frame = streaming_start_frame; - } - + + + long streaming_start_frame = m_current_frame; + + long memoryRemaining = KRENGINE_GPU_MEM_TARGET; + long memoryRemainingThisFrame = KRENGINE_GPU_MEM_MAX - m_pTextureManager->getMemUsed() - m_pMeshManager->getMemUsed(); + long memoryRemainingThisFrameStart = memoryRemainingThisFrame; + m_pMeshManager->doStreaming(memoryRemaining, memoryRemainingThisFrame); + m_pTextureManager->doStreaming(memoryRemaining, memoryRemainingThisFrame); + + if (memoryRemainingThisFrame == memoryRemainingThisFrameStart && memoryRemainingThisFrame > 0) { + m_last_fully_streamed_frame = streaming_start_frame; } + + } } void KRContext::receivedMemoryWarning() { - m_last_memory_warning_frame = m_current_frame; + m_last_memory_warning_frame = m_current_frame; } +void +KRContext::createDeviceContexts() +{ + // initialize the VkApplicationInfo structure + VkApplicationInfo app_info = {}; + app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; + app_info.pNext = NULL; + app_info.pApplicationName = "Test"; // TODO - Change Me! + app_info.applicationVersion = 1; + app_info.pEngineName = "Kraken Engine"; + app_info.engineVersion = 1; + app_info.apiVersion = VK_API_VERSION_1_0; + + // initialize the VkInstanceCreateInfo structure + VkInstanceCreateInfo inst_info = {}; + inst_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; + inst_info.pNext = NULL; + inst_info.flags = 0; + inst_info.pApplicationInfo = &app_info; + inst_info.enabledExtensionCount = 0; + inst_info.ppEnabledExtensionNames = NULL; + inst_info.enabledLayerCount = 0; + inst_info.ppEnabledLayerNames = NULL; + + VkResult res = vkCreateInstance(&inst_info, NULL, &m_vulkanInstance); + if (res != VK_SUCCESS) { + destroyDeviceContexts(); + } +} + +void +KRContext::destroyDeviceContexts() +{ + if (m_vulkanInstance) != VK_NULL_HANDLE) { + vkDestroyInstance(m_vulkanInstance, NULL); + m_vulkanInstance = VK_NULL_HANDLE; + } +} + +void +KRContext::activateStreamerContext() +{ + +} diff --git a/kraken/KRContext.h b/kraken/KRContext.h index 75c1e60..94ab908 100755 --- a/kraken/KRContext.h +++ b/kraken/KRContext.h @@ -1,140 +1,141 @@ -// -// KRContext.h -// KREngine -// -// Created by Kearwood Gilbert on 12-04-12. -// Copyright (c) 2012 Kearwood Software. All rights reserved. -// - -#ifndef KREngine_KRContext_h -#define KREngine_KRContext_h - -#include "KREngine-common.h" -#include "KRBundleManager.h" -#include "KRSceneManager.h" -#include "KRTextureManager.h" -#include "KRMaterialManager.h" -#include "KRShaderManager.h" -#include "KRMeshManager.h" -#include "KRAnimationManager.h" -#include "KRAnimationCurveManager.h" -#include "KRUnknownManager.h" -#include "KRStreamer.h" - -class KRAudioManager; - -class KRContext { -public: - static int KRENGINE_MAX_SHADER_HANDLES; - static int KRENGINE_GPU_MEM_MAX; - static int KRENGINE_GPU_MEM_TARGET; - static int KRENGINE_MAX_TEXTURE_DIM; - static int KRENGINE_MIN_TEXTURE_DIM; - static int KRENGINE_PRESTREAM_DISTANCE; - static int KRENGINE_SYS_ALLOCATION_GRANULARITY; - static int KRENGINE_SYS_PAGE_SIZE; - - - KRContext(); - ~KRContext(); - - void loadResource(const std::string &file_name, KRDataBlock *data); - void loadResource(std::string path); - - KRBundleManager *getBundleManager(); - KRSceneManager *getSceneManager(); - KRTextureManager *getTextureManager(); - KRMaterialManager *getMaterialManager(); - KRShaderManager *getShaderManager(); - KRMeshManager *getMeshManager(); - KRAnimationManager *getAnimationManager(); - KRAnimationCurveManager *getAnimationCurveManager(); - KRAudioManager *getAudioManager(); - KRUnknownManager *getUnknownManager(); - - KRCamera *createCamera(int width, int height); - - enum { - KRENGINE_GL_EXT_texture_storage, - KRENGINE_NUM_EXTENSIONS - }; - - static const char * extension_names[KRENGINE_NUM_EXTENSIONS]; - static bool extension_available[KRENGINE_NUM_EXTENSIONS]; - - void startFrame(float deltaTime); - void endFrame(float deltaTime); - - long getCurrentFrame() const; - long getLastFullyStreamedFrame() const; - float getAbsoluteTime() const; - - long getAbsoluteTimeMilliseconds(); - - std::vector getResources(); - bool getStreamingEnabled(); - void setStreamingEnabled(bool enable); - -#if TARGET_OS_IPHONE || TARGET_OS_MAC - // XXX This doesn't belong here, and might not actually be needed at all - void getMemoryStats(long &free_memory); -#endif - - typedef enum { - LOG_LEVEL_INFORMATION, - LOG_LEVEL_WARNING, - LOG_LEVEL_ERROR - } log_level; - - typedef void log_callback(void *userdata, const std::string &message, log_level level); - - static void SetLogCallback(log_callback *log_callback, void *user_data); - static void Log(log_level level, const std::string message_format, ...); - - void doStreaming(); - void receivedMemoryWarning(); - - static void activateStreamerContext(); - static void activateRenderContext(); - -#if TARGET_OS_MAC - static void attachToView(void *view); -#endif - -private: - KRBundleManager *m_pBundleManager; - KRSceneManager *m_pSceneManager; - KRTextureManager *m_pTextureManager; - KRMaterialManager *m_pMaterialManager; - KRShaderManager *m_pShaderManager; - KRMeshManager *m_pMeshManager; - KRAnimationManager *m_pAnimationManager; - KRAnimationCurveManager *m_pAnimationCurveManager; - KRAudioManager *m_pSoundManager; - KRUnknownManager *m_pUnknownManager; - - void detectExtensions(); - bool m_bDetectedExtensions; - - long m_current_frame; // TODO - Does this need to be atomic? - long m_last_memory_warning_frame; // TODO - Does this need to be atomic? - long m_last_fully_streamed_frame; // TODO - Does this need to be atomic? - float m_absolute_time; - -#ifdef __APPLE__ - mach_timebase_info_data_t m_timebase_info; -#endif - - std::atomic m_streamingEnabled; - - - static log_callback *s_log_callback; - static void *s_log_callback_user_data; - - KRStreamer m_streamer; - - static void createDeviceContexts(); - void destroyDeviceContexts(); -}; - -#endif +// +// KRContext.h +// KREngine +// +// Created by Kearwood Gilbert on 12-04-12. +// Copyright (c) 2012 Kearwood Software. All rights reserved. +// + +#ifndef KREngine_KRContext_h +#define KREngine_KRContext_h + +#include "KREngine-common.h" +#include "KRBundleManager.h" +#include "KRSceneManager.h" +#include "KRTextureManager.h" +#include "KRMaterialManager.h" +#include "KRShaderManager.h" +#include "KRMeshManager.h" +#include "KRAnimationManager.h" +#include "KRAnimationCurveManager.h" +#include "KRUnknownManager.h" +#include "KRStreamer.h" + +class KRAudioManager; + +class KRContext { +public: + static int KRENGINE_MAX_SHADER_HANDLES; + static int KRENGINE_GPU_MEM_MAX; + static int KRENGINE_GPU_MEM_TARGET; + static int KRENGINE_MAX_TEXTURE_DIM; + static int KRENGINE_MIN_TEXTURE_DIM; + static int KRENGINE_PRESTREAM_DISTANCE; + static int KRENGINE_SYS_ALLOCATION_GRANULARITY; + static int KRENGINE_SYS_PAGE_SIZE; + + + KRContext(); + ~KRContext(); + + void loadResource(const std::string &file_name, KRDataBlock *data); + void loadResource(std::string path); + + KRBundleManager *getBundleManager(); + KRSceneManager *getSceneManager(); + KRTextureManager *getTextureManager(); + KRMaterialManager *getMaterialManager(); + KRShaderManager *getShaderManager(); + KRMeshManager *getMeshManager(); + KRAnimationManager *getAnimationManager(); + KRAnimationCurveManager *getAnimationCurveManager(); + KRAudioManager *getAudioManager(); + KRUnknownManager *getUnknownManager(); + + KRCamera *createCamera(int width, int height); + + enum { + KRENGINE_GL_EXT_texture_storage, + KRENGINE_NUM_EXTENSIONS + }; + + static const char * extension_names[KRENGINE_NUM_EXTENSIONS]; + static bool extension_available[KRENGINE_NUM_EXTENSIONS]; + + void startFrame(float deltaTime); + void endFrame(float deltaTime); + + long getCurrentFrame() const; + long getLastFullyStreamedFrame() const; + float getAbsoluteTime() const; + + long getAbsoluteTimeMilliseconds(); + + std::vector getResources(); + bool getStreamingEnabled(); + void setStreamingEnabled(bool enable); + +#if TARGET_OS_IPHONE || TARGET_OS_MAC + // XXX This doesn't belong here, and might not actually be needed at all + void getMemoryStats(long &free_memory); +#endif + + typedef enum { + LOG_LEVEL_INFORMATION, + LOG_LEVEL_WARNING, + LOG_LEVEL_ERROR + } log_level; + + typedef void log_callback(void *userdata, const std::string &message, log_level level); + + static void SetLogCallback(log_callback *log_callback, void *user_data); + static void Log(log_level level, const std::string message_format, ...); + + void doStreaming(); + void receivedMemoryWarning(); + + static void activateStreamerContext(); + static void activateRenderContext(); + +#if TARGET_OS_MAC + static void attachToView(void *view); +#endif + +private: + KRBundleManager *m_pBundleManager; + KRSceneManager *m_pSceneManager; + KRTextureManager *m_pTextureManager; + KRMaterialManager *m_pMaterialManager; + KRShaderManager *m_pShaderManager; + KRMeshManager *m_pMeshManager; + KRAnimationManager *m_pAnimationManager; + KRAnimationCurveManager *m_pAnimationCurveManager; + KRAudioManager *m_pSoundManager; + KRUnknownManager *m_pUnknownManager; + + void detectExtensions(); + bool m_bDetectedExtensions; + + long m_current_frame; // TODO - Does this need to be atomic? + long m_last_memory_warning_frame; // TODO - Does this need to be atomic? + long m_last_fully_streamed_frame; // TODO - Does this need to be atomic? + float m_absolute_time; + +#ifdef __APPLE__ + mach_timebase_info_data_t m_timebase_info; +#endif + + std::atomic m_streamingEnabled; + + + static log_callback *s_log_callback; + static void *s_log_callback_user_data; + + KRStreamer m_streamer; + VkInstance m_vulkanInstance; + + void createDeviceContexts(); + void destroyDeviceContexts(); +}; + +#endif diff --git a/kraken/KREngine-common.h b/kraken/KREngine-common.h index 5e6917c..ee97e20 100755 --- a/kraken/KREngine-common.h +++ b/kraken/KREngine-common.h @@ -103,6 +103,8 @@ using std::unordered_map; using std::unordered_multimap; using std::hash; +#include + #if defined(_WIN32) || defined(_WIN64) #include diff --git a/kraken/KRResource.h b/kraken/KRResource.h index 6e35d1c..9af319f 100755 --- a/kraken/KRResource.h +++ b/kraken/KRResource.h @@ -1,47 +1,47 @@ -// -// KRResource.h -// KREngine -// -// Created by Kearwood Gilbert on 12-03-22. -// Copyright (c) 2012 Kearwood Software. All rights reserved. -// - -#include "KREngine-common.h" -#include "KRContextObject.h" -#include "KRDataBlock.h" - -#ifndef KRRESOURCE_H -#define KRRESOURCE_H - -class KRResource : public KRContextObject -{ -public: - std::string getName(); - virtual std::string getExtension() = 0; - virtual bool save(const std::string& path); - virtual bool save(KRDataBlock &data) = 0; - - static std::string GetFileExtension(const std::string& name); - static std::string GetFileBase(const std::string& name); - static std::string GetFilePath(const std::string& name); - - virtual ~KRResource(); - - - static std::vector LoadObj(KRContext &context, const std::string& path); -#if !TARGET_OS_IPHONE - static void LoadFbx(KRContext &context, const std::string& path); - static std::vector LoadBlenderScene(KRContext &context, const std::string& path); -#endif - -protected: - KRResource(KRContext &context, std::string name); - - -private: - std::string m_name; - - -}; - -#endif +// +// KRResource.h +// KREngine +// +// Created by Kearwood Gilbert on 12-03-22. +// Copyright (c) 2012 Kearwood Software. All rights reserved. +// + +#include "KREngine-common.h" +#include "KRContextObject.h" +#include "KRDataBlock.h" + +#ifndef KRRESOURCE_H +#define KRRESOURCE_H + +class KRResource : public KRContextObject +{ +public: + std::string getName(); + virtual std::string getExtension() = 0; + virtual bool save(const std::string& path); + virtual bool save(KRDataBlock &data) = 0; + + static std::string GetFileExtension(const std::string& name); + static std::string GetFileBase(const std::string& name); + static std::string GetFilePath(const std::string& name); + + virtual ~KRResource(); + + + static std::vector LoadObj(KRContext &context, const std::string& path); +#if !TARGET_OS_IPHONE +// static void LoadFbx(KRContext &context, const std::string& path); TODO, FINDME, HACK! - Uncomment + static std::vector LoadBlenderScene(KRContext &context, const std::string& path); +#endif + +protected: + KRResource(KRContext &context, std::string name); + + +private: + std::string m_name; + + +}; + +#endif