Skip to content

Commit 3343cb2

Browse files
v1993slouken
authored andcommitted
gpu: rework alpha-to-coverage validation
1 parent ceb9fec commit 3343cb2

File tree

2 files changed

+97
-6
lines changed

2 files changed

+97
-6
lines changed

src/gpu/SDL_gpu.c

+14-6
Original file line numberDiff line numberDiff line change
@@ -827,12 +827,6 @@ SDL_GPUGraphicsPipeline *SDL_CreateGPUGraphicsPipeline(
827827
SDL_assert_release(!"Format is not supported for color targets on this device!");
828828
return NULL;
829829
}
830-
if (graphicsPipelineCreateInfo->multisample_state.enable_alpha_to_coverage &&
831-
(IsIntegerFormat(graphicsPipelineCreateInfo->target_info.color_target_descriptions[i].format)
832-
|| IsCompressedFormat(graphicsPipelineCreateInfo->target_info.color_target_descriptions[i].format))) {
833-
SDL_assert_release(!"Format is not compatible with alpha-to-coverage!");
834-
return NULL;
835-
}
836830
if (graphicsPipelineCreateInfo->target_info.color_target_descriptions[i].blend_state.enable_blend) {
837831
const SDL_GPUColorTargetBlendState *blend_state = &graphicsPipelineCreateInfo->target_info.color_target_descriptions[i].blend_state;
838832
CHECK_BLENDFACTOR_ENUM_INVALID(blend_state->src_color_blendfactor, NULL)
@@ -841,6 +835,8 @@ SDL_GPUGraphicsPipeline *SDL_CreateGPUGraphicsPipeline(
841835
CHECK_BLENDFACTOR_ENUM_INVALID(blend_state->src_alpha_blendfactor, NULL)
842836
CHECK_BLENDFACTOR_ENUM_INVALID(blend_state->dst_alpha_blendfactor, NULL)
843837
CHECK_BLENDOP_ENUM_INVALID(blend_state->alpha_blend_op, NULL)
838+
839+
// TODO: validate that format support blending?
844840
}
845841
}
846842
if (graphicsPipelineCreateInfo->target_info.has_depth_stencil_target) {
@@ -854,6 +850,18 @@ SDL_GPUGraphicsPipeline *SDL_CreateGPUGraphicsPipeline(
854850
return NULL;
855851
}
856852
}
853+
if (graphicsPipelineCreateInfo->multisample_state.enable_alpha_to_coverage) {
854+
if (graphicsPipelineCreateInfo->target_info.num_color_targets < 1) {
855+
SDL_assert_release(!"Alpha-to-coverage enabled but no color targets present!");
856+
return NULL;
857+
}
858+
if (!FormatHasAlpha(graphicsPipelineCreateInfo->target_info.color_target_descriptions[0].format)) {
859+
SDL_assert_release(!"Format is not compatible with alpha-to-coverage!");
860+
return NULL;
861+
}
862+
863+
// TODO: validate that format supports belnding? This is only required on Metal.
864+
}
857865
if (graphicsPipelineCreateInfo->vertex_input_state.num_vertex_buffers > 0 && graphicsPipelineCreateInfo->vertex_input_state.vertex_buffer_descriptions == NULL) {
858866
SDL_assert_release(!"Vertex buffer descriptions array pointer cannot be NULL!");
859867
return NULL;

src/gpu/SDL_sysgpu.h

+83
Original file line numberDiff line numberDiff line change
@@ -438,6 +438,89 @@ static inline bool IsCompressedFormat(
438438
}
439439
}
440440

441+
static inline bool FormatHasAlpha(
442+
SDL_GPUTextureFormat format)
443+
{
444+
switch (format) {
445+
case SDL_GPU_TEXTUREFORMAT_ASTC_12x10_UNORM:
446+
case SDL_GPU_TEXTUREFORMAT_ASTC_12x12_UNORM:
447+
case SDL_GPU_TEXTUREFORMAT_ASTC_12x10_UNORM_SRGB:
448+
case SDL_GPU_TEXTUREFORMAT_ASTC_12x12_UNORM_SRGB:
449+
case SDL_GPU_TEXTUREFORMAT_ASTC_12x10_FLOAT:
450+
case SDL_GPU_TEXTUREFORMAT_ASTC_12x12_FLOAT:
451+
case SDL_GPU_TEXTUREFORMAT_ASTC_10x5_UNORM:
452+
case SDL_GPU_TEXTUREFORMAT_ASTC_10x6_UNORM:
453+
case SDL_GPU_TEXTUREFORMAT_ASTC_10x8_UNORM:
454+
case SDL_GPU_TEXTUREFORMAT_ASTC_10x10_UNORM:
455+
case SDL_GPU_TEXTUREFORMAT_ASTC_10x5_UNORM_SRGB:
456+
case SDL_GPU_TEXTUREFORMAT_ASTC_10x6_UNORM_SRGB:
457+
case SDL_GPU_TEXTUREFORMAT_ASTC_10x8_UNORM_SRGB:
458+
case SDL_GPU_TEXTUREFORMAT_ASTC_10x10_UNORM_SRGB:
459+
case SDL_GPU_TEXTUREFORMAT_ASTC_10x5_FLOAT:
460+
case SDL_GPU_TEXTUREFORMAT_ASTC_10x6_FLOAT:
461+
case SDL_GPU_TEXTUREFORMAT_ASTC_10x8_FLOAT:
462+
case SDL_GPU_TEXTUREFORMAT_ASTC_10x10_FLOAT:
463+
case SDL_GPU_TEXTUREFORMAT_ASTC_8x5_UNORM:
464+
case SDL_GPU_TEXTUREFORMAT_ASTC_8x6_UNORM:
465+
case SDL_GPU_TEXTUREFORMAT_ASTC_8x8_UNORM:
466+
case SDL_GPU_TEXTUREFORMAT_ASTC_8x5_UNORM_SRGB:
467+
case SDL_GPU_TEXTUREFORMAT_ASTC_8x6_UNORM_SRGB:
468+
case SDL_GPU_TEXTUREFORMAT_ASTC_8x8_UNORM_SRGB:
469+
case SDL_GPU_TEXTUREFORMAT_ASTC_8x5_FLOAT:
470+
case SDL_GPU_TEXTUREFORMAT_ASTC_8x6_FLOAT:
471+
case SDL_GPU_TEXTUREFORMAT_ASTC_8x8_FLOAT:
472+
case SDL_GPU_TEXTUREFORMAT_ASTC_6x5_UNORM:
473+
case SDL_GPU_TEXTUREFORMAT_ASTC_6x6_UNORM:
474+
case SDL_GPU_TEXTUREFORMAT_ASTC_6x5_UNORM_SRGB:
475+
case SDL_GPU_TEXTUREFORMAT_ASTC_6x6_UNORM_SRGB:
476+
case SDL_GPU_TEXTUREFORMAT_ASTC_6x5_FLOAT:
477+
case SDL_GPU_TEXTUREFORMAT_ASTC_6x6_FLOAT:
478+
case SDL_GPU_TEXTUREFORMAT_ASTC_5x4_UNORM:
479+
case SDL_GPU_TEXTUREFORMAT_ASTC_5x5_UNORM:
480+
case SDL_GPU_TEXTUREFORMAT_ASTC_5x4_UNORM_SRGB:
481+
case SDL_GPU_TEXTUREFORMAT_ASTC_5x5_UNORM_SRGB:
482+
case SDL_GPU_TEXTUREFORMAT_ASTC_5x4_FLOAT:
483+
case SDL_GPU_TEXTUREFORMAT_ASTC_5x5_FLOAT:
484+
case SDL_GPU_TEXTUREFORMAT_ASTC_4x4_UNORM:
485+
case SDL_GPU_TEXTUREFORMAT_ASTC_4x4_UNORM_SRGB:
486+
case SDL_GPU_TEXTUREFORMAT_ASTC_4x4_FLOAT:
487+
// ASTC textures may or may not have alpha; return true as this is mainly intended for validation
488+
return true;
489+
490+
case SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM:
491+
case SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM:
492+
case SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM:
493+
case SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM:
494+
case SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM_SRGB:
495+
case SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM_SRGB:
496+
case SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM_SRGB:
497+
case SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM_SRGB:
498+
case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM:
499+
case SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM:
500+
case SDL_GPU_TEXTUREFORMAT_B5G5R5A1_UNORM:
501+
case SDL_GPU_TEXTUREFORMAT_B4G4R4A4_UNORM:
502+
case SDL_GPU_TEXTUREFORMAT_R10G10B10A2_UNORM:
503+
case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UNORM:
504+
case SDL_GPU_TEXTUREFORMAT_A8_UNORM:
505+
case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_SNORM:
506+
case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_SNORM:
507+
case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_FLOAT:
508+
case SDL_GPU_TEXTUREFORMAT_R32G32B32A32_FLOAT:
509+
case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UINT:
510+
case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UINT:
511+
case SDL_GPU_TEXTUREFORMAT_R32G32B32A32_UINT:
512+
case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_INT:
513+
case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_INT:
514+
case SDL_GPU_TEXTUREFORMAT_R32G32B32A32_INT:
515+
case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM_SRGB:
516+
case SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM_SRGB:
517+
return true;
518+
519+
default:
520+
return false;
521+
}
522+
}
523+
441524
static inline Uint32 IndexSize(SDL_GPUIndexElementSize size)
442525
{
443526
return (size == SDL_GPU_INDEXELEMENTSIZE_16BIT) ? 2 : 4;

0 commit comments

Comments
 (0)