diff options
| author | jsmall-nvidia <jsmall@nvidia.com> | 2020-03-21 06:38:47 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-03-21 10:38:47 +0000 |
| commit | 05c9a5c9dc23a716c7cbeae91f581bbc13f10ed2 (patch) | |
| tree | 02d1f2a5ad0e59904efa2751e30ada81fda86ea0 /prelude/slang-cpp-types.h | |
| parent | 884a9bcafc5fb9ae47245fa3ea9a6e64cb65a482 (diff) | |
CPU Texture GetDimensions support (#1283)
* Added CPU support for GetDimensions on C++/CPU target.
Added texture-get-dimension.slang test
* Fix some typos.
* Update CUDA docs.
* Fix output of GetDimensions on glsl when has an array.
Disabled VK - because VK renderer doesn't support createTextureView
* Fix typo.
* Fix typo.
* Fix bad-operator-call diagnostics output.
Diffstat (limited to 'prelude/slang-cpp-types.h')
| -rw-r--r-- | prelude/slang-cpp-types.h | 414 |
1 files changed, 413 insertions, 1 deletions
diff --git a/prelude/slang-cpp-types.h b/prelude/slang-cpp-types.h index c7421bc0b..415d7f941 100644 --- a/prelude/slang-cpp-types.h +++ b/prelude/slang-cpp-types.h @@ -226,10 +226,116 @@ struct SamplerComparisonState ISamplerComparisonState* state; }; +// +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; + } + } + } + + SlangResourceShape shape; + uint32_t width, height, depth; + uint32_t numberOfLevels; + uint32_t arrayElementCount; ///< For array types, 0 otherwise +}; + // Texture struct ITexture { + virtual TextureDimensions GetDimensions(int mipLevel = -1) = 0; virtual void Load(const int* v, void* out) = 0; virtual void Sample(SamplerState samplerState, const float* loc, void* out) = 0; virtual void SampleLevel(SamplerState samplerState, const float* loc, float level, void* out) = 0; @@ -238,6 +344,22 @@ struct ITexture 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); return out; } T Sample(SamplerState samplerState, float loc) const { T out; texture->Sample(samplerState, &loc, &out); return out; } T SampleLevel(SamplerState samplerState, float loc, float level) { T out; texture->SampleLevel(samplerState, &loc, level, &out); return out; } @@ -248,6 +370,33 @@ struct Texture1D 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); return out; } T Sample(SamplerState samplerState, const float2& loc) const { T out; texture->Sample(samplerState, &loc.x, &out); return out; } T SampleLevel(SamplerState samplerState, const float2& loc, float level) { T out; texture->SampleLevel(samplerState, &loc.x, level, &out); return out; } @@ -258,6 +407,37 @@ struct Texture2D 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); return out; } T Sample(SamplerState samplerState, const float3& loc) const { T out; texture->Sample(samplerState, &loc.x, &out); return out; } T SampleLevel(SamplerState samplerState, const float3& loc, float level) { T out; texture->SampleLevel(samplerState, &loc.x, level, &out); return out; } @@ -268,6 +448,33 @@ struct Texture3D 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); return out; } T SampleLevel(SamplerState samplerState, const float3& loc, float level) { T out; texture->SampleLevel(samplerState, &loc.x, level, &out); return out; } @@ -277,6 +484,23 @@ struct TextureCube 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); return out; } T Sample(SamplerState samplerState, const float2& loc) const { T out; texture->Sample(samplerState, &loc.x, &out); return out; } T SampleLevel(SamplerState samplerState, const float2& loc, float level) { T out; texture->SampleLevel(samplerState, &loc.x, level, &out); return out; } @@ -287,6 +511,38 @@ struct Texture1DArray 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); return out; } T Sample(SamplerState samplerState, const float3& loc) const { T out; texture->Sample(samplerState, &loc.x, &out); return out; } T SampleLevel(SamplerState samplerState, const float3& loc, float level) { T out; texture->SampleLevel(samplerState, &loc.x, level, &out); return out; } @@ -297,6 +553,38 @@ struct Texture2DArray 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); return out; } T SampleLevel(SamplerState samplerState, const float4& loc, float level) { T out; texture->SampleLevel(samplerState, &loc.x, level, &out); return out; } @@ -307,6 +595,8 @@ struct TextureCubeArray struct IRWTexture { + virtual TextureDimensions GetDimensions(int mipLevel = -1) = 0; + /// Load at specified location. virtual void Load(const int32_t* loc, void* out) = 0; /// Get the reference to the element at loc. @@ -316,6 +606,12 @@ struct IRWTexture 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); return out; } T& operator[](uint32_t loc) { return *(T*)texture->refAt(&loc); } IRWTexture* texture; @@ -324,6 +620,33 @@ struct RWTexture1D 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); return out; } T& operator[](const uint2& loc) { return *(T*)texture->refAt(&loc.x); } IRWTexture* texture; @@ -332,14 +655,73 @@ struct RWTexture2D 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); 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); return out; } T& operator[](uint2 loc) { return *(T*)texture->refAt(&loc.x); } IRWTexture* texture; @@ -348,12 +730,42 @@ struct RWTexture1DArray 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); return out; } T& operator[](const uint3& loc) { return *(T*)texture->refAt(&loc.x); } IRWTexture* texture; }; - /* Varying input for Compute */ /* Used when running a single thread */ |
