use crate::capability::{GpuRequirements, RenderCapability};
use crate::features::GpuFeatures;
use super::BINDLESS_MAX_TEXTURES;
pub struct DirectBatchCapability2D;
impl RenderCapability for DirectBatchCapability2D {
fn requirements() -> GpuRequirements {
GpuRequirements::none()
}
fn name() -> &'static str {
"DirectBatchCapability2D (Tier 1)"
}
}
pub struct IndirectBatchCapability2D;
impl RenderCapability for IndirectBatchCapability2D {
fn requirements() -> GpuRequirements {
GpuRequirements::new().require_features(GpuFeatures::INDIRECT_FIRST_INSTANCE)
}
fn name() -> &'static str {
"IndirectBatchCapability2D (Tier 2)"
}
}
pub struct BindlessBatchCapability2D;
impl RenderCapability for BindlessBatchCapability2D {
fn requirements() -> GpuRequirements {
GpuRequirements::new()
.require_features(
GpuFeatures::INDIRECT_FIRST_INSTANCE
| GpuFeatures::TEXTURE_BINDING_ARRAY
| GpuFeatures::PARTIALLY_BOUND_BINDING_ARRAY
| GpuFeatures::SAMPLED_TEXTURE_AND_STORAGE_BUFFER_ARRAY_NON_UNIFORM_INDEXING,
)
.with_min_limits(|l| {
l.max_binding_array_elements_per_shader_stage = BINDLESS_MAX_TEXTURES;
})
}
fn name() -> &'static str {
"BindlessBatchCapability2D (Tier 3)"
}
}
pub struct BestBatchCapability2D;
impl RenderCapability for BestBatchCapability2D {
fn requirements() -> GpuRequirements {
GpuRequirements::new()
.request_features(
GpuFeatures::INDIRECT_FIRST_INSTANCE
| GpuFeatures::TEXTURE_BINDING_ARRAY
| GpuFeatures::PARTIALLY_BOUND_BINDING_ARRAY
| GpuFeatures::SAMPLED_TEXTURE_AND_STORAGE_BUFFER_ARRAY_NON_UNIFORM_INDEXING,
)
.with_min_limits(|l| {
l.max_binding_array_elements_per_shader_stage = BINDLESS_MAX_TEXTURES;
})
}
fn name() -> &'static str {
"BestBatchCapability2D (auto-detect)"
}
}