OSDN Git Service

Fix compose shader child local matrix mutation
authorChris Craik <ccraik@google.com>
Wed, 19 Apr 2017 17:38:14 +0000 (10:38 -0700)
committerChris Craik <ccraik@google.com>
Wed, 19 Apr 2017 17:57:25 +0000 (10:57 -0700)
Bug: 37495696
Test: cts-tradefed run singleCommand cts-dev --module CtsGraphicsTestCases --test android.graphics.cts.ComposeShaderTest

Adds back the verify step that discards a stale native ComposeShader if a child
changes.

Change-Id: I44f40c1edfdb7633994a69efb583cf28ee2c26b2

graphics/java/android/graphics/ComposeShader.java
graphics/java/android/graphics/Shader.java

index e107ea7..0b1141a 100644 (file)
@@ -76,6 +76,16 @@ public class ComposeShader extends Shader {
                 mShaderA.getNativeInstance(), mShaderB.getNativeInstance(), mPorterDuffMode);
     }
 
+    @Override
+    void verifyNativeInstance() {
+        if (mShaderA.getNativeInstance() != mNativeInstanceShaderA
+                || mShaderB.getNativeInstance() != mNativeInstanceShaderB) {
+            // Child shader native instance has been updated,
+            // so our cached native instance is no longer valid - discard it
+            discardNativeInstance();
+        }
+    }
+
     /**
      * @hide
      */
index c744757..8410ab2 100644 (file)
@@ -105,13 +105,20 @@ public class Shader {
         return 0;
     }
 
-    private void discardNativeInstance() {
+    void discardNativeInstance() {
         if (mNativeInstance != 0) {
             nativeSafeUnref(mNativeInstance);
             mNativeInstance = 0;
         }
     }
 
+    /**
+     * Callback for subclasses to call {@link #discardNativeInstance()} if the most recently
+     * constructed native instance is no longer valid.
+     */
+    void verifyNativeInstance() {
+    }
+
     @Override
     protected void finalize() throws Throwable {
         try {
@@ -148,6 +155,9 @@ public class Shader {
             throw new IllegalStateException("attempting to use a finalized Shader");
         }
 
+        // verify mNativeInstance is valid
+        verifyNativeInstance();
+
         if (mNativeInstance == 0) {
             mNativeInstance = createNativeInstance(mLocalMatrix == null
                     ? 0 : mLocalMatrix.native_instance);