[WIP] Fixed texture load corruption issue.
This commit is contained in:
parent
3ab9d838fa
commit
aa729610cf
|
|
@ -32,6 +32,10 @@ struct Sampler
|
||||||
{
|
{
|
||||||
const auto rc = --m_RefCount;
|
const auto rc = --m_RefCount;
|
||||||
assert(rc < MaxValue<u32>);
|
assert(rc < MaxValue<u32>);
|
||||||
|
if (rc == 0)
|
||||||
|
{
|
||||||
|
Destroy();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] bool
|
[[nodiscard]] bool
|
||||||
|
|
|
||||||
|
|
@ -53,6 +53,7 @@ class Manager
|
||||||
m_Device = nullptr;
|
m_Device = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Work on deletion!!
|
||||||
void
|
void
|
||||||
Sweep()
|
Sweep()
|
||||||
requires concepts::DeviceDestructible<Type>
|
requires concepts::DeviceDestructible<Type>
|
||||||
|
|
|
||||||
|
|
@ -14,9 +14,9 @@ BufferManager::CreateStorageBuffer(const usize size, const cstr name)
|
||||||
|
|
||||||
// TODO: Storage and Index buffer are set.
|
// TODO: Storage and Index buffer are set.
|
||||||
// This is hacky and should be improved.
|
// This is hacky and should be improved.
|
||||||
constexpr vk::BufferUsageFlags usage = vk::BufferUsageFlagBits::eStorageBuffer |
|
constexpr vk::BufferUsageFlags usage =
|
||||||
vk::BufferUsageFlagBits::eIndexBuffer |
|
vk::BufferUsageFlagBits::eStorageBuffer | vk::BufferUsageFlagBits::eIndexBuffer |
|
||||||
vk::BufferUsageFlagBits::eShaderDeviceAddress;
|
vk::BufferUsageFlagBits::eShaderDeviceAddress | vk::BufferUsageFlagBits::eTransferDst;
|
||||||
constexpr VmaAllocationCreateFlags createFlags = VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT |
|
constexpr VmaAllocationCreateFlags createFlags = VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT |
|
||||||
VMA_ALLOCATION_CREATE_HOST_ACCESS_ALLOW_TRANSFER_INSTEAD_BIT |
|
VMA_ALLOCATION_CREATE_HOST_ACCESS_ALLOW_TRANSFER_INSTEAD_BIT |
|
||||||
VMA_ALLOCATION_CREATE_MAPPED_BIT;
|
VMA_ALLOCATION_CREATE_MAPPED_BIT;
|
||||||
|
|
|
||||||
|
|
@ -391,6 +391,7 @@ AssetLoader::LoadImageToGpu(tinygltf::Image *image, bool isSrgb) const
|
||||||
.m_IsMipMapped = true,
|
.m_IsMipMapped = true,
|
||||||
.m_IsStorage = false,
|
.m_IsStorage = false,
|
||||||
});
|
});
|
||||||
|
|
||||||
auto stagingBuffer = m_ResourceManager->Buffers().CreateStagingBuffer(byteSize);
|
auto stagingBuffer = m_ResourceManager->Buffers().CreateStagingBuffer(byteSize);
|
||||||
stagingBuffer->Write(0, byteSize, image->image.data());
|
stagingBuffer->Write(0, byteSize, image->image.data());
|
||||||
|
|
||||||
|
|
@ -434,7 +435,9 @@ AssetLoader::LoadImageToGpu(tinygltf::Image *image, bool isSrgb) const
|
||||||
|
|
||||||
vk::ImageMemoryBarrier2 postStagingBarrier = {
|
vk::ImageMemoryBarrier2 postStagingBarrier = {
|
||||||
.srcStageMask = vk::PipelineStageFlagBits2::eAllTransfer,
|
.srcStageMask = vk::PipelineStageFlagBits2::eAllTransfer,
|
||||||
|
.srcAccessMask = vk::AccessFlagBits2::eTransferWrite,
|
||||||
.dstStageMask = vk::PipelineStageFlagBits2::eAllTransfer,
|
.dstStageMask = vk::PipelineStageFlagBits2::eAllTransfer,
|
||||||
|
.dstAccessMask = vk::AccessFlagBits2::eTransferRead,
|
||||||
.oldLayout = vk::ImageLayout::eTransferDstOptimal,
|
.oldLayout = vk::ImageLayout::eTransferDstOptimal,
|
||||||
.newLayout = vk::ImageLayout::eTransferSrcOptimal,
|
.newLayout = vk::ImageLayout::eTransferSrcOptimal,
|
||||||
.srcQueueFamilyIndex = m_TransferQueueIndex,
|
.srcQueueFamilyIndex = m_TransferQueueIndex,
|
||||||
|
|
@ -550,7 +553,7 @@ AssetLoader::LoadModelToGpu(cstr path, cstr name)
|
||||||
if (!model.materials.empty())
|
if (!model.materials.empty())
|
||||||
{
|
{
|
||||||
// TODO("Something broken on load here.");
|
// TODO("Something broken on load here.");
|
||||||
auto getTextureHandle = [this, &textureHandleMap, &model](i32 index,
|
auto getTextureHandle = [this, &textureHandleMap, &stagingBuffers, &model](i32 index,
|
||||||
const bool isSrgb) -> systems::ResId<TextureView> {
|
const bool isSrgb) -> systems::ResId<TextureView> {
|
||||||
if (index < 0)
|
if (index < 0)
|
||||||
{
|
{
|
||||||
|
|
@ -564,6 +567,7 @@ AssetLoader::LoadModelToGpu(cstr path, cstr name)
|
||||||
auto *image = &model.images[index];
|
auto *image = &model.images[index];
|
||||||
auto [handle, staging] = LoadImageToGpu(image, isSrgb);
|
auto [handle, staging] = LoadImageToGpu(image, isSrgb);
|
||||||
textureHandleMap.emplace(index, handle);
|
textureHandleMap.emplace(index, handle);
|
||||||
|
stagingBuffers.emplace_back(std::move(staging));
|
||||||
return handle;
|
return handle;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -343,7 +343,7 @@ CreateCubeFromHdrEnv(AssetLoader *assetLoader, vk::Queue computeQueue, const u32
|
||||||
{
|
{
|
||||||
prefilterPushConstants.m_OutputTexture = tex;
|
prefilterPushConstants.m_OutputTexture = tex;
|
||||||
prefilterPushConstants.m_CubeSide = mipSize;
|
prefilterPushConstants.m_CubeSide = mipSize;
|
||||||
prefilterPushConstants.m_Roughness = Cast<f32>(mipCount) / Cast<f32>(prefilterMipCountMax);
|
prefilterPushConstants.m_Roughness = Cast<f32>(mipCount) / Cast<f32>(prefilterMipCountMax - 1);
|
||||||
cmd.pushConstants(pipelineLayout, vk::ShaderStageFlagBits::eCompute, 0, sizeof prefilterPushConstants,
|
cmd.pushConstants(pipelineLayout, vk::ShaderStageFlagBits::eCompute, 0, sizeof prefilterPushConstants,
|
||||||
&prefilterPushConstants);
|
&prefilterPushConstants);
|
||||||
u32 groupCount = eastl::max(mipSize / 16u, 1u);
|
u32 groupCount = eastl::max(mipSize / 16u, 1u);
|
||||||
|
|
@ -356,6 +356,7 @@ CreateCubeFromHdrEnv(AssetLoader *assetLoader, vk::Queue computeQueue, const u32
|
||||||
cmd.pipelineBarrier2(&skyboxToSampleDependency);
|
cmd.pipelineBarrier2(&skyboxToSampleDependency);
|
||||||
cmd.pipelineBarrier2(&prefilterToSampleDependency);
|
cmd.pipelineBarrier2(&prefilterToSampleDependency);
|
||||||
|
|
||||||
|
TODO("BRDF LUT has a black line at x=0. Needs fixing");
|
||||||
cmd.bindPipeline(vk::PipelineBindPoint::eCompute, brdfLutPipeline);
|
cmd.bindPipeline(vk::PipelineBindPoint::eCompute, brdfLutPipeline);
|
||||||
cmd.pushConstants(pipelineLayout, vk::ShaderStageFlagBits::eCompute, 0, sizeof brdfLutPushConstants,
|
cmd.pushConstants(pipelineLayout, vk::ShaderStageFlagBits::eCompute, 0, sizeof brdfLutPushConstants,
|
||||||
&brdfLutPushConstants);
|
&brdfLutPushConstants);
|
||||||
|
|
|
||||||
|
|
@ -179,7 +179,7 @@ main(int, char **)
|
||||||
Swapchain swapchain = {&surface, &device, window.GetSize(), "Primary Chain"};
|
Swapchain swapchain = {&surface, &device, window.GetSize(), "Primary Chain"};
|
||||||
|
|
||||||
systems::ResourceManager resourceManager = {&device, 1000, 1000, 10, 1000};
|
systems::ResourceManager resourceManager = {&device, 1000, 1000, 10, 1000};
|
||||||
systems::CommitManager commitManager = {&device, 1000, 1000, 1000, resourceManager.Samplers().CreateSampler({})};
|
systems::CommitManager commitManager = {&device, 1000, 1000, 1000, resourceManager.Samplers().CreateSampler({.m_Name = "Default Sampler"})};
|
||||||
|
|
||||||
AssetLoader assetLoader = {&resourceManager, &commitManager, graphicsQueue, queueAllocation.m_Family,
|
AssetLoader assetLoader = {&resourceManager, &commitManager, graphicsQueue, queueAllocation.m_Family,
|
||||||
queueAllocation.m_Family};
|
queueAllocation.m_Family};
|
||||||
|
|
@ -304,14 +304,14 @@ main(int, char **)
|
||||||
};
|
};
|
||||||
|
|
||||||
vk::ImageMemoryBarrier2 preRenderBarrier = {
|
vk::ImageMemoryBarrier2 preRenderBarrier = {
|
||||||
.srcStageMask = vk::PipelineStageFlagBits2::eTopOfPipe,
|
.srcStageMask = vk::PipelineStageFlagBits2::eTransfer,
|
||||||
.srcAccessMask = vk::AccessFlagBits2::eNone,
|
.srcAccessMask = vk::AccessFlagBits2::eTransferRead,
|
||||||
.dstStageMask = vk::PipelineStageFlagBits2::eColorAttachmentOutput,
|
.dstStageMask = vk::PipelineStageFlagBits2::eColorAttachmentOutput,
|
||||||
.dstAccessMask = vk::AccessFlagBits2::eColorAttachmentWrite,
|
.dstAccessMask = vk::AccessFlagBits2::eColorAttachmentWrite,
|
||||||
.oldLayout = vk::ImageLayout::eUndefined,
|
.oldLayout = vk::ImageLayout::eUndefined,
|
||||||
.newLayout = vk::ImageLayout::eColorAttachmentOptimal,
|
.newLayout = vk::ImageLayout::eColorAttachmentOptimal,
|
||||||
.srcQueueFamilyIndex = queueAllocation.m_Family,
|
.srcQueueFamilyIndex = vk::QueueFamilyIgnored,
|
||||||
.dstQueueFamilyIndex = queueAllocation.m_Family,
|
.dstQueueFamilyIndex = vk::QueueFamilyIgnored,
|
||||||
.subresourceRange = subresourceRange,
|
.subresourceRange = subresourceRange,
|
||||||
};
|
};
|
||||||
vk::DependencyInfo preRenderDependencies = {
|
vk::DependencyInfo preRenderDependencies = {
|
||||||
|
|
@ -322,23 +322,23 @@ main(int, char **)
|
||||||
vk::ImageMemoryBarrier2 renderToBlitBarrier = {
|
vk::ImageMemoryBarrier2 renderToBlitBarrier = {
|
||||||
.srcStageMask = vk::PipelineStageFlagBits2::eColorAttachmentOutput,
|
.srcStageMask = vk::PipelineStageFlagBits2::eColorAttachmentOutput,
|
||||||
.srcAccessMask = vk::AccessFlagBits2::eColorAttachmentWrite,
|
.srcAccessMask = vk::AccessFlagBits2::eColorAttachmentWrite,
|
||||||
.dstStageMask = vk::PipelineStageFlagBits2::eAllTransfer,
|
.dstStageMask = vk::PipelineStageFlagBits2::eBlit,
|
||||||
.dstAccessMask = vk::AccessFlagBits2::eTransferRead,
|
.dstAccessMask = vk::AccessFlagBits2::eTransferRead,
|
||||||
.oldLayout = vk::ImageLayout::eColorAttachmentOptimal,
|
.oldLayout = vk::ImageLayout::eColorAttachmentOptimal,
|
||||||
.newLayout = vk::ImageLayout::eTransferSrcOptimal,
|
.newLayout = vk::ImageLayout::eTransferSrcOptimal,
|
||||||
.srcQueueFamilyIndex = queueAllocation.m_Family,
|
.srcQueueFamilyIndex = vk::QueueFamilyIgnored,
|
||||||
.dstQueueFamilyIndex = queueAllocation.m_Family,
|
.dstQueueFamilyIndex = vk::QueueFamilyIgnored,
|
||||||
.subresourceRange = subresourceRange,
|
.subresourceRange = subresourceRange,
|
||||||
};
|
};
|
||||||
vk::ImageMemoryBarrier2 acquireToTransferDstBarrier = {
|
vk::ImageMemoryBarrier2 acquireToTransferDstBarrier = {
|
||||||
.srcStageMask = vk::PipelineStageFlagBits2::eTopOfPipe,
|
.srcStageMask = vk::PipelineStageFlagBits2::eTransfer,
|
||||||
.srcAccessMask = vk::AccessFlagBits2::eNone,
|
.srcAccessMask = vk::AccessFlagBits2::eNone,
|
||||||
.dstStageMask = vk::PipelineStageFlagBits2::eAllTransfer,
|
.dstStageMask = vk::PipelineStageFlagBits2::eBlit,
|
||||||
.dstAccessMask = vk::AccessFlagBits2::eTransferWrite,
|
.dstAccessMask = vk::AccessFlagBits2::eTransferWrite,
|
||||||
.oldLayout = vk::ImageLayout::eUndefined,
|
.oldLayout = vk::ImageLayout::eUndefined,
|
||||||
.newLayout = vk::ImageLayout::eTransferDstOptimal,
|
.newLayout = vk::ImageLayout::eTransferDstOptimal,
|
||||||
.srcQueueFamilyIndex = queueAllocation.m_Family,
|
.srcQueueFamilyIndex = vk::QueueFamilyIgnored,
|
||||||
.dstQueueFamilyIndex = queueAllocation.m_Family,
|
.dstQueueFamilyIndex = vk::QueueFamilyIgnored,
|
||||||
.subresourceRange = subresourceRange,
|
.subresourceRange = subresourceRange,
|
||||||
};
|
};
|
||||||
eastl::array postRenderBarriers = {
|
eastl::array postRenderBarriers = {
|
||||||
|
|
@ -351,15 +351,15 @@ main(int, char **)
|
||||||
};
|
};
|
||||||
|
|
||||||
vk::ImageMemoryBarrier2 transferDstToGuiRenderBarrier = {
|
vk::ImageMemoryBarrier2 transferDstToGuiRenderBarrier = {
|
||||||
.srcStageMask = vk::PipelineStageFlagBits2::eAllTransfer,
|
.srcStageMask = vk::PipelineStageFlagBits2::eTransfer,
|
||||||
.srcAccessMask = vk::AccessFlagBits2::eTransferWrite,
|
.srcAccessMask = vk::AccessFlagBits2::eTransferWrite | vk::AccessFlagBits2::eTransferRead,
|
||||||
.dstStageMask = vk::PipelineStageFlagBits2::eColorAttachmentOutput,
|
.dstStageMask = vk::PipelineStageFlagBits2::eColorAttachmentOutput,
|
||||||
.dstAccessMask = vk::AccessFlagBits2::eColorAttachmentWrite,
|
.dstAccessMask = vk::AccessFlagBits2::eColorAttachmentRead,
|
||||||
.oldLayout = vk::ImageLayout::eTransferDstOptimal,
|
.oldLayout = vk::ImageLayout::eTransferDstOptimal,
|
||||||
.newLayout = vk::ImageLayout::eColorAttachmentOptimal,
|
.newLayout = vk::ImageLayout::eColorAttachmentOptimal,
|
||||||
.srcQueueFamilyIndex = queueAllocation.m_Family,
|
.srcQueueFamilyIndex = vk::QueueFamilyIgnored,
|
||||||
.dstQueueFamilyIndex = queueAllocation.m_Family,
|
.dstQueueFamilyIndex = vk::QueueFamilyIgnored,
|
||||||
.subresourceRange = subresourceRange,
|
.subresourceRange = subresourceRange,
|
||||||
};
|
};
|
||||||
vk::DependencyInfo preGuiDependencies = {
|
vk::DependencyInfo preGuiDependencies = {
|
||||||
.imageMemoryBarrierCount = 1,
|
.imageMemoryBarrierCount = 1,
|
||||||
|
|
@ -373,8 +373,8 @@ main(int, char **)
|
||||||
.dstAccessMask = vk::AccessFlagBits2::eNone,
|
.dstAccessMask = vk::AccessFlagBits2::eNone,
|
||||||
.oldLayout = vk::ImageLayout::eColorAttachmentOptimal,
|
.oldLayout = vk::ImageLayout::eColorAttachmentOptimal,
|
||||||
.newLayout = vk::ImageLayout::ePresentSrcKHR,
|
.newLayout = vk::ImageLayout::ePresentSrcKHR,
|
||||||
.srcQueueFamilyIndex = queueAllocation.m_Family,
|
.srcQueueFamilyIndex = vk::QueueFamilyIgnored,
|
||||||
.dstQueueFamilyIndex = queueAllocation.m_Family,
|
.dstQueueFamilyIndex = vk::QueueFamilyIgnored,
|
||||||
.subresourceRange = subresourceRange,
|
.subresourceRange = subresourceRange,
|
||||||
};
|
};
|
||||||
vk::DependencyInfo prePresentDependencies = {
|
vk::DependencyInfo prePresentDependencies = {
|
||||||
|
|
@ -523,8 +523,8 @@ main(int, char **)
|
||||||
vk::ImageView currentSwapchainImageView = swapchain.m_ImageViews[imageIndex];
|
vk::ImageView currentSwapchainImageView = swapchain.m_ImageViews[imageIndex];
|
||||||
vk::CommandBuffer cmd = currentFrame->m_CommandBuffer;
|
vk::CommandBuffer cmd = currentFrame->m_CommandBuffer;
|
||||||
|
|
||||||
auto& currentDepthImage = depthImages[currentFrame->m_FrameIdx];
|
auto ¤tDepthImage = depthImages[currentFrame->m_FrameIdx];
|
||||||
auto& currentAttachment = attachmentImages[currentFrame->m_FrameIdx];
|
auto ¤tAttachment = attachmentImages[currentFrame->m_FrameIdx];
|
||||||
|
|
||||||
if (currentAttachment->m_Extent.width != internalResolution.width ||
|
if (currentAttachment->m_Extent.width != internalResolution.width ||
|
||||||
currentAttachment->m_Extent.height != internalResolution.height)
|
currentAttachment->m_Extent.height != internalResolution.height)
|
||||||
|
|
@ -682,7 +682,7 @@ main(int, char **)
|
||||||
|
|
||||||
AbortIfFailed(cmd.end());
|
AbortIfFailed(cmd.end());
|
||||||
|
|
||||||
vk::PipelineStageFlags waitDstStage = vk::PipelineStageFlagBits::eColorAttachmentOutput;
|
vk::PipelineStageFlags waitDstStage = vk::PipelineStageFlagBits::eTransfer;
|
||||||
vk::SubmitInfo submitInfo = {
|
vk::SubmitInfo submitInfo = {
|
||||||
.waitSemaphoreCount = 1,
|
.waitSemaphoreCount = 1,
|
||||||
.pWaitSemaphores = ¤tFrame->m_ImageAcquireSem,
|
.pWaitSemaphores = ¤tFrame->m_ImageAcquireSem,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue