Adding benchmark
This commit is contained in:
@@ -262,8 +262,20 @@ void Buffer::copyBuffer(uint64 src, uint64 dst) {
|
||||
.offset = 0,
|
||||
.size = buffers[src]->size,
|
||||
};
|
||||
vkCmdPipelineBarrier(command->getHandle(), VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr, 1,
|
||||
&srcBarrier, 0, nullptr);
|
||||
VkBufferMemoryBarrier clearBarrier = {
|
||||
.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
|
||||
.pNext = nullptr,
|
||||
.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT,
|
||||
.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT,
|
||||
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
||||
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
||||
.buffer = buffers[dst]->buffer,
|
||||
.offset = 0,
|
||||
.size = buffers[dst]->size,
|
||||
};
|
||||
VkBufferMemoryBarrier srcBarriers[] = {srcBarrier, clearBarrier};
|
||||
vkCmdPipelineBarrier(command->getHandle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr, 2,
|
||||
srcBarriers, 0, nullptr);
|
||||
VkBufferCopy region = {
|
||||
.srcOffset = 0,
|
||||
.dstOffset = 0,
|
||||
|
||||
@@ -141,7 +141,6 @@ void Command::checkFence() {
|
||||
}
|
||||
|
||||
void Command::waitForCommand(uint32 timeout) {
|
||||
pool->submitCommands();
|
||||
if (state == State::Begin) {
|
||||
// is already done
|
||||
return;
|
||||
|
||||
@@ -46,7 +46,10 @@ void vkCmdDrawMeshTasksIndirectEXT(VkCommandBuffer commandBuffer, VkBuffer buffe
|
||||
}
|
||||
|
||||
VkResult vkSetDebugUtilsObjectNameEXT(VkDevice device, const VkDebugUtilsObjectNameInfoEXT* pNameInfo) {
|
||||
return setDebugUtilsObjectName(device, pNameInfo);
|
||||
if (setDebugUtilsObjectName != nullptr) {
|
||||
return setDebugUtilsObjectName(device, pNameInfo);
|
||||
}
|
||||
return VK_SUCCESS;
|
||||
}
|
||||
|
||||
VkResult vkCreateAccelerationStructureKHR(VkDevice device, const VkAccelerationStructureCreateInfoKHR* pCreateInfo,
|
||||
@@ -139,7 +142,9 @@ void Graphics::beginRenderPass(Gfx::PRenderPass renderPass) {
|
||||
getGraphicsCommands()->getCommands()->beginRenderPass(rp, framebuffer);
|
||||
}
|
||||
|
||||
void Graphics::endRenderPass() { getGraphicsCommands()->getCommands()->endRenderPass(); }
|
||||
void Graphics::endRenderPass() {
|
||||
getGraphicsCommands()->getCommands()->endRenderPass();
|
||||
}
|
||||
|
||||
void Graphics::waitDeviceIdle() { vkDeviceWaitIdle(handle); }
|
||||
|
||||
|
||||
@@ -150,14 +150,9 @@ Array<Gfx::Timestamp> TimestampQuery::getResults() {
|
||||
tail = (tail + 1) % 512;
|
||||
Array<Gfx::Timestamp> res;
|
||||
for (uint64 i = 0; i < numTimestamps; ++i) {
|
||||
if (results[i] < lastMeasure)
|
||||
{
|
||||
wrapping += 1ull << graphics->getTimestampValidBits();
|
||||
}
|
||||
lastMeasure = results[i];
|
||||
res.add(Gfx::Timestamp{
|
||||
.name = pendingTimestamps[firstQuery + i],
|
||||
.time = std::chrono::nanoseconds(uint64((results[i] + wrapping) * graphics->getTimestampPeriod())),
|
||||
.time = uint64((results[i] + wrapping) * graphics->getTimestampPeriod()),
|
||||
});
|
||||
}
|
||||
return res;
|
||||
|
||||
@@ -79,7 +79,7 @@ RenderPass::RenderPass(PGraphics graphics, Gfx::RenderTargetLayout _layout, Arra
|
||||
.pNext = nullptr,
|
||||
.flags = 0,
|
||||
.format = cast(resolveAttachment.getFormat()),
|
||||
.samples = (VkSampleCountFlagBits)resolveAttachment.getNumSamples(),
|
||||
.samples = (VkSampleCountFlagBits)resolveAttachment.getTexture()->getNumSamples(),
|
||||
.loadOp = cast(resolveAttachment.getLoadOp()),
|
||||
.storeOp = cast(resolveAttachment.getStoreOp()),
|
||||
.stencilLoadOp = cast(resolveAttachment.getStencilLoadOp()),
|
||||
@@ -143,6 +143,10 @@ RenderPass::RenderPass(PGraphics graphics, Gfx::RenderTargetLayout _layout, Arra
|
||||
.initialLayout = cast(layout.depthResolveAttachment.getInitialLayout()),
|
||||
.finalLayout = cast(layout.depthResolveAttachment.getFinalLayout()),
|
||||
};
|
||||
VkClearValue& clearValue = clearValues.add();
|
||||
if (attachments.back().loadOp == VK_ATTACHMENT_LOAD_OP_CLEAR) {
|
||||
clearValue = cast(layout.depthResolveAttachment.clear);
|
||||
}
|
||||
depthResolveRef = {
|
||||
.sType = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2,
|
||||
.pNext = nullptr,
|
||||
@@ -214,14 +218,22 @@ uint32 RenderPass::getFramebufferHash() {
|
||||
PTexture2D tex = colorAttachment.getTexture().cast<Texture2D>();
|
||||
description.colorAttachments[description.numColorAttachments++] = tex->getView();
|
||||
}
|
||||
for (auto& resolveAttachment : layout.resolveAttachments) {
|
||||
PTexture2D tex = resolveAttachment.getTexture().cast<Texture2D>();
|
||||
description.resolveAttachments[description.numResolveAttachments++] = tex->getView();
|
||||
}
|
||||
if (layout.depthAttachment.getTexture() != nullptr) {
|
||||
PTexture2D tex = layout.depthAttachment.getTexture().cast<Texture2D>();
|
||||
description.depthAttachment = tex->getView();
|
||||
}
|
||||
if (layout.depthResolveAttachment.getTexture() != nullptr) {
|
||||
PTexture2D tex = layout.depthResolveAttachment.getTexture().cast<Texture2D>();
|
||||
description.depthResolveAttachment = tex->getView();
|
||||
}
|
||||
return CRC::Calculate(&description, sizeof(FramebufferDescription), CRC::CRC_32());
|
||||
}
|
||||
|
||||
void Vulkan::RenderPass::endRenderPass() {
|
||||
void RenderPass::endRenderPass() {
|
||||
for (auto& inputAttachment : layout.inputAttachments) {
|
||||
PTexture2D tex = inputAttachment.getTexture().cast<Texture2D>();
|
||||
tex->setLayout(inputAttachment.getFinalLayout());
|
||||
@@ -230,8 +242,16 @@ void Vulkan::RenderPass::endRenderPass() {
|
||||
PTexture2D tex = colorAttachment.getTexture().cast<Texture2D>();
|
||||
tex->setLayout(colorAttachment.getFinalLayout());
|
||||
}
|
||||
for (auto& resolveAttachment : layout.resolveAttachments) {
|
||||
PTexture2D tex = resolveAttachment.getTexture().cast<Texture2D>();
|
||||
tex->setLayout(resolveAttachment.getFinalLayout());
|
||||
}
|
||||
if (layout.depthAttachment.getTexture() != nullptr) {
|
||||
PTexture2D tex = layout.depthAttachment.getTexture().cast<Texture2D>();
|
||||
tex->setLayout(layout.depthAttachment.getFinalLayout());
|
||||
}
|
||||
if (layout.depthResolveAttachment.getTexture() != nullptr) {
|
||||
PTexture2D tex = layout.depthResolveAttachment.getTexture().cast<Texture2D>();
|
||||
tex->setLayout(layout.depthResolveAttachment.getFinalLayout());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -137,17 +137,6 @@ TextureHandle::TextureHandle(PGraphics graphics, VkImageViewType viewType, const
|
||||
changeLayout(Gfx::SE_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_ACCESS_TRANSFER_WRITE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||
VK_ACCESS_SHADER_READ_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT);
|
||||
graphics->getDestructionManager()->queueResourceForDestruction(std::move(stagingAlloc));
|
||||
} else {
|
||||
if (usage & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) {
|
||||
changeLayout(Gfx::SE_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_ACCESS_NONE, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
|
||||
VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT);
|
||||
} else if (usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) {
|
||||
changeLayout(Gfx::SE_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_ACCESS_NONE, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
|
||||
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT);
|
||||
} else {
|
||||
changeLayout(Gfx::SE_IMAGE_LAYOUT_GENERAL, VK_ACCESS_NONE, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, VK_ACCESS_MEMORY_WRITE_BIT,
|
||||
VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
|
||||
}
|
||||
}
|
||||
VkImageViewCreateInfo viewInfo = {
|
||||
.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
|
||||
@@ -331,7 +320,7 @@ void TextureHandle::generateMipmaps() {
|
||||
.aspectMask = aspect,
|
||||
.levelCount = 1,
|
||||
.baseArrayLayer = 0,
|
||||
.layerCount = 1,
|
||||
.layerCount = layerCount,
|
||||
},
|
||||
};
|
||||
int32 mipWidth = width;
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
#include "Resources.h"
|
||||
#include <GLFW/glfw3.h>
|
||||
|
||||
|
||||
using namespace Seele;
|
||||
using namespace Seele::Vulkan;
|
||||
|
||||
@@ -93,9 +92,9 @@ void Window::pollInput() { glfwPollEvents(); }
|
||||
|
||||
void Window::beginFrame() {
|
||||
imageAvailableFences[currentSemaphoreIndex]->reset();
|
||||
vkAcquireNextImageKHR(graphics->getDevice(), swapchain, std::numeric_limits<uint64>::max(),
|
||||
imageAvailableSemaphores[currentSemaphoreIndex]->getHandle(),
|
||||
imageAvailableFences[currentSemaphoreIndex]->getHandle(), ¤tImageIndex);
|
||||
VK_CHECK(vkAcquireNextImageKHR(graphics->getDevice(), swapchain, std::numeric_limits<uint64>::max(),
|
||||
imageAvailableSemaphores[currentSemaphoreIndex]->getHandle(),
|
||||
imageAvailableFences[currentSemaphoreIndex]->getHandle(), ¤tImageIndex));
|
||||
imageAvailableFences[currentSemaphoreIndex]->submit();
|
||||
graphics->getGraphicsCommands()->getCommands()->waitForSemaphore(VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
|
||||
imageAvailableSemaphores[currentSemaphoreIndex]);
|
||||
|
||||
Reference in New Issue
Block a user