Re-add unifom buffer writing

This commit is contained in:
Bailey Harrison 2023-03-21 11:03:20 +00:00
parent 3f1ef63a4e
commit c462e873bc
7 changed files with 68 additions and 33 deletions

View File

@ -169,9 +169,6 @@ namespace engine {
m_window->resetAvgFPS(); m_window->resetAvgFPS();
} }
/* draw */
gfx()->finishRender(renderData.drawBuffer);
/* poll events */ /* poll events */
m_window->getInputAndEvents(); m_window->getInputAndEvents();

View File

@ -48,7 +48,7 @@ inline static void checkVulkanError(VkResult errorCode, int lineNo)
namespace engine { namespace engine {
static constexpr uint32_t FRAMES_IN_FLIGHT = 1; // This improved FPS by 5x! (on Intel IGPU) static constexpr uint32_t FRAMES_IN_FLIGHT = 2; // This improved FPS by 5x! (on Intel IGPU)
static constexpr size_t PUSH_CONSTANT_MAX_SIZE = 128; // bytes static constexpr size_t PUSH_CONSTANT_MAX_SIZE = 128; // bytes
static constexpr VkIndexType INDEX_TYPE = VK_INDEX_TYPE_UINT32; static constexpr VkIndexType INDEX_TYPE = VK_INDEX_TYPE_UINT32;
@ -517,7 +517,7 @@ namespace engine {
VKCHECK(res); VKCHECK(res);
res = vkResetFences(pimpl->device.device, 1, &frameData.renderFence); res = vkResetFences(pimpl->device.device, 1, &frameData.renderFence);
VKCHECK(res); VKCHECK(res);
#if 0
/* perform any pending uniform buffer writes */ /* perform any pending uniform buffer writes */
VKCHECK(vkResetCommandPool(pimpl->device.device, frameData.transferPool, 0)); VKCHECK(vkResetCommandPool(pimpl->device.device, frameData.transferPool, 0));
@ -531,11 +531,26 @@ namespace engine {
// transfer cmds... // transfer cmds...
std::vector<VkBufferMemoryBarrier> barriers(pimpl->descriptorBufferWriteQueues[currentFrameIndex].size()); std::vector<VkBufferMemoryBarrier2> barriers{};
for (gfx::DescriptorBuffer* descriptorBuffer : pimpl->descriptorBufferWriteQueues[currentFrameIndex]) { for (gfx::DescriptorBuffer* descriptorBuffer : pimpl->descriptorBufferWriteQueues[currentFrameIndex]) {
VkBufferMemoryBarrier& barrier = barriers.emplace_back();
barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER; VkBufferCopy copyRegion{};
barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; copyRegion.srcOffset = 0;
copyRegion.dstOffset = 0;
copyRegion.size = descriptorBuffer->stagingBuffer.size;
vkCmdCopyBuffer(
frameData.transferBuf,
descriptorBuffer->stagingBuffer.buffer,
descriptorBuffer->gpuBuffers[currentFrameIndex].buffer,
1,
&copyRegion
);
VkBufferMemoryBarrier2& barrier = barriers.emplace_back();
barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2;
barrier.srcStageMask = VK_PIPELINE_STAGE_2_TRANSFER_BIT;
barrier.srcAccessMask = VK_ACCESS_2_TRANSFER_WRITE_BIT;
barrier.dstStageMask = VK_PIPELINE_STAGE_2_TRANSFER_BIT;
barrier.dstAccessMask = 0; barrier.dstAccessMask = 0;
barrier.srcQueueFamilyIndex = pimpl->device.queues.transferQueueFamily; barrier.srcQueueFamilyIndex = pimpl->device.queues.transferQueueFamily;
barrier.dstQueueFamilyIndex = pimpl->device.queues.presentAndDrawQueueFamily; barrier.dstQueueFamilyIndex = pimpl->device.queues.presentAndDrawQueueFamily;
@ -543,14 +558,13 @@ namespace engine {
barrier.offset = 0; barrier.offset = 0;
barrier.size = descriptorBuffer->gpuBuffers[currentFrameIndex].size; barrier.size = descriptorBuffer->gpuBuffers[currentFrameIndex].size;
} }
pimpl->descriptorBufferWriteQueues[currentFrameIndex].clear();
vkCmdPipelineBarrier(frameData.transferBuf, VkDependencyInfo dependencyInfo{};
VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, dependencyInfo.sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO;
0, dependencyInfo.bufferMemoryBarrierCount = (uint32_t)barriers.size();
0, nullptr, dependencyInfo.pBufferMemoryBarriers = barriers.data();
(uint32_t)barriers.size(), barriers.data(), vkCmdPipelineBarrier2(frameData.transferBuf, &dependencyInfo);
0, nullptr
);
VKCHECK(vkEndCommandBuffer(frameData.transferBuf)); VKCHECK(vkEndCommandBuffer(frameData.transferBuf));
@ -567,7 +581,7 @@ namespace engine {
}; };
res = vkQueueSubmit(pimpl->device.queues.transferQueues[0], 1, &transferSubmitInfo, VK_NULL_HANDLE); res = vkQueueSubmit(pimpl->device.queues.transferQueues[0], 1, &transferSubmitInfo, VK_NULL_HANDLE);
assert(res == VK_SUCCESS); assert(res == VK_SUCCESS);
#endif
uint32_t swapchainImageIndex; uint32_t swapchainImageIndex;
do { do {
@ -600,6 +614,15 @@ namespace engine {
{ // RECORDING { // RECORDING
/* change barriers to perform a queue ownership acquire operation */
for (VkBufferMemoryBarrier2& barrier : barriers) {
barrier.srcStageMask = VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT;
barrier.srcAccessMask = 0;
barrier.dstStageMask = VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT;
barrier.dstAccessMask = VK_ACCESS_2_UNIFORM_READ_BIT;
}
vkCmdPipelineBarrier2(frameData.drawBuf, &dependencyInfo);
std::array<VkClearValue, 2> clearValues{}; // Using same value for all components enables compression according to NVIDIA Best Practices std::array<VkClearValue, 2> clearValues{}; // Using same value for all components enables compression according to NVIDIA Best Practices
clearValues[0].color.float32[0] = 1.0f; clearValues[0].color.float32[0] = 1.0f;
clearValues[0].color.float32[1] = 1.0f; clearValues[0].color.float32[1] = 1.0f;
@ -662,8 +685,8 @@ namespace engine {
waitSemaphores.push_back(drawBuffer->frameData.presentSemaphore); waitSemaphores.push_back(drawBuffer->frameData.presentSemaphore);
waitDstStageMasks.push_back(VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT); waitDstStageMasks.push_back(VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT);
//waitSemaphores.push_back(drawBuffer->frameData.transferSemaphore); waitSemaphores.push_back(drawBuffer->frameData.transferSemaphore);
//waitDstStageMasks.push_back(VK_PIPELINE_STAGE_VERTEX_SHADER_BIT); waitDstStageMasks.push_back(VK_PIPELINE_STAGE_VERTEX_SHADER_BIT);
VkSubmitInfo submitInfo{ VkSubmitInfo submitInfo{
.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO, .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO,

View File

@ -110,6 +110,9 @@ namespace engine {
} }
} }
/* draw */
m_gfx->finishRender(renderData.drawBuffer);
} }
void RenderSystem::setCameraEntity(uint32_t entity) void RenderSystem::setCameraEntity(uint32_t entity)

View File

@ -51,10 +51,6 @@ namespace engine {
res = vkEnumerateDeviceExtensionProperties(physDev, nullptr, &extensionCount, availableExtensions.data()); res = vkEnumerateDeviceExtensionProperties(physDev, nullptr, &extensionCount, availableExtensions.data());
assert(res == VK_SUCCESS); assert(res == VK_SUCCESS);
for ([[maybe_unused]] const VkExtensionProperties& ext : availableExtensions) {
LOG_TRACE("extension: {}", ext.extensionName);
}
bool foundRequiredExtensions = true; bool foundRequiredExtensions = true;
for (const char* extToFind : requirements.requiredExtensions) { for (const char* extToFind : requirements.requiredExtensions) {
bool extFound = false; bool extFound = false;
@ -82,9 +78,12 @@ namespace engine {
/* check features */ /* check features */
VkPhysicalDeviceMemoryPriorityFeaturesEXT memoryPriorityFeatures{}; VkPhysicalDeviceMemoryPriorityFeaturesEXT memoryPriorityFeatures{};
memoryPriorityFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT; memoryPriorityFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT;
VkPhysicalDeviceSynchronization2Features synchronization2Features{};
synchronization2Features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES;
synchronization2Features.pNext = &memoryPriorityFeatures;
VkPhysicalDeviceFeatures2 devFeatures{}; VkPhysicalDeviceFeatures2 devFeatures{};
devFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2; devFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
devFeatures.pNext = &memoryPriorityFeatures; devFeatures.pNext = &synchronization2Features;
vkGetPhysicalDeviceFeatures2(physDev, &devFeatures); vkGetPhysicalDeviceFeatures2(physDev, &devFeatures);
{ {
if (requirements.requiredFeatures.robustBufferAccess) if (requirements.requiredFeatures.robustBufferAccess)
@ -198,6 +197,9 @@ namespace engine {
if (requirements.requiredFeatures.inheritedQueries == VK_TRUE) if (requirements.requiredFeatures.inheritedQueries == VK_TRUE)
if (devFeatures.features.inheritedQueries == VK_FALSE) continue; if (devFeatures.features.inheritedQueries == VK_FALSE) continue;
/* ensure synchronization 2 is found */
if (synchronization2Features.synchronization2 == VK_FALSE) continue;
/* check the memory priority extension was even requested */ /* check the memory priority extension was even requested */
bool memoryPriorityRequired = false; bool memoryPriorityRequired = false;
for (const char* ext : requirements.requiredExtensions) { for (const char* ext : requirements.requiredExtensions) {
@ -343,12 +345,16 @@ namespace engine {
} }
/* set enabled features */ /* set enabled features */
VkPhysicalDeviceMemoryPriorityFeaturesEXT memoryPriorityFeaturesToEnable{}; VkPhysicalDeviceMemoryPriorityFeaturesEXT memoryPriorityFeatures{};
memoryPriorityFeaturesToEnable.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT; memoryPriorityFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT;
memoryPriorityFeaturesToEnable.memoryPriority = d.memoryPriorityFeature ? VK_TRUE : VK_FALSE; memoryPriorityFeatures.memoryPriority = d.memoryPriorityFeature ? VK_TRUE : VK_FALSE;
VkPhysicalDeviceSynchronization2Features synchronization2Features{};
synchronization2Features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES;
synchronization2Features.pNext = &memoryPriorityFeatures;
synchronization2Features.synchronization2 = VK_TRUE;
VkPhysicalDeviceFeatures2 featuresToEnable{}; VkPhysicalDeviceFeatures2 featuresToEnable{};
featuresToEnable.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2; featuresToEnable.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
featuresToEnable.pNext = &memoryPriorityFeaturesToEnable; featuresToEnable.pNext = &synchronization2Features;
featuresToEnable.features = requirements.requiredFeatures; featuresToEnable.features = requirements.requiredFeatures;
/* get list of extensions to enable */ /* get list of extensions to enable */

View File

@ -183,9 +183,9 @@ namespace engine {
// Depth buffer // Depth buffer
.srcSubpass = VK_SUBPASS_EXTERNAL, .srcSubpass = VK_SUBPASS_EXTERNAL,
.dstSubpass = 0, .dstSubpass = 0,
.srcStageMask = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, .srcStageMask = VK_PIPELINE_STAGE_NONE,
.dstStageMask = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, .dstStageMask = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, .srcAccessMask = 0,
.dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, .dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
.dependencyFlags = 0, .dependencyFlags = 0,
}, },
@ -193,7 +193,7 @@ namespace engine {
// Image Layout Transition // Image Layout Transition
.srcSubpass = VK_SUBPASS_EXTERNAL, .srcSubpass = VK_SUBPASS_EXTERNAL,
.dstSubpass = 0, .dstSubpass = 0,
.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, .srcStageMask = VK_PIPELINE_STAGE_NONE,
.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, .dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
.srcAccessMask = 0, .srcAccessMask = 0,
.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT, .dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT,

View File

@ -3,6 +3,7 @@
#include "application.hpp" #include "application.hpp"
#include "window.hpp" #include "window.hpp"
#include "input_manager.hpp" #include "input_manager.hpp"
#include "scene_manager.hpp"
#include "scene.hpp" #include "scene.hpp"
#include "components/transform.hpp" #include "components/transform.hpp"
@ -157,6 +158,11 @@ void CameraControllerSystem::onUpdate(float ts)
LOG_INFO("position: " + pos_string); LOG_INFO("position: " + pos_string);
} }
if (m_scene->app()->window()->getKeyPress(engine::inputs::Key::K_R)) {
t->position = { 0.0f, 5.0f, 0.0f };
c->dy = 0.0f;
}
if (m_scene->app()->inputManager()->getButtonPress("fullscreen")) { if (m_scene->app()->inputManager()->getButtonPress("fullscreen")) {
m_scene->app()->window()->toggleFullscreen(); m_scene->app()->window()->toggleFullscreen();
} }

View File

@ -56,7 +56,7 @@ void playGame(GameSettings settings)
app.setFrameLimiter(settings.enableFrameLimiter); app.setFrameLimiter(settings.enableFrameLimiter);
// configure window // configure window
app.window()->setRelativeMouseMode(true); //app.window()->setRelativeMouseMode(true);
configureInputs(app.inputManager()); configureInputs(app.inputManager());
@ -112,7 +112,7 @@ void playGame(GameSettings settings)
/* cube */ /* cube */
{ {
uint32_t cube = myScene->createEntity("cube"); uint32_t cube = myScene->createEntity("cube");
myScene->getComponent<engine::TransformComponent>(cube)->position = glm::vec3{ -0.5f, -0.5f + 5.0f, -0.5f }; myScene->getComponent<engine::TransformComponent>(cube)->position = glm::vec3{ -0.5f + 5.0f, -0.5f + 5.0f, -0.5f + 5.0f };
auto cubeRenderable = myScene->addComponent<engine::RenderableComponent>(cube); auto cubeRenderable = myScene->addComponent<engine::RenderableComponent>(cube);
cubeRenderable->material = std::make_shared<engine::resources::Material>(app.getResource<engine::resources::Shader>("builtin.standard")); cubeRenderable->material = std::make_shared<engine::resources::Material>(app.getResource<engine::resources::Shader>("builtin.standard"));
cubeRenderable->mesh = genCuboidMesh(app.gfx(), 1.0f, 1.0f, 1.0f, 1); cubeRenderable->mesh = genCuboidMesh(app.gfx(), 1.0f, 1.0f, 1.0f, 1);