浏览代码

gpu: rework alpha-to-coverage validation

Eri the Switch 5 月之前
父节点
当前提交
3343cb2147
共有 2 个文件被更改,包括 97 次插入6 次删除
  1. 14 6
      src/gpu/SDL_gpu.c
  2. 83 0
      src/gpu/SDL_sysgpu.h

+ 14 - 6
src/gpu/SDL_gpu.c

@@ -827,12 +827,6 @@ SDL_GPUGraphicsPipeline *SDL_CreateGPUGraphicsPipeline(
                 SDL_assert_release(!"Format is not supported for color targets on this device!");
                 SDL_assert_release(!"Format is not supported for color targets on this device!");
                 return NULL;
                 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) {
             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;
                 const SDL_GPUColorTargetBlendState *blend_state = &graphicsPipelineCreateInfo->target_info.color_target_descriptions[i].blend_state;
                 CHECK_BLENDFACTOR_ENUM_INVALID(blend_state->src_color_blendfactor, NULL)
                 CHECK_BLENDFACTOR_ENUM_INVALID(blend_state->src_color_blendfactor, NULL)
@@ -841,6 +835,8 @@ SDL_GPUGraphicsPipeline *SDL_CreateGPUGraphicsPipeline(
                 CHECK_BLENDFACTOR_ENUM_INVALID(blend_state->src_alpha_blendfactor, NULL)
                 CHECK_BLENDFACTOR_ENUM_INVALID(blend_state->src_alpha_blendfactor, NULL)
                 CHECK_BLENDFACTOR_ENUM_INVALID(blend_state->dst_alpha_blendfactor, NULL)
                 CHECK_BLENDFACTOR_ENUM_INVALID(blend_state->dst_alpha_blendfactor, NULL)
                 CHECK_BLENDOP_ENUM_INVALID(blend_state->alpha_blend_op, NULL)
                 CHECK_BLENDOP_ENUM_INVALID(blend_state->alpha_blend_op, NULL)
+
+                // TODO: validate that format support blending?
             }
             }
         }
         }
         if (graphicsPipelineCreateInfo->target_info.has_depth_stencil_target) {
         if (graphicsPipelineCreateInfo->target_info.has_depth_stencil_target) {
@@ -854,6 +850,18 @@ SDL_GPUGraphicsPipeline *SDL_CreateGPUGraphicsPipeline(
                 return NULL;
                 return NULL;
             }
             }
         }
         }
+        if (graphicsPipelineCreateInfo->multisample_state.enable_alpha_to_coverage) {
+            if (graphicsPipelineCreateInfo->target_info.num_color_targets < 1) {
+                SDL_assert_release(!"Alpha-to-coverage enabled but no color targets present!");
+                return NULL;
+            }
+            if (!FormatHasAlpha(graphicsPipelineCreateInfo->target_info.color_target_descriptions[0].format)) {
+                SDL_assert_release(!"Format is not compatible with alpha-to-coverage!");
+                return NULL;
+            }
+
+            // TODO: validate that format supports belnding? This is only required on Metal.
+        }
         if (graphicsPipelineCreateInfo->vertex_input_state.num_vertex_buffers > 0 && graphicsPipelineCreateInfo->vertex_input_state.vertex_buffer_descriptions == NULL) {
         if (graphicsPipelineCreateInfo->vertex_input_state.num_vertex_buffers > 0 && graphicsPipelineCreateInfo->vertex_input_state.vertex_buffer_descriptions == NULL) {
             SDL_assert_release(!"Vertex buffer descriptions array pointer cannot be NULL!");
             SDL_assert_release(!"Vertex buffer descriptions array pointer cannot be NULL!");
             return NULL;
             return NULL;

+ 83 - 0
src/gpu/SDL_sysgpu.h

@@ -438,6 +438,89 @@ static inline bool IsCompressedFormat(
     }
     }
 }
 }
 
 
+static inline bool FormatHasAlpha(
+    SDL_GPUTextureFormat format)
+{
+    switch (format) {
+        case SDL_GPU_TEXTUREFORMAT_ASTC_12x10_UNORM:
+        case SDL_GPU_TEXTUREFORMAT_ASTC_12x12_UNORM:
+        case SDL_GPU_TEXTUREFORMAT_ASTC_12x10_UNORM_SRGB:
+        case SDL_GPU_TEXTUREFORMAT_ASTC_12x12_UNORM_SRGB:
+        case SDL_GPU_TEXTUREFORMAT_ASTC_12x10_FLOAT:
+        case SDL_GPU_TEXTUREFORMAT_ASTC_12x12_FLOAT:
+        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_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_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_8x5_UNORM:
+        case SDL_GPU_TEXTUREFORMAT_ASTC_8x6_UNORM:
+        case SDL_GPU_TEXTUREFORMAT_ASTC_8x8_UNORM:
+        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_8x5_FLOAT:
+        case SDL_GPU_TEXTUREFORMAT_ASTC_8x6_FLOAT:
+        case SDL_GPU_TEXTUREFORMAT_ASTC_8x8_FLOAT:
+        case SDL_GPU_TEXTUREFORMAT_ASTC_6x5_UNORM:
+        case SDL_GPU_TEXTUREFORMAT_ASTC_6x6_UNORM:
+        case SDL_GPU_TEXTUREFORMAT_ASTC_6x5_UNORM_SRGB:
+        case SDL_GPU_TEXTUREFORMAT_ASTC_6x6_UNORM_SRGB:
+        case SDL_GPU_TEXTUREFORMAT_ASTC_6x5_FLOAT:
+        case SDL_GPU_TEXTUREFORMAT_ASTC_6x6_FLOAT:
+        case SDL_GPU_TEXTUREFORMAT_ASTC_5x4_UNORM:
+        case SDL_GPU_TEXTUREFORMAT_ASTC_5x5_UNORM:
+        case SDL_GPU_TEXTUREFORMAT_ASTC_5x4_UNORM_SRGB:
+        case SDL_GPU_TEXTUREFORMAT_ASTC_5x5_UNORM_SRGB:
+        case SDL_GPU_TEXTUREFORMAT_ASTC_5x4_FLOAT:
+        case SDL_GPU_TEXTUREFORMAT_ASTC_5x5_FLOAT:
+        case SDL_GPU_TEXTUREFORMAT_ASTC_4x4_UNORM:
+        case SDL_GPU_TEXTUREFORMAT_ASTC_4x4_UNORM_SRGB:
+        case SDL_GPU_TEXTUREFORMAT_ASTC_4x4_FLOAT:
+            // ASTC textures may or may not have alpha; return true as this is mainly intended for validation
+            return true;
+
+        case SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM:
+        case SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM:
+        case SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM:
+        case SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM:
+        case SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM_SRGB:
+        case SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM_SRGB:
+        case SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM_SRGB:
+        case SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM_SRGB:
+        case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM:
+        case SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM:
+        case SDL_GPU_TEXTUREFORMAT_B5G5R5A1_UNORM:
+        case SDL_GPU_TEXTUREFORMAT_B4G4R4A4_UNORM:
+        case SDL_GPU_TEXTUREFORMAT_R10G10B10A2_UNORM:
+        case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UNORM:
+        case SDL_GPU_TEXTUREFORMAT_A8_UNORM:
+        case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_SNORM:
+        case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_SNORM:
+        case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_FLOAT:
+        case SDL_GPU_TEXTUREFORMAT_R32G32B32A32_FLOAT:
+        case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UINT:
+        case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UINT:
+        case SDL_GPU_TEXTUREFORMAT_R32G32B32A32_UINT:
+        case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_INT:
+        case SDL_GPU_TEXTUREFORMAT_R16G16B16A16_INT:
+        case SDL_GPU_TEXTUREFORMAT_R32G32B32A32_INT:
+        case SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM_SRGB:
+        case SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM_SRGB:
+            return true;
+
+        default:
+            return false;
+    }
+}
+
 static inline Uint32 IndexSize(SDL_GPUIndexElementSize size)
 static inline Uint32 IndexSize(SDL_GPUIndexElementSize size)
 {
 {
     return (size == SDL_GPU_INDEXELEMENTSIZE_16BIT) ? 2 : 4;
     return (size == SDL_GPU_INDEXELEMENTSIZE_16BIT) ? 2 : 4;