From bbc7962fe21fb4632b7ec0d49091f5263c3e3d60 Mon Sep 17 00:00:00 2001 From: Stuart Carnie Date: Thu, 22 Aug 2024 21:34:53 +1000 Subject: [PATCH] Metal: fix artefacts for mobile render method and return false for multi-view support --- drivers/metal/rendering_device_driver_metal.mm | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/drivers/metal/rendering_device_driver_metal.mm b/drivers/metal/rendering_device_driver_metal.mm index 0a9fde06a73b..ffa4cf92c75d 100644 --- a/drivers/metal/rendering_device_driver_metal.mm +++ b/drivers/metal/rendering_device_driver_metal.mm @@ -3091,12 +3091,22 @@ bool isArrayTexture(MTLTextureType p_type) { }]; } + // 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]; uint32_t i = 0; uint32_t j = 0; while (i < constants.count && j < p_specialization_constants.size()) { 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) { switch (curr.type) { case MTLDataTypeBool: @@ -3769,7 +3779,7 @@ bool isArrayTexture(MTLTextureType p_type) { bool RenderingDeviceDriverMetal::has_feature(Features p_feature) { switch (p_feature) { case SUPPORTS_MULTIVIEW: - return true; + return false; case SUPPORTS_FSR_HALF_FLOAT: return true; case SUPPORTS_ATTACHMENT_VRS: