Avoid DisplayList* hitting the JNI layer
Keep the actual display list type internal to HWUI/native avoids requiring that the recording type fits in a jlong aka, opens up a usage of value types here instead Test: boots Change-Id: Idf5a4acc7dbcb61e6742a6bf6369bd351f595be4
This commit is contained in:
@@ -71,8 +71,8 @@ public final class RecordingCanvas extends BaseRecordingCanvas {
|
||||
}
|
||||
|
||||
/*package*/
|
||||
long finishRecording() {
|
||||
return nFinishRecording(mNativeCanvasWrapper);
|
||||
void finishRecording(RenderNode node) {
|
||||
nFinishRecording(mNativeCanvasWrapper, node.mNativeRenderNode);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
@@ -251,7 +251,7 @@ public final class RecordingCanvas extends BaseRecordingCanvas {
|
||||
@CriticalNative
|
||||
private static native void nEnableZ(long renderer, boolean enableZ);
|
||||
@CriticalNative
|
||||
private static native long nFinishRecording(long renderer);
|
||||
private static native void nFinishRecording(long renderer, long renderNode);
|
||||
@CriticalNative
|
||||
private static native void nDrawRenderNode(long renderer, long renderNode);
|
||||
@CriticalNative
|
||||
|
||||
@@ -30,7 +30,6 @@ import android.view.View;
|
||||
import com.android.internal.util.ArrayUtils;
|
||||
|
||||
import dalvik.annotation.optimization.CriticalNative;
|
||||
import dalvik.annotation.optimization.FastNative;
|
||||
|
||||
import libcore.util.NativeAllocationRegistry;
|
||||
|
||||
@@ -406,8 +405,7 @@ public final class RenderNode {
|
||||
}
|
||||
RecordingCanvas canvas = mCurrentRecordingCanvas;
|
||||
mCurrentRecordingCanvas = null;
|
||||
long displayList = canvas.finishRecording();
|
||||
nSetDisplayList(mNativeRenderNode, displayList);
|
||||
canvas.finishRecording(this);
|
||||
canvas.recycle();
|
||||
}
|
||||
|
||||
@@ -438,7 +436,7 @@ public final class RenderNode {
|
||||
* obsolete resources after related resources are gone.
|
||||
*/
|
||||
public void discardDisplayList() {
|
||||
nSetDisplayList(mNativeRenderNode, 0);
|
||||
nDiscardDisplayList(mNativeRenderNode);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1528,19 +1526,13 @@ public final class RenderNode {
|
||||
|
||||
private static native void nEndAllAnimators(long renderNode);
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// @FastNative methods
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@FastNative
|
||||
private static native void nSetDisplayList(long renderNode, long newData);
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// @CriticalNative methods
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@CriticalNative
|
||||
private static native void nDiscardDisplayList(long renderNode);
|
||||
|
||||
@CriticalNative
|
||||
private static native boolean nIsValid(long renderNode);
|
||||
|
||||
|
||||
@@ -81,6 +81,10 @@ void RenderNode::setStagingDisplayList(DisplayList* displayList) {
|
||||
mStagingDisplayList = displayList;
|
||||
}
|
||||
|
||||
void RenderNode::discardStagingDisplayList() {
|
||||
setStagingDisplayList(nullptr);
|
||||
}
|
||||
|
||||
/**
|
||||
* This function is a simplified version of replay(), where we simply retrieve and log the
|
||||
* display list. This function should remain in sync with the replay() function.
|
||||
|
||||
@@ -101,6 +101,7 @@ public:
|
||||
enum ReplayFlag { kReplayFlag_ClipChildren = 0x1 };
|
||||
|
||||
void setStagingDisplayList(DisplayList* newData);
|
||||
void discardStagingDisplayList();
|
||||
|
||||
void output();
|
||||
int getUsageSize();
|
||||
|
||||
@@ -98,9 +98,11 @@ static void android_view_DisplayListCanvas_enableZ(CRITICAL_JNI_PARAMS_COMMA jlo
|
||||
canvas->enableZ(reorderEnable);
|
||||
}
|
||||
|
||||
static jlong android_view_DisplayListCanvas_finishRecording(CRITICAL_JNI_PARAMS_COMMA jlong canvasPtr) {
|
||||
static void android_view_DisplayListCanvas_finishRecording(
|
||||
CRITICAL_JNI_PARAMS_COMMA jlong canvasPtr, jlong renderNodePtr) {
|
||||
Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
|
||||
return reinterpret_cast<jlong>(canvas->finishRecording());
|
||||
RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
|
||||
renderNode->setStagingDisplayList(canvas->finishRecording());
|
||||
}
|
||||
|
||||
static void android_view_DisplayListCanvas_drawRenderNode(CRITICAL_JNI_PARAMS_COMMA jlong canvasPtr, jlong renderNodePtr) {
|
||||
@@ -157,7 +159,7 @@ static JNINativeMethod gMethods[] = {
|
||||
{ "nGetMaximumTextureWidth", "()I", (void*) android_view_DisplayListCanvas_getMaxTextureSize },
|
||||
{ "nGetMaximumTextureHeight", "()I", (void*) android_view_DisplayListCanvas_getMaxTextureSize },
|
||||
{ "nEnableZ", "(JZ)V", (void*) android_view_DisplayListCanvas_enableZ },
|
||||
{ "nFinishRecording", "(J)J", (void*) android_view_DisplayListCanvas_finishRecording },
|
||||
{ "nFinishRecording", "(JJ)V", (void*) android_view_DisplayListCanvas_finishRecording },
|
||||
{ "nDrawRenderNode", "(JJ)V", (void*) android_view_DisplayListCanvas_drawRenderNode },
|
||||
{ "nDrawTextureLayer", "(JJ)V", (void*) android_view_DisplayListCanvas_drawTextureLayer },
|
||||
{ "nDrawCircle", "(JJJJJ)V", (void*) android_view_DisplayListCanvas_drawCircleProps },
|
||||
|
||||
@@ -76,11 +76,9 @@ static jlong android_view_RenderNode_getNativeFinalizer(JNIEnv* env,
|
||||
return static_cast<jlong>(reinterpret_cast<uintptr_t>(&releaseRenderNode));
|
||||
}
|
||||
|
||||
static void android_view_RenderNode_setDisplayList(JNIEnv* env,
|
||||
jobject clazz, jlong renderNodePtr, jlong displayListPtr) {
|
||||
static void android_view_RenderNode_discardDisplayList(CRITICAL_JNI_PARAMS_COMMA jlong renderNodePtr) {
|
||||
RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
|
||||
DisplayList* newData = reinterpret_cast<DisplayList*>(displayListPtr);
|
||||
renderNode->setStagingDisplayList(newData);
|
||||
renderNode->discardStagingDisplayList();
|
||||
}
|
||||
|
||||
static jboolean android_view_RenderNode_isValid(CRITICAL_JNI_PARAMS_COMMA jlong renderNodePtr) {
|
||||
@@ -657,18 +655,11 @@ static const JNINativeMethod gMethods[] = {
|
||||
{ "nAddAnimator", "(JJ)V", (void*) android_view_RenderNode_addAnimator },
|
||||
{ "nEndAllAnimators", "(J)V", (void*) android_view_RenderNode_endAllAnimators },
|
||||
{ "nRequestPositionUpdates", "(JLandroid/graphics/RenderNode$PositionUpdateListener;)V", (void*) android_view_RenderNode_requestPositionUpdates },
|
||||
{ "nSetDisplayList", "(JJ)V", (void*) android_view_RenderNode_setDisplayList },
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Fast JNI via @CriticalNative annotation in RenderNode.java
|
||||
// ----------------------------------------------------------------------------
|
||||
{ "nSetDisplayList", "(JJ)V", (void*) android_view_RenderNode_setDisplayList },
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Critical JNI via @CriticalNative annotation in RenderNode.java
|
||||
// ----------------------------------------------------------------------------
|
||||
{ "nDiscardDisplayList", "(J)V", (void*) android_view_RenderNode_discardDisplayList },
|
||||
{ "nIsValid", "(J)Z", (void*) android_view_RenderNode_isValid },
|
||||
{ "nSetLayerType", "(JI)Z", (void*) android_view_RenderNode_setLayerType },
|
||||
{ "nGetLayerType", "(J)I", (void*) android_view_RenderNode_getLayerType },
|
||||
|
||||
Reference in New Issue
Block a user