From 44710a248c2507b2b4fe877620241be3f3b9f6e1 Mon Sep 17 00:00:00 2001
From: Caleb Cornett <[EMAIL REDACTED]>
Date: Thu, 3 Apr 2025 17:47:37 -0400
Subject: [PATCH] gpu: alpha-to-coverage support
---
include/SDL3/SDL_gpu.h | 2 +-
src/gpu/SDL_gpu.c | 6 +++
src/gpu/SDL_sysgpu.h | 65 +++++++++++++++++++++++++++++++++
src/gpu/d3d12/SDL_gpu_d3d12.c | 2 +-
src/gpu/metal/SDL_gpu_metal.m | 1 +
src/gpu/vulkan/SDL_gpu_vulkan.c | 2 +-
6 files changed, 75 insertions(+), 3 deletions(-)
diff --git a/include/SDL3/SDL_gpu.h b/include/SDL3/SDL_gpu.h
index 7e37ab05614e5..6a2e667fe3e51 100644
--- a/include/SDL3/SDL_gpu.h
+++ b/include/SDL3/SDL_gpu.h
@@ -1767,7 +1767,7 @@ typedef struct SDL_GPUMultisampleState
SDL_GPUSampleCount sample_count; /**< The number of samples to be used in rasterization. */
Uint32 sample_mask; /**< Reserved for future use. Must be set to 0. */
bool enable_mask; /**< Reserved for future use. Must be set to false. */
- Uint8 padding1;
+ bool enable_alpha_to_coverage; /**< true enables the alpha-to-coverage feature. */
Uint8 padding2;
Uint8 padding3;
} SDL_GPUMultisampleState;
diff --git a/src/gpu/SDL_gpu.c b/src/gpu/SDL_gpu.c
index a679061aee18b..44979a59de705 100644
--- a/src/gpu/SDL_gpu.c
+++ b/src/gpu/SDL_gpu.c
@@ -827,6 +827,12 @@ SDL_GPUGraphicsPipeline *SDL_CreateGPUGraphicsPipeline(
SDL_assert_release(!"Format is not supported for color targets on this device!");
return NULL;
}
+ if (graphicsPipelineCreateInfo->multisample_state.enable_alpha_to_coverage &&
+ (IsIntegerFormat(graphicsPipelineCreateInfo->target_info.color_target_descriptions[i].format)
+ || IsCompressedFormat(graphicsPipelineCreateInfo->target_info.color_target_descriptions[i].format))) {
+ SDL_assert_release(!"Format is not compatible with alpha-to-coverage!");
+ return NULL;
+ }
if (graphicsPipelineCreateInfo->target_info.color_target_descriptions[i].blend_state.enable_blend) {
const SDL_GPUColorTargetBlendState *blend_state = &graphicsPipelineCreateInfo->target_info.color_target_descriptions[i].blend_state;
CHECK_BLENDFACTOR_ENUM_INVALID(blend_state->src_color_blendfactor, NULL)
diff --git a/src/gpu/SDL_sysgpu.h b/src/gpu/SDL_sysgpu.h
index 9decfcd8ecc64..9a51daebfad43 100644
--- a/src/gpu/SDL_sysgpu.h
+++ b/src/gpu/SDL_sysgpu.h
@@ -373,6 +373,71 @@ static inline bool IsIntegerFormat(
}
}
+static inline bool IsCompressedFormat(
+ SDL_GPUTextureFormat format)
+{
+ switch (format) {
+ case SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM:
+ case SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM_SRGB:
+ case SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM:
+ case SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM_SRGB:
+ case SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM:
+ case SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM_SRGB:
+ case SDL_GPU_TEXTUREFORMAT_BC4_R_UNORM:
+ case SDL_GPU_TEXTUREFORMAT_BC5_RG_UNORM:
+ case SDL_GPU_TEXTUREFORMAT_BC6H_RGB_FLOAT:
+ case SDL_GPU_TEXTUREFORMAT_BC6H_RGB_UFLOAT:
+ case SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM:
+ case SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM_SRGB:
+ case SDL_GPU_TEXTUREFORMAT_ASTC_4x4_UNORM:
+ case SDL_GPU_TEXTUREFORMAT_ASTC_5x4_UNORM:
+ case SDL_GPU_TEXTUREFORMAT_ASTC_5x5_UNORM:
+ case SDL_GPU_TEXTUREFORMAT_ASTC_6x5_UNORM:
+ case SDL_GPU_TEXTUREFORMAT_ASTC_6x6_UNORM:
+ case SDL_GPU_TEXTUREFORMAT_ASTC_8x5_UNORM:
+ case SDL_GPU_TEXTUREFORMAT_ASTC_8x6_UNORM:
+ case SDL_GPU_TEXTUREFORMAT_ASTC_8x8_UNORM:
+ case SDL_GPU_TEXTUREFORMAT_ASTC_10x5_UNORM:
+ case SDL_GPU_TEXTUREFORMAT_ASTC_10x6_UNORM:
+ case SDL_GPU_TEXTUREFORMAT_ASTC_10x8_UNORM:
+ case SDL_GPU_TEXTUREFORMAT_ASTC_10x10_UNORM:
+ case SDL_GPU_TEXTUREFORMAT_ASTC_12x10_UNORM:
+ case SDL_GPU_TEXTUREFORMAT_ASTC_12x12_UNORM:
+ case SDL_GPU_TEXTUREFORMAT_ASTC_4x4_UNORM_SRGB:
+ case SDL_GPU_TEXTUREFORMAT_ASTC_5x4_UNORM_SRGB:
+ case SDL_GPU_TEXTUREFORMAT_ASTC_5x5_UNORM_SRGB:
+ case SDL_GPU_TEXTUREFORMAT_ASTC_6x5_UNORM_SRGB:
+ case SDL_GPU_TEXTUREFORMAT_ASTC_6x6_UNORM_SRGB:
+ case SDL_GPU_TEXTUREFORMAT_ASTC_8x5_UNORM_SRGB:
+ case SDL_GPU_TEXTUREFORMAT_ASTC_8x6_UNORM_SRGB:
+ case SDL_GPU_TEXTUREFORMAT_ASTC_8x8_UNORM_SRGB:
+ case SDL_GPU_TEXTUREFORMAT_ASTC_10x5_UNORM_SRGB:
+ case SDL_GPU_TEXTUREFORMAT_ASTC_10x6_UNORM_SRGB:
+ case SDL_GPU_TEXTUREFORMAT_ASTC_10x8_UNORM_SRGB:
+ case SDL_GPU_TEXTUREFORMAT_ASTC_10x10_UNORM_SRGB:
+ case SDL_GPU_TEXTUREFORMAT_ASTC_12x10_UNORM_SRGB:
+ case SDL_GPU_TEXTUREFORMAT_ASTC_12x12_UNORM_SRGB:
+ case SDL_GPU_TEXTUREFORMAT_ASTC_4x4_FLOAT:
+ case SDL_GPU_TEXTUREFORMAT_ASTC_5x4_FLOAT:
+ case SDL_GPU_TEXTUREFORMAT_ASTC_5x5_FLOAT:
+ case SDL_GPU_TEXTUREFORMAT_ASTC_6x5_FLOAT:
+ case SDL_GPU_TEXTUREFORMAT_ASTC_6x6_FLOAT:
+ case SDL_GPU_TEXTUREFORMAT_ASTC_8x5_FLOAT:
+ case SDL_GPU_TEXTUREFORMAT_ASTC_8x6_FLOAT:
+ case SDL_GPU_TEXTUREFORMAT_ASTC_8x8_FLOAT:
+ case SDL_GPU_TEXTUREFORMAT_ASTC_10x5_FLOAT:
+ case SDL_GPU_TEXTUREFORMAT_ASTC_10x6_FLOAT:
+ case SDL_GPU_TEXTUREFORMAT_ASTC_10x8_FLOAT:
+ case SDL_GPU_TEXTUREFORMAT_ASTC_10x10_FLOAT:
+ case SDL_GPU_TEXTUREFORMAT_ASTC_12x10_FLOAT:
+ case SDL_GPU_TEXTUREFORMAT_ASTC_12x12_FLOAT:
+ return true;
+
+ default:
+ return false;
+ }
+}
+
static inline Uint32 IndexSize(SDL_GPUIndexElementSize size)
{
return (size == SDL_GPU_INDEXELEMENTSIZE_16BIT) ? 2 : 4;
diff --git a/src/gpu/d3d12/SDL_gpu_d3d12.c b/src/gpu/d3d12/SDL_gpu_d3d12.c
index ba28b5472e99b..1843acd0e70c6 100644
--- a/src/gpu/d3d12/SDL_gpu_d3d12.c
+++ b/src/gpu/d3d12/SDL_gpu_d3d12.c
@@ -2819,7 +2819,7 @@ static bool D3D12_INTERNAL_ConvertBlendState(
}
SDL_zerop(blendDesc);
- blendDesc->AlphaToCoverageEnable = FALSE;
+ blendDesc->AlphaToCoverageEnable = pipelineInfo->multisample_state.enable_alpha_to_coverage;
blendDesc->IndependentBlendEnable = FALSE;
for (UINT i = 0; i < MAX_COLOR_TARGET_BINDINGS; i += 1) {
diff --git a/src/gpu/metal/SDL_gpu_metal.m b/src/gpu/metal/SDL_gpu_metal.m
index 75738dcbcf17d..d83079f5f581c 100644
--- a/src/gpu/metal/SDL_gpu_metal.m
+++ b/src/gpu/metal/SDL_gpu_metal.m
@@ -1135,6 +1135,7 @@ static void METAL_ReleaseGraphicsPipeline(
// Multisample
pipelineDescriptor.rasterSampleCount = SDLToMetal_SampleCount[createinfo->multisample_state.sample_count];
+ pipelineDescriptor.alphaToCoverageEnabled = createinfo->multisample_state.enable_alpha_to_coverage;
// Depth Stencil
diff --git a/src/gpu/vulkan/SDL_gpu_vulkan.c b/src/gpu/vulkan/SDL_gpu_vulkan.c
index 6c94b154950be..c740e9bae5c40 100644
--- a/src/gpu/vulkan/SDL_gpu_vulkan.c
+++ b/src/gpu/vulkan/SDL_gpu_vulkan.c
@@ -6355,7 +6355,7 @@ static SDL_GPUGraphicsPipeline *VULKAN_CreateGraphicsPipeline(
multisampleStateCreateInfo.sampleShadingEnable = VK_FALSE;
multisampleStateCreateInfo.minSampleShading = 1.0f;
multisampleStateCreateInfo.pSampleMask = &sampleMask;
- multisampleStateCreateInfo.alphaToCoverageEnable = VK_FALSE;
+ multisampleStateCreateInfo.alphaToCoverageEnable = createinfo->multisample_state.enable_alpha_to_coverage;
multisampleStateCreateInfo.alphaToOneEnable = VK_FALSE;
// Depth Stencil State