aboutsummaryrefslogtreecommitdiff
path: root/src/vulkan/buffer_descriptor.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/vulkan/buffer_descriptor.cc')
-rw-r--r--src/vulkan/buffer_descriptor.cc59
1 files changed, 38 insertions, 21 deletions
diff --git a/src/vulkan/buffer_descriptor.cc b/src/vulkan/buffer_descriptor.cc
index d58e59d..360adb6 100644
--- a/src/vulkan/buffer_descriptor.cc
+++ b/src/vulkan/buffer_descriptor.cc
@@ -23,6 +23,7 @@
#include "src/engine.h"
#include "src/make_unique.h"
#include "src/vulkan/command_buffer.h"
+#include "src/vulkan/device.h"
namespace amber {
namespace vulkan {
@@ -32,10 +33,11 @@ BufferDescriptor::BufferDescriptor(Buffer* buffer,
Device* device,
uint32_t desc_set,
uint32_t binding)
- : Descriptor(type, device, desc_set, binding), amber_buffer_(buffer) {
- assert(type == DescriptorType::kStorageBuffer ||
- type == DescriptorType::kUniformBuffer);
-}
+ : device_(device),
+ amber_buffer_(buffer),
+ type_(type),
+ descriptor_set_(desc_set),
+ binding_(binding) {}
BufferDescriptor::~BufferDescriptor() = default;
@@ -56,17 +58,18 @@ Result BufferDescriptor::CreateResourceIfNeeded(
transfer_buffer_ =
MakeUnique<TransferBuffer>(device_, size_in_bytes, properties);
- Result r = transfer_buffer_->Initialize(GetVkBufferUsage() |
- VK_BUFFER_USAGE_TRANSFER_SRC_BIT |
- VK_BUFFER_USAGE_TRANSFER_DST_BIT);
+ Result r = transfer_buffer_->Initialize(
+ (IsStorageBuffer() ? VK_BUFFER_USAGE_STORAGE_BUFFER_BIT
+ : VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) |
+ VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT);
if (!r.IsSuccess())
return r;
- SetUpdateDescriptorSetNeeded();
+ is_descriptor_set_update_needed_ = true;
return {};
}
-Result BufferDescriptor::RecordCopyDataToResourceIfNeeded(
+void BufferDescriptor::RecordCopyDataToResourceIfNeeded(
CommandBuffer* command) {
if (amber_buffer_ && !amber_buffer_->ValuePtr()->empty()) {
transfer_buffer_->UpdateMemoryWithRawData(*amber_buffer_->ValuePtr());
@@ -74,14 +77,12 @@ Result BufferDescriptor::RecordCopyDataToResourceIfNeeded(
}
transfer_buffer_->CopyToDevice(command);
- return {};
}
Result BufferDescriptor::RecordCopyDataToHost(CommandBuffer* command) {
if (!transfer_buffer_) {
return Result(
- "Vulkan: BufferDescriptor::RecordCopyDataToHost() |vk_buffer| is "
- "empty");
+ "Vulkan: BufferDescriptor::RecordCopyDataToHost() no transfer buffer");
}
return transfer_buffer_->CopyToHost(command);
@@ -90,8 +91,8 @@ Result BufferDescriptor::RecordCopyDataToHost(CommandBuffer* command) {
Result BufferDescriptor::MoveResourceToBufferOutput() {
if (!transfer_buffer_) {
return Result(
- "Vulkan: BufferDescriptor::MoveResourceToBufferOutput() |vk_buffer| "
- "is empty");
+ "Vulkan: BufferDescriptor::MoveResourceToBufferOutput() no transfer"
+ " buffer");
}
// Only need to copy the buffer back if we have an attached amber buffer to
@@ -100,8 +101,8 @@ Result BufferDescriptor::MoveResourceToBufferOutput() {
void* resource_memory_ptr = transfer_buffer_->HostAccessibleMemoryPtr();
if (!resource_memory_ptr) {
return Result(
- "Vulkan: BufferDescriptor::MoveResourceToBufferOutput() |vk_buffer| "
- "has nullptr host accessible memory");
+ "Vulkan: BufferDescriptor::MoveResourceToBufferOutput() "
+ "no host accessible memory pointer");
}
if (!amber_buffer_->ValuePtr()->empty()) {
@@ -121,18 +122,29 @@ Result BufferDescriptor::MoveResourceToBufferOutput() {
return {};
}
-Result BufferDescriptor::UpdateDescriptorSetIfNeeded(
+void BufferDescriptor::UpdateDescriptorSetIfNeeded(
VkDescriptorSet descriptor_set) {
- if (!IsDescriptorSetUpdateNeeded())
- return {};
+ if (!is_descriptor_set_update_needed_)
+ return;
VkDescriptorBufferInfo buffer_info = VkDescriptorBufferInfo();
buffer_info.buffer = transfer_buffer_->GetVkBuffer();
buffer_info.offset = 0;
buffer_info.range = VK_WHOLE_SIZE;
- return Descriptor::UpdateDescriptorSetForBuffer(
- descriptor_set, GetVkDescriptorType(), buffer_info);
+ VkWriteDescriptorSet write = VkWriteDescriptorSet();
+ write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
+ write.dstSet = descriptor_set;
+ write.dstBinding = binding_;
+ write.dstArrayElement = 0;
+ write.descriptorCount = 1;
+ write.descriptorType = IsStorageBuffer() ? VK_DESCRIPTOR_TYPE_STORAGE_BUFFER
+ : VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
+ write.pBufferInfo = &buffer_info;
+
+ device_->GetPtrs()->vkUpdateDescriptorSets(device_->GetVkDevice(), 1, &write,
+ 0, nullptr);
+ is_descriptor_set_update_needed_ = false;
}
Result BufferDescriptor::AddToBuffer(DataType type,
@@ -153,5 +165,10 @@ Result BufferDescriptor::AddToBuffer(DataType type,
return {};
}
+VkDescriptorType BufferDescriptor::GetVkDescriptorType() const {
+ return IsStorageBuffer() ? VK_DESCRIPTOR_TYPE_STORAGE_BUFFER
+ : VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
+}
+
} // namespace vulkan
} // namespace amber