UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
RHITextureUtils.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "RHIResources.h"
6
8{
9 static uint32 CalculateMipExtent(uint32 Extent, uint32 MipIndex)
10 {
11 return FMath::Max<uint32>(Extent >> MipIndex, 1);
12 }
13
14 static uint32 CalculateMipBlockCount(uint32 Extent, uint32 MipIndex, uint32 BlockSize)
15 {
16 return FMath::Max<uint32>(1, FMath::DivideAndRoundUp(CalculateMipExtent(Extent, MipIndex), BlockSize));
17 }
18
19 static FUintVector3 CalculateMipBlockCounts(const FRHITextureDesc& Desc, uint32 MipIndex, const FPixelFormatInfo& PixelFormat)
20 {
21 const uint32 NumBlocksX = UE::RHITextureUtils::CalculateMipBlockCount(Desc.Extent.X, MipIndex, PixelFormat.BlockSizeX);
22 const uint32 NumBlocksY = UE::RHITextureUtils::CalculateMipBlockCount(Desc.Extent.Y, MipIndex, PixelFormat.BlockSizeY);
23 const uint32 NumBlocksZ = UE::RHITextureUtils::CalculateMipBlockCount(Desc.Depth, MipIndex, PixelFormat.BlockSizeZ);
24
26 }
27
28 static FUintVector3 CalculateMipBlockCounts(const FRHITextureDesc& Desc, uint32 MipIndex)
29 {
30 const FPixelFormatInfo& PixelFormat = GPixelFormats[Desc.Format];
31 return CalculateMipBlockCounts(Desc, MipIndex, PixelFormat);
32 }
33
34 static FUintVector3 CalculateMipExtents(const FRHITextureDesc& Desc, uint32 MipIndex)
35 {
36 return FUintVector3(
37 CalculateMipExtent(Desc.Extent.X, MipIndex),
38 CalculateMipExtent(Desc.Extent.Y, MipIndex),
39 CalculateMipExtent(Desc.Depth, MipIndex)
40 );
41 }
42
43 static uint64 CalculateTextureMipSize(const FRHITextureDesc& Desc, uint32 MipIndex, uint64& OutStride)
44 {
45 const FPixelFormatInfo& PixelFormat = GPixelFormats[Desc.Format];
46
47 const FUintVector3 BlockCounts = CalculateMipBlockCounts(Desc, MipIndex, PixelFormat);
48 const uint64 MipStride = BlockCounts.X * PixelFormat.BlockBytes;
50
52 return SubresourceSize;
53 }
54
55 static uint64 CalculateTextureMipSize(const FRHITextureDesc& Desc, uint32 MipIndex)
56 {
58 return CalculateTextureMipSize(Desc, MipIndex, TempStride);
59 }
60
61 static uint64 CalculateTexturePlaneSize(const FRHITextureDesc& Desc)
62 {
63 uint64 PlaneSize = 0;
64 uint64 MipStride = 0;
65 for (uint32 MipIndex = 0; MipIndex < Desc.NumMips; MipIndex++)
66 {
67 PlaneSize += CalculateTextureMipSize(Desc, MipIndex, MipStride);
68 }
69 return PlaneSize;
70 }
71
73 {
74 const uint64 PlaneSize = CalculateTexturePlaneSize(Desc);
75 const uint64 FaceCount = Desc.IsTextureCube() ? 6 : 1;
76 return PlaneSize * Desc.ArraySize * Desc.Depth * FaceCount;
77 }
78
80 {
81 OutMipIndex = (SubresourceIndex % NumMips);
82 OutArrayIndex = (SubresourceIndex / NumMips) % NumSlices;
83 OutFaceIndex = (SubresourceIndex / (NumMips % NumSlices));
84 }
85
86 static uint64 CalculateSubresourceOffset(const FRHITextureDesc& Desc, int32 FaceIndex, int32 ArrayIndex, int32 MipIndex, uint64& OutStride, uint64& OutSize)
87 {
88 const uint64 FaceCount = Desc.IsTextureCube() ? 6 : 1;
89 const uint64 PlaneIndex = FaceIndex + ArrayIndex * FaceCount;
90
91 uint64 PlaneSize = 0;
92 if (PlaneIndex > 0)
93 {
94 PlaneSize = CalculateTexturePlaneSize(Desc);
95 }
96
97 const uint64 PlaneOffset = PlaneIndex * PlaneSize;
98
99 uint64 MipOffset = 0;
100 uint64 MipStride = 0;
101
102 for (int32 Index = 0; Index <= MipIndex; Index++)
103 {
104 const uint64 MipSize = CalculateTextureMipSize(Desc, Index, MipStride);
105
106 if (Index == MipIndex)
107 {
108 OutSize = MipSize;
110 }
111 else
112 {
113 MipOffset += MipSize;
114 }
115 }
116
117 return PlaneOffset + MipOffset;
118 }
119}
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
FPlatformTypes::uint64 uint64
A 64-bit unsigned integer.
Definition Platform.h:1117
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
uint64 CalculateTextureSize(const FRHITextureDesc &Desc)
Definition D3D12Texture.cpp:1005
UE::Math::TIntVector3< uint32 > FUintVector3
Definition MathFwd.h:104
FPixelFormatInfo GPixelFormats[PF_MAX]
Definition PixelFormat.cpp:31
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition RHITextureUtils.h:8
void SubresourceIndexToIndices(uint32 SubresourceIndex, uint32 NumMips, uint32 NumSlices, uint32 &OutFaceIndex, uint32 &OutArrayIndex, uint32 &OutMipIndex)
Definition RHITextureUtils.h:79
U16 Index
Definition radfft.cpp:71
static constexpr UE_FORCEINLINE_HINT T DivideAndRoundUp(T Dividend, T Divisor)
Definition UnrealMathUtility.h:694
Definition PixelFormat.h:453
int32 BlockSizeX
Definition PixelFormat.h:467
int32 BlockBytes
Definition PixelFormat.h:470
int32 BlockSizeZ
Definition PixelFormat.h:469
int32 BlockSizeY
Definition PixelFormat.h:468
Definition RHIResources.h:1689
uint16 Depth
Definition RHIResources.h:1859
EPixelFormat Format
Definition RHIResources.h:1874
bool IsTextureCube() const
Definition RHIResources.h:1800
uint16 ArraySize
Definition RHIResources.h:1862
uint8 NumMips
Definition RHIResources.h:1865
FIntPoint Extent
Definition RHIResources.h:1856
IntType Y
Definition IntPoint.h:37
IntType X
Definition IntPoint.h:34
Definition IntVector.h:22