aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordan sinclair <dj2@everburning.com>2019-03-22 18:57:28 -0700
committerGitHub <noreply@github.com>2019-03-22 18:57:28 -0700
commitd1984fef30545e26fd7f6558ee64d0079b26956d (patch)
tree36c00792a52e503be52fbe54bfcea68c1147c9fd /src
parent8b6850bb86bd13630f35a2740b571d72c0147f80 (diff)
downloadamber-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.cc4
-rw-r--r--src/buffer.h16
-rw-r--r--src/executor.cc6
-rw-r--r--src/vulkan/buffer_descriptor.cc2
-rw-r--r--src/vulkan/frame_buffer.cc13
-rw-r--r--src/vulkan/frame_buffer.h2
-rw-r--r--src/vulkan/graphics_pipeline.cc9
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(),