// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreTypes.h" #include "Misc/EnumClassFlags.h" #include "RHIAccess.h" #include using D3D12AccessUnderlyingType = std::underlying_type_t; enum class ED3D12Access : D3D12AccessUnderlyingType { Unknown = static_cast(ERHIAccess::Unknown), CPURead = static_cast(ERHIAccess::CPURead), Present = static_cast(ERHIAccess::Present), IndirectArgs = static_cast(ERHIAccess::IndirectArgs), VertexOrIndexBuffer = static_cast(ERHIAccess::VertexOrIndexBuffer), SRVCompute = static_cast(ERHIAccess::SRVCompute), SRVGraphicsPixel = static_cast(ERHIAccess::SRVGraphicsPixel), SRVGraphicsNonPixel = static_cast(ERHIAccess::SRVGraphicsNonPixel), CopySrc = static_cast(ERHIAccess::CopySrc), ResolveSrc = static_cast(ERHIAccess::ResolveSrc), DSVRead = static_cast(ERHIAccess::DSVRead), UAVCompute = static_cast(ERHIAccess::UAVCompute), UAVGraphics = static_cast(ERHIAccess::UAVGraphics), RTV = static_cast(ERHIAccess::RTV), CopyDest = static_cast(ERHIAccess::CopyDest), ResolveDst = static_cast(ERHIAccess::ResolveDst), DSVWrite = static_cast(ERHIAccess::DSVWrite), BVHRead = static_cast(ERHIAccess::BVHRead), BVHWrite = static_cast(ERHIAccess::BVHWrite), Discard = static_cast(ERHIAccess::Discard), ShadingRateSource = static_cast(ERHIAccess::ShadingRateSource), RHIAccessLast = ShadingRateSource, // D3D12 specific extensions Common = RHIAccessLast << 1, GenericRead = RHIAccessLast << 2, Last = GenericRead, Mask = (Last << 1) - 1, SRVGraphics = static_cast(ERHIAccess::SRVGraphics), SRVMask = static_cast(ERHIAccess::SRVMask), UAVMask = static_cast(ERHIAccess::UAVMask), ReadOnlyExclusiveMask = (static_cast(ERHIAccess::ReadOnlyExclusiveMask) | GenericRead) & ~BVHRead, ReadOnlyExclusiveComputeMask = static_cast(ERHIAccess::ReadOnlyExclusiveComputeMask) | GenericRead, ReadOnlyMask = static_cast(ERHIAccess::ReadOnlyMask), ReadableMask = static_cast(ERHIAccess::ReadableMask) | BVHRead, WriteOnlyExclusiveMask = static_cast(ERHIAccess::WriteOnlyExclusiveMask), WriteOnlyMask = static_cast(ERHIAccess::WriteOnlyMask), WritableMask = static_cast(ERHIAccess::WritableMask), }; static_assert( static_cast(ED3D12Access::RHIAccessLast) == static_cast(ERHIAccess::Last)); ENUM_CLASS_FLAGS(ED3D12Access); constexpr ED3D12Access ConvertToD3D12Access(ERHIAccess InRHIAccess) { return static_cast((static_cast(InRHIAccess))); } constexpr bool IsInvalidAccess(ED3D12Access InD3D12Access) { return ((EnumHasAnyFlags(InD3D12Access, ED3D12Access::ReadOnlyExclusiveMask) && EnumHasAnyFlags(InD3D12Access, ED3D12Access::WritableMask)) || (EnumHasAnyFlags(InD3D12Access, ED3D12Access::WriteOnlyExclusiveMask) && EnumHasAnyFlags(InD3D12Access, ED3D12Access::ReadableMask)) // Common should always be by itself || (EnumHasAnyFlags(InD3D12Access, ED3D12Access::Common) && !EnumHasOneFlag(InD3D12Access))); } constexpr bool IsValidAccess(ED3D12Access InD3D12Access) { return !IsInvalidAccess(InD3D12Access); }