Skip to content

Commit b74a9e2

Browse files
committed
[Metal] Updated MTTexture implementation to use new ConvertImageBuffer() functionality.
This also fixes "TextureStrides" unit test for Metal.
1 parent 804a538 commit b74a9e2

File tree

1 file changed

+26
-22
lines changed

1 file changed

+26
-22
lines changed

sources/Renderer/Metal/Texture/MTTexture.mm

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -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

435439
void MTTexture::ReadRegionFromPrivateMemory(

0 commit comments

Comments
 (0)