mirror of
https://github.com/JulianGro/overte.git
synced 2025-04-11 09:04:24 +02:00
Buffer and validation fixes
This commit is contained in:
parent
182e276e1a
commit
1264783a2f
11 changed files with 79 additions and 15 deletions
|
@ -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));
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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));
|
||||
|
||||
|
|
Loading…
Reference in a new issue