From 1e62a784e06f1795ed055ad7640f9f77f3471769 Mon Sep 17 00:00:00 2001 From: Normunds Rieksts Date: Wed, 29 Apr 2026 18:41:25 +0100 Subject: [PATCH] Preserve compression control rate flags VkImageCompressionControlEXT only uses pFixedRateFlags when VK_IMAGE_COMPRESSION_FIXED_RATE_EXPLICIT_EXT is set. Fixes an issue where copy operation for image_create_compression_control could result in a dangling pointer. Signed-off-by: Normunds Rieksts Change-Id: I1d47f7a8faccceb874b9c7645285463a0221a6ba --- wsi/extensions/image_compression_control.cpp | 12 ++++++++---- wsi/extensions/image_compression_control.hpp | 13 ++++++++----- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/wsi/extensions/image_compression_control.cpp b/wsi/extensions/image_compression_control.cpp index 2cbf7d8..a76aab3 100644 --- a/wsi/extensions/image_compression_control.cpp +++ b/wsi/extensions/image_compression_control.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2024-2025 Arm Limited. + * Copyright (c) 2024-2026 Arm Limited. * * SPDX-License-Identifier: MIT * @@ -38,11 +38,15 @@ namespace wsi { image_create_compression_control::image_create_compression_control(const VkImageCompressionControlEXT &extension) : m_compression_control{ VK_STRUCTURE_TYPE_IMAGE_COMPRESSION_CONTROL_EXT, nullptr, extension.flags, - extension.compressionControlPlaneCount, m_array_fixed_rate_flags } + extension.compressionControlPlaneCount, nullptr } { - for (uint32_t i = 0; i < extension.compressionControlPlaneCount; i++) + if ((extension.flags & VK_IMAGE_COMPRESSION_FIXED_RATE_EXPLICIT_EXT) != 0) { - m_compression_control.pFixedRateFlags[i] = extension.pFixedRateFlags[i]; + m_compression_control.pFixedRateFlags = m_array_fixed_rate_flags; + for (uint32_t i = 0; i < extension.compressionControlPlaneCount; i++) + { + m_compression_control.pFixedRateFlags[i] = extension.pFixedRateFlags[i]; + } } } diff --git a/wsi/extensions/image_compression_control.hpp b/wsi/extensions/image_compression_control.hpp index eab1f0f..5f93f72 100644 --- a/wsi/extensions/image_compression_control.hpp +++ b/wsi/extensions/image_compression_control.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2025 Arm Limited. + * Copyright (c) 2025-2026 Arm Limited. * * SPDX-License-Identifier: MIT * @@ -32,7 +32,6 @@ #pragma once #include -#include #include #include @@ -71,10 +70,14 @@ public: } auto compression_control = image_create_compression_control(extension); - std::swap(m_compression_control, compression_control.m_compression_control); - for (uint32_t i = 0; i < compression_control.m_compression_control.compressionControlPlaneCount; i++) + m_compression_control = compression_control.m_compression_control; + if (compression_control.m_compression_control.pFixedRateFlags != nullptr) { - m_compression_control.pFixedRateFlags[i] = compression_control.m_compression_control.pFixedRateFlags[i]; + m_compression_control.pFixedRateFlags = m_array_fixed_rate_flags; + for (uint32_t i = 0; i < compression_control.m_compression_control.compressionControlPlaneCount; i++) + { + m_compression_control.pFixedRateFlags[i] = compression_control.m_compression_control.pFixedRateFlags[i]; + } } return *this;