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