diff --git a/source/blender/draw/intern/draw_curves.cc b/source/blender/draw/intern/draw_curves.cc index f44cd9ca0f4..ae3a908e483 100644 --- a/source/blender/draw/intern/draw_curves.cc +++ b/source/blender/draw/intern/draw_curves.cc @@ -33,7 +33,12 @@ BLI_INLINE eParticleRefineShaderType drw_curves_shader_type_get() { - if (GPU_compute_shader_support() && GPU_shader_storage_buffer_objects_support()) { + /* NOTE: Curve refine is faster using transform feedback via vertex processing pipeline with + * Metal and Apple Silicon GPUs. This is also because vertex work can more easily be executed in + * parallel with fragment work, whereas compute inserts an explicit dependency, + * due to switching of command encoder types. */ + if (GPU_compute_shader_support() && GPU_shader_storage_buffer_objects_support() && + (GPU_backend_get_type() != GPU_BACKEND_METAL)) { return PART_REFINE_SHADER_COMPUTE; } if (GPU_transform_feedback_support()) { diff --git a/source/blender/draw/intern/draw_hair.cc b/source/blender/draw/intern/draw_hair.cc index a66a164f0fb..03a222a7157 100644 --- a/source/blender/draw/intern/draw_hair.cc +++ b/source/blender/draw/intern/draw_hair.cc @@ -36,7 +36,12 @@ BLI_INLINE eParticleRefineShaderType drw_hair_shader_type_get() { - if (GPU_compute_shader_support() && GPU_shader_storage_buffer_objects_support()) { + /* NOTE: Hair refine is faster using transform feedback via vertex processing pipeline with Metal + * and Apple Silicon GPUs. This is also because vertex work can more easily be executed in + * parallel with fragment work, whereas compute inserts an explicit dependency, + * due to switching of command encoder types. */ + if (GPU_compute_shader_support() && GPU_shader_storage_buffer_objects_support() && + (GPU_backend_get_type() != GPU_BACKEND_METAL)) { return PART_REFINE_SHADER_COMPUTE; } if (GPU_transform_feedback_support()) {