diff --git a/bloom/bloom.cpp b/bloom/bloom.cpp index 892fc09d..bdb2b58c 100644 --- a/bloom/bloom.cpp +++ b/bloom/bloom.cpp @@ -19,6 +19,7 @@ #include #include "vulkanexamplebase.h" +#include "vulkanbuffer.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define ENABLE_VALIDATION false @@ -59,12 +60,12 @@ public: } vertices; struct { - vkTools::UniformData vsScene; - vkTools::UniformData vsFullScreen; - vkTools::UniformData vsSkyBox; - vkTools::UniformData fsVertBlur; - vkTools::UniformData fsHorzBlur; - } uniformData; + vk::Buffer vsScene; + vk::Buffer vsFullScreen; + vk::Buffer vsSkyBox; + vk::Buffer fsVertBlur; + vk::Buffer fsHorzBlur; + } uniformBuffers; struct UBO { glm::mat4 projection; @@ -174,11 +175,11 @@ public: vkMeshLoader::freeMeshBufferResources(device, &meshes.quad); // Uniform buffers - vkTools::destroyUniformData(device, &uniformData.vsScene); - vkTools::destroyUniformData(device, &uniformData.vsFullScreen); - vkTools::destroyUniformData(device, &uniformData.vsSkyBox); - vkTools::destroyUniformData(device, &uniformData.fsVertBlur); - vkTools::destroyUniformData(device, &uniformData.fsHorzBlur); + uniformBuffers.vsScene.destroy(); + uniformBuffers.vsFullScreen.destroy(); + uniformBuffers.vsSkyBox.destroy(); + uniformBuffers.fsVertBlur.destroy(); + uniformBuffers.fsHorzBlur.destroy(); textureLoader->destroyTexture(textures.cubemap); } @@ -689,11 +690,11 @@ public: writeDescriptorSets = { // Binding 0: Vertex shader uniform buffer - vkTools::initializers::writeDescriptorSet(descriptorSets.verticalBlur, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, &uniformData.vsScene.descriptor), + vkTools::initializers::writeDescriptorSet(descriptorSets.verticalBlur, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, &uniformBuffers.vsScene.descriptor), // Binding 1: Fragment shader texture sampler vkTools::initializers::writeDescriptorSet(descriptorSets.verticalBlur, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, &offscreenPass.framebuffers[0].descriptor), // Binding 2: Fragment shader uniform buffer - vkTools::initializers::writeDescriptorSet(descriptorSets.verticalBlur, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 2, &uniformData.fsVertBlur.descriptor) + vkTools::initializers::writeDescriptorSet(descriptorSets.verticalBlur, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 2, &uniformBuffers.fsVertBlur.descriptor) }; vkUpdateDescriptorSets(device, writeDescriptorSets.size(), writeDescriptorSets.data(), 0, NULL); @@ -702,11 +703,11 @@ public: writeDescriptorSets = { // Binding 0: Vertex shader uniform buffer - vkTools::initializers::writeDescriptorSet(descriptorSets.horizontalBlur, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, &uniformData.vsScene.descriptor), + vkTools::initializers::writeDescriptorSet(descriptorSets.horizontalBlur, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, &uniformBuffers.vsScene.descriptor), // Binding 1: Fragment shader texture sampler vkTools::initializers::writeDescriptorSet(descriptorSets.horizontalBlur, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, &offscreenPass.framebuffers[1].descriptor), // Binding 2: Fragment shader uniform buffer - vkTools::initializers::writeDescriptorSet(descriptorSets.horizontalBlur, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 2, &uniformData.fsHorzBlur.descriptor) + vkTools::initializers::writeDescriptorSet(descriptorSets.horizontalBlur, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 2, &uniformBuffers.fsHorzBlur.descriptor) }; vkUpdateDescriptorSets(device, writeDescriptorSets.size(), writeDescriptorSets.data(), 0, NULL); @@ -715,7 +716,7 @@ public: writeDescriptorSets = { // Binding 0: Vertex shader uniform buffer - vkTools::initializers::writeDescriptorSet(descriptorSets.scene, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, &uniformData.vsFullScreen.descriptor) + vkTools::initializers::writeDescriptorSet(descriptorSets.scene, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, &uniformBuffers.vsFullScreen.descriptor) }; vkUpdateDescriptorSets(device, writeDescriptorSets.size(), writeDescriptorSets.data(), 0, NULL); @@ -724,7 +725,7 @@ public: writeDescriptorSets = { // Binding 0: Vertex shader uniform buffer - vkTools::initializers::writeDescriptorSet(descriptorSets.skyBox, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, &uniformData.vsSkyBox.descriptor), + vkTools::initializers::writeDescriptorSet(descriptorSets.skyBox, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, &uniformBuffers.vsSkyBox.descriptor), // Binding 1: Fragment shader texture sampler vkTools::initializers::writeDescriptorSet(descriptorSets.skyBox, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, &textures.cubemap.descriptor), }; @@ -847,54 +848,46 @@ public: void prepareUniformBuffers() { // Phong and color pass vertex shader uniform buffer - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(ubos.scene), - &ubos.scene, - &uniformData.vsScene.buffer, - &uniformData.vsScene.memory, - &uniformData.vsScene.descriptor); + &uniformBuffers.vsScene, + sizeof(ubos.scene))); // Fullscreen quad display vertex shader uniform buffer - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(ubos.fullscreen), - &ubos.fullscreen, - &uniformData.vsFullScreen.buffer, - &uniformData.vsFullScreen.memory, - &uniformData.vsFullScreen.descriptor); + &uniformBuffers.vsFullScreen, + sizeof(ubos.fullscreen))); // Fullscreen quad fragment shader uniform buffers // Vertical blur - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(ubos.vertBlur), - &ubos.vertBlur, - &uniformData.fsVertBlur.buffer, - &uniformData.fsVertBlur.memory, - &uniformData.fsVertBlur.descriptor); + &uniformBuffers.fsVertBlur, + sizeof(ubos.vertBlur))); // Horizontal blur - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(ubos.horzBlur), - &ubos.horzBlur, - &uniformData.fsHorzBlur.buffer, - &uniformData.fsHorzBlur.memory, - &uniformData.fsHorzBlur.descriptor); + &uniformBuffers.fsHorzBlur, + sizeof(ubos.horzBlur))); // Skybox - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(ubos.skyBox), - &ubos.skyBox, - &uniformData.vsSkyBox.buffer, - &uniformData.vsSkyBox.memory, - &uniformData.vsSkyBox.descriptor); + &uniformBuffers.vsSkyBox, + sizeof(ubos.skyBox))); + + // Map persistent + VK_CHECK_RESULT(uniformBuffers.vsScene.map()); + VK_CHECK_RESULT(uniformBuffers.vsFullScreen.map()); + VK_CHECK_RESULT(uniformBuffers.fsVertBlur.map()); + VK_CHECK_RESULT(uniformBuffers.fsHorzBlur.map()); + VK_CHECK_RESULT(uniformBuffers.vsSkyBox.map()); // Intialize uniform buffers updateUniformBuffersScene(); @@ -917,10 +910,7 @@ public: ubos.fullscreen.model = glm::rotate(ubos.fullscreen.model, glm::radians(timer * 360.0f), glm::vec3(0.0f, 1.0f, 0.0f)); ubos.fullscreen.model = glm::rotate(ubos.fullscreen.model, glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f)); - uint8_t *pData; - VK_CHECK_RESULT(vkMapMemory(device, uniformData.vsFullScreen.memory, 0, sizeof(ubos.fullscreen), 0, (void **)&pData)); - memcpy(pData, &ubos.fullscreen, sizeof(ubos.fullscreen)); - vkUnmapMemory(device, uniformData.vsFullScreen.memory); + memcpy(uniformBuffers.vsFullScreen.mapped, &ubos.fullscreen, sizeof(ubos.fullscreen)); // Skybox ubos.skyBox.projection = glm::perspective(glm::radians(45.0f), (float)width / (float)height, 0.1f, 256.0f); @@ -930,9 +920,7 @@ public: ubos.skyBox.model = glm::rotate(ubos.skyBox.model, glm::radians(rotation.y), glm::vec3(0.0f, 1.0f, 0.0f)); ubos.skyBox.model = glm::rotate(ubos.skyBox.model, glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f)); - VK_CHECK_RESULT(vkMapMemory(device, uniformData.vsSkyBox.memory, 0, sizeof(ubos.skyBox), 0, (void **)&pData)); - memcpy(pData, &ubos.skyBox, sizeof(ubos.skyBox)); - vkUnmapMemory(device, uniformData.vsSkyBox.memory); + memcpy(uniformBuffers.vsSkyBox.mapped, &ubos.skyBox, sizeof(ubos.skyBox)); } // Update uniform buffers for the fullscreen quad @@ -942,22 +930,15 @@ public: ubos.scene.projection = glm::ortho(0.0f, 1.0f, 0.0f, 1.0f, -1.0f, 1.0f); ubos.scene.model = glm::mat4(); - uint8_t *pData; - VK_CHECK_RESULT(vkMapMemory(device, uniformData.vsScene.memory, 0, sizeof(ubos.scene), 0, (void **)&pData)); - memcpy(pData, &ubos.scene, sizeof(ubos.scene)); - vkUnmapMemory(device, uniformData.vsScene.memory); + memcpy(uniformBuffers.vsScene.mapped, &ubos.scene, sizeof(ubos.scene)); // Fragment shader // Vertical ubos.vertBlur.horizontal = 0; - VK_CHECK_RESULT(vkMapMemory(device, uniformData.fsVertBlur.memory, 0, sizeof(ubos.vertBlur), 0, (void **)&pData)); - memcpy(pData, &ubos.vertBlur, sizeof(ubos.vertBlur)); - vkUnmapMemory(device, uniformData.fsVertBlur.memory); + memcpy(uniformBuffers.fsVertBlur.mapped, &ubos.vertBlur, sizeof(ubos.vertBlur)); // Horizontal ubos.horzBlur.horizontal = 1; - VK_CHECK_RESULT(vkMapMemory(device, uniformData.fsHorzBlur.memory, 0, sizeof(ubos.horzBlur), 0, (void **)&pData)); - memcpy(pData, &ubos.horzBlur, sizeof(ubos.horzBlur)); - vkUnmapMemory(device, uniformData.fsHorzBlur.memory); + memcpy(uniformBuffers.fsHorzBlur.mapped, &ubos.horzBlur, sizeof(ubos.horzBlur)); } void draw() diff --git a/computeshader/computeshader.cpp b/computeshader/computeshader.cpp index f267dce3..c0eee7f3 100644 --- a/computeshader/computeshader.cpp +++ b/computeshader/computeshader.cpp @@ -19,6 +19,7 @@ #include #include "vulkanexamplebase.h" +#include "vulkanbuffer.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define ENABLE_VALIDATION false @@ -68,7 +69,7 @@ public: vkMeshLoader::MeshBuffer quad; } meshes; - vkTools::UniformData uniformDataVS; + vk::Buffer uniformBufferVS; struct { glm::mat4 projection; @@ -105,7 +106,7 @@ public: vkDestroyCommandPool(device, compute.commandPool, nullptr); vkMeshLoader::freeMeshBufferResources(device, &meshes.quad); - vkTools::destroyUniformData(device, &uniformDataVS); + uniformBufferVS.destroy(); textureLoader->destroyTexture(textureColorMap); textureLoader->destroyTexture(textureComputeTarget); } @@ -439,7 +440,7 @@ public: graphics.descriptorSetPostCompute, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformDataVS.descriptor), + &uniformBufferVS.descriptor), // Binding 1 : Fragment shader texture sampler vkTools::initializers::writeDescriptorSet( graphics.descriptorSetPostCompute, @@ -458,12 +459,6 @@ public: 1); VK_CHECK_RESULT(vkAllocateDescriptorSets(device, &allocInfo, &graphics.descriptorSetPreCompute)); - - VkDescriptorImageInfo texDescriptorBaseImage = - vkTools::initializers::descriptorImageInfo( - textureColorMap.sampler, - textureColorMap.view, - VK_IMAGE_LAYOUT_GENERAL); std::vector baseImageWriteDescriptorSets = { @@ -472,13 +467,13 @@ public: graphics.descriptorSetPreCompute, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformDataVS.descriptor), + &uniformBufferVS.descriptor), // Binding 1 : Fragment shader texture sampler vkTools::initializers::writeDescriptorSet( graphics.descriptorSetPreCompute, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, - &texDescriptorBaseImage) + &textureColorMap.descriptor) }; vkUpdateDescriptorSets(device, baseImageWriteDescriptorSets.size(), baseImageWriteDescriptorSets.data(), 0, NULL); @@ -713,14 +708,14 @@ public: void prepareUniformBuffers() { // Vertex shader uniform buffer block - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(uboVS), - &uboVS, - &uniformDataVS.buffer, - &uniformDataVS.memory, - &uniformDataVS.descriptor); + &uniformBufferVS, + sizeof(uboVS))); + + // Map persistent + VK_CHECK_RESULT(uniformBufferVS.map()); updateUniformBuffers(); } @@ -736,10 +731,7 @@ public: uboVS.model = glm::rotate(uboVS.model, glm::radians(rotation.y), glm::vec3(0.0f, 1.0f, 0.0f)); uboVS.model = glm::rotate(uboVS.model, glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f)); - uint8_t *pData; - VK_CHECK_RESULT(vkMapMemory(device, uniformDataVS.memory, 0, sizeof(uboVS), 0, (void **)&pData)); - memcpy(pData, &uboVS, sizeof(uboVS)); - vkUnmapMemory(device, uniformDataVS.memory); + memcpy(uniformBufferVS.mapped, &uboVS, sizeof(uboVS)); } void draw() diff --git a/data/shaders/sphericalenvmapping/sem.frag.spv b/data/shaders/sphericalenvmapping/sem.frag.spv index b854d5d4..94ae6cd5 100644 Binary files a/data/shaders/sphericalenvmapping/sem.frag.spv and b/data/shaders/sphericalenvmapping/sem.frag.spv differ diff --git a/data/shaders/sphericalenvmapping/sem.vert.spv b/data/shaders/sphericalenvmapping/sem.vert.spv index 1a74a7de..aefb62dc 100644 Binary files a/data/shaders/sphericalenvmapping/sem.vert.spv and b/data/shaders/sphericalenvmapping/sem.vert.spv differ diff --git a/debugmarker/debugmarker.cpp b/debugmarker/debugmarker.cpp index 0e0d3011..14bedc6c 100644 --- a/debugmarker/debugmarker.cpp +++ b/debugmarker/debugmarker.cpp @@ -19,6 +19,7 @@ #include #include "vulkanexamplebase.h" +#include "vulkanbuffer.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define ENABLE_VALIDATION false @@ -184,11 +185,9 @@ public: Scene scene, sceneGlow; - struct { - vkTools::UniformData vsScene; - } uniformData; + vk::Buffer uniformBuffer; - struct { + struct UBOVS { glm::mat4 projection; glm::mat4 model; glm::vec4 lightPos = glm::vec4(0.0f, 5.0f, 15.0f, 1.0f); @@ -228,7 +227,7 @@ public: } offscreenPass; // Random tag data - struct { + struct DemoTag { const char name[17] = "debug marker tag"; } demoTag; @@ -241,6 +240,9 @@ public: cameraPos = { 0.1f, 1.1f, 0.0f }; enableTextOverlay = true; title = "Vulkan Example - VK_EXT_debug_marker"; + // Enable required device features + enabledFeatures.fillModeNonSolid = VK_TRUE; + enabledFeatures.wideLines = VK_TRUE; } ~VulkanExample() @@ -265,7 +267,7 @@ public: vkDestroyBuffer(device, sceneGlow.indices.buf, nullptr); vkFreeMemory(device, sceneGlow.indices.mem, nullptr); - vkTools::destroyUniformData(device, &uniformData.vsScene); + uniformBuffer.destroy(); // Offscreen // Color attachment @@ -900,7 +902,7 @@ public: descriptorSets.scene, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformData.vsScene.descriptor), + &uniformBuffer.descriptor), // Binding 1 : Color map vkTools::initializers::writeDescriptorSet( descriptorSets.scene, @@ -1037,19 +1039,20 @@ public: void prepareUniformBuffers() { // Vertex shader uniform buffer block - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(uboVS), - &uboVS, - &uniformData.vsScene.buffer, - &uniformData.vsScene.memory, - &uniformData.vsScene.descriptor); + &uniformBuffer, + sizeof(uboVS))); + + // Map persistent + VK_CHECK_RESULT(uniformBuffer.map()); + // Name uniform buffer for debugging - DebugMarker::setObjectName(device, (uint64_t)uniformData.vsScene.buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, "Scene uniform buffer block"); + DebugMarker::setObjectName(device, (uint64_t)uniformBuffer.buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, "Scene uniform buffer block"); // Add some random tag - DebugMarker::setObjectTag(device, (uint64_t)uniformData.vsScene.buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, 0, sizeof(demoTag), &demoTag); + DebugMarker::setObjectTag(device, (uint64_t)uniformBuffer.buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, 0, sizeof(demoTag), &demoTag); updateUniformBuffers(); } @@ -1064,10 +1067,7 @@ public: uboVS.model = glm::rotate(uboVS.model, glm::radians(rotation.y), glm::vec3(0.0f, 1.0f, 0.0f)); uboVS.model = glm::rotate(uboVS.model, glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f)); - uint8_t *pData; - VK_CHECK_RESULT(vkMapMemory(device, uniformData.vsScene.memory, 0, sizeof(uboVS), 0, (void **)&pData)); - memcpy(pData, &uboVS, sizeof(uboVS)); - vkUnmapMemory(device, uniformData.vsScene.memory); + memcpy(uniformBuffer.mapped, &uboVS, sizeof(uboVS)); } void draw() diff --git a/deferred/deferred.cpp b/deferred/deferred.cpp index 4c404962..54d81b78 100644 --- a/deferred/deferred.cpp +++ b/deferred/deferred.cpp @@ -19,6 +19,7 @@ #include #include "vulkanexamplebase.h" +#include "vulkanbuffer.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define ENABLE_VALIDATION false @@ -87,10 +88,10 @@ public: } uboFragmentLights; struct { - vkTools::UniformData vsFullScreen; - vkTools::UniformData vsOffscreen; - vkTools::UniformData fsLights; - } uniformData; + vk::Buffer vsFullScreen; + vk::Buffer vsOffscreen; + vk::Buffer fsLights; + } uniformBuffers; struct { VkPipeline deferred; @@ -194,9 +195,9 @@ public: vkMeshLoader::freeMeshBufferResources(device, &meshes.quad); // Uniform buffers - vkTools::destroyUniformData(device, &uniformData.vsOffscreen); - vkTools::destroyUniformData(device, &uniformData.vsFullScreen); - vkTools::destroyUniformData(device, &uniformData.fsLights); + uniformBuffers.vsOffscreen.destroy(); + uniformBuffers.vsFullScreen.destroy(); + uniformBuffers.fsLights.destroy(); vkFreeCommandBuffers(device, cmdPool, 1, &offScreenCmdBuffer); @@ -794,7 +795,7 @@ public: descriptorSet, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformData.vsFullScreen.descriptor), + &uniformBuffers.vsFullScreen.descriptor), // Binding 1 : Position texture target vkTools::initializers::writeDescriptorSet( descriptorSet, @@ -818,7 +819,7 @@ public: descriptorSet, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 4, - &uniformData.fsLights.descriptor), + &uniformBuffers.fsLights.descriptor), }; vkUpdateDescriptorSets(device, static_cast(writeDescriptorSets.size()), writeDescriptorSets.data(), 0, NULL); @@ -834,7 +835,7 @@ public: descriptorSets.model, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformData.vsOffscreen.descriptor), + &uniformBuffers.vsOffscreen.descriptor), // Binding 1: Color map vkTools::initializers::writeDescriptorSet( descriptorSets.model, @@ -859,7 +860,7 @@ public: descriptorSets.floor, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformData.vsOffscreen.descriptor), + &uniformBuffers.vsOffscreen.descriptor), // Binding 1: Color map vkTools::initializers::writeDescriptorSet( descriptorSets.floor, @@ -984,34 +985,30 @@ public: void prepareUniformBuffers() { // Fullscreen vertex shader - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(uboVS), - nullptr, - &uniformData.vsFullScreen.buffer, - &uniformData.vsFullScreen.memory, - &uniformData.vsFullScreen.descriptor); + &uniformBuffers.vsFullScreen, + sizeof(uboVS))); // Deferred vertex shader - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(uboOffscreenVS), - nullptr, - &uniformData.vsOffscreen.buffer, - &uniformData.vsOffscreen.memory, - &uniformData.vsOffscreen.descriptor); + &uniformBuffers.vsOffscreen, + sizeof(uboOffscreenVS))); // Deferred fragment shader - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(uboFragmentLights), - nullptr, - &uniformData.fsLights.buffer, - &uniformData.fsLights.memory, - &uniformData.fsLights.descriptor); + &uniformBuffers.fsLights, + sizeof(uboFragmentLights))); + + // Map persistent + VK_CHECK_RESULT(uniformBuffers.vsFullScreen.map()); + VK_CHECK_RESULT(uniformBuffers.vsOffscreen.map()); + VK_CHECK_RESULT(uniformBuffers.fsLights.map()); // Init some values uboOffscreenVS.instancePos[0] = glm::vec4(0.0f); @@ -1036,10 +1033,7 @@ public: } uboVS.model = glm::mat4(); - uint8_t *pData; - VK_CHECK_RESULT(vkMapMemory(device, uniformData.vsFullScreen.memory, 0, sizeof(uboVS), 0, (void **)&pData)); - memcpy(pData, &uboVS, sizeof(uboVS)); - vkUnmapMemory(device, uniformData.vsFullScreen.memory); + memcpy(uniformBuffers.vsFullScreen.mapped, &uboVS, sizeof(uboVS)); } void updateUniformBufferDeferredMatrices() @@ -1057,10 +1051,7 @@ public: uboOffscreenVS.view = camera.matrices.view; uboOffscreenVS.model = glm::mat4(); - uint8_t *pData; - VK_CHECK_RESULT(vkMapMemory(device, uniformData.vsOffscreen.memory, 0, sizeof(uboOffscreenVS), 0, (void **)&pData)); - memcpy(pData, &uboOffscreenVS, sizeof(uboOffscreenVS)); - vkUnmapMemory(device, uniformData.vsOffscreen.memory); + memcpy(uniformBuffers.vsOffscreen.mapped, &uboOffscreenVS, sizeof(uboOffscreenVS)); } // Update fragment shader light position uniform block @@ -1109,10 +1100,7 @@ public: // Current view position uboFragmentLights.viewPos = glm::vec4(camera.position, 0.0f) * glm::vec4(-1.0f, 1.0f, -1.0f, 1.0f); - uint8_t *pData; - VK_CHECK_RESULT(vkMapMemory(device, uniformData.fsLights.memory, 0, sizeof(uboFragmentLights), 0, (void **)&pData)); - memcpy(pData, &uboFragmentLights, sizeof(uboFragmentLights)); - vkUnmapMemory(device, uniformData.fsLights.memory); + memcpy(uniformBuffers.fsLights.mapped, &uboFragmentLights, sizeof(uboFragmentLights)); } void draw() @@ -1198,7 +1186,7 @@ public: { switch (keyCode) { - case KEY_F1: + case KEY_F2: case GAMEPAD_BUTTON_A: toggleDebugDisplay(); updateTextOverlay(); @@ -1209,9 +1197,9 @@ public: virtual void getOverlayText(VulkanTextOverlay *textOverlay) { #if defined(__ANDROID__) - textOverlay->addText("Press \"Button A\" to toggle debug display", 5.0f, 85.0f, VulkanTextOverlay::alignLeft); + textOverlay->addText("\"Button A\" to toggle debug display", 5.0f, 85.0f, VulkanTextOverlay::alignLeft); #else - textOverlay->addText("Press \"F1\" to toggle debug display", 5.0f, 85.0f, VulkanTextOverlay::alignLeft); + textOverlay->addText("\"F2\" to toggle debug display", 5.0f, 85.0f, VulkanTextOverlay::alignLeft); #endif // Render targets if (debugDisplay) diff --git a/deferredmultisampling/deferredmultisampling.cpp b/deferredmultisampling/deferredmultisampling.cpp index b984496e..ab69ac1f 100644 --- a/deferredmultisampling/deferredmultisampling.cpp +++ b/deferredmultisampling/deferredmultisampling.cpp @@ -19,6 +19,7 @@ #include #include "vulkanexamplebase.h" +#include "vulkanbuffer.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define ENABLE_VALIDATION false @@ -85,10 +86,10 @@ public: } uboFragmentLights; struct { - vkTools::UniformData vsFullScreen; - vkTools::UniformData vsOffscreen; - vkTools::UniformData fsLights; - } uniformData; + vk::Buffer vsFullScreen; + vk::Buffer vsOffscreen; + vk::Buffer fsLights; + } uniformBuffers; struct { VkPipeline deferred; // Deferred lighting calculation @@ -197,9 +198,9 @@ public: //vkMeshLoader::freeMeshBufferResources(device, &meshes.quad); // Uniform buffers - vkTools::destroyUniformData(device, &uniformData.vsOffscreen); - vkTools::destroyUniformData(device, &uniformData.vsFullScreen); - vkTools::destroyUniformData(device, &uniformData.fsLights); + uniformBuffers.vsOffscreen.destroy(); + uniformBuffers.vsFullScreen.destroy(); + uniformBuffers.fsLights.destroy(); vkFreeCommandBuffers(device, cmdPool, 1, &offScreenCmdBuffer); @@ -739,7 +740,7 @@ public: descriptorSet, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformData.vsFullScreen.descriptor), + &uniformBuffers.vsFullScreen.descriptor), // Binding 1 : Position texture target vkTools::initializers::writeDescriptorSet( descriptorSet, @@ -763,7 +764,7 @@ public: descriptorSet, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 4, - &uniformData.fsLights.descriptor), + &uniformBuffers.fsLights.descriptor), }; vkUpdateDescriptorSets(device, static_cast(writeDescriptorSets.size()), writeDescriptorSets.data(), 0, NULL); @@ -779,7 +780,7 @@ public: descriptorSets.model, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformData.vsOffscreen.descriptor), + &uniformBuffers.vsOffscreen.descriptor), // Binding 1: Color map vkTools::initializers::writeDescriptorSet( descriptorSets.model, @@ -804,7 +805,7 @@ public: descriptorSets.floor, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformData.vsOffscreen.descriptor), + &uniformBuffers.vsOffscreen.descriptor), // Binding 1: Color map vkTools::initializers::writeDescriptorSet( descriptorSets.floor, @@ -965,34 +966,30 @@ public: void prepareUniformBuffers() { // Fullscreen vertex shader - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(uboVS), - nullptr, - &uniformData.vsFullScreen.buffer, - &uniformData.vsFullScreen.memory, - &uniformData.vsFullScreen.descriptor); + &uniformBuffers.vsFullScreen, + sizeof(uboVS))); // Deferred vertex shader - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(uboOffscreenVS), - nullptr, - &uniformData.vsOffscreen.buffer, - &uniformData.vsOffscreen.memory, - &uniformData.vsOffscreen.descriptor); + &uniformBuffers.vsOffscreen, + sizeof(uboOffscreenVS))); // Deferred fragment shader - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(uboFragmentLights), - nullptr, - &uniformData.fsLights.buffer, - &uniformData.fsLights.memory, - &uniformData.fsLights.descriptor); + &uniformBuffers.fsLights, + sizeof(uboFragmentLights))); + + // Map persistent + VK_CHECK_RESULT(uniformBuffers.vsFullScreen.map()); + VK_CHECK_RESULT(uniformBuffers.vsOffscreen.map()); + VK_CHECK_RESULT(uniformBuffers.fsLights.map()); // Init some values uboOffscreenVS.instancePos[0] = glm::vec4(0.0f); @@ -1017,10 +1014,7 @@ public: } uboVS.model = glm::mat4(); - uint8_t *pData; - VK_CHECK_RESULT(vkMapMemory(device, uniformData.vsFullScreen.memory, 0, sizeof(uboVS), 0, (void **)&pData)); - memcpy(pData, &uboVS, sizeof(uboVS)); - vkUnmapMemory(device, uniformData.vsFullScreen.memory); + memcpy(uniformBuffers.vsFullScreen.mapped, &uboVS, sizeof(uboVS)); } void updateUniformBufferDeferredMatrices() @@ -1038,10 +1032,7 @@ public: uboOffscreenVS.view = camera.matrices.view; uboOffscreenVS.model = glm::mat4(); - uint8_t *pData; - VK_CHECK_RESULT(vkMapMemory(device, uniformData.vsOffscreen.memory, 0, sizeof(uboOffscreenVS), 0, (void **)&pData)); - memcpy(pData, &uboOffscreenVS, sizeof(uboOffscreenVS)); - vkUnmapMemory(device, uniformData.vsOffscreen.memory); + memcpy(uniformBuffers.vsOffscreen.mapped, &uboOffscreenVS, sizeof(uboOffscreenVS)); } // Update fragment shader light position uniform block @@ -1090,10 +1081,7 @@ public: // Current view position uboFragmentLights.viewPos = glm::vec4(camera.position, 0.0f) * glm::vec4(-1.0f, 1.0f, -1.0f, 1.0f); - uint8_t *pData; - VK_CHECK_RESULT(vkMapMemory(device, uniformData.fsLights.memory, 0, sizeof(uboFragmentLights), 0, (void **)&pData)); - memcpy(pData, &uboFragmentLights, sizeof(uboFragmentLights)); - vkUnmapMemory(device, uniformData.fsLights.memory); + memcpy(uniformBuffers.fsLights.mapped, &uboFragmentLights, sizeof(uboFragmentLights)); } void draw() diff --git a/deferredshadows/deferredshadows.cpp b/deferredshadows/deferredshadows.cpp index ccffbbc7..68cfb362 100644 --- a/deferredshadows/deferredshadows.cpp +++ b/deferredshadows/deferredshadows.cpp @@ -22,6 +22,7 @@ #include #include "vulkanexamplebase.h" #include "vulkanframebuffer.hpp" +#include "vulkanbuffer.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define ENABLE_VALIDATION false @@ -125,11 +126,11 @@ public: } uboFragmentLights; struct { - vkTools::UniformData vsFullScreen; - vkTools::UniformData vsOffscreen; - vkTools::UniformData fsLights; - vkTools::UniformData uboShadowGS; - } uniformData; + vk::Buffer vsFullScreen; + vk::Buffer vsOffscreen; + vk::Buffer fsLights; + vk::Buffer uboShadowGS; + } uniformBuffers; struct { VkPipeline deferred; @@ -225,10 +226,10 @@ public: vkMeshLoader::freeMeshBufferResources(device, &meshes.quad); // Uniform buffers - vkTools::destroyUniformData(device, &uniformData.vsOffscreen); - vkTools::destroyUniformData(device, &uniformData.vsFullScreen); - vkTools::destroyUniformData(device, &uniformData.fsLights); - vkTools::destroyUniformData(device, &uniformData.uboShadowGS); + uniformBuffers.vsOffscreen.destroy(); + uniformBuffers.vsFullScreen.destroy(); + uniformBuffers.fsLights.destroy(); + uniformBuffers.uboShadowGS.destroy(); vkFreeCommandBuffers(device, cmdPool, 1, &commandBuffers.deferred); @@ -695,7 +696,7 @@ public: descriptorSet, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformData.vsFullScreen.descriptor), + &uniformBuffers.vsFullScreen.descriptor), // Binding 1: World space position texture vkTools::initializers::writeDescriptorSet( descriptorSet, @@ -719,7 +720,7 @@ public: descriptorSet, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 4, - &uniformData.fsLights.descriptor), + &uniformBuffers.fsLights.descriptor), // Binding 5: Shadow map vkTools::initializers::writeDescriptorSet( descriptorSet, @@ -741,7 +742,7 @@ public: descriptorSets.model, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformData.vsOffscreen.descriptor), + &uniformBuffers.vsOffscreen.descriptor), // Binding 1: Color map vkTools::initializers::writeDescriptorSet( descriptorSets.model, @@ -766,7 +767,7 @@ public: descriptorSets.background, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformData.vsOffscreen.descriptor), + &uniformBuffers.vsOffscreen.descriptor), // Binding 1: Color map vkTools::initializers::writeDescriptorSet( descriptorSets.background, @@ -791,7 +792,7 @@ public: descriptorSets.shadow, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformData.uboShadowGS.descriptor), + &uniformBuffers.uboShadowGS.descriptor), }; vkUpdateDescriptorSets(device, static_cast(writeDescriptorSets.size()), writeDescriptorSets.data(), 0, NULL); } @@ -935,44 +936,38 @@ public: void prepareUniformBuffers() { // Fullscreen vertex shader - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(uboVS), - nullptr, - &uniformData.vsFullScreen.buffer, - &uniformData.vsFullScreen.memory, - &uniformData.vsFullScreen.descriptor); + &uniformBuffers.vsFullScreen, + sizeof(uboVS))); // Deferred vertex shader - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(uboOffscreenVS), - nullptr, - &uniformData.vsOffscreen.buffer, - &uniformData.vsOffscreen.memory, - &uniformData.vsOffscreen.descriptor); + &uniformBuffers.vsOffscreen, + sizeof(uboOffscreenVS))); // Deferred fragment shader - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(uboFragmentLights), - nullptr, - &uniformData.fsLights.buffer, - &uniformData.fsLights.memory, - &uniformData.fsLights.descriptor); + &uniformBuffers.fsLights, + sizeof(uboFragmentLights))); // Shadow map vertex shader (matrices from shadow's pov) - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(uboShadowGS), - nullptr, - &uniformData.uboShadowGS.buffer, - &uniformData.uboShadowGS.memory, - &uniformData.uboShadowGS.descriptor); + &uniformBuffers.uboShadowGS, + sizeof(uboShadowGS))); + + // Map persistent + VK_CHECK_RESULT(uniformBuffers.vsFullScreen.map()); + VK_CHECK_RESULT(uniformBuffers.vsOffscreen.map()); + VK_CHECK_RESULT(uniformBuffers.fsLights.map()); + VK_CHECK_RESULT(uniformBuffers.uboShadowGS.map()); // Init some values uboOffscreenVS.instancePos[0] = glm::vec4(0.0f); @@ -982,7 +977,6 @@ public: uboOffscreenVS.instancePos[1] = glm::vec4(-7.0f, 0.0, -4.0f, 0.0f); uboOffscreenVS.instancePos[2] = glm::vec4(4.0f, 0.0, -6.0f, 0.0f); - // Update updateUniformBuffersScreen(); updateUniformBufferDeferredMatrices(); @@ -993,11 +987,7 @@ public: { uboVS.projection = glm::ortho(0.0f, 1.0f, 0.0f, 1.0f, -1.0f, 1.0f); uboVS.model = glm::mat4(); - - uint8_t *pData; - VK_CHECK_RESULT(vkMapMemory(device, uniformData.vsFullScreen.memory, 0, sizeof(uboVS), 0, (void **)&pData)); - memcpy(pData, &uboVS, sizeof(uboVS)); - vkUnmapMemory(device, uniformData.vsFullScreen.memory); + memcpy(uniformBuffers.vsFullScreen.mapped, &uboVS, sizeof(uboVS)); } void updateUniformBufferDeferredMatrices() @@ -1005,11 +995,7 @@ public: uboOffscreenVS.projection = camera.matrices.perspective; uboOffscreenVS.view = camera.matrices.view; uboOffscreenVS.model = glm::mat4(); - - uint8_t *pData; - VK_CHECK_RESULT(vkMapMemory(device, uniformData.vsOffscreen.memory, 0, sizeof(uboOffscreenVS), 0, (void **)&pData)); - memcpy(pData, &uboOffscreenVS, sizeof(uboOffscreenVS)); - vkUnmapMemory(device, uniformData.vsOffscreen.memory); + memcpy(uniformBuffers.vsOffscreen.mapped, &uboOffscreenVS, sizeof(uboOffscreenVS)); } Light initLight(glm::vec3 pos, glm::vec3 target, glm::vec3 color) @@ -1059,15 +1045,11 @@ public: memcpy(uboShadowGS.instancePos, uboOffscreenVS.instancePos, sizeof(uboOffscreenVS.instancePos)); - VK_CHECK_RESULT(vkMapMemory(device, uniformData.uboShadowGS.memory, 0, sizeof(uboShadowGS), 0, (void **)&pData)); - memcpy(pData, &uboShadowGS, sizeof(uboShadowGS)); - vkUnmapMemory(device, uniformData.uboShadowGS.memory); + memcpy(uniformBuffers.uboShadowGS.mapped, &uboShadowGS, sizeof(uboShadowGS)); uboFragmentLights.viewPos = glm::vec4(camera.position, 0.0f) * glm::vec4(-1.0f, 1.0f, -1.0f, 1.0f);; - VK_CHECK_RESULT(vkMapMemory(device, uniformData.fsLights.memory, 0, sizeof(uboFragmentLights), 0, (void **)&pData)); - memcpy(pData, &uboFragmentLights, sizeof(uboFragmentLights)); - vkUnmapMemory(device, uniformData.fsLights.memory); + memcpy(uniformBuffers.fsLights.mapped, &uboFragmentLights, sizeof(uboFragmentLights)); } void draw() diff --git a/displacement/displacement.cpp b/displacement/displacement.cpp index 28d25b0e..3ab2d156 100644 --- a/displacement/displacement.cpp +++ b/displacement/displacement.cpp @@ -52,19 +52,21 @@ public: vkMeshLoader::MeshBuffer object; } meshes; - vkTools::UniformData uniformDataTC, uniformDataTE; - struct { + vk::Buffer tessControl, tessEval; + } uniformBuffers; + + struct UBOTessControl { float tessLevel = 64.0f; - } uboTC; + } uboTessControl; - struct { + struct UBOTessEval { glm::mat4 projection; glm::mat4 model; glm::vec4 lightPos = glm::vec4(0.0f, -1.0f, 0.0f, 0.0f); float tessAlpha = 1.0f; float tessStrength = 0.1f; - } uboTE; + } uboTessEval; struct { VkPipeline solid; @@ -105,14 +107,10 @@ public: vkDestroyPipelineLayout(device, pipelineLayout, nullptr); vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr); + uniformBuffers.tessControl.destroy(); + uniformBuffers.tessEval.destroy(); + vkMeshLoader::freeMeshBufferResources(device, &meshes.object); - - vkDestroyBuffer(device, uniformDataTC.buffer, nullptr); - vkFreeMemory(device, uniformDataTC.memory, nullptr); - - vkDestroyBuffer(device, uniformDataTE.buffer, nullptr); - vkFreeMemory(device, uniformDataTE.memory, nullptr); - textureLoader->destroyTexture(textures.colorHeightMap); } @@ -319,13 +317,13 @@ public: descriptorSet, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformDataTC.descriptor), + &uniformBuffers.tessControl.descriptor), // Binding 1 : Tessellation evaluation shader ubo vkTools::initializers::writeDescriptorSet( descriptorSet, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, - &uniformDataTE.descriptor), + &uniformBuffers.tessEval.descriptor), // Binding 2 : Color and displacement map (alpha channel) vkTools::initializers::writeDescriptorSet( descriptorSet, @@ -430,24 +428,22 @@ public: void prepareUniformBuffers() { // Tessellation evaluation shader uniform buffer - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(uboTE), - nullptr, - &uniformDataTE.buffer, - &uniformDataTE.memory, - &uniformDataTE.descriptor); + &uniformBuffers.tessEval, + sizeof(uboTessEval))); // Tessellation control shader uniform buffer - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(uboTC), - nullptr, - &uniformDataTC.buffer, - &uniformDataTC.memory, - &uniformDataTC.descriptor); + &uniformBuffers.tessControl, + sizeof(uboTessControl))); + + // Map persistent + VK_CHECK_RESULT(uniformBuffers.tessControl.map()); + VK_CHECK_RESULT(uniformBuffers.tessEval.map()); updateUniformBuffers(); } @@ -456,37 +452,33 @@ public: { // Tessellation eval glm::mat4 viewMatrix = glm::mat4(); - uboTE.projection = glm::perspective(glm::radians(45.0f), (float)(width) / (float)height, 0.1f, 256.0f); + uboTessEval.projection = glm::perspective(glm::radians(45.0f), (float)(width) / (float)height, 0.1f, 256.0f); viewMatrix = glm::translate(viewMatrix, glm::vec3(0.0f, 0.0f, zoom)); float offset = 0.5f; int uboIndex = 1; - uboTE.model = glm::mat4(); - uboTE.model = viewMatrix * glm::translate(uboTE.model, glm::vec3(0, 0, 0)); - uboTE.model = glm::rotate(uboTE.model, glm::radians(rotation.x), glm::vec3(1.0f, 0.0f, 0.0f)); - uboTE.model = glm::rotate(uboTE.model, glm::radians(rotation.y), glm::vec3(0.0f, 1.0f, 0.0f)); - uboTE.model = glm::rotate(uboTE.model, glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f)); + uboTessEval.model = glm::mat4(); + uboTessEval.model = viewMatrix * glm::translate(uboTessEval.model, glm::vec3(0, 0, 0)); + uboTessEval.model = glm::rotate(uboTessEval.model, glm::radians(rotation.x), glm::vec3(1.0f, 0.0f, 0.0f)); + uboTessEval.model = glm::rotate(uboTessEval.model, glm::radians(rotation.y), glm::vec3(0.0f, 1.0f, 0.0f)); + uboTessEval.model = glm::rotate(uboTessEval.model, glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f)); - uboTE.lightPos.y = -0.5f - uboTE.tessStrength; - uint8_t *pData; - VK_CHECK_RESULT(vkMapMemory(device, uniformDataTE.memory, 0, sizeof(uboTE), 0, (void **)&pData)); - memcpy(pData, &uboTE, sizeof(uboTE)); - vkUnmapMemory(device, uniformDataTE.memory); + uboTessEval.lightPos.y = -0.5f - uboTessEval.tessStrength; + + memcpy(uniformBuffers.tessEval.mapped, &uboTessEval, sizeof(uboTessEval)); // Tessellation control - float savedLevel = uboTC.tessLevel; + float savedLevel = uboTessControl.tessLevel; if (!displacement) { - uboTC.tessLevel = 1.0f; + uboTessControl.tessLevel = 1.0f; } - VK_CHECK_RESULT(vkMapMemory(device, uniformDataTC.memory, 0, sizeof(uboTC), 0, (void **)&pData)); - memcpy(pData, &uboTC, sizeof(uboTC)); - vkUnmapMemory(device, uniformDataTC.memory); + memcpy(uniformBuffers.tessControl.mapped, &uboTessControl, sizeof(uboTessControl)); if (!displacement) { - uboTC.tessLevel = savedLevel; + uboTessControl.tessLevel = savedLevel; } } @@ -539,16 +531,16 @@ public: void changeTessellationLevel(float delta) { - uboTC.tessLevel += delta; - uboTC.tessLevel = fmax(1.0, fmin(uboTC.tessLevel, 32.0)); + uboTessControl.tessLevel += delta; + uboTessControl.tessLevel = fmax(1.0, fmin(uboTessControl.tessLevel, 32.0)); updateUniformBuffers(); updateTextOverlay(); } void changeTessellationStrength(float delta) { - uboTE.tessStrength += delta; - uboTE.tessStrength = fmax(0.0f, fmin(uboTE.tessStrength, 1.0f)); + uboTessEval.tessStrength += delta; + uboTessEval.tessStrength = fmax(0.0f, fmin(uboTessEval.tessStrength, 1.0f)); updateUniformBuffers(); updateTextOverlay(); } @@ -592,15 +584,15 @@ public: virtual void getOverlayText(VulkanTextOverlay *textOverlay) { std::stringstream ss; - ss << std::setprecision(2) << std::fixed << uboTE.tessStrength; + ss << std::setprecision(2) << std::fixed << uboTessEval.tessStrength; #if defined(__ANDROID__) textOverlay->addText("Tessellation height: " + ss.str() + " (Buttons L1/R1)", 5.0f, 85.0f, VulkanTextOverlay::alignLeft); - textOverlay->addText("Press \"Button A\" to toggle displacement", 5.0f, 100.0f, VulkanTextOverlay::alignLeft); - textOverlay->addText("Press \"Button X\" to toggle splitscreen", 5.0f, 115.0f, VulkanTextOverlay::alignLeft); + textOverlay->addText("\"Button A\" to toggle displacement", 5.0f, 100.0f, VulkanTextOverlay::alignLeft); + textOverlay->addText("\"Button X\" to toggle splitscreen", 5.0f, 115.0f, VulkanTextOverlay::alignLeft); #else textOverlay->addText("Tessellation height: " + ss.str() + " (numpad +/-)", 5.0f, 85.0f, VulkanTextOverlay::alignLeft); - textOverlay->addText("Press \"d\" to toggle displacement", 5.0f, 100.0f, VulkanTextOverlay::alignLeft); - textOverlay->addText("Press \"s\" to toggle splitscreen", 5.0f, 115.0f, VulkanTextOverlay::alignLeft); + textOverlay->addText("\"d\" to toggle displacement", 5.0f, 100.0f, VulkanTextOverlay::alignLeft); + textOverlay->addText("\"s\" to toggle splitscreen", 5.0f, 115.0f, VulkanTextOverlay::alignLeft); #endif } }; diff --git a/distancefieldfonts/distancefieldfonts.cpp b/distancefieldfonts/distancefieldfonts.cpp index 7d1e961f..d3c65f42 100644 --- a/distancefieldfonts/distancefieldfonts.cpp +++ b/distancefieldfonts/distancefieldfonts.cpp @@ -23,6 +23,7 @@ #include #include "vulkanexamplebase.h" +#include "vulkanbuffer.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define ENABLE_VALIDATION false @@ -83,16 +84,16 @@ public: } indices; struct { - vkTools::UniformData vs; - vkTools::UniformData fs; - } uniformData; + vk::Buffer vs; + vk::Buffer fs; + } uniformBuffers; - struct { + struct UBOVS { glm::mat4 projection; glm::mat4 model; } uboVS; - struct { + struct UBOFS { glm::vec4 outlineColor = glm::vec4(1.0f, 0.0f, 0.0f, 0.0f); float outlineWidth = 0.6f; float outline = true; @@ -138,8 +139,8 @@ public: vkDestroyBuffer(device, indices.buf, nullptr); vkFreeMemory(device, indices.mem, nullptr); - vkDestroyBuffer(device, uniformData.vs.buffer, nullptr); - vkFreeMemory(device, uniformData.vs.memory, nullptr); + uniformBuffers.vs.destroy(); + uniformBuffers.fs.destroy(); } // Basic parser fpr AngelCode bitmap font format files @@ -467,7 +468,7 @@ public: descriptorSets.sdf, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformData.vs.descriptor), + &uniformBuffers.vs.descriptor), // Binding 1 : Fragment shader texture sampler vkTools::initializers::writeDescriptorSet( descriptorSets.sdf, @@ -479,7 +480,7 @@ public: descriptorSets.sdf, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 2, - &uniformData.fs.descriptor) + &uniformBuffers.fs.descriptor) }; vkUpdateDescriptorSets(device, writeDescriptorSets.size(), writeDescriptorSets.data(), 0, NULL); @@ -498,7 +499,7 @@ public: descriptorSets.bitmap, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformData.vs.descriptor), + &uniformBuffers.vs.descriptor), // Binding 1 : Fragment shader texture sampler vkTools::initializers::writeDescriptorSet( descriptorSets.bitmap, @@ -603,25 +604,22 @@ public: void prepareUniformBuffers() { // Vertex shader uniform buffer block - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(uboVS), - nullptr, - &uniformData.vs.buffer, - &uniformData.vs.memory, - &uniformData.vs.descriptor); + &uniformBuffers.vs, + sizeof(uboVS))); - // Fragment sahder uniform buffer block - // Contains font rendering parameters - createBuffer( + // Fragment sahder uniform buffer block (Contains font rendering parameters) + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(uboFS), - nullptr, - &uniformData.fs.buffer, - &uniformData.fs.memory, - &uniformData.fs.descriptor); + &uniformBuffers.fs, + sizeof(uboFS))); + + // Map persistent + VK_CHECK_RESULT(uniformBuffers.vs.map()); + VK_CHECK_RESULT(uniformBuffers.fs.map()); updateUniformBuffers(); updateFontSettings(); @@ -640,19 +638,13 @@ public: uboVS.model = glm::rotate(uboVS.model, glm::radians(rotation.y), glm::vec3(0.0f, 1.0f, 0.0f)); uboVS.model = glm::rotate(uboVS.model, glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f)); - uint8_t *pData; - VK_CHECK_RESULT(vkMapMemory(device, uniformData.vs.memory, 0, sizeof(uboVS), 0, (void **)&pData)); - memcpy(pData, &uboVS, sizeof(uboVS)); - vkUnmapMemory(device, uniformData.vs.memory); + memcpy(uniformBuffers.vs.mapped, &uboVS, sizeof(uboVS)); } void updateFontSettings() { // Fragment shader - uint8_t *pData; - VK_CHECK_RESULT(vkMapMemory(device, uniformData.fs.memory, 0, sizeof(uboFS), 0, (void **)&pData)); - memcpy(pData, &uboFS, sizeof(uboFS)); - vkUnmapMemory(device, uniformData.fs.memory); + memcpy(uniformBuffers.fs.mapped, &uboFS, sizeof(uboFS)); } void draw() @@ -731,11 +723,11 @@ public: virtual void getOverlayText(VulkanTextOverlay *textOverlay) { #if defined(__ANDROID__) - textOverlay->addText("Press \"Button A\" to toggle outline", 5.0f, 85.0f, VulkanTextOverlay::alignLeft); - textOverlay->addText("Press \"Button A\" to toggle splitscreen", 5.0f, 100.0f, VulkanTextOverlay::alignLeft); + textOverlay->addText("\"Button A\" to toggle outline", 5.0f, 85.0f, VulkanTextOverlay::alignLeft); + textOverlay->addText("\"Button X\" to toggle splitscreen", 5.0f, 100.0f, VulkanTextOverlay::alignLeft); #else - textOverlay->addText("Press \"o\" to toggle outline", 5.0f, 85.0f, VulkanTextOverlay::alignLeft); - textOverlay->addText("Press \"s\" to toggle splitscreen", 5.0f, 100.0f, VulkanTextOverlay::alignLeft); + textOverlay->addText("\"o\" to toggle outline", 5.0f, 85.0f, VulkanTextOverlay::alignLeft); + textOverlay->addText("\"s\" to toggle splitscreen", 5.0f, 100.0f, VulkanTextOverlay::alignLeft); #endif } }; diff --git a/gears/vulkangear.cpp b/gears/vulkangear.cpp index 970755f1..561c2c15 100644 --- a/gears/vulkangear.cpp +++ b/gears/vulkangear.cpp @@ -27,9 +27,7 @@ void VulkanGear::newFace(std::vector *iBuffer, int a, int b, int c) VulkanGear::~VulkanGear() { // Clean up vulkan resources - vkDestroyBuffer(vulkanDevice->logicalDevice, uniformData.buffer, nullptr); - vkFreeMemory(vulkanDevice->logicalDevice, uniformData.memory, nullptr); - + uniformBuffer.destroy(); vertexBuffer.destroy(); indexBuffer.destroy(); } @@ -290,10 +288,7 @@ void VulkanGear::updateUniformBuffer(glm::mat4 perspective, glm::vec3 rotation, ubo.lightPos.x = sin(glm::radians(timer)) * 8.0f; ubo.lightPos.z = cos(glm::radians(timer)) * 8.0f; - uint8_t *pData; - VK_CHECK_RESULT(vkMapMemory(vulkanDevice->logicalDevice, uniformData.memory, 0, sizeof(ubo), 0, (void **)&pData)); - memcpy(pData, &ubo, sizeof(ubo)); - vkUnmapMemory(vulkanDevice->logicalDevice, uniformData.memory); + memcpy(uniformBuffer.mapped, &ubo, sizeof(ubo)); } void VulkanGear::setupDescriptorSet(VkDescriptorPool pool, VkDescriptorSetLayout descriptorSetLayout) @@ -312,30 +307,18 @@ void VulkanGear::setupDescriptorSet(VkDescriptorPool pool, VkDescriptorSetLayout descriptorSet, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformData.descriptor); + &uniformBuffer.descriptor); vkUpdateDescriptorSets(vulkanDevice->logicalDevice, 1, &writeDescriptorSet, 0, NULL); } void VulkanGear::prepareUniformBuffer() { - // Vertex shader uniform buffer block - VkMemoryAllocateInfo allocInfo = vkTools::initializers::memoryAllocateInfo(); - VkMemoryRequirements memReqs; - - VkBufferCreateInfo bufferInfo = vkTools::initializers::bufferCreateInfo( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, - sizeof(ubo)); - - VK_CHECK_RESULT(vkCreateBuffer(vulkanDevice->logicalDevice, &bufferInfo, nullptr, &uniformData.buffer)); - vkGetBufferMemoryRequirements(vulkanDevice->logicalDevice, uniformData.buffer, &memReqs); - allocInfo.allocationSize = memReqs.size; - allocInfo.memoryTypeIndex = vulkanDevice->getMemoryType(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); - VK_CHECK_RESULT(vkAllocateMemory(vulkanDevice->logicalDevice, &allocInfo, nullptr, &uniformData.memory)); - VK_CHECK_RESULT(vkBindBufferMemory(vulkanDevice->logicalDevice, uniformData.buffer, uniformData.memory, 0)); - - uniformData.descriptor.buffer = uniformData.buffer; - uniformData.descriptor.offset = 0; - uniformData.descriptor.range = sizeof(ubo); - uniformData.allocSize = allocInfo.allocationSize; + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, + &uniformBuffer, + sizeof(ubo))); + // Map persistent + VK_CHECK_RESULT(uniformBuffer.map()); } diff --git a/gears/vulkangear.h b/gears/vulkangear.h index 41d1539e..8fcc4312 100644 --- a/gears/vulkangear.h +++ b/gears/vulkangear.h @@ -82,7 +82,7 @@ private: uint32_t indexCount; UBO ubo; - vkTools::UniformData uniformData; + vk::Buffer uniformBuffer; int32_t newVertex(std::vector *vBuffer, float x, float y, float z, const glm::vec3& normal); void newFace(std::vector *iBuffer, int a, int b, int c); diff --git a/geometryshader/geometryshader.cpp b/geometryshader/geometryshader.cpp index f99ad88a..750f7d91 100644 --- a/geometryshader/geometryshader.cpp +++ b/geometryshader/geometryshader.cpp @@ -57,9 +57,9 @@ public: } uboGS; struct { - vkTools::UniformData VS; - vkTools::UniformData GS; - } uniformData; + vk::Buffer VS; + vk::Buffer GS; + } uniformBuffers; struct { VkPipeline solid; @@ -93,8 +93,8 @@ public: vkMeshLoader::freeMeshBufferResources(device, &meshes.object); - vkTools::destroyUniformData(device, &uniformData.VS); - vkTools::destroyUniformData(device, &uniformData.GS); + uniformBuffers.GS.destroy(); + uniformBuffers.VS.destroy(); } void reBuildCommandBuffers() @@ -281,13 +281,13 @@ public: descriptorSet, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformData.VS.descriptor), + &uniformBuffers.VS.descriptor), // Binding 1 : Geometry shader ubo vkTools::initializers::writeDescriptorSet( descriptorSet, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, - &uniformData.GS.descriptor) + &uniformBuffers.GS.descriptor) }; vkUpdateDescriptorSets(device, writeDescriptorSets.size(), writeDescriptorSets.data(), 0, NULL); @@ -384,24 +384,22 @@ public: void prepareUniformBuffers() { // Vertex shader uniform buffer block - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(uboVS), - nullptr, - &uniformData.VS.buffer, - &uniformData.VS.memory, - &uniformData.VS.descriptor); + &uniformBuffers.VS, + sizeof(uboVS))); // Geometry shader uniform buffer block - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(uboGS), - nullptr, - &uniformData.GS.buffer, - &uniformData.GS.memory, - &uniformData.GS.descriptor); + &uniformBuffers.GS, + sizeof(uboGS))); + + // Map persistent + VK_CHECK_RESULT(uniformBuffers.VS.map()); + VK_CHECK_RESULT(uniformBuffers.GS.map()); updateUniformBuffers(); } @@ -411,23 +409,16 @@ public: // Vertex shader uboVS.projection = glm::perspective(glm::radians(60.0f), (float)width / (float)height, 0.001f, 256.0f); glm::mat4 viewMatrix = glm::translate(glm::mat4(), glm::vec3(0.0f, 0.0f, zoom)); - uboVS.model = viewMatrix * glm::translate(glm::mat4(), cameraPos); uboVS.model = glm::rotate(uboVS.model, glm::radians(rotation.x), glm::vec3(1.0f, 0.0f, 0.0f)); uboVS.model = glm::rotate(uboVS.model, glm::radians(rotation.y), glm::vec3(0.0f, 1.0f, 0.0f)); uboVS.model = glm::rotate(uboVS.model, glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f)); - - uint8_t *pData; - VK_CHECK_RESULT(vkMapMemory(device, uniformData.VS.memory, 0, sizeof(uboVS), 0, (void **)&pData)); - memcpy(pData, &uboVS, sizeof(uboVS)); - vkUnmapMemory(device, uniformData.VS.memory); + memcpy(uniformBuffers.VS.mapped, &uboVS, sizeof(uboVS)); // Geometry shader uboGS.model = uboVS.model; uboGS.projection = uboVS.projection; - VK_CHECK_RESULT(vkMapMemory(device, uniformData.GS.memory, 0, sizeof(uboGS), 0, (void **)&pData)); - memcpy(pData, &uboGS, sizeof(uboGS)); - vkUnmapMemory(device, uniformData.GS.memory); + memcpy(uniformBuffers.GS.mapped, &uboGS, sizeof(uboGS)); } void draw() diff --git a/instancing/instancing.cpp b/instancing/instancing.cpp index 1818788a..76501c0c 100644 --- a/instancing/instancing.cpp +++ b/instancing/instancing.cpp @@ -21,6 +21,7 @@ #include #include "vulkanexamplebase.h" +#include "vulkanbuffer.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define INSTANCE_BUFFER_BIND_ID 1 @@ -76,13 +77,10 @@ public: } uboVS; struct { - vkTools::UniformData vsScene; - } uniformData; - - struct { - VkPipeline solid; - } pipelines; + vk::Buffer scene; + } uniformBuffers; + VkPipeline pipeline; VkPipelineLayout pipelineLayout; VkDescriptorSet descriptorSet; VkDescriptorSetLayout descriptorSetLayout; @@ -98,14 +96,14 @@ public: ~VulkanExample() { - vkDestroyPipeline(device, pipelines.solid, nullptr); + vkDestroyPipeline(device, pipeline, nullptr); vkDestroyPipelineLayout(device, pipelineLayout, nullptr); vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr); vkDestroyBuffer(device, instanceBuffer.buffer, nullptr); vkFreeMemory(device, instanceBuffer.memory, nullptr); vkMeshLoader::freeMeshBufferResources(device, &meshes.example); - vkTools::destroyUniformData(device, &uniformData.vsScene); textureLoader->destroyTexture(textures.colorMap); + uniformBuffers.scene.destroy(); } void buildCommandBuffers() @@ -139,7 +137,7 @@ public: vkCmdSetScissor(drawCmdBuffers[i], 0, 1, &scissor); vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &descriptorSet, 0, NULL); - vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.solid); + vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline); VkDeviceSize offsets[1] = { 0 }; // Binding point 0 : Mesh vertex buffer @@ -332,12 +330,6 @@ public: VK_CHECK_RESULT(vkAllocateDescriptorSets(device, &allocInfo, &descriptorSet)); - VkDescriptorImageInfo texDescriptor = - vkTools::initializers::descriptorImageInfo( - textures.colorMap.sampler, - textures.colorMap.view, - VK_IMAGE_LAYOUT_GENERAL); - std::vector writeDescriptorSets = { // Binding 0 : Vertex shader uniform buffer @@ -345,13 +337,13 @@ public: descriptorSet, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformData.vsScene.descriptor), + &uniformBuffers.scene.descriptor), // Binding 1 : Color map vkTools::initializers::writeDescriptorSet( descriptorSet, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, - &texDescriptor) + &textures.colorMap.descriptor) }; vkUpdateDescriptorSets(device, writeDescriptorSets.size(), writeDescriptorSets.data(), 0, NULL); @@ -430,7 +422,7 @@ public: pipelineCreateInfo.stageCount = shaderStages.size(); pipelineCreateInfo.pStages = shaderStages.data(); - VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.solid)); + VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipeline)); } float rnd(float range) @@ -509,17 +501,14 @@ public: void prepareUniformBuffers() { - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(uboVS), - nullptr, - &uniformData.vsScene.buffer, - &uniformData.vsScene.memory, - &uniformData.vsScene.descriptor); + &uniformBuffers.scene, + sizeof(uboVS))); - // Map for host access - VK_CHECK_RESULT(vkMapMemory(device, uniformData.vsScene.memory, 0, sizeof(uboVS), 0, (void **)&uniformData.vsScene.mapped)); + // Map persistent + VK_CHECK_RESULT(uniformBuffers.scene.map()); updateUniformBuffer(true); } @@ -540,7 +529,7 @@ public: uboVS.time += frameTimer * 0.05f; } - memcpy(uniformData.vsScene.mapped, &uboVS, sizeof(uboVS)); + memcpy(uniformBuffers.scene.mapped, &uboVS, sizeof(uboVS)); } void draw() diff --git a/mesh/mesh.cpp b/mesh/mesh.cpp index 43d98054..466cbc9c 100644 --- a/mesh/mesh.cpp +++ b/mesh/mesh.cpp @@ -63,8 +63,8 @@ public: } mesh; struct { - vkTools::UniformData vsScene; - } uniformData; + vk::Buffer scene; + } uniformBuffers; struct { glm::mat4 projection; @@ -90,6 +90,11 @@ public: cameraPos = { 0.1f, 1.1f, 0.0f }; enableTextOverlay = true; title = "Vulkan Example - Mesh rendering"; + // Enable physical device features required for this example + // Tell the driver that we are going to use geometry shaders + enabledFeatures.tessellationShader = VK_TRUE; + // Example also uses a wireframe pipeline, enable non-solid fill modes + enabledFeatures.fillModeNonSolid = VK_TRUE; } ~VulkanExample() @@ -97,6 +102,7 @@ public: // Clean up used Vulkan resources // Note : Inherited destructor cleans up resources stored in base class vkDestroyPipeline(device, pipelines.solid, nullptr); + vkDestroyPipeline(device, pipelines.wireframe, nullptr); vkDestroyPipelineLayout(device, pipelineLayout, nullptr); vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr); @@ -109,7 +115,7 @@ public: textureLoader->destroyTexture(textures.colorMap); - vkTools::destroyUniformData(device, &uniformData.vsScene); + uniformBuffers.scene.destroy(); } void reBuildCommandBuffers() @@ -442,7 +448,7 @@ public: descriptorSet, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformData.vsScene.descriptor), + &uniformBuffers.scene.descriptor), // Binding 1 : Color map vkTools::initializers::writeDescriptorSet( descriptorSet, @@ -540,14 +546,14 @@ public: void prepareUniformBuffers() { // Vertex shader uniform buffer block - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(uboVS), - nullptr, - &uniformData.vsScene.buffer, - &uniformData.vsScene.memory, - &uniformData.vsScene.descriptor); + &uniformBuffers.scene, + sizeof(uboVS))); + + // Map persistent + VK_CHECK_RESULT(uniformBuffers.scene.map()); updateUniformBuffers(); } @@ -562,10 +568,7 @@ public: uboVS.model = glm::rotate(uboVS.model, glm::radians(rotation.y), glm::vec3(0.0f, 1.0f, 0.0f)); uboVS.model = glm::rotate(uboVS.model, glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f)); - uint8_t *pData; - VK_CHECK_RESULT(vkMapMemory(device, uniformData.vsScene.memory, 0, sizeof(uboVS), 0, (void **)&pData)); - memcpy(pData, &uboVS, sizeof(uboVS)); - vkUnmapMemory(device, uniformData.vsScene.memory); + memcpy(uniformBuffers.scene.mapped, &uboVS, sizeof(uboVS)); } void draw() diff --git a/multisampling/multisampling.cpp b/multisampling/multisampling.cpp index 90d31770..0f8d925b 100644 --- a/multisampling/multisampling.cpp +++ b/multisampling/multisampling.cpp @@ -19,6 +19,7 @@ #include #include "vulkanexamplebase.h" +#include "vulkanbuffer.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define ENABLE_VALIDATION false @@ -65,11 +66,9 @@ public: vkMeshLoader::MeshBuffer example; } meshes; - struct { - vkTools::UniformData vsScene; - } uniformData; + vk::Buffer uniformBuffer; - struct { + struct UBOVS { glm::mat4 projection; glm::mat4 model; glm::vec4 lightPos = glm::vec4(5.0f, 5.0f, 5.0f, 1.0f); @@ -115,7 +114,7 @@ public: textureLoader->destroyTexture(textures.colorMap); - vkTools::destroyUniformData(device, &uniformData.vsScene); + uniformBuffer.destroy(); } // Creates a multi sample render target (image and view) that is used to resolve @@ -539,7 +538,7 @@ public: descriptorSet, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformData.vsScene.descriptor), + &uniformBuffer.descriptor), // Binding 1 : Color map vkTools::initializers::writeDescriptorSet( descriptorSet, @@ -638,14 +637,14 @@ public: void prepareUniformBuffers() { // Vertex shader uniform buffer block - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, - VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(uboVS), - nullptr, - &uniformData.vsScene.buffer, - &uniformData.vsScene.memory, - &uniformData.vsScene.descriptor); + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, + &uniformBuffer, + sizeof(uboVS))); + + // Map persistent + VK_CHECK_RESULT(uniformBuffer.map()); updateUniformBuffers(); } @@ -665,10 +664,7 @@ public: uboVS.model = glm::rotate(uboVS.model, glm::radians(rotation.y), glm::vec3(0.0f, 1.0f, 0.0f)); uboVS.model = glm::rotate(uboVS.model, glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f)); - uint8_t *pData; - VK_CHECK_RESULT(vkMapMemory(device, uniformData.vsScene.memory, 0, sizeof(uboVS), 0, (void **)&pData)); - memcpy(pData, &uboVS, sizeof(uboVS)); - vkUnmapMemory(device, uniformData.vsScene.memory); + memcpy(uniformBuffer.mapped, &uboVS, sizeof(uboVS)); } void draw() diff --git a/occlusionquery/occlusionquery.cpp b/occlusionquery/occlusionquery.cpp index 4a576ec1..c9d98448 100644 --- a/occlusionquery/occlusionquery.cpp +++ b/occlusionquery/occlusionquery.cpp @@ -19,6 +19,7 @@ #include #include "vulkanexamplebase.h" +#include "vulkanbuffer.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define ENABLE_VALIDATION false @@ -48,12 +49,12 @@ public: } meshes; struct { - vkTools::UniformData vsScene; - vkTools::UniformData teapot; - vkTools::UniformData sphere; - } uniformData; + vk::Buffer occluder; + vk::Buffer teapot; + vk::Buffer sphere; + } uniformBuffers; - struct { + struct UBOVS { glm::mat4 projection; glm::mat4 model; glm::vec4 lightPos = glm::vec4(10.0f, 10.0f, 10.0f, 1.0f); @@ -116,9 +117,9 @@ public: vkDestroyBuffer(device, queryResult.buffer, nullptr); vkFreeMemory(device, queryResult.memory, nullptr); - vkTools::destroyUniformData(device, &uniformData.vsScene); - vkTools::destroyUniformData(device, &uniformData.sphere); - vkTools::destroyUniformData(device, &uniformData.teapot); + uniformBuffers.occluder.destroy(); + uniformBuffers.sphere.destroy(); + uniformBuffers.teapot.destroy(); vkMeshLoader::freeMeshBufferResources(device, &meshes.sphere); vkMeshLoader::freeMeshBufferResources(device, &meshes.plane); @@ -425,7 +426,7 @@ public: descriptorSet, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformData.vsScene.descriptor) + &uniformBuffers.occluder.descriptor) }; vkUpdateDescriptorSets(device, writeDescriptorSets.size(), writeDescriptorSets.data(), 0, NULL); @@ -433,13 +434,13 @@ public: // Teapot VK_CHECK_RESULT(vkAllocateDescriptorSets(device, &allocInfo, &descriptorSets.teapot)); writeDescriptorSets[0].dstSet = descriptorSets.teapot; - writeDescriptorSets[0].pBufferInfo = &uniformData.teapot.descriptor; + writeDescriptorSets[0].pBufferInfo = &uniformBuffers.teapot.descriptor; vkUpdateDescriptorSets(device, writeDescriptorSets.size(), writeDescriptorSets.data(), 0, NULL); // Sphere VK_CHECK_RESULT(vkAllocateDescriptorSets(device, &allocInfo, &descriptorSets.sphere)); writeDescriptorSets[0].dstSet = descriptorSets.sphere; - writeDescriptorSets[0].pBufferInfo = &uniformData.sphere.descriptor; + writeDescriptorSets[0].pBufferInfo = &uniformBuffers.sphere.descriptor; vkUpdateDescriptorSets(device, writeDescriptorSets.size(), writeDescriptorSets.data(), 0, NULL); } @@ -542,31 +543,30 @@ public: void prepareUniformBuffers() { // Vertex shader uniform buffer block - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, - sizeof(uboVS), - &uboVS, - &uniformData.vsScene.buffer, - &uniformData.vsScene.memory, - &uniformData.vsScene.descriptor); + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, + &uniformBuffers.occluder, + sizeof(uboVS))); // Teapot - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, - sizeof(uboVS), - &uboVS, - &uniformData.teapot.buffer, - &uniformData.teapot.memory, - &uniformData.teapot.descriptor); + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, + &uniformBuffers.teapot, + sizeof(uboVS))); // Sphere - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, - sizeof(uboVS), - &uboVS, - &uniformData.sphere.buffer, - &uniformData.sphere.memory, - &uniformData.sphere.descriptor); + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, + &uniformBuffers.sphere, + sizeof(uboVS))); + + // Map persistent + VK_CHECK_RESULT(uniformBuffers.occluder.map()); + VK_CHECK_RESULT(uniformBuffers.teapot.map()); + VK_CHECK_RESULT(uniformBuffers.sphere.map()); updateUniformBuffers(); } @@ -588,25 +588,19 @@ public: // Occluder uboVS.visible = 1.0f; - VK_CHECK_RESULT(vkMapMemory(device, uniformData.vsScene.memory, 0, sizeof(uboVS), 0, (void **)&pData)); - memcpy(pData, &uboVS, sizeof(uboVS)); - vkUnmapMemory(device, uniformData.vsScene.memory); + memcpy(uniformBuffers.occluder.mapped, &uboVS, sizeof(uboVS)); // Teapot // Toggle color depending on visibility uboVS.visible = (passedSamples[0] > 0) ? 1.0f : 0.0f; uboVS.model = viewMatrix * rotMatrix * glm::translate(glm::mat4(), glm::vec3(0.0f, 0.0f, -10.0f)); - VK_CHECK_RESULT(vkMapMemory(device, uniformData.teapot.memory, 0, sizeof(uboVS), 0, (void **)&pData)); - memcpy(pData, &uboVS, sizeof(uboVS)); - vkUnmapMemory(device, uniformData.teapot.memory); + memcpy(uniformBuffers.teapot.mapped, &uboVS, sizeof(uboVS)); // Sphere // Toggle color depending on visibility uboVS.visible = (passedSamples[1] > 0) ? 1.0f : 0.0f; uboVS.model = viewMatrix * rotMatrix * glm::translate(glm::mat4(), glm::vec3(0.0f, 0.0f, 10.0f)); - VK_CHECK_RESULT(vkMapMemory(device, uniformData.sphere.memory, 0, sizeof(uboVS), 0, (void **)&pData)); - memcpy(pData, &uboVS, sizeof(uboVS)); - vkUnmapMemory(device, uniformData.sphere.memory); + memcpy(uniformBuffers.sphere.mapped, &uboVS, sizeof(uboVS)); } void prepare() diff --git a/offscreen/offscreen.cpp b/offscreen/offscreen.cpp index e0fff1c6..e960864f 100644 --- a/offscreen/offscreen.cpp +++ b/offscreen/offscreen.cpp @@ -19,6 +19,7 @@ #include #include "vulkanexamplebase.h" +#include "vulkanbuffer.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define ENABLE_VALIDATION false @@ -58,21 +59,17 @@ public: } vertices; struct { - vkTools::UniformData vsShared; - vkTools::UniformData vsMirror; - vkTools::UniformData vsOffScreen; - vkTools::UniformData vsDebugQuad; - } uniformData; + vk::Buffer vsShared; + vk::Buffer vsMirror; + vk::Buffer vsOffScreen; + vk::Buffer vsDebugQuad; + } uniformBuffers; struct UBO { glm::mat4 projection; glm::mat4 model; glm::vec4 lightPos = glm::vec4(0.0f, 0.0f, 0.0f, 1.0f); - }; - - struct { - UBO vsShared; - } ubos; + } uboShared; struct { VkPipeline debug; @@ -170,10 +167,10 @@ public: vkMeshLoader::freeMeshBufferResources(device, &meshes.plane); // Uniform buffers - vkTools::destroyUniformData(device, &uniformData.vsShared); - vkTools::destroyUniformData(device, &uniformData.vsMirror); - vkTools::destroyUniformData(device, &uniformData.vsOffScreen); - vkTools::destroyUniformData(device, &uniformData.vsDebugQuad); + uniformBuffers.vsShared.destroy(); + uniformBuffers.vsMirror.destroy(); + uniformBuffers.vsOffScreen.destroy(); + uniformBuffers.vsDebugQuad.destroy(); vkFreeCommandBuffers(device, cmdPool, 1, &offscreenPass.commandBuffer); vkDestroySemaphore(device, offscreenPass.semaphore, nullptr); @@ -644,7 +641,7 @@ public: descriptorSets.mirror, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformData.vsMirror.descriptor), + &uniformBuffers.vsMirror.descriptor), // Binding 1 : Fragment shader texture sampler vkTools::initializers::writeDescriptorSet( descriptorSets.mirror, @@ -671,7 +668,7 @@ public: descriptorSets.debugQuad, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformData.vsDebugQuad.descriptor), + &uniformBuffers.vsDebugQuad.descriptor), // Binding 1 : Fragment shader texture sampler vkTools::initializers::writeDescriptorSet( descriptorSets.debugQuad, @@ -695,7 +692,7 @@ public: descriptorSets.model, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformData.vsShared.descriptor) + &uniformBuffers.vsShared.descriptor) }; vkUpdateDescriptorSets(device, modelWriteDescriptorSets.size(), modelWriteDescriptorSets.data(), 0, NULL); @@ -709,7 +706,7 @@ public: descriptorSets.offscreen, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformData.vsOffScreen.descriptor) + &uniformBuffers.vsOffScreen.descriptor) }; vkUpdateDescriptorSets(device, offScreenWriteDescriptorSets.size(), offScreenWriteDescriptorSets.data(), 0, NULL); } @@ -815,44 +812,38 @@ public: void prepareUniformBuffers() { // Mesh vertex shader uniform buffer block - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(ubos.vsShared), - nullptr, - &uniformData.vsShared.buffer, - &uniformData.vsShared.memory, - &uniformData.vsShared.descriptor); + &uniformBuffers.vsShared, + sizeof(uboShared))); // Mirror plane vertex shader uniform buffer block - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(ubos.vsShared), - nullptr, - &uniformData.vsMirror.buffer, - &uniformData.vsMirror.memory, - &uniformData.vsMirror.descriptor); + &uniformBuffers.vsMirror, + sizeof(uboShared))); // Offscreen vertex shader uniform buffer block - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(ubos.vsShared), - nullptr, - &uniformData.vsOffScreen.buffer, - &uniformData.vsOffScreen.memory, - &uniformData.vsOffScreen.descriptor); + &uniformBuffers.vsOffScreen, + sizeof(uboShared))); // Debug quad vertex shader uniform buffer block - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(ubos.vsShared), - nullptr, - &uniformData.vsDebugQuad.buffer, - &uniformData.vsDebugQuad.memory, - &uniformData.vsDebugQuad.descriptor); + &uniformBuffers.vsDebugQuad, + sizeof(uboShared))); + + // Map persistent + VK_CHECK_RESULT(uniformBuffers.vsShared.map()); + VK_CHECK_RESULT(uniformBuffers.vsMirror.map()); + VK_CHECK_RESULT(uniformBuffers.vsOffScreen.map()); + VK_CHECK_RESULT(uniformBuffers.vsDebugQuad.map()); updateUniformBuffers(); updateUniformBufferOffscreen(); @@ -861,57 +852,47 @@ public: void updateUniformBuffers() { // Mesh - ubos.vsShared.projection = glm::perspective(glm::radians(60.0f), (float)width / (float)height, 0.1f, 256.0f); + uboShared.projection = glm::perspective(glm::radians(60.0f), (float)width / (float)height, 0.1f, 256.0f); glm::mat4 viewMatrix = glm::translate(glm::mat4(), glm::vec3(0.0f, 0.0f, zoom)); - ubos.vsShared.model = viewMatrix * glm::translate(glm::mat4(), cameraPos); - ubos.vsShared.model = glm::rotate(ubos.vsShared.model, glm::radians(rotation.x), glm::vec3(1.0f, 0.0f, 0.0f)); - ubos.vsShared.model = glm::rotate(ubos.vsShared.model, glm::radians(rotation.y + meshRot.y), glm::vec3(0.0f, 1.0f, 0.0f)); - ubos.vsShared.model = glm::rotate(ubos.vsShared.model, glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f)); + uboShared.model = viewMatrix * glm::translate(glm::mat4(), cameraPos); + uboShared.model = glm::rotate(uboShared.model, glm::radians(rotation.x), glm::vec3(1.0f, 0.0f, 0.0f)); + uboShared.model = glm::rotate(uboShared.model, glm::radians(rotation.y + meshRot.y), glm::vec3(0.0f, 1.0f, 0.0f)); + uboShared.model = glm::rotate(uboShared.model, glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f)); - ubos.vsShared.model = glm::translate(ubos.vsShared.model, meshPos); + uboShared.model = glm::translate(uboShared.model, meshPos); - uint8_t *pData; - VK_CHECK_RESULT(vkMapMemory(device, uniformData.vsShared.memory, 0, sizeof(ubos.vsShared), 0, (void **)&pData)); - memcpy(pData, &ubos.vsShared, sizeof(ubos.vsShared)); - vkUnmapMemory(device, uniformData.vsShared.memory); + memcpy(uniformBuffers.vsShared.mapped, &uboShared, sizeof(uboShared)); // Mirror - ubos.vsShared.model = viewMatrix * glm::translate(glm::mat4(), cameraPos); - ubos.vsShared.model = glm::rotate(ubos.vsShared.model, glm::radians(rotation.x), glm::vec3(1.0f, 0.0f, 0.0f)); - ubos.vsShared.model = glm::rotate(ubos.vsShared.model, glm::radians(rotation.y), glm::vec3(0.0f, 1.0f, 0.0f)); - ubos.vsShared.model = glm::rotate(ubos.vsShared.model, glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f)); + uboShared.model = viewMatrix * glm::translate(glm::mat4(), cameraPos); + uboShared.model = glm::rotate(uboShared.model, glm::radians(rotation.x), glm::vec3(1.0f, 0.0f, 0.0f)); + uboShared.model = glm::rotate(uboShared.model, glm::radians(rotation.y), glm::vec3(0.0f, 1.0f, 0.0f)); + uboShared.model = glm::rotate(uboShared.model, glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f)); - VK_CHECK_RESULT(vkMapMemory(device, uniformData.vsMirror.memory, 0, sizeof(ubos.vsShared), 0, (void **)&pData)); - memcpy(pData, &ubos.vsShared, sizeof(ubos.vsShared)); - vkUnmapMemory(device, uniformData.vsMirror.memory); + memcpy(uniformBuffers.vsMirror.mapped, &uboShared, sizeof(uboShared)); // Debug quad - ubos.vsShared.projection = glm::ortho(4.0f, 0.0f, 0.0f, 4.0f*(float)height / (float)width, -1.0f, 1.0f); - ubos.vsShared.model = glm::translate(glm::mat4(), glm::vec3(0.0f, 0.0f, 0.0f)); + uboShared.projection = glm::ortho(4.0f, 0.0f, 0.0f, 4.0f*(float)height / (float)width, -1.0f, 1.0f); + uboShared.model = glm::translate(glm::mat4(), glm::vec3(0.0f, 0.0f, 0.0f)); - VK_CHECK_RESULT(vkMapMemory(device, uniformData.vsDebugQuad.memory, 0, sizeof(ubos.vsShared), 0, (void **)&pData)); - memcpy(pData, &ubos.vsShared, sizeof(ubos.vsShared)); - vkUnmapMemory(device, uniformData.vsDebugQuad.memory); + memcpy(uniformBuffers.vsDebugQuad.mapped, &uboShared, sizeof(uboShared)); } void updateUniformBufferOffscreen() { - ubos.vsShared.projection = glm::perspective(glm::radians(60.0f), (float)width / (float)height, 0.1f, 256.0f); + uboShared.projection = glm::perspective(glm::radians(60.0f), (float)width / (float)height, 0.1f, 256.0f); glm::mat4 viewMatrix = glm::translate(glm::mat4(), glm::vec3(0.0f, 0.0f, zoom)); - ubos.vsShared.model = viewMatrix * glm::translate(glm::mat4(), cameraPos); - ubos.vsShared.model = glm::rotate(ubos.vsShared.model, glm::radians(rotation.x), glm::vec3(1.0f, 0.0f, 0.0f)); - ubos.vsShared.model = glm::rotate(ubos.vsShared.model, glm::radians(rotation.y + meshRot.y), glm::vec3(0.0f, 1.0f, 0.0f)); - ubos.vsShared.model = glm::rotate(ubos.vsShared.model, glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f)); + uboShared.model = viewMatrix * glm::translate(glm::mat4(), cameraPos); + uboShared.model = glm::rotate(uboShared.model, glm::radians(rotation.x), glm::vec3(1.0f, 0.0f, 0.0f)); + uboShared.model = glm::rotate(uboShared.model, glm::radians(rotation.y + meshRot.y), glm::vec3(0.0f, 1.0f, 0.0f)); + uboShared.model = glm::rotate(uboShared.model, glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f)); - ubos.vsShared.model = glm::scale(ubos.vsShared.model, glm::vec3(1.0f, -1.0f, 1.0f)); - ubos.vsShared.model = glm::translate(ubos.vsShared.model, meshPos); + uboShared.model = glm::scale(uboShared.model, glm::vec3(1.0f, -1.0f, 1.0f)); + uboShared.model = glm::translate(uboShared.model, meshPos); - uint8_t *pData; - VK_CHECK_RESULT(vkMapMemory(device, uniformData.vsOffScreen.memory, 0, sizeof(ubos.vsShared), 0, (void **)&pData)); - memcpy(pData, &ubos.vsShared, sizeof(ubos.vsShared)); - vkUnmapMemory(device, uniformData.vsOffScreen.memory); + memcpy(uniformBuffers.vsOffScreen.mapped, &uboShared, sizeof(uboShared)); } void draw() diff --git a/parallaxmapping/parallaxmapping.cpp b/parallaxmapping/parallaxmapping.cpp index 65ef36cf..84c1bea9 100644 --- a/parallaxmapping/parallaxmapping.cpp +++ b/parallaxmapping/parallaxmapping.cpp @@ -20,6 +20,7 @@ #include #include "vulkanexamplebase.h" +#include "vulkanbuffer.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define ENABLE_VALIDATION false @@ -56,9 +57,9 @@ public: } meshes; struct { - vkTools::UniformData vertexShader; - vkTools::UniformData fragmentShader; - } uniformData; + vk::Buffer vertexShader; + vk::Buffer fragmentShader; + } uniformBuffers; struct { @@ -115,8 +116,8 @@ public: vkMeshLoader::freeMeshBufferResources(device, &meshes.quad); - vkTools::destroyUniformData(device, &uniformData.vertexShader); - vkTools::destroyUniformData(device, &uniformData.fragmentShader); + uniformBuffers.vertexShader.destroy(); + uniformBuffers.fragmentShader.destroy(); textureLoader->destroyTexture(textures.colorMap); textureLoader->destroyTexture(textures.normalHeightMap); @@ -332,19 +333,6 @@ public: VK_CHECK_RESULT(vkAllocateDescriptorSets(device, &allocInfo, &descriptorSet)); - // Color map image descriptor - VkDescriptorImageInfo texDescriptorColorMap = - vkTools::initializers::descriptorImageInfo( - textures.colorMap.sampler, - textures.colorMap.view, - VK_IMAGE_LAYOUT_GENERAL); - - VkDescriptorImageInfo texDescriptorNormalHeightMap = - vkTools::initializers::descriptorImageInfo( - textures.normalHeightMap.sampler, - textures.normalHeightMap.view, - VK_IMAGE_LAYOUT_GENERAL); - std::vector writeDescriptorSets = { // Binding 0 : Vertex shader uniform buffer @@ -352,25 +340,25 @@ public: descriptorSet, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformData.vertexShader.descriptor), + &uniformBuffers.vertexShader.descriptor), // Binding 1 : Fragment shader image sampler vkTools::initializers::writeDescriptorSet( descriptorSet, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, - &texDescriptorColorMap), + &textures.colorMap.descriptor), // Binding 2 : Combined normal and heightmap vkTools::initializers::writeDescriptorSet( descriptorSet, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 2, - &texDescriptorNormalHeightMap), + &textures.normalHeightMap.descriptor), // Binding 3 : Fragment shader uniform buffer vkTools::initializers::writeDescriptorSet( descriptorSet, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 3, - &uniformData.fragmentShader.descriptor) + &uniformBuffers.fragmentShader.descriptor) }; vkUpdateDescriptorSets(device, writeDescriptorSets.size(), writeDescriptorSets.data(), 0, NULL); @@ -458,25 +446,23 @@ public: void prepareUniformBuffers() { - // Vertex shader ubo - createBuffer( + // Vertex shader uniform buffer + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(ubos.vertexShader), - nullptr, - &uniformData.vertexShader.buffer, - &uniformData.vertexShader.memory, - &uniformData.vertexShader.descriptor); + &uniformBuffers.vertexShader, + sizeof(ubos.vertexShader))); - // Fragment shader ubo - createBuffer( + // Fragment shader uniform buffer + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(ubos.fragmentShader), - nullptr, - &uniformData.fragmentShader.buffer, - &uniformData.fragmentShader.memory, - &uniformData.fragmentShader.descriptor); + &uniformBuffers.fragmentShader, + sizeof(ubos.fragmentShader))); + + // Map persistent + VK_CHECK_RESULT(uniformBuffers.vertexShader.map()); + VK_CHECK_RESULT(uniformBuffers.fragmentShader.map()); updateUniformBuffers(); } @@ -504,15 +490,10 @@ public: ubos.vertexShader.cameraPos = glm::vec4(0.0, 0.0, zoom, 0.0); - uint8_t *pData; - VK_CHECK_RESULT(vkMapMemory(device, uniformData.vertexShader.memory, 0, sizeof(ubos.vertexShader), 0, (void **)&pData)); - memcpy(pData, &ubos.vertexShader, sizeof(ubos.vertexShader)); - vkUnmapMemory(device, uniformData.vertexShader.memory); + memcpy(uniformBuffers.vertexShader.mapped, &ubos.vertexShader, sizeof(ubos.vertexShader)); // Fragment shader - VK_CHECK_RESULT(vkMapMemory(device, uniformData.fragmentShader.memory, 0, sizeof(ubos.fragmentShader), 0, (void **)&pData)); - memcpy(pData, &ubos.fragmentShader, sizeof(ubos.fragmentShader)); - vkUnmapMemory(device, uniformData.fragmentShader.memory); + memcpy(uniformBuffers.fragmentShader.mapped, &ubos.fragmentShader, sizeof(ubos.fragmentShader)); } void draw() diff --git a/particlefire/particlefire.cpp b/particlefire/particlefire.cpp index 4152a845..bfcf4c88 100644 --- a/particlefire/particlefire.cpp +++ b/particlefire/particlefire.cpp @@ -20,6 +20,7 @@ #include #include "vulkanexamplebase.h" +#include "vulkanbuffer.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define ENABLE_VALIDATION false @@ -92,18 +93,18 @@ public: } particles; struct { - vkTools::UniformData fire; - vkTools::UniformData environment; - } uniformData; + vk::Buffer fire; + vk::Buffer environment; + } uniformBuffers; - struct { + struct UBOVS { glm::mat4 projection; glm::mat4 model; glm::vec2 viewportDim; float pointSize = PARTICLE_SIZE; } uboVS; - struct { + struct UBOEnv { glm::mat4 projection; glm::mat4 model; glm::mat4 normal; @@ -153,8 +154,8 @@ public: vkDestroyBuffer(device, particles.buffer, nullptr); vkFreeMemory(device, particles.memory, nullptr); - vkDestroyBuffer(device, uniformData.fire.buffer, nullptr); - vkFreeMemory(device, uniformData.fire.memory, nullptr); + uniformBuffers.environment.destroy(); + uniformBuffers.fire.destroy(); vkMeshLoader::freeMeshBufferResources(device, &meshes.environment.buffers); @@ -487,6 +488,8 @@ public: void setupDescriptorSets() { + std::vector writeDescriptorSets; + VkDescriptorSetAllocateInfo allocInfo = vkTools::initializers::descriptorSetAllocateInfo( descriptorPool, @@ -507,14 +510,13 @@ public: textures.particles.fire.view, VK_IMAGE_LAYOUT_GENERAL); - std::vector writeDescriptorSets = - { + writeDescriptorSets = { // Binding 0 : Vertex shader uniform buffer vkTools::initializers::writeDescriptorSet( descriptorSet, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformData.fire.descriptor), + &uniformBuffers.fire.descriptor), // Binding 1 : Smoke texture vkTools::initializers::writeDescriptorSet( descriptorSet, @@ -545,29 +547,26 @@ public: textures.floor.normalMap.view, VK_IMAGE_LAYOUT_GENERAL); - writeDescriptorSets.clear(); - - // Binding 0 : Vertex shader uniform buffer - writeDescriptorSets.push_back( + writeDescriptorSets = { + // Binding 0 : Vertex shader uniform buffer vkTools::initializers::writeDescriptorSet( meshes.environment.descriptorSet, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformData.environment.descriptor)); - // Binding 1 : Color map - writeDescriptorSets.push_back( + &uniformBuffers.environment.descriptor), + // Binding 1 : Color map vkTools::initializers::writeDescriptorSet( meshes.environment.descriptorSet, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, - &texDescriptorColorMap)); - // Binding 2 : Normal map - writeDescriptorSets.push_back( + &texDescriptorColorMap), + // Binding 2 : Normal map vkTools::initializers::writeDescriptorSet( meshes.environment.descriptorSet, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 2, - &texDescriptorNormalMap)); + &texDescriptorNormalMap), + }; vkUpdateDescriptorSets(device, writeDescriptorSets.size(), writeDescriptorSets.data(), 0, NULL); } @@ -675,24 +674,22 @@ public: void prepareUniformBuffers() { // Vertex shader uniform buffer block - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(uboVS), - &uboVS, - &uniformData.fire.buffer, - &uniformData.fire.memory, - &uniformData.fire.descriptor); + &uniformBuffers.fire, + sizeof(uboVS))); // Vertex shader uniform buffer block - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(uboEnv), - &uboEnv, - &uniformData.environment.buffer, - &uniformData.environment.memory, - &uniformData.environment.descriptor); + &uniformBuffers.environment, + sizeof(uboEnv))); + + // Map persistent + VK_CHECK_RESULT(uniformBuffers.fire.map()); + VK_CHECK_RESULT(uniformBuffers.environment.map()); updateUniformBuffers(); } @@ -703,10 +700,7 @@ public: uboEnv.lightPos.x = sin(timer * 2 * M_PI) * 1.5f; uboEnv.lightPos.y = 0.0f; uboEnv.lightPos.z = cos(timer * 2 * M_PI) * 1.5f; - uint8_t *pData; - VK_CHECK_RESULT(vkMapMemory(device, uniformData.environment.memory, 0, sizeof(uboEnv), 0, (void **)&pData)); - memcpy(pData, &uboEnv, sizeof(uboEnv)); - vkUnmapMemory(device, uniformData.environment.memory); + memcpy(uniformBuffers.environment.mapped, &uboEnv, sizeof(uboEnv)); } void updateUniformBuffers() @@ -723,20 +717,14 @@ public: uboVS.model = glm::rotate(uboVS.model, glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f)); uboVS.viewportDim = glm::vec2((float)width, (float)height); - - uint8_t *pData; - VK_CHECK_RESULT(vkMapMemory(device, uniformData.fire.memory, 0, sizeof(uboVS), 0, (void **)&pData)); - memcpy(pData, &uboVS, sizeof(uboVS)); - vkUnmapMemory(device, uniformData.fire.memory); + memcpy(uniformBuffers.fire.mapped, &uboVS, sizeof(uboVS)); // Environment uboEnv.projection = uboVS.projection; uboEnv.model = uboVS.model; uboEnv.normal = glm::inverseTranspose(uboEnv.model); uboEnv.cameraPos = glm::vec4(0.0, 0.0, zoom, 0.0); - VK_CHECK_RESULT(vkMapMemory(device, uniformData.environment.memory, 0, sizeof(uboEnv), 0, (void **)&pData)); - memcpy(pData, &uboEnv, sizeof(uboEnv)); - vkUnmapMemory(device, uniformData.environment.memory); + memcpy(uniformBuffers.environment.mapped, &uboEnv, sizeof(uboEnv)); } void draw() diff --git a/pipelines/pipelines.cpp b/pipelines/pipelines.cpp index a570afff..c7531d55 100644 --- a/pipelines/pipelines.cpp +++ b/pipelines/pipelines.cpp @@ -19,6 +19,7 @@ #include #include "vulkanexamplebase.h" +#include "vulkanbuffer.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define ENABLE_VALIDATION false @@ -45,10 +46,10 @@ public: vkMeshLoader::MeshBuffer cube; } meshes; - vkTools::UniformData uniformDataVS; + vk::Buffer uniformBuffer; // Same uniform buffer layout as shader - struct { + struct UBOVS { glm::mat4 projection; glm::mat4 modelView; glm::vec4 lightPos = glm::vec4(0.0f, 2.0f, 1.0f, 0.0f); @@ -67,6 +68,7 @@ public: // Device features to be enabled for this example virtual VkPhysicalDeviceFeatures getEnabledFeatures() { + //todo... VkPhysicalDeviceFeatures enabledFeatures{}; enabledFeatures.fillModeNonSolid = VK_TRUE; enabledFeatures.wideLines = VK_TRUE; @@ -79,6 +81,9 @@ public: rotation = glm::vec3(-25.0f, 15.0f, 0.0f); enableTextOverlay = true; title = "Vulkan Example - Pipeline state objects"; + // Enable features for wireframe rendering and line width setting + enabledFeatures.fillModeNonSolid = VK_TRUE; + enabledFeatures.wideLines = VK_TRUE; } ~VulkanExample() @@ -97,8 +102,7 @@ public: vkMeshLoader::freeMeshBufferResources(device, &meshes.cube); - vkDestroyBuffer(device, uniformDataVS.buffer, nullptr); - vkFreeMemory(device, uniformDataVS.memory, nullptr); + uniformBuffer.destroy(); } void buildCommandBuffers() @@ -281,7 +285,7 @@ public: descriptorSet, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformDataVS.descriptor) + &uniformBuffer.descriptor) }; vkUpdateDescriptorSets(device, writeDescriptorSets.size(), writeDescriptorSets.data(), 0, NULL); @@ -398,14 +402,14 @@ public: void prepareUniformBuffers() { // Create the vertex shader uniform buffer block - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(uboVS), - nullptr, - &uniformDataVS.buffer, - &uniformDataVS.memory, - &uniformDataVS.descriptor); + &uniformBuffer, + sizeof(uboVS))); + + // Map persistent + VK_CHECK_RESULT(uniformBuffer.map()); updateUniformBuffers(); } @@ -421,10 +425,7 @@ public: uboVS.modelView = glm::rotate(uboVS.modelView, glm::radians(rotation.y), glm::vec3(0.0f, 1.0f, 0.0f)); uboVS.modelView = glm::rotate(uboVS.modelView, glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f)); - uint8_t *pData; - VK_CHECK_RESULT(vkMapMemory(device, uniformDataVS.memory, 0, sizeof(uboVS), 0, (void **)&pData)); - memcpy(pData, &uboVS, sizeof(uboVS)); - vkUnmapMemory(device, uniformDataVS.memory); + memcpy(uniformBuffer.mapped, &uboVS, sizeof(uboVS)); } void draw() diff --git a/pushconstants/pushconstants.cpp b/pushconstants/pushconstants.cpp index 16cf4468..4254ac06 100644 --- a/pushconstants/pushconstants.cpp +++ b/pushconstants/pushconstants.cpp @@ -19,6 +19,7 @@ #include #include "vulkanexamplebase.h" +#include "vulkanbuffer.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define ENABLE_VALIDATION false @@ -45,11 +46,9 @@ public: vkMeshLoader::MeshBuffer scene; } meshes; - struct { - vkTools::UniformData vertexShader; - } uniformData; + vk::Buffer uniformBuffer; - struct { + struct UBOVS { glm::mat4 projection; glm::mat4 model; glm::vec4 lightPos = glm::vec4(0.0, 0.0, -2.0, 1.0); @@ -78,16 +77,6 @@ public: rotation = { -32.5, 45.0, 0.0 }; enableTextOverlay = true; title = "Vulkan Example - Push constants"; - - // todo : this crashes on certain Android devices, so commented out for now -#if !defined(__ANDROID__) - // Check requested push constant size against hardware limit - // Specs require 128 bytes, so if the device complies our - // push constant buffer should always fit into memory - VkPhysicalDeviceProperties deviceProps; - vkGetPhysicalDeviceProperties(physicalDevice, &deviceProps); - assert(sizeof(pushConstants) <= deviceProps.limits.maxPushConstantsSize); -#endif } ~VulkanExample() @@ -101,7 +90,7 @@ public: vkMeshLoader::freeMeshBufferResources(device, &meshes.scene); - vkTools::destroyUniformData(device, &uniformData.vertexShader); + uniformBuffer.destroy(); } void reBuildCommandBuffers() @@ -317,7 +306,7 @@ public: descriptorSet, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformData.vertexShader.descriptor); + &uniformBuffer.descriptor); vkUpdateDescriptorSets(device, 1, &writeDescriptorSet, 0, NULL); } @@ -401,14 +390,14 @@ public: void prepareUniformBuffers() { // Vertex shader uniform buffer block - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(uboVS), - nullptr, - &uniformData.vertexShader.buffer, - &uniformData.vertexShader.memory, - &uniformData.vertexShader.descriptor); + &uniformBuffer, + sizeof(uboVS))); + + // Map persistent + VK_CHECK_RESULT(uniformBuffer.map()); updateUniformBuffers(); } @@ -427,10 +416,7 @@ public: uboVS.model = glm::rotate(uboVS.model, glm::radians(rotation.y), glm::vec3(0.0f, 1.0f, 0.0f)); uboVS.model = glm::rotate(uboVS.model, glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f)); - uint8_t *pData; - VK_CHECK_RESULT(vkMapMemory(device, uniformData.vertexShader.memory, 0, sizeof(uboVS), 0, (void **)&pData)); - memcpy(pData, &uboVS, sizeof(uboVS)); - vkUnmapMemory(device, uniformData.vertexShader.memory); + memcpy(uniformBuffer.mapped, &uboVS, sizeof(uboVS)); } void draw() @@ -450,6 +436,11 @@ public: void prepare() { VulkanExampleBase::prepare(); + + // Check requested push constant size against hardware limit + // Specs require 128 bytes, so if the device complies our push constant buffer should always fit into memory + assert(sizeof(pushConstants) <= vulkanDevice->properties.limits.maxPushConstantsSize); + loadMeshes(); setupVertexDescriptions(); prepareUniformBuffers(); diff --git a/radialblur/radialblur.cpp b/radialblur/radialblur.cpp index f54995f8..98c43938 100644 --- a/radialblur/radialblur.cpp +++ b/radialblur/radialblur.cpp @@ -19,6 +19,7 @@ #include #include "vulkanexamplebase.h" +#include "vulkanbuffer.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define ENABLE_VALIDATION false @@ -57,9 +58,9 @@ public: } vertices; struct { - vkTools::UniformData scene; - vkTools::UniformData blurParams; - } uniformData; + vk::Buffer scene; + vk::Buffer blurParams; + } uniformBuffers; struct UboVS { glm::mat4 projection; @@ -158,8 +159,8 @@ public: vkMeshLoader::freeMeshBufferResources(device, &meshes.example); // Uniform buffers - vkTools::destroyUniformData(device, &uniformData.scene); - vkTools::destroyUniformData(device, &uniformData.blurParams); + uniformBuffers.scene.destroy(); + uniformBuffers.blurParams.destroy(); vkFreeCommandBuffers(device, cmdPool, 1, &offscreenPass.commandBuffer); vkDestroySemaphore(device, offscreenPass.semaphore, nullptr); @@ -589,7 +590,7 @@ public: descriptorSets.scene, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformData.scene.descriptor), + &uniformBuffers.scene.descriptor), // Binding 1: Color gradient sampler vkTools::initializers::writeDescriptorSet( descriptorSets.scene, @@ -610,7 +611,7 @@ public: descriptorSets.radialBlur, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformData.blurParams.descriptor), + &uniformBuffers.blurParams.descriptor), // Binding 0: Fragment shader texture sampler vkTools::initializers::writeDescriptorSet( descriptorSets.radialBlur, @@ -731,24 +732,23 @@ public: void prepareUniformBuffers() { // Phong and color pass vertex shader uniform buffer - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(uboScene), - &uboScene, - &uniformData.scene.buffer, - &uniformData.scene.memory, - &uniformData.scene.descriptor); + &uniformBuffers.scene, + sizeof(uboScene))); - // Fullscreen radialb blur parameters - createBuffer( + // Fullscreen radial blur parameters + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, + &uniformBuffers.blurParams, sizeof(uboBlurParams), - &uboBlurParams, - &uniformData.blurParams.buffer, - &uniformData.blurParams.memory, - &uniformData.blurParams.descriptor); + &uboBlurParams)); + + // Map persistent + VK_CHECK_RESULT(uniformBuffers.scene.map()); + VK_CHECK_RESULT(uniformBuffers.blurParams.map()); updateUniformBuffersScene(); } @@ -771,10 +771,7 @@ public: uboScene.gradientPos += frameTimer * 0.1f; } - uint8_t *pData; - VK_CHECK_RESULT(vkMapMemory(device, uniformData.scene.memory, 0, sizeof(uboScene), 0, (void **)&pData)); - memcpy(pData, &uboScene, sizeof(uboScene)); - vkUnmapMemory(device, uniformData.scene.memory); + memcpy(uniformBuffers.scene.mapped, &uboScene, sizeof(uboScene)); } void draw() diff --git a/scenerendering/scenerendering.cpp b/scenerendering/scenerendering.cpp index 006850a9..f8c7f532 100644 --- a/scenerendering/scenerendering.cpp +++ b/scenerendering/scenerendering.cpp @@ -398,8 +398,8 @@ public: // Shared ubo containing matrices used by all // materials and meshes - vkTools::UniformData uniformBuffer; - struct { + vk::Buffer uniformBuffer; + struct UniformData { glm::mat4 projection; glm::mat4 view; glm::mat4 model; @@ -441,6 +441,7 @@ public: uniformBuffer.descriptor.offset = 0; uniformBuffer.descriptor.buffer = uniformBuffer.buffer; uniformBuffer.descriptor.range = sizeof(uniformData); + uniformBuffer.device = vulkanDevice->logicalDevice; } // Default destructor @@ -459,7 +460,7 @@ public: vkDestroyPipeline(vulkanDevice->logicalDevice, pipelines.solid, nullptr); vkDestroyPipeline(vulkanDevice->logicalDevice, pipelines.blending, nullptr); vkDestroyPipeline(vulkanDevice->logicalDevice, pipelines.wireframe, nullptr); - vkTools::destroyUniformData(vulkanDevice->logicalDevice, &uniformBuffer); + uniformBuffer.destroy(); } void load(std::string filename, VkCommandBuffer copyCmd) @@ -567,6 +568,7 @@ public: camera.setRotation(glm::vec3(5.0f, 90.0f, 0.0f)); camera.setPerspective(60.0f, (float)width / (float)height, 0.1f, 256.0f); title = "Vulkan Example - Scene rendering"; + enabledFeatures.fillModeNonSolid = VK_TRUE; } ~VulkanExample() diff --git a/shadowmapping/shadowmapping.cpp b/shadowmapping/shadowmapping.cpp index 7ed9203c..97b98fa6 100644 --- a/shadowmapping/shadowmapping.cpp +++ b/shadowmapping/shadowmapping.cpp @@ -20,6 +20,7 @@ #include #include "vulkanexamplebase.h" #include "vulkanMeshLoader.hpp" +#include "vulkanbuffer.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define ENABLE_VALIDATION false @@ -78,12 +79,11 @@ public: std::vector attributeDescriptions; } vertices; - vkTools::UniformData uniformDataVS; - struct { - vkTools::UniformData scene; - vkTools::UniformData offscreen; - } uniformData; + vk::Buffer scene; + vk::Buffer offscreen; + vk::Buffer debug; + } uniformBuffers; struct { glm::mat4 projection; @@ -179,9 +179,9 @@ public: vkMeshLoader::freeMeshBufferResources(device, &meshes.quad); // Uniform buffers - vkTools::destroyUniformData(device, &uniformDataVS); - vkTools::destroyUniformData(device, &uniformData.offscreen); - vkTools::destroyUniformData(device, &uniformData.scene); + uniformBuffers.offscreen.destroy(); + uniformBuffers.scene.destroy(); + uniformBuffers.debug.destroy(); vkFreeCommandBuffers(device, cmdPool, 1, &offscreenPass.commandBuffer); vkDestroySemaphore(device, offscreenPass.semaphore, nullptr); @@ -578,6 +578,8 @@ public: void setupDescriptorSets() { + std::vector writeDescriptorSets; + // Textured quad descriptor set VkDescriptorSetAllocateInfo allocInfo = vkTools::initializers::descriptorSetAllocateInfo( @@ -594,14 +596,13 @@ public: offscreenPass.depth.view, VK_IMAGE_LAYOUT_GENERAL); - std::vector writeDescriptorSets = - { + writeDescriptorSets = { // Binding 0 : Vertex shader uniform buffer vkTools::initializers::writeDescriptorSet( descriptorSet, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformDataVS.descriptor), + &uniformBuffers.debug.descriptor), // Binding 1 : Fragment shader texture sampler vkTools::initializers::writeDescriptorSet( descriptorSet, @@ -615,16 +616,15 @@ public: // Offscreen VK_CHECK_RESULT(vkAllocateDescriptorSets(device, &allocInfo, &descriptorSets.offscreen)); - std::vector offScreenWriteDescriptorSets = - { + writeDescriptorSets = { // Binding 0 : Vertex shader uniform buffer vkTools::initializers::writeDescriptorSet( descriptorSets.offscreen, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformData.offscreen.descriptor), + &uniformBuffers.offscreen.descriptor), }; - vkUpdateDescriptorSets(device, offScreenWriteDescriptorSets.size(), offScreenWriteDescriptorSets.data(), 0, NULL); + vkUpdateDescriptorSets(device, writeDescriptorSets.size(), writeDescriptorSets.data(), 0, NULL); // 3D scene VK_CHECK_RESULT(vkAllocateDescriptorSets(device, &allocInfo, &descriptorSets.scene)); @@ -633,14 +633,13 @@ public: texDescriptor.sampler = offscreenPass.depthSampler; texDescriptor.imageView = offscreenPass.depth.view; - std::vector sceneDescriptorSets = - { + writeDescriptorSets = { // Binding 0 : Vertex shader uniform buffer vkTools::initializers::writeDescriptorSet( descriptorSets.scene, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformData.scene.descriptor), + &uniformBuffers.scene.descriptor), // Binding 1 : Fragment shader shadow sampler vkTools::initializers::writeDescriptorSet( descriptorSets.scene, @@ -648,7 +647,7 @@ public: 1, &texDescriptor) }; - vkUpdateDescriptorSets(device, sceneDescriptorSets.size(), sceneDescriptorSets.data(), 0, NULL); + vkUpdateDescriptorSets(device, writeDescriptorSets.size(), writeDescriptorSets.data(), 0, NULL); } @@ -759,34 +758,30 @@ public: void prepareUniformBuffers() { // Debug quad vertex shader uniform buffer block - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(uboVSscene), - nullptr, - &uniformDataVS.buffer, - &uniformDataVS.memory, - &uniformDataVS.descriptor); + &uniformBuffers.debug, + sizeof(uboVSscene))); // Offscreen vertex shader uniform buffer block - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(uboOffscreenVS), - nullptr, - &uniformData.offscreen.buffer, - &uniformData.offscreen.memory, - &uniformData.offscreen.descriptor); + &uniformBuffers.offscreen, + sizeof(uboOffscreenVS))); // Scene vertex shader uniform buffer block - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(uboVSscene), - nullptr, - &uniformData.scene.buffer, - &uniformData.scene.memory, - &uniformData.scene.descriptor); + &uniformBuffers.scene, + sizeof(uboVSscene))); + + // Map persistent + VK_CHECK_RESULT(uniformBuffers.debug.map()); + VK_CHECK_RESULT(uniformBuffers.offscreen.map()); + VK_CHECK_RESULT(uniformBuffers.scene.map()); updateLight(); updateUniformBufferOffscreen(); @@ -809,10 +804,7 @@ public: uboVSquad.projection = glm::ortho(2.5f / AR, 0.0f, 0.0f, 2.5f, -1.0f, 1.0f); uboVSquad.model = glm::mat4(); - uint8_t *pData; - VK_CHECK_RESULT(vkMapMemory(device, uniformDataVS.memory, 0, sizeof(uboVSquad), 0, (void **)&pData)); - memcpy(pData, &uboVSquad, sizeof(uboVSquad)); - vkUnmapMemory(device, uniformDataVS.memory); + memcpy(uniformBuffers.debug.mapped, &uboVSquad, sizeof(uboVSquad)); // 3D scene uboVSscene.projection = glm::perspective(glm::radians(45.0f), (float)width / (float)height, zNear, zFar); @@ -835,9 +827,7 @@ public: uboVSscene.depthBiasMVP = uboOffscreenVS.depthMVP; - VK_CHECK_RESULT(vkMapMemory(device, uniformData.scene.memory, 0, sizeof(uboVSscene), 0, (void **)&pData)); - memcpy(pData, &uboVSscene, sizeof(uboVSscene)); - vkUnmapMemory(device, uniformData.scene.memory); + memcpy(uniformBuffers.scene.mapped, &uboVSscene, sizeof(uboVSscene)); } void updateUniformBufferOffscreen() @@ -849,10 +839,7 @@ public: uboOffscreenVS.depthMVP = depthProjectionMatrix * depthViewMatrix * depthModelMatrix; - uint8_t *pData; - VK_CHECK_RESULT(vkMapMemory(device, uniformData.offscreen.memory, 0, sizeof(uboOffscreenVS), 0, (void **)&pData)); - memcpy(pData, &uboOffscreenVS, sizeof(uboOffscreenVS)); - vkUnmapMemory(device, uniformData.offscreen.memory); + memcpy(uniformBuffers.offscreen.mapped, &uboOffscreenVS, sizeof(uboOffscreenVS)); } void draw() @@ -954,11 +941,11 @@ public: virtual void getOverlayText(VulkanTextOverlay *textOverlay) { #if defined(__ANDROID__) - textOverlay->addText("Press \"Button A\" to toggle shadow map", 5.0f, 85.0f, VulkanTextOverlay::alignLeft); - textOverlay->addText("Press \"Button X\" to toggle light's pov", 5.0f, 100.0f, VulkanTextOverlay::alignLeft); + textOverlay->addText("\"Button A\" to toggle shadow map", 5.0f, 85.0f, VulkanTextOverlay::alignLeft); + textOverlay->addText("\"Button X\" to toggle light's pov", 5.0f, 100.0f, VulkanTextOverlay::alignLeft); #else - textOverlay->addText("Press \"s\" to toggle shadow map", 5.0f, 85.0f, VulkanTextOverlay::alignLeft); - textOverlay->addText("Press \"l\" to toggle light's pov", 5.0f, 100.0f, VulkanTextOverlay::alignLeft); + textOverlay->addText("\"s\" to toggle shadow map", 5.0f, 85.0f, VulkanTextOverlay::alignLeft); + textOverlay->addText("\"l\" to toggle light's pov", 5.0f, 100.0f, VulkanTextOverlay::alignLeft); #endif } diff --git a/shadowmappingomni/shadowmappingomni.cpp b/shadowmappingomni/shadowmappingomni.cpp index dc95bba9..906ff164 100644 --- a/shadowmappingomni/shadowmappingomni.cpp +++ b/shadowmappingomni/shadowmappingomni.cpp @@ -19,6 +19,7 @@ #include #include "vulkanexamplebase.h" +#include "vulkanbuffer.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define ENABLE_VALIDATION false @@ -60,9 +61,9 @@ public: } meshes; struct { - vkTools::UniformData scene; - vkTools::UniformData offscreen; - } uniformData; + vk::Buffer scene; + vk::Buffer offscreen; + } uniformBuffers; struct { glm::mat4 projection; @@ -71,19 +72,14 @@ public: glm::vec4 lightPos = glm::vec4(0.0f, -25.0f, 0.0f, 1.0); - struct { + struct UBO { glm::mat4 projection; glm::mat4 view; glm::mat4 model; glm::vec4 lightPos; - } uboVSscene; + }; - struct { - glm::mat4 projection; - glm::mat4 view; - glm::mat4 model; - glm::vec4 lightPos; - } uboOffscreenVS; + UBO uboVSscene, uboOffscreenVS; struct { VkPipeline scene; @@ -177,8 +173,8 @@ public: vkMeshLoader::freeMeshBufferResources(device, &meshes.skybox); // Uniform buffers - vkTools::destroyUniformData(device, &uniformData.offscreen); - vkTools::destroyUniformData(device, &uniformData.scene); + uniformBuffers.offscreen.destroy(); + uniformBuffers.scene.destroy(); vkFreeCommandBuffers(device, cmdPool, 1, &offscreenPass.commandBuffer); vkDestroySemaphore(device, offscreenPass.semaphore, nullptr); @@ -763,7 +759,7 @@ public: descriptorSets.scene, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformData.scene.descriptor), + &uniformBuffers.scene.descriptor), // Binding 1 : Fragment shader shadow sampler vkTools::initializers::writeDescriptorSet( descriptorSets.scene, @@ -783,7 +779,7 @@ public: descriptorSets.offscreen, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformData.offscreen.descriptor), + &uniformBuffers.offscreen.descriptor), }; vkUpdateDescriptorSets(device, offScreenWriteDescriptorSets.size(), offScreenWriteDescriptorSets.data(), 0, NULL); } @@ -935,25 +931,23 @@ public: // Prepare and initialize uniform buffer containing shader uniforms void prepareUniformBuffers() { - // Offscreen vertex shader uniform buffer block - createBuffer( + // Offscreen vertex shader uniform buffer + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(uboOffscreenVS), - &uboOffscreenVS, - &uniformData.offscreen.buffer, - &uniformData.offscreen.memory, - &uniformData.offscreen.descriptor); + &uniformBuffers.offscreen, + sizeof(uboOffscreenVS))); - // 3D scene - createBuffer( + // Scene vertex shader uniform buffer + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(uboVSscene), - &uboVSscene, - &uniformData.scene.buffer, - &uniformData.scene.memory, - &uniformData.scene.descriptor); + &uniformBuffers.scene, + sizeof(uboVSscene))); + + // Map persistent + VK_CHECK_RESULT(uniformBuffers.offscreen.map()); + VK_CHECK_RESULT(uniformBuffers.scene.map()); updateUniformBufferOffscreen(); updateUniformBuffers(); @@ -961,7 +955,6 @@ public: void updateUniformBuffers() { - // 3D scene uboVSscene.projection = glm::perspective(glm::radians(45.0f), (float)width / (float)height, zNear, zFar); uboVSscene.view = glm::translate(glm::mat4(), glm::vec3(0.0f, 0.0f, displayCubeMap ? 0.0f : zoom)); @@ -972,10 +965,7 @@ public: uboVSscene.lightPos = lightPos; - uint8_t *pData; - VK_CHECK_RESULT(vkMapMemory(device, uniformData.scene.memory, 0, sizeof(uboVSscene), 0, (void **)&pData)); - memcpy(pData, &uboVSscene, sizeof(uboVSscene)); - vkUnmapMemory(device, uniformData.scene.memory); + memcpy(uniformBuffers.scene.mapped, &uboVSscene, sizeof(uboVSscene)); } void updateUniformBufferOffscreen() @@ -990,10 +980,7 @@ public: uboOffscreenVS.lightPos = lightPos; - uint8_t *pData; - VK_CHECK_RESULT(vkMapMemory(device, uniformData.offscreen.memory, 0, sizeof(uboOffscreenVS), 0, (void **)&pData)); - memcpy(pData, &uboOffscreenVS, sizeof(uboOffscreenVS)); - vkUnmapMemory(device, uniformData.offscreen.memory); + memcpy(uniformBuffers.offscreen.mapped, &uboOffscreenVS, sizeof(uboOffscreenVS)); } void draw() diff --git a/sphericalenvmapping/sphericalenvmapping.cpp b/sphericalenvmapping/sphericalenvmapping.cpp index 2fffa1a0..b08eccc7 100644 --- a/sphericalenvmapping/sphericalenvmapping.cpp +++ b/sphericalenvmapping/sphericalenvmapping.cpp @@ -24,6 +24,7 @@ #include #include "vulkanexamplebase.h" +#include "vulkanbuffer.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define ENABLE_VALIDATION false @@ -54,11 +55,9 @@ public: vkTools::VulkanTexture matCapArray; } textures; - struct { - vkTools::UniformData vertexShader; - } uniformData; + vk::Buffer uniformBuffer; - struct { + struct UBOVS { glm::mat4 projection; glm::mat4 model; glm::mat4 normal; @@ -66,10 +65,7 @@ public: int32_t texIndex = 0; } uboVS; - struct { - VkPipeline sem; - } pipelines; - + VkPipeline pipeline; VkPipelineLayout pipelineLayout; VkDescriptorSet descriptorSet; VkDescriptorSetLayout descriptorSetLayout; @@ -88,14 +84,14 @@ public: { // Clean up used Vulkan resources // Note : Inherited destructor cleans up resources stored in base class - vkDestroyPipeline(device, pipelines.sem, nullptr); + vkDestroyPipeline(device, pipeline, nullptr); vkDestroyPipelineLayout(device, pipelineLayout, nullptr); vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr); vkMeshLoader::freeMeshBufferResources(device, &meshes.object); - vkTools::destroyUniformData(device, &uniformData.vertexShader); + uniformBuffer.destroy(); textureLoader->destroyTexture(textures.matCapArray); } @@ -144,7 +140,7 @@ public: vkCmdSetScissor(drawCmdBuffers[i], 0, 1, &scissor); vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &descriptorSet, 0, NULL); - vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.sem); + vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline); VkDeviceSize offsets[1] = { 0 }; vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.object.vertices.buf, offsets); @@ -271,13 +267,6 @@ public: VK_CHECK_RESULT(vkAllocateDescriptorSets(device, &allocInfo, &descriptorSet)); - // Color map image descriptor - VkDescriptorImageInfo texDescriptorColorMap = - vkTools::initializers::descriptorImageInfo( - textures.matCapArray.sampler, - textures.matCapArray.view, - VK_IMAGE_LAYOUT_GENERAL); - std::vector writeDescriptorSets = { // Binding 0 : Vertex shader uniform buffer @@ -285,13 +274,13 @@ public: descriptorSet, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformData.vertexShader.descriptor), + &uniformBuffer.descriptor), // Binding 1 : Fragment shader image sampler vkTools::initializers::writeDescriptorSet( descriptorSet, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, - &texDescriptorColorMap) + &textures.matCapArray.descriptor) }; vkUpdateDescriptorSets(device, writeDescriptorSets.size(), writeDescriptorSets.data(), 0, NULL); @@ -369,20 +358,20 @@ public: pipelineCreateInfo.stageCount = shaderStages.size(); pipelineCreateInfo.pStages = shaderStages.data(); - VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.sem)); + VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipeline)); } void prepareUniformBuffers() { // Vertex shader uniform buffer block - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(uboVS), - &uboVS, - &uniformData.vertexShader.buffer, - &uniformData.vertexShader.memory, - &uniformData.vertexShader.descriptor); + &uniformBuffer, + sizeof(uboVS))); + + // Map persistent + VK_CHECK_RESULT(uniformBuffer.map()); updateUniformBuffers(); } @@ -404,10 +393,7 @@ public: uboVS.normal = glm::inverseTranspose(uboVS.view * uboVS.model); - uint8_t *pData; - VK_CHECK_RESULT(vkMapMemory(device, uniformData.vertexShader.memory, 0, sizeof(uboVS), 0, (void **)&pData)); - memcpy(pData, &uboVS, sizeof(uboVS)); - vkUnmapMemory(device, uniformData.vertexShader.memory); + memcpy(uniformBuffer.mapped, &uboVS, sizeof(uboVS)); } void draw() @@ -467,9 +453,9 @@ public: virtual void getOverlayText(VulkanTextOverlay *textOverlay) { #if defined(__ANDROID__) - textOverlay->addText("Press \"Button A\" to toggle material cap", 5.0f, 85.0f, VulkanTextOverlay::alignLeft); + textOverlay->addText("\"Button A\" to toggle material cap", 5.0f, 85.0f, VulkanTextOverlay::alignLeft); #else - textOverlay->addText("Press \"space\" to toggle material cap", 5.0f, 85.0f, VulkanTextOverlay::alignLeft); + textOverlay->addText("\"Space\" to toggle material cap", 5.0f, 85.0f, VulkanTextOverlay::alignLeft); #endif } diff --git a/terraintessellation/terraintessellation.cpp b/terraintessellation/terraintessellation.cpp index 18fe9938..3178fc75 100644 --- a/terraintessellation/terraintessellation.cpp +++ b/terraintessellation/terraintessellation.cpp @@ -21,6 +21,7 @@ #include #include "vulkanexamplebase.h" +#include "vulkanbuffer.hpp" #include "frustum.hpp" #define VERTEX_BUFFER_BIND_ID 0 @@ -58,9 +59,9 @@ public: } meshes; struct { - vkTools::UniformData terrainTessellation; - vkTools::UniformData skysphereVertex; - } uniformData; + vk::Buffer terrainTessellation; + vk::Buffer skysphereVertex; + } uniformBuffers; // Shared values for tessellation control and evaluation stages struct { @@ -145,11 +146,8 @@ public: vkMeshLoader::freeMeshBufferResources(device, &meshes.terrain); vkMeshLoader::freeMeshBufferResources(device, &meshes.skysphere); - vkDestroyBuffer(device, uniformData.terrainTessellation.buffer, nullptr); - vkFreeMemory(device, uniformData.terrainTessellation.memory, nullptr); - - vkDestroyBuffer(device, uniformData.skysphereVertex.buffer, nullptr); - vkFreeMemory(device, uniformData.skysphereVertex.memory, nullptr); + uniformBuffers.skysphereVertex.destroy(); + uniformBuffers.terrainTessellation.destroy(); textureLoader->destroyTexture(textures.heightMap); textureLoader->destroyTexture(textures.skySphere); @@ -664,7 +662,7 @@ public: descriptorSets.terrain, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformData.terrainTessellation.descriptor), + &uniformBuffers.terrainTessellation.descriptor), // Binding 1 : Displacement map vkTools::initializers::writeDescriptorSet( descriptorSets.terrain, @@ -691,7 +689,7 @@ public: descriptorSets.skysphere, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformData.skysphereVertex.descriptor), + &uniformBuffers.skysphereVertex.descriptor), // Binding 1 : Fragment shader color map vkTools::initializers::writeDescriptorSet( descriptorSets.skysphere, @@ -808,24 +806,22 @@ public: void prepareUniformBuffers() { // Shared tessellation shader stages uniform buffer - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(uboTess), - nullptr, - &uniformData.terrainTessellation.buffer, - &uniformData.terrainTessellation.memory, - &uniformData.terrainTessellation.descriptor); + &uniformBuffers.terrainTessellation, + sizeof(uboTess))); // Skysphere vertex shader uniform buffer - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(uboVS), - nullptr, - &uniformData.skysphereVertex.buffer, - &uniformData.skysphereVertex.memory, - &uniformData.skysphereVertex.descriptor); + &uniformBuffers.skysphereVertex, + sizeof(uboVS))); + + // Map persistent + VK_CHECK_RESULT(uniformBuffers.terrainTessellation.map()); + VK_CHECK_RESULT(uniformBuffers.skysphereVertex.map()); updateUniformBuffers(); } @@ -849,10 +845,7 @@ public: uboTess.tessellationFactor = 0.0f; } - uint8_t *pData; - VK_CHECK_RESULT(vkMapMemory(device, uniformData.terrainTessellation.memory, 0, sizeof(uboTess), 0, (void **)&pData)); - memcpy(pData, &uboTess, sizeof(uboTess)); - vkUnmapMemory(device, uniformData.terrainTessellation.memory); + memcpy(uniformBuffers.terrainTessellation.mapped, &uboTess, sizeof(uboTess)); if (!tessellation) { @@ -861,10 +854,7 @@ public: // Skysphere vertex shader uboVS.mvp = camera.matrices.perspective * glm::mat4(glm::mat3(camera.matrices.view)); - - VK_CHECK_RESULT(vkMapMemory(device, uniformData.skysphereVertex.memory, 0, sizeof(uboVS), 0, (void **)&pData)); - memcpy(pData, &uboVS, sizeof(uboVS)); - vkUnmapMemory(device, uniformData.skysphereVertex.memory); + memcpy(uniformBuffers.skysphereVertex.mapped, &uboVS, sizeof(uboVS)); } void draw() diff --git a/tessellation/tessellation.cpp b/tessellation/tessellation.cpp index 3a7078ed..9d284da2 100644 --- a/tessellation/tessellation.cpp +++ b/tessellation/tessellation.cpp @@ -22,6 +22,7 @@ #include #include "vulkanexamplebase.h" +#include "vulkanbuffer.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define ENABLE_VALIDATION false @@ -52,18 +53,20 @@ public: struct { vkMeshLoader::MeshBuffer object; } meshes; + + struct { + vk::Buffer tessControl, tessEval; + } uniformBuffers; - vkTools::UniformData uniformDataTC, uniformDataTE; - - struct { + struct UBOTessControl { float tessLevel = 3.0f; - } uboTC; + } uboTessControl; - struct { + struct UBOTessEval { glm::mat4 projection; glm::mat4 model; float tessAlpha = 1.0f; - } uboTE; + } uboTessEval; struct { VkPipeline solid; @@ -78,15 +81,6 @@ public: VkDescriptorSet descriptorSet; VkDescriptorSetLayout descriptorSetLayout; - // Device features to be enabled for this example - virtual VkPhysicalDeviceFeatures getEnabledFeatures() - { - VkPhysicalDeviceFeatures enabledFeatures{}; - enabledFeatures.tessellationShader = VK_TRUE; - enabledFeatures.fillModeNonSolid = VK_TRUE; - return enabledFeatures; - } - VulkanExample() : VulkanExampleBase(ENABLE_VALIDATION) { zoom = -6.5f; @@ -115,11 +109,8 @@ public: vkMeshLoader::freeMeshBufferResources(device, &meshes.object); - vkDestroyBuffer(device, uniformDataTC.buffer, nullptr); - vkFreeMemory(device, uniformDataTC.memory, nullptr); - - vkDestroyBuffer(device, uniformDataTE.buffer, nullptr); - vkFreeMemory(device, uniformDataTE.memory, nullptr); + uniformBuffers.tessControl.destroy(); + uniformBuffers.tessEval.destroy(); textureLoader->destroyTexture(textures.colorMap); } @@ -327,13 +318,13 @@ public: descriptorSet, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformDataTC.descriptor), + &uniformBuffers.tessControl.descriptor), // Binding 1 : Tessellation evaluation shader ubo vkTools::initializers::writeDescriptorSet( descriptorSet, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, - &uniformDataTE.descriptor), + &uniformBuffers.tessEval.descriptor), // Binding 2 : Color map vkTools::initializers::writeDescriptorSet( descriptorSet, @@ -450,24 +441,22 @@ public: void prepareUniformBuffers() { // Tessellation evaluation shader uniform buffer - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(uboTE), - &uboTE, - &uniformDataTE.buffer, - &uniformDataTE.memory, - &uniformDataTE.descriptor); + &uniformBuffers.tessEval, + sizeof(uboTessEval))); // Tessellation control shader uniform buffer - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(uboTC), - &uboTC, - &uniformDataTC.buffer, - &uniformDataTC.memory, - &uniformDataTC.descriptor); + &uniformBuffers.tessControl, + sizeof(uboTessControl))); + + // Map persistent + VK_CHECK_RESULT(uniformBuffers.tessControl.map()); + VK_CHECK_RESULT(uniformBuffers.tessEval.map()); updateUniformBuffers(); } @@ -476,26 +465,22 @@ public: { // Tessellation eval glm::mat4 viewMatrix = glm::mat4(); - uboTE.projection = glm::perspective(glm::radians(45.0f), (float)(width* ((splitScreen) ? 0.5f : 1.0f)) / (float)height, 0.1f, 256.0f); + uboTessEval.projection = glm::perspective(glm::radians(45.0f), (float)(width* ((splitScreen) ? 0.5f : 1.0f)) / (float)height, 0.1f, 256.0f); viewMatrix = glm::translate(viewMatrix, glm::vec3(0.0f, 0.0f, zoom)); - uboTE.model = glm::mat4(); - uboTE.model = viewMatrix * glm::translate(uboTE.model, cameraPos); - uboTE.model = glm::rotate(uboTE.model, glm::radians(rotation.x), glm::vec3(1.0f, 0.0f, 0.0f)); - uboTE.model = glm::rotate(uboTE.model, glm::radians(rotation.y), glm::vec3(0.0f, 1.0f, 0.0f)); - uboTE.model = glm::rotate(uboTE.model, glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f)); + uboTessEval.model = glm::mat4(); + uboTessEval.model = viewMatrix * glm::translate(uboTessEval.model, cameraPos); + uboTessEval.model = glm::rotate(uboTessEval.model, glm::radians(rotation.x), glm::vec3(1.0f, 0.0f, 0.0f)); + uboTessEval.model = glm::rotate(uboTessEval.model, glm::radians(rotation.y), glm::vec3(0.0f, 1.0f, 0.0f)); + uboTessEval.model = glm::rotate(uboTessEval.model, glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f)); uint8_t *pData; - // Tessellatione evaulation uniform block - VK_CHECK_RESULT(vkMapMemory(device, uniformDataTE.memory, 0, sizeof(uboTE), 0, (void **)&pData)); - memcpy(pData, &uboTE, sizeof(uboTE)); - vkUnmapMemory(device, uniformDataTE.memory); + // Tessellation evaulation uniform block + memcpy(uniformBuffers.tessEval.mapped, &uboTessEval, sizeof(uboTessEval)); // Tessellation control uniform block - VK_CHECK_RESULT(vkMapMemory(device, uniformDataTC.memory, 0, sizeof(uboTC), 0, (void **)&pData)); - memcpy(pData, &uboTC, sizeof(uboTC)); - vkUnmapMemory(device, uniformDataTC.memory); + memcpy(uniformBuffers.tessControl.mapped, &uboTessControl, sizeof(uboTessControl)); } void draw() @@ -570,7 +555,7 @@ public: virtual void getOverlayText(VulkanTextOverlay *textOverlay) { std::stringstream ss; - ss << std::setprecision(2) << std::fixed << uboTC.tessLevel; + ss << std::setprecision(2) << std::fixed << uboTessControl.tessLevel; #if defined(__ANDROID__) textOverlay->addText("Tessellation level: " + ss.str() + " (Buttons L1/R1 to change)", 5.0f, 85.0f, VulkanTextOverlay::alignLeft); textOverlay->addText("Press \"Button X\" to toggle splitscreen", 5.0f, 100.0f, VulkanTextOverlay::alignLeft); @@ -582,9 +567,9 @@ public: void changeTessellationLevel(float delta) { - uboTC.tessLevel += delta; + uboTessControl.tessLevel += delta; // Clamp - uboTC.tessLevel = fmax(1.0f, fmin(uboTC.tessLevel, 32.0f)); + uboTessControl.tessLevel = fmax(1.0f, fmin(uboTessControl.tessLevel, 32.0f)); updateUniformBuffers(); updateTextOverlay(); } diff --git a/textoverlay/textoverlay.cpp b/textoverlay/textoverlay.cpp index 1b972269..a5ba0bef 100644 --- a/textoverlay/textoverlay.cpp +++ b/textoverlay/textoverlay.cpp @@ -24,6 +24,7 @@ #include "vulkanexamplebase.h" #include "vulkandevice.hpp" +#include "vulkanbuffer.hpp" #include "../external/stb/stb_font_consolas_24_latin1.inl" @@ -713,11 +714,9 @@ public: vkMeshLoader::MeshBuffer cube; } meshes; - struct { - vkTools::UniformData vsScene; - } uniformData; + vk::Buffer uniformBuffer; - struct { + struct UBOVS { glm::mat4 projection; glm::mat4 model; glm::vec4 lightPos = glm::vec4(0.0f, 0.0f, 0.0f, 1.0f); @@ -756,7 +755,7 @@ public: vkMeshLoader::freeMeshBufferResources(device, &meshes.cube); textureLoader->destroyTexture(textures.background); textureLoader->destroyTexture(textures.cube); - vkTools::destroyUniformData(device, &uniformData.vsScene); + uniformBuffer.destroy(); delete(textOverlay); } @@ -999,7 +998,7 @@ public: descriptorSets.background, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformData.vsScene.descriptor)); + &uniformBuffer.descriptor)); // Binding 1 : Color map writeDescriptorSets.push_back( @@ -1110,13 +1109,14 @@ public: void prepareUniformBuffers() { // Vertex shader uniform buffer block - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, - sizeof(uboVS), - &uboVS, - &uniformData.vsScene.buffer, - &uniformData.vsScene.memory, - &uniformData.vsScene.descriptor); + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, + &uniformBuffer, + sizeof(uboVS))); + + // Map persistent + VK_CHECK_RESULT(uniformBuffer.map()); updateUniformBuffers(); } @@ -1133,10 +1133,7 @@ public: uboVS.model = glm::rotate(uboVS.model, glm::radians(rotation.y), glm::vec3(0.0f, 1.0f, 0.0f)); uboVS.model = glm::rotate(uboVS.model, glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f)); - uint8_t *pData; - VK_CHECK_RESULT(vkMapMemory(device, uniformData.vsScene.memory, 0, sizeof(uboVS), 0, (void **)&pData)); - memcpy(pData, &uboVS, sizeof(uboVS)); - vkUnmapMemory(device, uniformData.vsScene.memory); + memcpy(uniformBuffer.mapped, &uboVS, sizeof(uboVS)); } void prepareTextOverlay() diff --git a/texturearray/texturearray.cpp b/texturearray/texturearray.cpp index ef86fd48..560a42c7 100644 --- a/texturearray/texturearray.cpp +++ b/texturearray/texturearray.cpp @@ -20,6 +20,7 @@ #include #include "vulkanexamplebase.h" +#include "vulkanbuffer.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define ENABLE_VALIDATION false @@ -48,9 +49,7 @@ public: vkMeshLoader::MeshBuffer quad; } meshes; - struct { - vkTools::UniformData vertexShader; - } uniformData; + vk::Buffer uniformBuffer; struct UboInstanceData { // Model matrix @@ -70,10 +69,8 @@ public: UboInstanceData *instance; } uboVS; - struct { - VkPipeline solid; - } pipelines; + VkPipeline pipeline; VkPipelineLayout pipelineLayout; VkDescriptorSet descriptorSet; VkDescriptorSetLayout descriptorSetLayout; @@ -98,14 +95,14 @@ public: vkDestroySampler(device, textureArray.sampler, nullptr); vkFreeMemory(device, textureArray.deviceMemory, nullptr); - vkDestroyPipeline(device, pipelines.solid, nullptr); + vkDestroyPipeline(device, pipeline, nullptr); vkDestroyPipelineLayout(device, pipelineLayout, nullptr); vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr); vkMeshLoader::freeMeshBufferResources(device, &meshes.quad); - vkTools::destroyUniformData(device, &uniformData.vertexShader); + uniformBuffer.destroy(); delete[] uboVS.instance; } @@ -356,7 +353,7 @@ public: VkDeviceSize offsets[1] = { 0 }; vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.quad.vertices.buf, offsets); vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.quad.indices.buf, 0, VK_INDEX_TYPE_UINT32); - vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.solid); + vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline); vkCmdDrawIndexed(drawCmdBuffers[i], meshes.quad.indexCount, layerCount, 0, 0, 0); @@ -505,7 +502,7 @@ public: descriptorSet, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformData.vertexShader.descriptor), + &uniformBuffer.descriptor), // Binding 1 : Fragment shader cubemap sampler vkTools::initializers::writeDescriptorSet( descriptorSet, @@ -590,7 +587,7 @@ public: pipelineCreateInfo.stageCount = shaderStages.size(); pipelineCreateInfo.pStages = shaderStages.data(); - VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.solid)); + VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipeline)); } void prepareUniformBuffers() @@ -600,14 +597,11 @@ public: uint32_t uboSize = sizeof(uboVS.matrices) + (layerCount * sizeof(UboInstanceData)); // Vertex shader uniform buffer block - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - uboSize, - &uboVS, - &uniformData.vertexShader.buffer, - &uniformData.vertexShader.memory, - &uniformData.vertexShader.descriptor); + &uniformBuffer, + uboSize)); // Array indices and model matrices are fixed float offset = -1.5f; @@ -626,9 +620,12 @@ public: uint8_t *pData; uint32_t dataOffset = sizeof(uboVS.matrices); uint32_t dataSize = layerCount * sizeof(UboInstanceData); - VK_CHECK_RESULT(vkMapMemory(device, uniformData.vertexShader.memory, dataOffset, dataSize, 0, (void **)&pData)); + VK_CHECK_RESULT(vkMapMemory(device, uniformBuffer.memory, dataOffset, dataSize, 0, (void **)&pData)); memcpy(pData, uboVS.instance, dataSize); - vkUnmapMemory(device, uniformData.vertexShader.memory); + vkUnmapMemory(device, uniformBuffer.memory); + + // Map persistent + VK_CHECK_RESULT(uniformBuffer.map()); updateUniformBufferMatrices(); } @@ -647,10 +644,7 @@ public: uboVS.matrices.view = glm::rotate(uboVS.matrices.view, glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f)); // Only update the matrices part of the uniform buffer - uint8_t *pData; - VK_CHECK_RESULT(vkMapMemory(device, uniformData.vertexShader.memory, 0, sizeof(uboVS.matrices), 0, (void **)&pData)); - memcpy(pData, &uboVS.matrices, sizeof(uboVS.matrices)); - vkUnmapMemory(device, uniformData.vertexShader.memory); + memcpy(uniformBuffer.mapped, &uboVS.matrices, sizeof(uboVS.matrices)); } void draw() diff --git a/texturecubemap/texturecubemap.cpp b/texturecubemap/texturecubemap.cpp index 9e6575a6..efaea310 100644 --- a/texturecubemap/texturecubemap.cpp +++ b/texturecubemap/texturecubemap.cpp @@ -21,6 +21,7 @@ #include #include "vulkanexamplebase.h" +#include "vulkanbuffer.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define ENABLE_VALIDATION false @@ -46,18 +47,18 @@ public: std::vector attributeDescriptions; } vertices; - struct { + struct Meshes { vkMeshLoader::MeshBuffer skybox; std::vector objects; uint32_t objectIndex = 0; } meshes; struct { - vkTools::UniformData objectVS; - vkTools::UniformData skyboxVS; - } uniformData; + vk::Buffer object; + vk::Buffer skybox; + } uniformBuffers; - struct { + struct UBOVS { glm::mat4 projection; glm::mat4 model; float lodBias = 0.0f; @@ -108,8 +109,8 @@ public: } vkMeshLoader::freeMeshBufferResources(device, &meshes.skybox); - vkTools::destroyUniformData(device, &uniformData.objectVS); - vkTools::destroyUniformData(device, &uniformData.skyboxVS); + uniformBuffers.object.destroy(); + uniformBuffers.skybox.destroy(); } void loadCubemap(std::string filename, VkFormat format, bool forceLinearTiling) @@ -491,7 +492,7 @@ public: descriptorSets.object, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformData.objectVS.descriptor), + &uniformBuffers.object.descriptor), // Binding 1 : Fragment shader cubemap sampler vkTools::initializers::writeDescriptorSet( descriptorSets.object, @@ -511,7 +512,7 @@ public: descriptorSets.skybox, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, - &uniformData.skyboxVS.descriptor), + &uniformBuffers.skybox.descriptor), // Binding 1 : Fragment shader cubemap sampler vkTools::initializers::writeDescriptorSet( descriptorSets.skybox, @@ -610,25 +611,23 @@ public: // Prepare and initialize uniform buffer containing shader uniforms void prepareUniformBuffers() { - // 3D objact - createBuffer( + // Objact vertex shader uniform buffer + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(uboVS), - nullptr, - &uniformData.objectVS.buffer, - &uniformData.objectVS.memory, - &uniformData.objectVS.descriptor); + &uniformBuffers.object, + sizeof(uboVS))); - // Skybox - createBuffer( + // Skybox vertex shader uniform buffer + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - sizeof(uboVS), - nullptr, - &uniformData.skyboxVS.buffer, - &uniformData.skyboxVS.memory, - &uniformData.skyboxVS.descriptor); + &uniformBuffers.skybox, + sizeof(uboVS))); + + // Map persistent + VK_CHECK_RESULT(uniformBuffers.object.map()); + VK_CHECK_RESULT(uniformBuffers.skybox.map()); updateUniformBuffers(); } @@ -646,10 +645,7 @@ public: uboVS.model = glm::rotate(uboVS.model, glm::radians(rotation.y), glm::vec3(0.0f, 1.0f, 0.0f)); uboVS.model = glm::rotate(uboVS.model, glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f)); - uint8_t *pData; - VK_CHECK_RESULT(vkMapMemory(device, uniformData.objectVS.memory, 0, sizeof(uboVS), 0, (void **)&pData)); - memcpy(pData, &uboVS, sizeof(uboVS)); - vkUnmapMemory(device, uniformData.objectVS.memory); + memcpy(uniformBuffers.object.mapped, &uboVS, sizeof(uboVS)); // Skybox viewMatrix = glm::mat4(); @@ -661,9 +657,7 @@ public: uboVS.model = glm::rotate(uboVS.model, glm::radians(rotation.y), glm::vec3(0.0f, 1.0f, 0.0f)); uboVS.model = glm::rotate(uboVS.model, glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f)); - VK_CHECK_RESULT(vkMapMemory(device, uniformData.skyboxVS.memory, 0, sizeof(uboVS), 0, (void **)&pData)); - memcpy(pData, &uboVS, sizeof(uboVS)); - vkUnmapMemory(device, uniformData.skyboxVS.memory); + memcpy(uniformBuffers.skybox.mapped, &uboVS, sizeof(uboVS)); } void draw()