blob: 8be9def20f206b1256728520e2e954b43b4aaaf0 [file] [log] [blame]
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "shared_image_representation_gl_texture_passthrough_android.h"
#include "gpu/command_buffer/service/texture_manager.h"
#include "gpu/ipc/common/android/android_image_reader_utils.h"
namespace gpu {
SharedImageRepresentationGLTexturePassthroughAndroid::
SharedImageRepresentationGLTexturePassthroughAndroid(
SharedImageManager* manager,
SharedImageBackingAndroid* backing,
MemoryTypeTracker* tracker,
scoped_refptr<gles2::TexturePassthrough> texture)
: SharedImageRepresentationGLTexturePassthrough(manager, backing, tracker),
texture_(std::move(texture)) {
// TODO(https://crbug.com/1172769): Remove this CHECK.
CHECK(texture_);
}
SharedImageRepresentationGLTexturePassthroughAndroid::
~SharedImageRepresentationGLTexturePassthroughAndroid() {
EndAccess();
if (!has_context())
texture_->MarkContextLost();
}
const scoped_refptr<gles2::TexturePassthrough>&
SharedImageRepresentationGLTexturePassthroughAndroid::GetTexturePassthrough() {
return texture_;
}
bool SharedImageRepresentationGLTexturePassthroughAndroid::BeginAccess(
GLenum mode) {
bool read_only_mode = (mode == GL_SHARED_IMAGE_ACCESS_MODE_READ_CHROMIUM) ||
(mode == GL_SHARED_IMAGE_ACCESS_MODE_OVERLAY_CHROMIUM);
bool read_write_mode =
(mode == GL_SHARED_IMAGE_ACCESS_MODE_READWRITE_CHROMIUM);
DCHECK(read_only_mode || read_write_mode);
if (read_only_mode) {
base::ScopedFD write_sync_fd;
if (!android_backing()->BeginRead(this, &write_sync_fd))
return false;
if (!InsertEglFenceAndWait(std::move(write_sync_fd)))
return false;
} else {
base::ScopedFD sync_fd;
if (!android_backing()->BeginWrite(&sync_fd))
return false;
if (!InsertEglFenceAndWait(std::move(sync_fd)))
return false;
}
if (read_only_mode)
mode_ = RepresentationAccessMode::kRead;
else
mode_ = RepresentationAccessMode::kWrite;
return true;
}
void SharedImageRepresentationGLTexturePassthroughAndroid::EndAccess() {
if (mode_ == RepresentationAccessMode::kNone)
return;
base::ScopedFD sync_fd = CreateEglFenceAndExportFd();
// Pass this fd to its backing.
if (mode_ == RepresentationAccessMode::kRead) {
android_backing()->EndRead(this, std::move(sync_fd));
} else if (mode_ == RepresentationAccessMode::kWrite) {
android_backing()->EndWrite(std::move(sync_fd));
}
mode_ = RepresentationAccessMode::kNone;
}
} // namespace gpu