Browse Source

Merge pull request #95945 from stuartcarnie/sgc/metal_mobile_fix

Metal: Fix artefacts for mobile render method and disable multi-view
Rémi Verschelde 11 months ago
parent
commit
a1acd38c35
1 changed files with 12 additions and 2 deletions
  1. 12 2
      drivers/metal/rendering_device_driver_metal.mm

+ 12 - 2
drivers/metal/rendering_device_driver_metal.mm

@@ -3091,12 +3091,22 @@ RenderingDeviceDriverMetal::Result<id<MTLFunction>> RenderingDeviceDriverMetal::
 		}];
 		}];
 	}
 	}
 
 
+	// Initialize an array of integers representing the indexes of p_specialization_constants
+	uint32_t *indexes = (uint32_t *)alloca(p_specialization_constants.size() * sizeof(uint32_t));
+	for (uint32_t i = 0; i < p_specialization_constants.size(); i++) {
+		indexes[i] = i;
+	}
+	// Sort the array of integers based on the values in p_specialization_constants
+	std::sort(indexes, &indexes[p_specialization_constants.size()], [&](int a, int b) {
+		return p_specialization_constants[a].constant_id < p_specialization_constants[b].constant_id;
+	});
+
 	MTLFunctionConstantValues *constantValues = [MTLFunctionConstantValues new];
 	MTLFunctionConstantValues *constantValues = [MTLFunctionConstantValues new];
 	uint32_t i = 0;
 	uint32_t i = 0;
 	uint32_t j = 0;
 	uint32_t j = 0;
 	while (i < constants.count && j < p_specialization_constants.size()) {
 	while (i < constants.count && j < p_specialization_constants.size()) {
 		MTLFunctionConstant *curr = constants[i];
 		MTLFunctionConstant *curr = constants[i];
-		PipelineSpecializationConstant const &sc = p_specialization_constants[j];
+		PipelineSpecializationConstant const &sc = p_specialization_constants[indexes[j]];
 		if (curr.index == sc.constant_id) {
 		if (curr.index == sc.constant_id) {
 			switch (curr.type) {
 			switch (curr.type) {
 				case MTLDataTypeBool:
 				case MTLDataTypeBool:
@@ -3769,7 +3779,7 @@ uint64_t RenderingDeviceDriverMetal::api_trait_get(ApiTrait p_trait) {
 bool RenderingDeviceDriverMetal::has_feature(Features p_feature) {
 bool RenderingDeviceDriverMetal::has_feature(Features p_feature) {
 	switch (p_feature) {
 	switch (p_feature) {
 		case SUPPORTS_MULTIVIEW:
 		case SUPPORTS_MULTIVIEW:
-			return true;
+			return false;
 		case SUPPORTS_FSR_HALF_FLOAT:
 		case SUPPORTS_FSR_HALF_FLOAT:
 			return true;
 			return true;
 		case SUPPORTS_ATTACHMENT_VRS:
 		case SUPPORTS_ATTACHMENT_VRS: