Skip to content

Commit

Permalink
Compressed texture formats have explicit sRGB variants
Browse files Browse the repository at this point in the history
  • Loading branch information
slime73 committed Oct 14, 2023
1 parent 9eec175 commit 343d192
Show file tree
Hide file tree
Showing 26 changed files with 901 additions and 523 deletions.
411 changes: 257 additions & 154 deletions src/common/pixelformat.cpp

Large diffs are not rendered by default.

61 changes: 45 additions & 16 deletions src/common/pixelformat.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,9 +60,9 @@ enum PixelFormat

// 4-channel normal formats
PIXELFORMAT_RGBA8_UNORM,
PIXELFORMAT_RGBA8_UNORM_sRGB,
PIXELFORMAT_RGBA8_sRGB,
PIXELFORMAT_BGRA8_UNORM,
PIXELFORMAT_BGRA8_UNORM_sRGB,
PIXELFORMAT_BGRA8_sRGB,
PIXELFORMAT_RGBA8_INT,
PIXELFORMAT_RGBA8_UINT,
PIXELFORMAT_RGBA16_UNORM,
Expand Down Expand Up @@ -90,41 +90,69 @@ enum PixelFormat

// compressed formats
PIXELFORMAT_DXT1_UNORM,
PIXELFORMAT_DXT1_sRGB,
PIXELFORMAT_DXT3_UNORM,
PIXELFORMAT_DXT3_sRGB,
PIXELFORMAT_DXT5_UNORM,
PIXELFORMAT_DXT5_sRGB,
PIXELFORMAT_BC4_UNORM,
PIXELFORMAT_BC4_SNORM,
PIXELFORMAT_BC5_UNORM,
PIXELFORMAT_BC5_SNORM,
PIXELFORMAT_BC6H_UFLOAT,
PIXELFORMAT_BC6H_FLOAT,
PIXELFORMAT_BC7_UNORM,
PIXELFORMAT_BC7_sRGB,

PIXELFORMAT_PVR1_RGB2_UNORM,
PIXELFORMAT_PVR1_RGB2_sRGB,
PIXELFORMAT_PVR1_RGB4_UNORM,
PIXELFORMAT_PVR1_RGB4_sRGB,
PIXELFORMAT_PVR1_RGBA2_UNORM,
PIXELFORMAT_PVR1_RGBA2_sRGB,
PIXELFORMAT_PVR1_RGBA4_UNORM,
PIXELFORMAT_PVR1_RGBA4_sRGB,

PIXELFORMAT_ETC1_UNORM,
PIXELFORMAT_ETC2_RGB_UNORM,
PIXELFORMAT_ETC2_RGB_sRGB,
PIXELFORMAT_ETC2_RGBA_UNORM,
PIXELFORMAT_ETC2_RGBA_sRGB,
PIXELFORMAT_ETC2_RGBA1_UNORM,
PIXELFORMAT_ETC2_RGBA1_sRGB,
PIXELFORMAT_EAC_R_UNORM,
PIXELFORMAT_EAC_R_SNORM,
PIXELFORMAT_EAC_RG_UNORM,
PIXELFORMAT_EAC_RG_SNORM,
PIXELFORMAT_ASTC_4x4,
PIXELFORMAT_ASTC_5x4,
PIXELFORMAT_ASTC_5x5,
PIXELFORMAT_ASTC_6x5,
PIXELFORMAT_ASTC_6x6,
PIXELFORMAT_ASTC_8x5,
PIXELFORMAT_ASTC_8x6,
PIXELFORMAT_ASTC_8x8,
PIXELFORMAT_ASTC_10x5,
PIXELFORMAT_ASTC_10x6,
PIXELFORMAT_ASTC_10x8,
PIXELFORMAT_ASTC_10x10,
PIXELFORMAT_ASTC_12x10,
PIXELFORMAT_ASTC_12x12,

PIXELFORMAT_ASTC_4x4_UNORM,
PIXELFORMAT_ASTC_5x4_UNORM,
PIXELFORMAT_ASTC_5x5_UNORM,
PIXELFORMAT_ASTC_6x5_UNORM,
PIXELFORMAT_ASTC_6x6_UNORM,
PIXELFORMAT_ASTC_8x5_UNORM,
PIXELFORMAT_ASTC_8x6_UNORM,
PIXELFORMAT_ASTC_8x8_UNORM,
PIXELFORMAT_ASTC_10x5_UNORM,
PIXELFORMAT_ASTC_10x6_UNORM,
PIXELFORMAT_ASTC_10x8_UNORM,
PIXELFORMAT_ASTC_10x10_UNORM,
PIXELFORMAT_ASTC_12x10_UNORM,
PIXELFORMAT_ASTC_12x12_UNORM,
PIXELFORMAT_ASTC_4x4_sRGB,
PIXELFORMAT_ASTC_5x4_sRGB,
PIXELFORMAT_ASTC_5x5_sRGB,
PIXELFORMAT_ASTC_6x5_sRGB,
PIXELFORMAT_ASTC_6x6_sRGB,
PIXELFORMAT_ASTC_8x5_sRGB,
PIXELFORMAT_ASTC_8x6_sRGB,
PIXELFORMAT_ASTC_8x8_sRGB,
PIXELFORMAT_ASTC_10x5_sRGB,
PIXELFORMAT_ASTC_10x6_sRGB,
PIXELFORMAT_ASTC_10x8_sRGB,
PIXELFORMAT_ASTC_10x10_sRGB,
PIXELFORMAT_ASTC_12x10_sRGB,
PIXELFORMAT_ASTC_12x12_sRGB,

PIXELFORMAT_MAX_ENUM
};
Expand All @@ -149,6 +177,7 @@ struct PixelFormatInfo
bool depth;
bool stencil;
bool compressed;
bool sRGB;
PixelFormatType dataType;
};

Expand Down
4 changes: 2 additions & 2 deletions src/modules/graphics/Graphics.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -925,7 +925,7 @@ void Graphics::setRenderTargets(const RenderTargets &rts)
PixelFormat dsformat = PIXELFORMAT_STENCIL8;
if (wantsdepth && wantsstencil)
dsformat = PIXELFORMAT_DEPTH24_UNORM_STENCIL8;
else if (wantsdepth && isPixelFormatSupported(PIXELFORMAT_DEPTH24_UNORM, PIXELFORMATUSAGEFLAGS_RENDERTARGET, false))
else if (wantsdepth && isPixelFormatSupported(PIXELFORMAT_DEPTH24_UNORM, PIXELFORMATUSAGEFLAGS_RENDERTARGET))
dsformat = PIXELFORMAT_DEPTH24_UNORM;
else if (wantsdepth)
dsformat = PIXELFORMAT_DEPTH16_UNORM;
Expand Down Expand Up @@ -2395,7 +2395,7 @@ PixelFormat Graphics::getSizedFormat(PixelFormat format) const
{
case PIXELFORMAT_NORMAL:
if (isGammaCorrect())
return PIXELFORMAT_RGBA8_UNORM_sRGB;
return PIXELFORMAT_RGBA8_sRGB;
else
return PIXELFORMAT_RGBA8_UNORM;
case PIXELFORMAT_HDR:
Expand Down
2 changes: 1 addition & 1 deletion src/modules/graphics/Graphics.h
Original file line number Diff line number Diff line change
Expand Up @@ -824,7 +824,7 @@ class Graphics : public Module
/**
* Gets whether the specified pixel format usage is supported.
**/
virtual bool isPixelFormatSupported(PixelFormat format, uint32 usage, bool sRGB = false) = 0;
virtual bool isPixelFormatSupported(PixelFormat format, uint32 usage) = 0;

/**
* Gets the renderer used by love.graphics.
Expand Down
8 changes: 4 additions & 4 deletions src/modules/graphics/Texture.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,6 @@ Texture::Texture(Graphics *gfx, const Settings &settings, const Slices *slices)
, computeWrite(settings.computeWrite)
, readable(true)
, mipmapsMode(settings.mipmaps)
, sRGB(false)
, width(settings.width)
, height(settings.height)
, depth(settings.type == TEXTURE_VOLUME ? settings.layers : 1)
Expand Down Expand Up @@ -236,7 +235,8 @@ Texture::Texture(Graphics *gfx, const Settings &settings, const Slices *slices)
readable = !renderTarget || !isPixelFormatDepthStencil(format);

format = gfx->getSizedFormat(format);
sRGB = isPixelFormatSRGB(format) || (isCompressed() && isGammaCorrect() && !settings.linear);
if (!isGammaCorrect() || settings.linear)
format = getLinearPixelFormat(format);

if (mipmapsMode == MIPMAPS_AUTO && isCompressed())
mipmapsMode = MIPMAPS_MANUAL;
Expand Down Expand Up @@ -291,7 +291,7 @@ Texture::Texture(Graphics *gfx, const Settings &settings, const Slices *slices)
if (computeWrite)
usage |= PIXELFORMATUSAGEFLAGS_COMPUTEWRITE;

if (!gfx->isPixelFormatSupported(format, (PixelFormatUsageFlags) usage, sRGB))
if (!gfx->isPixelFormatSupported(format, (PixelFormatUsageFlags) usage))
{
const char *fstr = "unknown";
love::getConstant(format, fstr);
Expand Down Expand Up @@ -622,7 +622,7 @@ bool Texture::isCompressed() const

bool Texture::isFormatLinear() const
{
return isGammaCorrect() && !sRGB && !isPixelFormatSRGB(format);
return isGammaCorrect() && !isPixelFormatSRGB(format);
}

bool Texture::isValidSlice(int slice, int mip) const
Expand Down
2 changes: 0 additions & 2 deletions src/modules/graphics/Texture.h
Original file line number Diff line number Diff line change
Expand Up @@ -325,8 +325,6 @@ class Texture : public Drawable, public Resource

MipmapsMode mipmapsMode;

bool sRGB;

int width;
int height;

Expand Down
2 changes: 1 addition & 1 deletion src/modules/graphics/metal/Graphics.h
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ class Graphics final : public love::graphics::Graphics

void setWireframe(bool enable) override;

bool isPixelFormatSupported(PixelFormat format, uint32 usage, bool sRGB = false) override;
bool isPixelFormatSupported(PixelFormat format, uint32 usage) override;
Renderer getRenderer() const override;
bool usesGLSLES() const override;
RendererInfo getRendererInfo() const override;
Expand Down
66 changes: 44 additions & 22 deletions src/modules/graphics/metal/Graphics.mm
Original file line number Diff line number Diff line change
Expand Up @@ -503,7 +503,7 @@ static inline void setSampler(id<MTLComputeCommandEncoder> encoder, Graphics::Re
backbufferMSAA.set(nullptr);
if (settings.msaa > 1)
{
settings.format = isGammaCorrect() ? PIXELFORMAT_BGRA8_UNORM_sRGB : PIXELFORMAT_BGRA8_UNORM;
settings.format = isGammaCorrect() ? PIXELFORMAT_BGRA8_sRGB : PIXELFORMAT_BGRA8_UNORM;
backbufferMSAA.set(newTexture(settings), Acquire::NORETAIN);
}

Expand Down Expand Up @@ -681,7 +681,7 @@ static inline void setAttachment(const Graphics::RenderTarget &rt, MTLRenderPass
attachmentStoreActions.stencil = MTLStoreActionDontCare;

auto &key = lastRenderPipelineKey;
key.colorRenderTargetFormats = isGammaCorrect() ? PIXELFORMAT_BGRA8_UNORM_sRGB : PIXELFORMAT_BGRA8_UNORM;
key.colorRenderTargetFormats = isGammaCorrect() ? PIXELFORMAT_BGRA8_sRGB : PIXELFORMAT_BGRA8_UNORM;
key.depthStencilFormat = backbufferDepthStencil->getPixelFormat();
key.msaa = backbufferMSAA ? (uint8) backbufferMSAA->getMSAA() : 1;
}
Expand Down Expand Up @@ -1864,13 +1864,10 @@ static inline void advanceVertexOffsets(const VertexAttributes &attributes, Buff
}
}

bool Graphics::isPixelFormatSupported(PixelFormat format, uint32 usage, bool sRGB)
bool Graphics::isPixelFormatSupported(PixelFormat format, uint32 usage)
{
format = getSizedFormat(format);

if (sRGB)
format = getSRGBPixelFormat(format);

const uint32 sample = PIXELFORMATUSAGEFLAGS_SAMPLE;
const uint32 filter = PIXELFORMATUSAGEFLAGS_LINEAR;
const uint32 rt = PIXELFORMATUSAGEFLAGS_RENDERTARGET;
Expand Down Expand Up @@ -1958,8 +1955,8 @@ static inline void advanceVertexOffsets(const VertexAttributes &attributes, Buff
case PIXELFORMAT_BGRA8_UNORM:
flags |= all;
break;
case PIXELFORMAT_RGBA8_UNORM_sRGB:
case PIXELFORMAT_BGRA8_UNORM_sRGB:
case PIXELFORMAT_RGBA8_sRGB:
case PIXELFORMAT_BGRA8_sRGB:
if (families.apple[1] || families.mac[1] || families.macCatalyst[1])
flags |= commonsample | commonrender;
if (families.apple[2])
Expand Down Expand Up @@ -2058,31 +2055,42 @@ static inline void advanceVertexOffsets(const VertexAttributes &attributes, Buff
break;

case PIXELFORMAT_DXT1_UNORM:
case PIXELFORMAT_DXT1_sRGB:
case PIXELFORMAT_DXT3_UNORM:
case PIXELFORMAT_DXT3_sRGB:
case PIXELFORMAT_DXT5_UNORM:
case PIXELFORMAT_DXT5_sRGB:
case PIXELFORMAT_BC4_UNORM:
case PIXELFORMAT_BC4_SNORM:
case PIXELFORMAT_BC5_UNORM:
case PIXELFORMAT_BC5_SNORM:
case PIXELFORMAT_BC6H_UFLOAT:
case PIXELFORMAT_BC6H_FLOAT:
case PIXELFORMAT_BC7_UNORM:
case PIXELFORMAT_BC7_sRGB:
if (families.mac[1] || families.macCatalyst[1])
flags |= commonsample;
break;

case PIXELFORMAT_PVR1_RGB2_UNORM:
case PIXELFORMAT_PVR1_RGB2_sRGB:
case PIXELFORMAT_PVR1_RGB4_UNORM:
case PIXELFORMAT_PVR1_RGB4_sRGB:
case PIXELFORMAT_PVR1_RGBA2_UNORM:
case PIXELFORMAT_PVR1_RGBA2_sRGB:
case PIXELFORMAT_PVR1_RGBA4_UNORM:
case PIXELFORMAT_PVR1_RGBA4_sRGB:
if (families.apple[1])
flags |= commonsample;
break;

case PIXELFORMAT_ETC1_UNORM:
case PIXELFORMAT_ETC2_RGB_UNORM:
case PIXELFORMAT_ETC2_RGB_sRGB:
case PIXELFORMAT_ETC2_RGBA_UNORM:
case PIXELFORMAT_ETC2_RGBA_sRGB:
case PIXELFORMAT_ETC2_RGBA1_UNORM:
case PIXELFORMAT_ETC2_RGBA1_sRGB:
case PIXELFORMAT_EAC_R_UNORM:
case PIXELFORMAT_EAC_R_SNORM:
case PIXELFORMAT_EAC_RG_UNORM:
Expand All @@ -2091,20 +2099,34 @@ static inline void advanceVertexOffsets(const VertexAttributes &attributes, Buff
flags |= commonsample;
break;

case PIXELFORMAT_ASTC_4x4:
case PIXELFORMAT_ASTC_5x4:
case PIXELFORMAT_ASTC_5x5:
case PIXELFORMAT_ASTC_6x5:
case PIXELFORMAT_ASTC_6x6:
case PIXELFORMAT_ASTC_8x5:
case PIXELFORMAT_ASTC_8x6:
case PIXELFORMAT_ASTC_8x8:
case PIXELFORMAT_ASTC_10x5:
case PIXELFORMAT_ASTC_10x6:
case PIXELFORMAT_ASTC_10x8:
case PIXELFORMAT_ASTC_10x10:
case PIXELFORMAT_ASTC_12x10:
case PIXELFORMAT_ASTC_12x12:
case PIXELFORMAT_ASTC_4x4_UNORM:
case PIXELFORMAT_ASTC_5x4_UNORM:
case PIXELFORMAT_ASTC_5x5_UNORM:
case PIXELFORMAT_ASTC_6x5_UNORM:
case PIXELFORMAT_ASTC_6x6_UNORM:
case PIXELFORMAT_ASTC_8x5_UNORM:
case PIXELFORMAT_ASTC_8x6_UNORM:
case PIXELFORMAT_ASTC_8x8_UNORM:
case PIXELFORMAT_ASTC_10x5_UNORM:
case PIXELFORMAT_ASTC_10x6_UNORM:
case PIXELFORMAT_ASTC_10x8_UNORM:
case PIXELFORMAT_ASTC_10x10_UNORM:
case PIXELFORMAT_ASTC_12x10_UNORM:
case PIXELFORMAT_ASTC_12x12_UNORM:
case PIXELFORMAT_ASTC_4x4_sRGB:
case PIXELFORMAT_ASTC_5x4_sRGB:
case PIXELFORMAT_ASTC_5x5_sRGB:
case PIXELFORMAT_ASTC_6x5_sRGB:
case PIXELFORMAT_ASTC_6x6_sRGB:
case PIXELFORMAT_ASTC_8x5_sRGB:
case PIXELFORMAT_ASTC_8x6_sRGB:
case PIXELFORMAT_ASTC_8x8_sRGB:
case PIXELFORMAT_ASTC_10x5_sRGB:
case PIXELFORMAT_ASTC_10x6_sRGB:
case PIXELFORMAT_ASTC_10x8_sRGB:
case PIXELFORMAT_ASTC_10x10_sRGB:
case PIXELFORMAT_ASTC_12x10_sRGB:
case PIXELFORMAT_ASTC_12x12_sRGB:
if (families.apple[2])
flags |= commonsample;
break;
Expand Down
2 changes: 1 addition & 1 deletion src/modules/graphics/metal/Metal.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ class Metal
API_AVAILABLE(macos(10.15), ios(13.0)) MTLTextureSwizzleChannels swizzle;
};

static PixelFormatDesc convertPixelFormat(id<MTLDevice> device, PixelFormat format, bool &isSRGB);
static PixelFormatDesc convertPixelFormat(id<MTLDevice> device, PixelFormat format);

}; // Metal

Expand Down
Loading

0 comments on commit 343d192

Please sign in to comment.