Move flush hook to CvPixelBufferPoolWrapper constructor
This unifies the implementation of GpuBufferMultiPool::GetBufferFromSimplePool. PiperOrigin-RevId: 488782173
This commit is contained in:
		
							parent
							
								
									a4fe3eb094
								
							
						
					
					
						commit
						0c4522cb9f
					
				|  | @ -23,18 +23,18 @@ | |||
| 
 | ||||
| namespace mediapipe { | ||||
| 
 | ||||
| CvPixelBufferPoolWrapper::CvPixelBufferPoolWrapper(int width, int height, | ||||
|                                                    GpuBufferFormat format, | ||||
|                                                    CFTimeInterval maxAge) { | ||||
| CvPixelBufferPoolWrapper::CvPixelBufferPoolWrapper( | ||||
|     int width, int height, GpuBufferFormat format, CFTimeInterval maxAge, | ||||
|     std::function<void(void)> flush_texture_caches) { | ||||
|   OSType cv_format = CVPixelFormatForGpuBufferFormat(format); | ||||
|   CHECK_NE(cv_format, -1) << "unsupported pixel format"; | ||||
|   pool_ = MakeCFHolderAdopting( | ||||
|       /* keep count is 0 because the age param keeps buffers around anyway */ | ||||
|       CreateCVPixelBufferPool(width, height, cv_format, 0, maxAge)); | ||||
|   flush_texture_caches_ = std::move(flush_texture_caches); | ||||
| } | ||||
| 
 | ||||
| CFHolder<CVPixelBufferRef> CvPixelBufferPoolWrapper::GetBuffer( | ||||
|     std::function<void(void)> flush) { | ||||
| CFHolder<CVPixelBufferRef> CvPixelBufferPoolWrapper::GetBuffer() { | ||||
|   CVPixelBufferRef buffer; | ||||
|   int threshold = 1; | ||||
|   NSMutableDictionary* auxAttributes = | ||||
|  | @ -47,12 +47,12 @@ CFHolder<CVPixelBufferRef> CvPixelBufferPoolWrapper::GetBuffer( | |||
|         kCFAllocatorDefault, *pool_, (__bridge CFDictionaryRef)auxAttributes, | ||||
|         &buffer); | ||||
|     if (err != kCVReturnWouldExceedAllocationThreshold) break; | ||||
|     if (flush && !tried_flushing) { | ||||
|     if (flush_texture_caches_ && !tried_flushing) { | ||||
|       // Call the flush function to potentially release old holds on buffers
 | ||||
|       // and try again to create a pixel buffer.
 | ||||
|       // This is used to flush CV texture caches, which may retain buffers until
 | ||||
|       // flushed.
 | ||||
|       flush(); | ||||
|       flush_texture_caches_(); | ||||
|       tried_flushing = true; | ||||
|     } else { | ||||
|       ++threshold; | ||||
|  |  | |||
|  | @ -32,8 +32,9 @@ namespace mediapipe { | |||
| class CvPixelBufferPoolWrapper { | ||||
|  public: | ||||
|   CvPixelBufferPoolWrapper(int width, int height, GpuBufferFormat format, | ||||
|                            CFTimeInterval maxAge); | ||||
|   CFHolder<CVPixelBufferRef> GetBuffer(std::function<void(void)> flush); | ||||
|                            CFTimeInterval maxAge, | ||||
|                            std::function<void(void)> flush_texture_caches); | ||||
|   CFHolder<CVPixelBufferRef> GetBuffer(); | ||||
| 
 | ||||
|   int GetBufferCount() const { return count_; } | ||||
|   std::string GetDebugString() const; | ||||
|  | @ -46,6 +47,7 @@ class CvPixelBufferPoolWrapper { | |||
|  private: | ||||
|   CFHolder<CVPixelBufferPoolRef> pool_; | ||||
|   int count_ = 0; | ||||
|   std::function<void(void)> flush_texture_caches_; | ||||
| }; | ||||
| 
 | ||||
| }  // namespace mediapipe
 | ||||
|  |  | |||
|  | @ -48,12 +48,8 @@ static constexpr int kRequestCountScrubInterval = 50; | |||
| std::shared_ptr<GpuBufferMultiPool::SimplePool> | ||||
| GpuBufferMultiPool::MakeSimplePool(const GpuBufferMultiPool::BufferSpec& spec) { | ||||
|   return std::make_shared<CvPixelBufferPoolWrapper>( | ||||
|       spec.width, spec.height, spec.format, kMaxInactiveBufferAge); | ||||
| } | ||||
| 
 | ||||
| GpuBuffer GpuBufferMultiPool::GetBufferFromSimplePool( | ||||
|     BufferSpec spec, GpuBufferMultiPool::SimplePool& pool) { | ||||
|   return GpuBuffer(pool.GetBuffer(flush_platform_caches_)); | ||||
|       spec.width, spec.height, spec.format, kMaxInactiveBufferAge, | ||||
|       flush_platform_caches_); | ||||
| } | ||||
| 
 | ||||
| #else | ||||
|  | @ -64,11 +60,6 @@ GpuBufferMultiPool::MakeSimplePool(const BufferSpec& spec) { | |||
|                                      kKeepCount); | ||||
| } | ||||
| 
 | ||||
| GpuBuffer GpuBufferMultiPool::GetBufferFromSimplePool( | ||||
|     BufferSpec spec, GpuBufferMultiPool::SimplePool& pool) { | ||||
|   return GpuBuffer(pool.GetBuffer()); | ||||
| } | ||||
| 
 | ||||
| #endif  // MEDIAPIPE_GPU_BUFFER_USE_CV_PIXEL_BUFFER
 | ||||
| 
 | ||||
| std::shared_ptr<GpuBufferMultiPool::SimplePool> GpuBufferMultiPool::RequestPool( | ||||
|  | @ -102,6 +93,11 @@ GpuBuffer GpuBufferMultiPool::GetBuffer(int width, int height, | |||
|   } | ||||
| } | ||||
| 
 | ||||
| GpuBuffer GpuBufferMultiPool::GetBufferFromSimplePool( | ||||
|     BufferSpec spec, GpuBufferMultiPool::SimplePool& pool) { | ||||
|   return GpuBuffer(pool.GetBuffer()); | ||||
| } | ||||
| 
 | ||||
| GpuBuffer GpuBufferMultiPool::GetBufferWithoutPool(const BufferSpec& spec) { | ||||
|   return GpuBuffer(SimplePool::CreateBufferWithoutPool(spec.width, spec.height, | ||||
|                                                        spec.format)); | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	Block a user