skia_safe/gpu/ganesh/
context_options.rs

1use std::os::raw;
2
3use skia_bindings::{self as sb, GrContextOptions};
4
5use crate::{gpu::DriverBugWorkarounds, prelude::*};
6
7pub use skia_bindings::GrContextOptions_Enable as Enable;
8variant_name!(Enable::Yes);
9
10pub use skia_bindings::GrContextOptions_ShaderCacheStrategy as ShaderCacheStrategy;
11variant_name!(ShaderCacheStrategy::BackendSource);
12
13#[repr(C)]
14#[derive(Debug)]
15pub struct ContextOptions {
16    /// If Skia is creating a default VMA allocator for the Vulkan backend this value will be used
17    /// for the `preferred_large_heap_block_size`. If the value is not set, then Skia will use an
18    /// internally defined default size.
19    ///
20    /// However, it is highly discouraged to have Skia make a default allocator (and support for
21    /// doing so will be removed soon,  b/321962001). Instead clients should create their own
22    /// allocator to pass into Skia where they can fine tune this value themeselves.
23    vulkan_vma_large_heap_block_size: [u64; 2],
24
25    /// Optional callback that can be passed into the [`DirectContext`] which will be called when the
26    /// [`DirectContext`] is about to be destroyed. When this call is made, it will be safe for the
27    /// client to delete the GPU backend context that is backing the [`DirectContext`]. The
28    /// [`DirectContextDestroyedContext`] will be passed back to the client in the callback.
29    context_delete_context: sb::GrDirectContextDestroyedContext,
30    context_delete_proc: sb::GrDirectContextDestroyedProc,
31
32    /// Executor to handle threaded work within Ganesh. If this is `None`, then all work will be
33    /// done serially on the main thread. To have worker threads assist with various tasks, set this
34    /// to a valid [`sb::SkExecutor`] instance. Currently, used for software path rendering, but may
35    /// be used for other tasks.
36    executor: *mut sb::SkExecutor,
37
38    /// Cache in which to store compiled shader binaries between runs.
39    persistent_cache: *mut sb::GrContextOptions_PersistentCache,
40
41    /// If present, use this object to report shader compilation failures. If not, report failures
42    /// via [`Debugf`] and assert.
43    shader_error_handler: *mut sb::GrContextOptions_ShaderErrorHandler,
44
45    /// Default minimum size to use when allocating buffers for uploading data to textures. The
46    /// larger the value the more uploads can be packed into one buffer, but at the cost of
47    /// more gpu memory allocated that may not be used. Uploads larger than the minimum will still
48    /// work by allocating a dedicated buffer.
49    pub minimum_staging_buffer_size: usize,
50
51    /// The maximum size of cache textures used for Skia's Glyph cache.
52    pub glyph_cache_texture_maximum_bytes: usize,
53
54    /// Controls whether we check for GL errors after functions that allocate resources (e.g.
55    /// `glTexImage2d`), at the end of a GPU submission, or checking framebuffer completeness. The
56    /// results of shader compilation and program linking are always checked, regardless of this
57    /// option. Ignored on backends other than GL.
58    pub skip_gl_error_checks: Enable,
59
60    /// Can the glyph atlas use multiple textures. If allowed, the each texture's size is bound by
61    /// `glyph_cache_texture_maximum_bytes`.
62    pub allow_multiple_glyph_cache_textures: Enable,
63
64    /// Enables driver workaround to use draws instead of HW clears, e.g. `glClear` on the GL
65    /// backend.
66    pub use_draw_instead_of_clear: Enable,
67
68    /// Allow Ganesh to more aggressively reorder operations to reduce the number of render passes.
69    /// Offscreen draws will be done upfront instead of interrupting the main render pass when
70    /// possible. May increase VRAM usage, but still observes the resource cache limit.
71    ///
72    /// Enabled by default.
73    pub reduce_ops_task_splitting: Enable,
74
75    /// This affects the usage of the PersistentCache. We can cache `SL`, backend source (GLSL), or
76    /// backend binaries (GL program binaries). By default we cache binaries, but if the driver's
77    /// binary loading/storing is believed to have bugs, this can be limited to caching GLSL.
78    /// Caching GLSL strings still saves CPU work when a GL program is created.
79    pub shader_cache_strategy: ShaderCacheStrategy,
80
81    /// Overrides: These options override feature detection using backend API queries. These
82    /// overrides can only reduce the feature set or limits, never increase them beyond the detected
83    /// values.
84    pub max_texture_size_override: raw::c_int,
85
86    /// The threshold in bytes above which we will use a buffer mapping API to map vertex and index
87    /// buffers to CPU memory in order to update them.  A value of -1 means the `Context` should
88    /// deduce the optimal value for this platform.
89    pub buffer_map_threshold: raw::c_int,
90
91    /// Maximum number of GPU programs or pipelines to keep active in the runtime cache.
92    pub runtime_program_cache_size: raw::c_int,
93
94    /// Specifies the number of samples Ganesh should use when performing internal draws with MSAA
95    /// (hardware capabilities permitting).
96    ///
97    /// If 0, Ganesh will disable internal code paths that use multisampling.
98    pub internal_multisample_count: raw::c_int,
99
100    /// In Skia's vulkan backend a single `Context` submit equates to the submission of a single
101    /// primary command buffer to the VkQueue. This value specifies how many vulkan secondary command
102    /// buffers we will cache for reuse on a given primary command buffer. A single submit may use
103    /// more than this many secondary command buffers, but after the primary command buffer is
104    /// finished on the GPU it will only hold on to this many secondary command buffers for reuse.
105    ///
106    /// A value of -1 means we will pick a limit value internally.
107    pub max_cached_vulkan_secondary_command_buffers: raw::c_int,
108
109    /// Below this threshold size in device space distance field fonts won't be used. Distance field
110    /// fonts don't support hinting which is more important at smaller sizes.
111    pub min_distance_field_font_size: f32,
112
113    /// Above this threshold size in device space glyphs are drawn as individual paths.
114    pub glyphs_as_paths_font_size: f32,
115
116    pub driver_bug_workarounds: DriverBugWorkarounds,
117
118    /// Construct mipmaps manually, via repeated downsampling draw-calls. This is used when
119    /// the driver's implementation (`gl_generate_mipmap`) contains bugs. This requires mipmap
120    /// level control (ie desktop or ES3).
121    pub do_manual_mipmapping: bool,
122
123    /// Disables the use of coverage counting shortcuts to render paths. Coverage counting can cause
124    /// artifacts along shared edges if care isn't taken to ensure both contours wind in the same
125    /// direction.
126    pub disable_coverage_counting_paths: bool,
127
128    /// Disables distance field rendering for paths. Distance field computation can be expensive,
129    /// and yields no benefit if a path is not rendered multiple times with different transforms.
130    pub disable_distance_field_paths: bool,
131
132    /// If `true` this allows path mask textures to be cached. This is only really useful if paths
133    /// are commonly rendered at the same scale and fractional translation.
134    pub allow_path_mask_caching: bool,
135
136    /// If `true`, the GPU will not be used to perform YUV -> RGB conversion when generating
137    /// textures from codec-backed images.
138    pub disable_gpu_yuv_conversion: bool,
139
140    /// Bugs on certain drivers cause stencil buffers to leak. This flag causes Skia to avoid
141    /// allocating stencil buffers and use alternate rasterization paths, avoiding the leak.
142    pub avoid_stencil_buffers: bool,
143
144    /// If `true`, texture fetches from mip-mapped textures will be biased to read larger MIP levels.
145    /// This has the effect of sharpening those textures, at the cost of some aliasing, and possible
146    /// performance impact.
147    pub sharpen_mipmapped_textures: bool,
148
149    /// Some ES3 contexts report the ES2 external image extension, but not the ES3 version.
150    /// If support for external images is critical, enabling this option will cause Ganesh to limit
151    /// shaders to the ES2 shading language in that situation.
152    pub prefer_external_images_over_es3: bool,
153
154    /// Disables correctness workarounds that are enabled for particular GPUs, OSes, or drivers.
155    /// This does not affect code path choices that are made for performance reasons nor does it
156    /// override other [`ContextOptions`] settings.
157    pub disable_driver_correctness_workarounds: bool,
158
159    /// If `true`, the caps will never support mipmaps.
160    pub suppress_mipmap_support: bool,
161
162    /// If `true`, the TessellationPathRenderer will not be used for path rendering.
163    /// If `false`, will fallback to any driver workarounds, if set.
164    pub disable_tessellation_path_renderer: bool,
165
166    /// If `true`, and if supported, enables hardware tessellation in the caps.
167    /// DEPRECATED: This value is ignored; experimental hardware tessellation is always disabled.
168    pub enable_experimental_hardware_tessellation: bool,
169
170    /// If `true`, then add 1 pixel padding to all glyph masks in the atlas to support bi-lerp
171    /// rendering of all glyphs. This must be set to `true` to use Slugs.
172    pub support_bilerp_from_glyph_atlas: bool,
173
174    /// Uses a reduced variety of shaders. May perform less optimally in steady state but can reduce
175    /// jank due to shader compilations.
176    pub reduced_shader_variations: bool,
177
178    /// If `true`, then allow to enable MSAA on new Intel GPUs.
179    pub allow_msaa_on_new_intel: bool,
180
181    /// Currently on ARM Android we disable the use of GL TexStorage because of memory regressions.
182    /// However, some clients may still want to use TexStorage. For example, TexStorage support is
183    /// required for creating protected textures.
184    ///
185    /// This flag has no impact on non GL backends.
186    pub always_use_text_storage_when_available: bool,
187
188    // Suppress prints for the GrContext.
189    pub suppress_prints: bool,
190}
191unsafe_send_sync!(ContextOptions);
192
193impl Default for ContextOptions {
194    fn default() -> Self {
195        Self::construct(|ptr| unsafe { sb::C_GrContextOptions_Construct(ptr) })
196    }
197}
198
199impl ContextOptions {
200    pub fn new() -> Self {
201        Self::default()
202    }
203}
204
205native_transmutable!(GrContextOptions, ContextOptions, context_options_layout);
206
207// TODO: PersistentCache, ShaderErrorHandler