diff options
author | dan sinclair <dj2@everburning.com> | 2019-03-22 18:57:28 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-03-22 18:57:28 -0700 |
commit | d1984fef30545e26fd7f6558ee64d0079b26956d (patch) | |
tree | 36c00792a52e503be52fbe54bfcea68c1147c9fd /src | |
parent | 8b6850bb86bd13630f35a2740b571d72c0147f80 (diff) | |
download | amber-d1984fef30545e26fd7f6558ee64d0079b26956d.tar.gz |
[vulkan] Remove memory pointer from Buffer. (#407)
This CL removes the memory pointer from the buffer object and copies the
host accessible memory into the value vector.
Diffstat (limited to 'src')
-rw-r--r-- | src/amber.cc | 4 | ||||
-rw-r--r-- | src/buffer.h | 16 | ||||
-rw-r--r-- | src/executor.cc | 6 | ||||
-rw-r--r-- | src/vulkan/buffer_descriptor.cc | 2 | ||||
-rw-r--r-- | src/vulkan/frame_buffer.cc | 13 | ||||
-rw-r--r-- | src/vulkan/frame_buffer.h | 2 | ||||
-rw-r--r-- | src/vulkan/graphics_pipeline.cc | 9 |
7 files changed, 28 insertions, 24 deletions
diff --git a/src/amber.cc b/src/amber.cc index e847731..53b8db0 100644 --- a/src/amber.cc +++ b/src/amber.cc @@ -41,7 +41,7 @@ Result GetFrameBuffer(Buffer* buffer, std::vector<Value>* values) { return Result("GetFrameBuffer Unsupported buffer format"); } - const uint8_t* cpu_memory = static_cast<const uint8_t*>(buffer->GetMemPtr()); + const uint8_t* cpu_memory = buffer->ValuePtr()->data(); if (!cpu_memory) return Result("GetFrameBuffer missing memory pointer"); @@ -192,7 +192,7 @@ amber::Result Amber::ExecuteWithShaderData(const amber::Recipe* recipe, if (!buffer) break; - const uint8_t* ptr = static_cast<const uint8_t*>(buffer->GetMemPtr()); + const uint8_t* ptr = buffer->ValuePtr()->data(); auto& values = buffer_info.values; for (size_t i = 0; i < buffer->GetSize(); ++i) { values.emplace_back(); diff --git a/src/buffer.h b/src/buffer.h index 056a362..f5c5b04 100644 --- a/src/buffer.h +++ b/src/buffer.h @@ -85,21 +85,8 @@ class Buffer { /// size of the data provided. virtual Result SetData(std::vector<Value>&& data) = 0; - void SetMemPtr(void* ptr) { mem_ptr_ = ptr; } - - const void* GetMemPtr() const { - if (mem_ptr_ == nullptr && !values_.empty()) - return values_.data(); - return mem_ptr_; - } - - void* GetMemPtr() { - if (mem_ptr_ == nullptr && !values_.empty()) - return values_.data(); - return mem_ptr_; - } - std::vector<uint8_t>* ValuePtr() { return &values_; } + const std::vector<uint8_t>* ValuePtr() const { return &values_; } template <typename T> const T* GetValues() const { @@ -119,7 +106,6 @@ class Buffer { uint32_t width_ = 0; uint32_t height_ = 0; uint8_t location_ = 0; - void* mem_ptr_ = nullptr; }; /// A buffer class where the data is described by a |DatumType| object. diff --git a/src/executor.cc b/src/executor.cc index b777cea..eda60f0 100644 --- a/src/executor.cc +++ b/src/executor.cc @@ -76,21 +76,19 @@ Result Executor::Execute(Engine* engine, auto* buffer = cmd->AsProbe()->GetBuffer()->AsFormatBuffer(); assert(buffer); - assert(buffer->GetMemPtr()); r = verifier_.Probe(cmd->AsProbe(), &buffer->GetFormat(), buffer->GetTexelStride(), buffer->GetRowStride(), buffer->GetWidth(), buffer->GetHeight(), - buffer->GetMemPtr()); + buffer->ValuePtr()->data()); } else if (cmd->IsProbeSSBO()) { auto probe_ssbo = cmd->AsProbeSSBO(); const auto* buffer = cmd->AsProbe()->GetBuffer(); assert(buffer); - assert(buffer->GetMemPtr()); r = verifier_.ProbeSSBO(probe_ssbo, buffer->GetSize(), - buffer->GetMemPtr()); + buffer->ValuePtr()->data()); } else if (cmd->IsClear()) { r = engine->DoClear(cmd->AsClear()); } else if (cmd->IsClearColor()) { diff --git a/src/vulkan/buffer_descriptor.cc b/src/vulkan/buffer_descriptor.cc index d40625f..d58e59d 100644 --- a/src/vulkan/buffer_descriptor.cc +++ b/src/vulkan/buffer_descriptor.cc @@ -148,7 +148,7 @@ Result BufferDescriptor::AddToBuffer(DataType type, } BufferInput in{offset, size_in_bytes, type, values}; - in.UpdateBufferWithValues(amber_buffer_->GetMemPtr()); + in.UpdateBufferWithValues(amber_buffer_->ValuePtr()->data()); return {}; } diff --git a/src/vulkan/frame_buffer.cc b/src/vulkan/frame_buffer.cc index 0a29fa9..da89331 100644 --- a/src/vulkan/frame_buffer.cc +++ b/src/vulkan/frame_buffer.cc @@ -15,6 +15,7 @@ #include "src/vulkan/frame_buffer.h" #include <algorithm> +#include <cstring> #include <limits> #include <vector> @@ -76,7 +77,6 @@ Result FrameBuffer::Initialize( return r; attachments[info->location] = color_images_.back()->GetVkImageView(); - info->buffer->SetMemPtr(color_images_.back()->HostAccessibleMemoryPtr()); } } @@ -184,5 +184,16 @@ Result FrameBuffer::CopyColorImagesToHost(CommandBuffer* command) { return {}; } +void FrameBuffer::CopyImagesToBuffers() { + for (size_t i = 0; i < color_images_.size(); ++i) { + auto& img = color_images_[i]; + auto* info = color_attachments_[i]; + auto* values = info->buffer->ValuePtr(); + values->resize(info->buffer->GetSizeInBytes()); + std::memcpy(values->data(), img->HostAccessibleMemoryPtr(), + info->buffer->GetSizeInBytes()); + } +} + } // namespace vulkan } // namespace amber diff --git a/src/vulkan/frame_buffer.h b/src/vulkan/frame_buffer.h index 932379d..0999982 100644 --- a/src/vulkan/frame_buffer.h +++ b/src/vulkan/frame_buffer.h @@ -58,6 +58,8 @@ class FrameBuffer { // of the command must be done later. Result CopyColorImagesToHost(CommandBuffer* command); + void CopyImagesToBuffers(); + uint32_t GetWidth() const { return width_; } uint32_t GetHeight() const { return height_; } diff --git a/src/vulkan/graphics_pipeline.cc b/src/vulkan/graphics_pipeline.cc index e9d5c61..705ca37 100644 --- a/src/vulkan/graphics_pipeline.cc +++ b/src/vulkan/graphics_pipeline.cc @@ -819,7 +819,12 @@ Result GraphicsPipeline::ClearBuffer(const VkClearValue& clear_value, if (!r.IsSuccess()) return r; - return cmd_buf_guard.Submit(GetFenceTimeout()); + r = cmd_buf_guard.Submit(GetFenceTimeout()); + if (!r.IsSuccess()) + return r; + + frame_->CopyImagesToBuffers(); + return {}; } Result GraphicsPipeline::Draw(const DrawArraysCommand* command, @@ -917,6 +922,8 @@ Result GraphicsPipeline::Draw(const DrawArraysCommand* command, if (!r.IsSuccess()) return r; + frame_->CopyImagesToBuffers(); + device_->GetPtrs()->vkDestroyPipeline(device_->GetVkDevice(), pipeline, nullptr); device_->GetPtrs()->vkDestroyPipelineLayout(device_->GetVkDevice(), |