Fixes for Vulkan
This commit is contained in:
@@ -25,7 +25,8 @@ void GPUBufferViewVulkan::Init(GPUDeviceVulkan* device, GPUBufferVulkan* owner,
|
|||||||
viewInfo.format = RenderToolsVulkan::ToVulkanFormat(format);
|
viewInfo.format = RenderToolsVulkan::ToVulkanFormat(format);
|
||||||
viewInfo.offset = 0;
|
viewInfo.offset = 0;
|
||||||
viewInfo.range = Size;
|
viewInfo.range = Size;
|
||||||
ASSERT_LOW_LAYER(viewInfo.format != VK_FORMAT_UNDEFINED);
|
if (viewInfo.format == VK_FORMAT_UNDEFINED)
|
||||||
|
return; // Skip for structured buffers that use custom structure type and have unknown format
|
||||||
VALIDATE_VULKAN_RESULT(vkCreateBufferView(device->Device, &viewInfo, nullptr, &View));
|
VALIDATE_VULKAN_RESULT(vkCreateBufferView(device->Device, &viewInfo, nullptr, &View));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1309,6 +1309,11 @@ void GPUContextVulkan::UpdateBuffer(GPUBuffer* buffer, const void* data, uint32
|
|||||||
|
|
||||||
const auto bufferVulkan = static_cast<GPUBufferVulkan*>(buffer);
|
const auto bufferVulkan = static_cast<GPUBufferVulkan*>(buffer);
|
||||||
|
|
||||||
|
// Memory transfer barrier
|
||||||
|
// TODO: batch pipeline barriers
|
||||||
|
const VkMemoryBarrier barrierBefore = { VK_STRUCTURE_TYPE_MEMORY_BARRIER, nullptr, VK_ACCESS_MEMORY_WRITE_BIT, VK_ACCESS_MEMORY_READ_BIT };
|
||||||
|
vkCmdPipelineBarrier(cmdBuffer->GetHandle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1, &barrierBefore, 0, nullptr, 0, nullptr);
|
||||||
|
|
||||||
// Use direct update for small buffers
|
// Use direct update for small buffers
|
||||||
if (size <= 16 * 1024)
|
if (size <= 16 * 1024)
|
||||||
{
|
{
|
||||||
@@ -1331,6 +1336,11 @@ void GPUContextVulkan::UpdateBuffer(GPUBuffer* buffer, const void* data, uint32
|
|||||||
|
|
||||||
_device->StagingManager.ReleaseBuffer(cmdBuffer, staging);
|
_device->StagingManager.ReleaseBuffer(cmdBuffer, staging);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Memory transfer barrier
|
||||||
|
// TODO: batch pipeline barriers
|
||||||
|
const VkMemoryBarrier barrierAfter = { VK_STRUCTURE_TYPE_MEMORY_BARRIER, nullptr, VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT };
|
||||||
|
vkCmdPipelineBarrier(cmdBuffer->GetHandle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 1, &barrierAfter, 0, nullptr, 0, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GPUContextVulkan::CopyBuffer(GPUBuffer* dstBuffer, GPUBuffer* srcBuffer, uint32 size, uint32 dstOffset, uint32 srcOffset)
|
void GPUContextVulkan::CopyBuffer(GPUBuffer* dstBuffer, GPUBuffer* srcBuffer, uint32 size, uint32 dstOffset, uint32 srcOffset)
|
||||||
|
|||||||
@@ -195,6 +195,7 @@ bool GPUSwapChainVulkan::CreateSwapChain(int32 width, int32 height)
|
|||||||
LOG(Warning, "Failed to create Vulkan surface.");
|
LOG(Warning, "Failed to create Vulkan surface.");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
_memoryUsage = 1;
|
||||||
|
|
||||||
const auto& gpu = _device->Adapter->Gpu;
|
const auto& gpu = _device->Adapter->Gpu;
|
||||||
|
|
||||||
|
|||||||
@@ -702,7 +702,6 @@ void DrawEmitterGPU(RenderContext& renderContext, ParticleBuffer* buffer, DrawCa
|
|||||||
// TODO: model LOD picking for particles?
|
// TODO: model LOD picking for particles?
|
||||||
int32 lodIndex = 0;
|
int32 lodIndex = 0;
|
||||||
ModelLOD& lod = model->LODs[lodIndex];
|
ModelLOD& lod = model->LODs[lodIndex];
|
||||||
drawCalls += lod.Meshes.Count();
|
|
||||||
for (int32 meshIndex = 0; meshIndex < lod.Meshes.Count(); meshIndex++)
|
for (int32 meshIndex = 0; meshIndex < lod.Meshes.Count(); meshIndex++)
|
||||||
{
|
{
|
||||||
Mesh& mesh = lod.Meshes[meshIndex];
|
Mesh& mesh = lod.Meshes[meshIndex];
|
||||||
|
|||||||
Reference in New Issue
Block a user