190 bool transform_feedback_active_ =
false;
192 VertBuf *transform_feedback_vertbuf_ =
nullptr;
196 NSString *vertex_function_name_ =
@"";
197 NSString *fragment_function_name_ =
@"";
198 NSString *compute_function_name_ =
@"";
201 id<MTLLibrary> shader_library_vert_ = nil;
202 id<MTLLibrary> shader_library_frag_ = nil;
203 id<MTLLibrary> shader_library_compute_ = nil;
208 MTLRenderPipelineDescriptor *pso_descriptor_ = nil;
214 std::mutex pso_cache_lock_;
222 bool uses_gpu_layer =
false;
225 bool uses_gpu_viewport_index =
false;
235 bool use_ssbo_vertex_fetch_mode_ =
false;
237 MTLPrimitiveType ssbo_vertex_fetch_output_prim_type_;
242 uint32_t ssbo_vertex_fetch_output_num_verts_ = 0;
244 bool ssbo_vertex_attribute_bind_active_ =
false;
245 int ssbo_vertex_attribute_bind_mask_ = 0;
248 struct ShaderSSBOAttributeBinding {
249 int attribute_index = -1;
252 int uniform_fetchmode;
254 int uniform_attr_type;
265 void *push_constant_data_ =
nullptr;
266 bool push_constant_modified_ =
false;
269 uint maxTotalThreadsPerThreadgroup_Tuning_ = 0;
272 bool async_compilation_ =
false;
274 bool finalize_shader(
const shader::ShaderCreateInfo *info =
nullptr);
277 MTLShader(MTLContext *ctx,
const char *name);
281 NSString *input_vertex_source,
282 NSString *input_fragment_source,
283 NSString *vertex_function_name_,
284 NSString *fragment_function_name_);
287 void init(
const shader::ShaderCreateInfo & ,
bool is_batch_compilation)
override;
296 bool finalize(
const shader::ShaderCreateInfo *info =
nullptr)
override;
307 return (shader_library_compute_ != nil);
315 return current_pipeline_state_;
323 return push_constant_data_;
341 void bind()
override;
344 void uniform_float(
int location,
int comp_len,
int array_size,
const float *data)
override;
345 void uniform_int(
int location,
int comp_len,
int array_size,
const int *data)
override;
352 return use_ssbo_vertex_fetch_mode_;
356 return ssbo_vertex_fetch_output_num_verts_;
367 return ssbo_vertex_fetch_output_prim_type_;
386 MTLPrimitiveTopologyClass prim_type);
389 MTLPrimitiveTopologyClass prim_type,
397 return compute_pso_common_state_;
408 MEM_CXX_CLASS_ALLOC_FUNCS(
"MTLShader");
518 MTLVertexFormat *r_convertedFormat)
520 MTLVertexFormat out_vert_format = MTLVertexFormatInvalid;
521 switch (mtl_format) {
523 case MTLVertexFormatChar:
524 case MTLVertexFormatChar2:
525 case MTLVertexFormatChar3:
526 case MTLVertexFormatChar4:
527 switch (components) {
529 out_vert_format = MTLVertexFormatChar;
532 out_vert_format = MTLVertexFormatChar2;
535 out_vert_format = MTLVertexFormatChar3;
538 out_vert_format = MTLVertexFormatChar4;
544 case MTLVertexFormatCharNormalized:
545 case MTLVertexFormatChar2Normalized:
546 case MTLVertexFormatChar3Normalized:
547 case MTLVertexFormatChar4Normalized:
548 switch (components) {
550 out_vert_format = MTLVertexFormatCharNormalized;
553 out_vert_format = MTLVertexFormatChar2Normalized;
556 out_vert_format = MTLVertexFormatChar3Normalized;
559 out_vert_format = MTLVertexFormatChar4Normalized;
565 case MTLVertexFormatUChar:
566 case MTLVertexFormatUChar2:
567 case MTLVertexFormatUChar3:
568 case MTLVertexFormatUChar4:
569 switch (components) {
571 out_vert_format = MTLVertexFormatUChar;
574 out_vert_format = MTLVertexFormatUChar2;
577 out_vert_format = MTLVertexFormatUChar3;
580 out_vert_format = MTLVertexFormatUChar4;
586 case MTLVertexFormatUCharNormalized:
587 case MTLVertexFormatUChar2Normalized:
588 case MTLVertexFormatUChar3Normalized:
589 case MTLVertexFormatUChar4Normalized:
590 switch (components) {
592 out_vert_format = MTLVertexFormatUCharNormalized;
595 out_vert_format = MTLVertexFormatUChar2Normalized;
598 out_vert_format = MTLVertexFormatUChar3Normalized;
601 out_vert_format = MTLVertexFormatUChar4Normalized;
607 case MTLVertexFormatShort:
608 case MTLVertexFormatShort2:
609 case MTLVertexFormatShort3:
610 case MTLVertexFormatShort4:
611 switch (components) {
613 out_vert_format = MTLVertexFormatShort;
616 out_vert_format = MTLVertexFormatShort2;
619 out_vert_format = MTLVertexFormatShort3;
622 out_vert_format = MTLVertexFormatShort4;
628 case MTLVertexFormatShortNormalized:
629 case MTLVertexFormatShort2Normalized:
630 case MTLVertexFormatShort3Normalized:
631 case MTLVertexFormatShort4Normalized:
632 switch (components) {
634 out_vert_format = MTLVertexFormatShortNormalized;
637 out_vert_format = MTLVertexFormatShort2Normalized;
640 out_vert_format = MTLVertexFormatShort3Normalized;
643 out_vert_format = MTLVertexFormatShort4Normalized;
649 case MTLVertexFormatUShort:
650 case MTLVertexFormatUShort2:
651 case MTLVertexFormatUShort3:
652 case MTLVertexFormatUShort4:
653 switch (components) {
655 out_vert_format = MTLVertexFormatUShort;
658 out_vert_format = MTLVertexFormatUShort2;
661 out_vert_format = MTLVertexFormatUShort3;
664 out_vert_format = MTLVertexFormatUShort4;
670 case MTLVertexFormatUShortNormalized:
671 case MTLVertexFormatUShort2Normalized:
672 case MTLVertexFormatUShort3Normalized:
673 case MTLVertexFormatUShort4Normalized:
674 switch (components) {
676 out_vert_format = MTLVertexFormatUShortNormalized;
679 out_vert_format = MTLVertexFormatUShort2Normalized;
682 out_vert_format = MTLVertexFormatUShort3Normalized;
685 out_vert_format = MTLVertexFormatUShort4Normalized;
691 case MTLVertexFormatInt:
692 case MTLVertexFormatInt2:
693 case MTLVertexFormatInt3:
694 case MTLVertexFormatInt4:
695 switch (components) {
697 out_vert_format = MTLVertexFormatInt;
700 out_vert_format = MTLVertexFormatInt2;
703 out_vert_format = MTLVertexFormatInt3;
706 out_vert_format = MTLVertexFormatInt4;
712 case MTLVertexFormatUInt:
713 case MTLVertexFormatUInt2:
714 case MTLVertexFormatUInt3:
715 case MTLVertexFormatUInt4:
716 switch (components) {
718 out_vert_format = MTLVertexFormatUInt;
721 out_vert_format = MTLVertexFormatUInt2;
724 out_vert_format = MTLVertexFormatUInt3;
727 out_vert_format = MTLVertexFormatUInt4;
733 case MTLVertexFormatHalf:
734 case MTLVertexFormatHalf2:
735 case MTLVertexFormatHalf3:
736 case MTLVertexFormatHalf4:
737 switch (components) {
739 out_vert_format = MTLVertexFormatHalf;
742 out_vert_format = MTLVertexFormatHalf2;
745 out_vert_format = MTLVertexFormatHalf3;
748 out_vert_format = MTLVertexFormatHalf4;
754 case MTLVertexFormatFloat:
755 case MTLVertexFormatFloat2:
756 case MTLVertexFormatFloat3:
757 case MTLVertexFormatFloat4:
758 switch (components) {
760 out_vert_format = MTLVertexFormatFloat;
763 out_vert_format = MTLVertexFormatFloat2;
766 out_vert_format = MTLVertexFormatFloat3;
769 out_vert_format = MTLVertexFormatFloat4;
776 out_vert_format = mtl_format;
779 *r_convertedFormat = out_vert_format;
780 return out_vert_format != MTLVertexFormatInvalid;
801 MTLVertexFormat *r_convertedFormat)
804 MTLVertexFormat out_vert_format = MTLVertexFormatInvalid;
806 switch (component_type) {
809 switch (fetch_mode) {
811 if (shader_attrib_format == MTLVertexFormatChar ||
812 shader_attrib_format == MTLVertexFormatChar2 ||
813 shader_attrib_format == MTLVertexFormatChar3 ||
814 shader_attrib_format == MTLVertexFormatChar4)
819 shader_attrib_format, component_type, &out_vert_format);
825 else if (shader_attrib_format == MTLVertexFormatInt4 && component_length == 4) {
829 out_vert_format = MTLVertexFormatChar4;
831 else if (shader_attrib_format == MTLVertexFormatInt3 && component_length == 3) {
833 out_vert_format = MTLVertexFormatChar3;
835 else if (shader_attrib_format == MTLVertexFormatInt2 && component_length == 2) {
837 out_vert_format = MTLVertexFormatChar2;
839 else if (shader_attrib_format == MTLVertexFormatInt && component_length == 1) {
841 out_vert_format = MTLVertexFormatChar;
843 else if (shader_attrib_format == MTLVertexFormatInt && component_length == 4) {
846 out_vert_format = MTLVertexFormatInt;
850 "Source vertex data format is either Char, Char2, Char3, Char4 but "
851 "format in shader interface is NOT compatible.\n");
852 out_vert_format = MTLVertexFormatInvalid;
862 switch (component_length) {
864 out_vert_format = MTLVertexFormatCharNormalized;
867 out_vert_format = MTLVertexFormatChar2Normalized;
870 out_vert_format = MTLVertexFormatChar3Normalized;
873 out_vert_format = MTLVertexFormatChar4Normalized;
877 out_vert_format = MTLVertexFormatInvalid;
882 out_vert_format = MTLVertexFormatInvalid;
889 switch (fetch_mode) {
892 if (shader_attrib_format == MTLVertexFormatUChar ||
893 shader_attrib_format == MTLVertexFormatUChar2 ||
894 shader_attrib_format == MTLVertexFormatUChar3 ||
895 shader_attrib_format == MTLVertexFormatUChar4)
900 shader_attrib_format, component_length, &out_vert_format);
908 else if (shader_attrib_format == MTLVertexFormatUInt4 && component_length == 4) {
911 out_vert_format = MTLVertexFormatUChar4;
913 else if (shader_attrib_format == MTLVertexFormatUInt3 && component_length == 3) {
915 out_vert_format = MTLVertexFormatUChar3;
917 else if (shader_attrib_format == MTLVertexFormatUInt2 && component_length == 2) {
919 out_vert_format = MTLVertexFormatUChar2;
921 else if (shader_attrib_format == MTLVertexFormatUInt && component_length == 1) {
923 out_vert_format = MTLVertexFormatUChar;
925 else if (shader_attrib_format == MTLVertexFormatInt && component_length == 4) {
928 out_vert_format = MTLVertexFormatInt;
930 else if (shader_attrib_format == MTLVertexFormatUInt && component_length == 4) {
933 out_vert_format = MTLVertexFormatUInt;
937 "Source vertex data format is either UChar, UChar2, UChar3, UChar4 but "
938 "format in shader interface is NOT compatible.\n");
939 out_vert_format = MTLVertexFormatInvalid;
949 switch (component_length) {
951 out_vert_format = MTLVertexFormatUCharNormalized;
954 out_vert_format = MTLVertexFormatUChar2Normalized;
957 out_vert_format = MTLVertexFormatUChar3Normalized;
960 out_vert_format = MTLVertexFormatUChar4Normalized;
964 out_vert_format = MTLVertexFormatInvalid;
969 out_vert_format = MTLVertexFormatInvalid;
976 switch (fetch_mode) {
978 if (shader_attrib_format == MTLVertexFormatShort ||
979 shader_attrib_format == MTLVertexFormatShort2 ||
980 shader_attrib_format == MTLVertexFormatShort3 ||
981 shader_attrib_format == MTLVertexFormatShort4)
985 shader_attrib_format, component_length, &out_vert_format);
993 "Source vertex data format is either Short, Short2, Short3, Short4 but "
994 "format in shader interface is NOT compatible.\n");
995 out_vert_format = MTLVertexFormatInvalid;
1005 switch (component_length) {
1007 out_vert_format = MTLVertexFormatShortNormalized;
1010 out_vert_format = MTLVertexFormatShort2Normalized;
1013 out_vert_format = MTLVertexFormatShort3Normalized;
1016 out_vert_format = MTLVertexFormatShort4Normalized;
1020 out_vert_format = MTLVertexFormatInvalid;
1025 out_vert_format = MTLVertexFormatInvalid;
1032 switch (fetch_mode) {
1034 if (shader_attrib_format == MTLVertexFormatUShort ||
1035 shader_attrib_format == MTLVertexFormatUShort2 ||
1036 shader_attrib_format == MTLVertexFormatUShort3 ||
1037 shader_attrib_format == MTLVertexFormatUShort4)
1041 shader_attrib_format, component_length, &out_vert_format);
1049 "Source vertex data format is either UShort, UShort2, UShort3, UShort4 "
1050 "but format in shader interface is NOT compatible.\n");
1051 out_vert_format = MTLVertexFormatInvalid;
1061 switch (component_length) {
1063 out_vert_format = MTLVertexFormatUShortNormalized;
1066 out_vert_format = MTLVertexFormatUShort2Normalized;
1069 out_vert_format = MTLVertexFormatUShort3Normalized;
1072 out_vert_format = MTLVertexFormatUShort4Normalized;
1076 out_vert_format = MTLVertexFormatInvalid;
1081 out_vert_format = MTLVertexFormatInvalid;
1088 switch (fetch_mode) {
1090 if (shader_attrib_format == MTLVertexFormatInt ||
1091 shader_attrib_format == MTLVertexFormatInt2 ||
1092 shader_attrib_format == MTLVertexFormatInt3 ||
1093 shader_attrib_format == MTLVertexFormatInt4)
1097 shader_attrib_format, component_length, &out_vert_format);
1105 "Source vertex data format is either Int, Int2, Int3, Int4 but format "
1106 "in shader interface is NOT compatible.\n");
1107 out_vert_format = MTLVertexFormatInvalid;
1114 out_vert_format = MTLVertexFormatInvalid;
1120 switch (fetch_mode) {
1122 if (shader_attrib_format == MTLVertexFormatUInt ||
1123 shader_attrib_format == MTLVertexFormatUInt2 ||
1124 shader_attrib_format == MTLVertexFormatUInt3 ||
1125 shader_attrib_format == MTLVertexFormatUInt4)
1129 shader_attrib_format, component_length, &out_vert_format);
1137 "Source vertex data format is either UInt, UInt2, UInt3, UInt4 but "
1138 "format in shader interface is NOT compatible.\n");
1139 out_vert_format = MTLVertexFormatInvalid;
1146 out_vert_format = MTLVertexFormatInvalid;
1152 switch (fetch_mode) {
1159 if (shader_attrib_format == MTLVertexFormatFloat ||
1160 shader_attrib_format == MTLVertexFormatFloat2 ||
1161 shader_attrib_format == MTLVertexFormatFloat3 ||
1162 shader_attrib_format == MTLVertexFormatFloat4)
1166 shader_attrib_format, component_length, &out_vert_format);
1174 "Source vertex data format is either Float, Float2, Float3, Float4 but "
1175 "format in shader interface is NOT compatible.\n");
1176 out_vert_format = MTLVertexFormatInvalid;
1182 out_vert_format = MTLVertexFormatInvalid;
1188 out_vert_format = MTLVertexFormatInt1010102Normalized;
1194 *r_convertedFormat = out_vert_format;
1195 return (out_vert_format != MTLVertexFormatInvalid);
1236 switch (vert_format) {
1237 case MTLVertexFormatFloat:
1238 case MTLVertexFormatFloat2:
1239 case MTLVertexFormatFloat3:
1240 case MTLVertexFormatFloat4:
1243 case MTLVertexFormatUChar:
1244 case MTLVertexFormatUChar2:
1245 case MTLVertexFormatUChar3:
1246 case MTLVertexFormatUChar4:
1247 case MTLVertexFormatChar:
1248 case MTLVertexFormatChar2:
1249 case MTLVertexFormatChar3:
1250 case MTLVertexFormatChar4:
1251 case MTLVertexFormatUShort:
1252 case MTLVertexFormatUShort2:
1253 case MTLVertexFormatUShort3:
1254 case MTLVertexFormatUShort4:
1255 case MTLVertexFormatShort:
1256 case MTLVertexFormatShort2:
1257 case MTLVertexFormatShort3:
1258 case MTLVertexFormatShort4:
1259 case MTLVertexFormatUInt:
1260 case MTLVertexFormatUInt2:
1261 case MTLVertexFormatUInt3:
1262 case MTLVertexFormatUInt4:
1263 case MTLVertexFormatInt:
1264 case MTLVertexFormatInt2:
1265 case MTLVertexFormatInt3:
1266 case MTLVertexFormatInt4:
1269 case MTLVertexFormatUCharNormalized:
1270 case MTLVertexFormatUChar2Normalized:
1271 case MTLVertexFormatUChar3Normalized:
1272 case MTLVertexFormatUChar4Normalized:
1273 case MTLVertexFormatCharNormalized:
1274 case MTLVertexFormatChar2Normalized:
1275 case MTLVertexFormatChar3Normalized:
1276 case MTLVertexFormatChar4Normalized:
1277 case MTLVertexFormatUShortNormalized:
1278 case MTLVertexFormatUShort2Normalized:
1279 case MTLVertexFormatUShort3Normalized:
1280 case MTLVertexFormatUShort4Normalized:
1281 case MTLVertexFormatShortNormalized:
1282 case MTLVertexFormatShort2Normalized:
1283 case MTLVertexFormatShort3Normalized:
1284 case MTLVertexFormatShort4Normalized:
1285 case MTLVertexFormatInt1010102Normalized:
1289 BLI_assert_msg(
false,
"Unrecognized attribute type. Add types to switch as needed.");
1296 switch (vert_format) {
1297 case MTLVertexFormatUChar:
1298 case MTLVertexFormatUChar2:
1299 case MTLVertexFormatUChar3:
1300 case MTLVertexFormatUChar4:
1301 case MTLVertexFormatUCharNormalized:
1302 case MTLVertexFormatUChar2Normalized:
1303 case MTLVertexFormatUChar3Normalized:
1304 case MTLVertexFormatUChar4Normalized:
1307 case MTLVertexFormatChar:
1308 case MTLVertexFormatChar2:
1309 case MTLVertexFormatChar3:
1310 case MTLVertexFormatChar4:
1311 case MTLVertexFormatCharNormalized:
1312 case MTLVertexFormatChar2Normalized:
1313 case MTLVertexFormatChar3Normalized:
1314 case MTLVertexFormatChar4Normalized:
1317 case MTLVertexFormatShort:
1318 case MTLVertexFormatShort2:
1319 case MTLVertexFormatShort3:
1320 case MTLVertexFormatShort4:
1321 case MTLVertexFormatShortNormalized:
1322 case MTLVertexFormatShort2Normalized:
1323 case MTLVertexFormatShort3Normalized:
1324 case MTLVertexFormatShort4Normalized:
1327 case MTLVertexFormatUShort:
1328 case MTLVertexFormatUShort2:
1329 case MTLVertexFormatUShort3:
1330 case MTLVertexFormatUShort4:
1331 case MTLVertexFormatUShortNormalized:
1332 case MTLVertexFormatUShort2Normalized:
1333 case MTLVertexFormatUShort3Normalized:
1334 case MTLVertexFormatUShort4Normalized:
1337 case MTLVertexFormatInt:
1338 case MTLVertexFormatInt2:
1339 case MTLVertexFormatInt3:
1340 case MTLVertexFormatInt4:
1343 case MTLVertexFormatUInt:
1344 case MTLVertexFormatUInt2:
1345 case MTLVertexFormatUInt3:
1346 case MTLVertexFormatUInt4:
1349 case MTLVertexFormatFloat:
1350 case MTLVertexFormatFloat2:
1351 case MTLVertexFormatFloat3:
1352 case MTLVertexFormatFloat4:
1355 case MTLVertexFormatInt1010102Normalized:
1359 BLI_assert_msg(
false,
"Unrecognized attribute type. Add types to switch as needed.");