diff --git a/android/computeparticles/computeparticles.NativeActivity/computeparticles.NativeActivity.vcxproj b/android/computeparticles/computeparticles.NativeActivity/computeparticles.NativeActivity.vcxproj index fcfabdd2..343d854d 100644 --- a/android/computeparticles/computeparticles.NativeActivity/computeparticles.NativeActivity.vcxproj +++ b/android/computeparticles/computeparticles.NativeActivity/computeparticles.NativeActivity.vcxproj @@ -149,7 +149,7 @@ CompileAsCpp VK_NO_PROTOTYPES;VK_USE_PLATFORM_ANDROID_KHR;__STDINT_LIMITS c++11 - ../../../external;../../../base;../../../external/gli;../../../external/glm;%(AdditionalIncludeDirectories) + ../../../external;../../../base;../../../external/gli;../../../external/glm;../../base;%(AdditionalIncludeDirectories) %(LibraryDependencies);GLESv1_CM;EGL; @@ -208,6 +208,7 @@ + diff --git a/android/computeparticles/computeparticles.NativeActivity/computeparticles.NativeActivity.vcxproj.filters b/android/computeparticles/computeparticles.NativeActivity/computeparticles.NativeActivity.vcxproj.filters index 923af197..f33cd39f 100644 --- a/android/computeparticles/computeparticles.NativeActivity/computeparticles.NativeActivity.vcxproj.filters +++ b/android/computeparticles/computeparticles.NativeActivity/computeparticles.NativeActivity.vcxproj.filters @@ -4,6 +4,7 @@ + diff --git a/android/computeparticles/computeparticles.NativeActivity/main.cpp b/android/computeparticles/computeparticles.NativeActivity/main.cpp index dedf3e90..5975fcb1 100644 --- a/android/computeparticles/computeparticles.NativeActivity/main.cpp +++ b/android/computeparticles/computeparticles.NativeActivity/main.cpp @@ -14,6 +14,7 @@ #include #include "vulkanandroid.h" #include "vulkanswapchain.hpp" +#include "vulkanandroidbase.hpp" #include #define GLM_FORCE_RADIANS @@ -32,13 +33,10 @@ struct saved_state { float zoom; }; -struct VulkanExample +struct VulkanExample : public VulkanAndroidExampleBase { - struct android_app* app; - +public: int animating; - uint32_t width; - uint32_t height; struct saved_state state; float timer = 0.0f; @@ -61,23 +59,9 @@ struct VulkanExample uint32_t mipLevels; } texture; - VkInstance instance; - VkPhysicalDevice physicalDevice; - VkDevice device; - VulkanSwapChain swapChain; - VkQueue queue; - VkCommandPool cmdPool; - VkRenderPass renderPass; - VkPipelineCache pipelineCache; - VkDescriptorPool descriptorPool; VkDescriptorSetLayout descriptorSetLayout; VkDescriptorSet descriptorSet; VkPipelineLayout pipelineLayout; - std::vector drawCmdBuffers; - VkCommandBuffer postPresentCmdBuffer = VK_NULL_HANDLE; - VkCommandBuffer setupCmdBuffer = VK_NULL_HANDLE; - VkPhysicalDeviceMemoryProperties deviceMemoryProperties; - std::vector shaderModules; struct { VkPipelineVertexInputStateCreateInfo inputState; @@ -90,17 +74,6 @@ struct VulkanExample VkPipeline compute; } pipelines; - uint32_t currentBuffer = 0; - - struct - { - VkImage image; - VkDeviceMemory mem; - VkImageView view; - } depthStencil; - - std::vectorframeBuffers; - VkQueue computeQueue; VkCommandBuffer computeCmdBuffer; VkPipelineLayout computePipelineLayout; @@ -124,65 +97,6 @@ struct VulkanExample vkTools::UniformData uniformDataCompute; - bool prepared = false; - - VkBool32 getMemoryType(uint32_t typeBits, VkFlags properties, uint32_t * typeIndex) - { - for (uint32_t i = 0; i < 32; i++) - { - if ((typeBits & 1) == 1) - { - if ((deviceMemoryProperties.memoryTypes[i].propertyFlags & properties) == properties) - { - *typeIndex = i; - return true; - } - } - typeBits >>= 1; - } - return false; - } - - VkShaderModule loadShaderModule(const char *fileName, VkShaderStageFlagBits stage) - { - // Load shader from compressed asset - AAsset* asset = AAssetManager_open(app->activity->assetManager, fileName, AASSET_MODE_STREAMING); - assert(asset); - size_t size = AAsset_getLength(asset); - assert(size > 0); - - char *shaderCode = new char[size]; - AAsset_read(asset, shaderCode, size); - AAsset_close(asset); - - VkShaderModule shaderModule; - VkShaderModuleCreateInfo moduleCreateInfo; - VkResult err; - - moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; - moduleCreateInfo.pNext = NULL; - - moduleCreateInfo.codeSize = size; - moduleCreateInfo.pCode = (uint32_t*)shaderCode; - moduleCreateInfo.flags = 0; - err = vkCreateShaderModule(device, &moduleCreateInfo, NULL, &shaderModule); - assert(!err); - - return shaderModule; - } - - VkPipelineShaderStageCreateInfo loadShader(const char * fileName, VkShaderStageFlagBits stage) - { - VkPipelineShaderStageCreateInfo shaderStage = {}; - shaderStage.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; - shaderStage.stage = stage; - shaderStage.module = loadShaderModule(fileName, stage); - shaderStage.pName = "main"; - assert(shaderStage.module != NULL); - shaderModules.push_back(shaderStage.module); - return shaderStage; - } - void loadTexture(const char* fileName, VkFormat format, bool forceLinearTiling) { VkFormatProperties formatProperties; @@ -495,106 +409,7 @@ struct VulkanExample void initVulkan() { - prepared = false; - - bool libLoaded = loadVulkanLibrary(); - assert(libLoaded); - - VkResult vkRes; - - // Instance - VkApplicationInfo appInfo = {}; - appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; - appInfo.pApplicationName = "Vulkan Android Example"; - appInfo.applicationVersion = 1; - appInfo.pEngineName = "VulkanAndroidExample"; - appInfo.engineVersion = 1; - // todo : Workaround to support implementations that are not using the latest SDK - appInfo.apiVersion = VK_MAKE_VERSION(1, 0, 1); - - VkInstanceCreateInfo instanceCreateInfo = {}; - instanceCreateInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; - instanceCreateInfo.pApplicationInfo = &appInfo; - - vkRes = vkCreateInstance(&instanceCreateInfo, NULL, &instance); - assert(vkRes == VK_SUCCESS); - - loadVulkanFunctions(instance); - - // Device - // Always use first physical device - uint32_t gpuCount; - vkRes = vkEnumeratePhysicalDevices(instance, &gpuCount, &physicalDevice); - assert(vkRes == VK_SUCCESS); - - // Find a queue that supports graphics operations - uint32_t graphicsQueueIndex = 0; - uint32_t queueCount; - vkGetPhysicalDeviceQueueFamilyProperties(physicalDevice, &queueCount, NULL); - assert(queueCount >= 1); - - std::vector queueProps; - queueProps.resize(queueCount); - vkGetPhysicalDeviceQueueFamilyProperties(physicalDevice, &queueCount, queueProps.data()); - - for (graphicsQueueIndex = 0; graphicsQueueIndex < queueCount; graphicsQueueIndex++) - { - if (queueProps[graphicsQueueIndex].queueFlags & VK_QUEUE_GRAPHICS_BIT) - break; - } - assert(graphicsQueueIndex < queueCount); - - // Request the queue - float queuePriorities = 0.0f; - VkDeviceQueueCreateInfo queueCreateInfo = {}; - queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; - queueCreateInfo.queueFamilyIndex = graphicsQueueIndex; - queueCreateInfo.queueCount = 1; - queueCreateInfo.pQueuePriorities = &queuePriorities; - - // Create device - VkDeviceCreateInfo deviceCreateInfo = {}; - deviceCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; - deviceCreateInfo.queueCreateInfoCount = 1; - deviceCreateInfo.pQueueCreateInfos = &queueCreateInfo; - - vkRes = vkCreateDevice(physicalDevice, &deviceCreateInfo, nullptr, &device); - assert(vkRes == VK_SUCCESS); - - // Get graphics queue - vkGetDeviceQueue(device, graphicsQueueIndex, 0, &queue); - - // Device memory properties (for finding appropriate memory types) - vkGetPhysicalDeviceMemoryProperties(physicalDevice, &deviceMemoryProperties); - - // Swap chain - swapChain.connect(instance, physicalDevice, device); - swapChain.initSurface(app->window); - - // Command buffer pool - VkCommandPoolCreateInfo cmdPoolInfo = {}; - cmdPoolInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; - cmdPoolInfo.queueFamilyIndex = swapChain.queueNodeIndex; - cmdPoolInfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT; - vkRes = vkCreateCommandPool(device, &cmdPoolInfo, nullptr, &cmdPool); - assert(!vkRes); - - // Pipeline cache - VkPipelineCacheCreateInfo pipelineCacheCreateInfo = {}; - pipelineCacheCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO; - VkResult err = vkCreatePipelineCache(device, &pipelineCacheCreateInfo, nullptr, &pipelineCache); - assert(!err); - - createSetupCommandBuffer(); - startSetupCommandBuffer(); - - swapChain.create(setupCmdBuffer, &width, &height); - - setupDepthStencil(); - setupRenderPass(); - setupFrameBuffer(); - - flushSetupCommandBuffer(); + VulkanAndroidExampleBase::initVulkan(); loadTexture( "textures/android_robot.ktx", @@ -640,97 +455,9 @@ struct VulkanExample destroyTextureImage(texture); - swapChain.cleanup(); - - vkDestroyDescriptorPool(device, descriptorPool, nullptr); - if (setupCmdBuffer != VK_NULL_HANDLE) - { - vkFreeCommandBuffers(device, cmdPool, 1, &setupCmdBuffer); - - } - vkFreeCommandBuffers(device, cmdPool, drawCmdBuffers.size(), drawCmdBuffers.data()); - vkFreeCommandBuffers(device, cmdPool, 1, &postPresentCmdBuffer); vkFreeCommandBuffers(device, cmdPool, 1, &computeCmdBuffer); - - vkDestroyRenderPass(device, renderPass, nullptr); - for (uint32_t i = 0; i < frameBuffers.size(); i++) - { - vkDestroyFramebuffer(device, frameBuffers[i], nullptr); - } - - for (auto& shaderModule : shaderModules) - { - vkDestroyShaderModule(device, shaderModule, nullptr); - } - - vkDestroyImageView(device, depthStencil.view, nullptr); - vkDestroyImage(device, depthStencil.image, nullptr); - vkFreeMemory(device, depthStencil.mem, nullptr); - - vkDestroyPipelineCache(device, pipelineCache, nullptr); - vkDestroyDevice(device, nullptr); - vkDestroyInstance(instance, nullptr); - - freeVulkanLibrary(); - } - - void createSetupCommandBuffer() - { - VkCommandBufferAllocateInfo cmdBufAllocateInfo = - vkTools::initializers::commandBufferAllocateInfo( - cmdPool, - VK_COMMAND_BUFFER_LEVEL_PRIMARY, - 1); - - VkResult vkRes = vkAllocateCommandBuffers(device, &cmdBufAllocateInfo, &setupCmdBuffer); - assert(!vkRes); - } - - void startSetupCommandBuffer() - { - VkCommandBufferBeginInfo cmdBufInfo = vkTools::initializers::commandBufferBeginInfo(); - vkBeginCommandBuffer(setupCmdBuffer, &cmdBufInfo); - } - - void flushSetupCommandBuffer() - { - VkResult err; - - if (setupCmdBuffer == VK_NULL_HANDLE) - return; - - err = vkEndCommandBuffer(setupCmdBuffer); - assert(!err); - - VkSubmitInfo submitInfo = {}; - submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; - submitInfo.commandBufferCount = 1; - submitInfo.pCommandBuffers = &setupCmdBuffer; - - err = vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE); - assert(!err); - - err = vkQueueWaitIdle(queue); - assert(!err); - } - - void createCommandBuffers() - { - drawCmdBuffers.resize(swapChain.imageCount); - - VkCommandBufferAllocateInfo cmdBufAllocateInfo = - vkTools::initializers::commandBufferAllocateInfo( - cmdPool, - VK_COMMAND_BUFFER_LEVEL_PRIMARY, - drawCmdBuffers.size()); - - VkResult vkRes = vkAllocateCommandBuffers(device, &cmdBufAllocateInfo, drawCmdBuffers.data()); - assert(!vkRes); - - cmdBufAllocateInfo.commandBufferCount = 1; - - vkRes = vkAllocateCommandBuffers(device, &cmdBufAllocateInfo, &postPresentCmdBuffer); - assert(!vkRes); + + VulkanExample::cleanUpVulkan(); } // Find and create a compute capable device queue @@ -1169,144 +896,6 @@ struct VulkanExample vkUpdateDescriptorSets(device, writeDescriptorSets.size(), writeDescriptorSets.data(), 0, NULL); } - void setupDepthStencil() - { - VkImageCreateInfo image = {}; - image.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; - image.pNext = NULL; - image.imageType = VK_IMAGE_TYPE_2D; - image.format = VK_FORMAT_D24_UNORM_S8_UINT; - image.extent = { width, height, 1 }; - image.mipLevels = 1; - image.arrayLayers = 1; - image.samples = VK_SAMPLE_COUNT_1_BIT; - image.tiling = VK_IMAGE_TILING_OPTIMAL; - image.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT; - image.flags = 0; - - VkMemoryAllocateInfo mem_alloc = {}; - mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; - mem_alloc.pNext = NULL; - mem_alloc.allocationSize = 0; - mem_alloc.memoryTypeIndex = 0; - - VkImageViewCreateInfo depthStencilView = {}; - depthStencilView.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; - depthStencilView.pNext = NULL; - depthStencilView.viewType = VK_IMAGE_VIEW_TYPE_2D; - depthStencilView.format = VK_FORMAT_D24_UNORM_S8_UINT; - depthStencilView.flags = 0; - depthStencilView.subresourceRange = {}; - depthStencilView.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT; - depthStencilView.subresourceRange.baseMipLevel = 0; - depthStencilView.subresourceRange.levelCount = 1; - depthStencilView.subresourceRange.baseArrayLayer = 0; - depthStencilView.subresourceRange.layerCount = 1; - - VkMemoryRequirements memReqs; - VkResult err; - - err = vkCreateImage(device, &image, nullptr, &depthStencil.image); - assert(!err); - vkGetImageMemoryRequirements(device, depthStencil.image, &memReqs); - mem_alloc.allocationSize = memReqs.size; - getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, &mem_alloc.memoryTypeIndex); - err = vkAllocateMemory(device, &mem_alloc, nullptr, &depthStencil.mem); - assert(!err); - - err = vkBindImageMemory(device, depthStencil.image, depthStencil.mem, 0); - assert(!err); - vkTools::setImageLayout(setupCmdBuffer, depthStencil.image, VK_IMAGE_ASPECT_DEPTH_BIT, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL); - - depthStencilView.image = depthStencil.image; - err = vkCreateImageView(device, &depthStencilView, nullptr, &depthStencil.view); - assert(!err); - } - - void setupFrameBuffer() - { - VkImageView attachments[2]; - - // Depth/Stencil attachment is the same for all frame buffers - attachments[1] = depthStencil.view; - - VkFramebufferCreateInfo frameBufferCreateInfo = {}; - frameBufferCreateInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO; - frameBufferCreateInfo.pNext = NULL; - frameBufferCreateInfo.renderPass = renderPass; - frameBufferCreateInfo.attachmentCount = 2; - frameBufferCreateInfo.pAttachments = attachments; - frameBufferCreateInfo.width = width; - frameBufferCreateInfo.height = height; - frameBufferCreateInfo.layers = 1; - - // Create frame buffers for every swap chain image - frameBuffers.resize(swapChain.imageCount); - for (uint32_t i = 0; i < frameBuffers.size(); i++) - { - attachments[0] = swapChain.buffers[i].view; - VkResult err = vkCreateFramebuffer(device, &frameBufferCreateInfo, nullptr, &frameBuffers[i]); - assert(!err); - } - } - - void setupRenderPass() - { - VkAttachmentDescription attachments[2]; - attachments[0].format = VK_FORMAT_R8G8B8A8_UNORM; - attachments[0].samples = VK_SAMPLE_COUNT_1_BIT; - attachments[0].loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; - attachments[0].storeOp = VK_ATTACHMENT_STORE_OP_STORE; - attachments[0].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; - attachments[0].stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; - attachments[0].initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; - attachments[0].finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; - - attachments[1].format = VK_FORMAT_D24_UNORM_S8_UINT; - attachments[1].samples = VK_SAMPLE_COUNT_1_BIT; - attachments[1].loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; - attachments[1].storeOp = VK_ATTACHMENT_STORE_OP_STORE; - attachments[1].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; - attachments[1].stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; - attachments[1].initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; - attachments[1].finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; - - VkAttachmentReference colorReference = {}; - colorReference.attachment = 0; - colorReference.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; - - VkAttachmentReference depthReference = {}; - depthReference.attachment = 1; - depthReference.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; - - VkSubpassDescription subpass = {}; - subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; - subpass.flags = 0; - subpass.inputAttachmentCount = 0; - subpass.pInputAttachments = NULL; - subpass.colorAttachmentCount = 1; - subpass.pColorAttachments = &colorReference; - subpass.pResolveAttachments = NULL; - subpass.pDepthStencilAttachment = &depthReference; - subpass.preserveAttachmentCount = 0; - subpass.pPreserveAttachments = NULL; - - VkRenderPassCreateInfo renderPassInfo = {}; - renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; - renderPassInfo.pNext = NULL; - renderPassInfo.attachmentCount = 2; - renderPassInfo.pAttachments = attachments; - renderPassInfo.subpassCount = 1; - renderPassInfo.pSubpasses = &subpass; - renderPassInfo.dependencyCount = 0; - renderPassInfo.pDependencies = NULL; - - VkResult err; - - err = vkCreateRenderPass(device, &renderPassInfo, nullptr, &renderPass); - assert(!err); - } - void buildCommandBuffers() { VkCommandBufferBeginInfo cmdBufInfo = vkTools::initializers::commandBufferBeginInfo(); @@ -1402,63 +991,32 @@ struct VulkanExample void draw() { VkResult err; - VkSemaphore presentCompleteSemaphore; - VkSemaphoreCreateInfo presentCompleteSemaphoreCreateInfo = vkTools::initializers::semaphoreCreateInfo(); - - err = vkCreateSemaphore(device, &presentCompleteSemaphoreCreateInfo, nullptr, &presentCompleteSemaphore); - assert(!err); // Get next image in the swap chain (back/front buffer) - err = swapChain.acquireNextImage(presentCompleteSemaphore, ¤tBuffer); + err = swapChain.acquireNextImage(semaphores.presentComplete, ¤tBuffer); assert(!err); + submitPostPresentBarrier(swapChain.buffers[currentBuffer].image); + + VkPipelineStageFlags pipelineStages = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; VkSubmitInfo submitInfo = vkTools::initializers::submitInfo(); submitInfo.waitSemaphoreCount = 1; - submitInfo.pWaitSemaphores = &presentCompleteSemaphore; + submitInfo.pWaitSemaphores = &semaphores.presentComplete; submitInfo.commandBufferCount = 1; submitInfo.pCommandBuffers = &drawCmdBuffers[currentBuffer]; + submitInfo.pWaitDstStageMask = &pipelineStages; + submitInfo.signalSemaphoreCount = 1; + submitInfo.pSignalSemaphores = &semaphores.submitSignal; - // Submit draw command buffer + // Submit to the graphics queue err = vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE); assert(!err); - err = swapChain.queuePresent(queue, currentBuffer); - assert(!err); + submitPrePresentBarrier(swapChain.buffers[currentBuffer].image); - vkDestroySemaphore(device, presentCompleteSemaphore, nullptr); - - VkImageMemoryBarrier postPresentBarrier = vkTools::postPresentBarrier(swapChain.buffers[currentBuffer].image); - - // Use dedicated command buffer from example base class for submitting the post present barrier - VkCommandBufferBeginInfo cmdBufInfo = {}; - cmdBufInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; - - err = vkBeginCommandBuffer(postPresentCmdBuffer, &cmdBufInfo); - assert(!err); - - // Put post present barrier into command buffer - vkCmdPipelineBarrier( - postPresentCmdBuffer, - VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, - VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, - VK_FLAGS_NONE, - 0, nullptr, - 0, nullptr, - 1, &postPresentBarrier); - - err = vkEndCommandBuffer(postPresentCmdBuffer); - assert(!err); - - // Submit to the queue - submitInfo = {}; - submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; - submitInfo.commandBufferCount = 1; - submitInfo.pCommandBuffers = &postPresentCmdBuffer; - - err = vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE); - assert(!err); - - err = vkQueueWaitIdle(queue); + // Present the current buffer to the swap chain + // This will display the image + err = swapChain.queuePresent(queue, currentBuffer, semaphores.submitSignal); assert(!err); // Compute diff --git a/android/texture/texture.NativeActivity/main.cpp b/android/texture/texture.NativeActivity/main.cpp index fd72867c..6fbf63a0 100644 --- a/android/texture/texture.NativeActivity/main.cpp +++ b/android/texture/texture.NativeActivity/main.cpp @@ -14,6 +14,7 @@ #include #include "vulkanandroid.h" #include "vulkanswapchain.hpp" +#include "vulkanandroidbase.hpp" #include #define GLM_FORCE_RADIANS @@ -31,13 +32,10 @@ struct saved_state { float zoom; }; -struct VulkanExample +class VulkanExample : public VulkanAndroidExampleBase { - struct android_app* app; - +public: int animating; - uint32_t width; - uint32_t height; struct saved_state state; // Vulkan @@ -56,23 +54,9 @@ struct VulkanExample uint32_t mipLevels; } texture; - VkInstance instance; - VkPhysicalDevice physicalDevice; - VkDevice device; - VulkanSwapChain swapChain; - VkQueue queue; - VkCommandPool cmdPool; - VkRenderPass renderPass; - VkPipelineCache pipelineCache; - VkDescriptorPool descriptorPool; VkDescriptorSetLayout descriptorSetLayout; VkDescriptorSet descriptorSet; VkPipelineLayout pipelineLayout; - std::vector drawCmdBuffers; - VkCommandBuffer postPresentCmdBuffer = VK_NULL_HANDLE; - VkCommandBuffer setupCmdBuffer = VK_NULL_HANDLE; - VkPhysicalDeviceMemoryProperties deviceMemoryProperties; - std::vector shaderModules; struct { VkBuffer buf; @@ -103,76 +87,6 @@ struct VulkanExample VkPipeline solid; } pipelines; - uint32_t currentBuffer = 0; - - struct - { - VkImage image; - VkDeviceMemory mem; - VkImageView view; - } depthStencil; - - std::vectorframeBuffers; - - bool prepared = false; - - VkBool32 getMemoryType(uint32_t typeBits, VkFlags properties, uint32_t * typeIndex) - { - for (uint32_t i = 0; i < 32; i++) - { - if ((typeBits & 1) == 1) - { - if ((deviceMemoryProperties.memoryTypes[i].propertyFlags & properties) == properties) - { - *typeIndex = i; - return true; - } - } - typeBits >>= 1; - } - return false; - } - - VkShaderModule loadShaderModule(const char *fileName, VkShaderStageFlagBits stage) - { - // Load shader from compressed asset - AAsset* asset = AAssetManager_open(app->activity->assetManager, fileName, AASSET_MODE_STREAMING); - assert(asset); - size_t size = AAsset_getLength(asset); - assert(size > 0); - - char *shaderCode = new char[size]; - AAsset_read(asset, shaderCode, size); - AAsset_close(asset); - - VkShaderModule shaderModule; - VkShaderModuleCreateInfo moduleCreateInfo; - VkResult err; - - moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; - moduleCreateInfo.pNext = NULL; - - moduleCreateInfo.codeSize = size; - moduleCreateInfo.pCode = (uint32_t*)shaderCode; - moduleCreateInfo.flags = 0; - err = vkCreateShaderModule(device, &moduleCreateInfo, NULL, &shaderModule); - assert(!err); - - return shaderModule; - } - - VkPipelineShaderStageCreateInfo loadShader(const char * fileName, VkShaderStageFlagBits stage) - { - VkPipelineShaderStageCreateInfo shaderStage = {}; - shaderStage.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; - shaderStage.stage = stage; - shaderStage.module = loadShaderModule(fileName, stage); - shaderStage.pName = "main"; - assert(shaderStage.module != NULL); - shaderModules.push_back(shaderStage.module); - return shaderStage; - } - void loadTexture(const char* fileName, VkFormat format, bool forceLinearTiling) { VkFormatProperties formatProperties; @@ -183,7 +97,6 @@ struct VulkanExample size_t size = AAsset_getLength(asset); assert(size > 0); - //char *textureData = new char[size]; void *textureData = malloc(size); AAsset_read(asset, textureData, size); AAsset_close(asset); @@ -485,114 +398,13 @@ struct VulkanExample void initVulkan() { - prepared = false; - - bool libLoaded = loadVulkanLibrary(); - assert(libLoaded); - - VkResult vkRes; - - // Instance - VkApplicationInfo appInfo = {}; - appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; - appInfo.pApplicationName = "Vulkan Android Example"; - appInfo.applicationVersion = 1; - appInfo.pEngineName = "VulkanAndroidExample"; - appInfo.engineVersion = 1; - // todo : Workaround to support implementations that are not using the latest SDK - appInfo.apiVersion = VK_MAKE_VERSION(1, 0, 1); - - VkInstanceCreateInfo instanceCreateInfo = {}; - instanceCreateInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; - instanceCreateInfo.pApplicationInfo = &appInfo; - - vkRes = vkCreateInstance(&instanceCreateInfo, NULL, &instance); - assert(vkRes == VK_SUCCESS); - - loadVulkanFunctions(instance); - - // Device - // Always use first physical device - uint32_t gpuCount; - vkRes = vkEnumeratePhysicalDevices(instance, &gpuCount, &physicalDevice); - assert(vkRes == VK_SUCCESS); - - // Find a queue that supports graphics operations - uint32_t graphicsQueueIndex = 0; - uint32_t queueCount; - vkGetPhysicalDeviceQueueFamilyProperties(physicalDevice, &queueCount, NULL); - assert(queueCount >= 1); - - std::vector queueProps; - queueProps.resize(queueCount); - vkGetPhysicalDeviceQueueFamilyProperties(physicalDevice, &queueCount, queueProps.data()); - - for (graphicsQueueIndex = 0; graphicsQueueIndex < queueCount; graphicsQueueIndex++) - { - if (queueProps[graphicsQueueIndex].queueFlags & VK_QUEUE_GRAPHICS_BIT) - break; - } - assert(graphicsQueueIndex < queueCount); - - // Request the queue - float queuePriorities = 0.0f; - VkDeviceQueueCreateInfo queueCreateInfo = {}; - queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; - queueCreateInfo.queueFamilyIndex = graphicsQueueIndex; - queueCreateInfo.queueCount = 1; - queueCreateInfo.pQueuePriorities = &queuePriorities; - - // Create device - VkDeviceCreateInfo deviceCreateInfo = {}; - deviceCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; - deviceCreateInfo.queueCreateInfoCount = 1; - deviceCreateInfo.pQueueCreateInfos = &queueCreateInfo; - - vkRes = vkCreateDevice(physicalDevice, &deviceCreateInfo, nullptr, &device); - assert(vkRes == VK_SUCCESS); - - // Get graphics queue - vkGetDeviceQueue(device, graphicsQueueIndex, 0, &queue); - - // Device memory properties (for finding appropriate memory types) - vkGetPhysicalDeviceMemoryProperties(physicalDevice, &deviceMemoryProperties); - - // Swap chain - swapChain.connect(instance, physicalDevice, device); - swapChain.initSurface(app->window); - - // Command buffer pool - VkCommandPoolCreateInfo cmdPoolInfo = {}; - cmdPoolInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; - cmdPoolInfo.queueFamilyIndex = swapChain.queueNodeIndex; - cmdPoolInfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT; - vkRes = vkCreateCommandPool(device, &cmdPoolInfo, nullptr, &cmdPool); - assert(!vkRes); - - // Pipeline cache - VkPipelineCacheCreateInfo pipelineCacheCreateInfo = {}; - pipelineCacheCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO; - VkResult err = vkCreatePipelineCache(device, &pipelineCacheCreateInfo, nullptr, &pipelineCache); - assert(!err); - - createSetupCommandBuffer(); - startSetupCommandBuffer(); - - swapChain.create(setupCmdBuffer, &width, &height); - - setupDepthStencil(); - setupRenderPass(); - setupFrameBuffer(); - - flushSetupCommandBuffer(); + VulkanAndroidExampleBase::initVulkan(); loadTexture( "textures/vulkan_android_robot.ktx", VK_FORMAT_R8G8B8A8_UNORM, false); - createCommandBuffers(); - prepareVertices(); prepareUniformBuffers(); setupDescriptorSetLayout(); @@ -623,96 +435,7 @@ struct VulkanExample destroyTextureImage(texture); - swapChain.cleanup(); - - vkDestroyDescriptorPool(device, descriptorPool, nullptr); - if (setupCmdBuffer != VK_NULL_HANDLE) - { - vkFreeCommandBuffers(device, cmdPool, 1, &setupCmdBuffer); - - } - vkFreeCommandBuffers(device, cmdPool, drawCmdBuffers.size(), drawCmdBuffers.data()); - vkFreeCommandBuffers(device, cmdPool, 1, &postPresentCmdBuffer); - - vkDestroyRenderPass(device, renderPass, nullptr); - for (uint32_t i = 0; i < frameBuffers.size(); i++) - { - vkDestroyFramebuffer(device, frameBuffers[i], nullptr); - } - - for (auto& shaderModule : shaderModules) - { - vkDestroyShaderModule(device, shaderModule, nullptr); - } - - vkDestroyImageView(device, depthStencil.view, nullptr); - vkDestroyImage(device, depthStencil.image, nullptr); - vkFreeMemory(device, depthStencil.mem, nullptr); - - vkDestroyPipelineCache(device, pipelineCache, nullptr); - vkDestroyDevice(device, nullptr); - vkDestroyInstance(instance, nullptr); - - freeVulkanLibrary(); - } - - void createSetupCommandBuffer() - { - VkCommandBufferAllocateInfo cmdBufAllocateInfo = - vkTools::initializers::commandBufferAllocateInfo( - cmdPool, - VK_COMMAND_BUFFER_LEVEL_PRIMARY, - 1); - - VkResult vkRes = vkAllocateCommandBuffers(device, &cmdBufAllocateInfo, &setupCmdBuffer); - assert(!vkRes); - } - - void startSetupCommandBuffer() - { - VkCommandBufferBeginInfo cmdBufInfo = vkTools::initializers::commandBufferBeginInfo(); - vkBeginCommandBuffer(setupCmdBuffer, &cmdBufInfo); - } - - void flushSetupCommandBuffer() - { - VkResult err; - - if (setupCmdBuffer == VK_NULL_HANDLE) - return; - - err = vkEndCommandBuffer(setupCmdBuffer); - assert(!err); - - VkSubmitInfo submitInfo = {}; - submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; - submitInfo.commandBufferCount = 1; - submitInfo.pCommandBuffers = &setupCmdBuffer; - - err = vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE); - assert(!err); - - err = vkQueueWaitIdle(queue); - assert(!err); - } - - void createCommandBuffers() - { - drawCmdBuffers.resize(swapChain.imageCount); - - VkCommandBufferAllocateInfo cmdBufAllocateInfo = - vkTools::initializers::commandBufferAllocateInfo( - cmdPool, - VK_COMMAND_BUFFER_LEVEL_PRIMARY, - drawCmdBuffers.size()); - - VkResult vkRes = vkAllocateCommandBuffers(device, &cmdBufAllocateInfo, drawCmdBuffers.data()); - assert(!vkRes); - - cmdBufAllocateInfo.commandBufferCount = 1; - - vkRes = vkAllocateCommandBuffers(device, &cmdBufAllocateInfo, &postPresentCmdBuffer); - assert(!vkRes); + VulkanExample::cleanUpVulkan(); } void prepareVertices() @@ -1059,144 +782,6 @@ struct VulkanExample vkUpdateDescriptorSets(device, writeDescriptorSets.size(), writeDescriptorSets.data(), 0, NULL); } - void setupDepthStencil() - { - VkImageCreateInfo image = {}; - image.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; - image.pNext = NULL; - image.imageType = VK_IMAGE_TYPE_2D; - image.format = VK_FORMAT_D24_UNORM_S8_UINT; - image.extent = { width, height, 1 }; - image.mipLevels = 1; - image.arrayLayers = 1; - image.samples = VK_SAMPLE_COUNT_1_BIT; - image.tiling = VK_IMAGE_TILING_OPTIMAL; - image.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT; - image.flags = 0; - - VkMemoryAllocateInfo mem_alloc = {}; - mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; - mem_alloc.pNext = NULL; - mem_alloc.allocationSize = 0; - mem_alloc.memoryTypeIndex = 0; - - VkImageViewCreateInfo depthStencilView = {}; - depthStencilView.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; - depthStencilView.pNext = NULL; - depthStencilView.viewType = VK_IMAGE_VIEW_TYPE_2D; - depthStencilView.format = VK_FORMAT_D24_UNORM_S8_UINT; - depthStencilView.flags = 0; - depthStencilView.subresourceRange = {}; - depthStencilView.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT; - depthStencilView.subresourceRange.baseMipLevel = 0; - depthStencilView.subresourceRange.levelCount = 1; - depthStencilView.subresourceRange.baseArrayLayer = 0; - depthStencilView.subresourceRange.layerCount = 1; - - VkMemoryRequirements memReqs; - VkResult err; - - err = vkCreateImage(device, &image, nullptr, &depthStencil.image); - assert(!err); - vkGetImageMemoryRequirements(device, depthStencil.image, &memReqs); - mem_alloc.allocationSize = memReqs.size; - getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, &mem_alloc.memoryTypeIndex); - err = vkAllocateMemory(device, &mem_alloc, nullptr, &depthStencil.mem); - assert(!err); - - err = vkBindImageMemory(device, depthStencil.image, depthStencil.mem, 0); - assert(!err); - vkTools::setImageLayout(setupCmdBuffer, depthStencil.image, VK_IMAGE_ASPECT_DEPTH_BIT, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL); - - depthStencilView.image = depthStencil.image; - err = vkCreateImageView(device, &depthStencilView, nullptr, &depthStencil.view); - assert(!err); - } - - void setupFrameBuffer() - { - VkImageView attachments[2]; - - // Depth/Stencil attachment is the same for all frame buffers - attachments[1] = depthStencil.view; - - VkFramebufferCreateInfo frameBufferCreateInfo = {}; - frameBufferCreateInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO; - frameBufferCreateInfo.pNext = NULL; - frameBufferCreateInfo.renderPass = renderPass; - frameBufferCreateInfo.attachmentCount = 2; - frameBufferCreateInfo.pAttachments = attachments; - frameBufferCreateInfo.width = width; - frameBufferCreateInfo.height = height; - frameBufferCreateInfo.layers = 1; - - // Create frame buffers for every swap chain image - frameBuffers.resize(swapChain.imageCount); - for (uint32_t i = 0; i < frameBuffers.size(); i++) - { - attachments[0] = swapChain.buffers[i].view; - VkResult err = vkCreateFramebuffer(device, &frameBufferCreateInfo, nullptr, &frameBuffers[i]); - assert(!err); - } - } - - void setupRenderPass() - { - VkAttachmentDescription attachments[2]; - attachments[0].format = VK_FORMAT_R8G8B8A8_UNORM; - attachments[0].samples = VK_SAMPLE_COUNT_1_BIT; - attachments[0].loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; - attachments[0].storeOp = VK_ATTACHMENT_STORE_OP_STORE; - attachments[0].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; - attachments[0].stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; - attachments[0].initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; - attachments[0].finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; - - attachments[1].format = VK_FORMAT_D24_UNORM_S8_UINT; - attachments[1].samples = VK_SAMPLE_COUNT_1_BIT; - attachments[1].loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; - attachments[1].storeOp = VK_ATTACHMENT_STORE_OP_STORE; - attachments[1].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; - attachments[1].stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; - attachments[1].initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; - attachments[1].finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; - - VkAttachmentReference colorReference = {}; - colorReference.attachment = 0; - colorReference.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; - - VkAttachmentReference depthReference = {}; - depthReference.attachment = 1; - depthReference.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; - - VkSubpassDescription subpass = {}; - subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; - subpass.flags = 0; - subpass.inputAttachmentCount = 0; - subpass.pInputAttachments = NULL; - subpass.colorAttachmentCount = 1; - subpass.pColorAttachments = &colorReference; - subpass.pResolveAttachments = NULL; - subpass.pDepthStencilAttachment = &depthReference; - subpass.preserveAttachmentCount = 0; - subpass.pPreserveAttachments = NULL; - - VkRenderPassCreateInfo renderPassInfo = {}; - renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; - renderPassInfo.pNext = NULL; - renderPassInfo.attachmentCount = 2; - renderPassInfo.pAttachments = attachments; - renderPassInfo.subpassCount = 1; - renderPassInfo.pSubpasses = &subpass; - renderPassInfo.dependencyCount = 0; - renderPassInfo.pDependencies = NULL; - - VkResult err; - - err = vkCreateRenderPass(device, &renderPassInfo, nullptr, &renderPass); - assert(!err); - } - void buildCommandBuffers() { VkCommandBufferBeginInfo cmdBufInfo = {}; @@ -1264,30 +849,6 @@ struct VulkanExample vkCmdEndRenderPass(drawCmdBuffers[i]); - // Add a present memory barrier to the end of the command buffer - // This will transform the frame buffer color attachment to a - // new layout for presenting it to the windowing system integration - VkImageMemoryBarrier prePresentBarrier = {}; - prePresentBarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; - prePresentBarrier.pNext = NULL; - prePresentBarrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; - prePresentBarrier.dstAccessMask = 0; - prePresentBarrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; - prePresentBarrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR; - prePresentBarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - prePresentBarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - prePresentBarrier.subresourceRange = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }; - prePresentBarrier.image = swapChain.buffers[i].image; - - vkCmdPipelineBarrier( - drawCmdBuffers[i], - VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, - VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, - VK_FLAGS_NONE, - 0, nullptr, - 0, nullptr, - 1, &prePresentBarrier); - err = vkEndCommandBuffer(drawCmdBuffers[i]); assert(!err); } @@ -1296,87 +857,32 @@ struct VulkanExample void draw() { VkResult err; - VkSemaphore presentCompleteSemaphore; - VkSemaphoreCreateInfo presentCompleteSemaphoreCreateInfo = {}; - presentCompleteSemaphoreCreateInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO; - presentCompleteSemaphoreCreateInfo.pNext = NULL; - - err = vkCreateSemaphore(device, &presentCompleteSemaphoreCreateInfo, nullptr, &presentCompleteSemaphore); - assert(!err); // Get next image in the swap chain (back/front buffer) - err = swapChain.acquireNextImage(presentCompleteSemaphore, ¤tBuffer); + err = swapChain.acquireNextImage(semaphores.presentComplete, ¤tBuffer); assert(!err); - // The submit infor strcuture contains a list of - // command buffers and semaphores to be submitted to a queue - // If you want to submit multiple command buffers, pass an array - VkSubmitInfo submitInfo = {}; - submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; + submitPostPresentBarrier(swapChain.buffers[currentBuffer].image); + + VkPipelineStageFlags pipelineStages = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; + VkSubmitInfo submitInfo = vkTools::initializers::submitInfo(); submitInfo.waitSemaphoreCount = 1; - submitInfo.pWaitSemaphores = &presentCompleteSemaphore; + submitInfo.pWaitSemaphores = &semaphores.presentComplete; submitInfo.commandBufferCount = 1; submitInfo.pCommandBuffers = &drawCmdBuffers[currentBuffer]; + submitInfo.pWaitDstStageMask = &pipelineStages; + submitInfo.signalSemaphoreCount = 1; + submitInfo.pSignalSemaphores = &semaphores.submitSignal; // Submit to the graphics queue err = vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE); assert(!err); + submitPrePresentBarrier(swapChain.buffers[currentBuffer].image); + // Present the current buffer to the swap chain // This will display the image - err = swapChain.queuePresent(queue, currentBuffer); - assert(!err); - - vkDestroySemaphore(device, presentCompleteSemaphore, nullptr); - - // Add a post present image memory barrier - // This will transform the frame buffer color attachment back - // to it's initial layout after it has been presented to the - // windowing system - // See buildCommandBuffers for the pre present barrier that - // does the opposite transformation - VkImageMemoryBarrier postPresentBarrier = {}; - postPresentBarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; - postPresentBarrier.pNext = NULL; - postPresentBarrier.srcAccessMask = 0; - postPresentBarrier.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; - postPresentBarrier.oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR; - postPresentBarrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; - postPresentBarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - postPresentBarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - postPresentBarrier.subresourceRange = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }; - postPresentBarrier.image = swapChain.buffers[currentBuffer].image; - - // Use dedicated command buffer from example base class for submitting the post present barrier - VkCommandBufferBeginInfo cmdBufInfo = {}; - cmdBufInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; - - err = vkBeginCommandBuffer(postPresentCmdBuffer, &cmdBufInfo); - assert(!err); - - // Put post present barrier into command buffer - vkCmdPipelineBarrier( - postPresentCmdBuffer, - VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, - VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, - VK_FLAGS_NONE, - 0, nullptr, - 0, nullptr, - 1, &postPresentBarrier); - - err = vkEndCommandBuffer(postPresentCmdBuffer); - assert(!err); - - // Submit to the queue - submitInfo = {}; - submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; - submitInfo.commandBufferCount = 1; - submitInfo.pCommandBuffers = &postPresentCmdBuffer; - - err = vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE); - assert(!err); - - err = vkQueueWaitIdle(queue); + err = swapChain.queuePresent(queue, currentBuffer, semaphores.submitSignal); assert(!err); } @@ -1463,7 +969,7 @@ void android_main(struct android_app* state) if (engine->animating) { // Update rotation - engine->state.rotation.y += 1.0f; + engine->state.rotation.y += 0.5f; if (engine->state.rotation.y > 360.0f) { engine->state.rotation.y -= 360.0f; diff --git a/android/texture/texture.NativeActivity/texture.NativeActivity.vcxproj b/android/texture/texture.NativeActivity/texture.NativeActivity.vcxproj index e4078f04..599279b9 100644 --- a/android/texture/texture.NativeActivity/texture.NativeActivity.vcxproj +++ b/android/texture/texture.NativeActivity/texture.NativeActivity.vcxproj @@ -149,7 +149,7 @@ CompileAsCpp VK_NO_PROTOTYPES;VK_USE_PLATFORM_ANDROID_KHR;__STDINT_LIMITS c++11 - ../../../external;../../../base;../../../external/gli;../../../external/glm;%(AdditionalIncludeDirectories) + ../../../external;../../../base;../../../external/gli;../../../external/glm;../../base;%(AdditionalIncludeDirectories) %(LibraryDependencies);GLESv1_CM;EGL; @@ -208,6 +208,7 @@ + diff --git a/android/texture/texture.NativeActivity/texture.NativeActivity.vcxproj.filters b/android/texture/texture.NativeActivity/texture.NativeActivity.vcxproj.filters index 923af197..f33cd39f 100644 --- a/android/texture/texture.NativeActivity/texture.NativeActivity.vcxproj.filters +++ b/android/texture/texture.NativeActivity/texture.NativeActivity.vcxproj.filters @@ -4,6 +4,7 @@ +