metal: more work on MSAA textures

This commit is contained in:
Alex Szpakowski
2020-02-15 16:00:55 -04:00
parent 64b38459cf
commit 455b0c2c6b
2 changed files with 21 additions and 5 deletions
+2 -1
View File
@@ -45,7 +45,7 @@ public:
void setSamplerState(const SamplerState &s) override; void setSamplerState(const SamplerState &s) override;
ptrdiff_t getHandle() const override { return (ptrdiff_t) texture; } ptrdiff_t getHandle() const override { return (ptrdiff_t) texture; }
ptrdiff_t getRenderTargetHandle() const override { return (ptrdiff_t) texture; /* TODO */ } ptrdiff_t getRenderTargetHandle() const override { return msaaTexture != nil ? (ptrdiff_t) msaaTexture : (ptrdiff_t) texture; }
int getMSAA() const override { return 1 /* TODO*/; } int getMSAA() const override { return 1 /* TODO*/; }
private: private:
@@ -53,6 +53,7 @@ private:
void uploadByteData(PixelFormat pixelformat, const void *data, size_t size, int level, int slice, const Rect &r, love::image::ImageDataBase *imgd = nullptr) override; void uploadByteData(PixelFormat pixelformat, const void *data, size_t size, int level, int slice, const Rect &r, love::image::ImageDataBase *imgd = nullptr) override;
id<MTLTexture> texture; id<MTLTexture> texture;
id<MTLTexture> msaaTexture;
id<MTLSamplerState> sampler; id<MTLSamplerState> sampler;
}; // Texture }; // Texture
+19 -4
View File
@@ -31,6 +31,7 @@ namespace metal
Texture::Texture(id<MTLDevice> device, const Settings &settings, const Slices *data) Texture::Texture(id<MTLDevice> device, const Settings &settings, const Slices *data)
: love::graphics::Texture(settings, data) : love::graphics::Texture(settings, data)
, texture(nil) , texture(nil)
, msaaTexture(nil)
, sampler(nil) , sampler(nil)
{ @autoreleasepool { { @autoreleasepool {
MTLTextureDescriptor *desc = [MTLTextureDescriptor new]; MTLTextureDescriptor *desc = [MTLTextureDescriptor new];
@@ -38,15 +39,12 @@ Texture::Texture(id<MTLDevice> device, const Settings &settings, const Slices *d
int w = pixelWidth; int w = pixelWidth;
int h = pixelHeight; int h = pixelHeight;
// TODO: sampleCount validation
desc.sampleCount = getRequestedMSAA();
desc.width = w; desc.width = w;
desc.height = h; desc.height = h;
desc.depth = depth; desc.depth = depth;
desc.arrayLength = layers; desc.arrayLength = layers;
desc.mipmapLevelCount = mipmapCount; desc.mipmapLevelCount = mipmapCount;
desc.textureType = Metal::getTextureType(texType, (int)desc.sampleCount); desc.textureType = Metal::getTextureType(texType, 1);
desc.pixelFormat = Metal::convertPixelFormat(format, sRGB); desc.pixelFormat = Metal::convertPixelFormat(format, sRGB);
desc.storageMode = MTLStorageModePrivate; desc.storageMode = MTLStorageModePrivate;
@@ -60,6 +58,22 @@ Texture::Texture(id<MTLDevice> device, const Settings &settings, const Slices *d
if (texture == nil) if (texture == nil)
throw love::Exception("Out of graphics memory."); throw love::Exception("Out of graphics memory.");
if (getRequestedMSAA() > 1)
{
// TODO: sampleCount validation
desc.sampleCount = getRequestedMSAA();
desc.textureType = Metal::getTextureType(texType, (int)desc.sampleCount);
desc.usage &= ~MTLTextureUsageShaderRead;
// TODO: This needs to be cleared, etc.
msaaTexture = [device newTextureWithDescriptor:desc];
if (msaaTexture == nil)
{
texture = nil;
throw love::Exception("Out of graphics memory.");
}
}
int mipcount = getMipmapCount(); int mipcount = getMipmapCount();
int slicecount = 1; int slicecount = 1;
@@ -105,6 +119,7 @@ Texture::Texture(id<MTLDevice> device, const Settings &settings, const Slices *d
Texture::~Texture() Texture::~Texture()
{ @autoreleasepool { { @autoreleasepool {
texture = nil; texture = nil;
msaaTexture = nil;
sampler = nil; sampler = nil;
}} }}