5#ifndef FLUTTER_IMPELLER_RENDERER_BACKEND_VULKAN_CONTEXT_VK_H_
6#define FLUTTER_IMPELLER_RENDERER_BACKEND_VULKAN_CONTEXT_VK_H_
10#include "flutter/fml/concurrent_message_loop.h"
11#include "flutter/fml/mapping.h"
12#include "flutter/fml/unique_fd.h"
31class CommandEncoderFactoryVK;
32class CommandEncoderVK;
33class CommandPoolRecyclerVK;
36class ResourceManagerVK;
37class SurfaceContextVK;
39class DescriptorPoolRecyclerVK;
44 public std::enable_shared_from_this<ContextVK> {
67 uint64_t
GetHash()
const {
return hash_; }
97 const std::shared_ptr<const Capabilities>&
GetCapabilities()
const override;
107 template <
typename T>
112 template <
typename T>
115 std::string_view label) {
121 auto c_handle =
static_cast<typename T::CType
>(handle);
123 vk::DebugUtilsObjectNameInfoEXT
info;
124 info.objectType = T::objectType;
125 info.pObjectName = label.data();
126 info.objectHandle =
reinterpret_cast<decltype(
info.objectHandle)
>(c_handle);
128 if (
device.setDebugUtilsObjectNameEXT(
info) != vk::Result::eSuccess) {
137 return device_holder_;
146 const std::shared_ptr<fml::ConcurrentTaskRunner>
185 std::shared_ptr<DeviceHolderImpl> device_holder_;
186 std::unique_ptr<DriverInfoVK> driver_info_;
187 std::unique_ptr<DebugReportVK> debug_report_;
188 std::shared_ptr<Allocator> allocator_;
189 std::shared_ptr<ShaderLibraryVK> shader_library_;
190 std::shared_ptr<SamplerLibraryVK> sampler_library_;
191 std::shared_ptr<PipelineLibraryVK> pipeline_library_;
192 std::shared_ptr<YUVConversionLibraryVK> yuv_conversion_library_;
194 std::shared_ptr<const Capabilities> device_capabilities_;
195 std::shared_ptr<FenceWaiterVK> fence_waiter_;
196 std::shared_ptr<ResourceManagerVK> resource_manager_;
197 std::shared_ptr<CommandPoolRecyclerVK> command_pool_recycler_;
198 std::string device_name_;
199 std::shared_ptr<fml::ConcurrentMessageLoop> raster_message_loop_;
200 std::shared_ptr<GPUTracerVK> gpu_tracer_;
201 std::shared_ptr<DescriptorPoolRecyclerVK> descriptor_pool_recycler_;
202 std::shared_ptr<CommandQueue> command_queue_vk_;
204 const uint64_t hash_;
206 bool is_valid_ =
false;
212 std::unique_ptr<CommandEncoderFactoryVK> CreateGraphicsCommandEncoderFactory()
215 ContextVK(
const ContextVK&) =
delete;
217 ContextVK& operator=(
const ContextVK&) =
delete;
static void info(const char *fmt,...) SK_PRINTF_LIKE(1
void SetOffscreenFormat(PixelFormat pixel_format)
std::shared_ptr< Allocator > GetResourceAllocator() const override
Returns the allocator used to create textures and buffers on the device.
std::shared_ptr< ResourceManagerVK > GetResourceManager() const
vk::PhysicalDevice GetPhysicalDevice() const
const std::shared_ptr< YUVConversionLibraryVK > & GetYUVConversionLibrary() const
bool SetDebugName(T handle, std::string_view label) const
std::shared_ptr< DeviceHolderVK > GetDeviceHolder() const
void RecordFrameEndTime() const
const vk::Device & GetDevice() const
bool IsValid() const override
Determines if a context is valid. If the caller ever receives an invalid context, they must discard i...
const std::unique_ptr< DriverInfoVK > & GetDriverInfo() const
std::shared_ptr< CommandBuffer > CreateCommandBuffer() const override
Create a new command buffer. Command buffers can be used to encode graphics, blit,...
std::shared_ptr< SamplerLibrary > GetSamplerLibrary() const override
Returns the library of combined image samplers used in shaders.
static std::shared_ptr< ContextVK > Create(Settings settings)
std::shared_ptr< PipelineLibrary > GetPipelineLibrary() const override
Returns the library of pipelines used by render or compute commands.
const std::shared_ptr< QueueVK > & GetGraphicsQueue() const
const std::shared_ptr< const Capabilities > & GetCapabilities() const override
Get the capabilities of Impeller context. All optionally supported feature of the platform,...
std::shared_ptr< CommandPoolRecyclerVK > GetCommandPoolRecycler() const
std::shared_ptr< CommandQueue > GetCommandQueue() const override
Return the graphics queue for submitting command buffers.
void InitializeCommonlyUsedShadersIfNeeded() const override
std::shared_ptr< FenceWaiterVK > GetFenceWaiter() const
std::shared_ptr< GPUTracerVK > GetGPUTracer() const
BackendType GetBackendType() const override
Get the graphics backend of an Impeller context.
std::string DescribeGpuModel() const override
static bool SetDebugName(const vk::Device &device, T handle, std::string_view label)
const std::shared_ptr< fml::ConcurrentTaskRunner > GetConcurrentWorkerTaskRunner() const
static size_t ChooseThreadCountForWorkers(size_t hardware_concurrency)
std::shared_ptr< ShaderLibrary > GetShaderLibrary() const override
Returns the library of shaders used to specify the programmable stages of a pipeline.
vk::Instance GetInstance() const
void Shutdown() override
Force all pending asynchronous work to finish. This is achieved by deleting all owned concurrent mess...
std::shared_ptr< DescriptorPoolRecyclerVK > GetDescriptorPoolRecycler() const
std::shared_ptr< SurfaceContextVK > CreateSurfaceContext()
To do anything rendering related with Impeller, you need a context.
Holds a strong reference to the underlying logical Vulkan device. This comes in handy when the contex...
VkPhysicalDevice physical_device
bool HasValidationLayers()
PixelFormat
The Pixel formats supported by Impeller. The naming convention denotes the usage of the component,...
Settings(Settings &&)=default
std::vector< std::shared_ptr< fml::Mapping > > shader_libraries_data
PFN_vkGetInstanceProcAddr proc_address_callback
bool fatal_missing_validations
If validations are requested but cannot be enabled, log a fatal error.
fml::UniqueFD cache_directory
PFN_vkVoidFunction(VKAPI_PTR * PFN_vkGetInstanceProcAddr)(VkInstance instance, const char *pName)