@@ -214,7 +214,7 @@ static void ConvertTextureDesc(id<MTLDevice> device, MTLTextureDescriptor* dst,
214214 if (formatAttribs.bitSize > 0 && (formatAttribs.flags & FormatFlags::IsCompressed) == 0 )
215215 {
216216 /* Convert image format (will be null if no conversion is necessary) */
217- intermediateData = ConvertImageBuffer (srcImageView, formatAttribs.format , formatAttribs.dataType , /* cfg.threadCount */ 0 );
217+ intermediateData = ConvertImageBuffer (srcImageView, formatAttribs.format , formatAttribs.dataType , textureRegion. extent , LLGL_MAX_THREAD_COUNT );
218218 if (intermediateData)
219219 {
220220 /* User converted temporary buffer as image source */
@@ -318,13 +318,20 @@ static void ConvertTextureDesc(id<MTLDevice> device, MTLTextureDescriptor* dst,
318318 const SubresourceCPUMappingLayout& layout,
319319 const MutableImageView& dstImageView)
320320{
321- if (formatAttribs.format != dstImageView.format || formatAttribs.dataType != dstImageView.dataType )
321+ char * dstImageData = static_cast <char *>(dstImageView.data );
322+ std::size_t dstImageDataSize = dstImageView.dataSize ;
323+ const std::size_t dstImageLayerStride = GetMemoryFootprint (dstImageView.format , dstImageView.dataType , layout.numTexelsPerLayer );
324+
325+ if (formatAttribs.format != dstImageView.format ||
326+ formatAttribs.dataType != dstImageView.dataType )
322327 {
323328 /* Generate intermediate buffer for conversion */
324329 DynamicByteArray intermediateData = DynamicByteArray{ layout.subresourceSize , UninitializeTag{} };
325330
326331 for_range (arrayLayer, subresource.numArrayLayers )
327332 {
333+ LLGL_ASSERT (dstImageDataSize >= dstImageLayerStride);
334+
328335 /* Copy bytes into intermediate data, then convert its format */
329336 [native_
330337 getBytes: intermediateData.get ()
@@ -336,22 +343,22 @@ static void ConvertTextureDesc(id<MTLDevice> device, MTLTextureDescriptor* dst,
336343 ];
337344
338345 /* Convert intermediate data into requested format */
339- DynamicByteArray formattedData = ConvertImageBuffer (
340- ImageView{ formatAttribs.format , formatAttribs.dataType , intermediateData.get (), layout.subresourceSize },
341- dstImageView.format , dstImageView.dataType , /* GetConfiguration().threadCount*/ 0
342- );
346+ const ImageView intermediateImageView{ formatAttribs.format , formatAttribs.dataType , intermediateData.get (), layout.subresourceSize };
347+ const MutableImageView dstImageLayerView{ dstImageView.format , dstImageView.dataType , dstImageData, dstImageDataSize };
343348
344- /* Copy temporary data into output buffer */
345- ::memcpy (dstImageView.data, formattedData.get(), dstImageView.dataSize);
349+ ConvertImageBuffer (intermediateImageView, dstImageLayerView, LLGL_MAX_THREAD_COUNT, true );
350+
351+ dstImageData += dstImageLayerStride;
352+ dstImageDataSize -= dstImageLayerStride;
346353 }
347354 }
348355 else
349356 {
350- char * dstImageData = static_cast <char *>(dstImageView.data );
351-
352357 for_range (arrayLayer, subresource.numArrayLayers )
353358 {
354359 /* Copy bytes into intermediate data, then convert its format */
360+ LLGL_ASSERT (dstImageDataSize >= layout.layerStride );
361+
355362 [native_
356363 getBytes: dstImageData
357364 bytesPerRow: layout.rowStride
@@ -360,7 +367,9 @@ static void ConvertTextureDesc(id<MTLDevice> device, MTLTextureDescriptor* dst,
360367 mipmapLevel: subresource.baseMipLevel
361368 slice: subresource.baseArrayLayer + arrayLayer
362369 ];
370+
363371 dstImageData += layout.layerStride ;
372+ dstImageDataSize -= layout.layerStride ;
364373 }
365374 }
366375}
@@ -418,18 +427,13 @@ static void CopyIntermediateBufferToImageBuffer(
418427 DataType srcDataType,
419428 const MutableImageView& dstImageView)
420429{
421- if (srcImageFormat != dstImageView.format || srcDataType != dstImageView.dataType )
422- {
423- ConvertImageBuffer (
424- ImageView{ srcImageFormat, srcDataType, srcBuffer.GetBytes (), srcBufferSize },
425- dstImageView
426- );
427- }
428- else
429- {
430- /* Copy bytes from intermediate shared buffer into output CPU buffer */
431- ::memcpy (dstImageView.data, srcBuffer.GetBytes(), dstImageView.dataSize);
432- }
430+ /* Convert or copy intermediate shared buffer into output CPU buffer */
431+ ConvertImageBuffer (
432+ ImageView{ srcImageFormat, srcDataType, srcBuffer.GetBytes (), srcBufferSize },
433+ dstImageView,
434+ LLGL_MAX_THREAD_COUNT,
435+ true
436+ );
433437}
434438
435439void MTTexture::ReadRegionFromPrivateMemory (
0 commit comments