diff options
author | dan sinclair <dj2@everburning.com> | 2019-03-20 15:41:32 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-03-20 15:41:32 -0700 |
commit | acd6a54bb84a2c7f4748457fbd934bacdd34c427 (patch) | |
tree | 24e287fb2bbba3d1d83f19e8843aa7695b9b9058 | |
parent | 3acdaf91b5b2abb919e815d88cb668669743bf93 (diff) | |
download | amber-acd6a54bb84a2c7f4748457fbd934bacdd34c427.tar.gz |
[vulkan] Move GetFrameBuffer out of engine code. (#389)
This CL moves the GetFrameBuffer code up into the Amber object and
removes from the engine code. There should be no engine specific work
involved in retrieving the framebuffer.
-rw-r--r-- | src/amber.cc | 37 | ||||
-rw-r--r-- | src/dawn/engine_dawn.cc | 4 | ||||
-rw-r--r-- | src/dawn/engine_dawn.h | 1 | ||||
-rw-r--r-- | src/engine.h | 4 | ||||
-rw-r--r-- | src/executor_test.cc | 2 | ||||
-rw-r--r-- | src/vulkan/engine_vulkan.cc | 33 | ||||
-rw-r--r-- | src/vulkan/engine_vulkan.h | 1 |
7 files changed, 36 insertions, 46 deletions
diff --git a/src/amber.cc b/src/amber.cc index c6cbe5f..324c2dd 100644 --- a/src/amber.cc +++ b/src/amber.cc @@ -28,6 +28,41 @@ #include "src/vkscript/parser.h" namespace amber { +namespace { + +const FormatType kDefaultFramebufferFormat = FormatType::kB8G8R8A8_UNORM; + +Result GetFrameBuffer(Buffer* buffer, std::vector<Value>* values) { + values->clear(); + + // TODO(jaebaek): Support other formats + if (buffer->AsFormatBuffer()->GetFormat().GetFormatType() != + kDefaultFramebufferFormat) { + return Result("GetFrameBuffer Unsupported buffer format"); + } + + const uint8_t* cpu_memory = static_cast<const uint8_t*>(buffer->GetMemPtr()); + if (!cpu_memory) + return Result("GetFrameBuffer missing memory pointer"); + + const auto texel_stride = buffer->AsFormatBuffer()->GetTexelStride(); + const auto row_stride = buffer->AsFormatBuffer()->GetRowStride(); + + for (uint32_t y = 0; y < buffer->GetHeight(); ++y) { + for (uint32_t x = 0; x < buffer->GetWidth(); ++x) { + Value pixel; + + const uint8_t* ptr_8 = cpu_memory + (row_stride * y) + (texel_stride * x); + const uint32_t* ptr_32 = reinterpret_cast<const uint32_t*>(ptr_8); + pixel.SetIntValue(*ptr_32); + values->push_back(pixel); + } + } + + return {}; +} + +} // namespace Delegate::~Delegate() = default; @@ -139,7 +174,7 @@ amber::Result Amber::ExecuteWithShaderData(const amber::Recipe* recipe, buffer_info.width = buffer->GetWidth(); buffer_info.height = buffer->GetHeight(); - r = engine->GetFrameBuffer(buffer, &(buffer_info.values)); + r = GetFrameBuffer(buffer, &(buffer_info.values)); if (!r.IsSuccess()) break; diff --git a/src/dawn/engine_dawn.cc b/src/dawn/engine_dawn.cc index 6cd5397..2b5880c 100644 --- a/src/dawn/engine_dawn.cc +++ b/src/dawn/engine_dawn.cc @@ -442,9 +442,5 @@ Result EngineDawn::CreateFramebufferIfNeeded() { return {}; } -Result EngineDawn::GetFrameBuffer(Buffer*, std::vector<Value>*) { - return Result("Dawn::GetFrameBuffer not implemented"); -} - } // namespace dawn } // namespace amber diff --git a/src/dawn/engine_dawn.h b/src/dawn/engine_dawn.h index 3fe8cab..c7c5ccf 100644 --- a/src/dawn/engine_dawn.h +++ b/src/dawn/engine_dawn.h @@ -60,7 +60,6 @@ class EngineDawn : public Engine { Result DoPatchParameterVertices( const PatchParameterVerticesCommand* cmd) override; Result DoBuffer(const BufferCommand* cmd) override; - Result GetFrameBuffer(Buffer*, std::vector<Value>* values) override; private: // Creates a command buffer builder if it doesn't already exist. diff --git a/src/engine.h b/src/engine.h index c46f505..34284e4 100644 --- a/src/engine.h +++ b/src/engine.h @@ -93,10 +93,6 @@ class Engine { /// This covers both Vulkan buffers and images. virtual Result DoBuffer(const BufferCommand* cmd) = 0; - /// Copy the content of the framebuffer into |values|, each value is a pixel - /// in R8G8B8A8 format. - virtual Result GetFrameBuffer(Buffer* buffer, std::vector<Value>* values) = 0; - /// Sets the engine data to use. void SetEngineData(const EngineData& data) { engine_data_ = data; } diff --git a/src/executor_test.cc b/src/executor_test.cc index a0adea8..60828a0 100644 --- a/src/executor_test.cc +++ b/src/executor_test.cc @@ -160,8 +160,6 @@ class EngineStub : public Engine { return {}; } - Result GetFrameBuffer(Buffer*, std::vector<Value>*) override { return {}; } - private: bool fail_clear_command_ = false; bool fail_clear_color_command_ = false; diff --git a/src/vulkan/engine_vulkan.cc b/src/vulkan/engine_vulkan.cc index cfefa66..29800ef 100644 --- a/src/vulkan/engine_vulkan.cc +++ b/src/vulkan/engine_vulkan.cc @@ -29,8 +29,6 @@ namespace amber { namespace vulkan { namespace { -const FormatType kDefaultFramebufferFormat = FormatType::kB8G8R8A8_UNORM; - Result ToVkShaderStage(ShaderType type, VkShaderStageFlagBits* ret) { switch (type) { case kShaderTypeGeometry: @@ -425,37 +423,6 @@ Result EngineVulkan::DoPatchParameterVertices( return {}; } -Result EngineVulkan::GetFrameBuffer(Buffer* buffer, - std::vector<Value>* values) { - values->clear(); - - // TODO(jaebaek): Support other formats - if (buffer->AsFormatBuffer()->GetFormat().GetFormatType() != - kDefaultFramebufferFormat) { - return Result("Vulkan::GetFrameBuffer Unsupported buffer format"); - } - - const uint8_t* cpu_memory = static_cast<const uint8_t*>(buffer->GetMemPtr()); - if (!cpu_memory) - return Result("Vulkan::GetFrameBuffer missing memory pointer"); - - const auto texel_stride = buffer->AsFormatBuffer()->GetTexelStride(); - const auto row_stride = buffer->AsFormatBuffer()->GetRowStride(); - - for (uint32_t y = 0; y < buffer->GetHeight(); ++y) { - for (uint32_t x = 0; x < buffer->GetWidth(); ++x) { - Value pixel; - - const uint8_t* ptr_8 = cpu_memory + (row_stride * y) + (texel_stride * x); - const uint32_t* ptr_32 = reinterpret_cast<const uint32_t*>(ptr_8); - pixel.SetIntValue(*ptr_32); - values->push_back(pixel); - } - } - - return {}; -} - Result EngineVulkan::DoBuffer(const BufferCommand* cmd) { auto& info = pipeline_map_[cmd->GetPipeline()]; if (cmd->IsPushConstant()) diff --git a/src/vulkan/engine_vulkan.h b/src/vulkan/engine_vulkan.h index cec5533..7375d73 100644 --- a/src/vulkan/engine_vulkan.h +++ b/src/vulkan/engine_vulkan.h @@ -58,7 +58,6 @@ class EngineVulkan : public Engine { Result DoPatchParameterVertices( const PatchParameterVerticesCommand* cmd) override; Result DoBuffer(const BufferCommand* cmd) override; - Result GetFrameBuffer(Buffer* buffer, std::vector<Value>* values) override; private: struct PipelineInfo { |