astrelis_render/batched/
capability.rs1use crate::capability::{GpuRequirements, RenderCapability};
7use crate::features::GpuFeatures;
8
9use super::BINDLESS_MAX_TEXTURES;
10
11pub struct DirectBatchCapability2D;
15
16impl RenderCapability for DirectBatchCapability2D {
17 fn requirements() -> GpuRequirements {
18 GpuRequirements::none()
19 }
20
21 fn name() -> &'static str {
22 "DirectBatchCapability2D (Tier 1)"
23 }
24}
25
26pub struct IndirectBatchCapability2D;
30
31impl RenderCapability for IndirectBatchCapability2D {
32 fn requirements() -> GpuRequirements {
33 GpuRequirements::new().require_features(GpuFeatures::INDIRECT_FIRST_INSTANCE)
34 }
35
36 fn name() -> &'static str {
37 "IndirectBatchCapability2D (Tier 2)"
38 }
39}
40
41pub struct BindlessBatchCapability2D;
46
47impl RenderCapability for BindlessBatchCapability2D {
48 fn requirements() -> GpuRequirements {
49 GpuRequirements::new()
50 .require_features(
51 GpuFeatures::INDIRECT_FIRST_INSTANCE
52 | GpuFeatures::TEXTURE_BINDING_ARRAY
53 | GpuFeatures::PARTIALLY_BOUND_BINDING_ARRAY
54 | GpuFeatures::SAMPLED_TEXTURE_AND_STORAGE_BUFFER_ARRAY_NON_UNIFORM_INDEXING,
55 )
56 .with_min_limits(|l| {
57 l.max_binding_array_elements_per_shader_stage = BINDLESS_MAX_TEXTURES;
58 })
59 }
60
61 fn name() -> &'static str {
62 "BindlessBatchCapability2D (Tier 3)"
63 }
64}
65
66pub struct BestBatchCapability2D;
74
75impl RenderCapability for BestBatchCapability2D {
76 fn requirements() -> GpuRequirements {
77 GpuRequirements::new()
78 .request_features(
79 GpuFeatures::INDIRECT_FIRST_INSTANCE
80 | GpuFeatures::TEXTURE_BINDING_ARRAY
81 | GpuFeatures::PARTIALLY_BOUND_BINDING_ARRAY
82 | GpuFeatures::SAMPLED_TEXTURE_AND_STORAGE_BUFFER_ARRAY_NON_UNIFORM_INDEXING,
83 )
84 .with_min_limits(|l| {
85 l.max_binding_array_elements_per_shader_stage = BINDLESS_MAX_TEXTURES;
86 })
87 }
88
89 fn name() -> &'static str {
90 "BestBatchCapability2D (auto-detect)"
91 }
92}