Files
Seele/src/Engine/Graphics/Vulkan/VulkanBuffer.cpp
T

536 lines
18 KiB
C++
Raw Normal View History

#include "VulkanGraphicsResources.h"
2020-03-24 21:05:32 +01:00
#include "VulkanInitializer.h"
2020-04-12 15:47:19 +02:00
#include "VulkanGraphics.h"
#include "VulkanCommandBuffer.h"
#include "VulkanAllocator.h"
2020-03-24 21:05:32 +01:00
using namespace Seele;
using namespace Seele::Vulkan;
2020-04-12 15:47:19 +02:00
struct PendingBuffer
{
uint64 offset;
uint64 size;
2022-01-12 14:40:26 +01:00
PStagingBuffer stagingBuffer;
Gfx::QueueType prevQueue;
bool bWriteOnly;
2020-04-12 15:47:19 +02:00
};
2022-04-17 09:10:20 +02:00
static std::map<ShaderBuffer *, PendingBuffer> pendingBuffers;
ShaderBuffer::ShaderBuffer(PGraphics graphics, uint64 size, VkBufferUsageFlags usage, Gfx::QueueType& queueType, bool bDynamic)
2022-01-12 14:40:26 +01:00
: graphics(graphics)
, currentBuffer(0)
, size(size)
, owner(queueType)
{
2022-01-12 14:40:26 +01:00
if(bDynamic)
{
numBuffers = Gfx::numFramesBuffered;
}
else
{
numBuffers = 1;
}
usage |= VK_BUFFER_USAGE_TRANSFER_DST_BIT;
usage |= VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
VkBufferCreateInfo info =
init::BufferCreateInfo(
usage,
size);
info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
uint32 queueFamilyIndex = graphics->getFamilyMapping().getQueueTypeFamilyIndex(queueType);
info.pQueueFamilyIndices = &queueFamilyIndex;
info.queueFamilyIndexCount = 1;
VkBufferMemoryRequirementsInfo2 bufferReqInfo;
bufferReqInfo.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2;
bufferReqInfo.pNext = nullptr;
VkMemoryDedicatedRequirements dedicatedRequirements;
dedicatedRequirements.sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS;
dedicatedRequirements.pNext = nullptr;
VkMemoryRequirements2 memRequirements;
memRequirements.sType = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2;
memRequirements.pNext = &dedicatedRequirements;
for (uint32 i = 0; i < numBuffers; ++i)
{
VK_CHECK(vkCreateBuffer(graphics->getDevice(), &info, nullptr, &buffers[i].buffer));
bufferReqInfo.buffer = buffers[i].buffer;
vkGetBufferMemoryRequirements2(graphics->getDevice(), &bufferReqInfo, &memRequirements);
2022-04-17 09:10:20 +02:00
buffers[i].allocation = graphics->getAllocator()->allocate(memRequirements, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, buffers[i].buffer);
2022-01-12 14:40:26 +01:00
vkBindBufferMemory(graphics->getDevice(), buffers[i].buffer, buffers[i].allocation->getHandle(), buffers[i].allocation->getOffset());
}
}
2020-09-19 14:36:50 +02:00
ShaderBuffer::~ShaderBuffer()
{
2022-11-29 16:34:42 +01:00
//PCmdBuffer cmdBuffer = graphics->getQueueCommands(owner)->getCommands();
//VkDevice device = graphics->getDevice();
//auto deletionLambda = [cmdBuffer, device](VkBuffer) -> void
//{
// //co_await cmdBuffer->asyncWait();
// //vkDestroyBuffer(device, buffer, nullptr);
// //co_return;
//};
//for (uint32 i = 0; i < numBuffers; ++i)
//{
// deletionLambda(buffers[i].buffer);
// buffers[i].allocation = nullptr;
//}
2022-01-12 14:40:26 +01:00
graphics = nullptr;
}
2020-10-03 11:00:10 +02:00
VkDeviceSize ShaderBuffer::getOffset() const
{
2022-01-12 14:40:26 +01:00
return buffers[currentBuffer].allocation->getOffset();
2020-10-03 11:00:10 +02:00
}
2020-09-19 14:36:50 +02:00
void ShaderBuffer::executeOwnershipBarrier(Gfx::QueueType newOwner)
2020-04-12 15:47:19 +02:00
{
2022-01-12 14:40:26 +01:00
VkBufferMemoryBarrier barrier =
init::BufferMemoryBarrier();
PCommandBufferManager sourceManager = graphics->getQueueCommands(owner);
PCommandBufferManager dstManager = nullptr;
VkPipelineStageFlags srcStage = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
VkPipelineStageFlags dstStage = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
Gfx::QueueFamilyMapping mapping = graphics->getFamilyMapping();
barrier.srcQueueFamilyIndex = mapping.getQueueTypeFamilyIndex(owner);
barrier.dstQueueFamilyIndex = mapping.getQueueTypeFamilyIndex(newOwner);
assert(barrier.srcQueueFamilyIndex != barrier.dstQueueFamilyIndex);
if (owner == Gfx::QueueType::TRANSFER || owner == Gfx::QueueType::DEDICATED_TRANSFER)
{
barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
srcStage = VK_PIPELINE_STAGE_TRANSFER_BIT;
}
else if (owner == Gfx::QueueType::COMPUTE)
{
barrier.srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT;
srcStage = VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT;
}
else if (owner == Gfx::QueueType::GRAPHICS)
{
barrier.srcAccessMask = getSourceAccessMask();
srcStage = VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT;
}
if (newOwner == Gfx::QueueType::TRANSFER)
{
barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
dstStage = VK_PIPELINE_STAGE_TRANSFER_BIT;
dstManager = graphics->getTransferCommands();
}
else if (newOwner == Gfx::QueueType::DEDICATED_TRANSFER)
{
barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
dstStage = VK_PIPELINE_STAGE_TRANSFER_BIT;
dstManager = graphics->getDedicatedTransferCommands();
}
else if (newOwner == Gfx::QueueType::COMPUTE)
{
barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
dstStage = VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT;
dstManager = graphics->getComputeCommands();
}
else if (newOwner == Gfx::QueueType::GRAPHICS)
{
barrier.dstAccessMask = getDestAccessMask();
dstStage = VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT;
dstManager = graphics->getGraphicsCommands();
}
VkCommandBuffer srcCommand = sourceManager->getCommands()->getHandle();
VkCommandBuffer dstCommand = dstManager->getCommands()->getHandle();
VkBufferMemoryBarrier dynamicBarriers[Gfx::numFramesBuffered];
barrier.offset = 0;
barrier.size = size;
for (uint32 i = 0; i < numBuffers; ++i)
{
dynamicBarriers[i] = barrier;
dynamicBarriers[i].buffer = buffers[i].buffer;
}
vkCmdPipelineBarrier(srcCommand, srcStage, srcStage, 0, 0, nullptr, numBuffers, dynamicBarriers, 0, nullptr);
vkCmdPipelineBarrier(dstCommand, dstStage, dstStage, 0, 0, nullptr, numBuffers, dynamicBarriers, 0, nullptr);
sourceManager->submitCommands();
2021-05-10 23:57:55 +02:00
}
void ShaderBuffer::executePipelineBarrier(VkAccessFlags srcAccess, VkPipelineStageFlags srcStage,
VkAccessFlags dstAccess, VkPipelineStageFlags dstStage)
{
2022-01-12 14:40:26 +01:00
PCmdBuffer commandBuffer = graphics->getQueueCommands(owner)->getCommands();
VkBufferMemoryBarrier barrier = init::BufferMemoryBarrier();
barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
barrier.dstAccessMask = dstAccess;
barrier.srcAccessMask = srcAccess;
barrier.offset = 0;
barrier.size = size;
VkBufferMemoryBarrier dynamicBarriers[Gfx::numFramesBuffered];
for(uint32 i = 0; i < numBuffers; ++i)
{
dynamicBarriers[i] = barrier;
dynamicBarriers[i].buffer = buffers[i].buffer;
}
vkCmdPipelineBarrier(commandBuffer->getHandle(), srcStage, dstStage, 0, 0, nullptr, numBuffers, dynamicBarriers, 0, nullptr);
2020-04-12 15:47:19 +02:00
}
2020-09-19 14:36:50 +02:00
void *ShaderBuffer::lock(bool bWriteOnly)
{
return lockRegion(0, size, bWriteOnly);
}
void *ShaderBuffer::lockRegion(uint64 regionOffset, uint64 regionSize, bool bWriteOnly)
2020-04-12 15:47:19 +02:00
{
2022-01-12 14:40:26 +01:00
void *data = nullptr;
2020-04-12 15:47:19 +02:00
2022-01-12 14:40:26 +01:00
/*if (bVolatile)
{
if (lockMode == RLM_ReadOnly)
{
assert(0);
}
else
{
throw new std::logic_error("TODO implement volatile buffers");
//device->getRHIDevice()->getTemp
}
}*/
//assert(bStatic || bDynamic || bUAV);
2020-04-12 15:47:19 +02:00
2022-01-12 14:40:26 +01:00
PendingBuffer pending;
pending.bWriteOnly = bWriteOnly;
pending.prevQueue = owner;
pending.offset = regionOffset;
pending.size = regionSize;
2022-01-12 14:40:26 +01:00
if (bWriteOnly)
{
//requestOwnershipTransfer(Gfx::QueueType::DEDICATED_TRANSFER);
PStagingBuffer stagingBuffer = graphics->getStagingManager()->allocateStagingBuffer(regionSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT);
2022-01-12 14:40:26 +01:00
data = stagingBuffer->getMappedPointer();
pending.stagingBuffer = stagingBuffer;
}
else
{
PCmdBuffer current = graphics->getQueueCommands(owner)->getCommands();
graphics->getQueueCommands(owner)->submitCommands();
current->waitForCommand();
2020-04-12 15:47:19 +02:00
2022-01-12 14:40:26 +01:00
requestOwnershipTransfer(Gfx::QueueType::DEDICATED_TRANSFER);
VkCommandBuffer handle = graphics->getQueueCommands(owner)->getCommands()->getHandle();
2020-04-12 15:47:19 +02:00
2022-01-12 14:40:26 +01:00
VkBufferMemoryBarrier barrier =
init::BufferMemoryBarrier();
barrier.srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT;
barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
barrier.buffer = buffers[currentBuffer].buffer;
barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
barrier.offset = 0;
barrier.size = size;
vkCmdPipelineBarrier(handle, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr, 1, &barrier, 0, nullptr);
2020-04-12 15:47:19 +02:00
2022-01-12 14:40:26 +01:00
PStagingBuffer stagingBuffer = graphics->getStagingManager()->allocateStagingBuffer(size, VK_BUFFER_USAGE_TRANSFER_DST_BIT, true);
2020-04-12 15:47:19 +02:00
2022-01-12 14:40:26 +01:00
VkBufferCopy regions;
regions.size = size;
regions.srcOffset = 0;
regions.dstOffset = 0;
2020-04-12 15:47:19 +02:00
2022-01-12 14:40:26 +01:00
vkCmdCopyBuffer(handle, buffers[currentBuffer].buffer, stagingBuffer->getHandle(), 1, &regions);
2020-04-12 15:47:19 +02:00
2022-01-12 14:40:26 +01:00
graphics->getQueueCommands(owner)->submitCommands();
vkQueueWaitIdle(graphics->getQueueCommands(owner)->getQueue()->getHandle());
2020-04-12 15:47:19 +02:00
2022-01-12 14:40:26 +01:00
stagingBuffer->flushMappedMemory();
pending.stagingBuffer = stagingBuffer;
2020-04-12 15:47:19 +02:00
2022-01-12 14:40:26 +01:00
data = stagingBuffer->getMappedPointer();
}
pendingBuffers[this] = pending;
2020-04-12 15:47:19 +02:00
2022-01-12 14:40:26 +01:00
assert(data);
return data;
2020-04-12 15:47:19 +02:00
}
2020-09-19 14:36:50 +02:00
void ShaderBuffer::unlock()
2020-04-12 15:47:19 +02:00
{
2022-01-12 14:40:26 +01:00
auto found = pendingBuffers.find(this);
if (found != pendingBuffers.end())
{
2022-04-17 09:10:20 +02:00
PendingBuffer pending = found->second;
2022-01-12 14:40:26 +01:00
pending.stagingBuffer->flushMappedMemory();
pendingBuffers.erase(this);
if (pending.bWriteOnly)
{
PStagingBuffer stagingBuffer = pending.stagingBuffer;
PCmdBuffer cmdBuffer = graphics->getQueueCommands(owner)->getCommands();
VkCommandBuffer cmdHandle = cmdBuffer->getHandle();
2020-04-12 15:47:19 +02:00
2022-01-12 14:40:26 +01:00
VkBufferCopy region;
std::memset(&region, 0, sizeof(VkBufferCopy));
region.size = pending.size;
region.dstOffset = pending.offset;
2022-01-12 14:40:26 +01:00
vkCmdCopyBuffer(cmdHandle, stagingBuffer->getHandle(), buffers[currentBuffer].buffer, 1, &region);
graphics->getQueueCommands(owner)->submitCommands();
}
//requestOwnershipTransfer(pending.prevQueue);
graphics->getStagingManager()->releaseStagingBuffer(pending.stagingBuffer);
}
2020-04-12 15:47:19 +02:00
}
UniformBuffer::UniformBuffer(PGraphics graphics, const UniformBufferCreateInfo &createInfo)
2022-01-12 14:40:26 +01:00
: Gfx::UniformBuffer(graphics->getFamilyMapping(), createInfo.resourceData)
, Vulkan::ShaderBuffer(graphics, createInfo.resourceData.size, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, currentOwner, createInfo.bDynamic)
, dedicatedStagingBuffer(nullptr)
2020-04-12 15:47:19 +02:00
{
2022-01-12 14:40:26 +01:00
if(createInfo.bDynamic)
{
dedicatedStagingBuffer = graphics->getStagingManager()->allocateStagingBuffer(createInfo.resourceData.size, VK_BUFFER_USAGE_TRANSFER_SRC_BIT);
}
if (createInfo.resourceData.data != nullptr)
{
void *data = lock();
std::memcpy(data, createInfo.resourceData.data, createInfo.resourceData.size);
unlock();
}
2020-04-12 15:47:19 +02:00
}
UniformBuffer::~UniformBuffer()
{
}
2020-04-12 15:47:19 +02:00
2021-04-25 23:43:40 +02:00
bool UniformBuffer::updateContents(const BulkResourceData &resourceData)
{
if(!Gfx::UniformBuffer::updateContents(resourceData))
2022-01-12 14:40:26 +01:00
{
// no update was performed, skip
return false;
}
2021-04-25 23:43:40 +02:00
void* data = lock();
std::memcpy(data, resourceData.data, resourceData.size);
unlock();
2022-01-12 14:40:26 +01:00
return true;
2021-04-25 23:43:40 +02:00
}
void* UniformBuffer::lock(bool bWriteOnly)
{
2022-01-12 14:40:26 +01:00
if(dedicatedStagingBuffer != nullptr)
{
return dedicatedStagingBuffer->getMappedPointer();
}
return ShaderBuffer::lock(bWriteOnly);
}
void UniformBuffer::unlock()
{
2022-01-12 14:40:26 +01:00
if(dedicatedStagingBuffer != nullptr)
{
dedicatedStagingBuffer->flushMappedMemory();
PCmdBuffer cmdBuffer = graphics->getQueueCommands(currentOwner)->getCommands();
VkCommandBuffer cmdHandle = cmdBuffer->getHandle();
2022-01-12 14:40:26 +01:00
VkBufferCopy region;
std::memset(&region, 0, sizeof(VkBufferCopy));
region.size = ShaderBuffer::size;
vkCmdCopyBuffer(cmdHandle, dedicatedStagingBuffer->getHandle(), buffers[currentBuffer].buffer, 1, &region);
graphics->getQueueCommands(currentOwner)->submitCommands();
}
else
{
ShaderBuffer::unlock();
}
}
2020-06-02 11:46:18 +02:00
void UniformBuffer::requestOwnershipTransfer(Gfx::QueueType newOwner)
{
2022-01-12 14:40:26 +01:00
Gfx::QueueOwnedResource::transferOwnership(newOwner);
2020-06-02 11:46:18 +02:00
}
void UniformBuffer::executeOwnershipBarrier(Gfx::QueueType newOwner)
{
2022-01-12 14:40:26 +01:00
Vulkan::ShaderBuffer::executeOwnershipBarrier(newOwner);
2020-06-02 11:46:18 +02:00
}
2021-05-10 23:57:55 +02:00
void UniformBuffer::executePipelineBarrier(VkAccessFlags srcAccess, VkPipelineStageFlags srcStage,
VkAccessFlags dstAccess, VkPipelineStageFlags dstStage)
{
Vulkan::ShaderBuffer::executePipelineBarrier(srcAccess, srcStage, dstAccess, dstStage);
}
2020-04-12 15:47:19 +02:00
VkAccessFlags UniformBuffer::getSourceAccessMask()
{
2022-01-12 14:40:26 +01:00
return VK_ACCESS_MEMORY_WRITE_BIT;
2020-04-12 15:47:19 +02:00
}
VkAccessFlags UniformBuffer::getDestAccessMask()
{
2022-01-12 14:40:26 +01:00
return VK_ACCESS_UNIFORM_READ_BIT;
2020-04-12 15:47:19 +02:00
}
2021-05-10 23:57:55 +02:00
StructuredBuffer::StructuredBuffer(PGraphics graphics, const StructuredBufferCreateInfo &resourceData)
2023-01-21 18:43:21 +01:00
: Gfx::StructuredBuffer(graphics->getFamilyMapping(), resourceData.stride, resourceData.resourceData.size / resourceData.stride, resourceData.resourceData)
2022-01-12 14:40:26 +01:00
, Vulkan::ShaderBuffer(graphics, resourceData.resourceData.size, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, currentOwner, resourceData.bDynamic)
2020-04-12 15:47:19 +02:00
{
2022-01-12 14:40:26 +01:00
if (resourceData.resourceData.data != nullptr)
{
void *data = lock();
std::memcpy(data, resourceData.resourceData.data, resourceData.resourceData.size);
unlock();
}
2020-04-12 15:47:19 +02:00
}
StructuredBuffer::~StructuredBuffer()
{
}
bool StructuredBuffer::updateContents(const BulkResourceData &resourceData)
{
2023-01-21 18:43:21 +01:00
assert(resourceData.size <= getSize());
Gfx::StructuredBuffer::updateContents(resourceData);
2022-01-12 14:40:26 +01:00
//We always want to update, as the contents could be different on the GPU
void* data = lock();
std::memcpy(data, resourceData.data, resourceData.size);
unlock();
2022-01-12 14:40:26 +01:00
return true;
}
void* StructuredBuffer::lock(bool bWriteOnly)
{
2022-01-12 14:40:26 +01:00
if(dedicatedStagingBuffer != nullptr)
{
return dedicatedStagingBuffer->getMappedPointer();
}
return ShaderBuffer::lock(bWriteOnly);
}
void StructuredBuffer::unlock()
{
2022-01-12 14:40:26 +01:00
if(dedicatedStagingBuffer != nullptr)
{
dedicatedStagingBuffer->flushMappedMemory();
PCmdBuffer cmdBuffer = graphics->getQueueCommands(currentOwner)->getCommands();
VkCommandBuffer cmdHandle = cmdBuffer->getHandle();
2022-01-12 14:40:26 +01:00
VkBufferCopy region;
std::memset(&region, 0, sizeof(VkBufferCopy));
region.size = ShaderBuffer::size;
vkCmdCopyBuffer(cmdHandle, dedicatedStagingBuffer->getHandle(), buffers[currentBuffer].buffer, 1, &region);
graphics->getQueueCommands(currentOwner)->submitCommands();
}
else
{
ShaderBuffer::unlock();
}
}
2020-06-02 11:46:18 +02:00
void StructuredBuffer::requestOwnershipTransfer(Gfx::QueueType newOwner)
{
2022-01-12 14:40:26 +01:00
Gfx::QueueOwnedResource::transferOwnership(newOwner);
2020-06-02 11:46:18 +02:00
}
void StructuredBuffer::executeOwnershipBarrier(Gfx::QueueType newOwner)
{
2022-01-12 14:40:26 +01:00
Vulkan::ShaderBuffer::executeOwnershipBarrier(newOwner);
2020-06-02 11:46:18 +02:00
}
2021-05-10 23:57:55 +02:00
void StructuredBuffer::executePipelineBarrier(VkAccessFlags srcAccess, VkPipelineStageFlags srcStage,
VkAccessFlags dstAccess, VkPipelineStageFlags dstStage)
{
Vulkan::ShaderBuffer::executePipelineBarrier(srcAccess, srcStage, dstAccess, dstStage);
}
2020-04-12 15:47:19 +02:00
VkAccessFlags StructuredBuffer::getSourceAccessMask()
{
2022-01-12 14:40:26 +01:00
return VK_ACCESS_MEMORY_WRITE_BIT;
2020-04-12 15:47:19 +02:00
}
VkAccessFlags StructuredBuffer::getDestAccessMask()
{
2022-01-12 14:40:26 +01:00
return VK_ACCESS_MEMORY_READ_BIT;
2020-04-12 15:47:19 +02:00
}
2020-05-05 01:51:13 +02:00
VertexBuffer::VertexBuffer(PGraphics graphics, const VertexBufferCreateInfo &resourceData)
2022-01-12 14:40:26 +01:00
: Gfx::VertexBuffer(graphics->getFamilyMapping(), resourceData.numVertices, resourceData.vertexSize, resourceData.resourceData.owner)
, Vulkan::ShaderBuffer(graphics, resourceData.resourceData.size, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, currentOwner)
2020-04-12 15:47:19 +02:00
{
2022-01-12 14:40:26 +01:00
if (resourceData.resourceData.data != nullptr)
{
void *data = lock();
std::memcpy(data, resourceData.resourceData.data, resourceData.resourceData.size);
unlock();
}
2020-04-12 15:47:19 +02:00
}
VertexBuffer::~VertexBuffer()
{
}
void VertexBuffer::updateRegion(BulkResourceData update)
{
void* data = lockRegion(update.offset, update.size);
std::memcpy(data, update.data, update.size);
unlock();
}
2020-06-02 11:46:18 +02:00
void VertexBuffer::requestOwnershipTransfer(Gfx::QueueType newOwner)
{
2022-01-12 14:40:26 +01:00
Gfx::QueueOwnedResource::transferOwnership(newOwner);
2020-06-02 11:46:18 +02:00
}
void VertexBuffer::executeOwnershipBarrier(Gfx::QueueType newOwner)
{
2022-01-12 14:40:26 +01:00
Vulkan::ShaderBuffer::executeOwnershipBarrier(newOwner);
2020-06-02 11:46:18 +02:00
}
2021-05-10 23:57:55 +02:00
void VertexBuffer::executePipelineBarrier(VkAccessFlags srcAccess, VkPipelineStageFlags srcStage,
VkAccessFlags dstAccess, VkPipelineStageFlags dstStage)
{
Vulkan::ShaderBuffer::executePipelineBarrier(srcAccess, srcStage, dstAccess, dstStage);
}
2020-04-12 15:47:19 +02:00
VkAccessFlags VertexBuffer::getSourceAccessMask()
{
2022-01-12 14:40:26 +01:00
return VK_ACCESS_MEMORY_WRITE_BIT;
2020-04-12 15:47:19 +02:00
}
VkAccessFlags VertexBuffer::getDestAccessMask()
{
2022-01-12 14:40:26 +01:00
return VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT;
2020-04-12 15:47:19 +02:00
}
2020-05-05 01:51:13 +02:00
IndexBuffer::IndexBuffer(PGraphics graphics, const IndexBufferCreateInfo &resourceData)
2022-01-12 14:40:26 +01:00
: Gfx::IndexBuffer(graphics->getFamilyMapping(), resourceData.resourceData.size, resourceData.indexType, resourceData.resourceData.owner)
, Vulkan::ShaderBuffer(graphics, resourceData.resourceData.size, VK_BUFFER_USAGE_INDEX_BUFFER_BIT, currentOwner)
2020-04-12 15:47:19 +02:00
{
2022-01-12 14:40:26 +01:00
if (resourceData.resourceData.data != nullptr)
{
void *data = lock();
std::memcpy(data, resourceData.resourceData.data, resourceData.resourceData.size);
unlock();
}
2020-04-12 15:47:19 +02:00
}
IndexBuffer::~IndexBuffer()
{
}
2020-06-02 11:46:18 +02:00
void IndexBuffer::requestOwnershipTransfer(Gfx::QueueType newOwner)
{
2022-01-12 14:40:26 +01:00
Gfx::QueueOwnedResource::transferOwnership(newOwner);
2020-06-02 11:46:18 +02:00
}
void IndexBuffer::executeOwnershipBarrier(Gfx::QueueType newOwner)
{
2022-01-12 14:40:26 +01:00
Vulkan::ShaderBuffer::executeOwnershipBarrier(newOwner);
2020-06-02 11:46:18 +02:00
}
2021-05-10 23:57:55 +02:00
void IndexBuffer::executePipelineBarrier(VkAccessFlags srcAccess, VkPipelineStageFlags srcStage,
VkAccessFlags dstAccess, VkPipelineStageFlags dstStage)
{
Vulkan::ShaderBuffer::executePipelineBarrier(srcAccess, srcStage, dstAccess, dstStage);
}
2020-04-12 15:47:19 +02:00
VkAccessFlags IndexBuffer::getSourceAccessMask()
{
2022-01-12 14:40:26 +01:00
return VK_ACCESS_MEMORY_WRITE_BIT;
2020-04-12 15:47:19 +02:00
}
VkAccessFlags IndexBuffer::getDestAccessMask()
{
2022-01-12 14:40:26 +01:00
return VK_ACCESS_INDEX_READ_BIT;
2020-04-12 15:47:19 +02:00
}