@@ -15,9 +15,10 @@ using namespace nbl::video;
15
15
Create a ScreenShot with gpu image usage and save it to a file.
16
16
The queue being passed must have TRANSFER capability.
17
17
18
- TODO: Add support for downloading a region of a specific subresource
18
+ TODO (Mihailo) : Add support for downloading a region of a specific subresource
19
19
*/
20
20
21
+ #if 0 // TODO (Mihailo): port
21
22
inline core::smart_refctd_ptr<ICPUImageView> createScreenShot(
22
23
ILogicalDevice* logicalDevice,
23
24
IQueue* queue,
@@ -199,169 +200,8 @@ inline bool createScreenShot(
199
200
IAssetWriter::SAssetWriteParams writeParams(cpuImageView.get());
200
201
return assetManager->writeAsset(filename.string(),writeParams); // TODO: Use std::filesystem::path
201
202
}
202
-
203
- } // namespace nbl::ext::ScreenShot
204
-
205
203
#endif
206
204
207
- #ifdef OLD_CODE // code from old `ditt` branch:
208
- /*
209
- Download mip level image with gpu image usage and save it to IGPUBuffer.
210
- Because of the fence placed by driver the function stalls the CPU
211
- to wait on the GPU to finish, beware of that.
212
- @see IDriverFence
213
- */
214
-
215
- // ! TODO: HANDLE UNPACK ALIGNMENT
216
- [[nodiscard]] core::smart_refctd_ptr<IDriverFence> downloadImageMipLevel (IDriver* driver, IGPUImage* source, IGPUBuffer* destination, uint32_t sourceMipLevel = 0u , size_t destOffset = 0ull , bool implicitflush = true )
217
- {
218
- // will change this, https://github.com/buildaworldnet/IrrlichtBAW/issues/148
219
- if (isBlockCompressionFormat (source->getCreationParameters ().format ))
220
- return nullptr ;
221
-
222
- auto extent = source->getMipSize (sourceMipLevel);
223
- IGPUImage::SBufferCopy pRegions[1u ] = { {destOffset,extent.x ,extent.y ,{static_cast <IImage::E_ASPECT_FLAGS>(0u ),sourceMipLevel,0u ,1u },{0u ,0u ,0u },{extent.x ,extent.y ,extent.z }} };
224
- driver->copyImageToBuffer (source, destination, 1u , pRegions);
225
-
226
- return driver->placeFence (implicitflush);
227
- }
228
-
229
- /*
230
- Create a ScreenShot with gpu image usage and save it to a file.
231
- */
232
- bool createScreenShot (IVideoDriver* driver, IAssetManager* assetManager, const IGPUImageView* gpuImageView, const std::string& outFileName, E_FORMAT convertToFormat=EF_UNKNOWN)
233
- {
234
- auto fetchedImageViewParmas = gpuImageView->getCreationParameters ();
235
- auto gpuImage = fetchedImageViewParmas.image ;
236
- auto fetchedImageParams = gpuImage->getCreationParameters ();
237
- auto image = ICPUImage::create (std::move (fetchedImageParams));
238
-
239
- auto texelBufferRowLength = IImageAssetHandlerBase::calcPitchInBlocks (fetchedImageParams.extent .width * getBlockDimensions (fetchedImageParams.format ).X , getTexelOrBlockBytesize (fetchedImageParams.format ));
240
-
241
- auto regions = core::make_refctd_dynamic_array<core::smart_refctd_dynamic_array<ICPUImage::SBufferCopy>>(1u );
242
- ICPUImage::SBufferCopy& region = regions->front ();
243
-
244
- region.imageSubresource .mipLevel = 0u ;
245
- region.imageSubresource .baseArrayLayer = 0u ;
246
- region.imageSubresource .layerCount = 1u ;
247
- region.bufferOffset = 0u ;
248
- region.bufferRowLength = texelBufferRowLength;
249
- region.bufferImageHeight = 0u ;
250
- region.imageOffset = { 0u , 0u , 0u };
251
- region.imageExtent = image->getCreationParameters ().extent ;
252
-
253
- IDeviceMemoryBacked::SDeviceMemoryRequirements memoryRequirements;
254
- memoryRequirements.vulkanReqs .alignment = 64u ;
255
- memoryRequirements.vulkanReqs .memoryTypeBits = 0xffffffffu ;
256
- memoryRequirements.memoryHeapLocation = IDeviceMemoryAllocation::ESMT_NOT_DEVICE_LOCAL;
257
- memoryRequirements.mappingCapability = IDeviceMemoryAllocation::EMCF_CAN_MAP_FOR_READ | IDeviceMemoryAllocation::EMCF_COHERENT | IDeviceMemoryAllocation::EMCF_CACHED;
258
- memoryRequirements.vulkanReqs .size = image->getImageDataSizeInBytes ();
259
- auto destinationBuffer = driver->createGPUBufferOnDedMem (memoryRequirements);
260
-
261
- auto mapPointerGetterFence = downloadImageMipLevel (driver, gpuImage.get (), destinationBuffer.get ());
262
-
263
- auto destinationBoundMemory = destinationBuffer->getBoundMemory ();
264
- destinationBoundMemory->mapMemoryRange (IDeviceMemoryAllocation::EMCAF_READ, { 0u , memoryRequirements.vulkanReqs .size });
265
-
266
- auto correctedScreenShotTexelBuffer = core::make_smart_refctd_ptr<ICPUBuffer>(memoryRequirements.vulkanReqs .size );
267
- bool flipImage = true ;
268
- if (flipImage)
269
- {
270
- auto extent = gpuImage->getMipSize (0u );
271
- uint32_t rowByteSize = extent.x * getTexelOrBlockBytesize (gpuImage->getCreationParameters ().format );
272
- for (uint32_t y = 0 ; y < extent.y ; ++y)
273
- {
274
- uint32_t flipped_y = extent.y - y - 1 ;
275
- memcpy (reinterpret_cast <uint8_t *>(correctedScreenShotTexelBuffer->getPointer ()) + rowByteSize * y, reinterpret_cast <uint8_t *>(destinationBoundMemory->getMappedPointer ()) + rowByteSize * flipped_y, rowByteSize);
276
- }
277
- }
278
- else
279
- {
280
- memcpy (correctedScreenShotTexelBuffer->getPointer (), destinationBoundMemory->getMappedPointer (), memoryRequirements.vulkanReqs .size );
281
- }
282
-
283
- destinationBoundMemory->unmapMemory ();
284
-
285
- image->setBufferAndRegions (std::move (correctedScreenShotTexelBuffer), regions);
286
-
287
- while (mapPointerGetterFence->waitCPU (1000ull , mapPointerGetterFence->canDeferredFlush ()) == EDFR_TIMEOUT_EXPIRED) {}
288
-
289
- core::smart_refctd_ptr<ICPUImage> convertedImage;
290
- if (convertToFormat != EF_UNKNOWN)
291
- {
292
- auto referenceImageParams = image->getCreationParameters ();
293
- auto referenceBuffer = image->getBuffer ();
294
- auto referenceRegions = image->getRegions ();
295
- auto referenceRegion = referenceRegions.begin ();
296
- const auto newTexelOrBlockByteSize = getTexelOrBlockBytesize (convertToFormat);
297
-
298
- auto newImageParams = referenceImageParams;
299
- auto newCpuBuffer = core::make_smart_refctd_ptr<ICPUBuffer>(referenceBuffer->getSize () * newTexelOrBlockByteSize);
300
- auto newRegions = core::make_refctd_dynamic_array<core::smart_refctd_dynamic_array<ICPUImage::SBufferCopy>>(referenceRegions.size ());
301
-
302
- for (auto newRegion = newRegions->begin (); newRegion != newRegions->end (); ++newRegion)
303
- {
304
- *newRegion = *(referenceRegion++);
305
- newRegion->bufferOffset = newRegion->bufferOffset * newTexelOrBlockByteSize;
306
- }
307
-
308
- newImageParams.format = convertToFormat;
309
- convertedImage = ICPUImage::create (std::move (newImageParams));
310
- convertedImage->setBufferAndRegions (std::move (newCpuBuffer), newRegions);
311
-
312
- // CConvertFormatImageFilter TODO: use this one instead with a nice dither @Anastazluk, we could also get rid of a lot of code here, since there's a bunch of constraints
313
- CSwizzleAndConvertImageFilter<> convertFilter;
314
- CSwizzleAndConvertImageFilter<>::state_type state;
315
-
316
- state.swizzle = {};
317
- state.inImage = image.get ();
318
- state.outImage = convertedImage.get ();
319
- state.inOffset = { 0 , 0 , 0 };
320
- state.inBaseLayer = 0 ;
321
- state.outOffset = { 0 , 0 , 0 };
322
- state.outBaseLayer = 0 ;
323
- // state.dither = ;
324
-
325
- for (auto itr = 0 ; itr < convertedImage->getCreationParameters ().mipLevels ; ++itr)
326
- {
327
- auto regionWithMipMap = convertedImage->getRegions (itr).begin ();
328
-
329
- state.extent = regionWithMipMap->getExtent ();
330
- state.layerCount = regionWithMipMap->imageSubresource .layerCount ;
331
- state.inMipLevel = regionWithMipMap->imageSubresource .mipLevel ;
332
- state.outMipLevel = regionWithMipMap->imageSubresource .mipLevel ;
333
-
334
- const bool ok = convertFilter.execute (core::execution::par_unseq,&state);
335
- assert (ok);
336
- }
337
- }
338
- else
339
- convertedImage = image;
340
- auto newCreationParams = convertedImage->getCreationParameters ();
341
-
342
- ICPUImageView::SCreationParams viewParams;
343
- viewParams.flags = static_cast <ICPUImageView::E_CREATE_FLAGS>(0u );
344
- viewParams.image = convertedImage;
345
- viewParams.format = newCreationParams.format ;
346
- viewParams.viewType = ICPUImageView::ET_2D;
347
- viewParams.subresourceRange .baseArrayLayer = 0u ;
348
- viewParams.subresourceRange .layerCount = newCreationParams.arrayLayers ;
349
- viewParams.subresourceRange .baseMipLevel = 0u ;
350
- viewParams.subresourceRange .levelCount = newCreationParams.mipLevels ;
351
-
352
- auto imageView = ICPUImageView::create (std::move (viewParams));
353
-
354
- auto tryToWrite = [&](IAsset* asset)
355
- {
356
- IAssetWriter::SAssetWriteParams wparams (asset);
357
- return assetManager->writeAsset (outFileName, wparams);
358
- };
359
-
360
- bool status = tryToWrite (convertedImage.get ());
361
- if (!status)
362
- status = tryToWrite (imageView.get ());
363
-
364
- return status;
205
+ } // namespace nbl::ext::ScreenShot
365
206
366
- }
367
207
#endif
0 commit comments