Stream API: add support for acquire / release semantics.
Previously, Streams had two modes (native and texid), this adds a third mode called "acquired", which allows for copy-free synchronized external textures in OpenGL and paves the way for Vulkan. The native mode is now deprecated but texid mode needs to stay around until all clients can be upgraded. In an early prototype, this functionality was added directly into Texture but required quite a bit of additional state tracking, so the Stream API seemed like a better fit. This API is probably not necessary for Metal due to Metal's shared ownership semantics. This has been tested with a new Android sample that will be added in a subsequent PR.
This commit is contained in:
@@ -24,6 +24,26 @@
|
||||
#include "common/NioUtils.h"
|
||||
#include "common/CallbackUtils.h"
|
||||
|
||||
#ifdef ANDROID
|
||||
|
||||
#if __has_include(<android/hardware_buffer_jni.h>)
|
||||
#include <android/hardware_buffer_jni.h>
|
||||
#else
|
||||
struct AHardwareBuffer;
|
||||
typedef struct AHardwareBuffer AHardwareBuffer;
|
||||
#endif
|
||||
|
||||
#include <android/log.h>
|
||||
|
||||
#include <dlfcn.h>
|
||||
|
||||
template <typename T>
|
||||
static void loadSymbol(T*& pfn, const char *symbol) noexcept {
|
||||
pfn = (T*)dlsym(RTLD_DEFAULT, symbol);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
using namespace filament;
|
||||
using namespace backend;
|
||||
|
||||
@@ -108,10 +128,10 @@ Java_com_google_android_filament_Stream_nBuilderBuild(JNIEnv*, jclass,
|
||||
return (jlong) builder->builder()->build(*engine);
|
||||
}
|
||||
|
||||
extern "C" JNIEXPORT jboolean JNICALL
|
||||
Java_com_google_android_filament_Stream_nIsNative(JNIEnv*, jclass, jlong nativeStream) {
|
||||
extern "C" JNIEXPORT jint JNICALL
|
||||
Java_com_google_android_filament_Stream_nGetStreamType(JNIEnv*, jclass, jlong nativeStream) {
|
||||
Stream* stream = (Stream*) nativeStream;
|
||||
return (jboolean) stream->isNativeStream();
|
||||
return (jint) stream->getStreamType();
|
||||
}
|
||||
|
||||
extern "C" JNIEXPORT void JNICALL
|
||||
@@ -160,3 +180,34 @@ Java_com_google_android_filament_Stream_nGetTimestamp(JNIEnv*, jclass, jlong nat
|
||||
Stream *stream = (Stream *) nativeStream;
|
||||
return stream->getTimestamp();
|
||||
}
|
||||
|
||||
extern "C" JNIEXPORT void JNICALL
|
||||
Java_com_google_android_filament_Stream_nSetAcquiredImage(JNIEnv* env, jclass, jlong nativeStream,
|
||||
jlong nativeEngine, jobject hwbuffer, jobject handler, jobject runnable) {
|
||||
Engine* engine = (Engine*) nativeEngine;
|
||||
Stream* stream = (Stream*) nativeStream;
|
||||
|
||||
#ifdef ANDROID
|
||||
|
||||
AHardwareBuffer* (*AHardwareBuffer_fromHardwareBuffer)(JNIEnv*, jobject);
|
||||
loadSymbol(AHardwareBuffer_fromHardwareBuffer, "AHardwareBuffer_fromHardwareBuffer");
|
||||
|
||||
AHardwareBuffer* nativeBuffer = AHardwareBuffer_fromHardwareBuffer(env, hwbuffer);
|
||||
if (!nativeBuffer) {
|
||||
__android_log_print(ANDROID_LOG_INFO, "Filament", "Unable to obtain native HardwareBuffer.");
|
||||
return;
|
||||
}
|
||||
|
||||
auto* callback = JniImageCallback::make(engine, env, handler, runnable, (long) nativeBuffer);
|
||||
|
||||
#else
|
||||
|
||||
// TODO: for non-Android platforms, it is unclear how to go from "jobject" to "void*"
|
||||
// For now this code is reserved for future use.
|
||||
auto* callback = JniImageCallback::make(engine, env, handler, runnable, 0);
|
||||
void* nativeBuffer = nullptr;
|
||||
|
||||
#endif
|
||||
|
||||
stream->setAcquiredImage((void*) nativeBuffer, &JniImageCallback::invoke, callback);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user