mirror of
https://github.com/bailwillharr/engine.git
synced 2024-09-21 04:51:18 +00:00
Re-add unifom buffer writing
This commit is contained in:
parent
3f1ef63a4e
commit
c462e873bc
@ -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();
|
||||||
|
|
||||||
|
@ -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,
|
||||||
|
©Region
|
||||||
|
);
|
||||||
|
|
||||||
|
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,
|
||||||
|
@ -110,6 +110,9 @@ namespace engine {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* draw */
|
||||||
|
m_gfx->finishRender(renderData.drawBuffer);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenderSystem::setCameraEntity(uint32_t entity)
|
void RenderSystem::setCameraEntity(uint32_t entity)
|
||||||
|
@ -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)
|
||||||
@ -197,6 +196,9 @@ namespace engine {
|
|||||||
if (devFeatures.features.variableMultisampleRate == VK_FALSE) continue;
|
if (devFeatures.features.variableMultisampleRate == VK_FALSE) continue;
|
||||||
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;
|
||||||
@ -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 */
|
||||||
|
@ -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,
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user