skia_safe/gpu/ganesh/
context_options.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
use std::os::raw;

use skia_bindings::{self as sb, GrContextOptions};

use crate::{gpu::DriverBugWorkarounds, prelude::*};

pub use skia_bindings::GrContextOptions_Enable as Enable;
variant_name!(Enable::Yes);

pub use skia_bindings::GrContextOptions_ShaderCacheStrategy as ShaderCacheStrategy;
variant_name!(ShaderCacheStrategy::BackendSource);

#[repr(C)]
#[derive(Debug)]
pub struct ContextOptions {
    // Suppress prints for the GrContext.
    pub suppress_prints: bool,

    /// Controls whether we check for GL errors after functions that allocate resources (e.g.
    /// `glTexImage2d`), at the end of a GPU submission, or checking framebuffer completeness. The
    /// results of shader compilation and program linking are always checked, regardless of this
    /// option. Ignored on backends other than GL.
    pub skip_gl_error_checks: Enable,

    /// Overrides: These options override feature detection using backend API queries. These
    /// overrides can only reduce the feature set or limits, never increase them beyond the detected
    /// values.
    pub max_texture_size_override: raw::c_int,

    /// The threshold in bytes above which we will use a buffer mapping API to map vertex and index
    /// buffers to CPU memory in order to update them.  A value of -1 means the `Context` should
    /// deduce the optimal value for this platform.
    pub buffer_map_threshold: raw::c_int,

    /// Default minimum size to use when allocating buffers for uploading data to textures. The
    /// larger the value the more uploads can be packed into one buffer, but at the cost of
    /// more gpu memory allocated that may not be used. Uploads larger than the minimum will still
    /// work by allocating a dedicated buffer.
    pub minimum_staging_buffer_size: usize,

    executor: *mut sb::SkExecutor,

    /// Construct mipmaps manually, via repeated downsampling draw-calls. This is used when
    /// the driver's implementation (`gl_generate_mipmap`) contains bugs. This requires mipmap
    /// level control (ie desktop or ES3).
    pub do_manual_mipmapping: bool,

    /// Disables the use of coverage counting shortcuts to render paths. Coverage counting can cause
    /// artifacts along shared edges if care isn't taken to ensure both contours wind in the same
    /// direction.
    pub disable_coverage_counting_paths: bool,

    /// Disables distance field rendering for paths. Distance field computation can be expensive,
    /// and yields no benefit if a path is not rendered multiple times with different transforms.
    pub disable_distance_field_paths: bool,

    /// If `true` this allows path mask textures to be cached. This is only really useful if paths
    /// are commonly rendered at the same scale and fractional translation.
    pub allow_path_mask_caching: bool,

    /// If `true`, the GPU will not be used to perform YUV -> RGB conversion when generating
    /// textures from codec-backed images.
    pub disable_gpu_yuv_conversion: bool,

    /// The maximum size of cache textures used for Skia's Glyph cache.
    pub glyph_cache_texture_maximum_bytes: usize,

    /// Below this threshold size in device space distance field fonts won't be used. Distance field
    /// fonts don't support hinting which is more important at smaller sizes.
    pub min_distance_field_font_size: f32,

    /// Above this threshold size in device space glyphs are drawn as individual paths.
    pub glyphs_as_paths_font_size: f32,

    /// Can the glyph atlas use multiple textures. If allowed, the each texture's size is bound by
    /// `glyph_cache_texture_maximum_bytes`.
    pub allow_multiple_glyph_cache_textures: Enable,

    /// Bugs on certain drivers cause stencil buffers to leak. This flag causes Skia to avoid
    /// allocating stencil buffers and use alternate rasterization paths, avoiding the leak.
    pub avoid_stencil_buffers: bool,

    /// If `true`, texture fetches from mip-mapped textures will be biased to read larger MIP levels.
    /// This has the effect of sharpening those textures, at the cost of some aliasing, and possible
    /// performance impact.
    pub sharpen_mipmapped_textures: bool,

    /// Enables driver workaround to use draws instead of HW clears, e.g. `glClear` on the GL
    /// backend.
    pub use_draw_instead_of_clear: Enable,

    /// Allow Ganesh to more aggressively reorder operations to reduce the number of render passes.
    /// Offscreen draws will be done upfront instead of interrupting the main render pass when
    /// possible. May increase VRAM usage, but still observes the resource cache limit.
    ///
    /// Enabled by default.
    pub reduce_ops_task_splitting: Enable,

    /// Some ES3 contexts report the ES2 external image extension, but not the ES3 version.
    /// If support for external images is critical, enabling this option will cause Ganesh to limit
    /// shaders to the ES2 shading language in that situation.
    pub prefer_external_images_over_es3: bool,

    /// Disables correctness workarounds that are enabled for particular GPUs, OSes, or drivers.
    /// This does not affect code path choices that are made for performance reasons nor does it
    /// override other [`ContextOptions`] settings.
    pub disable_driver_correctness_workarounds: bool,

    /// Maximum number of GPU programs or pipelines to keep active in the runtime cache.
    pub runtime_program_cache_size: raw::c_int,

    /// Cache in which to store compiled shader binaries between runs.
    persistent_cache: *mut sb::GrContextOptions_PersistentCache,

    /// This affects the usage of the PersistentCache. We can cache `SL`, backend source (GLSL), or
    /// backend binaries (GL program binaries). By default we cache binaries, but if the driver's
    /// binary loading/storing is believed to have bugs, this can be limited to caching GLSL.
    /// Caching GLSL strings still saves CPU work when a GL program is created.
    pub shader_cache_strategy: ShaderCacheStrategy,

    /// If present, use this object to report shader compilation failures. If not, report failures
    /// via [`Debugf`] and assert.
    shader_error_handler: *mut sb::GrContextOptions_ShaderErrorHandler,

    /// Specifies the number of samples Ganesh should use when performing internal draws with MSAA
    /// (hardware capabilities permitting).
    ///
    /// If 0, Ganesh will disable internal code paths that use multisampling.
    pub internal_multisample_count: raw::c_int,

    /// In Skia's vulkan backend a single `Context` submit equates to the submission of a single
    /// primary command buffer to the VkQueue. This value specifies how many vulkan secondary command
    /// buffers we will cache for reuse on a given primary command buffer. A single submit may use
    /// more than this many secondary command buffers, but after the primary command buffer is
    /// finished on the GPU it will only hold on to this many secondary command buffers for reuse.
    ///
    /// A value of -1 means we will pick a limit value internally.
    pub max_cached_vulkan_secondary_command_buffers: raw::c_int,

    /// If Skia is creating a default VMA allocator for the Vulkan backend this value will be used
    /// for the `preferred_large_heap_block_size`. If the value is not set, then Skia will use an
    /// internally defined default size.
    ///
    /// However, it is highly discouraged to have Skia make a default allocator (and support for
    /// doing so will be removed soon,  b/321962001). Instead clients should create their own
    /// allocator to pass into Skia where they can fine tune this value themeselves.
    vulkan_vma_large_heap_block_size: [u64; 2],

    /// If `true`, the caps will never support mipmaps.
    pub suppress_mipmap_support: bool,

    /// If `true`, the TessellationPathRenderer will not be used for path rendering.
    /// If `false`, will fallback to any driver workarounds, if set.
    pub disable_tessellation_path_renderer: bool,

    /// If `true`, and if supported, enables hardware tessellation in the caps.
    /// DEPRECATED: This value is ignored; experimental hardware tessellation is always disabled.
    pub enable_experimental_hardware_tessellation: bool,

    /// If `true`, then add 1 pixel padding to all glyph masks in the atlas to support bi-lerp
    /// rendering of all glyphs. This must be set to `true` to use Slugs.
    pub support_bilerp_from_glyph_atlas: bool,

    /// Uses a reduced variety of shaders. May perform less optimally in steady state but can reduce
    /// jank due to shader compilations.
    pub reduced_shader_variations: bool,

    /// If `true`, then allow to enable MSAA on new Intel GPUs.
    pub allow_msaa_on_new_intel: bool,

    /// Currently on ARM Android we disable the use of GL TexStorage because of memory regressions.
    /// However, some clients may still want to use TexStorage. For example, TexStorage support is
    /// required for creating protected textures.
    ///
    /// This flag has no impact on non GL backends.
    pub always_use_text_storage_when_available: bool,

    /// Optional callback that can be passed into the [`DirectContext`] which will be called when the
    /// [`DirectContext`] is about to be destroyed. When this call is made, it will be safe for the
    /// client to delete the GPU backend context that is backing the [`DirectContext`]. The
    /// [`DirectContextDestroyedContext`] will be passed back to the client in the callback.
    context_delete_context: sb::GrDirectContextDestroyedContext,
    context_delete_proc: sb::GrDirectContextDestroyedProc,
    pub driver_bug_workarounds: DriverBugWorkarounds,
}
unsafe_send_sync!(ContextOptions);

impl Default for ContextOptions {
    fn default() -> Self {
        Self::construct(|ptr| unsafe { sb::C_GrContextOptions_Construct(ptr) })
    }
}

impl ContextOptions {
    pub fn new() -> Self {
        Self::default()
    }
}

native_transmutable!(GrContextOptions, ContextOptions, context_options_layout);

// TODO: PersistentCache, ShaderErrorHandler