Buffer and validation fixes

This commit is contained in:
Karol Suprynowicz 2024-12-08 21:13:29 +01:00
parent 182e276e1a
commit 1264783a2f
11 changed files with 79 additions and 15 deletions

View file

@ -797,7 +797,7 @@ void VulkanDisplayPlugin::present(const std::shared_ptr<RefreshRateController>&
};
auto rect = VkRect2D{ VkOffset2D{ 0, 0 }, _vkWindow->_extent };
VkRenderPassBeginInfo beginInfo = vks::initializers::renderPassBeginInfo();
/*VkRenderPassBeginInfo beginInfo = vks::initializers::renderPassBeginInfo();
beginInfo.renderPass = _renderPass;
beginInfo.framebuffer = framebuffer;
beginInfo.renderArea = rect;
@ -812,7 +812,7 @@ void VulkanDisplayPlugin::present(const std::shared_ptr<RefreshRateController>&
cmdEndLabel(commandBuffer);
cmdBeginLabel(commandBuffer, "renderpass:testClear", glm::vec4{ 0, 1, 1, 1 });
vkCmdBeginRenderPass(commandBuffer, &beginInfo, VK_SUBPASS_CONTENTS_INLINE);
vkCmdEndRenderPass(commandBuffer);
vkCmdEndRenderPass(commandBuffer);*/
// Blit the image into the swapchain.
// is vks::tools::insertImageMemoryBarrier needed?
@ -840,6 +840,17 @@ void VulkanDisplayPlugin::present(const std::shared_ptr<RefreshRateController>&
vks::tools::insertImageMemoryBarrier(
commandBuffer,
vkBackend->_outputTexture->attachments[0].image,
VK_ACCESS_TRANSFER_READ_BIT,
0,
VK_IMAGE_LAYOUT_UNDEFINED,
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
VK_PIPELINE_STAGE_TRANSFER_BIT,
VK_PIPELINE_STAGE_TRANSFER_BIT,
mipSubRange);
vks::tools::insertImageMemoryBarrier(
commandBuffer,
_vkWindow->_swapchain.images[currentImageIndex],
0,
VK_ACCESS_TRANSFER_WRITE_BIT,
VK_IMAGE_LAYOUT_UNDEFINED,
@ -858,6 +869,17 @@ void VulkanDisplayPlugin::present(const std::shared_ptr<RefreshRateController>&
&imageBlit,
VK_FILTER_LINEAR);
vks::tools::insertImageMemoryBarrier(
commandBuffer,
_vkWindow->_swapchain.images[currentImageIndex],
0,
VK_ACCESS_TRANSFER_WRITE_BIT,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,
VK_PIPELINE_STAGE_TRANSFER_BIT,
VK_PIPELINE_STAGE_TRANSFER_BIT,
mipSubRange);
cmdEndLabel(commandBuffer);
VK_CHECK_RESULT(vkEndCommandBuffer(commandBuffer));

View file

@ -37,7 +37,7 @@ PolyLineEntityRenderer::PolyLineEntityRenderer(const EntityItemPointer& entity)
PolylineData data { glm::vec2(_faceCamera, _glow), glm::vec2(0.0f) };
_polylineDataBuffer->setSubData(0, data);
_polylineGeometryBuffer = std::make_shared<gpu::Buffer>(gpu::Buffer::UniformBuffer);
_polylineGeometryBuffer = std::make_shared<gpu::Buffer>(gpu::Buffer::ResourceBuffer);
}
}

View file

@ -591,7 +591,7 @@ struct Cache {
}
// Vertex input
{
if (pipelineState.format) {
const auto& vertexReflection = pipeline.getProgram()->getShaders()[0]->getReflection();
const gpu::Stream::Format& format = *gpu::acquire(pipelineState.format);
@ -663,7 +663,10 @@ void VKBackend::executeFrame(const FramePointer& frame) {
continue; // VKTODO: crashes frame player currently
}
if (batch.getName() == "Resample::run") {
continue; // VKTODO: no framebuffer commands support yet
continue; // VKTODO: no framebuffer commands support yet"ApplicationOverlay::render"
}
if (batch.getName() == "ApplicationOverlay::render") {
continue; // VKTODO: no overlay support yet
}
cmdBeginLabel(commandBuffer, "batch:" + batch.getName(), glm::vec4{ 1, 1, 0, 1 });
const auto& commands = batch.getCommands();

View file

@ -63,7 +63,7 @@ void gpu::vk::VKFramebuffer::update() {
attachmentCI.height = vkTexture->_gpuObject.getHeight();
attachmentCI.layerCount = 1;
attachmentCI.format = gpu::vk::evalTexelFormatInternal(vkTexture->_gpuObject.getTexelFormat());
attachmentCI.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
attachmentCI.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
attachmentCI.imageSampleCount = VK_SAMPLE_COUNT_1_BIT;
addAttachment(attachmentCI, vkTexture->_vkImage);
//glNamedFramebufferTexture(_id, colorAttachments[unit], gltexture->_texture, 0);

View file

@ -201,7 +201,7 @@ void VKAttachmentTexture::createTexture(VKBackend &backend) {
|| _gpuObject.getTexelFormat().getSemantic() == gpu::R11G11B10
|| _gpuObject.getTexelFormat().getSemantic() == gpu::SRGB
|| _gpuObject.getTexelFormat().getSemantic() == gpu::SRGBA) {
imageCI.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
imageCI.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
} else if (_gpuObject.isDepthStencilRenderTarget()) {
imageCI.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
} else {

View file

@ -17,6 +17,8 @@
#include "GPULogging.h"
#define DEBUG_VALIDATE_BUFFER_USAGE
#if defined(NSIGHT_FOUND)
#include "nvToolsExt.h"
@ -236,6 +238,9 @@ void Batch::setInputFormat(const Stream::FormatPointer& format) {
}
void Batch::setInputBuffer(Slot channel, const BufferPointer& buffer, Offset offset, Offset stride) {
#ifdef DEBUG_VALIDATE_BUFFER_USAGE
Q_ASSERT(buffer->getUsage() & gpu::Buffer::VertexBuffer);
#endif
ADD_COMMAND(setInputBuffer);
_params.emplace_back(stride);
@ -245,6 +250,9 @@ void Batch::setInputBuffer(Slot channel, const BufferPointer& buffer, Offset off
}
void Batch::setInputBuffer(Slot channel, const BufferView& view) {
#ifdef DEBUG_VALIDATE_BUFFER_USAGE
Q_ASSERT(view._buffer->getUsage() & gpu::Buffer::VertexBuffer);
#endif
setInputBuffer(channel, view._buffer, view._offset, Offset(view._stride));
}
@ -260,6 +268,9 @@ void Batch::setInputStream(Slot startChannel, const BufferStream& stream) {
}
void Batch::setIndexBuffer(Type type, const BufferPointer& buffer, Offset offset) {
#ifdef DEBUG_VALIDATE_BUFFER_USAGE
Q_ASSERT(buffer->getUsage() & gpu::Buffer::IndexBuffer);
#endif
ADD_COMMAND(setIndexBuffer);
_params.emplace_back(offset);
@ -268,6 +279,9 @@ void Batch::setIndexBuffer(Type type, const BufferPointer& buffer, Offset offset
}
void Batch::setIndexBuffer(const BufferView& buffer) {
#ifdef DEBUG_VALIDATE_BUFFER_USAGE
Q_ASSERT(buffer._buffer->getUsage() & gpu::Buffer::IndexBuffer);
#endif
setIndexBuffer(buffer._element.getType(), buffer._buffer, buffer._offset);
}

View file

@ -30,6 +30,7 @@ Mesh::Mesh(const Mesh& mesh) :
_indexBuffer(mesh._indexBuffer),
_partBuffer(mesh._partBuffer),
_colorBuffer(mesh._colorBuffer) {
Q_ASSERT(_indexBuffer._buffer->getUsage() & gpu::Buffer::IndexBuffer);
}
Mesh::~Mesh() {
@ -117,6 +118,7 @@ void Mesh::evalVertexStream() {
}
void Mesh::setIndexBuffer(const BufferView& buffer) {
Q_ASSERT(buffer._buffer->getUsage() & gpu::Buffer::IndexBuffer);
_indexBuffer = buffer;
}

View file

@ -107,7 +107,7 @@ void buildGraphicsMesh(const hfm::Mesh& hfmMesh, graphics::MeshPointer& graphics
const int totalVertsSize = clusterWeightsOffset + clusterWeightsSize;
// Copy all vertex data in a single buffer
auto vertBuffer = std::make_shared<gpu::Buffer>(gpu::Buffer::UniformBuffer);
auto vertBuffer = std::make_shared<gpu::Buffer>(gpu::Buffer::VertexBuffer);
vertBuffer->resize(totalVertsSize);
// First positions
@ -300,7 +300,7 @@ void buildGraphicsMesh(const hfm::Mesh& hfmMesh, graphics::MeshPointer& graphics
vDest += vStride;
}
auto attribBuffer = std::make_shared<gpu::Buffer>(gpu::Buffer::UniformBuffer);
auto attribBuffer = std::make_shared<gpu::Buffer>(gpu::Buffer::VertexBuffer);
attribBuffer->setData(totalAttribBufferSize, dest.data());
vertexBufferStream->addBuffer(attribBuffer, 0, vStride);
}
@ -319,7 +319,7 @@ void buildGraphicsMesh(const hfm::Mesh& hfmMesh, graphics::MeshPointer& graphics
return;
}
auto indexBuffer = std::make_shared<gpu::Buffer>(gpu::Buffer::UniformBuffer);
auto indexBuffer = std::make_shared<gpu::Buffer>(gpu::Buffer::IndexBuffer);
indexBuffer->resize(totalIndices * sizeof(int));
int indexNum = 0;
@ -357,7 +357,7 @@ void buildGraphicsMesh(const hfm::Mesh& hfmMesh, graphics::MeshPointer& graphics
graphicsMesh->setIndexBuffer(indexBufferView);
if (parts.size()) {
auto pb = std::make_shared<gpu::Buffer>(gpu::Buffer::UniformBuffer);
auto pb = std::make_shared<gpu::Buffer>(gpu::Buffer::IndirectBuffer);
pb->setData(parts.size() * sizeof(graphics::Mesh::Part), (const gpu::Byte*) parts.data());
gpu::BufferView pbv(pb, gpu::Element(gpu::VEC4, gpu::UINT32, gpu::XYZW));
graphicsMesh->setPartBuffer(pbv);

View file

@ -78,8 +78,8 @@ const glm::uvec4 LightClusters::MAX_GRID_DIMENSIONS { 32, 32, 31, 16384 };
LightClusters::LightClusters() :
_lightIndicesBuffer(std::make_shared<gpu::Buffer>(gpu::Buffer::UniformBuffer)),
_clusterGridBuffer(/*std::make_shared<gpu::Buffer>(), */gpu::Element::INDEX_INT32),
_clusterContentBuffer(/*std::make_shared<gpu::Buffer>(), */gpu::Element::INDEX_INT32) {
_clusterGridBuffer(/*std::make_shared<gpu::Buffer>(), */gpu::Element::INDEX_INT32), // VKTODO: is this correct
_clusterContentBuffer(/*std::make_shared<gpu::Buffer>(), */gpu::Element::INDEX_INT32) { // VKTODO: is this correct
}
void LightClusters::setDimensions(glm::uvec3 gridDims, uint32_t listBudget) {

View file

@ -23,8 +23,8 @@
#include "Context.h"
VKWindow::VKWindow(QScreen* screen) : QWindow(screen) {
setBaseSize(QSize(800, 600));
resize(QSize(800, 600));
setBaseSize(QSize(1280, 720));
resize(QSize(1280, 720));
_resizeTimer = new QTimer(this);
_resizeTimer->setTimerType(Qt::TimerType::PreciseTimer);
_resizeTimer->setInterval(50);
@ -190,6 +190,7 @@ void VKWindow::setupRenderPass() {
attachments[0].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
attachments[0].finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
// VKTODO: not needed currently
// Depth attachment
attachments[1].samples = VK_SAMPLE_COUNT_1_BIT;
attachments[1].format = VK_FORMAT_D24_UNORM_S8_UINT;

View file

@ -295,6 +295,17 @@ void RenderThread::renderFrame(gpu::FramePointer& frame) {
vks::tools::insertImageMemoryBarrier(
commandBuffer,
vkBackend->_outputTexture->attachments[0].image,
VK_ACCESS_TRANSFER_READ_BIT,
0,
VK_IMAGE_LAYOUT_UNDEFINED,
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
VK_PIPELINE_STAGE_TRANSFER_BIT,
VK_PIPELINE_STAGE_TRANSFER_BIT,
mipSubRange);
vks::tools::insertImageMemoryBarrier(
commandBuffer,
_swapchain.images[swapchainIndex],
0,
VK_ACCESS_TRANSFER_WRITE_BIT,
VK_IMAGE_LAYOUT_UNDEFINED,
@ -313,6 +324,17 @@ void RenderThread::renderFrame(gpu::FramePointer& frame) {
&imageBlit,
VK_FILTER_LINEAR);
vks::tools::insertImageMemoryBarrier(
commandBuffer,
_swapchain.images[swapchainIndex],
0,
VK_ACCESS_TRANSFER_WRITE_BIT,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,
VK_PIPELINE_STAGE_TRANSFER_BIT,
VK_PIPELINE_STAGE_TRANSFER_BIT,
mipSubRange);
cmdEndLabel(commandBuffer);
VK_CHECK_RESULT(vkEndCommandBuffer(commandBuffer));