yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
b118451e3
master
1#pragma once 2 3#include "core/slang-math.h" 4#include "slang-gfx.h" 5 6namespace gfx 7{ 8 9inline int calcMipSize (int size ,int level ) 10{ 11size = size >>level ; 12return size > 0 ?size :1 ; 13} 14 15inline ITextureResource ::Extents calcMipSize (ITextureResource ::Extents size ,int mipLevel ) 16{ 17ITextureResource ::Extents rs ; 18rs .width = calcMipSize (size .width ,mipLevel ); 19rs .height = calcMipSize (size .height ,mipLevel ); 20rs .depth = calcMipSize (size .depth ,mipLevel ); 21return rs ; 22} 23 24/// Calculate the effective array size - in essence the amount if mip map sets needed. 25/// In practice takes into account if the arraySize is 0 (it's not an array, but it will still have 26/// at least one mip set) and if the type is a cubemap (multiplies the amount of mip sets by 6) 27inline int calcEffectiveArraySize (const ITextureResource ::Desc & desc ) 28{ 29const int arrSize = (desc .arraySize > 0 ) ?desc .arraySize :1 ; 30 31switch (desc .type ) 32 { 33case IResource ::Type ::Texture1D :// fallthru 34case IResource ::Type ::Texture2D : 35 { 36return arrSize ; 37 } 38case IResource ::Type ::TextureCube : 39return arrSize * 6 ; 40case IResource ::Type ::Texture3D : 41return 1 ; 42default : 43return 0 ; 44 } 45} 46 47/// Given the type works out the maximum dimension size 48inline int calcMaxDimension (ITextureResource ::Extents size ,IResource ::Type type ) 49{ 50switch (type ) 51 { 52case IResource ::Type ::Texture1D : 53return size .width ; 54case IResource ::Type ::Texture3D : 55return Slang ::Math ::Max (Slang ::Math ::Max (size .width ,size .height ),size .depth ); 56case IResource ::Type ::TextureCube :// fallthru 57case IResource ::Type ::Texture2D : 58 { 59return Slang ::Math ::Max (size .width ,size .height ); 60 } 61default : 62return 0 ; 63 } 64} 65 66/// Given the type, calculates the number of mip maps. 0 on error 67inline int calcNumMipLevels (IResource ::Type type ,ITextureResource ::Extents size ) 68{ 69const int maxDimensionSize = calcMaxDimension (size ,type ); 70return (maxDimensionSize > 0 ) ? (Slang ::Math ::Log2Floor (maxDimensionSize )+ 1 ) :0 ; 71} 72/// Calculate the total number of sub resources. 0 on error. 73inline int calcNumSubResources (const ITextureResource ::Desc & desc ) 74{ 75const int numMipMaps = 76 (desc .numMipLevels > 0 ) ?desc .numMipLevels :calcNumMipLevels (desc .type ,desc .size ); 77const int arrSize = (desc .arraySize > 0 ) ?desc .arraySize :1 ; 78 79switch (desc .type ) 80 { 81case IResource ::Type ::Texture1D : 82case IResource ::Type ::Texture2D : 83case IResource ::Type ::Texture3D : 84 { 85return numMipMaps * arrSize ; 86 } 87case IResource ::Type ::TextureCube : 88 { 89// There are 6 faces to a cubemap 90return numMipMaps * arrSize * 6 ; 91 } 92default : 93return 0 ; 94 } 95} 96 97IBufferResource ::Desc fixupBufferDesc (const IBufferResource ::Desc & desc ); 98ITextureResource ::Desc fixupTextureDesc (const ITextureResource ::Desc & desc ); 99 100Format srgbToLinearFormat (Format format ); 101 102}// namespace gfx