118 lines
5.1 KiB
Plaintext
118 lines
5.1 KiB
Plaintext
////////////////////////////////////////////////////////////
|
|
//~ Shader math types
|
|
|
|
#define Pi ((f32)3.14159265358979323846)
|
|
#define Tau ((f32)6.28318530717958647693)
|
|
#define GoldenRatio ((f32)1.61803398874989484820)
|
|
|
|
typedef float2 Vec2;
|
|
typedef float3 Vec3;
|
|
typedef float4 Vec4;
|
|
typedef int2 Vec2I32;
|
|
typedef int3 Vec3I32;
|
|
typedef int4 Vec4I32;
|
|
typedef uint2 Vec2U32;
|
|
typedef uint3 Vec3U32;
|
|
typedef uint4 Vec4U32;
|
|
typedef float2x3 Xform;
|
|
typedef float4 Rect;
|
|
typedef float4 ClipRect;
|
|
typedef float4 Aabb;
|
|
typedef float4 Quad;
|
|
typedef float4x4 Mat4x4;
|
|
|
|
////////////////////////////////////////////////////////////
|
|
//~ Handle dereference wrappers
|
|
|
|
/* TODO: Non-uniform resource access is assumed as the default behavior. We
|
|
* may want to add explicit "uniform" variants for optimization on AMD devices
|
|
* in the future. */
|
|
|
|
template<typename T> StructuredBuffer<T> StructuredBufferFromHandle(StructuredBufferHandle h) { return ResourceDescriptorHeap[NonUniformResourceIndex(h.v)]; }
|
|
template<typename T> RWStructuredBuffer<T> RWStructuredBufferFromHandle(RWStructuredBufferHandle h) { return ResourceDescriptorHeap[NonUniformResourceIndex(h.v)]; }
|
|
|
|
ByteAddressBuffer ByteAddressBufferFromHandle(ByteAddressBufferHandle h) { return ResourceDescriptorHeap[NonUniformResourceIndex(h.v)]; }
|
|
RWByteAddressBuffer RWByteAddressBufferFromHandle(RWByteAddressBufferHandle h) { return ResourceDescriptorHeap[NonUniformResourceIndex(h.v)]; }
|
|
|
|
template<typename T> Texture1D<T> Texture1DFromHandle(Texture1DHandle h) { return ResourceDescriptorHeap[NonUniformResourceIndex(h.v)]; }
|
|
template<typename T> Texture3D<T> Texture3DFromHandle(Texture3DHandle h) { return ResourceDescriptorHeap[NonUniformResourceIndex(h.v)]; }
|
|
template<typename T> RWTexture1D<T> RWTexture1DFromHandle(RWTexture1DHandle h) { return ResourceDescriptorHeap[NonUniformResourceIndex(h.v)]; }
|
|
template<typename T> Texture2D<T> Texture2DFromHandle(Texture2DHandle h) { return ResourceDescriptorHeap[NonUniformResourceIndex(h.v)]; }
|
|
template<typename T> RWTexture2D<T> RWTexture2DFromHandle(RWTexture2DHandle h) { return ResourceDescriptorHeap[NonUniformResourceIndex(h.v)]; }
|
|
template<typename T> RWTexture3D<T> RWTexture3DFromHandle(RWTexture3DHandle h) { return ResourceDescriptorHeap[NonUniformResourceIndex(h.v)]; }
|
|
|
|
SamplerState SamplerStateFromHandle(SamplerStateHandle h) { return SamplerDescriptorHeap[NonUniformResourceIndex(h.v)]; }
|
|
|
|
////////////////////////////////////////////////////////////
|
|
//~ Countof
|
|
|
|
template<typename T, u32 N> u32 countof(T arr[N]) { return N; }
|
|
template<typename T> u32 countof(StructuredBuffer<T> buff) { u32 result; buff.GetDimensions(result); return result; }
|
|
template<typename T> u32 countof(RWStructuredBuffer<T> buff) { u32 result; buff.GetDimensions(result); return result; }
|
|
u32 countof(ByteAddressBuffer buff) { u32 result; buff.GetDimensions(result); return result; }
|
|
u32 countof(RWByteAddressBuffer buff) { u32 result; buff.GetDimensions(result); return result; }
|
|
u32 countof(Texture1D tex) { u32 result; tex.GetDimensions(result); return result; }
|
|
template<typename T> u32 countof(RWTexture1D<T> tex) { u32 result; tex.GetDimensions(result); return result; }
|
|
Vec2U32 countof(Texture2D tex) { Vec2U32 result; tex.GetDimensions(result.x, result.y); return result; }
|
|
template<typename T> Vec2U32 countof(RWTexture2D<T> tex) { Vec2U32 result; tex.GetDimensions(result.x, result.y); return result; }
|
|
Vec3U32 countof(Texture3D tex) { Vec3U32 result; tex.GetDimensions(result.x, result.y, result.z); return result; }
|
|
template<typename T> Vec3U32 countof(RWTexture3D<T> tex) { Vec3U32 result; tex.GetDimensions(result.x, result.y, result.z); return result; }
|
|
|
|
////////////////////////////////////////////////////////////
|
|
//~ Color helpers
|
|
|
|
Vec4 Vec4FromU32(u32 v)
|
|
{
|
|
Vec4 result;
|
|
result.x = ((v >> 0) & 0xFF) / 255.0;
|
|
result.y = ((v >> 8) & 0xFF) / 255.0;
|
|
result.z = ((v >> 16) & 0xFF) / 255.0;
|
|
result.w = ((v >> 24) & 0xFF) / 255.0;
|
|
return result;
|
|
}
|
|
|
|
u32 U32FromVec4(Vec4 v)
|
|
{
|
|
u32 result;
|
|
result |= (((u32)(v.x * 255.0)) & 0xFF) << 0;
|
|
result |= (((u32)(v.y * 255.0)) & 0xFF) << 8;
|
|
result |= (((u32)(v.z * 255.0)) & 0xFF) << 16;
|
|
result |= (((u32)(v.w * 255.0)) & 0xFF) << 24;
|
|
return result;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////
|
|
//~ Vertex ID helpers
|
|
|
|
Vec2 RectUvFromVertexId(u32 id)
|
|
{
|
|
static const Vec2 uvs[4] = {
|
|
Vec2(0, 0),
|
|
Vec2(1, 0),
|
|
Vec2(1, 1),
|
|
Vec2(0, 1)
|
|
};
|
|
return uvs[id];
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////
|
|
//~ Ndc helpers
|
|
|
|
Vec2 NdcFromPos(Vec2 pos, Vec2 size)
|
|
{
|
|
Vec2 result;
|
|
result = pos / size;
|
|
result *= Vec2(2, -2);
|
|
result += Vec2(-1, 1);
|
|
return result;
|
|
}
|
|
|
|
Vec2 NdcFromUv(Vec2 uv)
|
|
{
|
|
Vec2 result;
|
|
result = uv;
|
|
result *= Vec2(2, -2);
|
|
result += Vec2(-1, 1);
|
|
return result;
|
|
}
|