From 2f8f39b32b4051d7251c4a0d2355d72eee262f34 Mon Sep 17 00:00:00 2001 From: Xiaowei Guan Date: Tue, 9 Jun 2026 21:44:32 +0800 Subject: [PATCH 01/12] Move FindMemoryType method to vulkan renderer --- .../tizen/external_texture_pixel_vulkan.cc | 37 +++++++------------ .../tizen/external_texture_pixel_vulkan.h | 3 -- .../external_texture_surface_vulkan_buffer.cc | 21 ----------- .../external_texture_surface_vulkan_buffer.h | 3 -- .../platform/tizen/tizen_renderer_vulkan.cc | 17 +++++++++ .../platform/tizen/tizen_renderer_vulkan.h | 3 ++ 6 files changed, 33 insertions(+), 51 deletions(-) diff --git a/flutter/shell/platform/tizen/external_texture_pixel_vulkan.cc b/flutter/shell/platform/tizen/external_texture_pixel_vulkan.cc index 2cf0d12e..4d4bd273 100644 --- a/flutter/shell/platform/tizen/external_texture_pixel_vulkan.cc +++ b/flutter/shell/platform/tizen/external_texture_pixel_vulkan.cc @@ -37,6 +37,11 @@ bool ExternalTexturePixelVulkan::PopulateVulkanTexture( return false; } + if (!pixel_buffer->buffer) { + FT_LOG(Error) << "pixel_buffer->buffer is nullptr"; + return false; + } + if (!CreateOrUpdateImage(pixel_buffer->width, pixel_buffer->height)) { FT_LOG(Error) << "Fail to create image"; ReleaseImage(); @@ -127,27 +132,6 @@ bool ExternalTexturePixelVulkan::CreateImage(size_t width, size_t height) { return true; } -bool ExternalTexturePixelVulkan::FindMemoryType( - uint32_t type_filter, - VkMemoryPropertyFlags properties, - uint32_t& index_out) { - VkPhysicalDeviceMemoryProperties memory_properties; - vkGetPhysicalDeviceMemoryProperties( - static_cast( - vulkan_renderer_->GetPhysicalDeviceHandle()), - &memory_properties); - - for (uint32_t i = 0; i < memory_properties.memoryTypeCount; i++) { - if ((type_filter & (1 << i)) && - (memory_properties.memoryTypes[i].propertyFlags & properties) == - properties) { - index_out = i; - return true; - } - } - return false; -} - bool ExternalTexturePixelVulkan::CreateBuffer(VkDeviceSize required_size) { VkBufferCreateInfo buffer_info{}; buffer_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; @@ -197,7 +181,12 @@ void ExternalTexturePixelVulkan::ReleaseBuffer() { void ExternalTexturePixelVulkan::CopyBufferToImage(const uint8_t* src_buffer, VkDeviceSize size) { void* data; - vkMapMemory(GetDevice(), staging_buffer_memory_, 0, size, 0, &data); + VkResult result = + vkMapMemory(GetDevice(), staging_buffer_memory_, 0, size, 0, &data); + if (result != VK_SUCCESS) { + FT_LOG(Error) << "Failed to map staging buffer memory"; + return; + } memcpy(data, src_buffer, static_cast(size)); vkUnmapMemory(GetDevice(), staging_buffer_memory_); VkCommandBuffer command_buffer = vulkan_renderer_->BeginSingleTimeCommands(); @@ -237,8 +226,8 @@ bool ExternalTexturePixelVulkan::AllocateMemory( VkDeviceMemory& memory, VkMemoryPropertyFlags properties) { uint32_t memory_type_index; - if (!FindMemoryType(memory_requirements.memoryTypeBits, properties, - memory_type_index)) { + if (!vulkan_renderer_->FindMemoryType(memory_requirements.memoryTypeBits, + properties, memory_type_index)) { FT_LOG(Error) << "Fail to find memory type"; return false; } diff --git a/flutter/shell/platform/tizen/external_texture_pixel_vulkan.h b/flutter/shell/platform/tizen/external_texture_pixel_vulkan.h index ce10f0f0..6e23c657 100644 --- a/flutter/shell/platform/tizen/external_texture_pixel_vulkan.h +++ b/flutter/shell/platform/tizen/external_texture_pixel_vulkan.h @@ -36,9 +36,6 @@ class ExternalTexturePixelVulkan : public ExternalVulkanTexture { VkDevice GetDevice(); void ReleaseBuffer(); void ReleaseImage(); - bool FindMemoryType(uint32_t typeFilter, - VkMemoryPropertyFlags properties, - uint32_t& index_out); FlutterDesktopPixelBufferTextureCallback texture_callback_ = nullptr; size_t width_ = 0; size_t height_ = 0; diff --git a/flutter/shell/platform/tizen/external_texture_surface_vulkan_buffer.cc b/flutter/shell/platform/tizen/external_texture_surface_vulkan_buffer.cc index 75d22274..d3c07805 100644 --- a/flutter/shell/platform/tizen/external_texture_surface_vulkan_buffer.cc +++ b/flutter/shell/platform/tizen/external_texture_surface_vulkan_buffer.cc @@ -31,27 +31,6 @@ VkFormat ExternalTextureSurfaceVulkanBuffer::ConvertFormat(tbm_format& format) { } } -bool ExternalTextureSurfaceVulkanBuffer::FindMemoryType( - uint32_t type_filter, - VkMemoryPropertyFlags properties, - uint32_t& index_out) { - VkPhysicalDeviceMemoryProperties memory_properties; - vkGetPhysicalDeviceMemoryProperties( - static_cast( - vulkan_renderer_->GetPhysicalDeviceHandle()), - &memory_properties); - - for (uint32_t i = 0; i < memory_properties.memoryTypeCount; i++) { - if ((type_filter & (1 << i)) && - (memory_properties.memoryTypes[i].propertyFlags & properties) == - properties) { - index_out = i; - return true; - } - } - return false; -} - VkDevice ExternalTextureSurfaceVulkanBuffer::GetDevice() { return static_cast(vulkan_renderer_->GetDeviceHandle()); } diff --git a/flutter/shell/platform/tizen/external_texture_surface_vulkan_buffer.h b/flutter/shell/platform/tizen/external_texture_surface_vulkan_buffer.h index 6e01606b..3afe5497 100644 --- a/flutter/shell/platform/tizen/external_texture_surface_vulkan_buffer.h +++ b/flutter/shell/platform/tizen/external_texture_surface_vulkan_buffer.h @@ -32,9 +32,6 @@ class ExternalTextureSurfaceVulkanBuffer { protected: VkFormat ConvertFormat(tbm_format& format); VkDevice GetDevice(); - bool FindMemoryType(uint32_t memory_type_bits_requirement, - VkMemoryPropertyFlags required_properties, - uint32_t& index_out); private: TizenRendererVulkan* vulkan_renderer_ = nullptr; diff --git a/flutter/shell/platform/tizen/tizen_renderer_vulkan.cc b/flutter/shell/platform/tizen/tizen_renderer_vulkan.cc index 3e5ed270..0a8bb849 100644 --- a/flutter/shell/platform/tizen/tizen_renderer_vulkan.cc +++ b/flutter/shell/platform/tizen/tizen_renderer_vulkan.cc @@ -1022,4 +1022,21 @@ void TizenRendererVulkan::EndSingleTimeCommands(VkCommandBuffer commandBuffer) { &commandBuffer); } +bool TizenRendererVulkan::FindMemoryType(uint32_t type_filter, + VkMemoryPropertyFlags properties, + uint32_t& index_out) { + VkPhysicalDeviceMemoryProperties memory_properties; + vkGetPhysicalDeviceMemoryProperties(physical_device_, &memory_properties); + + for (uint32_t i = 0; i < memory_properties.memoryTypeCount; i++) { + if ((type_filter & (1 << i)) && + (memory_properties.memoryTypes[i].propertyFlags & properties) == + properties) { + index_out = i; + return true; + } + } + return false; +} + } // namespace flutter diff --git a/flutter/shell/platform/tizen/tizen_renderer_vulkan.h b/flutter/shell/platform/tizen/tizen_renderer_vulkan.h index 0a832e7a..b66880a6 100644 --- a/flutter/shell/platform/tizen/tizen_renderer_vulkan.h +++ b/flutter/shell/platform/tizen/tizen_renderer_vulkan.h @@ -51,6 +51,9 @@ class TizenRendererVulkan : public TizenRenderer { bool Present(const FlutterVulkanImage* image); VkCommandBuffer BeginSingleTimeCommands(); void EndSingleTimeCommands(VkCommandBuffer commandBuffer); + bool FindMemoryType(uint32_t type_filter, + VkMemoryPropertyFlags properties, + uint32_t& index_out); private: bool CreateCommandPool(); From 8a651c30778936c0c11fa4706f614d20c8820139 Mon Sep 17 00:00:00 2001 From: Xiaowei Guan Date: Tue, 9 Jun 2026 22:07:01 +0800 Subject: [PATCH 02/12] Make GetDevice method to const --- flutter/shell/platform/tizen/external_texture_pixel_vulkan.cc | 2 +- flutter/shell/platform/tizen/external_texture_pixel_vulkan.h | 2 +- .../platform/tizen/external_texture_surface_vulkan_buffer.cc | 2 +- .../platform/tizen/external_texture_surface_vulkan_buffer.h | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/flutter/shell/platform/tizen/external_texture_pixel_vulkan.cc b/flutter/shell/platform/tizen/external_texture_pixel_vulkan.cc index 4d4bd273..30b76666 100644 --- a/flutter/shell/platform/tizen/external_texture_pixel_vulkan.cc +++ b/flutter/shell/platform/tizen/external_texture_pixel_vulkan.cc @@ -244,7 +244,7 @@ bool ExternalTexturePixelVulkan::AllocateMemory( return true; } -VkDevice ExternalTexturePixelVulkan::GetDevice() { +VkDevice ExternalTexturePixelVulkan::GetDevice() const { return static_cast(vulkan_renderer_->GetDeviceHandle()); } diff --git a/flutter/shell/platform/tizen/external_texture_pixel_vulkan.h b/flutter/shell/platform/tizen/external_texture_pixel_vulkan.h index 6e23c657..a57bf799 100644 --- a/flutter/shell/platform/tizen/external_texture_pixel_vulkan.h +++ b/flutter/shell/platform/tizen/external_texture_pixel_vulkan.h @@ -33,7 +33,7 @@ class ExternalTexturePixelVulkan : public ExternalVulkanTexture { bool CreateOrUpdateBuffer(VkDeviceSize required_size); bool CreateOrUpdateImage(size_t width, size_t height); void CopyBufferToImage(const uint8_t* src_buffer, VkDeviceSize size); - VkDevice GetDevice(); + VkDevice GetDevice() const; void ReleaseBuffer(); void ReleaseImage(); FlutterDesktopPixelBufferTextureCallback texture_callback_ = nullptr; diff --git a/flutter/shell/platform/tizen/external_texture_surface_vulkan_buffer.cc b/flutter/shell/platform/tizen/external_texture_surface_vulkan_buffer.cc index d3c07805..bd2300da 100644 --- a/flutter/shell/platform/tizen/external_texture_surface_vulkan_buffer.cc +++ b/flutter/shell/platform/tizen/external_texture_surface_vulkan_buffer.cc @@ -31,7 +31,7 @@ VkFormat ExternalTextureSurfaceVulkanBuffer::ConvertFormat(tbm_format& format) { } } -VkDevice ExternalTextureSurfaceVulkanBuffer::GetDevice() { +VkDevice ExternalTextureSurfaceVulkanBuffer::GetDevice() const { return static_cast(vulkan_renderer_->GetDeviceHandle()); } diff --git a/flutter/shell/platform/tizen/external_texture_surface_vulkan_buffer.h b/flutter/shell/platform/tizen/external_texture_surface_vulkan_buffer.h index 3afe5497..cd473a18 100644 --- a/flutter/shell/platform/tizen/external_texture_surface_vulkan_buffer.h +++ b/flutter/shell/platform/tizen/external_texture_surface_vulkan_buffer.h @@ -31,7 +31,7 @@ class ExternalTextureSurfaceVulkanBuffer { protected: VkFormat ConvertFormat(tbm_format& format); - VkDevice GetDevice(); + VkDevice GetDevice() const; private: TizenRendererVulkan* vulkan_renderer_ = nullptr; From 86867f02fd9ef53cf70db3c89aac263077996068 Mon Sep 17 00:00:00 2001 From: Xiaowei Guan Date: Tue, 9 Jun 2026 22:14:31 +0800 Subject: [PATCH 03/12] Cast to `VkDeviceSize` before multiplication --- flutter/shell/platform/tizen/external_texture_pixel_vulkan.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/flutter/shell/platform/tizen/external_texture_pixel_vulkan.cc b/flutter/shell/platform/tizen/external_texture_pixel_vulkan.cc index 30b76666..6a264e61 100644 --- a/flutter/shell/platform/tizen/external_texture_pixel_vulkan.cc +++ b/flutter/shell/platform/tizen/external_texture_pixel_vulkan.cc @@ -49,7 +49,8 @@ bool ExternalTexturePixelVulkan::PopulateVulkanTexture( } VkDeviceSize required_staging_size = - pixel_buffer->width * pixel_buffer->height * 4; + static_cast(pixel_buffer->width) * + static_cast(pixel_buffer->height) * 4; if (!CreateOrUpdateBuffer(required_staging_size)) { FT_LOG(Error) << "Fail to create buffer"; ReleaseBuffer(); From 53c9f6c88bdcf98c49b29ccf74bb36f6d814812a Mon Sep 17 00:00:00 2001 From: Xiaowei Guan Date: Thu, 18 Jun 2026 00:48:58 +0800 Subject: [PATCH 04/12] Some refactor --- .../shell/platform/tizen/external_texture_surface_vulkan.cc | 1 + .../tizen/external_texture_surface_vulkan_buffer_dma.cc | 3 ++- flutter/shell/platform/tizen/tizen_renderer_vulkan.cc | 3 +-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/flutter/shell/platform/tizen/external_texture_surface_vulkan.cc b/flutter/shell/platform/tizen/external_texture_surface_vulkan.cc index 23825de4..5064513a 100644 --- a/flutter/shell/platform/tizen/external_texture_surface_vulkan.cc +++ b/flutter/shell/platform/tizen/external_texture_surface_vulkan.cc @@ -47,6 +47,7 @@ bool ExternalTextureSurfaceVulkan::CreateBuffer( } if (!vulkan_buffer_->AllocateAndBindMemory(tbm_surface)) { FT_LOG(Error) << "Fail to allocate memory"; + vulkan_buffer_->ReleaseImage(); return false; } diff --git a/flutter/shell/platform/tizen/external_texture_surface_vulkan_buffer_dma.cc b/flutter/shell/platform/tizen/external_texture_surface_vulkan_buffer_dma.cc index d422d522..24e8184b 100644 --- a/flutter/shell/platform/tizen/external_texture_surface_vulkan_buffer_dma.cc +++ b/flutter/shell/platform/tizen/external_texture_surface_vulkan_buffer_dma.cc @@ -3,6 +3,7 @@ // found in the LICENSE file. #include "flutter/shell/platform/tizen/external_texture_surface_vulkan_buffer_dma.h" +#include #include "flutter/shell/platform/tizen/logger.h" namespace flutter { @@ -129,6 +130,7 @@ bool ExternalTextureSurfaceVulkanBufferDma::AllocateAndBindMemory( if (vkAllocateMemory(GetDevice(), &alloc_info, nullptr, &texture_device_memory_) != VK_SUCCESS) { FT_LOG(Error) << "Fail to allocate memory"; + close(bo_fd); return false; } @@ -137,7 +139,6 @@ bool ExternalTextureSurfaceVulkanBufferDma::AllocateAndBindMemory( FT_LOG(Error) << "Fail to bind image memory"; return false; } - close(bo_fd); return true; } diff --git a/flutter/shell/platform/tizen/tizen_renderer_vulkan.cc b/flutter/shell/platform/tizen/tizen_renderer_vulkan.cc index 0a8bb849..6e08f3e9 100644 --- a/flutter/shell/platform/tizen/tizen_renderer_vulkan.cc +++ b/flutter/shell/platform/tizen/tizen_renderer_vulkan.cc @@ -102,7 +102,7 @@ bool TizenRendererVulkan::InitVulkan(TizenViewBase* view) { } void TizenRendererVulkan::Cleanup() { - if (logical_device_) { + if (logical_device_ != VK_NULL_HANDLE) { // Ensure all GPU work is complete before destroying anything. vkDeviceWaitIdle(logical_device_); @@ -749,7 +749,6 @@ bool TizenRendererVulkan::InitializeSwapchain() { FT_LOG(Error) << "Could not get swap chain images count"; return false; } - // swapchain_images_.reserve(image_count); swapchain_images_.resize(image_count); if (vkGetSwapchainImagesKHR(logical_device_, swapchain_, &image_count, swapchain_images_.data()) != VK_SUCCESS) { From 9e96b44c96c8fd42d6ad28bd32f883de5e2aabd6 Mon Sep 17 00:00:00 2001 From: Xiaowei Guan Date: Thu, 18 Jun 2026 00:54:38 +0800 Subject: [PATCH 05/12] Fix: Add missing return value check for tbm_surface_get_info - Check return value of tbm_surface_get_info() in CreateImage() - Return false early if the call fails to prevent undefined behavior - Follows the same error handling pattern as external_texture_surface_egl.cc Co-Authored-By: Cline SR --- .../tizen/external_texture_surface_vulkan_buffer_dma.cc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/flutter/shell/platform/tizen/external_texture_surface_vulkan_buffer_dma.cc b/flutter/shell/platform/tizen/external_texture_surface_vulkan_buffer_dma.cc index 24e8184b..84ed93cf 100644 --- a/flutter/shell/platform/tizen/external_texture_surface_vulkan_buffer_dma.cc +++ b/flutter/shell/platform/tizen/external_texture_surface_vulkan_buffer_dma.cc @@ -32,7 +32,11 @@ VkDeviceMemory ExternalTextureSurfaceVulkanBufferDma::GetMemory() { bool ExternalTextureSurfaceVulkanBufferDma::CreateImage( tbm_surface_h tbm_surface) { tbm_surface_info_s tbm_surface_info; - tbm_surface_get_info(tbm_surface, &tbm_surface_info); + if (tbm_surface_get_info(tbm_surface, &tbm_surface_info) != + TBM_SURFACE_ERROR_NONE) { + FT_LOG(Error) << "Fail to get tbm_surface info"; + return false; + } texture_format_ = ConvertFormat(tbm_surface_info.format); VkExternalMemoryImageCreateInfoKHR external_image_create_info = {}; From 858005226ca26d6bbf54ce7e576a543393b75873 Mon Sep 17 00:00:00 2001 From: Xiaowei Guan Date: Thu, 18 Jun 2026 01:05:59 +0800 Subject: [PATCH 06/12] Fix: Initialize memory_type_index to 0 instead of -1 Change uint32_t initialization from -1 to 0 to avoid implicit signed-to-unsigned conversion, improving code clarity. Co-Authored-By: Cline SR --- .../tizen/external_texture_surface_vulkan_buffer_dma.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flutter/shell/platform/tizen/external_texture_surface_vulkan_buffer_dma.cc b/flutter/shell/platform/tizen/external_texture_surface_vulkan_buffer_dma.cc index 84ed93cf..cbdefe1f 100644 --- a/flutter/shell/platform/tizen/external_texture_surface_vulkan_buffer_dma.cc +++ b/flutter/shell/platform/tizen/external_texture_surface_vulkan_buffer_dma.cc @@ -113,7 +113,7 @@ bool ExternalTextureSurfaceVulkanBufferDma::AllocateAndBindMemory( int bo_fd = tbm_bo_export_fd(bo); int bo_size = tbm_bo_size(bo); - uint32_t memory_type_index = -1; + uint32_t memory_type_index = 0; if (!GetFdMemoryTypeIndex(bo_fd, memory_type_index)) { FT_LOG(Error) << "Fail to get memory type index"; return false; From eafe1fda94085d08e402488a8e0d00029ca0a4d4 Mon Sep 17 00:00:00 2001 From: Xiaowei Guan Date: Thu, 18 Jun 2026 01:26:03 +0800 Subject: [PATCH 07/12] Fix Vulkan texture error handling issues - Change CopyBufferToImage return type from void to bool - Add error propagation for vkMapMemory failure - Add null check for BeginSingleTimeCommands return value - Update caller in PopulateVulkanTexture to check return value Fixes two critical issues identified by code review bot: 1. Lack of error propagation when vkMapMemory fails 2. Unchecked command buffer that could be VK_NULL_HANDLE Co-Authored-By: Cline SR --- .../tizen/external_texture_pixel_vulkan.cc | 15 ++++++++++++--- .../tizen/external_texture_pixel_vulkan.h | 2 +- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/flutter/shell/platform/tizen/external_texture_pixel_vulkan.cc b/flutter/shell/platform/tizen/external_texture_pixel_vulkan.cc index 6a264e61..1bcbea71 100644 --- a/flutter/shell/platform/tizen/external_texture_pixel_vulkan.cc +++ b/flutter/shell/platform/tizen/external_texture_pixel_vulkan.cc @@ -60,7 +60,10 @@ bool ExternalTexturePixelVulkan::PopulateVulkanTexture( width_ = pixel_buffer->width; height_ = pixel_buffer->height; - CopyBufferToImage(pixel_buffer->buffer, required_staging_size); + if (!CopyBufferToImage(pixel_buffer->buffer, required_staging_size)) { + FT_LOG(Error) << "Failed to copy buffer to image"; + return false; + } FlutterVulkanTexture* vulkan_texture = static_cast(flutter_texture); @@ -179,18 +182,23 @@ void ExternalTexturePixelVulkan::ReleaseBuffer() { staging_buffer_size_ = 0; } -void ExternalTexturePixelVulkan::CopyBufferToImage(const uint8_t* src_buffer, +bool ExternalTexturePixelVulkan::CopyBufferToImage(const uint8_t* src_buffer, VkDeviceSize size) { void* data; VkResult result = vkMapMemory(GetDevice(), staging_buffer_memory_, 0, size, 0, &data); if (result != VK_SUCCESS) { FT_LOG(Error) << "Failed to map staging buffer memory"; - return; + return false; } memcpy(data, src_buffer, static_cast(size)); vkUnmapMemory(GetDevice(), staging_buffer_memory_); + VkCommandBuffer command_buffer = vulkan_renderer_->BeginSingleTimeCommands(); + if (command_buffer == VK_NULL_HANDLE) { + FT_LOG(Error) << "Failed to begin single time commands"; + return false; + } VkBufferImageCopy region{}; region.bufferOffset = 0; @@ -208,6 +216,7 @@ void ExternalTexturePixelVulkan::CopyBufferToImage(const uint8_t* src_buffer, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ®ion); vulkan_renderer_->EndSingleTimeCommands(command_buffer); + return true; } void ExternalTexturePixelVulkan::ReleaseImage() { diff --git a/flutter/shell/platform/tizen/external_texture_pixel_vulkan.h b/flutter/shell/platform/tizen/external_texture_pixel_vulkan.h index a57bf799..5d6b5425 100644 --- a/flutter/shell/platform/tizen/external_texture_pixel_vulkan.h +++ b/flutter/shell/platform/tizen/external_texture_pixel_vulkan.h @@ -32,7 +32,7 @@ class ExternalTexturePixelVulkan : public ExternalVulkanTexture { bool CreateImage(size_t width, size_t height); bool CreateOrUpdateBuffer(VkDeviceSize required_size); bool CreateOrUpdateImage(size_t width, size_t height); - void CopyBufferToImage(const uint8_t* src_buffer, VkDeviceSize size); + bool CopyBufferToImage(const uint8_t* src_buffer, VkDeviceSize size); VkDevice GetDevice() const; void ReleaseBuffer(); void ReleaseImage(); From 63093fafc522b4c4b6f3b6503d00dfcdc0c6ce0b Mon Sep 17 00:00:00 2001 From: Xiaowei Guan Date: Thu, 18 Jun 2026 01:42:53 +0800 Subject: [PATCH 08/12] Refactor: Change FindMemoryType output parameter from reference to pointer Follow Google C++ Style Guide: output parameters should be passed as pointers rather than references to make it clear at the call site that the argument may be modified. Changed: - tizen_renderer_vulkan.h: Declaration updated to use uint32_t* instead of uint32_t& - tizen_renderer_vulkan.cc: Implementation updated with pointer dereference - external_texture_pixel_vulkan.cc: Call site updated to pass address Co-Authored-By: Cline SR --- flutter/shell/platform/tizen/external_texture_pixel_vulkan.cc | 2 +- flutter/shell/platform/tizen/tizen_renderer_vulkan.cc | 4 ++-- flutter/shell/platform/tizen/tizen_renderer_vulkan.h | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/flutter/shell/platform/tizen/external_texture_pixel_vulkan.cc b/flutter/shell/platform/tizen/external_texture_pixel_vulkan.cc index 1bcbea71..a7ee5ded 100644 --- a/flutter/shell/platform/tizen/external_texture_pixel_vulkan.cc +++ b/flutter/shell/platform/tizen/external_texture_pixel_vulkan.cc @@ -237,7 +237,7 @@ bool ExternalTexturePixelVulkan::AllocateMemory( VkMemoryPropertyFlags properties) { uint32_t memory_type_index; if (!vulkan_renderer_->FindMemoryType(memory_requirements.memoryTypeBits, - properties, memory_type_index)) { + properties, &memory_type_index)) { FT_LOG(Error) << "Fail to find memory type"; return false; } diff --git a/flutter/shell/platform/tizen/tizen_renderer_vulkan.cc b/flutter/shell/platform/tizen/tizen_renderer_vulkan.cc index 6e08f3e9..b1019972 100644 --- a/flutter/shell/platform/tizen/tizen_renderer_vulkan.cc +++ b/flutter/shell/platform/tizen/tizen_renderer_vulkan.cc @@ -1023,7 +1023,7 @@ void TizenRendererVulkan::EndSingleTimeCommands(VkCommandBuffer commandBuffer) { bool TizenRendererVulkan::FindMemoryType(uint32_t type_filter, VkMemoryPropertyFlags properties, - uint32_t& index_out) { + uint32_t* index_out) { VkPhysicalDeviceMemoryProperties memory_properties; vkGetPhysicalDeviceMemoryProperties(physical_device_, &memory_properties); @@ -1031,7 +1031,7 @@ bool TizenRendererVulkan::FindMemoryType(uint32_t type_filter, if ((type_filter & (1 << i)) && (memory_properties.memoryTypes[i].propertyFlags & properties) == properties) { - index_out = i; + *index_out = i; return true; } } diff --git a/flutter/shell/platform/tizen/tizen_renderer_vulkan.h b/flutter/shell/platform/tizen/tizen_renderer_vulkan.h index b66880a6..d2f2b53f 100644 --- a/flutter/shell/platform/tizen/tizen_renderer_vulkan.h +++ b/flutter/shell/platform/tizen/tizen_renderer_vulkan.h @@ -53,7 +53,7 @@ class TizenRendererVulkan : public TizenRenderer { void EndSingleTimeCommands(VkCommandBuffer commandBuffer); bool FindMemoryType(uint32_t type_filter, VkMemoryPropertyFlags properties, - uint32_t& index_out); + uint32_t* index_out); private: bool CreateCommandPool(); From 4c60eccda63a28fdc852e29a08f0326c79c30acb Mon Sep 17 00:00:00 2001 From: Xiaowei Guan Date: Thu, 18 Jun 2026 18:51:52 +0800 Subject: [PATCH 09/12] Fix: Add null check in FindMemoryType to prevent null pointer dereference - Add null pointer check for index_out parameter at the beginning of FindMemoryType function - Return false early if index_out is null to prevent potential crashes Co-Authored-By: Cline SR --- flutter/shell/platform/tizen/tizen_renderer_vulkan.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/flutter/shell/platform/tizen/tizen_renderer_vulkan.cc b/flutter/shell/platform/tizen/tizen_renderer_vulkan.cc index b1019972..3be5face 100644 --- a/flutter/shell/platform/tizen/tizen_renderer_vulkan.cc +++ b/flutter/shell/platform/tizen/tizen_renderer_vulkan.cc @@ -1024,6 +1024,9 @@ void TizenRendererVulkan::EndSingleTimeCommands(VkCommandBuffer commandBuffer) { bool TizenRendererVulkan::FindMemoryType(uint32_t type_filter, VkMemoryPropertyFlags properties, uint32_t* index_out) { + if (!index_out) { + return false; + } VkPhysicalDeviceMemoryProperties memory_properties; vkGetPhysicalDeviceMemoryProperties(physical_device_, &memory_properties); From 85aec9ffe811bf3a926f97491e022fccd50b4cc7 Mon Sep 17 00:00:00 2001 From: Xiaowei Guan Date: Thu, 18 Jun 2026 18:57:16 +0800 Subject: [PATCH 10/12] Fix file descriptor leak in ExternalTextureSurfaceVulkanBufferDma Add close(bo_fd) call when GetFdMemoryTypeIndex() fails to prevent file descriptor leak in AllocateAndBindMemory(). Co-Authored-By: Cline SR --- .../platform/tizen/external_texture_surface_vulkan_buffer_dma.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/flutter/shell/platform/tizen/external_texture_surface_vulkan_buffer_dma.cc b/flutter/shell/platform/tizen/external_texture_surface_vulkan_buffer_dma.cc index cbdefe1f..e04f16c8 100644 --- a/flutter/shell/platform/tizen/external_texture_surface_vulkan_buffer_dma.cc +++ b/flutter/shell/platform/tizen/external_texture_surface_vulkan_buffer_dma.cc @@ -116,6 +116,7 @@ bool ExternalTextureSurfaceVulkanBufferDma::AllocateAndBindMemory( uint32_t memory_type_index = 0; if (!GetFdMemoryTypeIndex(bo_fd, memory_type_index)) { FT_LOG(Error) << "Fail to get memory type index"; + close(bo_fd); return false; } From 78321f3f2666e0705a358745c09f2f7c8f2b7163 Mon Sep 17 00:00:00 2001 From: Xiaowei Guan Date: Thu, 18 Jun 2026 19:01:00 +0800 Subject: [PATCH 11/12] Add pixel buffer dimension validation in ExternalTexturePixelVulkan - Validate width and height are non-zero before creating Vulkan image/buffer - Prevents invalid memory allocation and Vulkan errors from zero-dimension textures Co-Authored-By: Cline SR --- .../shell/platform/tizen/external_texture_pixel_vulkan.cc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/flutter/shell/platform/tizen/external_texture_pixel_vulkan.cc b/flutter/shell/platform/tizen/external_texture_pixel_vulkan.cc index a7ee5ded..5fc7b80f 100644 --- a/flutter/shell/platform/tizen/external_texture_pixel_vulkan.cc +++ b/flutter/shell/platform/tizen/external_texture_pixel_vulkan.cc @@ -42,6 +42,12 @@ bool ExternalTexturePixelVulkan::PopulateVulkanTexture( return false; } + if (pixel_buffer->width == 0 || pixel_buffer->height == 0) { + FT_LOG(Error) << "Invalid pixel buffer dimensions: " << pixel_buffer->width + << "x" << pixel_buffer->height; + return false; + } + if (!CreateOrUpdateImage(pixel_buffer->width, pixel_buffer->height)) { FT_LOG(Error) << "Fail to create image"; ReleaseImage(); From 2f72eff9470292eda19bd26908ac8a427e5e6107 Mon Sep 17 00:00:00 2001 From: Xiaowei Guan Date: Mon, 22 Jun 2026 19:05:11 +0800 Subject: [PATCH 12/12] close bo fd if fail to bind image memory. --- .../platform/tizen/external_texture_surface_vulkan_buffer_dma.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/flutter/shell/platform/tizen/external_texture_surface_vulkan_buffer_dma.cc b/flutter/shell/platform/tizen/external_texture_surface_vulkan_buffer_dma.cc index e04f16c8..bbd22096 100644 --- a/flutter/shell/platform/tizen/external_texture_surface_vulkan_buffer_dma.cc +++ b/flutter/shell/platform/tizen/external_texture_surface_vulkan_buffer_dma.cc @@ -142,6 +142,7 @@ bool ExternalTextureSurfaceVulkanBufferDma::AllocateAndBindMemory( if (vkBindImageMemory(GetDevice(), texture_image_, texture_device_memory_, 0u) != VK_SUCCESS) { FT_LOG(Error) << "Fail to bind image memory"; + close(bo_fd); return false; } return true;