1e5c31af7Sopenharmony_ci// Copyright 2018 The Amber Authors. 2e5c31af7Sopenharmony_ci// 3e5c31af7Sopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License"); 4e5c31af7Sopenharmony_ci// you may not use this file except in compliance with the License. 5e5c31af7Sopenharmony_ci// You may obtain a copy of the License at 6e5c31af7Sopenharmony_ci// 7e5c31af7Sopenharmony_ci// http://www.apache.org/licenses/LICENSE-2.0 8e5c31af7Sopenharmony_ci// 9e5c31af7Sopenharmony_ci// Unless required by applicable law or agreed to in writing, software 10e5c31af7Sopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS, 11e5c31af7Sopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12e5c31af7Sopenharmony_ci// See the License for the specific language governing permissions and 13e5c31af7Sopenharmony_ci// limitations under the License. 14e5c31af7Sopenharmony_ci 15e5c31af7Sopenharmony_ci#ifndef SRC_VULKAN_GRAPHICS_PIPELINE_H_ 16e5c31af7Sopenharmony_ci#define SRC_VULKAN_GRAPHICS_PIPELINE_H_ 17e5c31af7Sopenharmony_ci 18e5c31af7Sopenharmony_ci#include <memory> 19e5c31af7Sopenharmony_ci#include <vector> 20e5c31af7Sopenharmony_ci 21e5c31af7Sopenharmony_ci#include "amber/result.h" 22e5c31af7Sopenharmony_ci#include "amber/value.h" 23e5c31af7Sopenharmony_ci#include "amber/vulkan_header.h" 24e5c31af7Sopenharmony_ci#include "src/format.h" 25e5c31af7Sopenharmony_ci#include "src/pipeline.h" 26e5c31af7Sopenharmony_ci#include "src/vulkan/frame_buffer.h" 27e5c31af7Sopenharmony_ci#include "src/vulkan/index_buffer.h" 28e5c31af7Sopenharmony_ci#include "src/vulkan/pipeline.h" 29e5c31af7Sopenharmony_ci#include "src/vulkan/vertex_buffer.h" 30e5c31af7Sopenharmony_ci 31e5c31af7Sopenharmony_cinamespace amber { 32e5c31af7Sopenharmony_ci 33e5c31af7Sopenharmony_ciclass ProbeCommand; 34e5c31af7Sopenharmony_ci 35e5c31af7Sopenharmony_cinamespace vulkan { 36e5c31af7Sopenharmony_ci 37e5c31af7Sopenharmony_ciclass CommandPool; 38e5c31af7Sopenharmony_ci 39e5c31af7Sopenharmony_ci/// Wrapper around a graphics pipeline. 40e5c31af7Sopenharmony_ciclass GraphicsPipeline : public Pipeline { 41e5c31af7Sopenharmony_ci public: 42e5c31af7Sopenharmony_ci GraphicsPipeline( 43e5c31af7Sopenharmony_ci Device* device, 44e5c31af7Sopenharmony_ci const std::vector<amber::Pipeline::BufferInfo>& color_buffers, 45e5c31af7Sopenharmony_ci amber::Pipeline::BufferInfo depth_stencil_buffer, 46e5c31af7Sopenharmony_ci const std::vector<amber::Pipeline::BufferInfo>& resolve_targets, 47e5c31af7Sopenharmony_ci uint32_t fence_timeout_ms, 48e5c31af7Sopenharmony_ci const std::vector<VkPipelineShaderStageCreateInfo>&); 49e5c31af7Sopenharmony_ci ~GraphicsPipeline() override; 50e5c31af7Sopenharmony_ci 51e5c31af7Sopenharmony_ci Result Initialize(uint32_t width, uint32_t height, CommandPool* pool); 52e5c31af7Sopenharmony_ci 53e5c31af7Sopenharmony_ci Result SetIndexBuffer(Buffer* buffer); 54e5c31af7Sopenharmony_ci 55e5c31af7Sopenharmony_ci Result Clear(); 56e5c31af7Sopenharmony_ci 57e5c31af7Sopenharmony_ci Result SetClearColor(float r, float g, float b, float a); 58e5c31af7Sopenharmony_ci Result SetClearStencil(uint32_t stencil); 59e5c31af7Sopenharmony_ci Result SetClearDepth(float depth); 60e5c31af7Sopenharmony_ci 61e5c31af7Sopenharmony_ci Result Draw(const DrawArraysCommand* command, VertexBuffer* vertex_buffer); 62e5c31af7Sopenharmony_ci 63e5c31af7Sopenharmony_ci VkRenderPass GetVkRenderPass() const { return render_pass_; } 64e5c31af7Sopenharmony_ci FrameBuffer* GetFrameBuffer() const { return frame_.get(); } 65e5c31af7Sopenharmony_ci 66e5c31af7Sopenharmony_ci uint32_t GetWidth() const { return frame_width_; } 67e5c31af7Sopenharmony_ci uint32_t GetHeight() const { return frame_height_; } 68e5c31af7Sopenharmony_ci 69e5c31af7Sopenharmony_ci void SetPatchControlPoints(uint32_t points) { 70e5c31af7Sopenharmony_ci patch_control_points_ = points; 71e5c31af7Sopenharmony_ci } 72e5c31af7Sopenharmony_ci 73e5c31af7Sopenharmony_ci private: 74e5c31af7Sopenharmony_ci Result CreateVkGraphicsPipeline(const PipelineData* pipeline_data, 75e5c31af7Sopenharmony_ci VkPrimitiveTopology topology, 76e5c31af7Sopenharmony_ci const VertexBuffer* vertex_buffer, 77e5c31af7Sopenharmony_ci const VkPipelineLayout& pipeline_layout, 78e5c31af7Sopenharmony_ci VkPipeline* pipeline); 79e5c31af7Sopenharmony_ci Result CreateRenderPass(); 80e5c31af7Sopenharmony_ci Result SendVertexBufferDataIfNeeded(VertexBuffer* vertex_buffer); 81e5c31af7Sopenharmony_ci 82e5c31af7Sopenharmony_ci VkPipelineDepthStencilStateCreateInfo GetVkPipelineDepthStencilInfo( 83e5c31af7Sopenharmony_ci const PipelineData* pipeline_data); 84e5c31af7Sopenharmony_ci std::vector<VkPipelineColorBlendAttachmentState> 85e5c31af7Sopenharmony_ci GetVkPipelineColorBlendAttachmentState(const PipelineData* pipeline_data); 86e5c31af7Sopenharmony_ci 87e5c31af7Sopenharmony_ci VkRenderPass render_pass_ = VK_NULL_HANDLE; 88e5c31af7Sopenharmony_ci std::unique_ptr<FrameBuffer> frame_; 89e5c31af7Sopenharmony_ci 90e5c31af7Sopenharmony_ci // color buffers and resolve targets are owned by the amber::Pipeline. 91e5c31af7Sopenharmony_ci std::vector<const amber::Pipeline::BufferInfo*> color_buffers_; 92e5c31af7Sopenharmony_ci std::vector<const amber::Pipeline::BufferInfo*> resolve_targets_; 93e5c31af7Sopenharmony_ci amber::Pipeline::BufferInfo depth_stencil_buffer_; 94e5c31af7Sopenharmony_ci std::unique_ptr<IndexBuffer> index_buffer_; 95e5c31af7Sopenharmony_ci 96e5c31af7Sopenharmony_ci uint32_t frame_width_ = 0; 97e5c31af7Sopenharmony_ci uint32_t frame_height_ = 0; 98e5c31af7Sopenharmony_ci 99e5c31af7Sopenharmony_ci float clear_color_r_ = 0; 100e5c31af7Sopenharmony_ci float clear_color_g_ = 0; 101e5c31af7Sopenharmony_ci float clear_color_b_ = 0; 102e5c31af7Sopenharmony_ci float clear_color_a_ = 0; 103e5c31af7Sopenharmony_ci uint32_t clear_stencil_ = 0; 104e5c31af7Sopenharmony_ci float clear_depth_ = 1.0f; 105e5c31af7Sopenharmony_ci uint32_t patch_control_points_ = 3; 106e5c31af7Sopenharmony_ci}; 107e5c31af7Sopenharmony_ci 108e5c31af7Sopenharmony_ci} // namespace vulkan 109e5c31af7Sopenharmony_ci} // namespace amber 110e5c31af7Sopenharmony_ci 111e5c31af7Sopenharmony_ci#endif // SRC_VULKAN_GRAPHICS_PIPELINE_H_ 112