| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 | // Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)// SPDX-FileCopyrightText: 2025 Jorrit Rouwe// SPDX-License-Identifier: MIT#include <TestFramework.h>#include <Renderer/MTL/TextureMTL.h>#include <Renderer/MTL/RendererMTL.h>#include <Renderer/MTL/FatalErrorIfFailedMTL.h>#include <Image/BlitSurface.h>TextureMTL::TextureMTL(RendererMTL *inRenderer, const Surface *inSurface) :	Texture(inSurface->GetWidth(), inSurface->GetHeight()),	mRenderer(inRenderer){	ESurfaceFormat format = inSurface->GetFormat();	MTLPixelFormat mt_format = MTLPixelFormatBGRA8Unorm;	switch (format)	{	case ESurfaceFormat::A4L4:	case ESurfaceFormat::A8L8:	case ESurfaceFormat::A4R4G4B4:	case ESurfaceFormat::R8G8B8:	case ESurfaceFormat::B8G8R8:	case ESurfaceFormat::X8R8G8B8:	case ESurfaceFormat::X8B8G8R8:	case ESurfaceFormat::A8R8G8B8:	case ESurfaceFormat::A8B8G8R8:		mt_format = MTLPixelFormatBGRA8Unorm;			format = ESurfaceFormat::A8R8G8B8; break;	case ESurfaceFormat::L8:			mt_format = MTLPixelFormatR8Unorm;				break;	case ESurfaceFormat::A8:			mt_format = MTLPixelFormatA8Unorm;				break;	case ESurfaceFormat::R5G6B5:	case ESurfaceFormat::X1R5G5B5:	case ESurfaceFormat::X4R4G4B4:		mt_format = MTLPixelFormatB5G6R5Unorm;			format = ESurfaceFormat::R5G6B5; break;	case ESurfaceFormat::A1R5G5B5:		mt_format = MTLPixelFormatA1BGR5Unorm;			break;	case ESurfaceFormat::Invalid:	default:							JPH_ASSERT(false);								break;	}	// Blit the surface to another temporary surface if the format changed	const Surface *surface = inSurface;	Ref<Surface> tmp;	if (format != inSurface->GetFormat())	{		tmp = new SoftwareSurface(mWidth, mHeight, format);		BlitSurface(inSurface, tmp);		surface = tmp;	}	// Create descriptor	MTLTextureDescriptor *descriptor = [[MTLTextureDescriptor alloc] init];	descriptor.textureType = MTLTextureType2D;	descriptor.usage = MTLTextureUsageShaderRead;	descriptor.pixelFormat = mt_format;	descriptor.width = mWidth;	descriptor.height = mHeight;	descriptor.storageMode = MTLStorageModeManaged;	MTLRegion region =	{		{ 0, 0, 0 },		{ NSUInteger(mWidth), NSUInteger(mHeight), 1}	};	// Create texture	mTexture = [inRenderer->GetDevice() newTextureWithDescriptor: descriptor];	surface->Lock(ESurfaceLockMode::Read);	[mTexture replaceRegion: region mipmapLevel:0 withBytes: surface->GetData() bytesPerRow: surface->GetStride()];	surface->UnLock();	[descriptor release];}TextureMTL::TextureMTL(RendererMTL *inRenderer, int inWidth, int inHeight) :	Texture(inWidth, inHeight),	mRenderer(inRenderer){	MTLTextureDescriptor *descriptor = [[MTLTextureDescriptor alloc] init];	descriptor.textureType = MTLTextureType2D;	descriptor.usage = MTLTextureUsageRenderTarget | MTLTextureUsageShaderRead;	descriptor.pixelFormat = MTLPixelFormatDepth32Float;	descriptor.width = mWidth;	descriptor.height = mHeight;	descriptor.storageMode = MTLStorageModePrivate;	mTexture = [inRenderer->GetDevice() newTextureWithDescriptor: descriptor];		[descriptor release];}TextureMTL::~TextureMTL(){	[mTexture release];}void TextureMTL::Bind() const{	[mRenderer->GetRenderEncoder() setFragmentTexture: mTexture atIndex: 0];}
 |