Skip to content

Commit 44af96e

Browse files
committed
some renames +
using textureLod with correct samplers and no manual clamping for images
1 parent 969a8cc commit 44af96e

File tree

6 files changed

+79
-50
lines changed

6 files changed

+79
-50
lines changed

examples_tests/49.ComputeFFT/fft_convolve_ifft.comp

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,27 +38,27 @@ layout(push_constant) uniform PushConstants
3838
nbl_glsl_complex nbl_glsl_ext_FFT_getData(in uvec3 coordinate, in uint channel)
3939
{
4040
nbl_glsl_complex retValue = nbl_glsl_complex(0, 0);
41-
uvec3 dimension = nbl_glsl_ext_FFT_getDimensions();
41+
uvec3 dimension = nbl_glsl_ext_FFT_Parameters_t_getDimensions();
4242
uint index = channel * (dimension.x * dimension.y * dimension.z) + coordinate.z * (dimension.x * dimension.y) + coordinate.y * (dimension.x) + coordinate.x;
4343
retValue = inoutData[index];
4444
return retValue;
4545
}
4646

4747
void nbl_glsl_ext_FFT_setData(in uvec3 coordinate, in uint channel, in nbl_glsl_complex complex_value)
4848
{
49-
uvec3 dimension = nbl_glsl_ext_FFT_getPaddedDimensions();
49+
uvec3 dimension = nbl_glsl_ext_FFT_Parameters_t_getPaddedDimensions();
5050
uint index = channel * (dimension.x * dimension.y * dimension.z) + coordinate.z * (dimension.x * dimension.y) + coordinate.y * (dimension.x) + coordinate.x;
5151
inoutData[index] = complex_value;
5252
}
5353

5454
nbl_glsl_complex nbl_glsl_ext_FFT_getPaddedData(in uvec3 coordinate, in uint channel) {
5555

56-
uvec3 max_coord = nbl_glsl_ext_FFT_getDimensions() - uvec3(1u);
56+
uvec3 max_coord = nbl_glsl_ext_FFT_Parameters_t_getDimensions() - uvec3(1u);
5757
uvec3 clamped_coord = min(coordinate, max_coord);
5858

5959
bool is_out_of_range = any(bvec3(coordinate!=clamped_coord));
6060

61-
uint paddingType = nbl_glsl_ext_FFT_getPaddingType();
61+
uint paddingType = nbl_glsl_ext_FFT_Parameters_t_getPaddingType();
6262

6363
if (_NBL_GLSL_EXT_FFT_FILL_WITH_ZERO_ == paddingType && is_out_of_range) {
6464
return nbl_glsl_complex(0, 0);
@@ -70,8 +70,8 @@ nbl_glsl_complex nbl_glsl_ext_FFT_getPaddedData(in uvec3 coordinate, in uint cha
7070
void convolve()
7171
{
7272
uint channel = nbl_glsl_ext_FFT_getChannel();
73-
uvec3 dimension = nbl_glsl_ext_FFT_getPaddedDimensions();
74-
uint dataLength = nbl_glsl_ext_FFT_getDimLength(nbl_glsl_ext_FFT_getPaddedDimensions());
73+
uvec3 dimension = nbl_glsl_ext_FFT_Parameters_t_getDimensions();
74+
uint dataLength = nbl_glsl_ext_FFT_getDimLength(nbl_glsl_ext_FFT_Parameters_t_getPaddedDimensions());
7575

7676
uint thread_offset = gl_LocalInvocationIndex;
7777
uint num_virtual_threads = (dataLength-1u)/(_NBL_GLSL_WORKGROUP_SIZE_)+1u;
@@ -88,15 +88,13 @@ void convolve()
8888

8989
void main()
9090
{
91-
nbl_glsl_ext_FFT(nbl_glsl_ext_FFT_getIsInverse()); // inoutData->inoutData
91+
nbl_glsl_ext_FFT(nbl_glsl_ext_FFT_Parameters_t_getIsInverse()); // inoutData->inoutData
9292

9393
barrier();
94-
memoryBarrierShared();
9594

9695
convolve(); // inoutData+kerData->inoutData
9796

9897
barrier();
99-
memoryBarrierShared();
10098

101-
nbl_glsl_ext_FFT(!nbl_glsl_ext_FFT_getIsInverse()); // inoutData->inoutData
99+
nbl_glsl_ext_FFT(!nbl_glsl_ext_FFT_Parameters_t_getIsInverse()); // inoutData->inoutData
102100
}

examples_tests/49.ComputeFFT/main.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -407,7 +407,7 @@ int main()
407407
{
408408
// Ker FFT X
409409
auto fftDescriptorSet_Ker_FFT_X = driver->createGPUDescriptorSet(core::smart_refctd_ptr<const IGPUDescriptorSetLayout>(fftPipelineLayout_ImageInput->getDescriptorSetLayout(0u)));
410-
FFTClass::updateDescriptorSet(driver, fftDescriptorSet_Ker_FFT_X.get(), kerImageView, fftOutputBuffer_0);
410+
FFTClass::updateDescriptorSet(driver, fftDescriptorSet_Ker_FFT_X.get(), kerImageView, fftOutputBuffer_0, ISampler::ETC_CLAMP_TO_BORDER);
411411

412412
// Ker FFT Y
413413
auto fftDescriptorSet_Ker_FFT_Y = driver->createGPUDescriptorSet(core::smart_refctd_ptr<const IGPUDescriptorSetLayout>(fftPipelineLayout_SSBOInput->getDescriptorSetLayout(0u)));
@@ -443,7 +443,7 @@ int main()
443443

444444
// Src FFT X
445445
auto fftDescriptorSet_Src_FFT_X = driver->createGPUDescriptorSet(core::smart_refctd_ptr<const IGPUDescriptorSetLayout>(fftPipelineLayout_ImageInput->getDescriptorSetLayout(0u)));
446-
FFTClass::updateDescriptorSet(driver, fftDescriptorSet_Src_FFT_X.get(), srcImageView, fftOutputBuffer_0);
446+
FFTClass::updateDescriptorSet(driver, fftDescriptorSet_Src_FFT_X.get(), srcImageView, fftOutputBuffer_0, ISampler::ETC_CLAMP_TO_EDGE);
447447

448448
// Convolution
449449
auto convolveDescriptorSet = driver->createGPUDescriptorSet(core::smart_refctd_ptr<const IGPUDescriptorSetLayout>(convolvePipelineLayout->getDescriptorSetLayout(0u)));

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

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -79,42 +79,48 @@ nbl_glsl_complex nbl_glsl_ext_FFT_getData(in uvec3 coordinate, in uint channel)
7979
{
8080
nbl_glsl_complex retValue = nbl_glsl_complex(0, 0);
8181
#if USE_SSBO_FOR_INPUT > 0
82-
uvec3 dimension = nbl_glsl_ext_FFT_getDimensions();
82+
uvec3 dimension = nbl_glsl_ext_FFT_Parameters_t_getDimensions();
8383
uint index = channel * (dimension.x * dimension.y * dimension.z) + coordinate.z * (dimension.x * dimension.y) + coordinate.y * (dimension.x) + coordinate.x;
8484
retValue = inData[index];
8585
#else
86-
vec4 texelValue= texelFetch(inputImage, ivec2(coordinate.xy), 0);
86+
ivec2 inputImageSize = textureSize(inputImage, 0);
87+
vec2 normalizedCoords = (vec2(coordinate.xy) + vec2(0.5f)) / vec2(inputImageSize);
88+
vec4 texelValue= textureLod(inputImage, normalizedCoords, 0);
8789
retValue = nbl_glsl_complex(texelValue[channel], 0.0f);
8890
#endif
8991
return retValue;
9092
}
9193

9294
void nbl_glsl_ext_FFT_setData(in uvec3 coordinate, in uint channel, in nbl_glsl_complex complex_value)
9395
{
94-
uvec3 dimension = nbl_glsl_ext_FFT_getPaddedDimensions();
96+
uvec3 dimension = nbl_glsl_ext_FFT_Parameters_t_getPaddedDimensions();
9597
uint index = channel * (dimension.x * dimension.y * dimension.z) + coordinate.z * (dimension.x * dimension.y) + coordinate.y * (dimension.x) + coordinate.x;
9698
outData[index] = complex_value;
9799
}
98100

99-
nbl_glsl_complex nbl_glsl_ext_FFT_getPaddedData(in uvec3 coordinate, in uint channel) {
100-
101-
uvec3 max_coord = nbl_glsl_ext_FFT_getDimensions() - uvec3(1u);
101+
nbl_glsl_complex nbl_glsl_ext_FFT_getPaddedData(in uvec3 coordinate, in uint channel)
102+
{
103+
#if USE_SSBO_FOR_INPUT > 0
104+
uvec3 max_coord = nbl_glsl_ext_FFT_Parameters_t_getDimensions() - uvec3(1u);
102105
uvec3 clamped_coord = min(coordinate, max_coord);
103106

104107
bool is_out_of_range = any(bvec3(coordinate!=clamped_coord));
105108

106-
uint paddingType = nbl_glsl_ext_FFT_getPaddingType();
109+
uint paddingType = nbl_glsl_ext_FFT_Parameters_t_getPaddingType();
107110

108111
if (_NBL_GLSL_EXT_FFT_FILL_WITH_ZERO_ == paddingType && is_out_of_range) {
109112
return nbl_glsl_complex(0, 0);
110113
}
111114

112115
return nbl_glsl_ext_FFT_getData(clamped_coord, channel);
116+
#else
117+
return nbl_glsl_ext_FFT_getData(coordinate, channel);
118+
#endif
113119
}
114120

115121
void main()
116122
{
117-
nbl_glsl_ext_FFT(nbl_glsl_ext_FFT_getIsInverse());
123+
nbl_glsl_ext_FFT(nbl_glsl_ext_FFT_Parameters_t_getIsInverse());
118124
}
119125

120126
#endif

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

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,27 @@ vec2 nbl_glsl_ext_FFT_getPaddedData(in uvec3 coordinate, in uint channel);
8282
#error "You need to define `nbl_glsl_ext_FFT_getPaddedData` and mark `_NBL_GLSL_EXT_FFT_GET_PADDED_DATA_DEFINED_`!"
8383
#endif
8484

85+
uvec3 nbl_glsl_ext_FFT_Parameters_t_getPaddedDimensions() {
86+
nbl_glsl_ext_FFT_Parameters_t params = nbl_glsl_ext_FFT_getParameters();
87+
return (params.padded_dimension);
88+
}
89+
uvec3 nbl_glsl_ext_FFT_Parameters_t_getDimensions() {
90+
nbl_glsl_ext_FFT_Parameters_t params = nbl_glsl_ext_FFT_getParameters();
91+
return (params.dimension.xyz);
92+
}
93+
uint nbl_glsl_ext_FFT_Parameters_t_getDirection() {
94+
nbl_glsl_ext_FFT_Parameters_t params = nbl_glsl_ext_FFT_getParameters();
95+
return (params.dimension.w >> 16) & 0x000000ff;
96+
}
97+
bool nbl_glsl_ext_FFT_Parameters_t_getIsInverse() {
98+
nbl_glsl_ext_FFT_Parameters_t params = nbl_glsl_ext_FFT_getParameters();
99+
return bool((params.dimension.w >> 8) & 0x000000ff);
100+
}
101+
uint nbl_glsl_ext_FFT_Parameters_t_getPaddingType() {
102+
nbl_glsl_ext_FFT_Parameters_t params = nbl_glsl_ext_FFT_getParameters();
103+
return (params.dimension.w) & 0x000000ff;
104+
}
105+
85106
uint nbl_glsl_ext_FFT_calculateTwiddlePower(in uint threadId, in uint iteration, in uint logTwoN)
86107
{
87108
const uint shiftSuffix = logTwoN - 1u - iteration; // can we assert that iteration<logTwoN always?? yes
@@ -100,44 +121,23 @@ nbl_glsl_complex nbl_glsl_ext_FFT_twiddleInverse(in uint threadId, in uint itera
100121
return nbl_glsl_complex_conjugate(nbl_glsl_ext_FFT_twiddle(threadId, iteration, logTwoN));
101122
}
102123

103-
uvec3 nbl_glsl_ext_FFT_getPaddedDimensions() {
104-
nbl_glsl_ext_FFT_Parameters_t params = nbl_glsl_ext_FFT_getParameters();
105-
return (params.padded_dimension.xyz);
106-
}
107-
uvec3 nbl_glsl_ext_FFT_getDimensions() {
108-
nbl_glsl_ext_FFT_Parameters_t params = nbl_glsl_ext_FFT_getParameters();
109-
return (params.dimension.xyz);
110-
}
111-
uint nbl_glsl_ext_FFT_getDirection() {
112-
nbl_glsl_ext_FFT_Parameters_t params = nbl_glsl_ext_FFT_getParameters();
113-
return (params.dimension.w >> 16) & 0x000000ff;
114-
}
115-
bool nbl_glsl_ext_FFT_getIsInverse() {
116-
nbl_glsl_ext_FFT_Parameters_t params = nbl_glsl_ext_FFT_getParameters();
117-
return bool((params.dimension.w >> 8) & 0x000000ff);
118-
}
119-
uint nbl_glsl_ext_FFT_getPaddingType() {
120-
nbl_glsl_ext_FFT_Parameters_t params = nbl_glsl_ext_FFT_getParameters();
121-
return (params.dimension.w) & 0x000000ff;
122-
}
123-
124124
uint nbl_glsl_ext_FFT_getChannel()
125125
{
126-
uint direction = nbl_glsl_ext_FFT_getDirection();
126+
uint direction = nbl_glsl_ext_FFT_Parameters_t_getDirection();
127127
return gl_WorkGroupID[direction];
128128
}
129129

130130
uvec3 nbl_glsl_ext_FFT_getCoordinates(in uint tidx)
131131
{
132-
uint direction = nbl_glsl_ext_FFT_getDirection();
132+
uint direction = nbl_glsl_ext_FFT_Parameters_t_getDirection();
133133
uvec3 tmp = gl_WorkGroupID;
134134
tmp[direction] = tidx;
135135
return tmp;
136136
}
137137

138138
uvec3 nbl_glsl_ext_FFT_getBitReversedCoordinates(in uvec3 coords, in uint leadingZeroes)
139139
{
140-
uint direction = nbl_glsl_ext_FFT_getDirection();
140+
uint direction = nbl_glsl_ext_FFT_Parameters_t_getDirection();
141141
uint bitReversedIndex = bitfieldReverse(coords[direction]) >> leadingZeroes;
142142
uvec3 tmp = coords;
143143
tmp[direction] = bitReversedIndex;
@@ -146,15 +146,15 @@ uvec3 nbl_glsl_ext_FFT_getBitReversedCoordinates(in uvec3 coords, in uint leadin
146146

147147
uint nbl_glsl_ext_FFT_getDimLength(uvec3 dimension)
148148
{
149-
uint direction = nbl_glsl_ext_FFT_getDirection();
149+
uint direction = nbl_glsl_ext_FFT_Parameters_t_getDirection();
150150
return dimension[direction];
151151
}
152152

153153
void nbl_glsl_ext_FFT(bool is_inverse)
154154
{
155155
nbl_glsl_ext_FFT_Parameters_t params = nbl_glsl_ext_FFT_getParameters();
156156
// Virtual Threads Calculation
157-
uint dataLength = nbl_glsl_ext_FFT_getDimLength(nbl_glsl_ext_FFT_getPaddedDimensions());
157+
uint dataLength = nbl_glsl_ext_FFT_getDimLength(nbl_glsl_ext_FFT_Parameters_t_getPaddedDimensions());
158158
uint num_virtual_threads = (dataLength-1u)/(_NBL_GLSL_EXT_FFT_WORKGROUP_SIZE_)+1u;
159159
uint thread_offset = gl_LocalInvocationIndex;
160160

include/nbl/ext/FFT/FFT.h

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -161,12 +161,37 @@ class FFT : public core::TotalInterface
161161
video::IVideoDriver * driver,
162162
video::IGPUDescriptorSet * set,
163163
core::smart_refctd_ptr<video::IGPUImageView> inputImageDescriptor,
164-
core::smart_refctd_ptr<video::IGPUBuffer> outputBufferDescriptor)
164+
core::smart_refctd_ptr<video::IGPUBuffer> outputBufferDescriptor,
165+
asset::ISampler::E_TEXTURE_CLAMP textureWrap)
165166
{
167+
using nbl::asset::ISampler;
168+
169+
static core::smart_refctd_ptr<video::IGPUSampler> samplers[ISampler::E_TEXTURE_CLAMP::ETC_COUNT];
170+
auto & sampler = samplers[(uint32_t)textureWrap];
171+
if (!sampler)
172+
{
173+
video::IGPUSampler::SParams params =
174+
{
175+
{
176+
textureWrap,
177+
textureWrap,
178+
textureWrap,
179+
ISampler::ETBC_FLOAT_OPAQUE_BLACK,
180+
ISampler::ETF_NEAREST,
181+
ISampler::ETF_NEAREST,
182+
ISampler::ESMM_NEAREST,
183+
0u,
184+
0u,
185+
ISampler::ECO_ALWAYS
186+
}
187+
};
188+
sampler = driver->createGPUSampler(params);
189+
}
190+
166191
video::IGPUDescriptorSet::SDescriptorInfo pInfos[MAX_DESCRIPTOR_COUNT];
167192
video::IGPUDescriptorSet::SWriteDescriptorSet pWrites[MAX_DESCRIPTOR_COUNT];
168193

169-
for (auto i=0; i< MAX_DESCRIPTOR_COUNT; i++)
194+
for (auto i = 0; i < MAX_DESCRIPTOR_COUNT; i++)
170195
{
171196
pWrites[i].dstSet = set;
172197
pWrites[i].arrayElement = 0u;
@@ -179,7 +204,7 @@ class FFT : public core::TotalInterface
179204
pWrites[0].descriptorType = asset::EDT_COMBINED_IMAGE_SAMPLER;
180205
pWrites[0].count = 1;
181206
pInfos[0].desc = inputImageDescriptor;
182-
pInfos[0].image.sampler = nullptr;
207+
pInfos[0].image.sampler = sampler;
183208
pInfos[0].image.imageLayout = static_cast<asset::E_IMAGE_LAYOUT>(0u);;
184209

185210
// Output Buffer

src/nbl/ext/FFT/FFT.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ core::SRange<const video::IGPUDescriptorSetLayout::SBinding> FFT::getDefaultBind
5353
bnd[0].type = EDT_COMBINED_IMAGE_SAMPLER;
5454
}
5555

56-
bnd[0].samplers = &sampler;
56+
bnd[0].samplers = nullptr;
5757

5858
if (!sampler)
5959
{

0 commit comments

Comments
 (0)