| | #ifndef SLANG_PRELUDE_CPP_TYPES_H |
| | #define SLANG_PRELUDE_CPP_TYPES_H |
| |
|
| | #ifdef SLANG_PRELUDE_NAMESPACE |
| | namespace SLANG_PRELUDE_NAMESPACE { |
| | #endif |
| |
|
| | #ifndef SLANG_FORCE_INLINE |
| | # define SLANG_FORCE_INLINE inline |
| | #endif |
| |
|
| | #include "slang-cpp-types-core.h" |
| |
|
| | typedef Vector<float, 2> float2; |
| | typedef Vector<float, 3> float3; |
| | typedef Vector<float, 4> float4; |
| |
|
| | typedef Vector<int32_t, 2> int2; |
| | typedef Vector<int32_t, 3> int3; |
| | typedef Vector<int32_t, 4> int4; |
| |
|
| | typedef Vector<uint32_t, 2> uint2; |
| | typedef Vector<uint32_t, 3> uint3; |
| | typedef Vector<uint32_t, 4> uint4; |
| |
|
| | |
| | |
| | typedef size_t NonUniformResourceIndex; |
| |
|
| | |
| |
|
| | |
| | |
| |
|
| | template <typename T> |
| | struct RWStructuredBuffer |
| | { |
| | SLANG_FORCE_INLINE T& operator[](size_t index) const { SLANG_BOUND_CHECK(index, count); return data[index]; } |
| | const T& Load(size_t index) const { SLANG_BOUND_CHECK(index, count); return data[index]; } |
| | void GetDimensions(uint32_t* outNumStructs, uint32_t* outStride) { *outNumStructs = uint32_t(count); *outStride = uint32_t(sizeof(T)); } |
| | |
| | T* data; |
| | size_t count; |
| | }; |
| |
|
| | template <typename T> |
| | struct StructuredBuffer |
| | { |
| | SLANG_FORCE_INLINE const T& operator[](size_t index) const { SLANG_BOUND_CHECK(index, count); return data[index]; } |
| | const T& Load(size_t index) const { SLANG_BOUND_CHECK(index, count); return data[index]; } |
| | void GetDimensions(uint32_t* outNumStructs, uint32_t* outStride) { *outNumStructs = uint32_t(count); *outStride = uint32_t(sizeof(T)); } |
| | |
| | T* data; |
| | size_t count; |
| | }; |
| |
|
| |
|
| | template <typename T> |
| | struct RWBuffer |
| | { |
| | SLANG_FORCE_INLINE T& operator[](size_t index) const { SLANG_BOUND_CHECK(index, count); return data[index]; } |
| | const T& Load(size_t index) const { SLANG_BOUND_CHECK(index, count); return data[index]; } |
| | void GetDimensions(uint32_t* outCount) { *outCount = uint32_t(count); } |
| | |
| | T* data; |
| | size_t count; |
| | }; |
| |
|
| | template <typename T> |
| | struct Buffer |
| | { |
| | SLANG_FORCE_INLINE const T& operator[](size_t index) const { SLANG_BOUND_CHECK(index, count); return data[index]; } |
| | const T& Load(size_t index) const { SLANG_BOUND_CHECK(index, count); return data[index]; } |
| | void GetDimensions(uint32_t* outCount) { *outCount = uint32_t(count); } |
| | |
| | T* data; |
| | size_t count; |
| | }; |
| |
|
| | |
| | struct ByteAddressBuffer |
| | { |
| | void GetDimensions(uint32_t* outDim) const { *outDim = uint32_t(sizeInBytes); } |
| | uint32_t Load(size_t index) const |
| | { |
| | SLANG_BOUND_CHECK_BYTE_ADDRESS(index, 4, sizeInBytes); |
| | return data[index >> 2]; |
| | } |
| | uint2 Load2(size_t index) const |
| | { |
| | SLANG_BOUND_CHECK_BYTE_ADDRESS(index, 8, sizeInBytes); |
| | const size_t dataIdx = index >> 2; |
| | return uint2{data[dataIdx], data[dataIdx + 1]}; |
| | } |
| | uint3 Load3(size_t index) const |
| | { |
| | SLANG_BOUND_CHECK_BYTE_ADDRESS(index, 12, sizeInBytes); |
| | const size_t dataIdx = index >> 2; |
| | return uint3{data[dataIdx], data[dataIdx + 1], data[dataIdx + 2]}; |
| | } |
| | uint4 Load4(size_t index) const |
| | { |
| | SLANG_BOUND_CHECK_BYTE_ADDRESS(index, 16, sizeInBytes); |
| | const size_t dataIdx = index >> 2; |
| | return uint4{data[dataIdx], data[dataIdx + 1], data[dataIdx + 2], data[dataIdx + 3]}; |
| | } |
| | template<typename T> |
| | T Load(size_t index) const |
| | { |
| | SLANG_BOUND_CHECK_BYTE_ADDRESS(index, sizeof(T), sizeInBytes); |
| | return *(const T*)(((const char*)data) + index); |
| | } |
| | |
| | const uint32_t* data; |
| | size_t sizeInBytes; |
| | }; |
| |
|
| | |
| | |
| | |
| | struct RWByteAddressBuffer |
| | { |
| | void GetDimensions(uint32_t* outDim) const { *outDim = uint32_t(sizeInBytes); } |
| | |
| | uint32_t Load(size_t index) const |
| | { |
| | SLANG_BOUND_CHECK_BYTE_ADDRESS(index, 4, sizeInBytes); |
| | return data[index >> 2]; |
| | } |
| | uint2 Load2(size_t index) const |
| | { |
| | SLANG_BOUND_CHECK_BYTE_ADDRESS(index, 8, sizeInBytes); |
| | const size_t dataIdx = index >> 2; |
| | return uint2{data[dataIdx], data[dataIdx + 1]}; |
| | } |
| | uint3 Load3(size_t index) const |
| | { |
| | SLANG_BOUND_CHECK_BYTE_ADDRESS(index, 12, sizeInBytes); |
| | const size_t dataIdx = index >> 2; |
| | return uint3{data[dataIdx], data[dataIdx + 1], data[dataIdx + 2]}; |
| | } |
| | uint4 Load4(size_t index) const |
| | { |
| | SLANG_BOUND_CHECK_BYTE_ADDRESS(index, 16, sizeInBytes); |
| | const size_t dataIdx = index >> 2; |
| | return uint4{data[dataIdx], data[dataIdx + 1], data[dataIdx + 2], data[dataIdx + 3]}; |
| | } |
| | template<typename T> |
| | T Load(size_t index) const |
| | { |
| | SLANG_BOUND_CHECK_BYTE_ADDRESS(index, sizeof(T), sizeInBytes); |
| | return *(const T*)(((const char*)data) + index); |
| | } |
| |
|
| | void Store(size_t index, uint32_t v) const |
| | { |
| | SLANG_BOUND_CHECK_BYTE_ADDRESS(index, 4, sizeInBytes); |
| | data[index >> 2] = v; |
| | } |
| | void Store2(size_t index, uint2 v) const |
| | { |
| | SLANG_BOUND_CHECK_BYTE_ADDRESS(index, 8, sizeInBytes); |
| | const size_t dataIdx = index >> 2; |
| | data[dataIdx + 0] = v.x; |
| | data[dataIdx + 1] = v.y; |
| | } |
| | void Store3(size_t index, uint3 v) const |
| | { |
| | SLANG_BOUND_CHECK_BYTE_ADDRESS(index, 12, sizeInBytes); |
| | const size_t dataIdx = index >> 2; |
| | data[dataIdx + 0] = v.x; |
| | data[dataIdx + 1] = v.y; |
| | data[dataIdx + 2] = v.z; |
| | } |
| | void Store4(size_t index, uint4 v) const |
| | { |
| | SLANG_BOUND_CHECK_BYTE_ADDRESS(index, 16, sizeInBytes); |
| | const size_t dataIdx = index >> 2; |
| | data[dataIdx + 0] = v.x; |
| | data[dataIdx + 1] = v.y; |
| | data[dataIdx + 2] = v.z; |
| | data[dataIdx + 3] = v.w; |
| | } |
| | template<typename T> |
| | void Store(size_t index, T const& value) const |
| | { |
| | SLANG_BOUND_CHECK_BYTE_ADDRESS(index, sizeof(T), sizeInBytes); |
| | *(T*)(((char*)data) + index) = value; |
| | } |
| |
|
| | uint32_t* data; |
| | size_t sizeInBytes; |
| | }; |
| |
|
| | struct ISamplerState; |
| | struct ISamplerComparisonState; |
| |
|
| | struct SamplerState |
| | { |
| | ISamplerState* state; |
| | }; |
| |
|
| | struct SamplerComparisonState |
| | { |
| | ISamplerComparisonState* state; |
| | }; |
| |
|
| | #ifndef SLANG_RESOURCE_SHAPE |
| | # define SLANG_RESOURCE_SHAPE |
| | typedef unsigned int SlangResourceShape; |
| | enum |
| | { |
| | SLANG_RESOURCE_BASE_SHAPE_MASK = 0x0F, |
| |
|
| | SLANG_RESOURCE_NONE = 0x00, |
| |
|
| | SLANG_TEXTURE_1D = 0x01, |
| | SLANG_TEXTURE_2D = 0x02, |
| | SLANG_TEXTURE_3D = 0x03, |
| | SLANG_TEXTURE_CUBE = 0x04, |
| | SLANG_TEXTURE_BUFFER = 0x05, |
| |
|
| | SLANG_STRUCTURED_BUFFER = 0x06, |
| | SLANG_BYTE_ADDRESS_BUFFER = 0x07, |
| | SLANG_RESOURCE_UNKNOWN = 0x08, |
| | SLANG_ACCELERATION_STRUCTURE = 0x09, |
| | SLANG_TEXTURE_SUBPASS = 0x0A, |
| |
|
| | SLANG_RESOURCE_EXT_SHAPE_MASK = 0xF0, |
| |
|
| | SLANG_TEXTURE_FEEDBACK_FLAG = 0x10, |
| | SLANG_TEXTURE_ARRAY_FLAG = 0x40, |
| | SLANG_TEXTURE_MULTISAMPLE_FLAG = 0x80, |
| |
|
| | SLANG_TEXTURE_1D_ARRAY = SLANG_TEXTURE_1D | SLANG_TEXTURE_ARRAY_FLAG, |
| | SLANG_TEXTURE_2D_ARRAY = SLANG_TEXTURE_2D | SLANG_TEXTURE_ARRAY_FLAG, |
| | SLANG_TEXTURE_CUBE_ARRAY = SLANG_TEXTURE_CUBE | SLANG_TEXTURE_ARRAY_FLAG, |
| |
|
| | SLANG_TEXTURE_2D_MULTISAMPLE = SLANG_TEXTURE_2D | SLANG_TEXTURE_MULTISAMPLE_FLAG, |
| | SLANG_TEXTURE_2D_MULTISAMPLE_ARRAY = |
| | SLANG_TEXTURE_2D | SLANG_TEXTURE_MULTISAMPLE_FLAG | SLANG_TEXTURE_ARRAY_FLAG, |
| | SLANG_TEXTURE_SUBPASS_MULTISAMPLE = SLANG_TEXTURE_SUBPASS | SLANG_TEXTURE_MULTISAMPLE_FLAG, |
| | }; |
| | #endif |
| |
|
| | |
| | struct TextureDimensions |
| | { |
| | void reset() |
| | { |
| | shape = 0; |
| | width = height = depth = 0; |
| | numberOfLevels = 0; |
| | arrayElementCount = 0; |
| | } |
| | int getDimSizes(uint32_t outDims[4]) const |
| | { |
| | const auto baseShape = (shape & SLANG_RESOURCE_BASE_SHAPE_MASK); |
| | int count = 0; |
| | switch (baseShape) |
| | { |
| | case SLANG_TEXTURE_1D: |
| | { |
| | outDims[count++] = width; |
| | break; |
| | } |
| | case SLANG_TEXTURE_2D: |
| | { |
| | outDims[count++] = width; |
| | outDims[count++] = height; |
| | break; |
| | } |
| | case SLANG_TEXTURE_3D: |
| | { |
| | outDims[count++] = width; |
| | outDims[count++] = height; |
| | outDims[count++] = depth; |
| | break; |
| | } |
| | case SLANG_TEXTURE_CUBE: |
| | { |
| | outDims[count++] = width; |
| | outDims[count++] = height; |
| | outDims[count++] = 6; |
| | break; |
| | } |
| | } |
| |
|
| | if (shape & SLANG_TEXTURE_ARRAY_FLAG) |
| | { |
| | outDims[count++] = arrayElementCount; |
| | } |
| | return count; |
| | } |
| | int getMIPDims(int outDims[3]) const |
| | { |
| | const auto baseShape = (shape & SLANG_RESOURCE_BASE_SHAPE_MASK); |
| | int count = 0; |
| | switch (baseShape) |
| | { |
| | case SLANG_TEXTURE_1D: |
| | { |
| | outDims[count++] = width; |
| | break; |
| | } |
| | case SLANG_TEXTURE_CUBE: |
| | case SLANG_TEXTURE_2D: |
| | { |
| | outDims[count++] = width; |
| | outDims[count++] = height; |
| | break; |
| | } |
| | case SLANG_TEXTURE_3D: |
| | { |
| | outDims[count++] = width; |
| | outDims[count++] = height; |
| | outDims[count++] = depth; |
| | break; |
| | } |
| | } |
| | return count; |
| | } |
| | int calcMaxMIPLevels() const |
| | { |
| | int dims[3]; |
| | const int dimCount = getMIPDims(dims); |
| | for (int count = 1; true; count++) |
| | { |
| | bool allOne = true; |
| | for (int i = 0; i < dimCount; ++i) |
| | { |
| | if (dims[i] > 1) |
| | { |
| | allOne = false; |
| | dims[i] >>= 1; |
| | } |
| | } |
| | if (allOne) |
| | { |
| | return count; |
| | } |
| | } |
| | } |
| |
|
| | uint32_t shape; |
| | uint32_t width, height, depth; |
| | uint32_t numberOfLevels; |
| | uint32_t arrayElementCount; |
| | }; |
| |
|
| |
|
| |
|
| |
|
| |
|
| | |
| |
|
| | struct ITexture |
| | { |
| | virtual TextureDimensions GetDimensions(int mipLevel = -1) = 0; |
| | virtual void Load(const int32_t* v, void* outData, size_t dataSize) = 0; |
| | virtual void Sample(SamplerState samplerState, const float* loc, void* outData, size_t dataSize) = 0; |
| | virtual void SampleLevel(SamplerState samplerState, const float* loc, float level, void* outData, size_t dataSize) = 0; |
| | }; |
| |
|
| | template <typename T> |
| | struct Texture1D |
| | { |
| | void GetDimensions(uint32_t* outWidth) { *outWidth = texture->GetDimensions().width; } |
| | void GetDimensions(uint32_t mipLevel, uint32_t* outWidth, uint32_t* outNumberOfLevels) |
| | { |
| | auto dims = texture->GetDimensions(mipLevel); |
| | *outWidth = dims.width; |
| | *outNumberOfLevels = dims.numberOfLevels; |
| | } |
| | |
| | void GetDimensions(float* outWidth) { *outWidth = texture->GetDimensions().width; } |
| | void GetDimensions(uint32_t mipLevel, float* outWidth, float* outNumberOfLevels) |
| | { |
| | auto dims = texture->GetDimensions(mipLevel); |
| | *outWidth = dims.width; |
| | *outNumberOfLevels = dims.numberOfLevels; |
| | } |
| | |
| | T Load(const int2& loc) const { T out; texture->Load(&loc.x, &out, sizeof(out)); return out; } |
| | T Sample(SamplerState samplerState, float loc) const { T out; texture->Sample(samplerState, &loc, &out, sizeof(out)); return out; } |
| | T SampleLevel(SamplerState samplerState, float loc, float level) { T out; texture->SampleLevel(samplerState, &loc, level, &out, sizeof(out)); return out; } |
| | |
| | ITexture* texture; |
| | }; |
| |
|
| | template <typename T> |
| | struct Texture2D |
| | { |
| | void GetDimensions(uint32_t* outWidth, uint32_t* outHeight) |
| | { |
| | const auto dims = texture->GetDimensions(); |
| | *outWidth = dims.width; |
| | *outHeight = dims.height; |
| | } |
| | void GetDimensions(uint32_t mipLevel, uint32_t* outWidth, uint32_t* outHeight, uint32_t* outNumberOfLevels) |
| | { |
| | const auto dims = texture->GetDimensions(mipLevel); |
| | *outWidth = dims.width; |
| | *outHeight = dims.height; |
| | *outNumberOfLevels = dims.numberOfLevels; |
| | } |
| | void GetDimensions(float* outWidth, float* outHeight) |
| | { |
| | const auto dims = texture->GetDimensions(); |
| | *outWidth = dims.width; |
| | *outHeight = dims.height; |
| | } |
| | void GetDimensions(uint32_t mipLevel, float* outWidth, float* outHeight, float* outNumberOfLevels) |
| | { |
| | const auto dims = texture->GetDimensions(mipLevel); |
| | *outWidth = dims.width; |
| | *outHeight = dims.height; |
| | *outNumberOfLevels = dims.numberOfLevels; |
| | } |
| | |
| | T Load(const int3& loc) const { T out; texture->Load(&loc.x, &out, sizeof(out)); return out; } |
| | T Sample(SamplerState samplerState, const float2& loc) const { T out; texture->Sample(samplerState, &loc.x, &out, sizeof(out)); return out; } |
| | T SampleLevel(SamplerState samplerState, const float2& loc, float level) { T out; texture->SampleLevel(samplerState, &loc.x, level, &out, sizeof(out)); return out; } |
| | |
| | ITexture* texture; |
| | }; |
| |
|
| | template <typename T> |
| | struct Texture3D |
| | { |
| | void GetDimensions(uint32_t* outWidth, uint32_t* outHeight, uint32_t* outDepth) |
| | { |
| | const auto dims = texture->GetDimensions(); |
| | *outWidth = dims.width; |
| | *outHeight = dims.height; |
| | *outDepth = dims.depth; |
| | } |
| | void GetDimensions(uint32_t mipLevel, uint32_t* outWidth, uint32_t* outHeight, uint32_t* outDepth, uint32_t* outNumberOfLevels) |
| | { |
| | const auto dims = texture->GetDimensions(mipLevel); |
| | *outWidth = dims.width; |
| | *outHeight = dims.height; |
| | *outDepth = dims.depth; |
| | *outNumberOfLevels = dims.numberOfLevels; |
| | } |
| | void GetDimensions(float* outWidth, float* outHeight, float* outDepth) |
| | { |
| | const auto dims = texture->GetDimensions(); |
| | *outWidth = dims.width; |
| | *outHeight = dims.height; |
| | *outDepth = dims.depth; |
| | } |
| | void GetDimensions(uint32_t mipLevel, float* outWidth, float* outHeight, float* outDepth, float* outNumberOfLevels) |
| | { |
| | const auto dims = texture->GetDimensions(mipLevel); |
| | *outWidth = dims.width; |
| | *outHeight = dims.height; |
| | *outDepth = dims.depth; |
| | *outNumberOfLevels = dims.numberOfLevels; |
| | } |
| | |
| | T Load(const int4& loc) const { T out; texture->Load(&loc.x, &out, sizeof(out)); return out; } |
| | T Sample(SamplerState samplerState, const float3& loc) const { T out; texture->Sample(samplerState, &loc.x, &out, sizeof(out)); return out; } |
| | T SampleLevel(SamplerState samplerState, const float3& loc, float level) { T out; texture->SampleLevel(samplerState, &loc.x, level, &out, sizeof(out)); return out; } |
| | |
| | ITexture* texture; |
| | }; |
| |
|
| | template <typename T> |
| | struct TextureCube |
| | { |
| | void GetDimensions(uint32_t* outWidth, uint32_t* outHeight) |
| | { |
| | const auto dims = texture->GetDimensions(); |
| | *outWidth = dims.width; |
| | *outHeight = dims.height; |
| | } |
| | void GetDimensions(uint32_t mipLevel, uint32_t* outWidth, uint32_t* outHeight, uint32_t* outNumberOfLevels) |
| | { |
| | const auto dims = texture->GetDimensions(mipLevel); |
| | *outWidth = dims.width; |
| | *outHeight = dims.height; |
| | *outNumberOfLevels = dims.numberOfLevels; |
| | } |
| | void GetDimensions(float* outWidth, float* outHeight) |
| | { |
| | const auto dims = texture->GetDimensions(); |
| | *outWidth = dims.width; |
| | *outHeight = dims.height; |
| | } |
| | void GetDimensions(uint32_t mipLevel, float* outWidth, float* outHeight, float* outNumberOfLevels) |
| | { |
| | const auto dims = texture->GetDimensions(mipLevel); |
| | *outWidth = dims.width; |
| | *outHeight = dims.height; |
| | *outNumberOfLevels = dims.numberOfLevels; |
| | } |
| | |
| | T Sample(SamplerState samplerState, const float3& loc) const { T out; texture->Sample(samplerState, &loc.x, &out, sizeof(out)); return out; } |
| | T SampleLevel(SamplerState samplerState, const float3& loc, float level) { T out; texture->SampleLevel(samplerState, &loc.x, level, &out, sizeof(out)); return out; } |
| | |
| | ITexture* texture; |
| | }; |
| |
|
| | template <typename T> |
| | struct Texture1DArray |
| | { |
| | void GetDimensions(uint32_t* outWidth, uint32_t* outElements) { auto dims = texture->GetDimensions(); *outWidth = dims.width; *outElements = dims.arrayElementCount; } |
| | void GetDimensions(uint32_t mipLevel, uint32_t* outWidth, uint32_t* outElements, uint32_t* outNumberOfLevels) |
| | { |
| | auto dims = texture->GetDimensions(mipLevel); |
| | *outWidth = dims.width; |
| | *outNumberOfLevels = dims.numberOfLevels; |
| | *outElements = dims.arrayElementCount; |
| | } |
| | void GetDimensions(float* outWidth, float* outElements) { auto dims = texture->GetDimensions(); *outWidth = dims.width; *outElements = dims.arrayElementCount; } |
| | void GetDimensions(uint32_t mipLevel, float* outWidth, float* outElements, float* outNumberOfLevels) |
| | { |
| | auto dims = texture->GetDimensions(mipLevel); |
| | *outWidth = dims.width; |
| | *outNumberOfLevels = dims.numberOfLevels; |
| | *outElements = dims.arrayElementCount; |
| | } |
| | |
| | T Load(const int3& loc) const { T out; texture->Load(&loc.x, &out, sizeof(out)); return out; } |
| | T Sample(SamplerState samplerState, const float2& loc) const { T out; texture->Sample(samplerState, &loc.x, &out, sizeof(out)); return out; } |
| | T SampleLevel(SamplerState samplerState, const float2& loc, float level) { T out; texture->SampleLevel(samplerState, &loc.x, level, &out, sizeof(out)); return out; } |
| | |
| | ITexture* texture; |
| | }; |
| |
|
| | template <typename T> |
| | struct Texture2DArray |
| | { |
| | void GetDimensions(uint32_t* outWidth, uint32_t* outHeight, uint32_t* outElements) |
| | { |
| | auto dims = texture->GetDimensions(); |
| | *outWidth = dims.width; |
| | *outHeight = dims.height; |
| | *outElements = dims.arrayElementCount; |
| | } |
| | void GetDimensions(uint32_t mipLevel, uint32_t* outWidth, uint32_t* outHeight, uint32_t* outElements, uint32_t* outNumberOfLevels) |
| | { |
| | auto dims = texture->GetDimensions(mipLevel); |
| | *outWidth = dims.width; |
| | *outHeight = dims.height; |
| | *outElements = dims.arrayElementCount; |
| | *outNumberOfLevels = dims.numberOfLevels; |
| | } |
| | |
| | void GetDimensions(uint32_t* outWidth, float* outHeight, float* outElements) |
| | { |
| | auto dims = texture->GetDimensions(); |
| | *outWidth = dims.width; |
| | *outHeight = dims.height; |
| | *outElements = dims.arrayElementCount; |
| | } |
| | void GetDimensions(uint32_t mipLevel, float* outWidth, float* outHeight, float* outElements, float* outNumberOfLevels) |
| | { |
| | auto dims = texture->GetDimensions(mipLevel); |
| | *outWidth = dims.width; |
| | *outHeight = dims.height; |
| | *outElements = dims.arrayElementCount; |
| | *outNumberOfLevels = dims.numberOfLevels; |
| | } |
| | |
| | T Load(const int4& loc) const { T out; texture->Load(&loc.x, &out, sizeof(out)); return out; } |
| | T Sample(SamplerState samplerState, const float3& loc) const { T out; texture->Sample(samplerState, &loc.x, &out, sizeof(out)); return out; } |
| | T SampleLevel(SamplerState samplerState, const float3& loc, float level) { T out; texture->SampleLevel(samplerState, &loc.x, level, &out, sizeof(out)); return out; } |
| | |
| | ITexture* texture; |
| | }; |
| |
|
| | template <typename T> |
| | struct TextureCubeArray |
| | { |
| | void GetDimensions(uint32_t* outWidth, uint32_t* outHeight, uint32_t* outElements) |
| | { |
| | auto dims = texture->GetDimensions(); |
| | *outWidth = dims.width; |
| | *outHeight = dims.height; |
| | *outElements = dims.arrayElementCount; |
| | } |
| | void GetDimensions(uint32_t mipLevel, uint32_t* outWidth, uint32_t* outHeight, uint32_t* outElements, uint32_t* outNumberOfLevels) |
| | { |
| | auto dims = texture->GetDimensions(mipLevel); |
| | *outWidth = dims.width; |
| | *outHeight = dims.height; |
| | *outElements = dims.arrayElementCount; |
| | *outNumberOfLevels = dims.numberOfLevels; |
| | } |
| | |
| | void GetDimensions(uint32_t* outWidth, float* outHeight, float* outElements) |
| | { |
| | auto dims = texture->GetDimensions(); |
| | *outWidth = dims.width; |
| | *outHeight = dims.height; |
| | *outElements = dims.arrayElementCount; |
| | } |
| | void GetDimensions(uint32_t mipLevel, float* outWidth, float* outHeight, float* outElements, float* outNumberOfLevels) |
| | { |
| | auto dims = texture->GetDimensions(mipLevel); |
| | *outWidth = dims.width; |
| | *outHeight = dims.height; |
| | *outElements = dims.arrayElementCount; |
| | *outNumberOfLevels = dims.numberOfLevels; |
| | } |
| | |
| | T Sample(SamplerState samplerState, const float4& loc) const { T out; texture->Sample(samplerState, &loc.x, &out, sizeof(out)); return out; } |
| | T SampleLevel(SamplerState samplerState, const float4& loc, float level) { T out; texture->SampleLevel(samplerState, &loc.x, level, &out, sizeof(out)); return out; } |
| | |
| | ITexture* texture; |
| | }; |
| |
|
| | |
| |
|
| | struct IRWTexture : ITexture |
| | { |
| | |
| | virtual void* refAt(const uint32_t* loc) = 0; |
| | }; |
| |
|
| | template <typename T> |
| | struct RWTexture1D |
| | { |
| | void GetDimensions(uint32_t* outWidth) { *outWidth = texture->GetDimensions().width; } |
| | void GetDimensions(uint32_t mipLevel, uint32_t* outWidth, uint32_t* outNumberOfLevels) { auto dims = texture->GetDimensions(mipLevel); *outWidth = dims.width; *outNumberOfLevels = dims.numberOfLevels; } |
| | |
| | void GetDimensions(float* outWidth) { *outWidth = texture->GetDimensions().width; } |
| | void GetDimensions(uint32_t mipLevel, float* outWidth, float* outNumberOfLevels) { auto dims = texture->GetDimensions(mipLevel); *outWidth = dims.width; *outNumberOfLevels = dims.numberOfLevels; } |
| | |
| | T Load(int32_t loc) const { T out; texture->Load(&loc, &out, sizeof(out)); return out; } |
| | T& operator[](uint32_t loc) { return *(T*)texture->refAt(&loc); } |
| | IRWTexture* texture; |
| | }; |
| |
|
| | template <typename T> |
| | struct RWTexture2D |
| | { |
| | void GetDimensions(uint32_t* outWidth, uint32_t* outHeight) |
| | { |
| | const auto dims = texture->GetDimensions(); |
| | *outWidth = dims.width; |
| | *outHeight = dims.height; |
| | } |
| | void GetDimensions(uint32_t mipLevel, uint32_t* outWidth, uint32_t* outHeight, uint32_t* outNumberOfLevels) |
| | { |
| | const auto dims = texture->GetDimensions(mipLevel); |
| | *outWidth = dims.width; |
| | *outHeight = dims.height; |
| | *outNumberOfLevels = dims.numberOfLevels; |
| | } |
| | void GetDimensions(float* outWidth, float* outHeight) |
| | { |
| | const auto dims = texture->GetDimensions(); |
| | *outWidth = dims.width; |
| | *outHeight = dims.height; |
| | } |
| | void GetDimensions(uint32_t mipLevel, float* outWidth, float* outHeight, float* outNumberOfLevels) |
| | { |
| | const auto dims = texture->GetDimensions(mipLevel); |
| | *outWidth = dims.width; |
| | *outHeight = dims.height; |
| | *outNumberOfLevels = dims.numberOfLevels; |
| | } |
| | |
| | T Load(const int2& loc) const { T out; texture->Load(&loc.x, &out, sizeof(out)); return out; } |
| | T& operator[](const uint2& loc) { return *(T*)texture->refAt(&loc.x); } |
| | IRWTexture* texture; |
| | }; |
| |
|
| | template <typename T> |
| | struct RWTexture3D |
| | { |
| | void GetDimensions(uint32_t* outWidth, uint32_t* outHeight, uint32_t* outDepth) |
| | { |
| | const auto dims = texture->GetDimensions(); |
| | *outWidth = dims.width; |
| | *outHeight = dims.height; |
| | *outDepth = dims.depth; |
| | } |
| | void GetDimensions(uint32_t mipLevel, uint32_t* outWidth, uint32_t* outHeight, uint32_t* outDepth, uint32_t* outNumberOfLevels) |
| | { |
| | const auto dims = texture->GetDimensions(mipLevel); |
| | *outWidth = dims.width; |
| | *outHeight = dims.height; |
| | *outDepth = dims.depth; |
| | *outNumberOfLevels = dims.numberOfLevels; |
| | } |
| | void GetDimensions(float* outWidth, float* outHeight, float* outDepth) |
| | { |
| | const auto dims = texture->GetDimensions(); |
| | *outWidth = dims.width; |
| | *outHeight = dims.height; |
| | *outDepth = dims.depth; |
| | } |
| | void GetDimensions(uint32_t mipLevel, float* outWidth, float* outHeight, float* outDepth, float* outNumberOfLevels) |
| | { |
| | const auto dims = texture->GetDimensions(mipLevel); |
| | *outWidth = dims.width; |
| | *outHeight = dims.height; |
| | *outDepth = dims.depth; |
| | *outNumberOfLevels = dims.numberOfLevels; |
| | } |
| | |
| | T Load(const int3& loc) const { T out; texture->Load(&loc.x, &out, sizeof(out)); return out; } |
| | T& operator[](const uint3& loc) { return *(T*)texture->refAt(&loc.x); } |
| | IRWTexture* texture; |
| | }; |
| |
|
| |
|
| | template <typename T> |
| | struct RWTexture1DArray |
| | { |
| | void GetDimensions(uint32_t* outWidth, uint32_t* outElements) |
| | { |
| | auto dims = texture->GetDimensions(); |
| | *outWidth = dims.width; |
| | *outElements = dims.arrayElementCount; |
| | } |
| | void GetDimensions(uint32_t mipLevel, uint32_t* outWidth, uint32_t* outElements, uint32_t* outNumberOfLevels) |
| | { |
| | const auto dims = texture->GetDimensions(mipLevel); |
| | *outWidth = dims.width; |
| | *outElements = dims.arrayElementCount; |
| | *outNumberOfLevels = dims.numberOfLevels; |
| | } |
| | void GetDimensions(float* outWidth, float* outElements) |
| | { |
| | auto dims = texture->GetDimensions(); |
| | *outWidth = dims.width; |
| | *outElements = dims.arrayElementCount; |
| | } |
| | void GetDimensions(uint32_t mipLevel, float* outWidth, float* outElements, float* outNumberOfLevels) |
| | { |
| | const auto dims = texture->GetDimensions(mipLevel); |
| | *outWidth = dims.width; |
| | *outElements = dims.arrayElementCount; |
| | *outNumberOfLevels = dims.numberOfLevels; |
| | } |
| | |
| | T Load(int2 loc) const { T out; texture->Load(&loc.x, &out, sizeof(out)); return out; } |
| | T& operator[](uint2 loc) { return *(T*)texture->refAt(&loc.x); } |
| |
|
| | IRWTexture* texture; |
| | }; |
| |
|
| | template <typename T> |
| | struct RWTexture2DArray |
| | { |
| | void GetDimensions(uint32_t* outWidth, uint32_t* outHeight, uint32_t* outElements) |
| | { |
| | auto dims = texture->GetDimensions(); |
| | *outWidth = dims.width; |
| | *outHeight = dims.height; |
| | *outElements = dims.arrayElementCount; |
| | } |
| | void GetDimensions(uint32_t mipLevel, uint32_t* outWidth, uint32_t* outHeight, uint32_t* outElements, uint32_t* outNumberOfLevels) |
| | { |
| | const auto dims = texture->GetDimensions(mipLevel); |
| | *outWidth = dims.width; |
| | *outHeight = dims.height; |
| | *outElements = dims.arrayElementCount; |
| | *outNumberOfLevels = dims.numberOfLevels; |
| | } |
| | void GetDimensions(float* outWidth, float* outHeight, float* outElements) |
| | { |
| | auto dims = texture->GetDimensions(); |
| | *outWidth = dims.width; |
| | *outHeight = dims.height; |
| | *outElements = dims.arrayElementCount; |
| | } |
| | void GetDimensions(uint32_t mipLevel, float* outWidth, float* outHeight, float* outElements, float* outNumberOfLevels) |
| | { |
| | const auto dims = texture->GetDimensions(mipLevel); |
| | *outWidth = dims.width; |
| | *outHeight = dims.height; |
| | *outElements = dims.arrayElementCount; |
| | *outNumberOfLevels = dims.numberOfLevels; |
| | } |
| | |
| | T Load(const int3& loc) const { T out; texture->Load(&loc.x, &out, sizeof(out)); return out; } |
| | T& operator[](const uint3& loc) { return *(T*)texture->refAt(&loc.x); } |
| |
|
| | IRWTexture* texture; |
| | }; |
| |
|
| | |
| |
|
| | struct FeedbackType {}; |
| | struct SAMPLER_FEEDBACK_MIN_MIP : FeedbackType {}; |
| | struct SAMPLER_FEEDBACK_MIP_REGION_USED : FeedbackType {}; |
| |
|
| | struct IFeedbackTexture |
| | { |
| | virtual TextureDimensions GetDimensions(int mipLevel = -1) = 0; |
| |
|
| | |
| | |
| | virtual void WriteSamplerFeedback(ITexture* tex, SamplerState samp, const float* location, const float* clamp = nullptr) = 0; |
| | virtual void WriteSamplerFeedbackBias(ITexture* tex, SamplerState samp, const float* location, float bias, const float* clamp = nullptr) = 0; |
| | virtual void WriteSamplerFeedbackGrad(ITexture* tex, SamplerState samp, const float* location, const float* ddx, const float* ddy, const float* clamp = nullptr) = 0; |
| | |
| | virtual void WriteSamplerFeedbackLevel(ITexture* tex, SamplerState samp, const float* location, float lod) = 0; |
| | }; |
| |
|
| | template <typename T> |
| | struct FeedbackTexture2D |
| | { |
| | void GetDimensions(uint32_t* outWidth, uint32_t* outHeight) |
| | { |
| | const auto dims = texture->GetDimensions(); |
| | *outWidth = dims.width; |
| | *outHeight = dims.height; |
| | } |
| | void GetDimensions(uint32_t mipLevel, uint32_t* outWidth, uint32_t* outHeight, uint32_t* outNumberOfLevels) |
| | { |
| | const auto dims = texture->GetDimensions(mipLevel); |
| | *outWidth = dims.width; |
| | *outHeight = dims.height; |
| | *outNumberOfLevels = dims.numberOfLevels; |
| | } |
| | void GetDimensions(float* outWidth, float* outHeight) |
| | { |
| | const auto dims = texture->GetDimensions(); |
| | *outWidth = dims.width; |
| | *outHeight = dims.height; |
| | } |
| | void GetDimensions(uint32_t mipLevel, float* outWidth, float* outHeight, float* outNumberOfLevels) |
| | { |
| | const auto dims = texture->GetDimensions(mipLevel); |
| | *outWidth = dims.width; |
| | *outHeight = dims.height; |
| | *outNumberOfLevels = dims.numberOfLevels; |
| | } |
| | |
| | template <typename S> |
| | void WriteSamplerFeedback(Texture2D<S> tex, SamplerState samp, float2 location, float clamp) { texture->WriteSamplerFeedback(tex.texture, samp, &location.x, &clamp); } |
| |
|
| | template <typename S> |
| | void WriteSamplerFeedbackBias(Texture2D<S> tex, SamplerState samp, float2 location, float bias, float clamp) { texture->WriteSamplerFeedbackBias(tex.texture, samp, &location.x, bias, &clamp); } |
| |
|
| | template <typename S> |
| | void WriteSamplerFeedbackGrad(Texture2D<S> tex, SamplerState samp, float2 location, float2 ddx, float2 ddy, float clamp) { texture->WriteSamplerFeedbackGrad(tex.texture, samp, &location.x, &ddx.x, &ddy.x, &clamp); } |
| |
|
| | |
| |
|
| | template <typename S> |
| | void WriteSamplerFeedbackLevel(Texture2D<S> tex, SamplerState samp, float2 location, float lod) { texture->WriteSamplerFeedbackLevel(tex.texture, samp, &location.x, lod); } |
| | |
| | |
| | template <typename S> |
| | void WriteSamplerFeedback(Texture2D<S> tex, SamplerState samp, float2 location) { texture->WriteSamplerFeedback(tex.texture, samp, &location.x); } |
| |
|
| | template <typename S> |
| | void WriteSamplerFeedbackBias(Texture2D<S> tex, SamplerState samp, float2 location, float bias) { texture->WriteSamplerFeedbackBias(tex.texture, samp, &location.x, bias); } |
| |
|
| | template <typename S> |
| | void WriteSamplerFeedbackGrad(Texture2D<S> tex, SamplerState samp, float2 location, float2 ddx, float2 ddy) { texture->WriteSamplerFeedbackGrad(tex.texture, samp, &location.x, &ddx.x, &ddy.x); } |
| | |
| | IFeedbackTexture* texture; |
| | }; |
| |
|
| | template <typename T> |
| | struct FeedbackTexture2DArray |
| | { |
| | void GetDimensions(uint32_t* outWidth, uint32_t* outHeight, uint32_t* outElements) |
| | { |
| | auto dims = texture->GetDimensions(); |
| | *outWidth = dims.width; |
| | *outHeight = dims.height; |
| | *outElements = dims.arrayElementCount; |
| | } |
| | void GetDimensions(uint32_t mipLevel, uint32_t* outWidth, uint32_t* outHeight, uint32_t* outElements, uint32_t* outNumberOfLevels) |
| | { |
| | const auto dims = texture->GetDimensions(mipLevel); |
| | *outWidth = dims.width; |
| | *outHeight = dims.height; |
| | *outElements = dims.arrayElementCount; |
| | *outNumberOfLevels = dims.numberOfLevels; |
| | } |
| | void GetDimensions(float* outWidth, float* outHeight, float* outElements) |
| | { |
| | auto dims = texture->GetDimensions(); |
| | *outWidth = dims.width; |
| | *outHeight = dims.height; |
| | *outElements = dims.arrayElementCount; |
| | } |
| | void GetDimensions(uint32_t mipLevel, float* outWidth, float* outHeight, float* outElements, float* outNumberOfLevels) |
| | { |
| | const auto dims = texture->GetDimensions(mipLevel); |
| | *outWidth = dims.width; |
| | *outHeight = dims.height; |
| | *outElements = dims.arrayElementCount; |
| | *outNumberOfLevels = dims.numberOfLevels; |
| | } |
| | |
| | template <typename S> |
| | void WriteSamplerFeedback(Texture2DArray<S> texArray, SamplerState samp, float3 location, float clamp) { texture->WriteSamplerFeedback(texArray.texture, samp, &location.x, &clamp); } |
| |
|
| | template <typename S> |
| | void WriteSamplerFeedbackBias(Texture2DArray<S> texArray, SamplerState samp, float3 location, float bias, float clamp) { texture->WriteSamplerFeedbackBias(texArray.texture, samp, &location.x, bias, &clamp); } |
| |
|
| | template <typename S> |
| | void WriteSamplerFeedbackGrad(Texture2DArray<S> texArray, SamplerState samp, float3 location, float3 ddx, float3 ddy, float clamp) { texture->WriteSamplerFeedbackGrad(texArray.texture, samp, &location.x, &ddx.x, &ddy.x, &clamp); } |
| |
|
| | |
| | template <typename S> |
| | void WriteSamplerFeedbackLevel(Texture2DArray<S> texArray, SamplerState samp, float3 location, float lod) { texture->WriteSamplerFeedbackLevel(texArray.texture, samp, &location.x, lod); } |
| |
|
| | |
| |
|
| | template <typename S> |
| | void WriteSamplerFeedback(Texture2DArray<S> texArray, SamplerState samp, float3 location) { texture->WriteSamplerFeedback(texArray.texture, samp, &location.x); } |
| |
|
| | template <typename S> |
| | void WriteSamplerFeedbackBias(Texture2DArray<S> texArray, SamplerState samp, float3 location, float bias) { texture->WriteSamplerFeedbackBias(texArray.texture, samp, &location.x, bias); } |
| |
|
| | template <typename S> |
| | void WriteSamplerFeedbackGrad(Texture2DArray<S> texArray, SamplerState samp, float3 location, float3 ddx, float3 ddy) { texture->WriteSamplerFeedbackGrad(texArray.texture, samp, &location.x, &ddx.x, &ddy.x); } |
| | |
| | IFeedbackTexture* texture; |
| | }; |
| |
|
| | |
| |
|
| | |
| | struct ComputeThreadVaryingInput |
| | { |
| | uint3 groupID; |
| | uint3 groupThreadID; |
| | }; |
| |
|
| | struct ComputeVaryingInput |
| | { |
| | uint3 startGroupID; |
| | uint3 endGroupID; |
| | }; |
| |
|
| | |
| | |
| |
|
| | typedef void(*ComputeThreadFunc)(ComputeThreadVaryingInput* varyingInput, void* uniformEntryPointParams, void* uniformState); |
| | typedef void(*ComputeFunc)(ComputeVaryingInput* varyingInput, void* uniformEntryPointParams, void* uniformState); |
| |
|
| | #ifdef SLANG_PRELUDE_NAMESPACE |
| | } |
| | #endif |
| |
|
| | #endif |
| |
|
| |
|
| |
|