Merge "Fix a crash caused by transaction" into sc-dev
This commit is contained in:
@@ -2610,16 +2610,6 @@ public final class SurfaceControl implements Parcelable {
|
|||||||
= sRegistry.registerNativeAllocation(this, mNativeObject);
|
= sRegistry.registerNativeAllocation(this, mNativeObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a transaction object that wraps a native peer.
|
|
||||||
* @hide
|
|
||||||
*/
|
|
||||||
Transaction(long nativeObject) {
|
|
||||||
mNativeObject = nativeObject;
|
|
||||||
mFreeNativeResources =
|
|
||||||
sRegistry.registerNativeAllocation(this, mNativeObject);
|
|
||||||
}
|
|
||||||
|
|
||||||
private Transaction(Parcel in) {
|
private Transaction(Parcel in) {
|
||||||
readFromParcel(in);
|
readFromParcel(in);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1371,8 +1371,12 @@ public final class ViewRootImpl implements ViewParent,
|
|||||||
HardwareRenderer.ASurfaceTransactionCallback callback = (nativeTransactionObj,
|
HardwareRenderer.ASurfaceTransactionCallback callback = (nativeTransactionObj,
|
||||||
nativeSurfaceControlObj,
|
nativeSurfaceControlObj,
|
||||||
frameNr) -> {
|
frameNr) -> {
|
||||||
Transaction t = new Transaction(nativeTransactionObj);
|
if (mBlastBufferQueue == null) {
|
||||||
mergeWithNextTransaction(t, frameNr);
|
return false;
|
||||||
|
} else {
|
||||||
|
mBlastBufferQueue.mergeWithNextTransaction(nativeTransactionObj, frameNr);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
mAttachInfo.mThreadedRenderer.setASurfaceTransactionCallback(callback);
|
mAttachInfo.mThreadedRenderer.setASurfaceTransactionCallback(callback);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -131,4 +131,12 @@ public final class BLASTBufferQueue {
|
|||||||
nativeMergeWithNextTransaction(mNativeObject, t.mNativeObject, frameNumber);
|
nativeMergeWithNextTransaction(mNativeObject, t.mNativeObject, frameNumber);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Merge the transaction passed in to the next transaction in BlastBufferQueue.
|
||||||
|
* @param nativeTransaction native handle passed from native c/c++ code.
|
||||||
|
*/
|
||||||
|
public void mergeWithNextTransaction(long nativeTransaction, long frameNumber) {
|
||||||
|
nativeMergeWithNextTransaction(mNativeObject, nativeTransaction, frameNumber);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -912,7 +912,7 @@ public class HardwareRenderer {
|
|||||||
* @param aSurfaceControlNativeObj ASurfaceControl native object handle
|
* @param aSurfaceControlNativeObj ASurfaceControl native object handle
|
||||||
* @param frame The id of the frame being drawn.
|
* @param frame The id of the frame being drawn.
|
||||||
*/
|
*/
|
||||||
void onMergeTransaction(long aSurfaceTranactionNativeObj,
|
boolean onMergeTransaction(long aSurfaceTranactionNativeObj,
|
||||||
long aSurfaceControlNativeObj, long frame);
|
long aSurfaceControlNativeObj, long frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -662,16 +662,18 @@ static void android_view_ThreadedRenderer_setASurfaceTransactionCallback(
|
|||||||
auto globalCallbackRef =
|
auto globalCallbackRef =
|
||||||
std::make_shared<JWeakGlobalRefHolder>(vm, aSurfaceTransactionCallback);
|
std::make_shared<JWeakGlobalRefHolder>(vm, aSurfaceTransactionCallback);
|
||||||
proxy->setASurfaceTransactionCallback(
|
proxy->setASurfaceTransactionCallback(
|
||||||
[globalCallbackRef](int64_t transObj, int64_t scObj, int64_t frameNr) {
|
[globalCallbackRef](int64_t transObj, int64_t scObj, int64_t frameNr) -> bool {
|
||||||
JNIEnv* env = getenv(globalCallbackRef->vm());
|
JNIEnv* env = getenv(globalCallbackRef->vm());
|
||||||
jobject localref = env->NewLocalRef(globalCallbackRef->ref());
|
jobject localref = env->NewLocalRef(globalCallbackRef->ref());
|
||||||
if (CC_UNLIKELY(!localref)) {
|
if (CC_UNLIKELY(!localref)) {
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
env->CallVoidMethod(localref, gASurfaceTransactionCallback.onMergeTransaction,
|
jboolean ret = env->CallBooleanMethod(
|
||||||
static_cast<jlong>(transObj), static_cast<jlong>(scObj),
|
localref, gASurfaceTransactionCallback.onMergeTransaction,
|
||||||
static_cast<jlong>(frameNr));
|
static_cast<jlong>(transObj), static_cast<jlong>(scObj),
|
||||||
|
static_cast<jlong>(frameNr));
|
||||||
env->DeleteLocalRef(localref);
|
env->DeleteLocalRef(localref);
|
||||||
|
return ret;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1064,7 +1066,7 @@ int register_android_view_ThreadedRenderer(JNIEnv* env) {
|
|||||||
jclass aSurfaceTransactionCallbackClass =
|
jclass aSurfaceTransactionCallbackClass =
|
||||||
FindClassOrDie(env, "android/graphics/HardwareRenderer$ASurfaceTransactionCallback");
|
FindClassOrDie(env, "android/graphics/HardwareRenderer$ASurfaceTransactionCallback");
|
||||||
gASurfaceTransactionCallback.onMergeTransaction =
|
gASurfaceTransactionCallback.onMergeTransaction =
|
||||||
GetMethodIDOrDie(env, aSurfaceTransactionCallbackClass, "onMergeTransaction", "(JJJ)V");
|
GetMethodIDOrDie(env, aSurfaceTransactionCallbackClass, "onMergeTransaction", "(JJJ)Z");
|
||||||
|
|
||||||
jclass prepareSurfaceControlForWebviewCallbackClass = FindClassOrDie(
|
jclass prepareSurfaceControlForWebviewCallbackClass = FindClassOrDie(
|
||||||
env, "android/graphics/HardwareRenderer$PrepareSurfaceControlForWebviewCallback");
|
env, "android/graphics/HardwareRenderer$PrepareSurfaceControlForWebviewCallback");
|
||||||
|
|||||||
@@ -910,9 +910,8 @@ CanvasContext* CanvasContext::getActiveContext() {
|
|||||||
|
|
||||||
bool CanvasContext::mergeTransaction(ASurfaceTransaction* transaction, ASurfaceControl* control) {
|
bool CanvasContext::mergeTransaction(ASurfaceTransaction* transaction, ASurfaceControl* control) {
|
||||||
if (!mASurfaceTransactionCallback) return false;
|
if (!mASurfaceTransactionCallback) return false;
|
||||||
std::invoke(mASurfaceTransactionCallback, reinterpret_cast<int64_t>(transaction),
|
return std::invoke(mASurfaceTransactionCallback, reinterpret_cast<int64_t>(transaction),
|
||||||
reinterpret_cast<int64_t>(control), getFrameNumber());
|
reinterpret_cast<int64_t>(control), getFrameNumber());
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CanvasContext::prepareSurfaceControlForWebview() {
|
void CanvasContext::prepareSurfaceControlForWebview() {
|
||||||
|
|||||||
@@ -206,7 +206,7 @@ public:
|
|||||||
ASurfaceControlStats* stats);
|
ASurfaceControlStats* stats);
|
||||||
|
|
||||||
void setASurfaceTransactionCallback(
|
void setASurfaceTransactionCallback(
|
||||||
const std::function<void(int64_t, int64_t, int64_t)>& callback) {
|
const std::function<bool(int64_t, int64_t, int64_t)>& callback) {
|
||||||
mASurfaceTransactionCallback = callback;
|
mASurfaceTransactionCallback = callback;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -317,7 +317,7 @@ private:
|
|||||||
// If set to true, we expect that callbacks into onSurfaceStatsAvailable
|
// If set to true, we expect that callbacks into onSurfaceStatsAvailable
|
||||||
bool mExpectSurfaceStats = false;
|
bool mExpectSurfaceStats = false;
|
||||||
|
|
||||||
std::function<void(int64_t, int64_t, int64_t)> mASurfaceTransactionCallback;
|
std::function<bool(int64_t, int64_t, int64_t)> mASurfaceTransactionCallback;
|
||||||
std::function<void()> mPrepareSurfaceControlForWebviewCallback;
|
std::function<void()> mPrepareSurfaceControlForWebviewCallback;
|
||||||
|
|
||||||
void cleanupResources();
|
void cleanupResources();
|
||||||
|
|||||||
@@ -314,7 +314,7 @@ void RenderProxy::setPictureCapturedCallback(
|
|||||||
}
|
}
|
||||||
|
|
||||||
void RenderProxy::setASurfaceTransactionCallback(
|
void RenderProxy::setASurfaceTransactionCallback(
|
||||||
const std::function<void(int64_t, int64_t, int64_t)>& callback) {
|
const std::function<bool(int64_t, int64_t, int64_t)>& callback) {
|
||||||
mRenderThread.queue().post(
|
mRenderThread.queue().post(
|
||||||
[this, cb = callback]() { mContext->setASurfaceTransactionCallback(cb); });
|
[this, cb = callback]() { mContext->setASurfaceTransactionCallback(cb); });
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -123,7 +123,7 @@ public:
|
|||||||
void setContentDrawBounds(int left, int top, int right, int bottom);
|
void setContentDrawBounds(int left, int top, int right, int bottom);
|
||||||
void setPictureCapturedCallback(const std::function<void(sk_sp<SkPicture>&&)>& callback);
|
void setPictureCapturedCallback(const std::function<void(sk_sp<SkPicture>&&)>& callback);
|
||||||
void setASurfaceTransactionCallback(
|
void setASurfaceTransactionCallback(
|
||||||
const std::function<void(int64_t, int64_t, int64_t)>& callback);
|
const std::function<bool(int64_t, int64_t, int64_t)>& callback);
|
||||||
void setPrepareSurfaceControlForWebviewCallback(const std::function<void()>& callback);
|
void setPrepareSurfaceControlForWebviewCallback(const std::function<void()>& callback);
|
||||||
void setFrameCallback(std::function<void(int64_t)>&& callback);
|
void setFrameCallback(std::function<void(int64_t)>&& callback);
|
||||||
void setFrameCompleteCallback(std::function<void(int64_t)>&& callback);
|
void setFrameCompleteCallback(std::function<void(int64_t)>&& callback);
|
||||||
|
|||||||
Reference in New Issue
Block a user