Avi Drissman | 3e1a26c | 2022-09-15 20:26:03 | [diff] [blame] | 1 | // Copyright 2013 The Chromium Authors |
sievers@chromium.org | 1d01807 | 2013-03-06 04:23:28 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
sievers@chromium.org | ac0c7622 | 2013-04-24 08:00:11 | [diff] [blame] | 5 | #include "ui/gl/android/scoped_java_surface.h" |
sievers@chromium.org | 1d01807 | 2013-03-06 04:23:28 | [diff] [blame] | 6 | |
Bo Liu | 9eb4b6e | 2022-07-18 19:21:13 | [diff] [blame] | 7 | #include <utility> |
| 8 | |
Hans Wennborg | 8586102b | 2020-05-05 13:43:29 | [diff] [blame] | 9 | #include "base/check.h" |
yfriedman@chromium.org | 0fc0a2d4 | 2013-08-29 04:05:36 | [diff] [blame] | 10 | #include "ui/gl/android/surface_texture.h" |
Andrew Grieve | 4a42c22e | 2019-06-24 16:14:29 | [diff] [blame] | 11 | #include "ui/gl/surface_jni_headers/Surface_jni.h" |
sievers@chromium.org | 1d01807 | 2013-03-06 04:23:28 | [diff] [blame] | 12 | |
torne | 8656011 | 2016-08-04 15:59:04 | [diff] [blame] | 13 | using base::android::ScopedJavaLocalRef; |
| 14 | |
kylechar | 7a46384 | 2016-05-26 14:46:12 | [diff] [blame] | 15 | namespace gl { |
sievers@chromium.org | 1d01807 | 2013-03-06 04:23:28 | [diff] [blame] | 16 | |
Bo Liu | 6411add | 2022-12-14 21:10:37 | [diff] [blame] | 17 | ScopedJavaSurface::ScopedJavaSurface() = default; |
| 18 | ScopedJavaSurface::ScopedJavaSurface(std::nullptr_t) {} |
sievers@chromium.org | 1d01807 | 2013-03-06 04:23:28 | [diff] [blame] | 19 | |
| 20 | ScopedJavaSurface::ScopedJavaSurface( |
Bo Liu | 6411add | 2022-12-14 21:10:37 | [diff] [blame] | 21 | const base::android::JavaRef<jobject>& surface, |
| 22 | bool auto_release) |
| 23 | : auto_release_(auto_release), j_surface_(surface) { |
Sam Maier | 7fe12c1 | 2024-01-26 19:22:43 | [diff] [blame] | 24 | JNIEnv* env = jni_zero::AttachCurrentThread(); |
Andrew Grieve | 71703a9 | 2017-07-28 19:47:28 | [diff] [blame] | 25 | DCHECK(env->IsInstanceOf(surface.obj(), android_view_Surface_clazz(env))); |
sievers@chromium.org | 1d01807 | 2013-03-06 04:23:28 | [diff] [blame] | 26 | } |
| 27 | |
Bo Liu | 5479640 | 2018-08-21 03:13:54 | [diff] [blame] | 28 | ScopedJavaSurface::ScopedJavaSurface(const SurfaceTexture* surface_texture) { |
Sam Maier | 7fe12c1 | 2024-01-26 19:22:43 | [diff] [blame] | 29 | JNIEnv* env = jni_zero::AttachCurrentThread(); |
Andrew Grieve | 9050c42 | 2023-07-24 16:55:15 | [diff] [blame] | 30 | ScopedJavaLocalRef<jobject> tmp( |
| 31 | JNI_Surface::Java_Surface_Constructor__android_graphics_SurfaceTexture( |
| 32 | env, surface_texture->j_surface_texture())); |
sievers@chromium.org | 1d01807 | 2013-03-06 04:23:28 | [diff] [blame] | 33 | DCHECK(!tmp.is_null()); |
| 34 | j_surface_.Reset(tmp); |
| 35 | } |
| 36 | |
dcheng | e1b0277 | 2015-12-01 12:09:52 | [diff] [blame] | 37 | ScopedJavaSurface::ScopedJavaSurface(ScopedJavaSurface&& rvalue) { |
| 38 | MoveFrom(rvalue); |
qinmin@chromium.org | e886333 | 2013-05-31 18:32:54 | [diff] [blame] | 39 | } |
| 40 | |
dcheng | e1b0277 | 2015-12-01 12:09:52 | [diff] [blame] | 41 | ScopedJavaSurface& ScopedJavaSurface::operator=(ScopedJavaSurface&& rhs) { |
| 42 | MoveFrom(rhs); |
qinmin@chromium.org | e886333 | 2013-05-31 18:32:54 | [diff] [blame] | 43 | return *this; |
| 44 | } |
| 45 | |
sievers@chromium.org | 1d01807 | 2013-03-06 04:23:28 | [diff] [blame] | 46 | ScopedJavaSurface::~ScopedJavaSurface() { |
Bo Liu | 5479640 | 2018-08-21 03:13:54 | [diff] [blame] | 47 | ReleaseSurfaceIfNeeded(); |
| 48 | } |
| 49 | |
Bo Liu | 6411add | 2022-12-14 21:10:37 | [diff] [blame] | 50 | ScopedJavaSurface ScopedJavaSurface::CopyRetainOwnership() const { |
| 51 | return ScopedJavaSurface(j_surface_, /*auto_release=*/false); |
| 52 | } |
| 53 | |
Bo Liu | 5479640 | 2018-08-21 03:13:54 | [diff] [blame] | 54 | void ScopedJavaSurface::ReleaseSurfaceIfNeeded() { |
qinmin@chromium.org | e886333 | 2013-05-31 18:32:54 | [diff] [blame] | 55 | if (auto_release_ && !j_surface_.is_null()) { |
Sam Maier | 7fe12c1 | 2024-01-26 19:22:43 | [diff] [blame] | 56 | JNIEnv* env = jni_zero::AttachCurrentThread(); |
Sam Maier | 0a23ff6 | 2023-04-28 13:37:52 | [diff] [blame] | 57 | JNI_Surface::Java_Surface_release(env, j_surface_); |
sievers@chromium.org | 1d01807 | 2013-03-06 04:23:28 | [diff] [blame] | 58 | } |
| 59 | } |
| 60 | |
qinmin@chromium.org | e886333 | 2013-05-31 18:32:54 | [diff] [blame] | 61 | void ScopedJavaSurface::MoveFrom(ScopedJavaSurface& other) { |
Bo Liu | ce7d4bb | 2022-12-20 01:12:47 | [diff] [blame] | 62 | if (this == &other) { |
| 63 | return; |
| 64 | } |
Bo Liu | 5479640 | 2018-08-21 03:13:54 | [diff] [blame] | 65 | ReleaseSurfaceIfNeeded(); |
Bo Liu | 9eb4b6e | 2022-07-18 19:21:13 | [diff] [blame] | 66 | j_surface_ = std::move(other.j_surface_); |
qinmin@chromium.org | e886333 | 2013-05-31 18:32:54 | [diff] [blame] | 67 | auto_release_ = other.auto_release_; |
| 68 | } |
| 69 | |
qinmin@chromium.org | f938038 | 2013-07-04 02:47:47 | [diff] [blame] | 70 | bool ScopedJavaSurface::IsEmpty() const { |
qinmin@chromium.org | e886333 | 2013-05-31 18:32:54 | [diff] [blame] | 71 | return j_surface_.is_null(); |
| 72 | } |
| 73 | |
jcivelli | c9a96403 | 2016-10-17 18:22:20 | [diff] [blame] | 74 | bool ScopedJavaSurface::IsValid() const { |
Sam Maier | 7fe12c1 | 2024-01-26 19:22:43 | [diff] [blame] | 75 | JNIEnv* env = jni_zero::AttachCurrentThread(); |
Sam Maier | 0a23ff6 | 2023-04-28 13:37:52 | [diff] [blame] | 76 | return !IsEmpty() && JNI_Surface::Java_Surface_isValid(env, j_surface_); |
jcivelli | c9a96403 | 2016-10-17 18:22:20 | [diff] [blame] | 77 | } |
| 78 | |
kylechar | 7a46384 | 2016-05-26 14:46:12 | [diff] [blame] | 79 | } // namespace gl |