Remove std::shared_ptr<GpuBuffer> argument from GetRead/WriteView

PiperOrigin-RevId: 488813004
This commit is contained in:
Camillo Lugaresi 2022-11-15 18:33:04 -08:00 committed by Copybara-Service
parent 1c0a1d0aab
commit 13b4b825d7
8 changed files with 38 additions and 67 deletions

View File

@ -255,8 +255,7 @@ void GlTextureBuffer::WaitForConsumersOnGpu() {
// precisely, on only one GL context. // precisely, on only one GL context.
} }
GlTextureView GlTextureBuffer::GetReadView( GlTextureView GlTextureBuffer::GetReadView(internal::types<GlTextureView>,
internal::types<GlTextureView>, std::shared_ptr<GpuBuffer> gpu_buffer,
int plane) const { int plane) const {
auto gl_context = GlContext::GetCurrent(); auto gl_context = GlContext::GetCurrent();
CHECK(gl_context); CHECK(gl_context);
@ -269,12 +268,10 @@ GlTextureView GlTextureBuffer::GetReadView(
DidRead(texture.gl_context()->CreateSyncToken()); DidRead(texture.gl_context()->CreateSyncToken());
}; };
return GlTextureView(gl_context.get(), target(), name(), width(), height(), return GlTextureView(gl_context.get(), target(), name(), width(), height(),
std::move(gpu_buffer), plane, std::move(detach), plane, std::move(detach), nullptr);
nullptr);
} }
GlTextureView GlTextureBuffer::GetWriteView( GlTextureView GlTextureBuffer::GetWriteView(internal::types<GlTextureView>,
internal::types<GlTextureView>, std::shared_ptr<GpuBuffer> gpu_buffer,
int plane) { int plane) {
auto gl_context = GlContext::GetCurrent(); auto gl_context = GlContext::GetCurrent();
CHECK(gl_context); CHECK(gl_context);
@ -286,8 +283,7 @@ GlTextureView GlTextureBuffer::GetWriteView(
GlTextureView::DoneWritingFn done_writing = GlTextureView::DoneWritingFn done_writing =
[this](const GlTextureView& texture) { ViewDoneWriting(texture); }; [this](const GlTextureView& texture) { ViewDoneWriting(texture); };
return GlTextureView(gl_context.get(), target(), name(), width(), height(), return GlTextureView(gl_context.get(), target(), name(), width(), height(),
std::move(gpu_buffer), plane, nullptr, plane, nullptr, std::move(done_writing));
std::move(done_writing));
} }
void GlTextureBuffer::ViewDoneWriting(const GlTextureView& view) { void GlTextureBuffer::ViewDoneWriting(const GlTextureView& view) {
@ -364,7 +360,7 @@ static std::shared_ptr<GpuBufferStorageImageFrame> ConvertToImageFrame(
absl::make_unique<ImageFrame>(image_format, buf->width(), buf->height(), absl::make_unique<ImageFrame>(image_format, buf->width(), buf->height(),
ImageFrame::kGlDefaultAlignmentBoundary); ImageFrame::kGlDefaultAlignmentBoundary);
buf->GetProducerContext()->Run([buf, &output] { buf->GetProducerContext()->Run([buf, &output] {
auto view = buf->GetReadView(internal::types<GlTextureView>{}, nullptr, 0); auto view = buf->GetReadView(internal::types<GlTextureView>{}, 0);
ReadTexture(view, buf->format(), output->MutablePixelData(), ReadTexture(view, buf->format(), output->MutablePixelData(),
output->PixelDataSize()); output->PixelDataSize());
}); });
@ -393,9 +389,8 @@ static std::shared_ptr<GpuBufferStorageCvPixelBuffer> ConvertToCvPixelBuffer(
buf->width(), buf->height(), buf->format()); buf->width(), buf->height(), buf->format());
buf->GetProducerContext()->Run([buf, &output] { buf->GetProducerContext()->Run([buf, &output] {
TempGlFramebuffer framebuffer; TempGlFramebuffer framebuffer;
auto src = buf->GetReadView(internal::types<GlTextureView>{}, nullptr, 0); auto src = buf->GetReadView(internal::types<GlTextureView>{}, 0);
auto dst = auto dst = output->GetWriteView(internal::types<GlTextureView>{}, 0);
output->GetWriteView(internal::types<GlTextureView>{}, nullptr, 0);
CopyGlTexture(src, dst); CopyGlTexture(src, dst);
glFlush(); glFlush();
}); });

View File

@ -95,10 +95,8 @@ class GlTextureBuffer
GpuBufferFormat format() const { return format_; } GpuBufferFormat format() const { return format_; }
GlTextureView GetReadView(internal::types<GlTextureView>, GlTextureView GetReadView(internal::types<GlTextureView>,
std::shared_ptr<GpuBuffer> gpu_buffer,
int plane) const override; int plane) const override;
GlTextureView GetWriteView(internal::types<GlTextureView>, GlTextureView GetWriteView(internal::types<GlTextureView>,
std::shared_ptr<GpuBuffer> gpu_buffer,
int plane) override; int plane) override;
// If this texture is going to be used outside of the context that produced // If this texture is going to be used outside of the context that produced

View File

@ -65,8 +65,8 @@ class GlTextureView {
friend class GpuBufferStorageCvPixelBuffer; friend class GpuBufferStorageCvPixelBuffer;
friend class GpuBufferStorageAhwb; friend class GpuBufferStorageAhwb;
GlTextureView(GlContext* context, GLenum target, GLuint name, int width, GlTextureView(GlContext* context, GLenum target, GLuint name, int width,
int height, std::shared_ptr<GpuBuffer> gpu_buffer, int plane, int height, int plane, DetachFn detach,
DetachFn detach, DoneWritingFn done_writing) DoneWritingFn done_writing)
: gl_context_(context), : gl_context_(context),
target_(target), target_(target),
name_(name), name_(name),
@ -108,12 +108,8 @@ class ViewProvider<GlTextureView> {
// the same view implement the same signature. // the same view implement the same signature.
// Note that we allow different views to have custom signatures, providing // Note that we allow different views to have custom signatures, providing
// additional view-specific arguments that may be needed. // additional view-specific arguments that may be needed.
virtual GlTextureView GetReadView(types<GlTextureView>, virtual GlTextureView GetReadView(types<GlTextureView>, int plane) const = 0;
std::shared_ptr<GpuBuffer> gpu_buffer, virtual GlTextureView GetWriteView(types<GlTextureView>, int plane) = 0;
int plane) const = 0;
virtual GlTextureView GetWriteView(types<GlTextureView>,
std::shared_ptr<GpuBuffer> gpu_buffer,
int plane) = 0;
}; };
} // namespace internal } // namespace internal

View File

@ -106,8 +106,7 @@ class GpuBuffer {
template <class View, class... Args> template <class View, class... Args>
decltype(auto) GetReadView(Args... args) const { decltype(auto) GetReadView(Args... args) const {
return GetViewProviderOrDie<View>(false).GetReadView( return GetViewProviderOrDie<View>(false).GetReadView(
internal::types<View>{}, std::make_shared<GpuBuffer>(*this), internal::types<View>{}, std::forward<Args>(args)...);
std::forward<Args>(args)...);
} }
// Gets a write view of the specified type. The arguments depend on the // Gets a write view of the specified type. The arguments depend on the
@ -115,8 +114,7 @@ class GpuBuffer {
template <class View, class... Args> template <class View, class... Args>
decltype(auto) GetWriteView(Args... args) { decltype(auto) GetWriteView(Args... args) {
return GetViewProviderOrDie<View>(true).GetWriteView( return GetViewProviderOrDie<View>(true).GetWriteView(
internal::types<View>{}, std::make_shared<GpuBuffer>(*this), internal::types<View>{}, std::forward<Args>(args)...);
std::forward<Args>(args)...);
} }
// Attempts to access an underlying storage object of the specified type. // Attempts to access an underlying storage object of the specified type.

View File

@ -26,8 +26,7 @@ GpuBufferStorageCvPixelBuffer::GpuBufferStorageCvPixelBuffer(
} }
GlTextureView GpuBufferStorageCvPixelBuffer::GetTexture( GlTextureView GpuBufferStorageCvPixelBuffer::GetTexture(
std::shared_ptr<GpuBuffer> gpu_buffer, int plane, int plane, GlTextureView::DoneWritingFn done_writing) const {
GlTextureView::DoneWritingFn done_writing) const {
CVReturn err; CVReturn err;
auto gl_context = GlContext::GetCurrent(); auto gl_context = GlContext::GetCurrent();
CHECK(gl_context); CHECK(gl_context);
@ -60,33 +59,30 @@ GlTextureView GpuBufferStorageCvPixelBuffer::GetTexture(
cv_texture.adopt(cv_texture_temp); cv_texture.adopt(cv_texture_temp);
return GlTextureView( return GlTextureView(
gl_context.get(), CVOpenGLESTextureGetTarget(*cv_texture), gl_context.get(), CVOpenGLESTextureGetTarget(*cv_texture),
CVOpenGLESTextureGetName(*cv_texture), width(), height(), CVOpenGLESTextureGetName(*cv_texture), width(), height(), plane,
std::move(gpu_buffer), plane,
[cv_texture](mediapipe::GlTextureView&) { /* only retains cv_texture */ }, [cv_texture](mediapipe::GlTextureView&) { /* only retains cv_texture */ },
done_writing); done_writing);
#endif // TARGET_OS_OSX #endif // TARGET_OS_OSX
} }
GlTextureView GpuBufferStorageCvPixelBuffer::GetReadView( GlTextureView GpuBufferStorageCvPixelBuffer::GetReadView(
internal::types<GlTextureView>, std::shared_ptr<GpuBuffer> gpu_buffer, internal::types<GlTextureView>, int plane) const {
int plane) const { return GetTexture(plane, nullptr);
return GetTexture(std::move(gpu_buffer), plane, nullptr);
} }
GlTextureView GpuBufferStorageCvPixelBuffer::GetWriteView( GlTextureView GpuBufferStorageCvPixelBuffer::GetWriteView(
internal::types<GlTextureView>, std::shared_ptr<GpuBuffer> gpu_buffer, internal::types<GlTextureView>, int plane) {
int plane) { return GetTexture(plane, [this](const mediapipe::GlTextureView& view) {
return GetTexture( ViewDoneWriting(view);
std::move(gpu_buffer), plane, });
[this](const mediapipe::GlTextureView& view) { ViewDoneWriting(view); });
} }
std::shared_ptr<const ImageFrame> GpuBufferStorageCvPixelBuffer::GetReadView( std::shared_ptr<const ImageFrame> GpuBufferStorageCvPixelBuffer::GetReadView(
internal::types<ImageFrame>, std::shared_ptr<GpuBuffer> gpu_buffer) const { internal::types<ImageFrame>) const {
return CreateImageFrameForCVPixelBuffer(**this); return CreateImageFrameForCVPixelBuffer(**this);
} }
std::shared_ptr<ImageFrame> GpuBufferStorageCvPixelBuffer::GetWriteView( std::shared_ptr<ImageFrame> GpuBufferStorageCvPixelBuffer::GetWriteView(
internal::types<ImageFrame>, std::shared_ptr<GpuBuffer> gpu_buffer) { internal::types<ImageFrame>) {
return CreateImageFrameForCVPixelBuffer(**this); return CreateImageFrameForCVPixelBuffer(**this);
} }

View File

@ -19,11 +19,9 @@ class ViewProvider<CVPixelBufferRef> {
public: public:
virtual ~ViewProvider() = default; virtual ~ViewProvider() = default;
virtual CFHolder<CVPixelBufferRef> GetReadView( virtual CFHolder<CVPixelBufferRef> GetReadView(
internal::types<CVPixelBufferRef>, internal::types<CVPixelBufferRef>) const = 0;
std::shared_ptr<GpuBuffer> gpu_buffer) const = 0;
virtual CFHolder<CVPixelBufferRef> GetWriteView( virtual CFHolder<CVPixelBufferRef> GetWriteView(
internal::types<CVPixelBufferRef>, internal::types<CVPixelBufferRef>) = 0;
std::shared_ptr<GpuBuffer> gpu_buffer) = 0;
}; };
} // namespace internal } // namespace internal
@ -50,37 +48,30 @@ class GpuBufferStorageCvPixelBuffer
CVPixelBufferGetPixelFormatType(**this)); CVPixelBufferGetPixelFormatType(**this));
} }
GlTextureView GetReadView(internal::types<GlTextureView>, GlTextureView GetReadView(internal::types<GlTextureView>,
std::shared_ptr<GpuBuffer> gpu_buffer,
int plane) const override; int plane) const override;
GlTextureView GetWriteView(internal::types<GlTextureView>, GlTextureView GetWriteView(internal::types<GlTextureView>,
std::shared_ptr<GpuBuffer> gpu_buffer,
int plane) override; int plane) override;
std::shared_ptr<const ImageFrame> GetReadView( std::shared_ptr<const ImageFrame> GetReadView(
internal::types<ImageFrame>, internal::types<ImageFrame>) const override;
std::shared_ptr<GpuBuffer> gpu_buffer) const override;
std::shared_ptr<ImageFrame> GetWriteView( std::shared_ptr<ImageFrame> GetWriteView(
internal::types<ImageFrame>, internal::types<ImageFrame>) override;
std::shared_ptr<GpuBuffer> gpu_buffer) override;
CFHolder<CVPixelBufferRef> GetReadView( CFHolder<CVPixelBufferRef> GetReadView(
internal::types<CVPixelBufferRef>, internal::types<CVPixelBufferRef>) const override;
std::shared_ptr<GpuBuffer> gpu_buffer) const override;
CFHolder<CVPixelBufferRef> GetWriteView( CFHolder<CVPixelBufferRef> GetWriteView(
internal::types<CVPixelBufferRef>, internal::types<CVPixelBufferRef>) override;
std::shared_ptr<GpuBuffer> gpu_buffer) override;
private: private:
GlTextureView GetTexture(std::shared_ptr<GpuBuffer> gpu_buffer, int plane, GlTextureView GetTexture(int plane,
GlTextureView::DoneWritingFn done_writing) const; GlTextureView::DoneWritingFn done_writing) const;
void ViewDoneWriting(const GlTextureView& view); void ViewDoneWriting(const GlTextureView& view);
}; };
inline CFHolder<CVPixelBufferRef> GpuBufferStorageCvPixelBuffer::GetReadView( inline CFHolder<CVPixelBufferRef> GpuBufferStorageCvPixelBuffer::GetReadView(
internal::types<CVPixelBufferRef>, internal::types<CVPixelBufferRef>) const {
std::shared_ptr<GpuBuffer> gpu_buffer) const {
return *this; return *this;
} }
inline CFHolder<CVPixelBufferRef> GpuBufferStorageCvPixelBuffer::GetWriteView( inline CFHolder<CVPixelBufferRef> GpuBufferStorageCvPixelBuffer::GetWriteView(
internal::types<CVPixelBufferRef>, std::shared_ptr<GpuBuffer> gpu_buffer) { internal::types<CVPixelBufferRef>) {
return *this; return *this;
} }

View File

@ -29,13 +29,11 @@ class GpuBufferStorageImageFrame
std::shared_ptr<const ImageFrame> image_frame() const { return image_frame_; } std::shared_ptr<const ImageFrame> image_frame() const { return image_frame_; }
std::shared_ptr<ImageFrame> image_frame() { return image_frame_; } std::shared_ptr<ImageFrame> image_frame() { return image_frame_; }
std::shared_ptr<const ImageFrame> GetReadView( std::shared_ptr<const ImageFrame> GetReadView(
internal::types<ImageFrame>, internal::types<ImageFrame>) const override {
std::shared_ptr<GpuBuffer> gpu_buffer) const override {
return image_frame_; return image_frame_;
} }
std::shared_ptr<ImageFrame> GetWriteView( std::shared_ptr<ImageFrame> GetWriteView(
internal::types<ImageFrame>, internal::types<ImageFrame>) override {
std::shared_ptr<GpuBuffer> gpu_buffer) override {
return image_frame_; return image_frame_;
} }

View File

@ -12,9 +12,8 @@ class ViewProvider<ImageFrame> {
public: public:
virtual ~ViewProvider() = default; virtual ~ViewProvider() = default;
virtual std::shared_ptr<const ImageFrame> GetReadView( virtual std::shared_ptr<const ImageFrame> GetReadView(
types<ImageFrame>, std::shared_ptr<GpuBuffer> gpu_buffer) const = 0; types<ImageFrame>) const = 0;
virtual std::shared_ptr<ImageFrame> GetWriteView( virtual std::shared_ptr<ImageFrame> GetWriteView(types<ImageFrame>) = 0;
types<ImageFrame>, std::shared_ptr<GpuBuffer> gpu_buffer) = 0;
}; };
} // namespace internal } // namespace internal