// Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef UI_OZONE_DEMO_VULKAN_RENDERER_H_ #define UI_OZONE_DEMO_VULKAN_RENDERER_H_ #include #include #include "base/macros.h" #include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" #include "ui/gfx/buffer_types.h" #include "ui/gfx/presentation_feedback.h" #include "ui/gfx/swap_result.h" #include "ui/ozone/demo/renderer_base.h" namespace gpu { class VulkanDeviceQueue; class VulkanImplementation; class VulkanCommandBuffer; class VulkanCommandPool; class VulkanSurface; } // namespace gpu namespace ui { class PlatformWindowSurface; class VulkanRenderer : public RendererBase { public: VulkanRenderer(std::unique_ptr window_surface, std::unique_ptr vulkan_surface, gpu::VulkanImplementation* vulkan_instance, gfx::AcceleratedWidget widget, const gfx::Size& size); ~VulkanRenderer() override; // Renderer: bool Initialize() override; private: class Framebuffer { public: Framebuffer(VkImageView vk_image_view, VkFramebuffer vk_framebuffer, std::unique_ptr command_buffer); ~Framebuffer(); static std::unique_ptr Create( gpu::VulkanDeviceQueue* vulkan_device_queue, gpu::VulkanCommandPool* vulkan_command_pool, VkRenderPass vk_render_pass, gpu::VulkanSurface* vulkan_surface, VkImage image); VkImageView vk_image_view() const { return vk_image_view_; } VkFramebuffer vk_framebuffer() const { return vk_framebuffer_; } gpu::VulkanCommandBuffer* command_buffer() const { return command_buffer_.get(); } private: const VkImageView vk_image_view_; const VkFramebuffer vk_framebuffer_; const std::unique_ptr command_buffer_; }; void DestroyRenderPass(); void DestroyFramebuffers(); void RecreateFramebuffers(); void RenderFrame(); void PostRenderFrameTask(); std::unique_ptr window_surface_; std::vector> framebuffers_; gpu::VulkanImplementation* const vulkan_implementation_; std::unique_ptr device_queue_; std::unique_ptr command_pool_; std::unique_ptr vulkan_surface_; gfx::Size size_; VkRenderPass render_pass_ = VK_NULL_HANDLE; base::WeakPtrFactory weak_ptr_factory_{this}; DISALLOW_COPY_AND_ASSIGN(VulkanRenderer); }; } // namespace ui #endif // UI_OZONE_DEMO_VULKAN_RENDERER_H_