use crate::graph::{RenderGraphNodeId, RenderGraphResourceName};
use rafx_api::RafxResourceType;
#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
pub struct RenderGraphBufferUsageId(pub(super) usize);
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
pub struct VirtualBufferId(pub(super) usize);
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
pub struct PhysicalBufferId(pub(super) usize);
#[derive(Debug, Copy, Clone)]
pub struct RenderGraphExternalBufferId(pub(super) usize);
#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
pub struct RenderGraphBufferVersionId {
pub(super) index: usize,
pub(super) version: usize,
}
#[derive(Debug)]
pub struct RenderGraphBufferResource {
pub(super) name: Option<RenderGraphResourceName>,
pub(super) versions: Vec<RenderGraphBufferResourceVersionInfo>,
}
impl RenderGraphBufferResource {
pub(super) fn new() -> Self {
RenderGraphBufferResource {
name: None,
versions: Default::default(),
}
}
}
#[derive(Debug, Clone, Copy)]
pub enum RenderGraphBufferUser {
Node(RenderGraphNodeId),
Input(RenderGraphExternalBufferId),
Output(RenderGraphExternalBufferId),
}
#[derive(Debug)]
pub struct RenderGraphBufferUsage {
#[allow(unused)]
pub(super) user: RenderGraphBufferUser,
pub(super) usage_type: RenderGraphBufferUsageType,
pub(super) version: RenderGraphBufferVersionId,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct RenderGraphBufferSpecification {
pub size: u64,
pub resource_type: RafxResourceType,
}
impl RenderGraphBufferSpecification {
pub fn can_merge(
&self,
other: &RenderGraphBufferSpecification,
) -> bool {
if self.size != other.size {
return false;
}
true
}
pub fn try_merge(
&mut self,
other: &RenderGraphBufferSpecification,
) -> bool {
if !self.can_merge(other) {
return false;
}
self.resource_type |= other.resource_type;
true
}
pub fn specifications_are_compatible(
written: &RenderGraphBufferSpecification,
read: &RenderGraphBufferSpecification,
) -> bool {
if written.size != read.size {
return false;
}
if (written.resource_type | read.resource_type) != written.resource_type {
return false;
}
return true;
}
}
#[derive(Clone, Debug)]
pub struct RenderGraphBufferConstraint {
pub size: Option<u64>,
pub resource_type: RafxResourceType,
}
impl Default for RenderGraphBufferConstraint {
fn default() -> Self {
RenderGraphBufferConstraint {
size: None,
resource_type: RafxResourceType::UNDEFINED,
}
}
}
impl From<RenderGraphBufferSpecification> for RenderGraphBufferConstraint {
fn from(specification: RenderGraphBufferSpecification) -> Self {
RenderGraphBufferConstraint {
size: Some(specification.size),
resource_type: specification.resource_type,
}
}
}
impl RenderGraphBufferConstraint {
pub fn try_convert_to_specification(self) -> Option<RenderGraphBufferSpecification> {
if self.size.is_none() {
None
} else {
Some(RenderGraphBufferSpecification {
size: self.size.unwrap(),
resource_type: self.resource_type,
})
}
}
}
impl RenderGraphBufferConstraint {
pub fn can_merge(
&self,
other: &RenderGraphBufferConstraint,
) -> bool {
if self.size.is_some() && other.size.is_some() && self.size != other.size {
return false;
}
true
}
pub fn try_merge(
&mut self,
other: &RenderGraphBufferConstraint,
) -> bool {
if !self.can_merge(other) {
return false;
}
if self.size.is_none() && other.size.is_some() {
self.size = other.size;
}
self.resource_type |= other.resource_type;
true
}
pub fn partial_merge(
&mut self,
other: &RenderGraphBufferConstraint,
) -> bool {
let mut complete_merge = true;
if self.size.is_some() && other.size.is_some() && self.size != other.size {
complete_merge = false;
} else if other.size.is_some() {
self.size = other.size;
}
self.resource_type |= other.resource_type;
complete_merge
}
pub fn set(
&mut self,
other: &RenderGraphBufferSpecification,
) {
*self = other.clone().into();
}
}
#[derive(Copy, Clone, Debug, PartialEq)]
pub enum RenderGraphBufferUsageType {
Create,
Input,
Read,
ModifyRead,
ModifyWrite,
Output,
}
impl RenderGraphBufferUsageType {
pub fn is_read_only(&self) -> bool {
match self {
RenderGraphBufferUsageType::Read => true,
RenderGraphBufferUsageType::Output => true,
RenderGraphBufferUsageType::ModifyRead => false,
RenderGraphBufferUsageType::Create => false,
RenderGraphBufferUsageType::Input => false,
RenderGraphBufferUsageType::ModifyWrite => false,
}
}
}
#[derive(Debug)]
pub struct RenderGraphBufferResourceVersionInfo {
pub(super) creator_node: RenderGraphNodeId,
pub(super) create_usage: RenderGraphBufferUsageId,
pub(super) read_usages: Vec<RenderGraphBufferUsageId>,
}
impl RenderGraphBufferResourceVersionInfo {
pub(super) fn new(
creator: RenderGraphNodeId,
create_usage: RenderGraphBufferUsageId,
) -> Self {
RenderGraphBufferResourceVersionInfo {
creator_node: creator,
create_usage,
read_usages: Default::default(),
}
}
pub(super) fn add_read_usage(
&mut self,
usage: RenderGraphBufferUsageId,
) {
self.read_usages.push(usage);
}
}