Skip to content

Commit ccc51cc

Browse files
fix clamping and padding
1 parent 321c4b5 commit ccc51cc

File tree

8 files changed

+58
-31
lines changed

8 files changed

+58
-31
lines changed

examples_tests/49.ComputeFFT/fft_convolve_ifft.comp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,8 @@ void main()
6060
for(uint t=0u; t<item_per_thread_count; t++)
6161
{
6262
const uint tid = (t<<_NBL_GLSL_WORKGROUP_SIZE_LOG2_)|gl_LocalInvocationIndex;
63-
nbl_glsl_ext_FFT_impl_values[t] = nbl_glsl_ext_FFT_getPaddedData(nbl_glsl_ext_FFT_getCoordinates(tid),ch);
63+
const uint trueDim = nbl_glsl_ext_FFT_Parameters_t_getDimensions()[nbl_glsl_ext_FFT_Parameters_t_getDirection()];
64+
nbl_glsl_ext_FFT_impl_values[t] = nbl_glsl_ext_FFT_getPaddedData(nbl_glsl_ext_FFT_getPaddedCoordinates(tid,log2FFTSize,trueDim),ch);
6465
}
6566
nbl_glsl_ext_FFT_preloaded(false,log2FFTSize);
6667
barrier();

examples_tests/49.ComputeFFT/image_first_fft.comp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ layout(set=0, binding=0) uniform sampler2D inputImage;
55
#define _NBL_GLSL_EXT_FFT_INPUT_DESCRIPTOR_DEFINED_
66

77
#include <nbl/builtin/glsl/math/complex.glsl>
8-
nbl_glsl_complex nbl_glsl_ext_FFT_getPaddedData(in uvec3 coordinate, in uint channel)
8+
nbl_glsl_complex nbl_glsl_ext_FFT_getPaddedData(in ivec3 coordinate, in uint channel)
99
{
1010
ivec2 inputImageSize = textureSize(inputImage, 0);
1111
vec2 normalizedCoords = (vec2(coordinate.xy) + vec2(0.5f)) / vec2(inputImageSize);

examples_tests/49.ComputeFFT/last_fft.comp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,16 @@ layout(set=0, binding=1, rgba16f) uniform image2D outImage;
77
#include <nbl/builtin/glsl/math/complex.glsl>
88
void nbl_glsl_ext_FFT_setData(in uvec3 coordinate, in uint channel, in nbl_glsl_complex complex_value)
99
{
10-
const ivec2 coords = ivec2(coordinate.xy);
10+
// TODO PC
11+
const ivec2 padding = imageSize(outImage).x!=512u ? ivec2(384,152):ivec2(0);
12+
const ivec2 coords = ivec2(coordinate.xy)-padding;
1113

12-
vec4 color_value = imageLoad(outImage, coords);
13-
color_value[channel] = complex_value.x;
14-
imageStore(outImage, coords, color_value);
14+
if (all(lessThanEqual(ivec2(0),coords))&&all(greaterThan(imageSize(outImage),coords)))
15+
{
16+
vec4 color_value = imageLoad(outImage, coords);
17+
color_value[channel] = complex_value.x;
18+
imageStore(outImage, coords, color_value);
19+
}
1520
}
1621
#define _NBL_GLSL_EXT_FFT_SET_DATA_DEFINED_
1722

examples_tests/49.ComputeFFT/main.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -514,7 +514,7 @@ int main()
514514

515515
FFTClass::Parameters_t fftPushConstants[2];
516516
FFTClass::DispatchInfo_t fftDispatchInfo[2];
517-
const FFTClass::PaddingType fftPadding[2] = {FFTClass::PaddingType::FILL_WITH_ZERO,FFTClass::PaddingType::FILL_WITH_ZERO};
517+
const ISampler::E_TEXTURE_CLAMP fftPadding[2] = {ISampler::ETC_CLAMP_TO_BORDER,ISampler::ETC_CLAMP_TO_BORDER};
518518
const auto passes = FFTClass::buildParameters(false,srcNumChannels,kerDim,fftPushConstants,fftDispatchInfo,fftPadding);
519519
assert(passes==2u);
520520

@@ -583,11 +583,14 @@ int main()
583583

584584
FFTClass::Parameters_t fftPushConstants[3];
585585
FFTClass::DispatchInfo_t fftDispatchInfo[3];
586-
const FFTClass::PaddingType fftPadding[2] = {FFTClass::PaddingType::CLAMP_TO_EDGE,FFTClass::PaddingType::CLAMP_TO_EDGE}; // TODO
586+
const ISampler::E_TEXTURE_CLAMP fftPadding[2] = {ISampler::ETC_MIRROR,ISampler::ETC_MIRROR};
587587
const auto passes = FFTClass::buildParameters(false,srcNumChannels,srcDim,fftPushConstants,fftDispatchInfo,fftPadding);
588588
{
589+
fftPushConstants[1].input_dimensions.x = 2048u;
589590
fftPushConstants[1].output_strides = fftPushConstants[1].input_strides;
590591
fftPushConstants[2] = fftPushConstants[0];
592+
fftPushConstants[2].input_dimensions.x = 2048u;
593+
fftPushConstants[2].input_dimensions.y = 1024u;
591594
{
592595
fftPushConstants[2].input_dimensions.w ^= 0x80000000u;
593596
fftPushConstants[2].input_dimensions.w &= 0xfffffffdu;

include/nbl/builtin/glsl/ext/FFT/default_compute_fft.comp

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
#extension GL_EXT_shader_integer_mix : require
2+
13
#ifndef _NBL_GLSL_WORKGROUP_SIZE_
24
#define _NBL_GLSL_WORKGROUP_SIZE_ 256
35
layout(local_size_x=_NBL_GLSL_WORKGROUP_SIZE_, local_size_y=1, local_size_z=1) in;
@@ -70,19 +72,34 @@ void nbl_glsl_ext_FFT_setData(in uvec3 coordinate, in uint channel, in nbl_glsl_
7072
#endif
7173

7274
#ifndef _NBL_GLSL_EXT_FFT_GET_PADDED_DATA_DEFINED_
73-
nbl_glsl_complex nbl_glsl_ext_FFT_getPaddedData(in uvec3 coordinate, in uint channel)
75+
nbl_glsl_complex nbl_glsl_ext_FFT_getPaddedData(ivec3 coordinate, in uint channel)
7476
{
75-
uvec3 max_coord = nbl_glsl_ext_FFT_Parameters_t_getDimensions() - uvec3(1u);
76-
uvec3 clamped_coord = min(coordinate, max_coord);
77+
const ivec3 dimensions = ivec3(nbl_glsl_ext_FFT_Parameters_t_getDimensions());
78+
const ivec3 max_coord = dimensions-ivec3(1u);
7779

78-
bool is_out_of_range = any(bvec3(coordinate!=clamped_coord));
79-
80-
uint paddingType = nbl_glsl_ext_FFT_Parameters_t_getPaddingType();
81-
82-
if (_NBL_GLSL_EXT_FFT_FILL_WITH_ZERO_ == paddingType && is_out_of_range) {
83-
return nbl_glsl_complex(0, 0);
80+
const ivec3 clamped_coord = clamp(coordinate,ivec3(0),max_coord);
81+
82+
const uint paddingType = nbl_glsl_ext_FFT_Parameters_t_getPaddingType();
83+
switch (paddingType)
84+
{
85+
case _NBL_GLSL_EXT_FFT_PAD_CLAMP_TO_EDGE_:
86+
coordinate = clamped_coord;
87+
break;
88+
case _NBL_GLSL_EXT_FFT_PAD_CLAMP_TO_BORDER_:
89+
if (any(bvec3(coordinate!=clamped_coord)))
90+
return nbl_glsl_complex(0,0);
91+
coordinate = clamped_coord;
92+
break;
93+
case _NBL_GLSL_EXT_FFT_PAD_MIRROR_:
94+
const bvec3 flip = bvec3((coordinate/dimensions)&0x1u);
95+
coordinate %= dimensions;
96+
coordinate = mix(coordinate,max_coord-coordinate,flip);
97+
break;
98+
default:
99+
coordinate %= dimensions;
100+
break;
84101
}
85-
102+
86103
const uint index = nbl_glsl_dot(uvec4(coordinate,channel),nbl_glsl_ext_FFT_Parameters_t_getInputStrides());
87104
return nbl_glsl_ext_FFT_storage_t_get(inData[index]);
88105
}

include/nbl/builtin/glsl/ext/FFT/fft.glsl

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ void nbl_glsl_ext_FFT_setData(in uvec3 coordinate, in uint channel, in vec2 comp
2222

2323
#ifndef _NBL_GLSL_EXT_FFT_GET_PADDED_DATA_DECLARED_
2424
#define _NBL_GLSL_EXT_FFT_GET_PADDED_DATA_DECLARED_
25-
vec2 nbl_glsl_ext_FFT_getPaddedData(in uvec3 coordinate, in uint channel);
25+
nbl_glsl_complex nbl_glsl_ext_FFT_getPaddedData(in ivec3 coordinate, in uint channel);
2626
#endif
2727

2828
#ifndef _NBL_GLSL_EXT_FFT_GET_PARAMETERS_DEFINED_
@@ -42,6 +42,11 @@ uvec3 nbl_glsl_ext_FFT_getCoordinates(in uint tidx)
4242
tmp[direction] = tidx;
4343
return tmp;
4444
}
45+
ivec3 nbl_glsl_ext_FFT_getPaddedCoordinates(in uint tidx, in uint log2FFTSize, in uint trueDimension)
46+
{
47+
const uint padding = ((0x1u<<log2FFTSize)-trueDimension)>>1u;
48+
return ivec3(nbl_glsl_ext_FFT_getCoordinates(tidx-padding));
49+
}
4550

4651

4752
#include "nbl/builtin/glsl/workgroup/fft.glsl"
@@ -106,7 +111,8 @@ void nbl_glsl_ext_FFT(bool is_inverse, uint channel)
106111
for(uint t=0u; t<item_per_thread_count; t++)
107112
{
108113
const uint tid = (t<<_NBL_GLSL_WORKGROUP_SIZE_LOG2_)|gl_LocalInvocationIndex;
109-
nbl_glsl_ext_FFT_impl_values[t] = nbl_glsl_ext_FFT_getPaddedData(nbl_glsl_ext_FFT_getCoordinates(tid),channel);
114+
const uint trueDim = nbl_glsl_ext_FFT_Parameters_t_getDimensions()[nbl_glsl_ext_FFT_Parameters_t_getDirection()];
115+
nbl_glsl_ext_FFT_impl_values[t] = nbl_glsl_ext_FFT_getPaddedData(nbl_glsl_ext_FFT_getPaddedCoordinates(tid,log2FFTSize,trueDim),channel);
110116
}
111117
// do FFT
112118
nbl_glsl_ext_FFT_preloaded(is_inverse,log2FFTSize);

include/nbl/builtin/glsl/ext/FFT/parameters.glsl

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,10 @@
1212
#define _NBL_GLSL_EXT_FFT_DIRECTION_Y_ 1
1313
#define _NBL_GLSL_EXT_FFT_DIRECTION_Z_ 2
1414

15-
#define _NBL_GLSL_EXT_FFT_CLAMP_TO_EDGE_ 0
16-
#define _NBL_GLSL_EXT_FFT_FILL_WITH_ZERO_ 1
15+
#define _NBL_GLSL_EXT_FFT_PAD_REPEAT_ 0
16+
#define _NBL_GLSL_EXT_FFT_PAD_CLAMP_TO_EDGE_ 1
17+
#define _NBL_GLSL_EXT_FFT_PAD_CLAMP_TO_BORDER_ 2
18+
#define _NBL_GLSL_EXT_FFT_PAD_MIRROR_ 3
1719

1820

1921
#ifndef _NBL_GLSL_EXT_FFT_GET_PARAMETERS_DECLARED_

include/nbl/ext/FFT/FFT.h

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,6 @@ class FFT final : public core::IReferenceCounted
3232
struct Parameters_t alignas(16) : nbl_glsl_ext_FFT_Parameters_t
3333
{
3434
};
35-
36-
enum class PaddingType : uint8_t
37-
{
38-
CLAMP_TO_EDGE = 0,
39-
FILL_WITH_ZERO = 1,
40-
// TODO: mirror?
41-
};
4235

4336
struct DispatchInfo_t
4437
{
@@ -49,7 +42,7 @@ class FFT final : public core::IReferenceCounted
4942
FFT(video::IDriver* driver, uint32_t maxDimensionSize, bool useHalfStorage = false);
5043

5144
// returns how many dispatches necessary for computing the FFT and fills the uniform data
52-
static inline uint32_t buildParameters(bool isInverse, uint32_t numChannels, const asset::VkExtent3D& inputDimensions, Parameters_t* outParams, DispatchInfo_t* outInfos, const PaddingType* paddingType)
45+
static inline uint32_t buildParameters(bool isInverse, uint32_t numChannels, const asset::VkExtent3D& inputDimensions, Parameters_t* outParams, DispatchInfo_t* outInfos, const asset::ISampler::E_TEXTURE_CLAMP* paddingType)
5346
{
5447
uint32_t passesRequired = 0u;
5548

@@ -72,7 +65,7 @@ class FFT final : public core::IReferenceCounted
7265
params.input_dimensions.z = inputDimensions.depth;
7366
{
7467
const uint32_t fftSize = (&paddedInputDimensions.width)[i];
75-
68+
assert(paddingType[i]<=asset::ISampler::ETC_MIRROR);
7669
params.input_dimensions.w = (isInverse ? 0x80000000u:0x0u)|
7770
(i<<28u)| // direction
7871
((numChannels-1u)<<26u)| // max channel

0 commit comments

Comments
 (0)