5#ifndef FLUTTER_IMPELLER_RENDERER_BACKEND_VULKAN_CONTEXT_VK_H_
6#define FLUTTER_IMPELLER_RENDERER_BACKEND_VULKAN_CONTEXT_VK_H_
34class CommandEncoderFactoryVK;
35class CommandEncoderVK;
36class CommandPoolRecyclerVK;
39class ResourceManagerVK;
40class SurfaceContextVK;
42class DescriptorPoolRecyclerVK;
44class DescriptorPoolVK;
49 : device_holder_(
std::move(device_holder)) {}
52 std::shared_ptr<DeviceHolderVK> strong_device_holder_ =
53 device_holder_.lock();
54 if (strong_device_holder_ && strong_device_holder_->GetDevice()) {
55 [[maybe_unused]]
auto result =
56 strong_device_holder_->GetDevice().waitIdle();
61 std::weak_ptr<DeviceHolderVK> device_holder_;
66 public std::enable_shared_from_this<ContextVK> {
142 const std::shared_ptr<const Capabilities>&
GetCapabilities()
const override;
146 std::shared_ptr<CommandBuffer> cmd_buffer)
override;
158 template <
typename T>
163 template <
typename T>
165 std::string_view label,
166 std::string_view trailing)
const {
171 std::string combined = std::format(
"{} {}", label, trailing);
175 template <
typename T>
178 std::string_view label) {
184 auto c_handle =
static_cast<typename T::CType
>(handle);
186 vk::DebugUtilsObjectNameInfoEXT info;
187 info.objectType = T::objectType;
188 info.pObjectName = label.data();
189 info.objectHandle =
reinterpret_cast<decltype(info.objectHandle)
>(c_handle);
191 if (
device.setDebugUtilsObjectNameEXT(info) != vk::Result::eSuccess) {
200 return device_holder_;
209 const std::shared_ptr<fml::ConcurrentTaskRunner>
255 return idle_waiter_vk_;
261 const vk::Device& GetDevice()
const override {
return device.get(); }
263 const vk::PhysicalDevice& GetPhysicalDevice()
const override {
267 ~DeviceHolderImpl() {
280 std::shared_ptr<DeviceHolderImpl> device_holder_;
281 std::unique_ptr<DriverInfoVK> driver_info_;
282 std::unique_ptr<DebugReportVK> debug_report_;
283 std::shared_ptr<Allocator> allocator_;
284 std::shared_ptr<ShaderLibraryVK> shader_library_;
285 std::shared_ptr<SamplerLibraryVK> sampler_library_;
286 std::shared_ptr<PipelineLibraryVK> pipeline_library_;
287 std::shared_ptr<YUVConversionLibraryVK> yuv_conversion_library_;
289 std::shared_ptr<const Capabilities> device_capabilities_;
290 std::shared_ptr<FenceWaiterVK> fence_waiter_;
291 std::shared_ptr<GpuSubmissionTracker> submission_tracker_ =
292 std::make_shared<GpuSubmissionTracker>();
293 std::shared_ptr<ResourceManagerVK> resource_manager_;
294 std::shared_ptr<DescriptorPoolRecyclerVK> descriptor_pool_recycler_;
295 std::shared_ptr<CommandPoolRecyclerVK> command_pool_recycler_;
296 std::string device_name_;
297 std::shared_ptr<fml::ConcurrentMessageLoop> raster_message_loop_;
298 std::shared_ptr<GPUTracerVK> gpu_tracer_;
299 std::shared_ptr<CommandQueue> command_queue_vk_;
300 std::shared_ptr<const IdleWaiter> idle_waiter_vk_;
301 WorkaroundsVK workarounds_;
303 using DescriptorPoolMap =
304 std::unordered_map<std::thread::id, std::shared_ptr<DescriptorPoolVK>>;
306 mutable Mutex desc_pool_mutex_;
308 cached_descriptor_pool_;
309 bool should_enable_surface_control_ =
false;
310 bool should_batch_cmd_buffers_ =
false;
311 std::vector<std::shared_ptr<CommandBuffer>> pending_command_buffers_;
313 const uint64_t hash_;
315 bool is_valid_ =
false;
317 explicit ContextVK(
const Flags& flags);
319 void Setup(Settings settings);
321 ContextVK(
const ContextVK&) =
delete;
323 ContextVK& operator=(
const ContextVK&) =
delete;
To do anything rendering related with Impeller, you need a context.
void SetOffscreenFormat(PixelFormat pixel_format)
std::shared_ptr< const IdleWaiter > GetIdleWaiter() const override
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
bool EnqueueCommandBuffer(std::shared_ptr< CommandBuffer > command_buffer) override
Enqueue command_buffer for submission by the end of the frame.
void RecordFrameEndTime() const
const vk::Device & GetDevice() const
bool FlushCommandBuffers() override
Flush all pending command buffers.
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
void DisposeThreadLocalCachedResources() override
std::shared_ptr< CommandBuffer > CreateCommandBuffer() const override
Create a new command buffer. Command buffers can be used to encode graphics, blit,...
virtual bool SubmitOnscreen(std::shared_ptr< CommandBuffer > cmd_buffer) override
Submit the command buffer that renders to the onscreen surface.
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< GpuSubmissionTracker > & GetMutableSubmissionTracker() const
const std::shared_ptr< const Capabilities > & GetCapabilities() const override
Get the capabilities of Impeller context. All optionally supported feature of the platform,...
RuntimeStageBackend GetRuntimeStageBackend() const override
Retrieve the runtime stage for this context type.
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
bool GetShouldEnableSurfaceControlSwapchain() const
Whether the Android Surface control based swapchain should be enabled.
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 WorkaroundsVK & GetWorkarounds() const
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
std::shared_ptr< const GpuSubmissionTracker > GetSubmissionTracker() const override
Returns the tracker recording GPU completion of command buffer submissions, or nullptr if the backend...
bool SetDebugName(T handle, std::string_view label, std::string_view trailing) const
void Shutdown() override
Force all pending asynchronous work to finish. This is achieved by deleting all owned concurrent mess...
bool FinishQueue() override
Wait until all previously submitted command buffers are processed and displayed by the GPU.
std::shared_ptr< DescriptorPoolRecyclerVK > GetDescriptorPoolRecycler() const
std::shared_ptr< SurfaceContextVK > CreateSurfaceContext()
Holds a strong reference to the underlying logical Vulkan device. This comes in handy when the contex...
IdleWaiterVK(std::weak_ptr< DeviceHolderVK > device_holder)
void WaitIdle() const override
VkPhysicalDevice physical_device
bool HasValidationLayers()
PixelFormat
The Pixel formats supported by Impeller. The naming convention denotes the usage of the component,...
std::shared_ptr< CommandBuffer > command_buffer
std::vector< std::string > device_extensions
VkPhysicalDevice physical_device
uint32_t queue_family_index
std::vector< std::string > instance_extensions
Settings(Settings &&)=default
bool enable_surface_control
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.
std::optional< EmbedderData > embedder_data
fml::UniqueFD cache_directory
A non-exhaustive set of driver specific workarounds.
#define IPLR_GUARDED_BY(x)