1 // Copyright 2018 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef UI_OZONE_DEMO_VULKAN_RENDERER_H_
6 #define UI_OZONE_DEMO_VULKAN_RENDERER_H_
7 
8 #include <vulkan/vulkan.h>
9 #include <memory>
10 
11 #include "base/macros.h"
12 #include "base/memory/ref_counted.h"
13 #include "base/memory/weak_ptr.h"
14 #include "ui/gfx/buffer_types.h"
15 #include "ui/gfx/presentation_feedback.h"
16 #include "ui/gfx/swap_result.h"
17 #include "ui/ozone/demo/renderer_base.h"
18 
19 namespace gpu {
20 class VulkanDeviceQueue;
21 class VulkanImplementation;
22 class VulkanCommandBuffer;
23 class VulkanCommandPool;
24 class VulkanSurface;
25 }  // namespace gpu
26 
27 namespace ui {
28 class PlatformWindowSurface;
29 
30 class VulkanRenderer : public RendererBase {
31  public:
32   VulkanRenderer(std::unique_ptr<PlatformWindowSurface> window_surface,
33                  std::unique_ptr<gpu::VulkanSurface> vulkan_surface,
34                  gpu::VulkanImplementation* vulkan_instance,
35                  gfx::AcceleratedWidget widget,
36                  const gfx::Size& size);
37   ~VulkanRenderer() override;
38 
39   // Renderer:
40   bool Initialize() override;
41 
42  private:
43   class Framebuffer {
44    public:
45     Framebuffer(VkImageView vk_image_view,
46                 VkFramebuffer vk_framebuffer,
47                 std::unique_ptr<gpu::VulkanCommandBuffer> command_buffer);
48     ~Framebuffer();
49 
50     static std::unique_ptr<Framebuffer> Create(
51         gpu::VulkanDeviceQueue* vulkan_device_queue,
52         gpu::VulkanCommandPool* vulkan_command_pool,
53         VkRenderPass vk_render_pass,
54         gpu::VulkanSurface* vulkan_surface,
55         VkImage image);
56 
vk_image_view()57     VkImageView vk_image_view() const { return vk_image_view_; }
vk_framebuffer()58     VkFramebuffer vk_framebuffer() const { return vk_framebuffer_; }
command_buffer()59     gpu::VulkanCommandBuffer* command_buffer() const {
60       return command_buffer_.get();
61     }
62 
63    private:
64     const VkImageView vk_image_view_;
65     const VkFramebuffer vk_framebuffer_;
66     const std::unique_ptr<gpu::VulkanCommandBuffer> command_buffer_;
67   };
68 
69   void DestroyRenderPass();
70   void DestroyFramebuffers();
71   void RecreateFramebuffers();
72   void RenderFrame();
73   void PostRenderFrameTask();
74 
75   std::unique_ptr<PlatformWindowSurface> window_surface_;
76 
77   std::vector<std::unique_ptr<Framebuffer>> framebuffers_;
78 
79   gpu::VulkanImplementation* const vulkan_implementation_;
80   std::unique_ptr<gpu::VulkanDeviceQueue> device_queue_;
81   std::unique_ptr<gpu::VulkanCommandPool> command_pool_;
82   std::unique_ptr<gpu::VulkanSurface> vulkan_surface_;
83   gfx::Size size_;
84 
85   VkRenderPass render_pass_ = VK_NULL_HANDLE;
86 
87   base::WeakPtrFactory<VulkanRenderer> weak_ptr_factory_{this};
88 
89   DISALLOW_COPY_AND_ASSIGN(VulkanRenderer);
90 };
91 
92 }  // namespace ui
93 
94 #endif  // UI_OZONE_DEMO_VULKAN_RENDERER_H_
95