@@ -37,14 +37,26 @@ bool ExternalTexturePixelVulkan::PopulateVulkanTexture(
3737 return false ;
3838 }
3939
40+ if (!pixel_buffer->buffer ) {
41+ FT_LOG (Error) << " pixel_buffer->buffer is nullptr" ;
42+ return false ;
43+ }
44+
45+ if (pixel_buffer->width == 0 || pixel_buffer->height == 0 ) {
46+ FT_LOG (Error) << " Invalid pixel buffer dimensions: " << pixel_buffer->width
47+ << " x" << pixel_buffer->height ;
48+ return false ;
49+ }
50+
4051 if (!CreateOrUpdateImage (pixel_buffer->width , pixel_buffer->height )) {
4152 FT_LOG (Error) << " Fail to create image" ;
4253 ReleaseImage ();
4354 return false ;
4455 }
4556
4657 VkDeviceSize required_staging_size =
47- pixel_buffer->width * pixel_buffer->height * 4 ;
58+ static_cast <VkDeviceSize>(pixel_buffer->width ) *
59+ static_cast <VkDeviceSize>(pixel_buffer->height ) * 4 ;
4860 if (!CreateOrUpdateBuffer (required_staging_size)) {
4961 FT_LOG (Error) << " Fail to create buffer" ;
5062 ReleaseBuffer ();
@@ -54,7 +66,10 @@ bool ExternalTexturePixelVulkan::PopulateVulkanTexture(
5466 width_ = pixel_buffer->width ;
5567 height_ = pixel_buffer->height ;
5668
57- CopyBufferToImage (pixel_buffer->buffer , required_staging_size);
69+ if (!CopyBufferToImage (pixel_buffer->buffer , required_staging_size)) {
70+ FT_LOG (Error) << " Failed to copy buffer to image" ;
71+ return false ;
72+ }
5873
5974 FlutterVulkanTexture* vulkan_texture =
6075 static_cast <FlutterVulkanTexture*>(flutter_texture);
@@ -127,27 +142,6 @@ bool ExternalTexturePixelVulkan::CreateImage(size_t width, size_t height) {
127142 return true ;
128143}
129144
130- bool ExternalTexturePixelVulkan::FindMemoryType (
131- uint32_t type_filter,
132- VkMemoryPropertyFlags properties,
133- uint32_t & index_out) {
134- VkPhysicalDeviceMemoryProperties memory_properties;
135- vkGetPhysicalDeviceMemoryProperties (
136- static_cast <VkPhysicalDevice>(
137- vulkan_renderer_->GetPhysicalDeviceHandle ()),
138- &memory_properties);
139-
140- for (uint32_t i = 0 ; i < memory_properties.memoryTypeCount ; i++) {
141- if ((type_filter & (1 << i)) &&
142- (memory_properties.memoryTypes [i].propertyFlags & properties) ==
143- properties) {
144- index_out = i;
145- return true ;
146- }
147- }
148- return false ;
149- }
150-
151145bool ExternalTexturePixelVulkan::CreateBuffer (VkDeviceSize required_size) {
152146 VkBufferCreateInfo buffer_info{};
153147 buffer_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO ;
@@ -194,13 +188,23 @@ void ExternalTexturePixelVulkan::ReleaseBuffer() {
194188 staging_buffer_size_ = 0 ;
195189}
196190
197- void ExternalTexturePixelVulkan::CopyBufferToImage (const uint8_t * src_buffer,
191+ bool ExternalTexturePixelVulkan::CopyBufferToImage (const uint8_t * src_buffer,
198192 VkDeviceSize size) {
199193 void * data;
200- vkMapMemory (GetDevice (), staging_buffer_memory_, 0 , size, 0 , &data);
194+ VkResult result =
195+ vkMapMemory (GetDevice (), staging_buffer_memory_, 0 , size, 0 , &data);
196+ if (result != VK_SUCCESS ) {
197+ FT_LOG (Error) << " Failed to map staging buffer memory" ;
198+ return false ;
199+ }
201200 memcpy (data, src_buffer, static_cast <size_t >(size));
202201 vkUnmapMemory (GetDevice (), staging_buffer_memory_);
202+
203203 VkCommandBuffer command_buffer = vulkan_renderer_->BeginSingleTimeCommands ();
204+ if (command_buffer == VK_NULL_HANDLE ) {
205+ FT_LOG (Error) << " Failed to begin single time commands" ;
206+ return false ;
207+ }
204208
205209 VkBufferImageCopy region{};
206210 region.bufferOffset = 0 ;
@@ -218,6 +222,7 @@ void ExternalTexturePixelVulkan::CopyBufferToImage(const uint8_t* src_buffer,
218222 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL , 1 , ®ion);
219223
220224 vulkan_renderer_->EndSingleTimeCommands (command_buffer);
225+ return true ;
221226}
222227
223228void ExternalTexturePixelVulkan::ReleaseImage () {
@@ -237,8 +242,8 @@ bool ExternalTexturePixelVulkan::AllocateMemory(
237242 VkDeviceMemory& memory,
238243 VkMemoryPropertyFlags properties) {
239244 uint32_t memory_type_index;
240- if (!FindMemoryType (memory_requirements.memoryTypeBits , properties ,
241- memory_type_index)) {
245+ if (!vulkan_renderer_-> FindMemoryType (memory_requirements.memoryTypeBits ,
246+ properties, & memory_type_index)) {
242247 FT_LOG (Error) << " Fail to find memory type" ;
243248 return false ;
244249 }
@@ -255,7 +260,7 @@ bool ExternalTexturePixelVulkan::AllocateMemory(
255260 return true ;
256261}
257262
258- VkDevice ExternalTexturePixelVulkan::GetDevice () {
263+ VkDevice ExternalTexturePixelVulkan::GetDevice () const {
259264 return static_cast <VkDevice>(vulkan_renderer_->GetDeviceHandle ());
260265}
261266
0 commit comments