Allow customizing MultiPool options
These don't need to be constants. PiperOrigin-RevId: 488782713
This commit is contained in:
		
							parent
							
								
									f13903b7c5
								
							
						
					
					
						commit
						7ef3185ecb
					
				| 
						 | 
					@ -23,26 +23,12 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace mediapipe {
 | 
					namespace mediapipe {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Keep this many buffers allocated for a given frame size.
 | 
					 | 
				
			||||||
static constexpr int kKeepCount = 2;
 | 
					 | 
				
			||||||
// The maximum size of the GpuBufferMultiPool. When the limit is reached, the
 | 
					 | 
				
			||||||
// oldest BufferSpec will be dropped.
 | 
					 | 
				
			||||||
static constexpr int kMaxPoolCount = 10;
 | 
					 | 
				
			||||||
// Time in seconds after which an inactive buffer can be dropped from the pool.
 | 
					 | 
				
			||||||
// Currently only used with CVPixelBufferPool.
 | 
					 | 
				
			||||||
static constexpr float kMaxInactiveBufferAge = 0.25;
 | 
					 | 
				
			||||||
// Skip allocating a buffer pool until at least this many requests have been
 | 
					 | 
				
			||||||
// made for a given BufferSpec.
 | 
					 | 
				
			||||||
static constexpr int kMinRequestsBeforePool = 2;
 | 
					 | 
				
			||||||
// Do a deeper flush every this many requests.
 | 
					 | 
				
			||||||
static constexpr int kRequestCountScrubInterval = 50;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#if MEDIAPIPE_GPU_BUFFER_USE_CV_PIXEL_BUFFER
 | 
					#if MEDIAPIPE_GPU_BUFFER_USE_CV_PIXEL_BUFFER
 | 
				
			||||||
 | 
					
 | 
				
			||||||
std::shared_ptr<GpuBufferMultiPool::SimplePool>
 | 
					std::shared_ptr<GpuBufferMultiPool::SimplePool>
 | 
				
			||||||
GpuBufferMultiPool::MakeSimplePool(const GpuBufferMultiPool::BufferSpec& spec) {
 | 
					GpuBufferMultiPool::MakeSimplePool(const GpuBufferMultiPool::BufferSpec& spec) {
 | 
				
			||||||
  return std::make_shared<CvPixelBufferPoolWrapper>(
 | 
					  return std::make_shared<CvPixelBufferPoolWrapper>(
 | 
				
			||||||
      spec.width, spec.height, spec.format, kMaxInactiveBufferAge,
 | 
					      spec.width, spec.height, spec.format, options_.max_inactive_buffer_age,
 | 
				
			||||||
      flush_platform_caches_);
 | 
					      flush_platform_caches_);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -51,7 +37,7 @@ GpuBufferMultiPool::MakeSimplePool(const GpuBufferMultiPool::BufferSpec& spec) {
 | 
				
			||||||
std::shared_ptr<GpuBufferMultiPool::SimplePool>
 | 
					std::shared_ptr<GpuBufferMultiPool::SimplePool>
 | 
				
			||||||
GpuBufferMultiPool::MakeSimplePool(const BufferSpec& spec) {
 | 
					GpuBufferMultiPool::MakeSimplePool(const BufferSpec& spec) {
 | 
				
			||||||
  return GlTextureBufferPool::Create(spec.width, spec.height, spec.format,
 | 
					  return GlTextureBufferPool::Create(spec.width, spec.height, spec.format,
 | 
				
			||||||
                                     kKeepCount);
 | 
					                                     options_.keep_count);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif  // MEDIAPIPE_GPU_BUFFER_USE_CV_PIXEL_BUFFER
 | 
					#endif  // MEDIAPIPE_GPU_BUFFER_USE_CV_PIXEL_BUFFER
 | 
				
			||||||
| 
						 | 
					@ -64,11 +50,12 @@ std::shared_ptr<GpuBufferMultiPool::SimplePool> GpuBufferMultiPool::RequestPool(
 | 
				
			||||||
    absl::MutexLock lock(&mutex_);
 | 
					    absl::MutexLock lock(&mutex_);
 | 
				
			||||||
    pool =
 | 
					    pool =
 | 
				
			||||||
        cache_.Lookup(spec, [this](const BufferSpec& spec, int request_count) {
 | 
					        cache_.Lookup(spec, [this](const BufferSpec& spec, int request_count) {
 | 
				
			||||||
          return (request_count >= kMinRequestsBeforePool)
 | 
					          return (request_count >= options_.min_requests_before_pool)
 | 
				
			||||||
                     ? MakeSimplePool(spec)
 | 
					                     ? MakeSimplePool(spec)
 | 
				
			||||||
                     : nullptr;
 | 
					                     : nullptr;
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    evicted = cache_.Evict(kMaxPoolCount, kRequestCountScrubInterval);
 | 
					    evicted = cache_.Evict(options_.max_pool_count,
 | 
				
			||||||
 | 
					                           options_.request_count_scrub_interval);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  // Evicted pools, and their buffers, will be released without holding the
 | 
					  // Evicted pools, and their buffers, will be released without holding the
 | 
				
			||||||
  // lock.
 | 
					  // lock.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -42,9 +42,28 @@ namespace mediapipe {
 | 
				
			||||||
struct GpuSharedData;
 | 
					struct GpuSharedData;
 | 
				
			||||||
class CvPixelBufferPoolWrapper;
 | 
					class CvPixelBufferPoolWrapper;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct MultiPoolOptions {
 | 
				
			||||||
 | 
					  // Keep this many buffers allocated for a given frame size.
 | 
				
			||||||
 | 
					  int keep_count = 2;
 | 
				
			||||||
 | 
					  // The maximum size of the GpuBufferMultiPool. When the limit is reached, the
 | 
				
			||||||
 | 
					  // oldest BufferSpec will be dropped.
 | 
				
			||||||
 | 
					  int max_pool_count = 10;
 | 
				
			||||||
 | 
					  // Time in seconds after which an inactive buffer can be dropped from the
 | 
				
			||||||
 | 
					  // pool. Currently only used with CVPixelBufferPool.
 | 
				
			||||||
 | 
					  float max_inactive_buffer_age = 0.25;
 | 
				
			||||||
 | 
					  // Skip allocating a buffer pool until at least this many requests have been
 | 
				
			||||||
 | 
					  // made for a given BufferSpec.
 | 
				
			||||||
 | 
					  int min_requests_before_pool = 2;
 | 
				
			||||||
 | 
					  // Do a deeper flush every this many requests.
 | 
				
			||||||
 | 
					  int request_count_scrub_interval = 50;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static constexpr MultiPoolOptions kDefaultMultiPoolOptions;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class GpuBufferMultiPool {
 | 
					class GpuBufferMultiPool {
 | 
				
			||||||
 public:
 | 
					 public:
 | 
				
			||||||
  GpuBufferMultiPool() {}
 | 
					  GpuBufferMultiPool(MultiPoolOptions options = kDefaultMultiPoolOptions)
 | 
				
			||||||
 | 
					      : options_(options) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Obtains a buffer. May either be reused or created anew.
 | 
					  // Obtains a buffer. May either be reused or created anew.
 | 
				
			||||||
  GpuBuffer GetBuffer(int width, int height,
 | 
					  GpuBuffer GetBuffer(int width, int height,
 | 
				
			||||||
| 
						 | 
					@ -85,6 +104,7 @@ class GpuBufferMultiPool {
 | 
				
			||||||
  // pool, in which case the caller should invoke CreateBufferWithoutPool.
 | 
					  // pool, in which case the caller should invoke CreateBufferWithoutPool.
 | 
				
			||||||
  std::shared_ptr<SimplePool> RequestPool(const BufferSpec& spec);
 | 
					  std::shared_ptr<SimplePool> RequestPool(const BufferSpec& spec);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  MultiPoolOptions options_;
 | 
				
			||||||
  absl::Mutex mutex_;
 | 
					  absl::Mutex mutex_;
 | 
				
			||||||
  mediapipe::ResourceCache<BufferSpec, std::shared_ptr<SimplePool>> cache_
 | 
					  mediapipe::ResourceCache<BufferSpec, std::shared_ptr<SimplePool>> cache_
 | 
				
			||||||
      ABSL_GUARDED_BY(mutex_);
 | 
					      ABSL_GUARDED_BY(mutex_);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user