@@ -50,12 +50,12 @@ using namespace nbl::hlsl;
50
50
51
51
struct ConstevalParameters
52
52
{
53
- NBL_CONSTEXPR_STATIC_INLINE uint32_t WorkGroupSize = )===" << retval.workgroupSize << R"===( ;
54
- using kernel_weight_binding_t = )===" << layout->getBindingInfoForHLSL ({.binding =info.kernelWeights ,.requiredStages =IShader::E_SHADER_STAGE::ESS_COMPUTE}) << R"===( ;
55
- using input_sampler_binding_t = )===" << layout->getBindingInfoForHLSL ({.binding =info.samplers ,.requiredStages =IShader::E_SHADER_STAGE::ESS_COMPUTE}) << R"===( ;
56
- using input_image_binding_t = )===" << layout->getBindingInfoForHLSL ({.binding =info.inputs ,.requiredStages =IShader::E_SHADER_STAGE::ESS_COMPUTE}) << R"===( ;
57
- using output_binding_t = )===" << layout->getBindingInfoForHLSL ({.binding =info.outputs ,.requiredStages =IShader::E_SHADER_STAGE::ESS_COMPUTE}) << R"===( ;
58
- NBL_CONSTEXPR_STATIC_INLINE uint32_t SharedMemoryDWORDs = )===" << (sharedMemoryPerInvocation* retval.workgroupSize )/sizeof (uint32_t ) << R"===( ;
53
+ NBL_CONSTEXPR_STATIC_INLINE uint32_t WorkGroupSize = )===" << retval.workgroupSize << R"===( ;
54
+ using kernel_weight_binding_t = )===" << layout->getBindingInfoForHLSL ({.binding =info.kernelWeights ,.requiredStages =IShader::E_SHADER_STAGE::ESS_COMPUTE}) << R"===( ;
55
+ using input_sampler_binding_t = )===" << layout->getBindingInfoForHLSL ({.binding =info.samplers ,.requiredStages =IShader::E_SHADER_STAGE::ESS_COMPUTE}) << R"===( ;
56
+ using input_image_binding_t = )===" << layout->getBindingInfoForHLSL ({.binding =info.inputs ,.requiredStages =IShader::E_SHADER_STAGE::ESS_COMPUTE}) << R"===( ;
57
+ using output_binding_t = )===" << layout->getBindingInfoForHLSL ({.binding =info.outputs ,.requiredStages =IShader::E_SHADER_STAGE::ESS_COMPUTE}) << R"===( ;
58
+ NBL_CONSTEXPR_STATIC_INLINE uint32_t SharedMemoryDWORDs = )===" << (sharedMemoryPerInvocation* retval.workgroupSize )/sizeof (uint32_t ) << R"===( ;
59
59
};
60
60
)===" ;
61
61
return tmp.str ();
@@ -135,30 +135,7 @@ core::smart_refctd_ptr<video::IGPUShader> createBlitSpecializedShader(
135
135
const uint32_t smemFloatCount = m_availableSharedMemory / (sizeof(float) * outChannelCount);
136
136
const uint32_t blitDimCount = static_cast<uint32_t>(imageType) + 1;
137
137
138
-
139
- std::ostringstream shaderSourceStream;
140
- shaderSourceStream
141
- << "#include \"nbl/builtin/hlsl/blit/common.hlsl\"\n"
142
- "#include \"nbl/builtin/hlsl/blit/parameters.hlsl\"\n"
143
- "#include \"nbl/builtin/hlsl/blit/compute_blit.hlsl\"\n";
144
-
145
- shaderSourceStream
146
- << "typedef nbl::hlsl::blit::consteval_parameters_t<" << workgroupSize << ", 1, 1, " << smemFloatCount << ", "
147
- << outChannelCount << ", " << blitDimCount << ", " << paddedAlphaBinCount << "> ceval_params_t;\n";
148
-
149
- shaderSourceStream
150
- << "[[vk::combinedImageSampler]] [[vk::binding(0, 0)]]\n"
151
- "nbl::hlsl::blit::impl::dim_to_image_properties<ceval_params_t::BlitDimCount>::combined_sampler_t inCS;\n"
152
- "[[vk::combinedImageSampler]] [[vk::binding(0, 0)]]\n"
153
- "SamplerState inSamp;\n"
154
-
155
- "[[vk::image_format(\""<< formatQualifier << "\")]]\n"
156
- "[[vk::binding(1, 0)]]\n"
157
- "nbl::hlsl::blit::impl::dim_to_image_properties<ceval_params_t::BlitDimCount>::image_t outImg;\n"
158
-
159
- "[[vk::binding(0, 1)]] Buffer<float32_t4> kernelWeights;\n"
160
- "[[vk::push_constant]] nbl::hlsl::blit::parameters_t params;"
161
- "groupshared float32_t sMem[" << m_availableSharedMemory / sizeof(float) << "];\n";
138
+ .......
162
139
163
140
if (alphaSemantic == asset::IBlitUtilities::EAS_REFERENCE_OR_COVERAGE)
164
141
{
@@ -184,58 +161,6 @@ core::smart_refctd_ptr<video::IGPUShader> createBlitSpecializedShader(
184
161
" InCSAccessor inCSA; OutImgAccessor outImgA; KernelWeightsAccessor kwA; HistogramAccessor hA; SharedAccessor sA;\n"
185
162
" blit.execute(inCSA, outImgA, kwA, hA, sA, workGroupID, localInvocationIndex);\n"
186
163
"}\n";
187
-
188
- auto cpuShader = core::make_smart_refctd_ptr<asset::ICPUShader>(shaderSourceStream.str().c_str(), IGPUShader::E_SHADER_STAGE::ESS_COMPUTE, IGPUShader::E_SHADER_STAGE::E_CONTENT_TYPE::ECT_HLSL, "CComputeBlit::createBlitSpecializedShader");
189
- auto gpuShader = m_device->createShader(std::move(cpuShader.get()));
190
-
191
- return gpuShader;
192
- }
193
-
194
- template <typename BlitUtilities>
195
- core::smart_refctd_ptr<video::IGPUComputePipeline> getBlitPipeline(
196
- const asset::E_FORMAT outFormat,
197
- const asset::IImage::E_TYPE imageType,
198
- const core::vectorSIMDu32& inExtent,
199
- const core::vectorSIMDu32& outExtent,
200
- const asset::IBlitUtilities::E_ALPHA_SEMANTIC alphaSemantic,
201
- const typename BlitUtilities::convolution_kernels_t& kernels,
202
- const uint32_t workgroupSize = 256,
203
- const uint32_t alphaBinCount = asset::IBlitUtilities::DefaultAlphaBinCount)
204
- {
205
- const auto paddedAlphaBinCount = getPaddedAlphaBinCount(core::vectorSIMDu32(workgroupSize, 1, 1, 1), alphaBinCount);
206
-
207
- const SBlitCacheKey key =
208
- {
209
- .wgSize = workgroupSize,
210
- .imageType = imageType,
211
- .alphaBinCount = paddedAlphaBinCount,
212
- .outFormat = outFormat,
213
- .smemSize = m_availableSharedMemory,
214
- .coverageAdjustment = (alphaSemantic == asset::IBlitUtilities::EAS_REFERENCE_OR_COVERAGE)
215
- };
216
-
217
- if (m_blitPipelines.find(key) == m_blitPipelines.end())
218
- {
219
- const auto blitType = (alphaSemantic == asset::IBlitUtilities::EAS_REFERENCE_OR_COVERAGE) ? EBT_COVERAGE_ADJUSTMENT : EBT_REGULAR;
220
-
221
- auto specShader = createBlitSpecializedShader<BlitUtilities>(
222
- outFormat,
223
- imageType,
224
- inExtent,
225
- outExtent,
226
- alphaSemantic,
227
- kernels,
228
- workgroupSize,
229
- paddedAlphaBinCount);
230
-
231
- IGPUComputePipeline::SCreationParams creationParams;
232
- creationParams.shader.shader = specShader.get();
233
- creationParams.shader.entryPoint = "main";
234
- creationParams.layout = m_blitPipelineLayout[blitType].get();
235
- m_device->createComputePipelines(nullptr, { &creationParams, &creationParams + 1 }, &m_blitPipelines[key]);
236
- }
237
-
238
- return m_blitPipelines[key];
239
164
}
240
165
241
166
core::smart_refctd_ptr<video::IGPUShader> CComputeBlit::createAlphaTestSpecializedShader(const asset::IImage::E_TYPE imageType, const uint32_t alphaBinCount)
@@ -244,21 +169,7 @@ core::smart_refctd_ptr<video::IGPUShader> CComputeBlit::createAlphaTestSpecializ
244
169
const auto paddedAlphaBinCount = getPaddedAlphaBinCount(workgroupDims, alphaBinCount);
245
170
const uint32_t blitDimCount = static_cast<uint32_t>(imageType) + 1;
246
171
247
- std::ostringstream shaderSourceStream;
248
-
249
- shaderSourceStream
250
- << "#include \"nbl/builtin/hlsl/blit/common.hlsl\"\n"
251
- "#include \"nbl/builtin/hlsl/blit/parameters.hlsl\"\n"
252
- "#include \"nbl/builtin/hlsl/blit/alpha_test.hlsl\"\n"
253
-
254
- "typedef nbl::hlsl::blit::consteval_parameters_t<" << workgroupDims.x << ", " << workgroupDims.y << ", " << workgroupDims.z << ", "
255
- "0, 0, " << blitDimCount << ", " << paddedAlphaBinCount << "> ceval_params_t;\n"
256
-
257
- "[[vk::binding(0, 0)]]\n"
258
- "nbl::hlsl::blit::impl::dim_to_image_properties<ceval_params_t::BlitDimCount>::combined_sampler_t inCS;\n"
259
-
260
- "[[vk::binding(2 , 0)]] RWStructuredBuffer<uint32_t> statsBuff;\n"
261
- "[[vk::push_constant]] nbl::hlsl::blit::parameters_t params;"
172
+ ........
262
173
263
174
"struct PassedPixelsAccessor { void atomicAdd(uint32_t wgID, uint32_t v) { InterlockedAdd(statsBuff[wgID * (ceval_params_t::AlphaBinCount + 1) + ceval_params_t::AlphaBinCount], v); } };\n"
264
175
"struct InCSAccessor { float32_t4 get(int32_t3 c, uint32_t l) { return inCS[nbl::hlsl::blit::impl::dim_to_image_properties<ceval_params_t::BlitDimCount>::getIndexCoord<int32_t>(c, l)]; } };\n"
@@ -269,29 +180,6 @@ core::smart_refctd_ptr<video::IGPUShader> CComputeBlit::createAlphaTestSpecializ
269
180
" InCSAccessor inCSA;PassedPixelsAccessor ppA;\n"
270
181
" nbl::hlsl::blit::alpha_test(ppA, inCSA, params.inputDims, params.referenceAlpha, globalInvocationID, workGroupID);\n"
271
182
"}\n";
272
-
273
- auto cpuShader = core::make_smart_refctd_ptr<asset::ICPUShader>(shaderSourceStream.str().c_str(), IGPUShader::E_SHADER_STAGE::ESS_COMPUTE, IGPUShader::E_CONTENT_TYPE::ECT_HLSL, "CComputeBlitGLSLGLSL::createAlphaTestSpecializedShader");
274
- }
275
-
276
- core::smart_refctd_ptr<video::IGPUComputePipeline> getAlphaTestPipeline(const uint32_t alphaBinCount, const asset::IImage::E_TYPE imageType)
277
- {
278
- const auto workgroupDims = getDefaultWorkgroupDims(imageType);
279
- const auto paddedAlphaBinCount = getPaddedAlphaBinCount(workgroupDims, alphaBinCount);
280
-
281
- assert(paddedAlphaBinCount >= asset::IBlitUtilities::MinAlphaBinCount);
282
- const auto pipelineIndex = (paddedAlphaBinCount / asset::IBlitUtilities::MinAlphaBinCount) - 1;
283
-
284
- if (m_alphaTestPipelines[pipelineIndex][imageType])
285
- return m_alphaTestPipelines[pipelineIndex][imageType];
286
-
287
- auto specShader = createAlphaTestSpecializedShader(imageType, paddedAlphaBinCount);
288
- IGPUComputePipeline::SCreationParams creationParams;
289
- creationParams.shader.shader = specShader.get();
290
- creationParams.shader.entryPoint = "main";
291
- creationParams.layout = m_blitPipelineLayout[EBT_COVERAGE_ADJUSTMENT].get();
292
- assert(m_device->createComputePipelines(nullptr, { &creationParams, &creationParams + 1 }, &m_alphaTestPipelines[pipelineIndex][imageType]));
293
-
294
- return m_alphaTestPipelines[pipelineIndex][imageType];
295
183
}
296
184
297
185
// @param `outFormat` dictates encoding.
@@ -301,22 +189,7 @@ core::smart_refctd_ptr<video::IGPUShader> CComputeBlit::createNormalizationSpeci
301
189
const auto paddedAlphaBinCount = getPaddedAlphaBinCount(workgroupDims, alphaBinCount);
302
190
const uint32_t blitDimCount = static_cast<uint32_t>(imageType) + 1;
303
191
304
- std::ostringstream shaderSourceStream;
305
-
306
- shaderSourceStream
307
- << "#include \"nbl/builtin/hlsl/blit/common.hlsl\"\n"
308
- "#include \"nbl/builtin/hlsl/blit/parameters.hlsl\"\n"
309
- "#include \"nbl/builtin/hlsl/blit/normalization.hlsl\"\n"
310
-
311
- "typedef nbl::hlsl::blit::consteval_parameters_t<" << workgroupDims.x << ", " << workgroupDims.y << ", " << workgroupDims.z << ", "
312
- "0, 0, " << blitDimCount << ", " << paddedAlphaBinCount << "> ceval_params_t;\n"
313
-
314
- "[[vk::binding(0, 0)]]\n"
315
- "nbl::hlsl::blit::impl::dim_to_image_properties<ceval_params_t::BlitDimCount>::combined_sampler_t inCS;\n"
316
-
317
- "[[vk::image_format(\"unknown\")]]\n"
318
- "[[vk::binding(1, 0)]]\n"
319
- "nbl::hlsl::blit::impl::dim_to_image_properties<ceval_params_t::BlitDimCount>::image_t outImg;\n"
192
+ ....
320
193
321
194
"[[vk::binding(2 , 0)]] RWStructuredBuffer<uint32_t> statsBuff;\n"
322
195
"[[vk::push_constant]] nbl::hlsl::blit::parameters_t params;"
@@ -335,27 +208,5 @@ core::smart_refctd_ptr<video::IGPUShader> CComputeBlit::createNormalizationSpeci
335
208
" InCSAccessor inCSA; OutImgAccessor outImgA; HistogramAccessor hA; PassedPixelsAccessor ppA; SharedAccessor sA;\n"
336
209
" blit.execute(inCSA, outImgA, hA, ppA, sA, workGroupID, globalInvocationID, localInvocationIndex);\n"
337
210
"}\n";
338
-
339
- auto cpuShader = core::make_smart_refctd_ptr<asset::ICPUShader>(shaderSourceStream.str().c_str(), IGPUShader::E_SHADER_STAGE::ESS_COMPUTE, IGPUShader::E_CONTENT_TYPE::ECT_HLSL, "CComputeBlitGLSL::createNormalizationSpecializedShader");
340
- }
341
-
342
- core::smart_refctd_ptr<video::IGPUComputePipeline> getNormalizationPipeline(const asset::IImage::E_TYPE imageType, const asset::E_FORMAT outFormat,
343
- const uint32_t alphaBinCount = asset::IBlitUtilities::DefaultAlphaBinCount)
344
- {
345
- const auto workgroupDims = getDefaultWorkgroupDims(imageType);
346
- const uint32_t paddedAlphaBinCount = getPaddedAlphaBinCount(workgroupDims, alphaBinCount);
347
- const SNormalizationCacheKey key = { imageType, paddedAlphaBinCount, outFormat };
348
-
349
- if (m_normalizationPipelines.find(key) == m_normalizationPipelines.end())
350
- {
351
- auto specShader = createNormalizationSpecializedShader(imageType, outFormat, paddedAlphaBinCount);
352
- IGPUComputePipeline::SCreationParams creationParams;
353
- creationParams.shader.shader = specShader.get();
354
- creationParams.shader.entryPoint = "main";
355
- creationParams.layout = m_blitPipelineLayout[EBT_COVERAGE_ADJUSTMENT].get();
356
- assert(m_device->createComputePipelines(nullptr, { &creationParams, &creationParams + 1 }, &m_normalizationPipelines[key]));
357
- }
358
-
359
- return m_normalizationPipelines[key];
360
211
}
361
212
#endif
0 commit comments