diff options
-rw-r--r-- | Android.bp | 1 | ||||
-rw-r--r-- | platform_tools/android/apps/skqp/src/main/Android.bp | 24 | ||||
-rw-r--r-- | platform_tools/android/apps/skqp/src/main/Android.mk | 18 | ||||
-rw-r--r-- | platform_tools/android/apps/skqp/src/main/AndroidTest.xml | 1 | ||||
-rw-r--r-- | platform_tools/android/apps/skqp/src/main/assets/skqp/rendertests.txt | 44 | ||||
-rw-r--r-- | platform_tools/android/apps/skqp/src/main/assets/skqp/unittests.txt | 1 | ||||
-rw-r--r-- | platform_tools/android/apps/skqp/src/main/java/org/skia/skqp/SkQPRunner.java | 42 | ||||
-rw-r--r-- | src/core/SkRecord.h | 14 | ||||
-rw-r--r-- | src/gpu/gradients/GrLinearGradientLayout.cpp | 6 | ||||
-rw-r--r-- | src/gpu/gradients/GrLinearGradientLayout.fp | 9 | ||||
-rw-r--r-- | src/gpu/vk/GrVkCaps.cpp | 41 | ||||
-rw-r--r-- | src/gpu/vk/GrVkGpu.cpp | 15 | ||||
-rw-r--r-- | tests/GrCCPRTest.cpp | 2 | ||||
-rw-r--r-- | tests/VkHardwareBufferTest.cpp | 3 | ||||
-rwxr-xr-x | tools/skqp/gn_to_bp.py | 3 | ||||
-rwxr-xr-x | tools/skqp/release.sh | 2 |
16 files changed, 144 insertions, 82 deletions
diff --git a/Android.bp b/Android.bp index ae3406e566..9888fc739b 100644 --- a/Android.bp +++ b/Android.bp @@ -15,7 +15,6 @@ cc_library_shared { "-D_FORTIFY_SOURCE=1", "-Wall", "-Werror", - "-Weverything", "-Wextra", "-Winit-self", "-Wno-bad-function-cast", diff --git a/platform_tools/android/apps/skqp/src/main/Android.bp b/platform_tools/android/apps/skqp/src/main/Android.bp new file mode 100644 index 0000000000..5df47bd8b5 --- /dev/null +++ b/platform_tools/android/apps/skqp/src/main/Android.bp @@ -0,0 +1,24 @@ +// Copyright 2019 Google LLC. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +android_test { + name: "CtsSkQPTestCases", + defaults: ["cts_defaults"], + + test_suites: [ + "cts", + "vts10", + "general-tests", + ], + libs: ["android.test.runner.stubs"], + jni_libs: ["libskqp_app"], + compile_multilib: "both", + + static_libs: [ + "android-support-design", + "ctstestrunner-axt", + ], + srcs: ["java/**/*.java"], + sdk_version: "test_current", +} diff --git a/platform_tools/android/apps/skqp/src/main/Android.mk b/platform_tools/android/apps/skqp/src/main/Android.mk deleted file mode 100644 index 18f4a5548a..0000000000 --- a/platform_tools/android/apps/skqp/src/main/Android.mk +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright 2019 Google LLC. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) -LOCAL_MODULE_TAGS := tests optional -LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS) -LOCAL_COMPATIBILITY_SUITE := cts vts general-tests -LOCAL_JAVA_LIBRARIES := android.test.runner.stubs -LOCAL_JNI_SHARED_LIBRARIES := libskqp_app -LOCAL_MULTILIB := both -LOCAL_USE_AAPT2 := true -LOCAL_STATIC_ANDROID_LIBRARIES := android-support-design -LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner-axt -LOCAL_SRC_FILES := $(call all-java-files-under, java) -LOCAL_PACKAGE_NAME := CtsSkQPTestCases -LOCAL_SDK_VERSION := test_current -include $(BUILD_CTS_PACKAGE) diff --git a/platform_tools/android/apps/skqp/src/main/AndroidTest.xml b/platform_tools/android/apps/skqp/src/main/AndroidTest.xml index b73ab49d4a..670015b5bf 100644 --- a/platform_tools/android/apps/skqp/src/main/AndroidTest.xml +++ b/platform_tools/android/apps/skqp/src/main/AndroidTest.xml @@ -10,6 +10,7 @@ found in the LICENSE file. <option name="config-descriptor:metadata" key="component" value="uitoolkit" /> <option name="config-descriptor:metadata" key="parameter" value="not_instant_app" /> <option name="config-descriptor:metadata" key="parameter" value="multi_abi" /> +<option name="config-descriptor:metadata" key="parameter" value="secondary_user" /> <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller"> <option name="cleanup-apks" value="true" /> <option name="test-file-name" value="CtsSkQPTestCases.apk" /> diff --git a/platform_tools/android/apps/skqp/src/main/assets/skqp/rendertests.txt b/platform_tools/android/apps/skqp/src/main/assets/skqp/rendertests.txt index 79eb3f09bf..618310ff22 100644 --- a/platform_tools/android/apps/skqp/src/main/assets/skqp/rendertests.txt +++ b/platform_tools/android/apps/skqp/src/main/assets/skqp/rendertests.txt @@ -28,7 +28,7 @@ arcofzorro,-1 arcs_as_paths,-1 arcto,-1 arithmode,0 -atlastext,0 +atlastext,2 b_119394958,-1 badpaint,-1 bezier_conic_effects,-1 @@ -39,8 +39,8 @@ big_rrect_circular_corner_aa_effect,-1 big_rrect_ellipse_aa_effect,-1 big_rrect_elliptical_corner_aa_effect,-1 big_rrect_rect_aa_effect,-1 -bigbitmaprect_i,0 -bigbitmaprect_s,0 +bigbitmaprect_i,1 +bigbitmaprect_s,1 bigblurs,-1 bigconic,-1 bigmatrix,-1 @@ -86,14 +86,14 @@ blurroundrect-WH-100x100-unevenCorners,-1 blurs,-1 bmp_filter_quality_repeat,-1 bug339297,0 -bug339297_as_clip,0 +bug339297_as_clip,1 bug5099,-1 bug5252,-1 bug530095,-1 bug583299,0 bug591993,0 bug593049,0 -bug6083,0 +bug6083,1 bug615686,-1 bug6643,0 bug6783,0 @@ -170,7 +170,7 @@ composeshader,0 composeshader_alpha,0 composeshader_bitmap,0 composeshader_bitmap2,-1 -composeshader_grid,0 +composeshader_grid,1 concavepaths,-1 conicpaths,-1 const_color_processor,-1 @@ -357,7 +357,7 @@ gradients_no_texture_nodither,-1 gradients_nodither,-1 gradients_view_perspective,-1 gradients_view_perspective_nodither,-1 -gradtext,0 +gradtext,1 grayscalejpg,0 hairlines,-1 hairmodes,-1 @@ -380,9 +380,9 @@ imagealphathreshold_crop,0 imagealphathreshold_image,-1 imagealphathreshold_surface,0 imageblur,-1 -imageblur2,0 +imageblur2,2 imageblur_large,0 -imageblurclampmode,0 +imageblurclampmode,1 imageblurrepeatmode,0 imageblurtiled,0 imagefilters_xfermodes,-1 @@ -390,7 +390,7 @@ imagefiltersbase,-1 imagefiltersclipped,-1 imagefilterscropexpand,-1 imagefilterscropped,-1 -imagefiltersgraph,0 +imagefiltersgraph,1 imagefiltersscaled,-1 imagefiltersstroked,-1 imagefilterstransformed,-1 @@ -446,9 +446,9 @@ manyrrects,-1 matrixconvolution,-1 matrixconvolution_color,-1 matriximagefilter,-1 -megalooper_0x0,0 -megalooper_1x4,0 -megalooper_4x1,0 +megalooper_0x0,1 +megalooper_1x4,1 +megalooper_4x1,1 mipmap,-1 mipmap_gray8_srgb,0 mipmap_srgb,0 @@ -480,7 +480,7 @@ nonclosedpaths,-1 not_native32_bitmap_config,0 offsetimagefilter,0 onebadarc,0 -orientation,0 +orientation,1 ovals,-1 ovals_as_paths,-1 overdrawcolorfilter,0 @@ -560,14 +560,14 @@ savelayer_initfromprev,-1 savelayer_maskfilter,-1 savelayer_unclipped,0 savelayer_with_backdrop,-1 -scale-pixels,0 +scale-pixels,-1 scaled_tilemode_bitmap,0 scaled_tilemode_gradient,0 -scaled_tilemodes,0 +scaled_tilemodes,1 scaled_tilemodes_npot,-1 -scaledemoji,0 +scaledemoji,1 scaledemoji_rendering,-1 -scaledemojipos,0 +scaledemojipos,1 scaledstrokes,-1 scalepixels_unpremul,0 shadermaskfilter_gradient,-1 @@ -619,7 +619,7 @@ smallarc,-1 smallpaths,-1 spritebitmap,0 squarehair,-1 -srcmode,0 +srcmode,1 srgb_colorfilter,0 stlouisarch,-1 stringart,-1 @@ -645,7 +645,7 @@ teenyStrokes,-1 testgradient,-1 text_scale_skew,-1 textblob,-1 -textblob_intercepts,0 +textblob_intercepts,1 textblobblockreordering,0 textblobcolortrans,0 textblobgeometrychange,-1 @@ -691,15 +691,13 @@ varied_text_ignorable_clip_no_lcd,-1 vertices,-1 vertices_batching,-1 vertices_scaled_shader,-1 -verylarge_picture_image,-1 -verylargebitmap,-1 wacky_yuv_formats,0 wacky_yuv_formats_cs,0 windowrectangles,-1 windowrectangles_mask,-1 xfermodeimagefilter,-1 xfermodes,-1 -xfermodes2,0 +xfermodes2,1 xfermodes3,0 yuv_nv12_to_rgb_effect,-1 yuv_to_rgb_effect,-1 diff --git a/platform_tools/android/apps/skqp/src/main/assets/skqp/unittests.txt b/platform_tools/android/apps/skqp/src/main/assets/skqp/unittests.txt index 3a9640896a..cda34eae32 100644 --- a/platform_tools/android/apps/skqp/src/main/assets/skqp/unittests.txt +++ b/platform_tools/android/apps/skqp/src/main/assets/skqp/unittests.txt @@ -76,7 +76,6 @@ GrWrappedMipMappedTest HalfFloatAlphaTextureTest HalfFloatRGBATextureTest ImageEncode_Gpu -ImageFilterBlurLargeImage_Gpu ImageFilterCache_GPUBacked ImageFilterCache_ImageBackedGPU ImageFilterClippedPictureImageFilter_Gpu diff --git a/platform_tools/android/apps/skqp/src/main/java/org/skia/skqp/SkQPRunner.java b/platform_tools/android/apps/skqp/src/main/java/org/skia/skqp/SkQPRunner.java index 8e360c8840..e65d618d7d 100644 --- a/platform_tools/android/apps/skqp/src/main/java/org/skia/skqp/SkQPRunner.java +++ b/platform_tools/android/apps/skqp/src/main/java/org/skia/skqp/SkQPRunner.java @@ -29,6 +29,7 @@ import org.junit.runner.notification.RunNotifier; public class SkQPRunner extends Runner implements Filterable { private int mShouldRunTestCount; private Description[] mTests; + private Description mDescription; private boolean[] mShouldSkipTest; private String mOutputDirectory; private SkQP mImpl; @@ -52,8 +53,9 @@ public class SkQPRunner extends Runner implements Filterable { AssetManager assetManager = context.getResources().getAssets(); mImpl.nInit(assetManager, mOutputDirectory); - mTests = new Description[this.testCount()]; - mShouldSkipTest = new boolean[mTests.length]; // = {false, false, ....}; + int totalCount = mImpl.mUnitTests.length + mImpl.mGMs.length * mImpl.mBackends.length; + mTests = new Description[totalCount]; + mShouldSkipTest = new boolean[totalCount]; // = {false, false, ....}; int index = 0; for (int backend = 0; backend < mImpl.mBackends.length; backend++) { for (int gm = 0; gm < mImpl.mGMs.length; gm++) { @@ -65,37 +67,35 @@ public class SkQPRunner extends Runner implements Filterable { mTests[index++] = Description.createTestDescription(SkQPRunner.class, "unitTest_" + mImpl.mUnitTests[unitTest]); } - assert(index == mTests.length); - mShouldRunTestCount = mTests.length; + assert(index == totalCount); + this.updateDescription(null); } - @Override - public void filter(Filter filter) throws NoTestsRemainException { - int count = 0; + private void updateDescription(Filter filter) { + mShouldRunTestCount = 0; + mDescription = Description.createSuiteDescription(SkQP.class); + assert(mTests.length == mShouldSkipTest.length); for (int i = 0; i < mTests.length; ++i) { - mShouldSkipTest[i] = !filter.shouldRun(mTests[i]); - if (!mShouldSkipTest[i]) { - ++count; + boolean doRunTest = filter != null ? filter.shouldRun(mTests[i]) : true; + mShouldSkipTest[i] = !doRunTest; + if (doRunTest) { + mDescription.addChild(mTests[i]); + ++mShouldRunTestCount; } } - mShouldRunTestCount = count; - if (0 == count) { - throw new NoTestsRemainException(); - } } @Override - public Description getDescription() { - Description d = Description.createSuiteDescription(SkQP.class); - for (int i = 0; i < mTests.length; ++i) { - d.addChild(mTests[i]); + public void filter(Filter filter) throws NoTestsRemainException { + this.updateDescription(filter); + if (0 == mShouldRunTestCount) { + throw new NoTestsRemainException(); } - return d; } @Override - public int testCount() { - return mImpl.mUnitTests.length + mImpl.mGMs.length * mImpl.mBackends.length; + public Description getDescription() { + return mDescription; } @Override diff --git a/src/core/SkRecord.h b/src/core/SkRecord.h index 088975bc16..feabec8b15 100644 --- a/src/core/SkRecord.h +++ b/src/core/SkRecord.h @@ -141,22 +141,20 @@ private: // A typed pointer to some bytes in fAlloc. visit() and mutate() allow polymorphic dispatch. struct Record { - // On 32-bit machines we store type in 4 bytes, followed by a pointer. Simple. - // On 64-bit machines we store a pointer with the type slotted into two top (unused) bytes. - // FWIW, SkRecords::Type is tiny. It can easily fit in one byte. - uint64_t fTypeAndPtr; - static const int kTypeShift = sizeof(void*) == 4 ? 32 : 48; + SkRecords::Type fType; + void* fPtr; // Point this record to its data in fAlloc. Returns ptr for convenience. template <typename T> T* set(T* ptr) { - fTypeAndPtr = ((uint64_t)T::kType) << kTypeShift | (uintptr_t)ptr; + fType = T::kType; + fPtr = ptr; SkASSERT(this->ptr() == ptr && this->type() == T::kType); return ptr; } - SkRecords::Type type() const { return (SkRecords::Type)(fTypeAndPtr >> kTypeShift); } - void* ptr() const { return (void*)(fTypeAndPtr & ((1ull<<kTypeShift)-1)); } + SkRecords::Type type() const { return fType; } + void* ptr() const { return fPtr; } // Visit this record with functor F (see public API above). template <typename F> diff --git a/src/gpu/gradients/GrLinearGradientLayout.cpp b/src/gpu/gradients/GrLinearGradientLayout.cpp index cd53b36bcd..d809e004b0 100644 --- a/src/gpu/gradients/GrLinearGradientLayout.cpp +++ b/src/gpu/gradients/GrLinearGradientLayout.cpp @@ -25,8 +25,10 @@ public: auto gradientMatrix = _outer.gradientMatrix(); (void)gradientMatrix; SkString sk_TransformedCoords2D_0 = fragBuilder->ensureCoords2D(args.fTransformedCoords[0]); - fragBuilder->codeAppendf("half t = half(%s.x);\n%s = half4(t, 1.0, 0.0, 0.0);\n", - sk_TransformedCoords2D_0.c_str(), args.fOutputColor); + fragBuilder->codeAppendf( + "half t = half(%s.x) + 1.0000000000000001e-05;\n%s = half4(t, 1.0, 0.0, 0.0);\n", + sk_TransformedCoords2D_0.c_str(), + args.fOutputColor); } private: diff --git a/src/gpu/gradients/GrLinearGradientLayout.fp b/src/gpu/gradients/GrLinearGradientLayout.fp index 3a187f321c..bd144316e8 100644 --- a/src/gpu/gradients/GrLinearGradientLayout.fp +++ b/src/gpu/gradients/GrLinearGradientLayout.fp @@ -12,7 +12,14 @@ in half4x4 gradientMatrix; } void main() { - half t = sk_TransformedCoords2D[0].x; + // We add a tiny delta to t. When gradient stops are set up so that a hard stop in a vertically + // or horizontally oriented gradient falls exactly at a column or row of pixel centers we can + // we can get slightly different interpolated t values along the column/row. By adding the delta + // we will consistently get the color to the "right" of the stop. Of course if the hard stop + // falls at X.5 - delta then we still could get inconsistent results, but that is much less + // likely. crbug.com/938592 + // If/when we add filtering of the gradient this can be removed. + half t = half(sk_TransformedCoords2D[0].x) + 0.00001; sk_OutColor = half4(t, 1, 0, 0); // y = 1 for always valid } diff --git a/src/gpu/vk/GrVkCaps.cpp b/src/gpu/vk/GrVkCaps.cpp index a720e72bf1..dabdda76a6 100644 --- a/src/gpu/vk/GrVkCaps.cpp +++ b/src/gpu/vk/GrVkCaps.cpp @@ -74,6 +74,44 @@ bool GrVkCaps::initDescForDstCopy(const GrRenderTargetProxy* src, GrSurfaceDesc* return true; } +static int get_compatible_format_class(GrPixelConfig config) { + switch (config) { + case kAlpha_8_GrPixelConfig: + case kAlpha_8_as_Red_GrPixelConfig: + case kGray_8_GrPixelConfig: + case kGray_8_as_Red_GrPixelConfig: + return 1; + case kRGB_565_GrPixelConfig: + case kRGBA_4444_GrPixelConfig: + case kRG_88_GrPixelConfig: + case kAlpha_half_GrPixelConfig: + case kAlpha_half_as_Red_GrPixelConfig: + return 2; + case kRGB_888_GrPixelConfig: + return 3; + case kRGBA_8888_GrPixelConfig: + case kBGRA_8888_GrPixelConfig: + case kSRGBA_8888_GrPixelConfig: + case kSBGRA_8888_GrPixelConfig: + case kRGBA_1010102_GrPixelConfig: + return 4; + case kRGBA_half_GrPixelConfig: + case kRG_float_GrPixelConfig: + return 5; + case kRGBA_float_GrPixelConfig: + return 6; + case kRGB_ETC1_GrPixelConfig: + return 7; + case kUnknown_GrPixelConfig: + case kAlpha_8_as_Alpha_GrPixelConfig: + case kGray_8_as_Lum_GrPixelConfig: + SK_ABORT("Unsupported Vulkan pixel config"); + return 0; + } + SK_ABORT("Invalid pixel config"); + return 0; +} + bool GrVkCaps::canCopyImage(GrPixelConfig dstConfig, int dstSampleCnt, GrSurfaceOrigin dstOrigin, GrPixelConfig srcConfig, int srcSampleCnt, GrSurfaceOrigin srcOrigin) const { @@ -83,7 +121,8 @@ bool GrVkCaps::canCopyImage(GrPixelConfig dstConfig, int dstSampleCnt, GrSurface // We require that all vulkan GrSurfaces have been created with transfer_dst and transfer_src // as image usage flags. - if (srcOrigin != dstOrigin || GrBytesPerPixel(srcConfig) != GrBytesPerPixel(dstConfig)) { + if (srcOrigin != dstOrigin || + get_compatible_format_class(srcConfig) != get_compatible_format_class(dstConfig)) { return false; } diff --git a/src/gpu/vk/GrVkGpu.cpp b/src/gpu/vk/GrVkGpu.cpp index 2f668051e3..ede31df82f 100644 --- a/src/gpu/vk/GrVkGpu.cpp +++ b/src/gpu/vk/GrVkGpu.cpp @@ -712,6 +712,14 @@ bool GrVkGpu::uploadTexDataOptimal(GrVkTexture* tex, int left, int top, int widt if (!copyTexture) { return false; } + + if (!this->vkCaps().canCopyAsBlit(tex->config(), 1, false, + copyTexture->config(), 1, false) && + !this->vkCaps().canCopyAsDraw(tex->config(), SkToBool(tex->asRenderTarget()), + copyTexture->config(), true)) { + return false; + } + uploadTexture = copyTexture.get(); uploadLeft = 0; uploadTop = 0; @@ -2107,14 +2115,15 @@ bool GrVkGpu::onReadPixels(GrSurface* surface, int left, int top, int width, int if (rt) { srcSampleCount = rt->numColorSamples(); } - static const GrSurfaceOrigin kOrigin = kTopLeft_GrSurfaceOrigin; - if (!this->vkCaps().canCopyAsBlit(copySurface->config(), 1, kOrigin, - surface->config(), srcSampleCount, kOrigin) && + if (!this->vkCaps().canCopyAsBlit(copySurface->config(), 1, false, + surface->config(), srcSampleCount, + image->isLinearTiled()) && !this->vkCaps().canCopyAsDraw(copySurface->config(), false, surface->config(), SkToBool(surface->asTexture()))) { return false; } SkIRect srcRect = SkIRect::MakeXYWH(left, top, width, height); + static const GrSurfaceOrigin kOrigin = kTopLeft_GrSurfaceOrigin; if (!this->copySurface(copySurface.get(), kOrigin, surface, kOrigin, srcRect, SkIPoint::Make(0,0))) { return false; diff --git a/tests/GrCCPRTest.cpp b/tests/GrCCPRTest.cpp index 9c84717d34..c4bf58973a 100644 --- a/tests/GrCCPRTest.cpp +++ b/tests/GrCCPRTest.cpp @@ -883,7 +883,7 @@ protected: class CCPR_busyPath : public CCPRRenderingTest { void onRun(skiatest::Reporter* reporter, const CCPRPathDrawer& ccpr) const override { - static constexpr int kNumBusyVerbs = 1 << 17; + static constexpr int kNumBusyVerbs = 1 << 14; ccpr.clear(); SkPath busyPath; busyPath.moveTo(0, 0); // top left diff --git a/tests/VkHardwareBufferTest.cpp b/tests/VkHardwareBufferTest.cpp index c37d1d743e..dbf9a41200 100644 --- a/tests/VkHardwareBufferTest.cpp +++ b/tests/VkHardwareBufferTest.cpp @@ -155,7 +155,8 @@ bool EGLTestHelper::init(skiatest::Reporter* reporter) { !fGLCtx->gl()->hasExtension("EGL_ANDROID_get_native_client_buffer") || !fGLCtx->gl()->hasExtension("GL_OES_EGL_image_external") || !fGLCtx->gl()->hasExtension("GL_OES_EGL_image") || - !fGLCtx->gl()->hasExtension("EGL_KHR_fence_sync")) { + !fGLCtx->gl()->hasExtension("EGL_KHR_fence_sync") || + !fGLCtx->gl()->hasExtension("EGL_ANDROID_native_fence_sync")) { return false; } diff --git a/tools/skqp/gn_to_bp.py b/tools/skqp/gn_to_bp.py index d6b84955da..920c8f0e8e 100755 --- a/tools/skqp/gn_to_bp.py +++ b/tools/skqp/gn_to_bp.py @@ -151,6 +151,9 @@ defines = {str(d) for d in js['targets']['//:libskqp_app']['defines']} defines.update(["SK_ENABLE_DUMP_GPU", "SK_BUILD_FOR_SKQP"]) cflags_cc.update(['-Wno-extra-semi-stmt']) +# Android does not want -Weverything set, it blocks toolchain updates. +cflags.remove('-Weverything') + gn_to_bp_utils.GrabDependentValues(js, '//:libskqp_app', 'sources', srcs, None) gn_to_bp_utils.GrabDependentValues(js, '//:libskqp_app', 'include_dirs', local_includes, 'freetype') diff --git a/tools/skqp/release.sh b/tools/skqp/release.sh index f96fb9f673..d33178e14a 100755 --- a/tools/skqp/release.sh +++ b/tools/skqp/release.sh @@ -25,7 +25,7 @@ cat > platform_tools/android/apps/skqp/src/main/Android.mk <<- "EOM" include $(CLEAR_VARS) LOCAL_MODULE_TAGS := tests optional LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS) - LOCAL_COMPATIBILITY_SUITE := cts vts general-tests + LOCAL_COMPATIBILITY_SUITE := cts vts10 general-tests LOCAL_JAVA_LIBRARIES := android.test.runner.stubs LOCAL_JNI_SHARED_LIBRARIES := libskqp_app LOCAL_MULTILIB := both |