diff options
author | dan sinclair <dsinclair@google.com> | 2019-09-18 12:58:35 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-09-18 12:58:35 -0400 |
commit | 80467d683c79bf2b6bd9ef977dd358f34eb21935 (patch) | |
tree | 9a98f66c74be917d7950bffaa79a3be835c78d06 | |
parent | a629c462341dee886232ea9ea0dff7e8f9604aa4 (diff) | |
download | amber-80467d683c79bf2b6bd9ef977dd358f34eb21935.tar.gz |
Clear all colour buffers in Vulkan engine. (#653)
Currently the Vulkan engine only issues a clear for the first colour
attachment. This CL upates the code to clear all colour attachments.
Fixes #612
-rw-r--r-- | src/vulkan/graphics_pipeline.cc | 16 | ||||
-rw-r--r-- | tests/cases/clear_multiple.amber | 39 |
2 files changed, 50 insertions, 5 deletions
diff --git a/src/vulkan/graphics_pipeline.cc b/src/vulkan/graphics_pipeline.cc index 31c194c..881125e 100644 --- a/src/vulkan/graphics_pipeline.cc +++ b/src/vulkan/graphics_pipeline.cc @@ -795,10 +795,15 @@ Result GraphicsPipeline::ClearBuffer(const VkClearValue& clear_value, { RenderPassGuard render_pass_guard(this); - VkClearAttachment clear_attachment = VkClearAttachment(); - clear_attachment.aspectMask = aspect; - clear_attachment.colorAttachment = 0; - clear_attachment.clearValue = clear_value; + std::vector<VkClearAttachment> clears; + for (size_t i = 0; i < color_buffers_.size(); ++i) { + VkClearAttachment clear_attachment = VkClearAttachment(); + clear_attachment.aspectMask = aspect; + clear_attachment.colorAttachment = static_cast<uint32_t>(i); + clear_attachment.clearValue = clear_value; + + clears.push_back(clear_attachment); + } VkClearRect clear_rect; clear_rect.rect = {{0, 0}, {frame_width_, frame_height_}}; @@ -806,7 +811,8 @@ Result GraphicsPipeline::ClearBuffer(const VkClearValue& clear_value, clear_rect.layerCount = 1; device_->GetPtrs()->vkCmdClearAttachments( - command_->GetVkCommandBuffer(), 1, &clear_attachment, 1, &clear_rect); + command_->GetVkCommandBuffer(), static_cast<uint32_t>(clears.size()), + clears.data(), 1, &clear_rect); } frame_->TransferColorImagesToHost(command_.get()); diff --git a/tests/cases/clear_multiple.amber b/tests/cases/clear_multiple.amber new file mode 100644 index 0000000..82ec069 --- /dev/null +++ b/tests/cases/clear_multiple.amber @@ -0,0 +1,39 @@ +#!amber +# Copyright 2019 The Amber Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +SHADER vertex vtex_shader PASSTHROUGH +SHADER fragment frag_shader GLSL +#version 430 + +void main() { +} +END + +BUFFER img_buf_0 FORMAT B8G8R8A8_UNORM +BUFFER img_buf_1 FORMAT B8G8R8A8_UNORM + +PIPELINE graphics my_pipeline + ATTACH vtex_shader + ATTACH frag_shader + + FRAMEBUFFER_SIZE 256 256 + BIND BUFFER img_buf_0 AS color LOCATION 0 + BIND BUFFER img_buf_1 AS color LOCATION 1 +END + +CLEAR_COLOR my_pipeline 255 0 0 255 +CLEAR my_pipeline +EXPECT img_buf_0 IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255 +EXPECT img_buf_1 IDX 0 0 SIZE 256 256 EQ_RGBA 255 0 0 255 |