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