Register GlTextureBuffer pool with GpuBuffer
First crack at hooking up pools with the GpuBufferStorage system. Will most likely be superseded later, but for now this works with minimal code impact: just overwrite the factory for a storage type with one that uses the pool. PiperOrigin-RevId: 488783854
This commit is contained in:
		
							parent
							
								
									583d27636b
								
							
						
					
					
						commit
						1beca61650
					
				| 
						 | 
				
			
			@ -74,13 +74,17 @@ class GpuBufferStorageRegistry {
 | 
			
		|||
 | 
			
		||||
  template <class Storage>
 | 
			
		||||
  RegistryToken Register() {
 | 
			
		||||
    return Register(
 | 
			
		||||
    return RegisterFactory<Storage>(
 | 
			
		||||
        [](int width, int height,
 | 
			
		||||
           GpuBufferFormat format) -> std::shared_ptr<Storage> {
 | 
			
		||||
          return CreateStorage<Storage>(overload_priority<10>{}, width, height,
 | 
			
		||||
                                        format);
 | 
			
		||||
        },
 | 
			
		||||
        Storage::GetProviderTypes());
 | 
			
		||||
        });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  template <class Storage, class F>
 | 
			
		||||
  RegistryToken RegisterFactory(F&& factory) {
 | 
			
		||||
    return Register(factory, Storage::GetProviderTypes());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  template <class StorageFrom, class StorageTo, class F>
 | 
			
		||||
| 
						 | 
				
			
			@ -148,6 +152,13 @@ class GpuBufferStorageImpl : public GpuBufferStorage, public U... {
 | 
			
		|||
    return kHashes;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Exposing this as a function allows dependent initializers to call this to
 | 
			
		||||
  // ensure proper ordering.
 | 
			
		||||
  static GpuBufferStorageRegistry::RegistryToken RegisterOnce() {
 | 
			
		||||
    static auto registration = GpuBufferStorageRegistry::Get().Register<T>();
 | 
			
		||||
    return registration;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  virtual const void* down_cast(TypeId to) const override {
 | 
			
		||||
    return down_cast_impl(to, types<T, U...>{});
 | 
			
		||||
| 
						 | 
				
			
			@ -161,8 +172,7 @@ class GpuBufferStorageImpl : public GpuBufferStorage, public U... {
 | 
			
		|||
    return down_cast_impl(to, types<W...>{});
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  inline static auto registration =
 | 
			
		||||
      GpuBufferStorageRegistry::Get().Register<T>();
 | 
			
		||||
  inline static auto registration = RegisterOnce();
 | 
			
		||||
  using RequireStatics = ForceStaticInstantiation<®istration>;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -200,4 +200,34 @@ GpuSharedData::GpuSharedData() : GpuSharedData(kPlatformGlContextNone) {}
 | 
			
		|||
MPPGraphGPUData* GpuResources::ios_gpu_data() { return ios_gpu_data_; }
 | 
			
		||||
#endif  // __APPLE__
 | 
			
		||||
 | 
			
		||||
extern const GraphService<GpuResources> kGpuService;
 | 
			
		||||
 | 
			
		||||
#if !MEDIAPIPE_GPU_BUFFER_USE_CV_PIXEL_BUFFER
 | 
			
		||||
static std::shared_ptr<GlTextureBuffer> GetGlTextureBufferFromPool(
 | 
			
		||||
    int width, int height, GpuBufferFormat format) {
 | 
			
		||||
  std::shared_ptr<GlTextureBuffer> texture_buffer;
 | 
			
		||||
  const auto cc = LegacyCalculatorSupport::Scoped<CalculatorContext>::current();
 | 
			
		||||
 | 
			
		||||
  if (cc && cc->Service(kGpuService).IsAvailable()) {
 | 
			
		||||
    GpuBufferMultiPool* pool =
 | 
			
		||||
        &cc->Service(kGpuService).GetObject().gpu_buffer_pool();
 | 
			
		||||
    // Note that the "gpu_buffer_pool" serves GlTextureBuffers on non-Apple
 | 
			
		||||
    // platforms. TODO: refactor into storage pools.
 | 
			
		||||
    texture_buffer = pool->GetBuffer(width, height, format)
 | 
			
		||||
                         .internal_storage<GlTextureBuffer>();
 | 
			
		||||
  } else {
 | 
			
		||||
    texture_buffer = GlTextureBuffer::Create(width, height, format);
 | 
			
		||||
  }
 | 
			
		||||
  return texture_buffer;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static auto kGlTextureBufferPoolRegistration = [] {
 | 
			
		||||
  // Ensure that the GlTextureBuffer's own factory is already registered, so we
 | 
			
		||||
  // can override it.
 | 
			
		||||
  GlTextureBuffer::RegisterOnce();
 | 
			
		||||
  return internal::GpuBufferStorageRegistry::Get()
 | 
			
		||||
      .RegisterFactory<GlTextureBuffer>(GetGlTextureBufferFromPool);
 | 
			
		||||
}();
 | 
			
		||||
#endif  // !MEDIAPIPE_GPU_BUFFER_USE_CV_PIXEL_BUFFER
 | 
			
		||||
 | 
			
		||||
}  // namespace mediapipe
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue
	
	Block a user