blob: f3716674c5b10999d5b5f9b5afdd4d19d7835311 [file] [log] [blame]
/*
* Copyright 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef _ANDROID_GRAPHICS_SURFACE_TEXTURE_PLATFORM_H
#define _ANDROID_GRAPHICS_SURFACE_TEXTURE_PLATFORM_H
#include <EGL/egl.h>
#include <EGL/eglext.h>
#include <nativehelper/JNIHelp.h>
#include <system/graphics.h>
// This file provides a facade API on top of SurfaceTexture, which avoids using
// C++ types. This is still a C++ unstable API though. Ideally features here
// will be exposed via public NDK API and this file will be deleted.
struct ASurfaceTexture;
namespace android {
// Trampoline functions allowing libandroid.so to define the NDK symbols without including
// the entirety of libnativedisplay as a whole static lib. As libnativedisplay
// maintains global state, libnativedisplay can never be directly statically
// linked so that global state won't be duplicated. This way libandroid.so can
// reroute the NDK methods into the implementations defined by libnativedisplay
ANativeWindow* ASurfaceTexture_routeAcquireANativeWindow(ASurfaceTexture* st);
int ASurfaceTexture_routeAttachToGLContext(ASurfaceTexture* st, uint32_t texName);
int ASurfaceTexture_routeDetachFromGLContext(ASurfaceTexture* st);
void ASurfaceTexture_routeRelease(ASurfaceTexture* st);
int ASurfaceTexture_routeUpdateTexImage(ASurfaceTexture* st);
void ASurfaceTexture_routeGetTransformMatrix(ASurfaceTexture* st, float mtx[16]);
int64_t ASurfaceTexture_routeGetTimestamp(ASurfaceTexture* st);
ASurfaceTexture* ASurfaceTexture_routeFromSurfaceTexture(JNIEnv* env, jobject surfacetexture);
/**
* ASurfaceTexture_getCurrentTextureTarget returns the texture target of the
* current texture.
*/
unsigned int ASurfaceTexture_getCurrentTextureTarget(ASurfaceTexture* st);
/**
* ASurfaceTexture_takeConsumerOwnership attaches an ASurfaceTexture that is
* currently in the 'detached' state to a consumer context.
*/
void ASurfaceTexture_takeConsumerOwnership(ASurfaceTexture* st);
/**
* ASurfaceTexture_releaseConsumerOwnership detaches a SurfaceTexture from
* a consumer context.
*/
void ASurfaceTexture_releaseConsumerOwnership(ASurfaceTexture* st);
/**
* Callback function needed by ASurfaceTexture_dequeueBuffer. It creates a
* fence that is signalled when the previous buffer is no longer in use by the
* consumer (usually HWUI RenderThread) and can be written to by the producer.
*/
typedef int (*ASurfaceTexture_createReleaseFence)(bool useFenceSync, EGLSyncKHR* eglFence,
EGLDisplay* display, int* releaseFence,
void* fencePassThroughHandle);
/**
* Callback function needed by ASurfaceTexture_dequeueBuffer. It waits for the
* new buffer fence to signal before issuing any draw commands.
*/
typedef int (*ASurfaceTexture_fenceWait)(int fence, void* fencePassThroughHandle);
/**
* ASurfaceTexture_dequeueBuffer returns the next available AHardwareBuffer.
* The caller gets ownership of the buffer and need to release it with
* AHardwareBuffer_release.
*/
AHardwareBuffer* ASurfaceTexture_dequeueBuffer(ASurfaceTexture* st, int* outSlotid,
android_dataspace* outDataspace,
float* outTransformMatrix, bool* outNewContent,
ASurfaceTexture_createReleaseFence createFence,
ASurfaceTexture_fenceWait fenceWait,
void* fencePassThroughHandle);
} // namespace android
#endif // _ANDROID_GRAPHICS_SURFACE_TEXTURE_PLATFORM_H