Skip to content

Commit 3fbe4ab

Browse files
outline the TODO for @theoreticalphysicsftw
1 parent 2878200 commit 3fbe4ab

File tree

2 files changed

+4
-164
lines changed

2 files changed

+4
-164
lines changed

include/nbl/ext/ScreenShot/ScreenShot.h

Lines changed: 3 additions & 163 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,10 @@ using namespace nbl::video;
1515
Create a ScreenShot with gpu image usage and save it to a file.
1616
The queue being passed must have TRANSFER capability.
1717
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
1919
*/
2020

21+
#if 0 // TODO (Mihailo): port
2122
inline core::smart_refctd_ptr<ICPUImageView> createScreenShot(
2223
ILogicalDevice* logicalDevice,
2324
IQueue* queue,
@@ -199,169 +200,8 @@ inline bool createScreenShot(
199200
IAssetWriter::SAssetWriteParams writeParams(cpuImageView.get());
200201
return assetManager->writeAsset(filename.string(),writeParams); // TODO: Use std::filesystem::path
201202
}
202-
203-
} // namespace nbl::ext::ScreenShot
204-
205203
#endif
206204

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
365206

366-
}
367207
#endif

0 commit comments

Comments
 (0)