diff --git a/src/descriptor.rs b/src/descriptor.rs index 2304e259cc..393f943918 100644 --- a/src/descriptor.rs +++ b/src/descriptor.rs @@ -1,5 +1,5 @@ use crate::{com::WeakPtr, Blob, D3DResult, Error, TextureAddressMode}; -use std::{mem, ops::Range}; +use std::{fmt, mem, ops::Range}; use winapi::{shared::dxgiformat, um::d3d12}; pub type CpuDescriptor = d3d12::D3D12_CPU_DESCRIPTOR_HANDLE; @@ -7,8 +7,8 @@ pub type GpuDescriptor = d3d12::D3D12_GPU_DESCRIPTOR_HANDLE; #[derive(Clone, Copy, Debug)] pub struct Binding { - pub register: u32, pub space: u32, + pub register: u32, } #[repr(u32)] @@ -72,6 +72,19 @@ impl DescriptorRange { } } +impl fmt::Debug for DescriptorRange { + fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter + .debug_struct("DescriptorRange") + .field("range_type", &self.0.RangeType) + .field("num", &self.0.NumDescriptors) + .field("register_space", &self.0.RegisterSpace) + .field("base_register", &self.0.BaseShaderRegister) + .field("table_offset", &self.0.OffsetInDescriptorsFromTableStart) + .finish() + } +} + #[repr(transparent)] pub struct RootParameter(d3d12::D3D12_ROOT_PARAMETER); impl RootParameter { @@ -139,6 +152,57 @@ impl RootParameter { } } +impl fmt::Debug for RootParameter { + fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + #[derive(Debug)] + enum Inner<'a> { + Table(&'a [DescriptorRange]), + Constants { binding: Binding, num: u32 }, + SingleCbv(Binding), + SingleSrv(Binding), + SingleUav(Binding), + } + let kind = match self.0.ParameterType { + d3d12::D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE => unsafe { + let raw = self.0.u.DescriptorTable(); + Inner::Table(std::slice::from_raw_parts( + raw.pDescriptorRanges as *const _, + raw.NumDescriptorRanges as usize, + )) + }, + d3d12::D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS => unsafe { + let raw = self.0.u.Constants(); + Inner::Constants { + binding: Binding { + space: raw.RegisterSpace, + register: raw.ShaderRegister, + }, + num: raw.Num32BitValues, + } + }, + _ => unsafe { + let raw = self.0.u.Descriptor(); + let binding = Binding { + space: raw.RegisterSpace, + register: raw.ShaderRegister, + }; + match self.0.ParameterType { + d3d12::D3D12_ROOT_PARAMETER_TYPE_CBV => Inner::SingleCbv(binding), + d3d12::D3D12_ROOT_PARAMETER_TYPE_SRV => Inner::SingleSrv(binding), + d3d12::D3D12_ROOT_PARAMETER_TYPE_UAV => Inner::SingleUav(binding), + other => panic!("Unexpected type {:?}", other), + } + }, + }; + + formatter + .debug_struct("RootParameter") + .field("visibility", &self.0.ShaderVisibility) + .field("kind", &kind) + .finish() + } +} + #[repr(u32)] #[derive(Copy, Clone, Debug)] pub enum StaticBorderColor {