Update from https://crrev.com/319330
- New chromium clang rules require explicit external destructors so
system/lib added for MessagePipe, DataPipe and SharedBuffer
- New chromium clang rules require override and no virtual in
declarations, so many files updated.
- cc_strip_video patch updated.
BUG=
R=jamesr@chromium.org
Review URL: https://codereview.chromium.org/988693005
diff --git a/DEPS b/DEPS
index b0da0d6..bc8e552 100644
--- a/DEPS
+++ b/DEPS
@@ -21,19 +21,19 @@
'chromium_git': 'https://chromium.googlesource.com',
'dart_svn': 'https://dart.googlecode.com',
'sfntly_revision': '1bdaae8fc788a5ac8936d68bf24f37d977a13dac',
- 'skia_revision': 'f47e70712b964b5360a3fec9e5e84bb594fc1f02',
+ 'skia_revision': 'a9baa652bb329b5a286e1638938f63433701efca',
# Three lines of non-changing comments so that
# the commit queue can handle CLs rolling Skia
# and V8 without interference from each other.
- 'v8_revision': 'f63eb3696b36b47be841f52711176985e93b655c',
+ 'v8_revision': 'a1d36b4b6b1a3bb35d3bc5b64fbd5de9f55fed26',
# Three lines of non-changing comments so that
# the commit queue can handle CLs rolling ANGLE
# and whatever else without interference from each other.
- 'angle_revision': '7825f6199ce25dffe5fec5addb2fafe37f187034',
+ 'angle_revision': '019304886ad8b985d67202edec431407bb1b5c53',
# Three lines of non-changing comments so that
# the commit queue can handle CLs rolling build tools
# and whatever else without interference from each other.
- 'buildtools_revision': '93b3d0af1b30db55ee42bd2e983f7753153217db',
+ 'buildtools_revision': 'd4dd4f79f60bf019625b3a1436979b0a42c892df',
# Three lines of non-changing comments so that
# the commit queue can handle CLs rolling Dart
# and whatever else without interference from each other.
@@ -79,10 +79,10 @@
Var('chromium_git') + '/angle/angle.git' + '@' + Var('angle_revision'),
'src/third_party/icu':
- Var('chromium_git') + '/chromium/deps/icu.git' + '@' + '2081ee6abfa118003fd559cb72393f5df561dba7',
+ Var('chromium_git') + '/chromium/deps/icu.git' + '@' + 'eda9e75b1fa17f57ffa369ee3543a2301b68d0a9',
'src/tools/grit':
- Var('chromium_git') + '/external/grit-i18n.git' + '@' + 'a5890a8118c0c80cc0560e6d8d5cf65e5d725509', # from svn revision 185
+ Var('chromium_git') + '/external/grit-i18n.git' + '@' + '0287c187b11ed53590254e4d817e836a44a7a1a7', # from svn revision 186
'src/v8':
Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'),
@@ -124,7 +124,7 @@
'https://boringssl.googlesource.com/boringssl.git' + '@' + Var('boringssl_revision'),
'src/tools/gyp':
- Var('chromium_git') + '/external/gyp.git' + '@' + '34640080d08ab2a37665512e52142947def3056d', # from svn revision 2028
+ Var('chromium_git') + '/external/gyp.git' + '@' + '4a9b712d5cb4a5ba7a9950128a7219569caf7263',
}
diff --git a/DEPS.nacl b/DEPS.nacl
index cd06226..92386bb 100644
--- a/DEPS.nacl
+++ b/DEPS.nacl
@@ -7,7 +7,7 @@
# Now we need to add in NaCl.
vars.update({
- 'nacl_revision': '62b6f76d587ef1f7e9231815fd31fef0a1dca6ff',
+ 'nacl_revision': '19f11aa481261f38f2a1e9a04e41a7e12aa70e32',
})
deps.update({
diff --git a/base/BUILD.gn b/base/BUILD.gn
index 9dbc41c..402b19a 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -15,6 +15,8 @@
"allocator/allocator_extension.h",
"allocator/type_profiler_control.cc",
"allocator/type_profiler_control.h",
+ "android/animation_frame_time_histogram.cc",
+ "android/animation_frame_time_histogram.h",
"android/application_status_listener.cc",
"android/application_status_listener.h",
"android/base_jni_onload.cc",
@@ -386,18 +388,18 @@
"metrics/histogram.h",
"metrics/histogram_base.cc",
"metrics/histogram_base.h",
- "metrics/histogram_delta_serialization.cc",
- "metrics/sample_map.cc",
- "metrics/sample_map.h",
- "metrics/sample_vector.cc",
- "metrics/sample_vector.h",
"metrics/histogram_delta_serialization.",
+ "metrics/histogram_delta_serialization.cc",
"metrics/histogram_flattener.h",
"metrics/histogram_macros.h",
"metrics/histogram_samples.cc",
"metrics/histogram_samples.h",
"metrics/histogram_snapshot_manager.cc",
"metrics/histogram_snapshot_manager.h",
+ "metrics/sample_map.cc",
+ "metrics/sample_map.h",
+ "metrics/sample_vector.cc",
+ "metrics/sample_vector.h",
"metrics/sparse_histogram.cc",
"metrics/sparse_histogram.h",
"metrics/statistics_recorder.cc",
@@ -783,9 +785,9 @@
"files/file_proxy.cc",
"files/file_util.cc",
"files/file_util_proxy.cc",
+ "files/scoped_temp_dir.cc",
"path_service.cc",
"scoped_native_library.cc",
- "files/scoped_temp_dir.cc",
]
}
@@ -1066,6 +1068,8 @@
source_set("prefs") {
sources = [
"prefs/base_prefs_export.h",
+ "prefs/base_prefs_switches.cc",
+ "prefs/base_prefs_switches.h",
"prefs/default_pref_store.cc",
"prefs/default_pref_store.h",
"prefs/json_pref_store.cc",
@@ -1163,6 +1167,8 @@
}
if (is_win) {
+ # Target to manually rebuild pe_image_test.dll which is checked into
+ # base/test/data/pe_image.
shared_library("pe_image_test") {
sources = [
"win/pe_image_test.cc",
@@ -1487,10 +1493,6 @@
set_sources_assignment_filter(sources_assignment_filter)
}
- if (is_win) {
- deps += [ ":pe_image_test" ]
- }
-
# TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
}
@@ -1500,6 +1502,7 @@
generate_jni("base_jni_headers") {
sources = [
"android/java/src/org/chromium/base/ApplicationStatus.java",
+ "android/java/src/org/chromium/base/AnimationFrameTimeHistogram.java",
"android/java/src/org/chromium/base/BuildInfo.java",
"android/java/src/org/chromium/base/CommandLine.java",
"android/java/src/org/chromium/base/ContentUriUtils.java",
diff --git a/base/android/animation_frame_time_histogram.cc b/base/android/animation_frame_time_histogram.cc
new file mode 100644
index 0000000..0d79619
--- /dev/null
+++ b/base/android/animation_frame_time_histogram.cc
@@ -0,0 +1,36 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/animation_frame_time_histogram.h"
+
+#include "base/android/jni_string.h"
+#include "base/metrics/histogram_macros.h"
+#include "jni/AnimationFrameTimeHistogram_jni.h"
+
+// static
+void SaveHistogram(JNIEnv* env,
+ jobject jcaller,
+ jstring j_histogram_name,
+ jlongArray j_frame_times_ms,
+ jint j_count) {
+ jlong *frame_times_ms = env->GetLongArrayElements(j_frame_times_ms, NULL);
+ std::string histogram_name = base::android::ConvertJavaStringToUTF8(
+ env, j_histogram_name);
+
+ for (int i = 0; i < j_count; ++i) {
+ UMA_HISTOGRAM_TIMES(histogram_name.c_str(),
+ base::TimeDelta::FromMilliseconds(frame_times_ms[i]));
+ }
+}
+
+namespace base {
+namespace android {
+
+// static
+bool RegisterAnimationFrameTimeHistogram(JNIEnv* env) {
+ return RegisterNativesImpl(env);
+}
+
+} // namespace android
+} // namespace base
diff --git a/base/android/animation_frame_time_histogram.h b/base/android/animation_frame_time_histogram.h
new file mode 100644
index 0000000..63f938b
--- /dev/null
+++ b/base/android/animation_frame_time_histogram.h
@@ -0,0 +1,18 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_ANIMATION_FRAME_TIME_HISTOGRAM_H_
+#define BASE_ANDROID_ANIMATION_FRAME_TIME_HISTOGRAM_H_
+
+#include <jni.h>
+
+namespace base {
+namespace android {
+
+bool RegisterAnimationFrameTimeHistogram(JNIEnv* env);
+
+} // namespace android
+} // namespace base
+
+#endif // BASE_ANDROID_ANIMATION_FRAME_TIME_HISTOGRAM_H_
diff --git a/base/android/base_jni_registrar.cc b/base/android/base_jni_registrar.cc
index 4dda482..7439d3c 100644
--- a/base/android/base_jni_registrar.cc
+++ b/base/android/base_jni_registrar.cc
@@ -4,6 +4,7 @@
#include "base/android/base_jni_registrar.h"
+#include "base/android/animation_frame_time_histogram.h"
#include "base/android/application_status_listener.h"
#include "base/android/build_info.h"
#include "base/android/command_line_android.h"
@@ -33,6 +34,8 @@
namespace android {
static RegistrationMethod kBaseRegisteredMethods[] = {
+ {"AnimationFrameTimeHistogram",
+ base::android::RegisterAnimationFrameTimeHistogram},
{"ApplicationStatusListener",
base::android::ApplicationStatusListener::RegisterBindings},
{"BuildInfo", base::android::BuildInfo::RegisterBindings},
diff --git a/base/android/java/src/org/chromium/base/AnimationFrameTimeHistogram.java b/base/android/java/src/org/chromium/base/AnimationFrameTimeHistogram.java
new file mode 100644
index 0000000..ad5cdd8
--- /dev/null
+++ b/base/android/java/src/org/chromium/base/AnimationFrameTimeHistogram.java
@@ -0,0 +1,145 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base;
+
+import android.animation.Animator;
+import android.animation.Animator.AnimatorListener;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.TimeAnimator;
+import android.animation.TimeAnimator.TimeListener;
+import android.util.Log;
+
+/**
+ * Record Android animation frame rate and save it to UMA histogram. This is mainly for monitoring
+ * any jankiness of short Chrome Android animations. It is limited to few seconds of recording.
+ */
+public class AnimationFrameTimeHistogram {
+ private static final String TAG = "AnimationFrameTimeHistogram";
+ private static final int MAX_FRAME_TIME_NUM = 600; // 10 sec on 60 fps.
+
+ private final Recorder mRecorder = new Recorder();
+ private final String mHistogramName;
+
+ /**
+ * @param histogramName The histogram name that the recorded frame times will be saved.
+ * This must be also defined in histograms.xml
+ * @return An AnimatorListener instance that records frame time histogram on start and end
+ * automatically.
+ */
+ public static AnimatorListener getAnimatorRecorder(final String histogramName) {
+ return new AnimatorListenerAdapter() {
+ private final AnimationFrameTimeHistogram mAnimationFrameTimeHistogram =
+ new AnimationFrameTimeHistogram(histogramName);
+
+ @Override
+ public void onAnimationStart(Animator animation) {
+ mAnimationFrameTimeHistogram.startRecording();
+ }
+
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ mAnimationFrameTimeHistogram.endRecording();
+ }
+
+ @Override
+ public void onAnimationCancel(Animator animation) {
+ mAnimationFrameTimeHistogram.endRecording();
+ }
+ };
+ }
+
+ /**
+ * @param histogramName The histogram name that the recorded frame times will be saved.
+ * This must be also defined in histograms.xml
+ */
+ public AnimationFrameTimeHistogram(String histogramName) {
+ mHistogramName = histogramName;
+ }
+
+ /**
+ * Start recording frame times. The recording can fail if it exceeds a few seconds.
+ */
+ public void startRecording() {
+ mRecorder.startRecording();
+ }
+
+ /**
+ * End recording and save it to histogram. It won't save histogram if the recording wasn't
+ * successful.
+ */
+ public void endRecording() {
+ if (mRecorder.endRecording()) {
+ nativeSaveHistogram(mHistogramName,
+ mRecorder.getFrameTimesMs(), mRecorder.getFrameTimesCount());
+ }
+ mRecorder.cleanUp();
+ }
+
+ /**
+ * Record Android animation frame rate and return the result.
+ */
+ private static class Recorder implements TimeListener {
+ // TODO(kkimlabs): If we can use in the future, migrate to Choreographer for minimal
+ // workload.
+ private final TimeAnimator mAnimator = new TimeAnimator();
+ private long[] mFrameTimesMs;
+ private int mFrameTimesCount;
+
+ private Recorder() {
+ mAnimator.setTimeListener(this);
+ }
+
+ private void startRecording() {
+ assert !mAnimator.isRunning();
+ mFrameTimesCount = 0;
+ mFrameTimesMs = new long[MAX_FRAME_TIME_NUM];
+ mAnimator.start();
+ }
+
+ /**
+ * @return Whether the recording was successful. If successful, the result is available via
+ * getFrameTimesNs and getFrameTimesCount.
+ */
+ private boolean endRecording() {
+ boolean succeeded = mAnimator.isStarted();
+ mAnimator.end();
+ return succeeded;
+ }
+
+ private long[] getFrameTimesMs() {
+ return mFrameTimesMs;
+ }
+
+ private int getFrameTimesCount() {
+ return mFrameTimesCount;
+ }
+
+ /**
+ * Deallocates the temporary buffer to record frame times. Must be called after ending
+ * the recording and getting the result.
+ */
+ private void cleanUp() {
+ mFrameTimesMs = null;
+ }
+
+ @Override
+ public void onTimeUpdate(TimeAnimator animation, long totalTime, long deltaTime) {
+ if (mFrameTimesCount == mFrameTimesMs.length) {
+ mAnimator.end();
+ cleanUp();
+ Log.w(TAG, "Animation frame time recording reached the maximum number. It's either"
+ + "the animation took too long or recording end is not called.");
+ return;
+ }
+
+ // deltaTime is 0 for the first frame.
+ if (deltaTime > 0) {
+ mFrameTimesMs[mFrameTimesCount++] = deltaTime;
+ }
+ }
+ }
+
+ private native void nativeSaveHistogram(String histogramName, long[] frameTimesMs, int count);
+}
diff --git a/base/android/java/src/org/chromium/base/ApiCompatibilityUtils.java b/base/android/java/src/org/chromium/base/ApiCompatibilityUtils.java
index c03cad2..4198853 100644
--- a/base/android/java/src/org/chromium/base/ApiCompatibilityUtils.java
+++ b/base/android/java/src/org/chromium/base/ApiCompatibilityUtils.java
@@ -72,13 +72,6 @@
}
/**
- * @return True if the running version of the Android supports HTML clipboard.
- */
- public static boolean isHTMLClipboardSupported() {
- return Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN;
- }
-
- /**
* @see android.view.View#setLayoutDirection(int)
*/
public static void setLayoutDirection(View view, int layoutDirection) {
diff --git a/base/base.gyp b/base/base.gyp
index 30de275..3888ad9 100644
--- a/base/base.gyp
+++ b/base/base.gyp
@@ -338,6 +338,8 @@
],
'sources': [
'prefs/base_prefs_export.h',
+ 'prefs/base_prefs_switches.cc',
+ 'prefs/base_prefs_switches.h',
'prefs/default_pref_store.cc',
'prefs/default_pref_store.h',
'prefs/json_pref_store.cc',
@@ -382,12 +384,18 @@
# TODO(pasko): Remove this target when crbug.com/424562 is fixed.
# GN: //base:protect_file_posix
'target_name': 'protect_file_posix',
- 'type': 'static_library',
- 'dependencies': [
- 'base',
- ],
- 'sources': [
- 'files/protect_file_posix.cc',
+ 'conditions': [
+ ['os_posix == 1', {
+ 'type': 'static_library',
+ 'dependencies': [
+ 'base',
+ ],
+ 'sources': [
+ 'files/protect_file_posix.cc',
+ ],
+ }, {
+ 'type': 'none',
+ }],
],
},
{
@@ -778,9 +786,6 @@
'message_loop/message_pump_libevent_unittest.cc',
'threading/worker_pool_posix_unittest.cc',
],
- 'dependencies': [
- 'pe_image_test',
- ],
# TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
'msvs_disabled_warnings': [
4267,
@@ -941,6 +946,8 @@
'test/mock_chrome_application_mac.mm',
'test/mock_devices_changed_observer.cc',
'test/mock_devices_changed_observer.h',
+ 'test/mock_log.cc',
+ 'test/mock_log.h',
'test/multiprocess_test.cc',
'test/multiprocess_test.h',
'test/multiprocess_test_android.cc',
@@ -1336,6 +1343,7 @@
'type': 'none',
'sources': [
'android/java/src/org/chromium/base/ApplicationStatus.java',
+ 'android/java/src/org/chromium/base/AnimationFrameTimeHistogram.java',
'android/java/src/org/chromium/base/BuildInfo.java',
'android/java/src/org/chromium/base/CommandLine.java',
'android/java/src/org/chromium/base/ContentUriUtils.java',
@@ -1551,6 +1559,8 @@
},
},
{
+ # Target to manually rebuild pe_image_test.dll which is checked into
+ # base/test/data/pe_image.
'target_name': 'pe_image_test',
'type': 'shared_library',
'sources': [
diff --git a/base/base.gypi b/base/base.gypi
index 148246f..0f8fff2 100644
--- a/base/base.gypi
+++ b/base/base.gypi
@@ -17,6 +17,8 @@
'allocator/allocator_extension.h',
'allocator/type_profiler_control.cc',
'allocator/type_profiler_control.h',
+ 'android/animation_frame_time_histogram.cc',
+ 'android/animation_frame_time_histogram.h',
'android/application_status_listener.cc',
'android/application_status_listener.h',
'android/base_jni_onload.cc',
diff --git a/base/base_nacl.gyp b/base/base_nacl.gyp
index 63e1ed4..90a2893 100644
--- a/base/base_nacl.gyp
+++ b/base/base_nacl.gyp
@@ -7,8 +7,12 @@
'chromium_code': 1,
},
'includes': [
- '../build/common_untrusted.gypi',
+ # base.gypi must be included before common_untrusted.gypi.
+ #
+ # TODO(sergeyu): Replace the target_defaults magic in base.gypi with a
+ # sources variables lists. That way order of includes will not matter.
'base.gypi',
+ '../build/common_untrusted.gypi',
],
'conditions': [
['disable_nacl==0 and disable_nacl_untrusted==0', {
diff --git a/base/base_unittests.isolate b/base/base_unittests.isolate
index e5495e3..5126fb3 100644
--- a/base/base_unittests.isolate
+++ b/base/base_unittests.isolate
@@ -19,7 +19,6 @@
'--brave-new-test-launcher',
'--test-launcher-bot-mode',
'--asan=<(asan)',
- '--lsan=<(lsan)',
'--msan=<(msan)',
'--tsan=<(tsan)',
],
@@ -52,7 +51,6 @@
'--brave-new-test-launcher',
'--test-launcher-bot-mode',
'--asan=<(asan)',
- '--lsan=<(lsan)',
'--msan=<(msan)',
'--tsan=<(tsan)',
],
@@ -72,13 +70,6 @@
],
},
}],
- ['OS=="win"', {
- 'variables': {
- 'files': [
- '<(PRODUCT_DIR)/pe_image_test.dll',
- ],
- },
- }],
],
'includes': [
'base.isolate',
diff --git a/base/files/file_path_watcher_win.cc b/base/files/file_path_watcher_win.cc
index 63e5480..f6d0029 100644
--- a/base/files/file_path_watcher_win.cc
+++ b/base/files/file_path_watcher_win.cc
@@ -11,7 +11,6 @@
#include "base/logging.h"
#include "base/memory/ref_counted.h"
#include "base/message_loop/message_loop_proxy.h"
-#include "base/profiler/scoped_tracker.h"
#include "base/time/time.h"
#include "base/win/object_watcher.h"
@@ -147,11 +146,6 @@
}
void FilePathWatcherImpl::OnObjectSignaled(HANDLE object) {
- // TODO(vadimt): Remove ScopedTracker below once crbug.com/418183 is fixed.
- tracked_objects::ScopedTracker tracking_profile(
- FROM_HERE_WITH_EXPLICIT_FUNCTION(
- "418183 FilePathWatcherImpl::OnObjectSignaled"));
-
DCHECK(object == handle_);
// Make sure we stay alive through the body of this function.
scoped_refptr<FilePathWatcherImpl> keep_alive(this);
diff --git a/base/files/important_file_writer.cc b/base/files/important_file_writer.cc
index d256236..47b0b09 100644
--- a/base/files/important_file_writer.cc
+++ b/base/files/important_file_writer.cc
@@ -10,12 +10,14 @@
#include "base/bind.h"
#include "base/critical_closure.h"
+#include "base/debug/alias.h"
#include "base/files/file.h"
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/logging.h"
#include "base/metrics/histogram.h"
#include "base/strings/string_number_conversions.h"
+#include "base/strings/string_util.h"
#include "base/task_runner.h"
#include "base/task_runner_util.h"
#include "base/threading/thread.h"
@@ -54,6 +56,20 @@
// static
bool ImportantFileWriter::WriteFileAtomically(const FilePath& path,
const std::string& data) {
+#if defined(OS_CHROMEOS)
+ // On Chrome OS, chrome gets killed when it cannot finish shutdown quickly,
+ // and this function seems to be one of the slowest shutdown steps.
+ // Include some info to the report for investigation. crbug.com/418627
+ // TODO(hashimoto): Remove this.
+ struct {
+ size_t data_size;
+ char path[128];
+ } file_info;
+ file_info.data_size = data.size();
+ base::strlcpy(file_info.path, path.value().c_str(),
+ arraysize(file_info.path));
+ base::debug::Alias(&file_info);
+#endif
// Write the data to a temp file then rename to avoid data loss if we crash
// while writing the file. Ensure that the temp file is on the same volume
// as target file, so it can be moved in one step, and that the temp file
diff --git a/base/json/json_file_value_serializer.cc b/base/json/json_file_value_serializer.cc
index 71033f6..72a0970 100644
--- a/base/json/json_file_value_serializer.cc
+++ b/base/json/json_file_value_serializer.cc
@@ -10,16 +10,14 @@
using base::FilePath;
-const char JSONFileValueSerializer::kAccessDenied[] = "Access denied.";
-const char JSONFileValueSerializer::kCannotReadFile[] = "Can't read file.";
-const char JSONFileValueSerializer::kFileLocked[] = "File locked.";
-const char JSONFileValueSerializer::kNoSuchFile[] = "File doesn't exist.";
+const char JSONFileValueDeserializer::kAccessDenied[] = "Access denied.";
+const char JSONFileValueDeserializer::kCannotReadFile[] = "Can't read file.";
+const char JSONFileValueDeserializer::kFileLocked[] = "File locked.";
+const char JSONFileValueDeserializer::kNoSuchFile[] = "File doesn't exist.";
JSONFileValueSerializer::JSONFileValueSerializer(
const base::FilePath& json_file_path)
- : json_file_path_(json_file_path),
- allow_trailing_comma_(false),
- last_read_size_(0U) {
+ : json_file_path_(json_file_path) {
}
JSONFileValueSerializer::~JSONFileValueSerializer() {
@@ -53,7 +51,17 @@
return true;
}
-int JSONFileValueSerializer::ReadFileToString(std::string* json_string) {
+JSONFileValueDeserializer::JSONFileValueDeserializer(
+ const base::FilePath& json_file_path)
+ : json_file_path_(json_file_path),
+ allow_trailing_comma_(false),
+ last_read_size_(0U) {
+}
+
+JSONFileValueDeserializer::~JSONFileValueDeserializer() {
+}
+
+int JSONFileValueDeserializer::ReadFileToString(std::string* json_string) {
DCHECK(json_string);
if (!base::ReadFileToString(json_file_path_, json_string)) {
#if defined(OS_WIN)
@@ -74,7 +82,7 @@
return JSON_NO_ERROR;
}
-const char* JSONFileValueSerializer::GetErrorMessageForCode(int error_code) {
+const char* JSONFileValueDeserializer::GetErrorMessageForCode(int error_code) {
switch (error_code) {
case JSON_NO_ERROR:
return "";
@@ -92,8 +100,8 @@
}
}
-base::Value* JSONFileValueSerializer::Deserialize(int* error_code,
- std::string* error_str) {
+base::Value* JSONFileValueDeserializer::Deserialize(int* error_code,
+ std::string* error_str) {
std::string json_string;
int error = ReadFileToString(&json_string);
if (error != JSON_NO_ERROR) {
@@ -104,7 +112,7 @@
return NULL;
}
- JSONStringValueSerializer serializer(json_string);
- serializer.set_allow_trailing_comma(allow_trailing_comma_);
- return serializer.Deserialize(error_code, error_str);
+ JSONStringValueDeserializer deserializer(json_string);
+ deserializer.set_allow_trailing_comma(allow_trailing_comma_);
+ return deserializer.Deserialize(error_code, error_str);
}
diff --git a/base/json/json_file_value_serializer.h b/base/json/json_file_value_serializer.h
index 6cfcbe8..aab47ee 100644
--- a/base/json/json_file_value_serializer.h
+++ b/base/json/json_file_value_serializer.h
@@ -14,10 +14,9 @@
class BASE_EXPORT JSONFileValueSerializer : public base::ValueSerializer {
public:
- // |json_file_path_| is the path of a file that will be source of the
- // deserialization or the destination of the serialization.
- // When deserializing, the file should exist, but when serializing, the
- // serializer will attempt to create the file at the specified location.
+ // |json_file_path_| is the path of a file that will be destination of the
+ // serialization. The serializer will attempt to create the file at the
+ // specified location.
explicit JSONFileValueSerializer(const base::FilePath& json_file_path);
~JSONFileValueSerializer() override;
@@ -36,6 +35,22 @@
// output.
bool SerializeAndOmitBinaryValues(const base::Value& root);
+ private:
+ bool SerializeInternal(const base::Value& root, bool omit_binary_values);
+
+ const base::FilePath json_file_path_;
+
+ DISALLOW_IMPLICIT_CONSTRUCTORS(JSONFileValueSerializer);
+};
+
+class BASE_EXPORT JSONFileValueDeserializer : public base::ValueDeserializer {
+ public:
+ // |json_file_path_| is the path of a file that will be source of the
+ // deserialization.
+ explicit JSONFileValueDeserializer(const base::FilePath& json_file_path);
+
+ ~JSONFileValueDeserializer() override;
+
// Attempt to deserialize the data structure encoded in the file passed
// in to the constructor into a structure of Value objects. If the return
// value is NULL, and if |error_code| is non-null, |error_code| will
@@ -69,22 +84,20 @@
allow_trailing_comma_ = new_value;
}
- // Returns the syze (in bytes) of JSON string read from disk in the last
+ // Returns the size (in bytes) of JSON string read from disk in the last
// successful |Deserialize()| call.
size_t get_last_read_size() const { return last_read_size_; }
private:
- bool SerializeInternal(const base::Value& root, bool omit_binary_values);
+ // A wrapper for ReadFileToString which returns a non-zero JsonFileError if
+ // there were file errors.
+ int ReadFileToString(std::string* json_string);
const base::FilePath json_file_path_;
bool allow_trailing_comma_;
size_t last_read_size_;
- // A wrapper for ReadFileToString which returns a non-zero JsonFileError if
- // there were file errors.
- int ReadFileToString(std::string* json_string);
-
- DISALLOW_IMPLICIT_CONSTRUCTORS(JSONFileValueSerializer);
+ DISALLOW_IMPLICIT_CONSTRUCTORS(JSONFileValueDeserializer);
};
#endif // BASE_JSON_JSON_FILE_VALUE_SERIALIZER_H_
diff --git a/base/json/json_string_value_serializer.cc b/base/json/json_string_value_serializer.cc
index b626640..debf9f0 100644
--- a/base/json/json_string_value_serializer.cc
+++ b/base/json/json_string_value_serializer.cc
@@ -12,17 +12,7 @@
JSONStringValueSerializer::JSONStringValueSerializer(std::string* json_string)
: json_string_(json_string),
- json_string_readonly_(*json_string),
- pretty_print_(false),
- allow_trailing_comma_(false) {
-}
-
-JSONStringValueSerializer::JSONStringValueSerializer(
- const base::StringPiece& json_string)
- : json_string_(nullptr),
- json_string_readonly_(json_string),
- pretty_print_(false),
- allow_trailing_comma_(false) {
+ pretty_print_(false) {
}
JSONStringValueSerializer::~JSONStringValueSerializer() {}
@@ -50,9 +40,17 @@
return base::JSONWriter::WriteWithOptions(&root, options, json_string_);
}
-Value* JSONStringValueSerializer::Deserialize(int* error_code,
- std::string* error_str) {
- return base::JSONReader::ReadAndReturnError(json_string_readonly_,
+JSONStringValueDeserializer::JSONStringValueDeserializer(
+ const base::StringPiece& json_string)
+ : json_string_(json_string),
+ allow_trailing_comma_(false) {
+}
+
+JSONStringValueDeserializer::~JSONStringValueDeserializer() {}
+
+Value* JSONStringValueDeserializer::Deserialize(int* error_code,
+ std::string* error_str) {
+ return base::JSONReader::ReadAndReturnError(json_string_,
allow_trailing_comma_ ? base::JSON_ALLOW_TRAILING_COMMAS :
base::JSON_PARSE_RFC,
error_code, error_str);
diff --git a/base/json/json_string_value_serializer.h b/base/json/json_string_value_serializer.h
index 7f99bc9..bc0e66d 100644
--- a/base/json/json_string_value_serializer.h
+++ b/base/json/json_string_value_serializer.h
@@ -15,16 +15,11 @@
class BASE_EXPORT JSONStringValueSerializer : public base::ValueSerializer {
public:
- // |json_string| is the string that will be source of the deserialization
- // or the destination of the serialization. The caller of the constructor
- // retains ownership of the string. |json_string| must not be null.
+ // |json_string| is the string that will be the destination of the
+ // serialization. The caller of the constructor retains ownership of the
+ // string. |json_string| must not be null.
explicit JSONStringValueSerializer(std::string* json_string);
- // This version allows initialization with a StringPiece for deserialization
- // only. Retains a reference to the contents of |json_string|, so the data
- // must outlive the JSONStringValueSerializer.
- explicit JSONStringValueSerializer(const base::StringPiece& json_string);
-
~JSONStringValueSerializer() override;
// Attempt to serialize the data structure represented by Value into
@@ -36,6 +31,27 @@
// output.
bool SerializeAndOmitBinaryValues(const base::Value& root);
+ void set_pretty_print(bool new_value) { pretty_print_ = new_value; }
+ bool pretty_print() { return pretty_print_; }
+
+ private:
+ bool SerializeInternal(const base::Value& root, bool omit_binary_values);
+
+ // Owned by the caller of the constructor.
+ std::string* json_string_;
+ bool pretty_print_; // If true, serialization will span multiple lines.
+
+ DISALLOW_COPY_AND_ASSIGN(JSONStringValueSerializer);
+};
+
+class BASE_EXPORT JSONStringValueDeserializer : public base::ValueDeserializer {
+ public:
+ // This retains a reference to the contents of |json_string|, so the data
+ // must outlive the JSONStringValueDeserializer.
+ explicit JSONStringValueDeserializer(const base::StringPiece& json_string);
+
+ ~JSONStringValueDeserializer() override;
+
// Attempt to deserialize the data structure encoded in the string passed
// in to the constructor into a structure of Value objects. If the return
// value is null, and if |error_code| is non-null, |error_code| will
@@ -46,28 +62,17 @@
base::Value* Deserialize(int* error_code,
std::string* error_message) override;
- void set_pretty_print(bool new_value) { pretty_print_ = new_value; }
- bool pretty_print() { return pretty_print_; }
-
void set_allow_trailing_comma(bool new_value) {
allow_trailing_comma_ = new_value;
}
private:
- bool SerializeInternal(const base::Value& root, bool omit_binary_values);
-
- // String for writing. Owned by the caller of the constructor. Will be null if
- // the serializer was initialized with a const string.
- std::string* json_string_;
- // String for reading. Data is owned by the caller of the constructor. If
- // |json_string_| is non-null, this is a view onto |json_string_|.
- base::StringPiece json_string_readonly_;
- bool pretty_print_; // If true, serialization will span multiple lines.
+ // Data is owned by the caller of the constructor.
+ base::StringPiece json_string_;
// If true, deserialization will allow trailing commas.
bool allow_trailing_comma_;
- DISALLOW_COPY_AND_ASSIGN(JSONStringValueSerializer);
+ DISALLOW_COPY_AND_ASSIGN(JSONStringValueDeserializer);
};
#endif // BASE_JSON_JSON_STRING_VALUE_SERIALIZER_H_
-
diff --git a/base/json/json_value_serializer_unittest.cc b/base/json/json_value_serializer_unittest.cc
index d2a84de..225ee67 100644
--- a/base/json/json_value_serializer_unittest.cc
+++ b/base/json/json_value_serializer_unittest.cc
@@ -86,28 +86,10 @@
ASSERT_EQ(1, value);
}
-// Test proper JSON [de]serialization from string is working.
-TEST(JSONValueSerializerTest, ReadProperJSONFromString) {
+// Test proper JSON deserialization from string is working.
+TEST(JSONValueDeserializerTest, ReadProperJSONFromString) {
// Try to deserialize it through the serializer.
- JSONStringValueSerializer str_deserializer(kProperJSON);
-
- int error_code = 0;
- std::string error_message;
- scoped_ptr<Value> value(
- str_deserializer.Deserialize(&error_code, &error_message));
- ASSERT_TRUE(value.get());
- ASSERT_EQ(0, error_code);
- ASSERT_TRUE(error_message.empty());
- // Verify if the same JSON is still there.
- CheckJSONIsStillTheSame(*value);
-}
-
-// Test proper JSON deserialization from a string pointer is working.
-TEST(JSONValueSerializerTest, ReadProperJSONFromStringPointer) {
- // Try to deserialize a string pointer through the serializer. (This exercises
- // a separate code path to passing a StringPiece.)
- std::string proper_json(kProperJSON);
- JSONStringValueSerializer str_deserializer(&proper_json);
+ JSONStringValueDeserializer str_deserializer(kProperJSON);
int error_code = 0;
std::string error_message;
@@ -121,12 +103,12 @@
}
// Test proper JSON deserialization from a StringPiece substring.
-TEST(JSONValueSerializerTest, ReadProperJSONFromStringPiece) {
+TEST(JSONValueDeserializerTest, ReadProperJSONFromStringPiece) {
// Create a StringPiece for the substring of kProperJSONPadded that matches
// kProperJSON.
base::StringPiece proper_json(kProperJSONPadded);
proper_json = proper_json.substr(5, proper_json.length() - 10);
- JSONStringValueSerializer str_deserializer(proper_json);
+ JSONStringValueDeserializer str_deserializer(proper_json);
int error_code = 0;
std::string error_message;
@@ -141,9 +123,9 @@
// Test that trialing commas are only properly deserialized from string when
// the proper flag for that is set.
-TEST(JSONValueSerializerTest, ReadJSONWithTrailingCommasFromString) {
+TEST(JSONValueDeserializerTest, ReadJSONWithTrailingCommasFromString) {
// Try to deserialize it through the serializer.
- JSONStringValueSerializer str_deserializer(kProperJSONWithCommas);
+ JSONStringValueDeserializer str_deserializer(kProperJSONWithCommas);
int error_code = 0;
std::string error_message;
@@ -161,8 +143,8 @@
CheckJSONIsStillTheSame(*value);
}
-// Test proper JSON [de]serialization from file is working.
-TEST(JSONValueSerializerTest, ReadProperJSONFromFile) {
+// Test proper JSON deserialization from file is working.
+TEST(JSONValueDeserializerTest, ReadProperJSONFromFile) {
ScopedTempDir tempdir;
ASSERT_TRUE(tempdir.CreateUniqueTempDir());
// Write it down in the file.
@@ -171,7 +153,7 @@
WriteFile(temp_file, kProperJSON, strlen(kProperJSON)));
// Try to deserialize it through the serializer.
- JSONFileValueSerializer file_deserializer(temp_file);
+ JSONFileValueDeserializer file_deserializer(temp_file);
int error_code = 0;
std::string error_message;
@@ -186,7 +168,7 @@
// Test that trialing commas are only properly deserialized from file when
// the proper flag for that is set.
-TEST(JSONValueSerializerTest, ReadJSONWithCommasFromFile) {
+TEST(JSONValueDeserializerTest, ReadJSONWithCommasFromFile) {
ScopedTempDir tempdir;
ASSERT_TRUE(tempdir.CreateUniqueTempDir());
// Write it down in the file.
@@ -196,7 +178,7 @@
strlen(kProperJSONWithCommas)));
// Try to deserialize it through the serializer.
- JSONFileValueSerializer file_deserializer(temp_file);
+ JSONFileValueDeserializer file_deserializer(temp_file);
// This must fail without the proper flag.
int error_code = 0;
std::string error_message;
@@ -214,11 +196,27 @@
CheckJSONIsStillTheSame(*value);
}
+TEST(JSONValueDeserializerTest, AllowTrailingComma) {
+ scoped_ptr<Value> root;
+ scoped_ptr<Value> root_expected;
+ static const char kTestWithCommas[] = "{\"key\": [true,],}";
+ static const char kTestNoCommas[] = "{\"key\": [true]}";
+
+ JSONStringValueDeserializer deserializer(kTestWithCommas);
+ deserializer.set_allow_trailing_comma(true);
+ JSONStringValueDeserializer deserializer_expected(kTestNoCommas);
+ root.reset(deserializer.Deserialize(NULL, NULL));
+ ASSERT_TRUE(root.get());
+ root_expected.reset(deserializer_expected.Deserialize(NULL, NULL));
+ ASSERT_TRUE(root_expected.get());
+ ASSERT_TRUE(root->Equals(root_expected.get()));
+}
+
TEST(JSONValueSerializerTest, Roundtrip) {
static const char kOriginalSerialization[] =
"{\"bool\":true,\"double\":3.14,\"int\":42,\"list\":[1,2],\"null\":null}";
- JSONStringValueSerializer serializer(kOriginalSerialization);
- scoped_ptr<Value> root(serializer.Deserialize(NULL, NULL));
+ JSONStringValueDeserializer deserializer(kOriginalSerialization);
+ scoped_ptr<Value> root(deserializer.Deserialize(NULL, NULL));
ASSERT_TRUE(root.get());
ASSERT_TRUE(root->IsType(Value::TYPE_DICTIONARY));
@@ -241,10 +239,6 @@
ASSERT_TRUE(root_dict->GetDouble("double", &double_value));
ASSERT_DOUBLE_EQ(3.14, double_value);
- // We shouldn't be able to write using this serializer, since it was
- // initialized with a const string.
- ASSERT_FALSE(serializer.Serialize(*root_dict));
-
std::string test_serialization;
JSONStringValueSerializer mutable_serializer(&test_serialization);
ASSERT_TRUE(mutable_serializer.Serialize(*root_dict));
@@ -331,7 +325,7 @@
ASSERT_EQ(kExpected, actual);
// escaped ascii text -> json
- JSONStringValueSerializer deserializer(kExpected);
+ JSONStringValueDeserializer deserializer(kExpected);
scoped_ptr<Value> deserial_root(deserializer.Deserialize(NULL, NULL));
ASSERT_TRUE(deserial_root.get());
DictionaryValue* dict_root =
@@ -355,7 +349,7 @@
ASSERT_EQ(kExpected, actual);
// escaped ascii text -> json
- JSONStringValueSerializer deserializer(kExpected);
+ JSONStringValueDeserializer deserializer(kExpected);
scoped_ptr<Value> deserial_root(deserializer.Deserialize(NULL, NULL));
ASSERT_TRUE(deserial_root.get());
DictionaryValue* dict_root =
@@ -366,7 +360,7 @@
// Test converting escaped regular chars
static const char kEscapedChars[] = "{\"test\":\"\\u0067\\u006f\"}";
- JSONStringValueSerializer deserializer2(kEscapedChars);
+ JSONStringValueDeserializer deserializer2(kEscapedChars);
deserial_root.reset(deserializer2.Deserialize(NULL, NULL));
ASSERT_TRUE(deserial_root.get());
dict_root = static_cast<DictionaryValue*>(deserial_root.get());
@@ -374,22 +368,6 @@
ASSERT_EQ(ASCIIToUTF16("go"), test_value);
}
-TEST(JSONValueSerializerTest, AllowTrailingComma) {
- scoped_ptr<Value> root;
- scoped_ptr<Value> root_expected;
- static const char kTestWithCommas[] = "{\"key\": [true,],}";
- static const char kTestNoCommas[] = "{\"key\": [true]}";
-
- JSONStringValueSerializer serializer(kTestWithCommas);
- serializer.set_allow_trailing_comma(true);
- JSONStringValueSerializer serializer_expected(kTestNoCommas);
- root.reset(serializer.Deserialize(NULL, NULL));
- ASSERT_TRUE(root.get());
- root_expected.reset(serializer_expected.Deserialize(NULL, NULL));
- ASSERT_TRUE(root_expected.get());
- ASSERT_TRUE(root->Equals(root_expected.get()));
-}
-
TEST(JSONValueSerializerTest, JSONReaderComments) {
ValidateJsonList("[ // 2, 3, ignore me ] \n1 ]");
ValidateJsonList("[ /* 2, \n3, ignore me ]*/ \n1 ]");
@@ -435,7 +413,7 @@
ASSERT_TRUE(PathExists(original_file_path));
- JSONFileValueSerializer deserializer(original_file_path);
+ JSONFileValueDeserializer deserializer(original_file_path);
scoped_ptr<Value> root;
root.reset(deserializer.Deserialize(NULL, NULL));
@@ -483,7 +461,7 @@
ASSERT_TRUE(PathExists(original_file_path));
- JSONFileValueSerializer deserializer(original_file_path);
+ JSONFileValueDeserializer deserializer(original_file_path);
scoped_ptr<Value> root;
root.reset(deserializer.Deserialize(NULL, NULL));
ASSERT_TRUE(root.get());
@@ -508,9 +486,9 @@
source_file_path = source_file_path.Append(
FILE_PATH_LITERAL("serializer_test_nowhitespace.json"));
ASSERT_TRUE(PathExists(source_file_path));
- JSONFileValueSerializer serializer(source_file_path);
+ JSONFileValueDeserializer deserializer(source_file_path);
scoped_ptr<Value> root;
- root.reset(serializer.Deserialize(NULL, NULL));
+ root.reset(deserializer.Deserialize(NULL, NULL));
ASSERT_TRUE(root.get());
}
diff --git a/base/mac/foundation_util.h b/base/mac/foundation_util.h
index accc0d9..353ed7c 100644
--- a/base/mac/foundation_util.h
+++ b/base/mac/foundation_util.h
@@ -296,6 +296,7 @@
CF_CAST_DECL(CGColor);
CF_CAST_DECL(CTFont);
+CF_CAST_DECL(CTFontDescriptor);
CF_CAST_DECL(CTRun);
CF_CAST_DECL(SecACL);
diff --git a/base/mac/foundation_util.mm b/base/mac/foundation_util.mm
index 2895b66..27d6e7c 100644
--- a/base/mac/foundation_util.mm
+++ b/base/mac/foundation_util.mm
@@ -362,6 +362,7 @@
CF_CAST_DEFN(CGColor);
+CF_CAST_DEFN(CTFontDescriptor);
CF_CAST_DEFN(CTRun);
#if defined(OS_IOS)
diff --git a/base/mac/sdk_forward_declarations.h b/base/mac/sdk_forward_declarations.h
index 2795b19..25d937e 100644
--- a/base/mac/sdk_forward_declarations.h
+++ b/base/mac/sdk_forward_declarations.h
@@ -285,6 +285,10 @@
- (NSString*)UUIDString;
@end
+@interface NSControl (MountainLionSDK)
+@property BOOL allowsExpansionToolTips;
+@end
+
#endif // MAC_OS_X_VERSION_10_8
diff --git a/base/memory/discardable_memory_android.cc b/base/memory/discardable_memory_android.cc
index 5dcdfdc..2b35587 100644
--- a/base/memory/discardable_memory_android.cc
+++ b/base/memory/discardable_memory_android.cc
@@ -52,8 +52,8 @@
void DiscardableMemory::GetSupportedTypes(
std::vector<DiscardableMemoryType>* types) {
const DiscardableMemoryType supported_types[] = {
- DISCARDABLE_MEMORY_TYPE_ASHMEM,
DISCARDABLE_MEMORY_TYPE_SHMEM,
+ DISCARDABLE_MEMORY_TYPE_ASHMEM,
DISCARDABLE_MEMORY_TYPE_EMULATED
};
types->assign(supported_types, supported_types + arraysize(supported_types));
diff --git a/base/memory/discardable_memory_mac.cc b/base/memory/discardable_memory_mac.cc
index e0096e5..2881f5e 100644
--- a/base/memory/discardable_memory_mac.cc
+++ b/base/memory/discardable_memory_mac.cc
@@ -22,8 +22,8 @@
void DiscardableMemory::GetSupportedTypes(
std::vector<DiscardableMemoryType>* types) {
const DiscardableMemoryType supported_types[] = {
- DISCARDABLE_MEMORY_TYPE_MACH,
DISCARDABLE_MEMORY_TYPE_SHMEM,
+ DISCARDABLE_MEMORY_TYPE_MACH,
DISCARDABLE_MEMORY_TYPE_EMULATED
};
types->assign(supported_types, supported_types + arraysize(supported_types));
diff --git a/base/memory/discardable_shared_memory.h b/base/memory/discardable_shared_memory.h
index 59c5d5b..e3b437c 100644
--- a/base/memory/discardable_shared_memory.h
+++ b/base/memory/discardable_shared_memory.h
@@ -74,7 +74,7 @@
// must have been mapped via Map().
void* memory() const;
- // Returns the last know usage time for DiscardableSharedMemory object. This
+ // Returns the last known usage time for DiscardableSharedMemory object. This
// may be earlier than the "true" usage time when memory has been used by a
// different process. Returns NULL time if purged.
Time last_known_usage() const { return last_known_usage_; }
@@ -84,7 +84,7 @@
// for two reasons; object might be locked or our last known usage timestamp
// might be out of date. Last known usage time is updated to |current_time|
// if locked or the actual last usage timestamp if unlocked. It is often
- // neccesary to call this function twice for the object to successfully be
+ // necessary to call this function twice for the object to successfully be
// purged. First call, updates |last_known_usage_|. Second call, successfully
// purges the object using the updated |last_known_usage_|.
// Note: there is no guarantee that multiple calls to this function will
diff --git a/base/prefs/base_prefs_switches.cc b/base/prefs/base_prefs_switches.cc
new file mode 100644
index 0000000..304248b
--- /dev/null
+++ b/base/prefs/base_prefs_switches.cc
@@ -0,0 +1,12 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/prefs/base_prefs_switches.h"
+
+namespace switches {
+
+// Pretty-prints pref JSON files.
+const char kPrettyPrintPrefs[] = "pretty-print-prefs";
+
+} // namespace switches
diff --git a/base/prefs/base_prefs_switches.h b/base/prefs/base_prefs_switches.h
new file mode 100644
index 0000000..7a6b665
--- /dev/null
+++ b/base/prefs/base_prefs_switches.h
@@ -0,0 +1,14 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_PREFS_BASE_PREFS_SWITCHES_H_
+#define BASE_PREFS_BASE_PREFS_SWITCHES_H_
+
+namespace switches {
+
+extern const char kPrettyPrintPrefs[];
+
+} // namespace switches
+
+#endif // BASE_PREFS_BASE_PREFS_SWITCHES_H_
diff --git a/base/prefs/json_pref_store.cc b/base/prefs/json_pref_store.cc
index c52a95c..2e34b50 100644
--- a/base/prefs/json_pref_store.cc
+++ b/base/prefs/json_pref_store.cc
@@ -8,12 +8,14 @@
#include "base/bind.h"
#include "base/callback.h"
+#include "base/command_line.h"
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/json/json_file_value_serializer.h"
#include "base/json/json_string_value_serializer.h"
#include "base/memory/ref_counted.h"
#include "base/metrics/histogram.h"
+#include "base/prefs/base_prefs_switches.h"
#include "base/prefs/pref_filter.h"
#include "base/sequenced_task_runner.h"
#include "base/strings/string_util.h"
@@ -56,16 +58,16 @@
DVLOG(1) << "Error while loading JSON file: " << error_msg
<< ", file: " << path.value();
switch (error_code) {
- case JSONFileValueSerializer::JSON_ACCESS_DENIED:
+ case JSONFileValueDeserializer::JSON_ACCESS_DENIED:
return PersistentPrefStore::PREF_READ_ERROR_ACCESS_DENIED;
break;
- case JSONFileValueSerializer::JSON_CANNOT_READ_FILE:
+ case JSONFileValueDeserializer::JSON_CANNOT_READ_FILE:
return PersistentPrefStore::PREF_READ_ERROR_FILE_OTHER;
break;
- case JSONFileValueSerializer::JSON_FILE_LOCKED:
+ case JSONFileValueDeserializer::JSON_FILE_LOCKED:
return PersistentPrefStore::PREF_READ_ERROR_FILE_LOCKED;
break;
- case JSONFileValueSerializer::JSON_NO_SUCH_FILE:
+ case JSONFileValueDeserializer::JSON_NO_SUCH_FILE:
return PersistentPrefStore::PREF_READ_ERROR_NO_FILE;
break;
default:
@@ -119,14 +121,14 @@
std::string error_msg;
scoped_ptr<JsonPrefStore::ReadResult> read_result(
new JsonPrefStore::ReadResult);
- JSONFileValueSerializer serializer(path);
- read_result->value.reset(serializer.Deserialize(&error_code, &error_msg));
+ JSONFileValueDeserializer deserializer(path);
+ read_result->value.reset(deserializer.Deserialize(&error_code, &error_msg));
read_result->error =
HandleReadErrors(read_result->value.get(), path, error_code, error_msg);
read_result->no_dir = !base::PathExists(path.DirName());
if (read_result->error == PersistentPrefStore::PREF_READ_ERROR_NONE)
- RecordJsonDataSizeHistogram(path, serializer.get_last_read_size());
+ RecordJsonDataSizeHistogram(path, deserializer.get_last_read_size());
return read_result.Pass();
}
@@ -398,7 +400,10 @@
pref_filter_->FilterSerializeData(prefs_.get());
JSONStringValueSerializer serializer(output);
- serializer.set_pretty_print(true);
+ if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kPrettyPrintPrefs)) {
+ serializer.set_pretty_print(true);
+ }
return serializer.Serialize(*prefs_);
}
diff --git a/base/process/kill.cc b/base/process/kill.cc
index caca348..a647d96 100644
--- a/base/process/kill.cc
+++ b/base/process/kill.cc
@@ -14,11 +14,8 @@
bool result = true;
NamedProcessIterator iter(executable_name, filter);
while (const ProcessEntry* entry = iter.NextProcessEntry()) {
-#if defined(OS_WIN)
- result &= KillProcessById(entry->pid(), exit_code, true);
-#else
- result &= KillProcess(entry->pid(), exit_code, true);
-#endif
+ Process process = Process::Open(entry->pid());
+ result &= KillProcess(process.Handle(), exit_code, true);
}
return result;
}
diff --git a/base/process/kill.h b/base/process/kill.h
index 8c0a213..df0d95e 100644
--- a/base/process/kill.h
+++ b/base/process/kill.h
@@ -57,12 +57,6 @@
BASE_EXPORT bool KillProcessGroup(ProcessHandle process_group_id);
#endif // defined(OS_POSIX)
-#if defined(OS_WIN)
-BASE_EXPORT bool KillProcessById(ProcessId process_id,
- int exit_code,
- bool wait);
-#endif // defined(OS_WIN)
-
// Get the termination status of the process by interpreting the
// circumstances of the child process' death. |exit_code| is set to
// the status returned by waitpid() on POSIX, and from
@@ -94,22 +88,6 @@
ProcessHandle handle, int* exit_code);
#endif // defined(OS_POSIX)
-// Waits for process to exit. On POSIX systems, if the process hasn't been
-// signaled then puts the exit code in |exit_code|; otherwise it's considered
-// a failure. On Windows |exit_code| is always filled. Returns true on success,
-// and closes |handle| in any case.
-BASE_EXPORT bool WaitForExitCode(ProcessHandle handle, int* exit_code);
-
-// Waits for process to exit. If it did exit within |timeout_milliseconds|,
-// then puts the exit code in |exit_code|, and returns true.
-// In POSIX systems, if the process has been signaled then |exit_code| is set
-// to -1. Returns false on failure (the caller is then responsible for closing
-// |handle|).
-// The caller is always responsible for closing the |handle|.
-BASE_EXPORT bool WaitForExitCodeWithTimeout(ProcessHandle handle,
- int* exit_code,
- base::TimeDelta timeout);
-
// Wait for all the processes based on the named executable to exit. If filter
// is non-null, then only processes selected by the filter are waited on.
// Returns after all processes have exited or wait_milliseconds have expired.
diff --git a/base/process/kill_posix.cc b/base/process/kill_posix.cc
index 77705ee..298486b 100644
--- a/base/process/kill_posix.cc
+++ b/base/process/kill_posix.cc
@@ -22,161 +22,6 @@
namespace {
-#if !defined(OS_NACL_NONSFI)
-bool WaitpidWithTimeout(ProcessHandle handle,
- int* status,
- base::TimeDelta wait) {
- // This POSIX version of this function only guarantees that we wait no less
- // than |wait| for the process to exit. The child process may
- // exit sometime before the timeout has ended but we may still block for up
- // to 256 milliseconds after the fact.
- //
- // waitpid() has no direct support on POSIX for specifying a timeout, you can
- // either ask it to block indefinitely or return immediately (WNOHANG).
- // When a child process terminates a SIGCHLD signal is sent to the parent.
- // Catching this signal would involve installing a signal handler which may
- // affect other parts of the application and would be difficult to debug.
- //
- // Our strategy is to call waitpid() once up front to check if the process
- // has already exited, otherwise to loop for |wait|, sleeping for
- // at most 256 milliseconds each time using usleep() and then calling
- // waitpid(). The amount of time we sleep starts out at 1 milliseconds, and
- // we double it every 4 sleep cycles.
- //
- // usleep() is speced to exit if a signal is received for which a handler
- // has been installed. This means that when a SIGCHLD is sent, it will exit
- // depending on behavior external to this function.
- //
- // This function is used primarily for unit tests, if we want to use it in
- // the application itself it would probably be best to examine other routes.
-
- if (wait.InMilliseconds() == base::kNoTimeout) {
- return HANDLE_EINTR(waitpid(handle, status, 0)) > 0;
- }
-
- pid_t ret_pid = HANDLE_EINTR(waitpid(handle, status, WNOHANG));
- static const int64 kMaxSleepInMicroseconds = 1 << 18; // ~256 milliseconds.
- int64 max_sleep_time_usecs = 1 << 10; // ~1 milliseconds.
- int64 double_sleep_time = 0;
-
- // If the process hasn't exited yet, then sleep and try again.
- TimeTicks wakeup_time = TimeTicks::Now() + wait;
- while (ret_pid == 0) {
- TimeTicks now = TimeTicks::Now();
- if (now > wakeup_time)
- break;
- // Guaranteed to be non-negative!
- int64 sleep_time_usecs = (wakeup_time - now).InMicroseconds();
- // Sleep for a bit while we wait for the process to finish.
- if (sleep_time_usecs > max_sleep_time_usecs)
- sleep_time_usecs = max_sleep_time_usecs;
-
- // usleep() will return 0 and set errno to EINTR on receipt of a signal
- // such as SIGCHLD.
- usleep(sleep_time_usecs);
- ret_pid = HANDLE_EINTR(waitpid(handle, status, WNOHANG));
-
- if ((max_sleep_time_usecs < kMaxSleepInMicroseconds) &&
- (double_sleep_time++ % 4 == 0)) {
- max_sleep_time_usecs *= 2;
- }
- }
-
- return ret_pid > 0;
-}
-
-#if defined(OS_MACOSX)
-// Using kqueue on Mac so that we can wait on non-child processes.
-// We can't use kqueues on child processes because we need to reap
-// our own children using wait.
-static bool WaitForSingleNonChildProcess(ProcessHandle handle,
- TimeDelta wait) {
- DCHECK_GT(handle, 0);
- DCHECK(wait.InMilliseconds() == kNoTimeout || wait > TimeDelta());
-
- ScopedFD kq(kqueue());
- if (!kq.is_valid()) {
- DPLOG(ERROR) << "kqueue";
- return false;
- }
-
- struct kevent change = {0};
- EV_SET(&change, handle, EVFILT_PROC, EV_ADD, NOTE_EXIT, 0, NULL);
- int result = HANDLE_EINTR(kevent(kq.get(), &change, 1, NULL, 0, NULL));
- if (result == -1) {
- if (errno == ESRCH) {
- // If the process wasn't found, it must be dead.
- return true;
- }
-
- DPLOG(ERROR) << "kevent (setup " << handle << ")";
- return false;
- }
-
- // Keep track of the elapsed time to be able to restart kevent if it's
- // interrupted.
- bool wait_forever = wait.InMilliseconds() == kNoTimeout;
- TimeDelta remaining_delta;
- TimeTicks deadline;
- if (!wait_forever) {
- remaining_delta = wait;
- deadline = TimeTicks::Now() + remaining_delta;
- }
-
- result = -1;
- struct kevent event = {0};
-
- while (wait_forever || remaining_delta > TimeDelta()) {
- struct timespec remaining_timespec;
- struct timespec* remaining_timespec_ptr;
- if (wait_forever) {
- remaining_timespec_ptr = NULL;
- } else {
- remaining_timespec = remaining_delta.ToTimeSpec();
- remaining_timespec_ptr = &remaining_timespec;
- }
-
- result = kevent(kq.get(), NULL, 0, &event, 1, remaining_timespec_ptr);
-
- if (result == -1 && errno == EINTR) {
- if (!wait_forever) {
- remaining_delta = deadline - TimeTicks::Now();
- }
- result = 0;
- } else {
- break;
- }
- }
-
- if (result < 0) {
- DPLOG(ERROR) << "kevent (wait " << handle << ")";
- return false;
- } else if (result > 1) {
- DLOG(ERROR) << "kevent (wait " << handle << "): unexpected result "
- << result;
- return false;
- } else if (result == 0) {
- // Timed out.
- return false;
- }
-
- DCHECK_EQ(result, 1);
-
- if (event.filter != EVFILT_PROC ||
- (event.fflags & NOTE_EXIT) == 0 ||
- event.ident != static_cast<uintptr_t>(handle)) {
- DLOG(ERROR) << "kevent (wait " << handle
- << "): unexpected event: filter=" << event.filter
- << ", fflags=" << event.fflags
- << ", ident=" << event.ident;
- return false;
- }
-
- return true;
-}
-#endif // OS_MACOSX
-#endif // !defined(OS_NACL_NONSFI)
-
TerminationStatus GetTerminationStatusImpl(ProcessHandle handle,
bool can_block,
int* exit_code) {
@@ -302,52 +147,6 @@
}
#if !defined(OS_NACL_NONSFI)
-bool WaitForExitCode(ProcessHandle handle, int* exit_code) {
- int status;
- if (HANDLE_EINTR(waitpid(handle, &status, 0)) == -1) {
- NOTREACHED();
- return false;
- }
-
- if (WIFEXITED(status)) {
- *exit_code = WEXITSTATUS(status);
- return true;
- }
-
- // If it didn't exit cleanly, it must have been signaled.
- DCHECK(WIFSIGNALED(status));
- return false;
-}
-
-bool WaitForExitCodeWithTimeout(ProcessHandle handle,
- int* exit_code,
- TimeDelta timeout) {
- ProcessHandle parent_pid = GetParentProcessId(handle);
- ProcessHandle our_pid = GetCurrentProcessHandle();
- if (parent_pid != our_pid) {
-#if defined(OS_MACOSX)
- // On Mac we can wait on non child processes.
- return WaitForSingleNonChildProcess(handle, timeout);
-#else
- // Currently on Linux we can't handle non child processes.
- NOTIMPLEMENTED();
-#endif // OS_MACOSX
- }
-
- int status;
- if (!WaitpidWithTimeout(handle, &status, timeout))
- return false;
- if (WIFSIGNALED(status)) {
- *exit_code = -1;
- return true;
- }
- if (WIFEXITED(status)) {
- *exit_code = WEXITSTATUS(status);
- return true;
- }
- return false;
-}
-
bool WaitForProcessesToExit(const FilePath::StringType& executable_name,
TimeDelta wait,
const ProcessFilter* filter) {
diff --git a/base/process/kill_win.cc b/base/process/kill_win.cc
index 7daf5f8..3c93047 100644
--- a/base/process/kill_win.cc
+++ b/base/process/kill_win.cc
@@ -12,7 +12,6 @@
#include "base/logging.h"
#include "base/message_loop/message_loop.h"
#include "base/process/process_iterator.h"
-#include "base/profiler/scoped_tracker.h"
#include "base/win/object_watcher.h"
namespace base {
@@ -71,11 +70,6 @@
}
void TimerExpiredTask::OnObjectSignaled(HANDLE object) {
- // TODO(vadimt): Remove ScopedTracker below once crbug.com/418183 is fixed.
- tracked_objects::ScopedTracker tracking_profile(
- FROM_HERE_WITH_EXPLICIT_FUNCTION(
- "418183 TimerExpiredTask::OnObjectSignaled"));
-
process_.Close();
}
@@ -107,22 +101,6 @@
return result;
}
-// Attempts to kill the process identified by the given process
-// entry structure, giving it the specified exit code.
-// Returns true if this is successful, false otherwise.
-bool KillProcessById(ProcessId process_id, int exit_code, bool wait) {
- HANDLE process = OpenProcess(PROCESS_TERMINATE | SYNCHRONIZE,
- FALSE, // Don't inherit handle
- process_id);
- if (!process) {
- DPLOG(ERROR) << "Unable to open process " << process_id;
- return false;
- }
- bool ret = KillProcess(process, exit_code, wait);
- CloseHandle(process);
- return ret;
-}
-
TerminationStatus GetTerminationStatus(ProcessHandle handle, int* exit_code) {
DWORD tmp_exit_code = 0;
@@ -181,26 +159,6 @@
}
}
-bool WaitForExitCode(ProcessHandle handle, int* exit_code) {
- // TODO(rvargas) crbug.com/417532: Remove this function.
- Process process(handle);
- return process.WaitForExit(exit_code);
-}
-
-bool WaitForExitCodeWithTimeout(ProcessHandle handle,
- int* exit_code,
- TimeDelta timeout) {
- if (::WaitForSingleObject(
- handle, static_cast<DWORD>(timeout.InMilliseconds())) != WAIT_OBJECT_0)
- return false;
- DWORD temp_code; // Don't clobber out-parameters in case of failure.
- if (!::GetExitCodeProcess(handle, &temp_code))
- return false;
-
- *exit_code = temp_code;
- return true;
-}
-
bool WaitForProcessesToExit(const FilePath::StringType& executable_name,
TimeDelta wait,
const ProcessFilter* filter) {
diff --git a/base/process/launch_posix.cc b/base/process/launch_posix.cc
index 203b7c8..f9963fa 100644
--- a/base/process/launch_posix.cc
+++ b/base/process/launch_posix.cc
@@ -33,7 +33,7 @@
#include "base/logging.h"
#include "base/memory/scoped_ptr.h"
#include "base/posix/eintr_wrapper.h"
-#include "base/process/kill.h"
+#include "base/process/process.h"
#include "base/process/process_metrics.h"
#include "base/strings/stringprintf.h"
#include "base/synchronization/waitable_event.h"
@@ -684,7 +684,8 @@
// Always wait for exit code (even if we know we'll declare
// GOT_MAX_OUTPUT).
- bool success = WaitForExitCode(pid, exit_code);
+ Process process(pid);
+ bool success = process.WaitForExit(exit_code);
// If we stopped because we read as much as we wanted, we return
// GOT_MAX_OUTPUT (because the child may exit due to |SIGPIPE|).
diff --git a/base/process/process_posix.cc b/base/process/process_posix.cc
index bc2f3f8..a36bf77 100644
--- a/base/process/process_posix.cc
+++ b/base/process/process_posix.cc
@@ -5,12 +5,206 @@
#include "base/process/process.h"
#include <sys/resource.h>
-#include <sys/time.h>
-#include <sys/types.h>
+#include <sys/wait.h>
+#include "base/files/scoped_file.h"
#include "base/logging.h"
+#include "base/posix/eintr_wrapper.h"
#include "base/process/kill.h"
+#if defined(OS_MACOSX)
+#include <sys/event.h>
+#endif
+
+namespace {
+
+#if !defined(OS_NACL_NONSFI)
+
+bool WaitpidWithTimeout(base::ProcessHandle handle,
+ int* status,
+ base::TimeDelta wait) {
+ // This POSIX version of this function only guarantees that we wait no less
+ // than |wait| for the process to exit. The child process may
+ // exit sometime before the timeout has ended but we may still block for up
+ // to 256 milliseconds after the fact.
+ //
+ // waitpid() has no direct support on POSIX for specifying a timeout, you can
+ // either ask it to block indefinitely or return immediately (WNOHANG).
+ // When a child process terminates a SIGCHLD signal is sent to the parent.
+ // Catching this signal would involve installing a signal handler which may
+ // affect other parts of the application and would be difficult to debug.
+ //
+ // Our strategy is to call waitpid() once up front to check if the process
+ // has already exited, otherwise to loop for |wait|, sleeping for
+ // at most 256 milliseconds each time using usleep() and then calling
+ // waitpid(). The amount of time we sleep starts out at 1 milliseconds, and
+ // we double it every 4 sleep cycles.
+ //
+ // usleep() is speced to exit if a signal is received for which a handler
+ // has been installed. This means that when a SIGCHLD is sent, it will exit
+ // depending on behavior external to this function.
+ //
+ // This function is used primarily for unit tests, if we want to use it in
+ // the application itself it would probably be best to examine other routes.
+
+ if (wait == base::TimeDelta::Max()) {
+ return HANDLE_EINTR(waitpid(handle, status, 0)) > 0;
+ }
+
+ pid_t ret_pid = HANDLE_EINTR(waitpid(handle, status, WNOHANG));
+ static const int64 kMaxSleepInMicroseconds = 1 << 18; // ~256 milliseconds.
+ int64 max_sleep_time_usecs = 1 << 10; // ~1 milliseconds.
+ int64 double_sleep_time = 0;
+
+ // If the process hasn't exited yet, then sleep and try again.
+ base::TimeTicks wakeup_time = base::TimeTicks::Now() + wait;
+ while (ret_pid == 0) {
+ base::TimeTicks now = base::TimeTicks::Now();
+ if (now > wakeup_time)
+ break;
+ // Guaranteed to be non-negative!
+ int64 sleep_time_usecs = (wakeup_time - now).InMicroseconds();
+ // Sleep for a bit while we wait for the process to finish.
+ if (sleep_time_usecs > max_sleep_time_usecs)
+ sleep_time_usecs = max_sleep_time_usecs;
+
+ // usleep() will return 0 and set errno to EINTR on receipt of a signal
+ // such as SIGCHLD.
+ usleep(sleep_time_usecs);
+ ret_pid = HANDLE_EINTR(waitpid(handle, status, WNOHANG));
+
+ if ((max_sleep_time_usecs < kMaxSleepInMicroseconds) &&
+ (double_sleep_time++ % 4 == 0)) {
+ max_sleep_time_usecs *= 2;
+ }
+ }
+
+ return ret_pid > 0;
+}
+
+#if defined(OS_MACOSX)
+// Using kqueue on Mac so that we can wait on non-child processes.
+// We can't use kqueues on child processes because we need to reap
+// our own children using wait.
+static bool WaitForSingleNonChildProcess(base::ProcessHandle handle,
+ base::TimeDelta wait) {
+ DCHECK_GT(handle, 0);
+ DCHECK_GT(wait, base::TimeDelta());
+
+ base::ScopedFD kq(kqueue());
+ if (!kq.is_valid()) {
+ DPLOG(ERROR) << "kqueue";
+ return false;
+ }
+
+ struct kevent change = {0};
+ EV_SET(&change, handle, EVFILT_PROC, EV_ADD, NOTE_EXIT, 0, NULL);
+ int result = HANDLE_EINTR(kevent(kq.get(), &change, 1, NULL, 0, NULL));
+ if (result == -1) {
+ if (errno == ESRCH) {
+ // If the process wasn't found, it must be dead.
+ return true;
+ }
+
+ DPLOG(ERROR) << "kevent (setup " << handle << ")";
+ return false;
+ }
+
+ // Keep track of the elapsed time to be able to restart kevent if it's
+ // interrupted.
+ bool wait_forever = (wait == base::TimeDelta::Max());
+ base::TimeDelta remaining_delta;
+ base::TimeTicks deadline;
+ if (!wait_forever) {
+ remaining_delta = wait;
+ deadline = base::TimeTicks::Now() + remaining_delta;
+ }
+
+ result = -1;
+ struct kevent event = {0};
+
+ while (wait_forever || remaining_delta > base::TimeDelta()) {
+ struct timespec remaining_timespec;
+ struct timespec* remaining_timespec_ptr;
+ if (wait_forever) {
+ remaining_timespec_ptr = NULL;
+ } else {
+ remaining_timespec = remaining_delta.ToTimeSpec();
+ remaining_timespec_ptr = &remaining_timespec;
+ }
+
+ result = kevent(kq.get(), NULL, 0, &event, 1, remaining_timespec_ptr);
+
+ if (result == -1 && errno == EINTR) {
+ if (!wait_forever) {
+ remaining_delta = deadline - base::TimeTicks::Now();
+ }
+ result = 0;
+ } else {
+ break;
+ }
+ }
+
+ if (result < 0) {
+ DPLOG(ERROR) << "kevent (wait " << handle << ")";
+ return false;
+ } else if (result > 1) {
+ DLOG(ERROR) << "kevent (wait " << handle << "): unexpected result "
+ << result;
+ return false;
+ } else if (result == 0) {
+ // Timed out.
+ return false;
+ }
+
+ DCHECK_EQ(result, 1);
+
+ if (event.filter != EVFILT_PROC ||
+ (event.fflags & NOTE_EXIT) == 0 ||
+ event.ident != static_cast<uintptr_t>(handle)) {
+ DLOG(ERROR) << "kevent (wait " << handle
+ << "): unexpected event: filter=" << event.filter
+ << ", fflags=" << event.fflags
+ << ", ident=" << event.ident;
+ return false;
+ }
+
+ return true;
+}
+#endif // OS_MACOSX
+
+bool WaitForExitWithTimeoutImpl(base::ProcessHandle handle,
+ int* exit_code,
+ base::TimeDelta timeout) {
+ base::ProcessHandle parent_pid = base::GetParentProcessId(handle);
+ base::ProcessHandle our_pid = base::GetCurrentProcessHandle();
+ if (parent_pid != our_pid) {
+#if defined(OS_MACOSX)
+ // On Mac we can wait on non child processes.
+ return WaitForSingleNonChildProcess(handle, timeout);
+#else
+ // Currently on Linux we can't handle non child processes.
+ NOTIMPLEMENTED();
+#endif // OS_MACOSX
+ }
+
+ int status;
+ if (!WaitpidWithTimeout(handle, &status, timeout))
+ return false;
+ if (WIFSIGNALED(status)) {
+ *exit_code = -1;
+ return true;
+ }
+ if (WIFEXITED(status)) {
+ *exit_code = WEXITSTATUS(status);
+ return true;
+ }
+ return false;
+}
+#endif // !defined(OS_NACL_NONSFI)
+
+} // namespace
+
namespace base {
Process::Process(ProcessHandle handle) : process_(handle) {
@@ -102,15 +296,11 @@
}
bool Process::WaitForExit(int* exit_code) {
- // TODO(rvargas) crbug.com/417532: Remove this constant.
- const int kNoTimeout = -1;
- return WaitForExitWithTimeout(TimeDelta::FromMilliseconds(kNoTimeout),
- exit_code);
+ return WaitForExitWithTimeout(TimeDelta::Max(), exit_code);
}
bool Process::WaitForExitWithTimeout(TimeDelta timeout, int* exit_code) {
- // TODO(rvargas) crbug.com/417532: Move the implementation here.
- return base::WaitForExitCodeWithTimeout(Handle(), exit_code, timeout);
+ return WaitForExitWithTimeoutImpl(Handle(), exit_code, timeout);
}
#if !defined(OS_LINUX)
diff --git a/base/process/process_win.cc b/base/process/process_win.cc
index 8e5360b..b62fdb4 100644
--- a/base/process/process_win.cc
+++ b/base/process/process_win.cc
@@ -7,6 +7,7 @@
#include "base/logging.h"
#include "base/memory/scoped_ptr.h"
#include "base/metrics/field_trial.h"
+#include "base/numerics/safe_conversions.h"
#include "base/process/kill.h"
#include "base/win/windows_version.h"
@@ -141,10 +142,17 @@
}
bool Process::WaitForExitWithTimeout(TimeDelta timeout, int* exit_code) {
- // TODO(rvargas) crbug.com/417532: Move the implementation here.
- if (timeout > TimeDelta::FromMilliseconds(INFINITE))
- timeout = TimeDelta::FromMilliseconds(INFINITE);
- return base::WaitForExitCodeWithTimeout(Handle(), exit_code, timeout);
+ // Limit timeout to INFINITE.
+ DWORD timeout_ms = saturated_cast<DWORD>(timeout.InMilliseconds());
+ if (::WaitForSingleObject(Handle(), timeout_ms) != WAIT_OBJECT_0)
+ return false;
+
+ DWORD temp_code; // Don't clobber out-parameters in case of failure.
+ if (!::GetExitCodeProcess(Handle(), &temp_code))
+ return false;
+
+ *exit_code = temp_code;
+ return true;
}
bool Process::IsProcessBackgrounded() const {
diff --git a/base/synchronization/waitable_event.h b/base/synchronization/waitable_event.h
index 5adc1ec..c35af54 100644
--- a/base/synchronization/waitable_event.h
+++ b/base/synchronization/waitable_event.h
@@ -21,9 +21,6 @@
namespace base {
-// This replaces INFINITE from Win32
-static const int kNoTimeout = -1;
-
class TimeDelta;
// A WaitableEvent can be a useful thread synchronization tool when you want to
diff --git a/base/synchronization/waitable_event_watcher_win.cc b/base/synchronization/waitable_event_watcher_win.cc
index a04a435..46d47ac 100644
--- a/base/synchronization/waitable_event_watcher_win.cc
+++ b/base/synchronization/waitable_event_watcher_win.cc
@@ -5,7 +5,6 @@
#include "base/synchronization/waitable_event_watcher.h"
#include "base/compiler_specific.h"
-#include "base/profiler/scoped_tracker.h"
#include "base/synchronization/waitable_event.h"
#include "base/win/object_watcher.h"
@@ -37,11 +36,6 @@
}
void WaitableEventWatcher::OnObjectSignaled(HANDLE h) {
- // TODO(vadimt): Remove ScopedTracker below once crbug.com/418183 is fixed.
- tracked_objects::ScopedTracker tracking_profile(
- FROM_HERE_WITH_EXPLICIT_FUNCTION(
- "418183 WaitableEventWatcher::OnObjectSignaled"));
-
WaitableEvent* event = event_;
EventCallback callback = callback_;
event_ = NULL;
diff --git a/base/test/BUILD.gn b/base/test/BUILD.gn
index 05a3dc3..120159e 100644
--- a/base/test/BUILD.gn
+++ b/base/test/BUILD.gn
@@ -36,6 +36,8 @@
"mock_chrome_application_mac.mm",
"mock_devices_changed_observer.cc",
"mock_devices_changed_observer.h",
+ "mock_log.cc",
+ "mock_log.h",
"multiprocess_test.cc",
"multiprocess_test.h",
"multiprocess_test_android.cc",
diff --git a/base/test/data/pe_image/pe_image_test_32.dll b/base/test/data/pe_image/pe_image_test_32.dll
new file mode 100755
index 0000000..118ce11
--- /dev/null
+++ b/base/test/data/pe_image/pe_image_test_32.dll
Binary files differ
diff --git a/base/test/data/pe_image/pe_image_test_64.dll b/base/test/data/pe_image/pe_image_test_64.dll
new file mode 100755
index 0000000..70f8ea4
--- /dev/null
+++ b/base/test/data/pe_image/pe_image_test_64.dll
Binary files differ
diff --git a/base/test/data/prefs/write.golden.json b/base/test/data/prefs/write.golden.json
index 9a5523c..fb1fff1 100644
--- a/base/test/data/prefs/write.golden.json
+++ b/base/test/data/prefs/write.golden.json
@@ -1,11 +1 @@
-{
- "homepage": "http://www.cnn.com",
- "long_int": {
- "pref": "214748364842"
- },
- "some_directory": "/usr/sbin/",
- "tabs": {
- "max_tabs": 10,
- "new_windows_in_tabs": false
- }
-}
+{"homepage":"http://www.cnn.com","long_int":{"pref":"214748364842"},"some_directory":"/usr/sbin/","tabs":{"max_tabs":10,"new_windows_in_tabs":false}}
\ No newline at end of file
diff --git a/base/test/gtest_util.cc b/base/test/gtest_util.cc
index c0bc04a..b811194 100644
--- a/base/test/gtest_util.cc
+++ b/base/test/gtest_util.cc
@@ -47,7 +47,7 @@
bool ReadTestNamesFromFile(const FilePath& path,
std::vector<SplitTestName>* output) {
- JSONFileValueSerializer deserializer(path);
+ JSONFileValueDeserializer deserializer(path);
int error_code = 0;
std::string error_message;
scoped_ptr<base::Value> value(
@@ -80,4 +80,4 @@
return true;
}
-} // namespace
+} // namespace base
diff --git a/base/test/mock_log.cc b/base/test/mock_log.cc
new file mode 100644
index 0000000..fa511d4
--- /dev/null
+++ b/base/test/mock_log.cc
@@ -0,0 +1,68 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/test/mock_log.h"
+
+namespace base {
+namespace test {
+
+// static
+MockLog* MockLog::g_instance_ = nullptr;
+Lock MockLog::g_lock;
+
+MockLog::MockLog() : is_capturing_logs_(false) {
+}
+
+MockLog::~MockLog() {
+ if (is_capturing_logs_) {
+ StopCapturingLogs();
+ }
+}
+
+void MockLog::StartCapturingLogs() {
+ AutoLock scoped_lock(g_lock);
+
+ // We don't use CHECK(), which can generate a new LOG message, and
+ // thus can confuse MockLog objects or other registered
+ // LogSinks.
+ RAW_CHECK(!is_capturing_logs_);
+ RAW_CHECK(!g_instance_);
+
+ is_capturing_logs_ = true;
+ g_instance_ = this;
+ previous_handler_ = logging::GetLogMessageHandler();
+ logging::SetLogMessageHandler(LogMessageHandler);
+}
+
+void MockLog::StopCapturingLogs() {
+ AutoLock scoped_lock(g_lock);
+
+ // We don't use CHECK(), which can generate a new LOG message, and
+ // thus can confuse MockLog objects or other registered
+ // LogSinks.
+ RAW_CHECK(is_capturing_logs_);
+ RAW_CHECK(g_instance_ == this);
+
+ is_capturing_logs_ = false;
+ logging::SetLogMessageHandler(previous_handler_);
+ g_instance_ = nullptr;
+}
+
+// static
+bool MockLog::LogMessageHandler(int severity,
+ const char* file,
+ int line,
+ size_t message_start,
+ const std::string& str) {
+ // gMock guarantees thread-safety for calling a mocked method
+ // (https://code.google.com/p/googlemock/wiki/CookBook#Using_Google_Mock_and_Threads)
+ // but we also need to make sure that Start/StopCapturingLogs are synchronized
+ // with LogMessageHandler.
+ AutoLock scoped_lock(g_lock);
+
+ return g_instance_->Log(severity, file, line, message_start, str);
+}
+
+} // namespace test
+} // namespace base
diff --git a/base/test/mock_log.h b/base/test/mock_log.h
new file mode 100644
index 0000000..315ef1f
--- /dev/null
+++ b/base/test/mock_log.h
@@ -0,0 +1,98 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_TEST_MOCK_LOG_H_
+#define BASE_TEST_MOCK_LOG_H_
+
+#include <string>
+
+#include "base/logging.h"
+#include "base/macros.h"
+#include "base/synchronization/lock.h"
+#include "testing/gmock/include/gmock/gmock.h"
+
+namespace base {
+namespace test {
+
+// A MockLog object intercepts LOG() messages issued during its lifespan. Using
+// this together with gMock, it's very easy to test how a piece of code calls
+// LOG(). The typical usage:
+//
+// TEST(FooTest, LogsCorrectly) {
+// MockLog log;
+//
+// // We expect the WARNING "Something bad!" exactly twice.
+// EXPECT_CALL(log, Log(WARNING, _, "Something bad!"))
+// .Times(2);
+//
+// // We allow foo.cc to call LOG(INFO) any number of times.
+// EXPECT_CALL(log, Log(INFO, HasSubstr("/foo.cc"), _))
+// .Times(AnyNumber());
+//
+// log.StartCapturingLogs(); // Call this after done setting expectations.
+// Foo(); // Exercises the code under test.
+// }
+//
+// CAVEAT: base/logging does not allow a thread to call LOG() again when it's
+// already inside a LOG() call. Doing so will cause a deadlock. Therefore,
+// it's the user's responsibility to not call LOG() in an action triggered by
+// MockLog::Log(). You may call RAW_LOG() instead.
+class MockLog {
+ public:
+ // Creates a MockLog object that is not capturing logs. If it were to start
+ // to capture logs, it could be a problem if some other threads already exist
+ // and are logging, as the user hasn't had a chance to set up expectation on
+ // this object yet (calling a mock method before setting the expectation is
+ // UNDEFINED behavior).
+ MockLog();
+
+ // When the object is destructed, it stops intercepting logs.
+ ~MockLog();
+
+ // Starts log capturing if the object isn't already doing so.
+ // Otherwise crashes.
+ void StartCapturingLogs();
+
+ // Stops log capturing if the object is capturing logs. Otherwise crashes.
+ void StopCapturingLogs();
+
+ // Log method is invoked for every log message before it's sent to other log
+ // destinations (if any). The method should return true to signal that it
+ // handled the message and the message should not be sent to other log
+ // destinations.
+ MOCK_METHOD5(Log,
+ bool(int severity,
+ const char* file,
+ int line,
+ size_t message_start,
+ const std::string& str));
+
+ private:
+ // The currently active mock log.
+ static MockLog* g_instance_;
+
+ // Lock protecting access to g_instance_.
+ static Lock g_lock;
+
+ // Static function which is set as the logging message handler.
+ // Called once for each message.
+ static bool LogMessageHandler(int severity,
+ const char* file,
+ int line,
+ size_t message_start,
+ const std::string& str);
+
+ // True if this object is currently capturing logs.
+ bool is_capturing_logs_;
+
+ // The previous handler to restore when the MockLog is destroyed.
+ logging::LogMessageHandlerFunction previous_handler_;
+
+ DISALLOW_COPY_AND_ASSIGN(MockLog);
+};
+
+} // namespace test
+} // namespace base
+
+#endif // BASE_TEST_MOCK_LOG_H_
diff --git a/base/test/test_mock_time_task_runner.cc b/base/test/test_mock_time_task_runner.cc
index a878280..8e65ccf 100644
--- a/base/test/test_mock_time_task_runner.cc
+++ b/base/test/test_mock_time_task_runner.cc
@@ -154,8 +154,7 @@
const tracked_objects::Location& from_here,
const Closure& task,
TimeDelta delay) {
- NOTREACHED();
- return false;
+ return PostDelayedTask(from_here, task, delay);
}
void TestMockTimeTaskRunner::OnBeforeSelectingTask() {
diff --git a/base/test/test_mock_time_task_runner.h b/base/test/test_mock_time_task_runner.h
index 1a651f6..5f06013 100644
--- a/base/test/test_mock_time_task_runner.h
+++ b/base/test/test_mock_time_task_runner.h
@@ -32,13 +32,12 @@
// - It allows for reentrancy, in that it handles the running of tasks that in
// turn call back into it (e.g., to post more tasks).
// - Tasks are stored in a priority queue, and executed in the increasing
-// order of post time + delay.
+// order of post time + delay, but ignoring nestability.
// - It does not check for overflow when doing time arithmetic. A sufficient
// condition for preventing overflows is to make sure that the sum of all
// posted task delays and fast-forward increments is still representable by
// a TimeDelta, and that adding this delta to the starting values of Time
// and TickTime is still within their respective range.
-// - Non-nestable tasks are not supported.
// - Tasks aren't guaranteed to be destroyed immediately after they're run.
//
// This is a slightly more sophisticated version of TestSimpleTaskRunner, in
diff --git a/base/third_party/nspr/BUILD.gn b/base/third_party/nspr/BUILD.gn
index c0b2ec2..a67e168 100644
--- a/base/third_party/nspr/BUILD.gn
+++ b/base/third_party/nspr/BUILD.gn
@@ -3,9 +3,7 @@
# found in the LICENSE file.
source_set("nspr") {
- visibility = [
- "//base/*",
- ]
+ visibility = [ "//base/*" ]
sources = [
"prtime.cc",
diff --git a/base/threading/sequenced_worker_pool.cc b/base/threading/sequenced_worker_pool.cc
index 89224f7..19b81b7 100644
--- a/base/threading/sequenced_worker_pool.cc
+++ b/base/threading/sequenced_worker_pool.cc
@@ -798,9 +798,11 @@
// to run them. Also, there may be some tasks stuck behind running
// ones with the same sequence token, but additional threads won't
// help this case.
- if (shutdown_called_ &&
- blocking_shutdown_pending_task_count_ == 0)
+ if (shutdown_called_ && blocking_shutdown_pending_task_count_ == 0) {
+ AutoUnlock unlock(lock_);
+ delete_these_outside_lock.clear();
break;
+ }
waiting_thread_count_++;
switch (status) {
diff --git a/base/threading/sequenced_worker_pool_unittest.cc b/base/threading/sequenced_worker_pool_unittest.cc
index ed5f896..9d0f607 100644
--- a/base/threading/sequenced_worker_pool_unittest.cc
+++ b/base/threading/sequenced_worker_pool_unittest.cc
@@ -67,6 +67,23 @@
size_t unblock_counter_;
};
+class DestructionDeadlockChecker
+ : public base::RefCountedThreadSafe<DestructionDeadlockChecker> {
+ public:
+ DestructionDeadlockChecker(const scoped_refptr<SequencedWorkerPool>& pool)
+ : pool_(pool) {}
+
+ protected:
+ virtual ~DestructionDeadlockChecker() {
+ // This method should not deadlock.
+ pool_->RunsTasksOnCurrentThread();
+ }
+
+ private:
+ scoped_refptr<SequencedWorkerPool> pool_;
+ friend class base::RefCountedThreadSafe<DestructionDeadlockChecker>;
+};
+
class TestTracker : public base::RefCountedThreadSafe<TestTracker> {
public:
TestTracker()
@@ -117,6 +134,20 @@
SignalWorkerDone(id);
}
+ // This task posts itself back onto the SequencedWorkerPool before it
+ // finishes running. Each instance of the task maintains a strong reference
+ // to a DestructionDeadlockChecker. The DestructionDeadlockChecker is only
+ // destroyed when the task is destroyed without being run, which only happens
+ // during destruction of the SequencedWorkerPool.
+ void PostRepostingTask(
+ const scoped_refptr<SequencedWorkerPool>& pool,
+ const scoped_refptr<DestructionDeadlockChecker>& checker) {
+ Closure reposting_task =
+ base::Bind(&TestTracker::PostRepostingTask, this, pool, checker);
+ pool->PostWorkerTaskWithShutdownBehavior(
+ FROM_HERE, reposting_task, SequencedWorkerPool::SKIP_ON_SHUTDOWN);
+ }
+
// Waits until the given number of tasks have started executing.
void WaitUntilTasksBlocked(size_t count) {
{
@@ -749,6 +780,21 @@
unused_pool->Shutdown();
}
+// Checks that tasks are destroyed in the right context during shutdown. If a
+// task is destroyed while SequencedWorkerPool's global lock is held,
+// SequencedWorkerPool might deadlock.
+TEST_F(SequencedWorkerPoolTest, AvoidsDeadlockOnShutdown) {
+ for (int i = 0; i < 4; ++i) {
+ scoped_refptr<DestructionDeadlockChecker> checker(
+ new DestructionDeadlockChecker(pool()));
+ tracker()->PostRepostingTask(pool(), checker);
+ }
+
+ // Shutting down the pool should destroy the DestructionDeadlockCheckers,
+ // which in turn should not deadlock in their destructors.
+ pool()->Shutdown();
+}
+
// Verify that FlushForTesting works as intended.
TEST_F(SequencedWorkerPoolTest, FlushForTesting) {
// Should be fine to call on a new instance.
diff --git a/base/threading/thread_restrictions.h b/base/threading/thread_restrictions.h
index 7c46fd2..1e5f510 100644
--- a/base/threading/thread_restrictions.h
+++ b/base/threading/thread_restrictions.h
@@ -22,6 +22,7 @@
namespace cc {
class CompletionEvent;
+class TaskGraphRunner;
}
namespace chromeos {
class BlockingMethodCaller;
@@ -177,6 +178,7 @@
friend class ::HistogramSynchronizer;
friend class ::ScopedAllowWaitForLegacyWebViewApi;
friend class cc::CompletionEvent;
+ friend class cc::TaskGraphRunner;
friend class mojo::common::WatcherThreadManager;
friend class remoting::AutoThread;
friend class MessagePumpDefault;
diff --git a/base/timer/timer.cc b/base/timer/timer.cc
index 11f73ca..fa6b8cd 100644
--- a/base/timer/timer.cc
+++ b/base/timer/timer.cc
@@ -163,8 +163,10 @@
}
// Remember the thread ID that posts the first task -- this will be verified
// later when the task is abandoned to detect misuse from multiple threads.
- if (!thread_id_)
+ if (!thread_id_) {
+ DCHECK(GetTaskRunner()->BelongsToCurrentThread());
thread_id_ = static_cast<int>(PlatformThread::CurrentId());
+ }
}
scoped_refptr<SingleThreadTaskRunner> Timer::GetTaskRunner() {
diff --git a/base/timer/timer.h b/base/timer/timer.h
index ea34a9f..1ef58a3 100644
--- a/base/timer/timer.h
+++ b/base/timer/timer.h
@@ -89,7 +89,8 @@
virtual TimeDelta GetCurrentDelay() const;
// Set the task runner on which the task should be scheduled. This method can
- // only be called before any tasks have been scheduled.
+ // only be called before any tasks have been scheduled. The task runner must
+ // run tasks on the same thread the timer is used on.
virtual void SetTaskRunner(scoped_refptr<SingleThreadTaskRunner> task_runner);
// Start the timer to run at the given |delay| from now. If the timer is
diff --git a/base/trace_event/memory_dump_manager.cc b/base/trace_event/memory_dump_manager.cc
index c8be8f8..cbed238 100644
--- a/base/trace_event/memory_dump_manager.cc
+++ b/base/trace_event/memory_dump_manager.cc
@@ -6,6 +6,7 @@
#include <algorithm>
+#include "base/atomic_sequence_num.h"
#include "base/compiler_specific.h"
#include "base/trace_event/memory_dump_provider.h"
#include "base/trace_event/process_memory_dump.h"
@@ -15,7 +16,27 @@
namespace trace_event {
namespace {
+
MemoryDumpManager* g_instance_for_testing = nullptr;
+const int kTraceEventNumArgs = 1;
+const char* kTraceEventArgNames[] = {"dumps"};
+const unsigned char kTraceEventArgTypes[] = {TRACE_VALUE_TYPE_CONVERTABLE};
+StaticAtomicSequenceNumber g_next_guid;
+
+const char* DumpPointTypeToString(const DumpPointType& dump_point_type) {
+ switch (dump_point_type) {
+ case DumpPointType::TASK_BEGIN:
+ return "TASK_BEGIN";
+ case DumpPointType::TASK_END:
+ return "TASK_END";
+ case DumpPointType::PERIODIC_INTERVAL:
+ return "PERIODIC_INTERVAL";
+ case DumpPointType::EXPLICITLY_TRIGGERED:
+ return "EXPLICITLY_TRIGGERED";
+ }
+ NOTREACHED();
+ return "UNKNOWN";
+}
}
// TODO(primiano): this should be smarter and should do something similar to
@@ -76,13 +97,18 @@
dump_providers_enabled_.erase(it);
}
-void MemoryDumpManager::RequestDumpPoint(DumpPointType type) {
- // TODO(primiano): this will have more logic, IPC broadcast & co.
+void MemoryDumpManager::RequestDumpPoint(DumpPointType dump_point_type) {
+ // TODO(primiano): this will have more logic to coordinate dump points across
+ // multiple processes via IPC. See crbug.com/462930.
+
// Bail out immediately if tracing is not enabled at all.
if (!UNLIKELY(subtle::NoBarrier_Load(&memory_tracing_enabled_)))
return;
- CreateLocalDumpPoint();
+ // TODO(primiano): Make guid actually unique (cross-process) by hashing it
+ // with the PID. See crbug.com/462931 for details.
+ const uint64 guid = g_next_guid.GetNext();
+ CreateLocalDumpPoint(dump_point_type, guid);
}
void MemoryDumpManager::BroadcastDumpRequest() {
@@ -90,17 +116,44 @@
}
// Creates a dump point for the current process and appends it to the trace.
-void MemoryDumpManager::CreateLocalDumpPoint() {
- AutoLock lock(lock_);
+void MemoryDumpManager::CreateLocalDumpPoint(DumpPointType dump_point_type,
+ uint64 guid) {
+ bool did_any_provider_dump = false;
scoped_ptr<ProcessMemoryDump> pmd(new ProcessMemoryDump());
- for (MemoryDumpProvider* dump_provider : dump_providers_enabled_) {
- dump_provider->DumpInto(pmd.get());
+ // Serialize dump point generation so that memory dump providers don't have to
+ // deal with thread safety.
+ {
+ AutoLock lock(lock_);
+ for (auto it = dump_providers_enabled_.begin();
+ it != dump_providers_enabled_.end();) {
+ MemoryDumpProvider* dump_provider = *it;
+ if (dump_provider->DumpInto(pmd.get())) {
+ did_any_provider_dump = true;
+ ++it;
+ } else {
+ LOG(ERROR) << "The memory dumper " << dump_provider->GetFriendlyName()
+ << " failed, possibly due to sandboxing (crbug.com/461788), "
+ "disabling it for current process. Try restarting chrome "
+ "with the --no-sandbox switch.";
+ it = dump_providers_enabled_.erase(it);
+ }
+ }
}
- scoped_refptr<TracedValue> value(new TracedValue());
- pmd->AsValueInto(value.get());
- // TODO(primiano): add the dump point to the trace at this point.
+ // Don't create a dump point if all the dumpers failed.
+ if (!did_any_provider_dump)
+ return;
+
+ scoped_refptr<ConvertableToTraceFormat> event_value(new TracedValue());
+ pmd->AsValueInto(static_cast<TracedValue*>(event_value.get()));
+ const char* const event_name = DumpPointTypeToString(dump_point_type);
+
+ TRACE_EVENT_API_ADD_TRACE_EVENT(
+ TRACE_EVENT_PHASE_MEMORY_DUMP,
+ TraceLog::GetCategoryGroupEnabled(kTraceCategory), event_name, guid,
+ kTraceEventNumArgs, kTraceEventArgNames, kTraceEventArgTypes,
+ NULL /* arg_values */, &event_value, TRACE_EVENT_FLAG_HAS_ID);
}
void MemoryDumpManager::OnTraceLogEnabled() {
diff --git a/base/trace_event/memory_dump_manager.h b/base/trace_event/memory_dump_manager.h
index 1a22e61..8a9b3b7 100644
--- a/base/trace_event/memory_dump_manager.h
+++ b/base/trace_event/memory_dump_manager.h
@@ -43,7 +43,7 @@
// Requests a memory dump. The dump might happen or not depending on the
// filters and categories specified when enabling tracing.
- void RequestDumpPoint(DumpPointType type);
+ void RequestDumpPoint(DumpPointType dump_point_type);
// TraceLog::EnabledStateObserver implementation.
void OnTraceLogEnabled() override;
@@ -65,7 +65,7 @@
void BroadcastDumpRequest();
// Creates a dump point for the current process and appends it to the trace.
- void CreateLocalDumpPoint();
+ void CreateLocalDumpPoint(DumpPointType dump_point_type, uint64 guid);
std::vector<MemoryDumpProvider*> dump_providers_registered_; // Not owned.
std::vector<MemoryDumpProvider*> dump_providers_enabled_; // Not owned.
diff --git a/base/trace_event/memory_dump_manager_unittest.cc b/base/trace_event/memory_dump_manager_unittest.cc
index 1ba73e6..78be377 100644
--- a/base/trace_event/memory_dump_manager_unittest.cc
+++ b/base/trace_event/memory_dump_manager_unittest.cc
@@ -10,6 +10,7 @@
#include "testing/gtest/include/gtest/gtest.h"
using testing::_;
+using testing::Return;
namespace base {
namespace trace_event {
@@ -48,7 +49,9 @@
class MockDumpProvider : public MemoryDumpProvider {
public:
- MOCK_METHOD1(DumpInto, void(ProcessMemoryDump* pmd));
+ MOCK_METHOD1(DumpInto, bool(ProcessMemoryDump* pmd));
+
+ const char* GetFriendlyName() const override { return "MockDumpProvider"; }
};
TEST_F(MemoryDumpManagerTest, SingleDumper) {
@@ -64,7 +67,7 @@
// Now repeat enabling the memory category and check that the dumper is
// invoked this time.
EnableTracing(kTraceCategory);
- EXPECT_CALL(mdp, DumpInto(_)).Times(3);
+ EXPECT_CALL(mdp, DumpInto(_)).Times(3).WillRepeatedly(Return(true));
for (int i = 0; i < 3; ++i)
mdm_->RequestDumpPoint(DumpPointType::EXPLICITLY_TRIGGERED);
DisableTracing();
@@ -83,7 +86,7 @@
mdm_->RegisterDumpProvider(&mdp);
EnableTracing(kTraceCategory);
- EXPECT_CALL(mdp, DumpInto(_)).Times(1);
+ EXPECT_CALL(mdp, DumpInto(_)).Times(1).WillRepeatedly(Return(true));
mdm_->RequestDumpPoint(DumpPointType::EXPLICITLY_TRIGGERED);
mdm_->UnregisterDumpProvider(&mdp);
@@ -100,7 +103,7 @@
// Enable only mdp1.
mdm_->RegisterDumpProvider(&mdp1);
EnableTracing(kTraceCategory);
- EXPECT_CALL(mdp1, DumpInto(_)).Times(1);
+ EXPECT_CALL(mdp1, DumpInto(_)).Times(1).WillRepeatedly(Return(true));
EXPECT_CALL(mdp2, DumpInto(_)).Times(0);
mdm_->RequestDumpPoint(DumpPointType::EXPLICITLY_TRIGGERED);
DisableTracing();
@@ -110,18 +113,40 @@
mdm_->RegisterDumpProvider(&mdp2);
EnableTracing(kTraceCategory);
EXPECT_CALL(mdp1, DumpInto(_)).Times(0);
- EXPECT_CALL(mdp2, DumpInto(_)).Times(1);
+ EXPECT_CALL(mdp2, DumpInto(_)).Times(1).WillRepeatedly(Return(true));
mdm_->RequestDumpPoint(DumpPointType::EXPLICITLY_TRIGGERED);
DisableTracing();
// Enable both mdp1 and mdp2.
mdm_->RegisterDumpProvider(&mdp1);
EnableTracing(kTraceCategory);
- EXPECT_CALL(mdp1, DumpInto(_)).Times(1);
- EXPECT_CALL(mdp2, DumpInto(_)).Times(1);
+ EXPECT_CALL(mdp1, DumpInto(_)).Times(1).WillRepeatedly(Return(true));
+ EXPECT_CALL(mdp2, DumpInto(_)).Times(1).WillRepeatedly(Return(true));
mdm_->RequestDumpPoint(DumpPointType::EXPLICITLY_TRIGGERED);
DisableTracing();
}
+// Enable both dump providers, make mdp1 fail and assert that only mdp2 is
+// invoked the 2nd time.
+// FIXME(primiano): remove once crbug.com/461788 gets fixed.
+TEST_F(MemoryDumpManagerTest, DisableFailingDumpers) {
+ MockDumpProvider mdp1;
+ MockDumpProvider mdp2;
+
+ mdm_->RegisterDumpProvider(&mdp1);
+ mdm_->RegisterDumpProvider(&mdp2);
+ EnableTracing(kTraceCategory);
+
+ EXPECT_CALL(mdp1, DumpInto(_)).Times(1).WillRepeatedly(Return(false));
+ EXPECT_CALL(mdp2, DumpInto(_)).Times(1).WillRepeatedly(Return(true));
+ mdm_->RequestDumpPoint(DumpPointType::EXPLICITLY_TRIGGERED);
+
+ EXPECT_CALL(mdp1, DumpInto(_)).Times(0);
+ EXPECT_CALL(mdp2, DumpInto(_)).Times(1).WillRepeatedly(Return(false));
+ mdm_->RequestDumpPoint(DumpPointType::EXPLICITLY_TRIGGERED);
+
+ DisableTracing();
+}
+
} // namespace trace_Event
} // namespace base
diff --git a/base/trace_event/memory_dump_provider.h b/base/trace_event/memory_dump_provider.h
index 18363c5..1c5bbb1 100644
--- a/base/trace_event/memory_dump_provider.h
+++ b/base/trace_event/memory_dump_provider.h
@@ -17,7 +17,10 @@
class BASE_EXPORT MemoryDumpProvider {
public:
// Called by the MemoryDumpManager when generating dump points.
- virtual void DumpInto(ProcessMemoryDump* pmd) = 0;
+ // Returns: true if the |pmd| was successfully populated, false otherwise.
+ virtual bool DumpInto(ProcessMemoryDump* pmd) = 0;
+
+ virtual const char* GetFriendlyName() const = 0;
protected:
MemoryDumpProvider() {}
diff --git a/base/trace_event/process_memory_maps_dump_provider.cc b/base/trace_event/process_memory_maps_dump_provider.cc
index e1cefc3..93feded 100644
--- a/base/trace_event/process_memory_maps_dump_provider.cc
+++ b/base/trace_event/process_memory_maps_dump_provider.cc
@@ -15,6 +15,10 @@
namespace base {
namespace trace_event {
+namespace {
+const char kDumperFriendlyName[] = "ProcessMemoryMaps";
+}
+
#if defined(OS_LINUX) || defined(OS_ANDROID)
// static
std::istream* ProcessMemoryMapsDumpProvider::proc_smaps_for_testing = nullptr;
@@ -104,10 +108,9 @@
}
uint32 ReadLinuxProcSmapsFile(std::istream* smaps, ProcessMemoryMaps* pmm) {
- if (!smaps->good()) {
- LOG(ERROR) << "Could not read smaps file.";
+ if (!smaps->good())
return 0;
- }
+
const uint32 kNumExpectedCountersPerRegion = 2;
uint32 counters_parsed_for_current_region = 0;
uint32 num_valid_regions = 0;
@@ -154,7 +157,7 @@
// Called at trace dump point time. Creates a snapshot the memory maps for the
// current process.
-void ProcessMemoryMapsDumpProvider::DumpInto(ProcessMemoryDump* pmd) {
+bool ProcessMemoryMapsDumpProvider::DumpInto(ProcessMemoryDump* pmd) {
uint32 res = 0;
#if defined(OS_LINUX) || defined(OS_ANDROID)
@@ -168,8 +171,16 @@
LOG(ERROR) << "ProcessMemoryMaps dump provider is supported only on Linux";
#endif
- if (res > 0)
+ if (res > 0) {
pmd->set_has_process_mmaps();
+ return true;
+ }
+
+ return false;
+}
+
+const char* ProcessMemoryMapsDumpProvider::GetFriendlyName() const {
+ return kDumperFriendlyName;
}
} // namespace trace_event
diff --git a/base/trace_event/process_memory_maps_dump_provider.h b/base/trace_event/process_memory_maps_dump_provider.h
index 543f7fd..0d30db2 100644
--- a/base/trace_event/process_memory_maps_dump_provider.h
+++ b/base/trace_event/process_memory_maps_dump_provider.h
@@ -20,7 +20,8 @@
static ProcessMemoryMapsDumpProvider* GetInstance();
// MemoryDumpProvider implementation.
- void DumpInto(ProcessMemoryDump* pmd) override;
+ bool DumpInto(ProcessMemoryDump* pmd) override;
+ const char* GetFriendlyName() const override;
private:
friend struct DefaultSingletonTraits<ProcessMemoryMapsDumpProvider>;
diff --git a/base/trace_event/process_memory_totals_dump_provider.cc b/base/trace_event/process_memory_totals_dump_provider.cc
index cda0ff1..125be38 100644
--- a/base/trace_event/process_memory_totals_dump_provider.cc
+++ b/base/trace_event/process_memory_totals_dump_provider.cc
@@ -15,6 +15,9 @@
uint64 ProcessMemoryTotalsDumpProvider::rss_bytes_for_testing = 0;
namespace {
+
+const char kDumperFriendlyName[] = "ProcessMemoryTotals";
+
ProcessMetrics* CreateProcessMetricsForCurrentProcess() {
#if !defined(OS_MACOSX) || defined(OS_IOS)
return ProcessMetrics::CreateProcessMetrics(GetCurrentProcessHandle());
@@ -41,12 +44,22 @@
// Called at trace dump point time. Creates a snapshot the memory counters for
// the current process.
-void ProcessMemoryTotalsDumpProvider::DumpInto(ProcessMemoryDump* pmd) {
+bool ProcessMemoryTotalsDumpProvider::DumpInto(ProcessMemoryDump* pmd) {
const uint64 rss_bytes = rss_bytes_for_testing
? rss_bytes_for_testing
: process_metrics_->GetWorkingSetSize();
- pmd->process_totals()->set_resident_set_bytes(rss_bytes);
- pmd->set_has_process_totals();
+
+ if (rss_bytes > 0) {
+ pmd->process_totals()->set_resident_set_bytes(rss_bytes);
+ pmd->set_has_process_totals();
+ return true;
+ }
+
+ return false;
+}
+
+const char* ProcessMemoryTotalsDumpProvider::GetFriendlyName() const {
+ return kDumperFriendlyName;
}
} // namespace trace_event
diff --git a/base/trace_event/process_memory_totals_dump_provider.h b/base/trace_event/process_memory_totals_dump_provider.h
index 45917a8..8dae966 100644
--- a/base/trace_event/process_memory_totals_dump_provider.h
+++ b/base/trace_event/process_memory_totals_dump_provider.h
@@ -22,7 +22,8 @@
static ProcessMemoryTotalsDumpProvider* GetInstance();
// MemoryDumpProvider implementation.
- void DumpInto(ProcessMemoryDump* pmd) override;
+ bool DumpInto(ProcessMemoryDump* pmd) override;
+ const char* GetFriendlyName() const override;
private:
friend struct DefaultSingletonTraits<ProcessMemoryTotalsDumpProvider>;
diff --git a/base/trace_event/trace_event.h b/base/trace_event/trace_event.h
index e12d8f4..c30a84a 100644
--- a/base/trace_event/trace_event.h
+++ b/base/trace_event/trace_event.h
@@ -1039,6 +1039,7 @@
#define TRACE_EVENT_PHASE_CREATE_OBJECT ('N')
#define TRACE_EVENT_PHASE_SNAPSHOT_OBJECT ('O')
#define TRACE_EVENT_PHASE_DELETE_OBJECT ('D')
+#define TRACE_EVENT_PHASE_MEMORY_DUMP ('v')
// Flags for changing the behavior of TRACE_EVENT_API_ADD_TRACE_EVENT.
#define TRACE_EVENT_FLAG_NONE (static_cast<unsigned char>(0))
diff --git a/base/values.cc b/base/values.cc
index 061b7a1..52876cf 100644
--- a/base/values.cc
+++ b/base/values.cc
@@ -1143,6 +1143,9 @@
ValueSerializer::~ValueSerializer() {
}
+ValueDeserializer::~ValueDeserializer() {
+}
+
std::ostream& operator<<(std::ostream& out, const Value& value) {
std::string json;
JSONWriter::WriteWithOptions(&value,
diff --git a/base/values.h b/base/values.h
index 4648283..1e1cae3 100644
--- a/base/values.h
+++ b/base/values.h
@@ -492,13 +492,20 @@
DISALLOW_COPY_AND_ASSIGN(ListValue);
};
-// This interface is implemented by classes that know how to serialize and
-// deserialize Value objects.
+// This interface is implemented by classes that know how to serialize
+// Value objects.
class BASE_EXPORT ValueSerializer {
public:
virtual ~ValueSerializer();
virtual bool Serialize(const Value& root) = 0;
+};
+
+// This interface is implemented by classes that know how to deserialize Value
+// objects.
+class BASE_EXPORT ValueDeserializer {
+ public:
+ virtual ~ValueDeserializer();
// This method deserializes the subclass-specific format into a Value object.
// If the return value is non-NULL, the caller takes ownership of returned
diff --git a/base/win/pe_image_unittest.cc b/base/win/pe_image_unittest.cc
index 4134741..28b65a4 100644
--- a/base/win/pe_image_unittest.cc
+++ b/base/win/pe_image_unittest.cc
@@ -6,129 +6,10 @@
#include <algorithm>
#include <vector>
-#include "testing/gtest/include/gtest/gtest.h"
+#include "base/files/file_path.h"
+#include "base/path_service.h"
#include "base/win/pe_image.h"
-#include "base/win/windows_version.h"
-
-namespace {
-
-class Expectations {
- public:
- enum Value {
- SECTIONS = 0,
- IMPORTS_DLLS,
- DELAY_DLLS,
- EXPORTS,
- IMPORTS,
- DELAY_IMPORTS,
- RELOCS
- };
-
- enum Arch {
- ARCH_X86 = 0,
- ARCH_X64,
- ARCH_ALL
- };
-
- Expectations();
-
- void SetDefault(Value value, int count);
- void SetOverride(Value value, base::win::Version version,
- Arch arch, int count);
- void SetOverride(Value value, base::win::Version version, int count);
- void SetOverride(Value value, Arch arch, int count);
-
- // returns -1 on failure.
- int GetExpectation(Value value);
-
- private:
- class Override {
- public:
- enum MatchType { MATCH_VERSION, MATCH_ARCH, MATCH_BOTH, MATCH_NONE };
-
- Override(Value value, base::win::Version version, Arch arch, int count)
- : value_(value), version_(version), arch_(arch), count_(count) {
- };
-
- bool Matches(Value value, base::win::Version version,
- Arch arch, MatchType type) {
- if (value_ != value)
- return false;
-
- switch (type) {
- case MATCH_BOTH:
- return (arch == arch_ && version == version_);
- case MATCH_ARCH:
- return (arch == arch_ && version_ == base::win::VERSION_WIN_LAST);
- case MATCH_VERSION:
- return (arch_ == ARCH_ALL && version == version_);
- case MATCH_NONE:
- return (arch_ == ARCH_ALL && version_ == base::win::VERSION_WIN_LAST);
- }
- return false;
- }
-
- int GetCount() { return count_; }
-
- private:
- Value value_;
- base::win::Version version_;
- Arch arch_;
- int count_;
- };
-
- bool MatchesMyArch(Arch arch);
-
- std::vector<Override> overrides_;
- Arch my_arch_;
- base::win::Version my_version_;
-};
-
-Expectations::Expectations() {
- my_version_ = base::win::GetVersion();
-#if defined(ARCH_CPU_64_BITS)
- my_arch_ = ARCH_X64;
-#else
- my_arch_ = ARCH_X86;
-#endif
-}
-
-int Expectations::GetExpectation(Value value) {
- // Prefer OS version specificity over Arch specificity.
- for (auto type : { Override::MATCH_BOTH,
- Override::MATCH_VERSION,
- Override::MATCH_ARCH,
- Override::MATCH_NONE }) {
- for (auto override : overrides_) {
- if (override.Matches(value, my_version_, my_arch_, type))
- return override.GetCount();
- }
- }
- return -1;
-}
-
-void Expectations::SetDefault(Value value, int count) {
- SetOverride(value, base::win::VERSION_WIN_LAST, ARCH_ALL, count);
-}
-
-void Expectations::SetOverride(Value value,
- base::win::Version version,
- Arch arch,
- int count) {
- overrides_.push_back(Override(value, version, arch, count));
-}
-
-void Expectations::SetOverride(Value value,
- base::win::Version version,
- int count) {
- SetOverride(value, version, ARCH_ALL, count);
-}
-
-void Expectations::SetOverride(Value value, Arch arch, int count) {
- SetOverride(value, base::win::VERSION_WIN_LAST, arch, count);
-}
-
-} // namespace
+#include "testing/gtest/include/gtest/gtest.h"
namespace base {
namespace win {
@@ -210,41 +91,35 @@
} // namespace
// Tests that we are able to enumerate stuff from a PE file, and that
-// the actual number of items found is within the expected range.
+// the actual number of items found matches an expected value.
TEST(PEImageTest, EnumeratesPE) {
- Expectations expectations;
+ base::FilePath pe_image_test_path;
+ ASSERT_TRUE(PathService::Get(DIR_TEST_DATA, &pe_image_test_path));
+ pe_image_test_path = pe_image_test_path.Append(FILE_PATH_LITERAL("pe_image"));
-#ifndef NDEBUG
- // Default Debug expectations.
- expectations.SetDefault(Expectations::SECTIONS, 7);
- expectations.SetDefault(Expectations::IMPORTS_DLLS, 3);
- expectations.SetDefault(Expectations::DELAY_DLLS, 2);
- expectations.SetDefault(Expectations::EXPORTS, 2);
- expectations.SetDefault(Expectations::IMPORTS, 49);
- expectations.SetDefault(Expectations::DELAY_IMPORTS, 2);
- expectations.SetDefault(Expectations::RELOCS, 438);
-
- // 64-bit Debug expectations.
- expectations.SetOverride(Expectations::SECTIONS, Expectations::ARCH_X64, 8);
- expectations.SetOverride(Expectations::IMPORTS, Expectations::ARCH_X64, 69);
- expectations.SetOverride(Expectations::RELOCS, Expectations::ARCH_X64, 632);
+#if defined(ARCH_CPU_64_BITS)
+ pe_image_test_path =
+ pe_image_test_path.Append(FILE_PATH_LITERAL("pe_image_test_64.dll"));
+ const int sections = 6;
+ const int imports_dlls = 2;
+ const int delay_dlls = 2;
+ const int exports = 2;
+ const int imports = 69;
+ const int delay_imports = 2;
+ const int relocs = 632;
#else
- // Default Release expectations.
- expectations.SetDefault(Expectations::SECTIONS, 5);
- expectations.SetDefault(Expectations::IMPORTS_DLLS, 2);
- expectations.SetDefault(Expectations::DELAY_DLLS, 2);
- expectations.SetDefault(Expectations::EXPORTS, 2);
- expectations.SetDefault(Expectations::IMPORTS, 66);
- expectations.SetDefault(Expectations::DELAY_IMPORTS, 2);
- expectations.SetDefault(Expectations::RELOCS, 1586);
-
- // 64-bit Release expectations.
- expectations.SetOverride(Expectations::SECTIONS, Expectations::ARCH_X64, 6);
- expectations.SetOverride(Expectations::IMPORTS, Expectations::ARCH_X64, 69);
- expectations.SetOverride(Expectations::RELOCS, Expectations::ARCH_X64, 632);
+ pe_image_test_path =
+ pe_image_test_path.Append(FILE_PATH_LITERAL("pe_image_test_32.dll"));
+ const int sections = 5;
+ const int imports_dlls = 2;
+ const int delay_dlls = 2;
+ const int exports = 2;
+ const int imports = 66;
+ const int delay_imports = 2;
+ const int relocs = 1586;
#endif
- HMODULE module = LoadLibrary(L"pe_image_test.dll");
+ HMODULE module = LoadLibrary(pe_image_test_path.value().c_str());
ASSERT_TRUE(NULL != module);
PEImage pe(module);
@@ -252,31 +127,31 @@
EXPECT_TRUE(pe.VerifyMagic());
pe.EnumSections(SectionsCallback, &count);
- EXPECT_EQ(expectations.GetExpectation(Expectations::SECTIONS), count);
+ EXPECT_EQ(sections, count);
count = 0;
pe.EnumImportChunks(ImportChunksCallback, &count);
- EXPECT_EQ(expectations.GetExpectation(Expectations::IMPORTS_DLLS), count);
+ EXPECT_EQ(imports_dlls, count);
count = 0;
pe.EnumDelayImportChunks(DelayImportChunksCallback, &count);
- EXPECT_EQ(expectations.GetExpectation(Expectations::DELAY_DLLS), count);
+ EXPECT_EQ(delay_dlls, count);
count = 0;
pe.EnumExports(ExportsCallback, &count);
- EXPECT_EQ(expectations.GetExpectation(Expectations::EXPORTS), count);
+ EXPECT_EQ(exports, count);
count = 0;
pe.EnumAllImports(ImportsCallback, &count);
- EXPECT_EQ(expectations.GetExpectation(Expectations::IMPORTS), count);
+ EXPECT_EQ(imports, count);
count = 0;
pe.EnumAllDelayImports(ImportsCallback, &count);
- EXPECT_EQ(expectations.GetExpectation(Expectations::DELAY_IMPORTS), count);
+ EXPECT_EQ(delay_imports, count);
count = 0;
pe.EnumRelocs(RelocsCallback, &count);
- EXPECT_EQ(expectations.GetExpectation(Expectations::RELOCS), count);
+ EXPECT_EQ(relocs, count);
FreeLibrary(module);
}
diff --git a/base/win/scoped_process_information_unittest.cc b/base/win/scoped_process_information_unittest.cc
index ccfa729..614504d 100644
--- a/base/win/scoped_process_information_unittest.cc
+++ b/base/win/scoped_process_information_unittest.cc
@@ -8,6 +8,7 @@
#include "base/command_line.h"
#include "base/process/kill.h"
+#include "base/process/process.h"
#include "base/test/multiprocess_test.h"
#include "base/win/scoped_process_information.h"
#include "testing/multiprocess_func_list.h"
@@ -135,13 +136,13 @@
// Validate that we have separate handles that are good.
int exit_code = 0;
- ASSERT_TRUE(base::WaitForExitCode(process_info.TakeProcessHandle(),
- &exit_code));
+ base::Process process(process_info.TakeProcessHandle());
+ ASSERT_TRUE(process.WaitForExit(&exit_code));
ASSERT_EQ(7, exit_code);
exit_code = 0;
- ASSERT_TRUE(base::WaitForExitCode(duplicate.TakeProcessHandle(),
- &exit_code));
+ base::Process dup_process(duplicate.TakeProcessHandle());
+ ASSERT_TRUE(dup_process.WaitForExit(&exit_code));
ASSERT_EQ(7, exit_code);
ASSERT_TRUE(::CloseHandle(process_info.TakeThreadHandle()));
diff --git a/base/win/win_util.cc b/base/win/win_util.cc
index a3c9ece..957f937 100644
--- a/base/win/win_util.cc
+++ b/base/win/win_util.cc
@@ -57,7 +57,7 @@
// Returns true if a physical keyboard is detected on Windows 8 and up.
// Uses the Setup APIs to enumerate the attached keyboards and returns true
-// if the keyboard count is more than 1. While this will work in most cases
+// if the keyboard count is 1 or more.. While this will work in most cases
// it won't work if there are devices which expose keyboard interfaces which
// are attached to the machine.
bool IsKeyboardPresentOnSlate() {
@@ -89,6 +89,7 @@
device_info_data.cbSize = sizeof(device_info_data);
if (!SetupDiEnumDeviceInfo(device_info, i, &device_info_data))
break;
+
// Get the device ID.
wchar_t device_id[MAX_DEVICE_ID_LEN];
CONFIGRET status = CM_Get_Device_ID(device_info_data.DevInst,
@@ -96,20 +97,19 @@
MAX_DEVICE_ID_LEN,
0);
if (status == CR_SUCCESS) {
- // To reduce the scope of the hack we only look for PNP and HID
+ // To reduce the scope of the hack we only look for PNP, MSF and HID
// keyboards.
- if (StartsWith(L"ACPI\\PNP", device_id, false) ||
- StartsWith(L"HID\\VID", device_id, false)) {
+ if (StartsWith(device_id, L"ACPI\\PNP", false) ||
+ StartsWith(device_id, L"ACPI\\MSF", false) ||
+ StartsWith(device_id, L"HID\\VID", false)) {
keyboard_count++;
}
}
}
- // On a Windows machine, the API's always report 1 keyboard at least
- // regardless of whether the machine has a keyboard attached or not.
- // The heuristic we are using is to check the count and return true
- // if the API's report more than one keyboard. Please note that this
+ // The heuristic we are using is to check the count of keyboards and return
+ // true if the API's report one or more keyboards. Please note that this
// will break for non keyboard devices which expose a keyboard PDO.
- return keyboard_count > 1;
+ return keyboard_count >= 1;
}
} // namespace
diff --git a/build/all.gyp b/build/all.gyp
index 17958a0..499fc57 100644
--- a/build/all.gyp
+++ b/build/all.gyp
@@ -467,6 +467,12 @@
}, # target_name: chromium_builder_tests
],
'conditions': [
+ # TODO(GYP): make gn_migration.gypi work unconditionally.
+ ['OS=="linux" and target_arch=="x64" and chromeos==0 and chromecast==0 and disable_nacl==0', {
+ 'includes': [
+ 'gn_migration.gypi',
+ ],
+ }],
['OS!="ios"', {
'targets': [
{
@@ -516,156 +522,6 @@
['OS!="ios" and OS!="android"', {
'targets': [
{
- # TODO(GYP) - make gyp_all and gn_all work on iOS and Android also.
- 'target_name': 'gyp_all',
- 'type': 'none',
- 'dependencies': [
- ':gn_all',
- '../chrome/chrome.gyp:chromedriver_unittests',
- '../components/components_tests.gyp:components_browsertests',
- # '../components/nacl.gyp:nacl_loader_unittests', # TODO(GYP)
- # '../remoting/remoting.gyp:remoting_unittests', # TODO(GYP)
- '../ui/compositor/compositor.gyp:compositor_unittests',
- ],
- 'conditions': [
- ['OS!="android"', {
- 'dependencies': [
- # '../device/device_tests.gyp:device_unittests', # TODO(GYP)
- # '../google_apis/google_apis.gyp:google_apis_unittests', # TODO(GYP)
- ],
- }],
- ],
- },
- {
- 'target_name': 'gn_all',
- 'type': 'none',
-
- 'dependencies': [
- '../base/base.gyp:base_unittests',
- '../cc/cc_tests.gyp:cc_unittests',
- '../chrome/chrome.gyp:chrome',
- '../chrome/chrome.gyp:browser_tests',
- '../chrome/chrome.gyp:interactive_ui_tests',
- '../chrome/chrome.gyp:sync_integration_tests',
- '../chrome/chrome.gyp:unit_tests',
- '../components/components_tests.gyp:components_unittests',
- '../content/content_shell_and_tests.gyp:content_shell',
- '../content/content_shell_and_tests.gyp:content_browsertests',
- '../content/content_shell_and_tests.gyp:content_perftests',
- '../content/content_shell_and_tests.gyp:content_unittests',
- '../crypto/crypto.gyp:crypto_unittests',
- '../extensions/extensions_tests.gyp:extensions_browsertests',
- '../extensions/extensions_tests.gyp:extensions_unittests',
- '../google_apis/gcm/gcm.gyp:gcm_unit_tests',
- '../gpu/gpu.gyp:gpu_unittests',
- '../ipc/ipc.gyp:ipc_tests',
- '../ipc/mojo/ipc_mojo.gyp:ipc_mojo_unittests',
- '../jingle/jingle.gyp:jingle_unittests',
- '../media/media.gyp:media_unittests',
- '../media/cast/cast.gyp:cast_unittests',
- '../mojo/mojo.gyp:mojo',
- '../mojo/mojo_base.gyp:mojo_common_unittests',
- '../net/net.gyp:net_unittests',
- '../ppapi/ppapi_internal.gyp:ppapi_tests',
- '../printing/printing.gyp:printing_unittests',
- '../sql/sql.gyp:sql_unittests',
- '../skia/skia_tests.gyp:skia_unittests',
- '../sync/sync.gyp:sync_unit_tests',
-
- # TODO(GYP): the Blink test targets should be public, but
- # currently aren't. all_blink puls them in, though
- # "//third_party/WebKit/Source/platform:heap_unittests",
- # "//third_party/WebKit/Source/platform:platform_unittests",
- # "//third_party/WebKit/Source/wtf:wtf_unittests",
- '../third_party/WebKit/public/all.gyp:all_blink',
-
- '../third_party/cacheinvalidation/cacheinvalidation.gyp:cacheinvalidation_unittests',
-
- # TODO(GYP): Needed only w/ cld_version==1. What configs set that?
- '../third_party/cld/cld.gyp:cld',
-
- # TODO(GYP): This is needed only w/ use_system_fontconfig==0. What configs set that?
- #'../third_party/fontconfig/fontconfig.gyp:fontconfig',
-
- # TODO(GYP): This will be pulled in automatically when enable_webrtc==true.
- # For now pull it in manually so that it doesn't regress.
- '../third_party/libsrtp/libsrtp.gyp:libsrtp',
-
- '../third_party/mojo/mojo_edk_tests.gyp:mojo_system_unittests',
- '../third_party/mojo/mojo_edk_tests.gyp:mojo_public_bindings_unittests',
- '../third_party/mojo/mojo_edk_tests.gyp:mojo_public_environment_unittests',
- '../third_party/mojo/mojo_edk_tests.gyp:mojo_public_system_perftests',
- '../third_party/mojo/mojo_edk_tests.gyp:mojo_public_system_unittests',
- '../third_party/mojo/mojo_edk_tests.gyp:mojo_public_utility_unittests',
- '../third_party/pdfium/samples/samples.gyp:pdfium_test',
-
- # TODO(GYP): Verify that this is no longer needed.
- '../third_party/smhasher/smhasher.gyp:pmurhash',
-
- # TODO(GYP): This will be pulled in automatically when enable_webrtc==true.
- # For now pull it in manually so that it doesn't regress.
- '../third_party/usrsctp/usrsctp.gyp:usrsctplib',
-
- '../tools/gn/gn.gyp:gn',
- '../tools/gn/gn.gyp:gn_unittests',
- '../ui/accessibility/accessibility.gyp:accessibility_unittests',
- '../ui/app_list/app_list.gyp:app_list_unittests',
- '../ui/base/ui_base_tests.gyp:ui_base_unittests',
- '../ui/display/display.gyp:display_unittests',
- '../ui/events/events.gyp:events_unittests',
- '../ui/gfx/gfx_tests.gyp:gfx_unittests',
- '../ui/touch_selection/ui_touch_selection.gyp:ui_touch_selection_unittests',
- '../url/url.gyp:url_unittests',
- ],
- 'conditions': [
- ['OS!="win"', {
- 'dependencies': [
- '../breakpad/breakpad.gyp:symupload',
- ],
- }],
- ['use_x11==1', {
- 'dependencies': [
- '../tools/xdisplaycheck/xdisplaycheck.gyp:xdisplaycheck',
- ],
- }],
- ['toolkit_views==1', {
- 'dependencies': [
- '../ui/views/views.gyp:views_unittests',
- ],
- }],
- ['use_aura==1', {
- 'dependencies': [
- '../ui/wm/wm.gyp:wm_unittests',
- ],
- }],
- ['use_ozone==1', {
- 'dependencies': [
- '../ui/ozone/ozone.gyp:ozone',
- ],
- }],
- ['OS=="win" or OS=="mac" or OS=="android"', {
- 'dependencies': [
- '../rlz/rlz.gyp:rlz_lib',
- ],
- }],
- ['OS=="android"', {
- 'dependencies': [
- '../chrome/chrome.gyp:chrome_shell_apk',
- '../content/content_shell_and_tests.gyp:content_shell_apk',
- ],
- 'dependencies!': [
- '../url/url.gyp:url_unittests',
- ],
- }],
- ['OS=="linux"', {
- 'dependencies': [
- '../dbus/dbus.gyp:dbus_unittests',
- '../sandbox/sandbox.gyp:sandbox_linux_unittests',
- ],
- }],
- ],
- },
- {
'target_name': 'chromium_builder_nacl_win_integration',
'type': 'none',
'dependencies': [
@@ -682,6 +538,7 @@
'../chrome/chrome.gyp:performance_browser_tests',
'../chrome/chrome.gyp:sync_performance_tests',
'../content/content_shell_and_tests.gyp:content_shell',
+ '../gpu/gpu.gyp:gpu_perftests',
'../media/media.gyp:media_perftests',
'../tools/perf/clear_system_cache/clear_system_cache.gyp:*',
'../tools/telemetry/telemetry.gyp:*',
diff --git a/build/android/OWNERS b/build/android/OWNERS
index bd675fb..9a5d270 100644
--- a/build/android/OWNERS
+++ b/build/android/OWNERS
@@ -1,2 +1,3 @@
jbudorick@chromium.org
klundberg@chromium.org
+pasko@chromium.org
diff --git a/build/android/buildbot/bb_device_status_check.py b/build/android/buildbot/bb_device_status_check.py
index 3bec158..8561c01 100755
--- a/build/android/buildbot/bb_device_status_check.py
+++ b/build/android/buildbot/bb_device_status_check.py
@@ -340,9 +340,12 @@
if os.path.exists('/home/chrome-bot'):
with open('/home/chrome-bot/.adb_device_info', 'w') as f:
for device in json_data:
- f.write('%s %s %s %.1fC %s%%\n' % (device['serial'], device['type'],
- device['build'], float(device['battery']['temperature']) / 10,
- device['battery']['level']))
+ try:
+ f.write('%s %s %s %.1fC %s%%\n' % (device['serial'], device['type'],
+ device['build'], float(device['battery']['temperature']) / 10,
+ device['battery']['level']))
+ except Exception:
+ pass
err_msg = CheckForMissingDevices(options, devices) or []
diff --git a/build/android/buildbot/bb_device_steps.py b/build/android/buildbot/bb_device_steps.py
index a53bb56..c3c344b 100755
--- a/build/android/buildbot/bb_device_steps.py
+++ b/build/android/buildbot/bb_device_steps.py
@@ -218,7 +218,7 @@
args = ['--browser', 'android-chrome-shell']
devices = android_commands.GetAttachedDevices()
if devices:
- args = args + ['--device', devices[0]]
+ args = args + ['--device', 'android']
bb_annotations.PrintNamedStep(step_name)
RunCmd([run_tests_path] + args)
diff --git a/build/android/buildbot/bb_run_bot.py b/build/android/buildbot/bb_run_bot.py
index 38ff93a..29cce1b 100755
--- a/build/android/buildbot/bb_run_bot.py
+++ b/build/android/buildbot/bb_run_bot.py
@@ -160,7 +160,7 @@
B('chromedriver-fyi-tests-dbg', H(std_test_steps),
T(['chromedriver'],
['--install=ChromeShell', '--install=ChromeDriverWebViewShell',
- '--skip-wipe', '--cleanup'])),
+ '--skip-wipe', '--disable-location', '--cleanup'])),
B('fyi-x86-builder-dbg',
H(compile_step + std_host_tests, experimental, target_arch='ia32')),
B('fyi-builder-dbg',
diff --git a/build/android/findbugs_filter/findbugs_known_bugs.txt b/build/android/findbugs_filter/findbugs_known_bugs.txt
index 9afba51..01b546a 100644
--- a/build/android/findbugs_filter/findbugs_known_bugs.txt
+++ b/build/android/findbugs_filter/findbugs_known_bugs.txt
@@ -6,3 +6,5 @@
M D UuF: Unused public or protected field: org.chromium.chrome.browser.document.PendingDocumentData.originalIntent In PendingDocumentData.java
M D UuF: Unused public or protected field: org.chromium.chrome.browser.document.PendingDocumentData.url In PendingDocumentData.java
M D UuF: Unused public or protected field: org.chromium.chrome.browser.document.PendingDocumentData.requestId In PendingDocumentData.java
+M D BC: Unchecked/unconfirmed cast from android.view.View to org.chromium.chrome.browser.firstrun.AccountFirstRunView in org.chromium.chrome.browser.firstrun.AccountFirstRunFragment.onViewCreated(View, Bundle) At AccountFirstRunFragment.java
+M M LI: Incorrect lazy initialization and update of static field org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings.sSettings in org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings.initialize(Context) At DataReductionProxySettings.java
diff --git a/build/android/gyp/proguard.py b/build/android/gyp/proguard.py
index ca58770..cb547fb 100755
--- a/build/android/gyp/proguard.py
+++ b/build/android/gyp/proguard.py
@@ -28,7 +28,31 @@
'-outjars', outjars,
'-libraryjars', libraryjars,
'@' + options.proguard_config]
- build_utils.CheckOutput(proguard_cmd, print_stdout=True)
+ build_utils.CheckOutput(proguard_cmd, print_stdout=True,
+ stdout_filter=FilterProguardOutput)
+
+
+def FilterProguardOutput(output):
+ '''ProGuard outputs boring stuff to stdout (proguard version, jar path, etc)
+ as well as interesting stuff (notes, warnings, etc). If stdout is entirely
+ boring, this method suppresses the output.
+ '''
+ ignore_patterns = [
+ 'ProGuard, version ',
+ 'Reading program jar [',
+ 'Reading library jar [',
+ 'Preparing output jar [',
+ ' Copying resources from program jar [',
+ ]
+ for line in output.splitlines():
+ for pattern in ignore_patterns:
+ if line.startswith(pattern):
+ break
+ else:
+ # line doesn't match any of the patterns; it's probably something worth
+ # printing out.
+ return output
+ return ''
def main(args):
diff --git a/build/android/lint/OWNERS b/build/android/lint/OWNERS
new file mode 100644
index 0000000..cd396e7
--- /dev/null
+++ b/build/android/lint/OWNERS
@@ -0,0 +1,2 @@
+newt@chromium.org
+aurimas@chromium.org
diff --git a/build/android/lint/suppressions.xml b/build/android/lint/suppressions.xml
index 5a169c1..cfbf858 100644
--- a/build/android/lint/suppressions.xml
+++ b/build/android/lint/suppressions.xml
@@ -43,6 +43,8 @@
</issue>
<issue id="IconDensities">
<!-- crbug.com/457918 is tracking missing assets -->
+ <ignore path="components/web_contents_delegate_android/android/java/res/drawable-xxhdpi"/>
+ <ignore path="components/web_contents_delegate_android/android/java/res/drawable-xxxhdpi"/>
<ignore path="content/public/android/java/res/drawable-xxhdpi"/>
<ignore path="content/public/android/java/res/drawable-xxxhdpi"/>
<ignore path="chrome/android/java/res/drawable-xxhdpi"/>
@@ -62,9 +64,47 @@
<issue id="MissingVersion">
<ignore path="AndroidManifest.xml"/>
</issue>
- <!-- Disabling is InlinedApi and NewApi is bad but we have too many of these errors and nobody is fixing it. crbug.com/411461 -->
<issue id="InlinedApi" severity="ignore"/>
- <issue id="NewApi" severity="ignore"/>
+ <issue id="NewApi">
+ <ignore regexp="Attribute `paddingStart` referenced here can result in a crash on some specific devices older than API 17"/>
+ <ignore path="org/chromium/base/AnimationFrameTimeHistogram$Recorder.class"/>
+ <ignore path="org/chromium/base/JavaHandlerThread.class"/>
+ <ignore path="org/chromium/base/SysUtils.class"/>
+ <ignore path="org/chromium/chrome/browser/preferences/website/AddExceptionPreference.class"/>
+ <ignore path="org/chromium/chrome/browser/infobar/AnimationHelper$*.class"/>
+ <ignore path="org/chromium/chrome/browser/infobar/AppBannerInfoBar.class"/>
+ <ignore path="org/chromium/chrome/browser/BookmarkUtils.class"/>
+ <ignore path="org/chromium/chrome/browser/widget/ButtonCompat.class"/>
+ <ignore path="org/chromium/chrome/browser/autofill/CardUnmaskPrompt.class"/>
+ <ignore path="org/chromium/chrome/browser/LollipopTtsPlatformImpl.class"/>
+ <ignore path="org/chromium/chrome/browser/LollipopTtsPlatformImpl$*.class"/>
+ <ignore path="org/chromium/chrome/browser/TtsPlatformImpl.class"/>
+ <ignore path="org/chromium/chrome/browser/TtsPlatformImpl$*.class"/>
+ <ignore path="org/chromium/content/browser/accessibility/BrowserAccessibilityManager.class"/>
+ <ignore path="org/chromium/content/browser/ContentViewCore.class"/>
+ <ignore path="org/chromium/content/browser/accessibility/JellyBeanAccessibilityInjector.class"/>
+ <ignore path="org/chromium/content/browser/accessibility/JellyBeanBrowserAccessibilityManager$*.class"/>
+ <ignore path="org/chromium/content/browser/accessibility/LollipopAccessibilityInjector.class"/>
+ <ignore path="org/chromium/content/browser/accessibility/LollipopAccessibilityInjector$*.class"/>
+ <ignore path="org/chromium/content/browser/accessibility/LollipopBrowserAccessibilityManager.class"/>
+ <ignore path="org/chromium/media/AudioManagerAndroid.class"/>
+ <ignore path="org/chromium/media/MediaCodecBridge.class"/>
+ <ignore path="org/chromium/media/MediaDrmBridge.class"/>
+ <ignore path="org/chromium/media/MediaDrmBridge$*.class"/>
+ <ignore path="org/chromium/media/VideoCaptureCamera.class"/>
+ <ignore path="org/chromium/media/VideoCaptureCamera2.class"/>
+ <ignore path="org/chromium/media/VideoCaptureCamera2$*.class"/>
+ <ignore path="org/chromium/media/WebAudioMediaCodecBridge.class"/>
+ <ignore path="org/chromium/printing/PrintDocumentAdapterWrapper.class"/>
+ <ignore path="org/chromium/printing/PrintManagerDelegateImpl.class"/>
+ <ignore path="org/chromium/printing/PrintingControllerImpl.class"/>
+ <ignore path="org/chromium/ui/base/Clipboard.class"/>
+ <ignore path="org/chromium/ui/ColorPickerAdvancedComponent.class"/>
+ <ignore path="org/chromium/ui/gfx/DeviceDisplayInfo.class"/>
+ <ignore path="org/chromium/ui/gl/SurfaceTexturePlatformWrapper.class"/>
+ <ignore path="org/chromium/ui/widget/TextViewWithClickableSpans.class"/>
+ <ignore path="org/chromium/ui/picker/TwoFieldDatePicker.class"/>
+ </issue>
<issue id="OldTargetApi">
<ignore path="AndroidManifest.xml"/>
</issue>
@@ -79,9 +119,6 @@
</issue>
<issue id="SetJavaScriptEnabled" severity="ignore"/>
<issue id="UnusedResources">
- <!-- TODO(aurimas): remove suppression once crbug.com/458328 is fixed. -->
- <ignore path="content/public/android/java/res/layout/validation_message_bubble.xml" />
-
<!-- These files are used by chrome_shell_apk and chrome_apk targets. -->
<ignore path="chrome/android/java/res/layout/accessibility_tab_switcher.xml" />
<ignore path="chrome/android/java/res/drawable/btn_back.xml" />
diff --git a/build/android/provision_devices.py b/build/android/provision_devices.py
index 4835073..5f00b31 100755
--- a/build/android/provision_devices.py
+++ b/build/android/provision_devices.py
@@ -13,6 +13,7 @@
import argparse
import logging
import os
+import posixpath
import re
import subprocess
import sys
@@ -115,8 +116,16 @@
# LOCAL_PROPERTIES_PATH = '/data/local.prop'
+def WriteAdbKeysFile(device, adb_keys_string):
+ dir_path = posixpath.dirname(constants.ADB_KEYS_FILE)
+ device.RunShellCommand('mkdir -p %s' % dir_path, as_root=True)
+ device.RunShellCommand('restorecon %s' % dir_path, as_root=True)
+ device.WriteFile(constants.ADB_KEYS_FILE, adb_keys_string, as_root=True)
+ device.RunShellCommand('restorecon %s' % constants.ADB_KEYS_FILE,
+ as_root=True)
-def WipeDeviceData(device):
+
+def WipeDeviceData(device, options):
"""Wipes data from device, keeping only the adb_keys for authorization.
After wiping data on a device that has been authorized, adb can still
@@ -130,22 +139,25 @@
"""
device_authorized = device.FileExists(constants.ADB_KEYS_FILE)
if device_authorized:
- adb_keys = device.ReadFile(constants.ADB_KEYS_FILE, as_root=True)
+ adb_keys = device.ReadFile(constants.ADB_KEYS_FILE,
+ as_root=True).splitlines()
device.RunShellCommand('wipe data', as_root=True)
if device_authorized:
- path_list = constants.ADB_KEYS_FILE.split('/')
- dir_path = '/'.join(path_list[:len(path_list)-1])
- device.RunShellCommand('mkdir -p %s' % dir_path, as_root=True)
- device.RunShellCommand('restorecon %s' % dir_path, as_root=True)
- device.WriteFile(constants.ADB_KEYS_FILE, adb_keys, as_root=True)
- device.RunShellCommand('restorecon %s' % constants.ADB_KEYS_FILE,
- as_root=True)
+ adb_keys_set = set(adb_keys)
+ for adb_key_file in options.adb_key_files or []:
+ try:
+ with open(adb_key_file, 'r') as f:
+ adb_public_keys = f.readlines()
+ adb_keys_set.update(adb_public_keys)
+ except IOError:
+ logging.warning('Unable to find adb keys file %s.' % adb_key_file)
+ WriteAdbKeysFile(device, '\n'.join(adb_keys_set))
-def WipeDeviceIfPossible(device, timeout):
+def WipeDeviceIfPossible(device, timeout, options):
try:
device.EnableRoot()
- WipeDeviceData(device)
+ WipeDeviceData(device, options)
device.Reboot(True, timeout=timeout, retries=0)
except (errors.DeviceUnresponsiveError, device_errors.CommandFailedError):
pass
@@ -176,7 +188,7 @@
try:
if not options.skip_wipe:
- WipeDeviceIfPossible(device, reboot_timeout)
+ WipeDeviceIfPossible(device, reboot_timeout, options)
try:
device.EnableRoot()
except device_errors.CommandFailedError as e:
@@ -196,7 +208,7 @@
device, device_settings.NETWORK_DISABLED_SETTINGS)
if options.min_battery_level is not None:
try:
- device.SetUsbCharging(True)
+ device.SetCharging(True)
ChargeDeviceToLevel(device, options.min_battery_level)
except device_errors.CommandFailedError as e:
logging.exception('Unable to charge device to specified level.')
@@ -280,6 +292,8 @@
parser.add_argument('-r', '--auto-reconnect', action='store_true',
help='push binary which will reboot the device on adb'
' disconnections')
+ parser.add_argument('--adb-key-files', type=str, nargs='+',
+ help='list of adb keys to push to device')
args = parser.parse_args()
constants.SetBuildType(args.target)
diff --git a/build/android/pylib/base/test_dispatcher.py b/build/android/pylib/base/test_dispatcher.py
index 929c408..1a8e0c1 100644
--- a/build/android/pylib/base/test_dispatcher.py
+++ b/build/android/pylib/base/test_dispatcher.py
@@ -116,7 +116,7 @@
pass_results = base_test_result.TestRunResults()
pass_results.AddResults(result.GetPass())
out_results.append(pass_results)
- logging.warning('Will retry test, try #%s.' % test.tries)
+ logging.warning('Will retry test %s, try #%s.', retry, test.tries)
collection.add(_Test(test=retry, tries=test.tries))
else:
# All tests passed or retry limit reached. Either way, record results.
diff --git a/build/android/pylib/constants.py b/build/android/pylib/constants.py
index 8027012..b849a8d 100644
--- a/build/android/pylib/constants.py
+++ b/build/android/pylib/constants.py
@@ -288,4 +288,5 @@
# Exit codes
ERROR_EXIT_CODE = 1
+INFRA_EXIT_CODE = 87
WARNING_EXIT_CODE = 88
diff --git a/build/android/pylib/device/device_errors.py b/build/android/pylib/device/device_errors.py
index c47c966..26d9eaf 100644
--- a/build/android/pylib/device/device_errors.py
+++ b/build/android/pylib/device/device_errors.py
@@ -7,14 +7,10 @@
"""
from pylib import cmd_helper
+from pylib.utils import base_error
-class BaseError(Exception):
- """Base exception for all device and command errors."""
- pass
-
-
-class CommandFailedError(BaseError):
+class CommandFailedError(base_error.BaseError):
"""Exception for command failures."""
def __init__(self, message, device_serial=None):
@@ -64,19 +60,18 @@
['shell', command], output, status, device_serial, message)
-class CommandTimeoutError(BaseError):
+class CommandTimeoutError(base_error.BaseError):
"""Exception for command timeouts."""
pass
-class DeviceUnreachableError(BaseError):
+class DeviceUnreachableError(base_error.BaseError):
"""Exception for device unreachable failures."""
pass
-class NoDevicesError(BaseError):
+class NoDevicesError(base_error.BaseError):
"""Exception for having no devices attached."""
def __init__(self):
super(NoDevicesError, self).__init__('No devices attached.')
-
diff --git a/build/android/pylib/device/device_utils.py b/build/android/pylib/device/device_utils.py
index 4d77fa8..b6fd732 100644
--- a/build/android/pylib/device/device_utils.py
+++ b/build/android/pylib/device/device_utils.py
@@ -29,6 +29,7 @@
from pylib.device import logcat_monitor
from pylib.device.commands import install_commands
from pylib.utils import apk_helper
+from pylib.utils import base_error
from pylib.utils import device_temp_file
from pylib.utils import host_utils
from pylib.utils import md5sum
@@ -44,7 +45,7 @@
# the timeout_retry decorators.
DEFAULT = object()
-_CONTROL_USB_CHARGING_COMMANDS = [
+_CONTROL_CHARGING_COMMANDS = [
{
# Nexus 4
'witness_file': '/sys/module/pm8921_charger/parameters/disabled',
@@ -187,7 +188,7 @@
"""
try:
return self.adb.GetState() == 'device'
- except device_errors.BaseError as exc:
+ except base_error.BaseError as exc:
logging.info('Failed to get state: %s', exc)
return False
@@ -1418,47 +1419,51 @@
return result
@decorators.WithTimeoutAndRetriesFromInstance()
- def GetUsbCharging(self, timeout=None, retries=None):
- """Gets the USB charging state of the device.
+ def GetCharging(self, timeout=None, retries=None):
+ """Gets the charging state of the device.
Args:
timeout: timeout in seconds
retries: number of retries
Returns:
- True if the device is charging via USB, false otherwise.
+ True if the device is charging, false otherwise.
"""
- return (self.GetBatteryInfo().get('USB powered', '').lower()
- in ('true', '1', 'yes'))
+ battery_info = self.GetBatteryInfo()
+ for k in ('AC powered', 'USB powered', 'Wireless powered'):
+ if (k in battery_info and
+ battery_info[k].lower() in ('true', '1', 'yes')):
+ return True
+ return False
@decorators.WithTimeoutAndRetriesFromInstance()
- def SetUsbCharging(self, enabled, timeout=None, retries=None):
- """Enables or disables USB charging on the device.
+ def SetCharging(self, enabled, timeout=None, retries=None):
+ """Enables or disables charging on the device.
Args:
- enabled: A boolean indicating whether USB charging should be enabled or
+ enabled: A boolean indicating whether charging should be enabled or
disabled.
timeout: timeout in seconds
retries: number of retries
"""
- if 'usb_charging_config' not in self._cache:
- for c in _CONTROL_USB_CHARGING_COMMANDS:
+ if 'charging_config' not in self._cache:
+ for c in _CONTROL_CHARGING_COMMANDS:
if self.FileExists(c['witness_file']):
- self._cache['usb_charging_config'] = c
+ self._cache['charging_config'] = c
break
else:
raise device_errors.CommandFailedError(
'Unable to find charging commands.')
if enabled:
- command = self._cache['usb_charging_config']['enable_command']
+ command = self._cache['charging_config']['enable_command']
else:
- command = self._cache['usb_charging_config']['disable_command']
+ command = self._cache['charging_config']['disable_command']
- def set_and_verify_usb_charging():
- self.RunShellCommand(command)
- return self.GetUsbCharging() == enabled
+ def set_and_verify_charging():
+ self.RunShellCommand(command, check_return=True)
+ return self.GetCharging() == enabled
- timeout_retry.WaitFor(set_and_verify_usb_charging, wait_period=1)
+ timeout_retry.WaitFor(set_and_verify_charging, wait_period=1)
@decorators.WithTimeoutAndRetriesFromInstance()
def GetDevicePieWrapper(self, timeout=None, retries=None):
diff --git a/build/android/pylib/device/device_utils_test.py b/build/android/pylib/device/device_utils_test.py
index 1b4d1cf..b7e807e 100755
--- a/build/android/pylib/device/device_utils_test.py
+++ b/build/android/pylib/device/device_utils_test.py
@@ -1411,51 +1411,61 @@
self.assertEquals({}, self.device.GetBatteryInfo())
-class DeviceUtilsGetUsbChargingTest(DeviceUtilsTest):
- def testGetUsbCharging_true(self):
+class DeviceUtilsGetChargingTest(DeviceUtilsTest):
+ def testGetCharging_usb(self):
with self.assertCall(
self.call.device.GetBatteryInfo(), {'USB powered': 'true'}):
- self.assertTrue(self.device.GetUsbCharging())
+ self.assertTrue(self.device.GetCharging())
- def testGetUsbCharging_false(self):
+ def testGetCharging_usbFalse(self):
with self.assertCall(
self.call.device.GetBatteryInfo(), {'USB powered': 'false'}):
- self.assertFalse(self.device.GetUsbCharging())
+ self.assertFalse(self.device.GetCharging())
- def testGetUsbCharging_unknown(self):
+ def testGetCharging_ac(self):
with self.assertCall(
self.call.device.GetBatteryInfo(), {'AC powered': 'true'}):
- self.assertFalse(self.device.GetUsbCharging())
+ self.assertTrue(self.device.GetCharging())
+
+ def testGetCharging_wireless(self):
+ with self.assertCall(
+ self.call.device.GetBatteryInfo(), {'Wireless powered': 'true'}):
+ self.assertTrue(self.device.GetCharging())
+
+ def testGetCharging_unknown(self):
+ with self.assertCall(
+ self.call.device.GetBatteryInfo(), {'level': '42'}):
+ self.assertFalse(self.device.GetCharging())
-class DeviceUtilsSetUsbChargingTest(DeviceUtilsTest):
+class DeviceUtilsSetChargingTest(DeviceUtilsTest):
@mock.patch('time.sleep', mock.Mock())
- def testSetUsbCharging_enabled(self):
+ def testSetCharging_enabled(self):
with self.assertCalls(
(self.call.device.FileExists(mock.ANY), True),
- (self.call.device.RunShellCommand(mock.ANY), []),
- (self.call.device.GetUsbCharging(), False),
- (self.call.device.RunShellCommand(mock.ANY), []),
- (self.call.device.GetUsbCharging(), True)):
- self.device.SetUsbCharging(True)
+ (self.call.device.RunShellCommand(mock.ANY, check_return=True), []),
+ (self.call.device.GetCharging(), False),
+ (self.call.device.RunShellCommand(mock.ANY, check_return=True), []),
+ (self.call.device.GetCharging(), True)):
+ self.device.SetCharging(True)
- def testSetUsbCharging_alreadyEnabled(self):
+ def testSetCharging_alreadyEnabled(self):
with self.assertCalls(
(self.call.device.FileExists(mock.ANY), True),
- (self.call.device.RunShellCommand(mock.ANY), []),
- (self.call.device.GetUsbCharging(), True)):
- self.device.SetUsbCharging(True)
+ (self.call.device.RunShellCommand(mock.ANY, check_return=True), []),
+ (self.call.device.GetCharging(), True)):
+ self.device.SetCharging(True)
@mock.patch('time.sleep', mock.Mock())
- def testSetUsbCharging_disabled(self):
+ def testSetCharging_disabled(self):
with self.assertCalls(
(self.call.device.FileExists(mock.ANY), True),
- (self.call.device.RunShellCommand(mock.ANY), []),
- (self.call.device.GetUsbCharging(), True),
- (self.call.device.RunShellCommand(mock.ANY), []),
- (self.call.device.GetUsbCharging(), False)):
- self.device.SetUsbCharging(False)
+ (self.call.device.RunShellCommand(mock.ANY, check_return=True), []),
+ (self.call.device.GetCharging(), True),
+ (self.call.device.RunShellCommand(mock.ANY, check_return=True), []),
+ (self.call.device.GetCharging(), False)):
+ self.device.SetCharging(False)
diff --git a/build/android/pylib/gtest/filter/content_browsertests_disabled b/build/android/pylib/gtest/filter/content_browsertests_disabled
index 1e3d523..613c833 100644
--- a/build/android/pylib/gtest/filter/content_browsertests_disabled
+++ b/build/android/pylib/gtest/filter/content_browsertests_disabled
@@ -2,40 +2,31 @@
# Timeouts
Http/MediaTest.*
File/MediaTest.*
-WorkerTest.*
+WorkerTest.IncognitoSharedWorkers
+WorkerTest.MultipleSharedWorkers
+WorkerTest.PassMessagePortToSharedWorker
+WorkerTest.PassMessagePortToSharedWorkerDontWaitForConnect
+WorkerTest.SharedWorkerHttpAuth
+WorkerTest.SingleSharedWorker
+WorkerTest.WebSocketSharedWorker
MediaTest.*
-MediaSourceTest.ConfigChangeVideo
-WebGLConformanceTest.*
-MessagePortTest.Tests
-CrossPlatformAccessibilityBrowserTest.*
DatabaseTest.*
-ResourceDispatcherHostBrowserTest.SyncXMLHttpRequest_DuringUnload
# Crashes
-ResourceDispatcherHostBrowserTest.CrossSiteAfterCrash
RenderFrameHostManagerTest.IgnoreRendererDebugURLsWhenCrashed
-RenderFrameHostManagerTest.ProcessExitWithSwappedOutViews
# Crashes due to using --disable-gpu.
# Needs to investigate more in http://crbug.com/461624.
ScreenOrientationBrowserTest.*
-# Failures
-RenderViewHostTest.BaseURLParam
-OffTheRecordClipboardTest.ClearContentData
-GpuPixelBrowserTest.*
-FileSystemBrowserTestWithLowQuota.QuotaTest
-ChildProcessSecurityPolicyInProcessBrowserTest.NoLeak
-
# Plugins are not supported.
BrowserPluginThreadedCompositorPixelTest.*
BrowserPluginHostTest.*
BrowserPluginTest.*
PluginTest.*
-# These used to be test_shell_tests and were ported to content_browsertests in
-# https://codereview.chromium.org/14304004/. Investigate more.
-DomSerializerTests.*
+# http://crbug.com/463740
+CrossPlatformAccessibilityBrowserTest.SelectedEditableTextAccessibility
# http://crbug.com/297230
DumpAccessibilityTreeTest.AccessibilityAriaLevel
@@ -44,7 +35,6 @@
DumpAccessibilityTreeTest.AccessibilityUl
DumpAccessibilityTreeTest.AccessibilityCanvas
RendererAccessibilityTest.DetachAccessibilityObject
-RendererAccessibilityTest.EditableTextModeFocusEvents
DumpAccessibilityTreeTest.AccessibilityDialog
DumpAccessibilityTreeTest.AccessibilityModalDialogClosed
DumpAccessibilityTreeTest.AccessibilityModalDialogInIframeOpened
@@ -52,13 +42,9 @@
# http://crbug.com/187500
RenderViewImplTest.*
-RendererAccessibilityTest.EditableTextModeFocusNotifications
RendererAccessibilityTest.SendFullAccessibilityTreeOnReload
RendererAccessibilityTest.HideAccessibilityObject
RendererAccessibilityTest.ShowAccessibilityObject
-RenderWidgetTest.OnMsgPaintAtSize
-PasswordFormConversionUtilsTest.ValidWebFormElementToPasswordForm
-PasswordFormConversionUtilsTest.InvalidWebFormElementToPasswordForm
# http://crbug.com/215894
DownloadContentTest.CancelInterruptedDownload
@@ -71,9 +57,6 @@
DownloadContentTest.ResumeInterruptedDownloadBadPrecondition
DownloadContentTest.ResumeWithDeletedFile
-# http://crbug.com/224134
-RenderWidgetHostBrowserTest.GetSnapshotFromRendererTest
-
# http://crbug.com/386227
IndexedDBBrowserTest.VersionChangeCrashResilience
@@ -86,28 +69,12 @@
# http://crbug.com/342525
IndexedDBBrowserTestSingleProcess.RenderThreadShutdownTest
-BookmarkletTest.NonEmptyResult
-
-# http://crbug.com/256238
-SignalTest.*
-
-# http://crbug.com/311344
-BrowserGpuChannelHostFactoryTest.AlreadyEstablished
-BrowserGpuChannelHostFactoryTest.Basic
-BrowserGpuChannelHostFactoryTest.CrashAndRecover
-BrowserGpuChannelHostFactoryTest.EstablishAndTerminate
-
-# http://crbug.com/338408
-TracingControllerTest.EnableCaptureAndDisableMonitoring
-
-# http://crbug.com/338411
-FrameTreeBrowserTest.NavigateWithLeftoverFrames
-
# http://crbug.com/338421
GinBrowserTest.GinAndGarbageCollection
-# http://crbug.com/341995
-TracingControllerTest.EnableCaptureAndDisableMonitoringWithFilePath
-
# http://crbug.com/343604
MSE_ClearKey/EncryptedMediaTest.ConfigChangeVideo/0
+
+# http://crbug.com/463041
+ScreenOrientationBrowserTest.ScreenOrientationChange
+ScreenOrientationBrowserTest.WindowOrientationCange
diff --git a/build/android/pylib/gtest/local_device_gtest_run.py b/build/android/pylib/gtest/local_device_gtest_run.py
index 3ca0374..c48c865 100644
--- a/build/android/pylib/gtest/local_device_gtest_run.py
+++ b/build/android/pylib/gtest/local_device_gtest_run.py
@@ -24,9 +24,6 @@
'org.chromium.native_test.ChromeNativeTestActivity.CommandLineFile')
_EXTRA_COMMAND_LINE_FLAGS = (
'org.chromium.native_test.ChromeNativeTestActivity.CommandLineFlags')
-_EXTRA_ENABLE_TEST_SERVER_SPAWNER = (
- 'org.chromium.native_test.ChromeNativeTestInstrumentationTestRunner'
- '.EnableTestServerSpawner')
_MAX_SHARD_SIZE = 256
@@ -44,9 +41,6 @@
self._component = '%s/%s' % (self._package, self._runner)
self._enable_test_server_spawner = False
- def EnableTestServerSpawner(self):
- self._enable_test_server_spawner = True
-
def Install(self, device):
device.Install(self._apk)
@@ -57,8 +51,6 @@
extras = {
_EXTRA_COMMAND_LINE_FILE: command_line_file.name,
}
- if self._enable_test_server_spawner:
- extras[_EXTRA_ENABLE_TEST_SERVER_SPAWNER] = '1'
return device.StartInstrumentation(
self._component, extras=extras, raw=False, **kwargs)
@@ -81,9 +73,6 @@
self._deps_host_path = None
self._test_run = tr
- def EnableTestServerSpawner(self):
- pass
-
def Install(self, device):
# TODO(jbudorick): Look into merging this with normal data deps pushing if
# executables become supported on nonlocal environments.
@@ -143,6 +132,8 @@
elif self._test_instance.exe:
self._delegate = _ExeDelegate(self, self._test_instance.exe)
+ self._servers = {}
+
#override
def TestPackage(self):
return self._test_instance._suite
@@ -161,8 +152,14 @@
for h, d in host_device_tuples]
dev.PushChangedFiles(host_device_tuples)
+ self._servers[str(dev)] = []
if self.TestPackage() in _SUITE_REQUIRES_TEST_SERVER_SPAWNER:
- self._delegate.EnableTestServerSpawner()
+ self._servers[str(dev)].append(
+ local_test_server_spawner.LocalTestServerSpawner(
+ ports.AllocateTestServerPort(), dev, self.GetTool(dev)))
+
+ for s in self._servers[str(dev)]:
+ s.SetUp()
self._env.parallel_devices.pMap(individual_device_set_up,
self._test_instance.GetDataDependencies())
@@ -194,6 +191,8 @@
# Run the test.
output = self._delegate.RunWithFlags(device, '--gtest_filter=%s' % test,
timeout=900, retries=0)
+ for s in self._servers[str(device)]:
+ s.Reset()
self._delegate.Clear(device)
# Parse the output.
@@ -203,5 +202,9 @@
#override
def TearDown(self):
- pass
+ def individual_device_tear_down(dev):
+ for s in self._servers[str(dev)]:
+ s.TearDown()
+
+ self._env.parallel_devices.pMap(individual_device_tear_down)
diff --git a/build/android/pylib/perf/test_runner.py b/build/android/pylib/perf/test_runner.py
index d9227a5..da66d07 100644
--- a/build/android/pylib/perf/test_runner.py
+++ b/build/android/pylib/perf/test_runner.py
@@ -250,9 +250,10 @@
logging.info('%s : %s', test_name, cmd)
start_time = datetime.datetime.now()
- timeout = 5400
+ timeout = self._tests['steps'][test_name].get('timeout', 5400)
if self._options.no_timeout:
timeout = None
+ logging.info('Timeout for %s test: %s', test_name, timeout)
full_cmd = cmd
if self._options.dry_run:
full_cmd = 'echo %s' % cmd
diff --git a/build/android/pylib/remote/device/remote_device_environment.py b/build/android/pylib/remote/device/remote_device_environment.py
index 2561180..3b0c029 100644
--- a/build/android/pylib/remote/device/remote_device_environment.py
+++ b/build/android/pylib/remote/device/remote_device_environment.py
@@ -183,6 +183,7 @@
os.environ['APPURIFY_API_PROTO'] = self._api_protocol
os.environ['APPURIFY_API_HOST'] = self._api_address
os.environ['APPURIFY_API_PORT'] = self._api_port
+ os.environ['APPURIFY_STATUS_BASE_URL'] = 'none'
self._GetAccessToken()
if self._trigger:
self._SelectDevice()
@@ -302,7 +303,8 @@
def _NoDeviceFound(self):
self._PrintAvailableDevices(self._GetDeviceList())
- raise remote_device_helper.RemoteDeviceError('No device found.')
+ raise remote_device_helper.RemoteDeviceError(
+ 'No device found.', is_infra_error=True)
@property
def collect(self):
diff --git a/build/android/pylib/remote/device/remote_device_helper.py b/build/android/pylib/remote/device/remote_device_helper.py
index 71603c3..5b1411e 100644
--- a/build/android/pylib/remote/device/remote_device_helper.py
+++ b/build/android/pylib/remote/device/remote_device_helper.py
@@ -4,7 +4,10 @@
"""Common functions and Exceptions for remote_device_*"""
-class RemoteDeviceError(Exception):
+from pylib.utils import base_error
+
+
+class RemoteDeviceError(base_error.BaseError):
"""Exception to throw when problems occur with remote device service."""
pass
diff --git a/build/android/pylib/remote/device/remote_device_test_run.py b/build/android/pylib/remote/device/remote_device_test_run.py
index 43a7399..a2d4a53 100644
--- a/build/android/pylib/remote/device/remote_device_test_run.py
+++ b/build/android/pylib/remote/device/remote_device_test_run.py
@@ -93,7 +93,8 @@
if timeout_counter > timeout:
raise remote_device_helper.RemoteDeviceError(
'Timeout while in %s state for %s seconds'
- % (current_status, timeout))
+ % (current_status, timeout),
+ is_infra_error=True)
time.sleep(self.WAIT_TIME)
timeout_counter += self.WAIT_TIME
heartbeat_counter += self.WAIT_TIME
diff --git a/build/android/pylib/remote/device/remote_device_uirobot_test_run.py b/build/android/pylib/remote/device/remote_device_uirobot_test_run.py
index 936db0a..f818c98 100644
--- a/build/android/pylib/remote/device/remote_device_uirobot_test_run.py
+++ b/build/android/pylib/remote/device/remote_device_uirobot_test_run.py
@@ -43,7 +43,7 @@
default_runner_type = 'ios_robot'
else:
raise remote_device_helper.RemoteDeviceError(
- 'Unkown device type: %s' % self._env.device_type)
+ 'Unknown device type: %s' % self._env.device_type)
self._app_id = self._UploadAppToDevice(self._test_instance.app_under_test)
if not self._env.runner_type:
diff --git a/build/android/pylib/utils/base_error.py b/build/android/pylib/utils/base_error.py
new file mode 100644
index 0000000..31eaa54
--- /dev/null
+++ b/build/android/pylib/utils/base_error.py
@@ -0,0 +1,16 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+
+class BaseError(Exception):
+ """Base error for all test runner errors."""
+
+ def __init__(self, message, is_infra_error=False):
+ super(BaseError, self).__init__(message)
+ self._is_infra_error = is_infra_error
+
+ @property
+ def is_infra_error(self):
+ """Property to indicate if error was caused by an infrastructure issue."""
+ return self._is_infra_error
\ No newline at end of file
diff --git a/build/android/test_runner.py b/build/android/test_runner.py
index f79e13e..368ac06 100755
--- a/build/android/test_runner.py
+++ b/build/android/test_runner.py
@@ -44,6 +44,7 @@
from pylib.uiautomator import setup as uiautomator_setup
from pylib.uiautomator import test_options as uiautomator_test_options
from pylib.utils import apk_helper
+from pylib.utils import base_error
from pylib.utils import reraiser_thread
from pylib.utils import run_tests_helper
@@ -957,7 +958,7 @@
json_results.GenerateJsonResultsFile(
results, args.json_results_file)
- return 0 if results.DidRunPass() else 1
+ return 0 if results.DidRunPass() else constants.ERROR_EXIT_CODE
CommandConfigTuple = collections.namedtuple(
@@ -1013,7 +1014,18 @@
config.add_options_func(subparser)
args = parser.parse_args()
- return RunTestsCommand(args, parser)
+
+ try:
+ return RunTestsCommand(args, parser)
+ except base_error.BaseError as e:
+ logging.exception('Error occurred.')
+ if e.is_infra_error:
+ return constants.INFRA_EXIT_CODE
+ else:
+ return constants.ERROR_EXIT_CODE
+ except: # pylint: disable=W0702
+ logging.exception('Unrecognized error occurred.')
+ return constants.ERROR_EXIT_CODE
if __name__ == '__main__':
diff --git a/build/apk_test.gypi b/build/apk_test.gypi
index 5ee494c..05bafab 100644
--- a/build/apk_test.gypi
+++ b/build/apk_test.gypi
@@ -22,7 +22,6 @@
'<(DEPTH)/base/base.gyp:base_java',
'<(DEPTH)/build/android/pylib/device/commands/commands.gyp:chromium_commands',
'<(DEPTH)/build/android/pylib/remote/device/dummy/dummy.gyp:remote_device_dummy_apk',
- '<(DEPTH)/net/net.gyp:net_java_test_support',
'<(DEPTH)/tools/android/android_tools.gyp:android_tools',
],
'conditions': [
diff --git a/build/common.gypi b/build/common.gypi
index 4c2d696..d72c76f 100644
--- a/build/common.gypi
+++ b/build/common.gypi
@@ -184,6 +184,12 @@
# below for MIPS targets.
'mips_arch_variant%': '',
+ # MIPS DSP ASE revision. Possible values are:
+ # 0: unavailable
+ # 1: revision 1
+ # 2: revision 2
+ 'mips_dsp_rev%': 0,
+
'conditions': [
# Ash needs Aura.
['use_aura==0', {
@@ -276,6 +282,7 @@
'target_arch%': '<(target_arch)',
'target_subarch%': '<(target_subarch)',
'mips_arch_variant%': '<(mips_arch_variant)',
+ 'mips_dsp_rev%': '<(mips_dsp_rev)',
'toolkit_views%': '<(toolkit_views)',
'desktop_linux%': '<(desktop_linux)',
'use_aura%': '<(use_aura)',
@@ -1067,6 +1074,7 @@
'target_arch%': '<(target_arch)',
'target_subarch%': '<(target_subarch)',
'mips_arch_variant%': '<(mips_arch_variant)',
+ 'mips_dsp_rev%': '<(mips_dsp_rev)',
'host_arch%': '<(host_arch)',
'toolkit_views%': '<(toolkit_views)',
'ui_compositor_image_transport%': '<(ui_compositor_image_transport)',
@@ -1663,11 +1671,16 @@
# Location of Android NDK.
'variables': {
'variables': {
- # Unfortunately we have to use absolute paths to the SDK/NDK because
- # they're passed to ant which uses a different relative path from
- # gyp.
- 'android_ndk_root%': '<!(cd <(DEPTH) && pwd -P)/third_party/android_tools/ndk/',
+ # Standard libraries can use the relative path to the NDK.
+ 'android_ndk_root%': '../../third_party/android_tools/ndk/',
+ # Unfortunately, it is required to use the absolute path to the SDK
+ # because it us passed to ant which uses a different relative path
+ # from GYP.
'android_sdk_root%': '<!(cd <(DEPTH) && pwd -P)/third_party/android_tools/sdk/',
+ # Similarly, gdbserver and the Android toolchain need to use the
+ # absolute path to the NDK because they are used at different levels
+ # in the GYP files.
+ 'android_ndk_absolute_root%': '<!(cd <(DEPTH) && pwd -P)/third_party/android_tools/ndk/',
'android_host_arch%': '<!(uname -m)',
# Android API-level of the SDK used for compilation.
'android_sdk_version%': '21',
@@ -1676,6 +1689,7 @@
},
# Copy conditionally-set variables out one scope.
'android_ndk_root%': '<(android_ndk_root)',
+ 'android_ndk_absolute_root%': '<(android_ndk_absolute_root)',
'android_sdk_root%': '<(android_sdk_root)',
'android_sdk_version%': '<(android_sdk_version)',
'android_stlport_root': '<(android_ndk_root)/sources/cxx-stl/stlport',
@@ -1691,17 +1705,17 @@
'conditions': [
['target_arch == "ia32"', {
'android_app_abi%': 'x86',
- 'android_gdbserver%': '<(android_ndk_root)/prebuilt/android-x86/gdbserver/gdbserver',
+ 'android_gdbserver%': '<(android_ndk_absolute_root)/prebuilt/android-x86/gdbserver/gdbserver',
'android_ndk_sysroot%': '<(android_ndk_root)/platforms/android-14/arch-x86',
'android_ndk_lib_dir%': 'usr/lib',
- 'android_toolchain%': '<(android_ndk_root)/toolchains/x86-4.9/prebuilt/<(host_os)-<(android_host_arch)/bin',
+ 'android_toolchain%': '<(android_ndk_absolute_root)/toolchains/x86-4.9/prebuilt/<(host_os)-<(android_host_arch)/bin',
}],
['target_arch == "x64"', {
'android_app_abi%': 'x86_64',
- 'android_gdbserver%': '<(android_ndk_root)/prebuilt/android-x86_64/gdbserver/gdbserver',
+ 'android_gdbserver%': '<(android_ndk_absolute_root)/prebuilt/android-x86_64/gdbserver/gdbserver',
'android_ndk_sysroot%': '<(android_ndk_root)/platforms/android-21/arch-x86_64',
'android_ndk_lib_dir%': 'usr/lib64',
- 'android_toolchain%': '<(android_ndk_root)/toolchains/x86_64-4.9/prebuilt/<(host_os)-<(android_host_arch)/bin',
+ 'android_toolchain%': '<(android_ndk_absolute_root)/toolchains/x86_64-4.9/prebuilt/<(host_os)-<(android_host_arch)/bin',
}],
['target_arch=="arm"', {
'conditions': [
@@ -1711,32 +1725,31 @@
'android_app_abi%': 'armeabi-v7a',
}],
],
- 'android_gdbserver%': '<(android_ndk_root)/prebuilt/android-arm/gdbserver/gdbserver',
+ 'android_gdbserver%': '<(android_ndk_absolute_root)/prebuilt/android-arm/gdbserver/gdbserver',
'android_ndk_sysroot%': '<(android_ndk_root)/platforms/android-14/arch-arm',
'android_ndk_lib_dir%': 'usr/lib',
- 'android_toolchain%': '<(android_ndk_root)/toolchains/arm-linux-androideabi-4.9/prebuilt/<(host_os)-<(android_host_arch)/bin',
+ 'android_toolchain%': '<(android_ndk_absolute_root)/toolchains/arm-linux-androideabi-4.9/prebuilt/<(host_os)-<(android_host_arch)/bin',
}],
['target_arch == "arm64"', {
'android_app_abi%': 'arm64-v8a',
- 'android_gdbserver%': '<(android_ndk_root)/prebuilt/android-arm64/gdbserver/gdbserver',
+ 'android_gdbserver%': '<(android_ndk_absolute_root)/prebuilt/android-arm64/gdbserver/gdbserver',
'android_ndk_sysroot%': '<(android_ndk_root)/platforms/android-21/arch-arm64',
'android_ndk_lib_dir%': 'usr/lib',
- 'android_toolchain%': '<(android_ndk_root)/toolchains/aarch64-linux-android-4.9/prebuilt/<(host_os)-<(android_host_arch)/bin',
+ 'android_toolchain%': '<(android_ndk_absolute_root)/toolchains/aarch64-linux-android-4.9/prebuilt/<(host_os)-<(android_host_arch)/bin',
}],
['target_arch == "mipsel"', {
'android_app_abi%': 'mips',
- 'android_gdbserver%': '<(android_ndk_root)/prebuilt/android-mips/gdbserver/gdbserver',
+ 'android_gdbserver%': '<(android_ndk_absolute_root)/prebuilt/android-mips/gdbserver/gdbserver',
'android_ndk_sysroot%': '<(android_ndk_root)/platforms/android-14/arch-mips',
'android_ndk_lib_dir%': 'usr/lib',
- 'android_toolchain%': '<(android_ndk_root)/toolchains/mipsel-linux-android-4.9/prebuilt/<(host_os)-<(android_host_arch)/bin',
+ 'android_toolchain%': '<(android_ndk_absolute_root)/toolchains/mipsel-linux-android-4.9/prebuilt/<(host_os)-<(android_host_arch)/bin',
}],
['target_arch == "mips64el"', {
'android_app_abi%': 'mips64',
- 'android_gdbserver%': '<(android_ndk_root)/prebuilt/android-mips64/gdbserver/gdbserver',
+ 'android_gdbserver%': '<(android_ndk_absolute_root)/prebuilt/android-mips64/gdbserver/gdbserver',
'android_ndk_sysroot%': '<(android_ndk_root)/platforms/android-21/arch-mips64',
'android_ndk_lib_dir%': 'usr/lib64',
- 'android_toolchain%': '<(android_ndk_root)/toolchains/mips64el-linux-android-4.9/prebuilt/<(host_os)-<(android_host_arch)/bin',
- 'gcc_version%': 49,
+ 'android_toolchain%': '<(android_ndk_absolute_root)/toolchains/mips64el-linux-android-4.9/prebuilt/<(host_os)-<(android_host_arch)/bin',
}],
],
},
@@ -2149,9 +2162,8 @@
'enable_service_discovery%': 1
}],
['clang_use_chrome_plugins==1 and OS!="win"', {
- 'clang_chrome_plugins_flags': [
- '<!@(<(DEPTH)/tools/clang/scripts/plugin_flags.sh)'
- ],
+ 'clang_chrome_plugins_flags%':
+ '<!(python <(DEPTH)/tools/clang/scripts/plugin_flags.py)',
}],
['asan==1 or msan==1 or lsan==1 or tsan==1', {
'clang%': 1,
@@ -2290,7 +2302,10 @@
'arm_thumb%': 1,
}],
- # Set default compiler flags depending on MIPS architecture variant.
+ # Set default compiler flags for MIPS floating-point support.
+ ['target_arch=="mipsel" and android_webview_build==0', {
+ 'mips_float_abi%': 'hard',
+ }],
['target_arch=="mipsel" and mips_arch_variant=="r2" and android_webview_build==0', {
'mips_fpu_mode%': 'fp32',
}],
@@ -2302,6 +2317,7 @@
'arm_fpu%': '',
'arm_float_abi%': '',
'arm_thumb%': 0,
+ 'mips_float_abi%': '',
'mips_fpu_mode%': '',
}],
@@ -2591,7 +2607,7 @@
],
},
}],
- ['clang==1 and OS!="win"', {
+ ['(clang==1 or host_clang==1) and OS!="win"', {
# This is here so that all files get recompiled after a clang roll and
# when turning clang on or off.
# (defines are passed via the command line, and build systems rebuild
@@ -4052,19 +4068,37 @@
'target_conditions': [
['_toolset=="target"', {
'conditions': [
- ['android_webview_build==0 and mips_arch_variant=="r6"', {
- 'cflags': ['-mips32r6', '-Wa,-mips32r6'],
+ ['android_webview_build==0', {
'conditions': [
- ['OS=="android"', {
- 'ldflags': ['-mips32r6', '-Wl,-melf32ltsmip',],
+ ['mips_arch_variant=="r6"', {
+ 'cflags': ['-mips32r6', '-Wa,-mips32r6'],
+ 'conditions': [
+ ['OS=="android"', {
+ 'ldflags': ['-mips32r6', '-Wl,-melf32ltsmip',],
+ }],
+ ],
+ }],
+ ['mips_arch_variant=="r2"', {
+ 'cflags': ['-mips32r2', '-Wa,-mips32r2'],
+ 'conditions': [
+ ['mips_float_abi=="hard" and mips_fpu_mode!=""', {
+ 'cflags': ['-m<(mips_fpu_mode)'],
+ }],
+ ],
+ }],
+ ['mips_arch_variant=="r1"', {
+ 'cflags': ['-mips32', '-Wa,-mips32'],
+ }],
+ ['mips_dsp_rev==1', {
+ 'cflags': ['-mdsp'],
+ }],
+ ['mips_dsp_rev==2', {
+ 'cflags': ['-mdspr2'],
}],
],
- }],
- ['android_webview_build==0 and mips_arch_variant=="r2"', {
- 'cflags': ['-mips32r2', '-Wa,-mips32r2'],
- }],
- ['android_webview_build==0 and mips_arch_variant=="r1"', {
- 'cflags': ['-mips32', '-Wa,-mips32'],
+ 'cflags': [
+ '-m<(mips_float_abi)-float'
+ ],
}],
],
'ldflags': [
@@ -4080,13 +4114,17 @@
'target_conditions': [
['_toolset=="target"', {
'conditions': [
- ['android_webview_build==0 and mips_arch_variant=="r6"', {
- 'cflags': ['-mips64r6', '-Wa,-mips64r6'],
- 'ldflags': [ '-mips64r6' ],
- }],
- ['android_webview_build==0 and mips_arch_variant=="r2"', {
- 'cflags': ['-mips64r2', '-Wa,-mips64r2'],
- 'ldflags': [ '-mips64r2' ],
+ ['android_webview_build==0', {
+ 'conditions': [
+ ['mips_arch_variant=="r6"', {
+ 'cflags': ['-mips64r6', '-Wa,-mips64r6'],
+ 'ldflags': ['-mips64r6'],
+ }],
+ ['mips_arch_variant=="r2"', {
+ 'cflags': ['-mips64r2', '-Wa,-mips64r2'],
+ 'ldflags': ['-mips64r2'],
+ }],
+ ],
}],
],
'cflags_cc': [
@@ -5856,6 +5894,17 @@
],
},
}],
+ ['use_lto==1 and clang==1', {
+ 'target_defaults': {
+ 'target_conditions': [
+ ['_toolset=="target"', {
+ 'arflags': [
+ '--plugin', '../../<(make_clang_dir)/lib/LLVMgold.so',
+ ],
+ }],
+ ],
+ },
+ }],
['(use_lto==1 or use_lto_o2==1) and clang==0', {
'target_defaults': {
'target_conditions': [
diff --git a/build/config/BUILDCONFIG.gn b/build/config/BUILDCONFIG.gn
index ea88ff5..3afba89 100644
--- a/build/config/BUILDCONFIG.gn
+++ b/build/config/BUILDCONFIG.gn
@@ -113,14 +113,10 @@
# toolchains.
cros_use_custom_toolchain = false
}
-
- # TODO(brettw) remove this flag (and therefore enable linking all targets) on
- # Windows when we have sufficient bot capacity. In the meantime, you can
- # enable linking for local compiles.
- link_chrome_on_windows = true
}
# TODO(dpranke): Remove these asserts when os and cpu_arch are removed.
+assert(current_cpu == cpu_arch)
assert(current_os == os)
# =============================================================================
diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni
index aa1fd2a..28608cb 100644
--- a/build/config/android/rules.gni
+++ b/build/config/android/rules.gni
@@ -160,11 +160,13 @@
jni_target_name = "${target_name}__jni_${classname}"
jni_actions += [ ":$jni_target_name" ]
action(jni_target_name) {
+ # The sources aren't compiled so don't check their dependencies.
+ check_includes = false
depfile = "$target_gen_dir/$target_name.d"
script = "//base/android/jni_generator/jni_generator.py"
sources = [
- jni_generator_include,
jar_file,
+ jni_generator_include,
]
outputs = [
depfile,
@@ -1499,7 +1501,6 @@
deps = [
"//base:base_java",
"//build/android/pylib/remote/device/dummy:remote_device_dummy_apk",
- "//net/android:net_java_test_support",
]
if (defined(invoker.deps)) {
deps += invoker.deps
diff --git a/build/config/clang/BUILD.gn b/build/config/clang/BUILD.gn
index 39fe251..721e87c 100644
--- a/build/config/clang/BUILD.gn
+++ b/build/config/clang/BUILD.gn
@@ -21,13 +21,6 @@
"//third_party/llvm-build/Release+Asserts/lib/libFindBadConstructs.so",
root_build_dir) ]
}
-
- cflags += [
- "-Xclang",
- "-add-plugin",
- "-Xclang",
- "find-bad-constructs",
- ]
}
}
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index 5cf0331..4397151 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -48,6 +48,13 @@
# http://gcc.gnu.org/wiki/DebugFission
use_debug_fission =
!is_win && use_gold && linux_use_bundled_binutils && !use_ccache
+
+ if (is_win) {
+ # Whether the VS xtree header has been patched to disable warning 4702. If
+ # it has, then we don't need to disable 4702 (unreachable code warning).
+ # The patch is preapplied to the internal toolchain and hence all bots.
+ msvs_xtree_patched = false
+ }
}
# default_include_dirs ---------------------------------------------------------
@@ -295,12 +302,23 @@
"-mips32r2",
"-Wa,-mips32r2",
]
+ if (mips_float_abi == "hard" && mips_fpu_mode != "") {
+ cflags += [ "-m$mips_fpu_mode" ]
+ }
} else if (mips_arch_variant == "r1") {
cflags += [
"-mips32",
"-Wa,-mips32",
]
}
+
+ if (mips_dsp_rev == 1) {
+ cflags += [ "-mdsp" ]
+ } else if (mips_dsp_rev == 2) {
+ cflags += [ "-mdspr2" ]
+ }
+
+ cflags += [ "-m${mips_float_abi}-float" ]
}
} else if (current_cpu == "mips64el") {
# Don't set the compiler flags for the WebView build. These will come
@@ -709,6 +727,7 @@
if (is_win) {
cflags = [
"/WX", # Treat warnings as errors.
+
# Warnings permanently disabled:
# TODO(GYP) The GYP build doesn't have this globally enabled but disabled
@@ -763,6 +782,7 @@
# have to turn off this warning (and be careful about how object
# destruction happens in such cases).
"/wd4611",
+
# Warnings to evaluate and possibly fix/reenable later:
"/wd4100", # Unreferenced formal function parameter.
@@ -775,6 +795,14 @@
"/wd4610", # Class can never be instantiated, constructor required.
"/wd4996", # Deprecated function warning.
]
+
+ # VS xtree header file needs to be patched or 4702 (unreachable code
+ # warning) is reported if _HAS_EXCEPTIONS=0. Disable the warning if xtree is
+ # not patched.
+ if (!msvs_xtree_patched &&
+ exec_script("../../win_is_xtree_patched.py", [], "value") == 0) {
+ cflags += [ "/wd4702" ] # Unreachable code.
+ }
} else {
# Common GCC warning setup.
cflags = [
diff --git a/build/config/features.gni b/build/config/features.gni
index 5ee92f7..4d01a87 100644
--- a/build/config/features.gni
+++ b/build/config/features.gni
@@ -30,10 +30,10 @@
# guarded by "is_nacl" directly rather than enable_nacl_untrusted, but
# this will go away when Mac and Win are working and we can just use
# the commented out logic.
- # enable_nacl = !is_ios && !is_android
- # Currently this *should* work:
- # enable_nacl = (is_linux && build_cpu_arch == "x64") || is_nacl
- enable_nacl = false
+ # Eventually we want this to be:
+ # enable_nacl = !is_ios && !is_android
+ enable_nacl =
+ (is_linux && !is_chromeos && !is_debug && current_cpu == "x64") || is_nacl
enable_nacl_untrusted = enable_nacl
enable_pnacl = enable_nacl_untrusted
@@ -49,6 +49,29 @@
# Enables proprietary codecs and demuxers; e.g. H264, MOV, AAC, and MP3.
proprietary_codecs = false
+
+ enable_configuration_policy = true
+
+ # Enables support for background apps.
+ enable_background = !is_ios && !is_android
+
+ enable_captive_portal_detection = !is_android && !is_ios
+
+ # Enables use of the session service, which is enabled by default.
+ # Android stores them separately on the Java side.
+ enable_session_service = !is_android && !is_ios
+
+ enable_plugin_installation = is_win || is_mac
+
+ enable_app_list = !is_ios && !is_android
+
+ enable_supervised_users = !is_ios
+
+ enable_autofill_dialog = !is_ios && !(is_android && is_android_webview_build)
+
+ enable_google_now = !is_ios && !is_android
+
+ enable_one_click_signin = is_win || is_mac || (is_linux && !is_chromeos)
}
# Additional dependent variables -----------------------------------------------
@@ -113,11 +136,6 @@
safe_browsing_mode = 1
}
-enable_configuration_policy = true
-
-# Enables support for background apps.
-enable_background = !is_ios && !is_android
-
enable_task_manager = !is_ios && !is_android
use_cups = is_desktop_linux || is_mac
@@ -127,27 +145,14 @@
# TODO(scottmg) remove this when we've fixed printing.
win_pdf_metafile_for_printing = true
-enable_captive_portal_detection = !is_android && !is_ios
-
-# Enables use of the session service, which is enabled by default.
-# Android stores them separately on the Java side.
-enable_session_service = !is_android && !is_ios
-
# Whether we are using the rlz library or not. Platforms like Android send
# rlz codes for searches but do not use the library.
enable_rlz = is_chrome_branded && (is_win || is_mac || is_ios || is_chromeos)
-enable_plugin_installation = is_win || is_mac
-
-enable_app_list = !is_ios && !is_android
enable_settings_app = enable_app_list && !is_chromeos
-enable_supervised_users = !is_ios
-
enable_service_discovery = enable_mdns || is_mac
-enable_autofill_dialog = !is_ios && !(is_android && is_android_webview_build)
-
enable_wifi_bootstrapping = is_win || is_mac
# Image loader extension is enabled on ChromeOS only.
@@ -155,10 +160,6 @@
enable_remoting = !is_ios && !is_android
-enable_google_now = !is_ios && !is_android
-
-enable_one_click_signin = is_win || is_mac || (is_linux && !is_chromeos)
-
# Chrome OS: whether to also build the upcoming version of
# ChromeVox, which can then be enabled via a command-line switch.
enable_chromevox_next = false
diff --git a/build/config/linux/gtk/BUILD.gn b/build/config/linux/gtk/BUILD.gn
new file mode 100644
index 0000000..4968e2d
--- /dev/null
+++ b/build/config/linux/gtk/BUILD.gn
@@ -0,0 +1,42 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//build/config/linux/pkg_config.gni")
+
+assert(is_linux, "This file should only be referenced on Linux")
+
+# Depend on //build/config/linux/gtk to use GTK.
+#
+# GN doesn't check visibility for configs so we give this an obviously internal
+# name to discourage random targets from accidentally depending on this and
+# bypassing the GTK target's visibility.
+pkg_config("gtk_internal_config") {
+ # Gtk requires gmodule, but it does not list it as a dependency in some
+ # misconfigured systems.
+ packages = [
+ "gmodule-2.0",
+ "gtk+-2.0",
+ "gthread-2.0",
+ ]
+}
+
+# Basically no parts of Chrome should depend on GTK. To prevent accidents, the
+# parts that explicitly need GTK are whitelisted on this target.
+group("gtk") {
+ visibility = [
+ "//chrome/browser/ui/libgtk2ui",
+ "//remoting/host",
+ ]
+ direct_dependent_configs = [ ":gtk_internal_config" ]
+}
+
+# Depend on "gtkprint" to get this.
+pkg_config("gtkprint_internal_config") {
+ packages = [ "gtk+-unix-print-2.0" ]
+}
+
+group("gtkprint") {
+ visibility = [ "//chrome/browser/ui/libgtk2ui" ]
+ direct_dependent_configs = [ ":gtkprint_internal_config" ]
+}
diff --git a/build/config/mips.gni b/build/config/mips.gni
index 512552d..1b40657 100644
--- a/build/config/mips.gni
+++ b/build/config/mips.gni
@@ -2,12 +2,35 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
-# MIPS arch variant.
if (current_cpu == "mipsel") {
declare_args() {
+ # MIPS arch variant. Possible values are:
+ # "r1"
+ # "r2"
+ # "r6"
mips_arch_variant = "r1"
+
+ # MIPS DSP ASE revision. Possible values are:
+ # 0: unavailable
+ # 1: revision 1
+ # 2: revision 2
+ mips_dsp_rev = 0
+
+ # MIPS floating-point ABI. Possible values are:
+ # "hard": sets the GCC -mhard-float option.
+ # "soft": sets the GCC -msoft-float option.
+ mips_float_abi = "hard"
+
+ # MIPS32 floating-point register width. Possible values are:
+ # "fp32": sets the GCC -mfp32 option.
+ # "fp64": sets the GCC -mfp64 option.
+ # "fpxx": sets the GCC -mfpxx option.
+ mips_fpu_mode = "fp32"
}
} else if (current_cpu == "mips64el") {
+ # MIPS arch variant. Possible values are:
+ # "r2"
+ # "r6"
if (is_android) {
declare_args() {
mips_arch_variant = "r6"
diff --git a/build/download_gold_plugin.py b/build/download_gold_plugin.py
new file mode 100755
index 0000000..1d8be5a
--- /dev/null
+++ b/build/download_gold_plugin.py
@@ -0,0 +1,45 @@
+#!/usr/bin/env python
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Script to download LLVM gold plugin from google storage."""
+
+import json
+import os
+import shutil
+import subprocess
+import sys
+import zipfile
+
+SCRIPT_DIR = os.path.dirname(os.path.realpath(__file__))
+CHROME_SRC = os.path.abspath(os.path.join(SCRIPT_DIR, os.pardir))
+sys.path.insert(0, os.path.join(CHROME_SRC, 'tools'))
+
+import find_depot_tools
+
+DEPOT_PATH = find_depot_tools.add_depot_tools_to_path()
+GSUTIL_PATH = os.path.join(DEPOT_PATH, 'gsutil.py')
+
+LLVM_BUILD_PATH = os.path.join(CHROME_SRC, 'third_party', 'llvm-build',
+ 'Release+Asserts')
+CLANG_UPDATE_SH = os.path.join(CHROME_SRC, 'tools', 'clang', 'scripts',
+ 'update.sh')
+CLANG_REVISION = os.popen(CLANG_UPDATE_SH + ' --print-revision').read().rstrip()
+
+CLANG_BUCKET = 'gs://chromium-browser-clang/Linux_x64'
+
+def main():
+ targz_name = 'llvmgold-%s.tgz' % CLANG_REVISION
+ remote_path = '%s/%s' % (CLANG_BUCKET, targz_name)
+
+ os.chdir(LLVM_BUILD_PATH)
+
+ subprocess.check_call(['python', GSUTIL_PATH,
+ 'cp', remote_path, targz_name])
+ subprocess.check_call(['tar', 'xzf', targz_name])
+ os.remove(targz_name)
+ return 0
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/build/gn_migration.gypi b/build/gn_migration.gypi
new file mode 100644
index 0000000..273c38e
--- /dev/null
+++ b/build/gn_migration.gypi
@@ -0,0 +1,502 @@
+# Copyright (c) 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# This file defines three targets that we are using to
+# track the progress of the GYP->GN migration:
+#
+# If you run 'ninja gn_build gyp_remaining gyp_groups', and then
+# run 'ninja', the second ninja invocation should do nothing. This
+# indicates that everything built by a ninja build is in fact
+# listed in one of these targets.
+#
+# 'gn_all' lists what GN is currently capable of building and should
+# match the 'gn_all' target in //BUILD.gn.
+#
+# 'gyp_remaining' lists all of the targets that still need to be converted,
+# i.e., all of the other (non-empty) targets that a GYP build
+# will build.
+#
+# 'gyp_groups' lists any empty (group) targets in the GYP build that
+# are not picked up by gn_all or gyp_remaining; this is a
+# separate target to ensure that when we build it, only
+# stamp targets file are we don't accidentally pick up something
+# not listed in one of the other two targets.
+#
+# TODO(GYP), TODO(dpranke) Add a build step to the bot that enforces the
+# above contracts.
+
+{
+ 'targets': [
+ {
+ # This target should mirror the structure of //:gn_all
+ # as closely as possible, for ease of comparison.
+ 'target_name': 'gn_all',
+ 'type': 'none',
+ 'dependencies': [
+ '../base/base.gyp:base_unittests',
+ '../cc/cc_tests.gyp:cc_unittests',
+ '../chrome/chrome.gyp:chrome',
+ '../chrome/chrome.gyp:browser_tests',
+ '../chrome/chrome.gyp:interactive_ui_tests',
+ '../chrome/chrome.gyp:sync_integration_tests',
+ '../chrome/chrome.gyp:unit_tests',
+ '../components/components_tests.gyp:components_unittests',
+ '../content/content_shell_and_tests.gyp:content_shell',
+ '../content/content_shell_and_tests.gyp:content_browsertests',
+ '../content/content_shell_and_tests.gyp:content_perftests',
+ '../content/content_shell_and_tests.gyp:content_unittests',
+ '../crypto/crypto.gyp:crypto_unittests',
+ '../extensions/extensions_tests.gyp:extensions_browsertests',
+ '../extensions/extensions_tests.gyp:extensions_unittests',
+ '../google_apis/gcm/gcm.gyp:gcm_unit_tests',
+ '../gpu/gpu.gyp:gpu_unittests',
+ '../ipc/ipc.gyp:ipc_tests',
+ '../ipc/mojo/ipc_mojo.gyp:ipc_mojo_unittests',
+ '../jingle/jingle.gyp:jingle_unittests',
+ '../media/media.gyp:media_unittests',
+ '../media/cast/cast.gyp:cast_unittests',
+ '../mojo/mojo.gyp:mojo',
+ '../mojo/mojo_base.gyp:mojo_common_unittests',
+ '../net/net.gyp:net_unittests',
+ '../printing/printing.gyp:printing_unittests',
+ '../skia/skia_tests.gyp:skia_unittests',
+ '../sql/sql.gyp:sql_unittests',
+ '../sync/sync.gyp:sync_unit_tests',
+ '../third_party/WebKit/public/all.gyp:all_blink',
+ '../third_party/cacheinvalidation/cacheinvalidation.gyp:cacheinvalidation_unittests',
+ '../third_party/codesighs/codesighs.gyp:codesighs',
+ '../third_party/mojo/mojo_edk_tests.gyp:mojo_system_unittests',
+ '../third_party/mojo/mojo_edk_tests.gyp:mojo_public_bindings_unittests',
+ '../third_party/mojo/mojo_edk_tests.gyp:mojo_public_environment_unittests',
+ '../third_party/mojo/mojo_edk_tests.gyp:mojo_public_system_unittests',
+ '../third_party/mojo/mojo_edk_tests.gyp:mojo_public_utility_unittests',
+ '../third_party/pdfium/samples/samples.gyp:pdfium_test',
+ '../third_party/smhasher/smhasher.gyp:pmurhash',
+ '../third_party/sqlite/sqlite.gyp:sqlite_shell',
+ '../tools/gn/gn.gyp:gn',
+ '../tools/gn/gn.gyp:gn_unittests',
+ '../ui/accessibility/accessibility.gyp:accessibility_unittests',
+ '../ui/app_list/app_list.gyp:app_list_unittests',
+ '../ui/base/ui_base_tests.gyp:ui_base_unittests',
+ '../ui/display/display.gyp:display_unittests',
+ '../ui/events/events.gyp:events_unittests',
+ '../ui/gfx/gfx_tests.gyp:gfx_unittests',
+ '../ui/touch_selection/ui_touch_selection.gyp:ui_touch_selection_unittests',
+ '../url/url.gyp:url_unittests',
+ ],
+ 'conditions': [
+ ['enable_extensions==1 and OS!="mac"', {
+ 'dependencies': [
+ '../extensions/shell/app_shell.gyp:app_shell_unittests',
+ ],
+ }],
+ ['OS!="win"', {
+ 'dependencies': [
+ '../breakpad/breakpad.gyp:symupload',
+ ],
+ }],
+ ['use_x11==1', {
+ 'dependencies': [
+ '../tools/xdisplaycheck/xdisplaycheck.gyp:xdisplaycheck',
+ ],
+ }],
+ ['toolkit_views==1', {
+ 'dependencies': [
+ '../ui/views/views.gyp:views_unittests',
+ ],
+ }],
+ ['use_aura==1', {
+ 'dependencies': [
+ '../ui/wm/wm.gyp:wm_unittests',
+ ],
+ }],
+ ['use_ozone==1', {
+ 'dependencies': [
+ '../ui/ozone/ozone.gyp:ozone',
+ ],
+ }],
+ ['OS=="win" or OS=="mac" or chromeos==1', {
+ 'dependencies': [
+ '../rlz/rlz.gyp:rlz_lib',
+ ],
+ }],
+ ['OS=="android"', {
+ 'dependencies': [
+ '../base/base.gyp:chromium_android_linker',
+ '../build/android/rezip.gyp:rezip_apk_jar',
+ '../chrome/chrome.gyp:chrome_shell_apk',
+ '../chrome/chrome.gyp:chromedriver_webview_shell_apk',
+ #"//clank" TODO(GYP) - conditional somehow?
+ '../tools/imagediff/imagediff.gyp:imagediff#host',
+ '../tools/telemetry/telemetry.gyp:bitmaptools#host',
+
+ # TODO(GYP): Remove these when the components_unittests work.
+ #"//components/history/core/test:test",
+ #"//components/policy:policy_component_test_support",
+ #"//components/policy:test_support",
+ #"//components/rappor:test_support",
+ #"//components/signin/core/browser:test_support",
+ #"//components/sync_driver:test_support",
+ #"//components/user_manager",
+ #"//components/wallpaper",
+
+ '../content/content_shell_and_tests.gyp:content_shell_apk',
+
+ # TODO(GYP): Are these needed, or will they be pulled in automatically?
+ #"//third_party/android_tools:android_gcm_java",
+ #"//third_party/android_tools:uiautomator_java",
+ #"//third_party/android_tools:android_support_v13_java",
+ #"//third_party/android_tools:android_support_v7_appcompat_java",
+ #"//third_party/android_tools:android_support_v7_mediarouter_java",
+ #"//third_party/mesa",
+ #"//third_party/mockito:mockito_java",
+ #"//third_party/openmax_dl/dl",
+ #"//third_party/speex",
+ #"//ui/android:ui_java",
+
+ # TODO(GYP): Are these needed?
+ #"//chrome/test:test_support_unit",
+ #"//third_party/smhasher:murmurhash3",
+ #"//ui/message_center:test_support",
+ ],
+ 'dependencies!': [
+ '../breakpad/breakpad.gyp:symupload',
+ '../chrome/chrome.gyp:browser_tests',
+ '../chrome/chrome.gyp:interactive_ui_tests',
+ '../chrome/chrome.gyp:sync_integration_tests',
+ '../chrome/chrome.gyp:unit_tests',
+ '../extensions/extensions_tests.gyp:extensions_browsertests',
+ '../extensions/extensions_tests.gyp:extensions_unittests',
+ '../google_apis/gcm/gcm.gyp:gcm_unit_tests',
+ '../ipc/ipc.gyp:ipc_tests',
+ '../jingle/jingle.gyp:jingle_unittests',
+ '../net/net.gyp:net_unittests',
+ #"//ppapi/examples",
+ '../third_party/pdfium/samples/samples.gyp:pdfium_test',
+ '../tools/gn/gn.gyp:gn',
+ '../tools/gn/gn.gyp:gn_unittests',
+ '../ui/app_list/app_list.gyp:app_list_unittests',
+ '../url/url.gyp:url_unittests',
+ ],
+ }],
+ ['OS=="linux"', {
+ 'dependencies': [
+ '../sandbox/sandbox.gyp:chrome_sandbox',
+ '../sandbox/sandbox.gyp:sandbox_linux_unittests',
+ ],
+ }],
+ ['OS=="mac"', {
+ 'dependencies': [
+ '../third_party/apple_sample_code/apple_sample_code.gyp:apple_sample_code',
+ '../third_party/molokocacao/molokocacao.gyp:molokocacao',
+
+ # TODO(GYP): remove these when the corresponding root targets work.
+ "//cc/blink",
+ "//components/ui/zoom:ui_zoom",
+ "//content",
+ "//content/test:test_support",
+ "//device/battery",
+ "//device/bluetooth",
+ "//device/nfc",
+ "//device/usb",
+ "//device/vibration",
+ "//media/blink",
+ "//pdf",
+ "//storage/browser",
+ "//third_party/brotli",
+ "//third_party/flac",
+ "//third_party/hunspell",
+ "//third_party/iccjpeg",
+ "//third_party/libphonenumber",
+ "//third_party/ots",
+ "//third_party/qcms",
+ "//third_party/smhasher:murmurhash3",
+ "//third_party/speex",
+ "//third_party/webrtc/system_wrappers",
+ "//ui/native_theme",
+ "//ui/snapshot",
+ "//ui/surface",
+ ],
+ 'dependencies!': [
+ "//chrome", # TODO(GYP)
+ "//chrome/test:browser_tests", # TODO(GYP)
+ "//chrome/test:interactive_ui_tests", # TODO(GYP)
+ "//chrome/test:sync_integration_tests", # TODO(GYP)
+ "//chrome/test:unit_tests", # TODO(GYP)
+ "//components:components_unittests", # TODO(GYP)
+ "//content/test:content_browsertests", # TODO(GYP)
+ "//content/test:content_perftests", # TODO(GYP)
+ "//content/test:content_unittests", # TODO(GYP)
+ "//extensions:extensions_browsertests", # TODO(GYP)
+ "//extensions:extensions_unittests", # TODO(GYP)
+ "//net:net_unittests", # TODO(GYP)
+ "//third_party/usrsctp", # TODO(GYP)
+ "//ui/app_list:app_list_unittests", # TODO(GYP)
+ "//ui/gfx:gfx_unittests", # TODO(GYP)
+ ],
+ }],
+ ['OS=="win"', {
+ 'dependencies': [
+ "//ui/metro_viewer",
+ '../third_party/codesighs/codesighs.gyp:msdump2symdb',
+ ],
+ 'dependencies!': [
+ "//crypto:crypto_unittests", # TODO(GYP)
+ "//net:net_unittests", # TODO(GYP)
+ ],
+ }],
+ ],
+ },
+ {
+ # This target contains a list of things that actually currently
+ # build in GN, but aren't listed in //:gn_all
+ 'target_name': 'add_to_gn_all',
+ 'type': 'none',
+ 'dependencies': [
+ '../breakpad/breakpad.gyp:microdump_stackwalk',
+ '../breakpad/breakpad.gyp:minidump_dump',
+ '../breakpad/breakpad.gyp:minidump_stackwalk',
+ '../cc/cc_tests.gyp:cc_perftests',
+ '../cc/blink/cc_blink_tests.gyp:cc_blink_unittests',
+ '../chrome/chrome.gyp:sync_performance_tests',
+ '../chrome/tools/profile_reset/jtl_compiler.gyp:jtl_compiler',
+ '../courgette/courgette.gyp:courgette_minimal_tool',
+ '../courgette/courgette.gyp:courgette_unittests',
+ '../extensions/shell/app_shell.gyp:app_shell',
+ '../gin/gin.gyp:gin_unittests',
+ '../google_apis/google_apis.gyp:google_apis_unittests',
+ '../gpu/gpu.gyp:angle_unittests',
+ '../gpu/gpu.gyp:gpu_perftests',
+ '../ipc/ipc.gyp:ipc_perftests',
+ '../media/media.gyp:ffmpeg_regression_tests', # TODO(GYP) this should be conditional on media_use_ffmpeg
+ '../media/media.gyp:media_perftests',
+ '../net/net.gyp:crash_cache',
+ '../net/net.gyp:crl_set_dump',
+ '../net/net.gyp:dns_fuzz_stub',
+ '../net/net.gyp:dump_cache',
+ '../net/net.gyp:gdig',
+ '../net/net.gyp:get_server_time',
+ '../net/net.gyp:net_watcher', # TODO(GYP): This should be conditional on use_v8_in_net
+ '../net/net.gyp:run_testserver',
+ '../net/net.gyp:stress_cache',
+ '../net/net.gyp:tld_cleanup',
+ '../ppapi/ppapi_internal.gyp:ppapi_tests', # TODO(GYP): Split out the examples and tests
+ '../third_party/codesighs/codesighs.gyp:maptsvdifftool',
+ '../third_party/mojo/mojo_edk_tests.gyp:mojo_public_system_perftests',
+ '../ui/compositor/compositor.gyp:compositor_unittests',
+ '../ui/keyboard/keyboard.gyp:keyboard_unittests',
+ '../ui/snapshot/snapshot.gyp:snapshot_unittests',
+ ],
+ 'conditions': [
+ ['use_aura==1', {
+ 'dependencies': [
+ '../ui/aura/aura.gyp:aura_bench',
+ ],
+ }],
+ ['use_ash==1', {
+ 'dependencies': [
+ '../ash/ash.gyp:ash_shell',
+ '../ash/ash.gyp:ash_shell_unittests',
+ '../ash/ash.gyp:ash_unittests',
+ ],
+ }],
+ ['OS=="android"', {
+ 'dependencies': [
+ '../breakpad/breakpad.gyp:dump_syms',
+ ],
+ }],
+ ['OS=="linux"', {
+ 'dependencies': [
+ '../breakpad/breakpad.gyp:breakpad_unittests',
+ '../breakpad/breakpad.gyp:dump_syms',
+ '../breakpad/breakpad.gyp:generate_test_dump',
+ '../breakpad/breakpad.gyp:minidump-2-core',
+ '../net/net.gyp:disk_cache_memory_test',
+ '../net/net.gyp:flip_in_mem_edsm_server',
+ '../net/net.gyp:flip_in_mem_edsm_server_unittests',
+ '../net/net.gyp:quic_client',
+ '../net/net.gyp:quic_server',
+ '../dbus/dbus.gyp:dbus_unittests',
+ ],
+ }],
+ ['OS!="win"', {
+ 'dependencies': [
+ '../third_party/codesighs/codesighs.gyp:nm2tsv',
+ ],
+ }],
+ ['OS=="mac"', {
+ 'dependencies': [
+ '../breakpad/breakpad.gyp:crash_inspector',
+ '../breakpad/breakpad.gyp:dump_syms',
+ '../breakpad/breakpad.gyp:symupload',
+ ],
+ }],
+ ['OS=="android" or OS=="linux"', {
+ 'dependencies': [
+ '../net/net.gyp:disk_cache_memory_test',
+ ],
+ }],
+ ],
+ },
+ {
+ 'target_name': 'gyp_remaining',
+ 'type': 'none',
+ 'dependencies': [
+ ':add_to_gn_all',
+ ],
+ 'conditions': [
+ ['OS=="linux"', {
+ 'dependencies': [
+ '../base/base.gyp:base_i18n_perftests',
+ '../base/base.gyp:base_perftests',
+ '../base/base.gyp:build_utf8_validator_tables#host',
+ '../base/base.gyp:check_example',
+ '../base/base.gyp:protect_file_posix',
+ '../breakpad/breakpad.gyp:core-2-minidump',
+ '../build/sanitizers/sanitizers.gyp:llvm-symbolizer',
+ '../chrome/chrome.gyp:chrome_app_unittests',
+ '../chrome/chrome.gyp:chromedriver',
+ '../chrome/chrome.gyp:chromedriver_tests',
+ '../chrome/chrome.gyp:chromedriver_unittests',
+ '../chrome/chrome.gyp:load_library_perf_tests',
+ '../chrome/chrome.gyp:performance_browser_tests',
+ '../chrome/chrome.gyp:service_discovery_sniffer',
+ '../cloud_print/cloud_print.gyp:cloud_print_unittests',
+ '../components/components.gyp:network_hints_browser',
+ '../components/components.gyp:policy_templates',
+ '../components/components.gyp:session_manager_component',
+ '../components/components_tests.gyp:components_browsertests',
+ '../components/components_tests.gyp:components_perftests',
+ '../content/content.gyp:content_app_browser',
+ '../content/content.gyp:content_app_child',
+ '../content/content_shell_and_tests.gyp:content_gl_benchmark',
+ '../content/content_shell_and_tests.gyp:content_gl_tests',
+ '../courgette/courgette.gyp:courgette',
+ '../courgette/courgette.gyp:courgette_fuzz',
+ '../dbus/dbus.gyp:dbus_test_server',
+ '../device/device_tests.gyp:device_unittests',
+ '../gin/gin.gyp:gin_v8_snapshot_fingerprint',
+ '../gin/gin.gyp:gin_shell',
+ '../google_apis/gcm/gcm.gyp:mcs_probe',
+ '../gpu/gpu.gyp:gl_tests',
+ '../gpu/tools/tools.gyp:compositor_model_bench',
+ '../gpu/gles2_conform_support/gles2_conform_support.gyp:gles2_conform_support',
+ '../gpu/gles2_conform_support/gles2_conform_test.gyp:gles2_conform_test',
+ '../gpu/khronos_glcts_support/khronos_glcts_test.gyp:khronos_glcts_test',
+ '../media/cast/cast.gyp:cast_benchmarks',
+ '../media/cast/cast.gyp:generate_barcode_video',
+ '../media/cast/cast.gyp:generate_timecode_audio',
+ '../media/cast/cast.gyp:tap_proxy',
+ '../media/media.gyp:player_x11',
+ '../mojo/mojo_base.gyp:mojo_application_chromium',
+ '../net/net.gyp:hpack_example_generator',
+ '../net/net.gyp:hpack_fuzz_mutator',
+ '../net/net.gyp:hpack_fuzz_wrapper',
+ '../net/net.gyp:net_perftests',
+ '../ppapi/ppapi_internal.gyp:ppapi_unittests',
+ '../ppapi/tools/ppapi_tools.gyp:pepper_hash_for_uma',
+ '../remoting/app_remoting_webapp.gyp:ar_sample_app',
+ '../remoting/remoting.gyp:remoting_host',
+ '../remoting/remoting.gyp:remoting_it2me_native_messaging_host',
+ '../remoting/remoting.gyp:remoting_me2me_host',
+ '../remoting/remoting.gyp:remoting_me2me_native_messaging_host',
+ '../remoting/remoting.gyp:remoting_native_messaging_manifests',
+ '../remoting/remoting.gyp:remoting_perftests',
+ '../remoting/remoting.gyp:remoting_start_host',
+ '../remoting/remoting.gyp:remoting_unittests',
+ '../sandbox/sandbox.gyp:sandbox_linux_jni_unittests',
+ '../skia/skia.gyp:filter_fuzz_stub',
+ '../skia/skia.gyp:image_operations_bench',
+ '../sync/sync.gyp:run_sync_testserver',
+ '../sync/sync.gyp:sync_endtoend_tests',
+ '../sync/tools/sync_tools.gyp:sync_client',
+ '../sync/tools/sync_tools.gyp:sync_listen_notifications',
+ '../testing/gmock.gyp:gmock_main',
+ '../third_party/leveldatabase/leveldatabase.gyp:env_chromium_unittests',
+ '../third_party/libphonenumber/libphonenumber.gyp:libphonenumber_unittests',
+ '../third_party/libaddressinput/libaddressinput.gyp:libaddressinput_unittests',
+ '../third_party/webrtc/tools/tools.gyp:frame_analyzer',
+ '../third_party/webrtc/tools/tools.gyp:rgba_to_i420_converter',
+ '../tools/gn/gn.gyp:generate_test_gn_data',
+ '../tools/perf/clear_system_cache/clear_system_cache.gyp:clear_system_cache',
+ #'../tools/telemetry/telemetry.gyp:bitmaptools', TODO(GYP) should this be #host ?
+ '../ui/app_list/app_list.gyp:app_list_demo',
+ '../ui/compositor/compositor.gyp:compositor_unittests',
+ '../ui/message_center/message_center.gyp:message_center_unittests',
+ '../ui/views/examples/examples.gyp:views_examples_with_content_exe',
+ '../v8/tools/gyp/v8.gyp:v8_snapshot',
+ '../v8/tools/gyp/v8.gyp:postmortem-metadata',
+
+ # TODO(GYP) - list all of the examples explicitly.
+ '../ppapi/ppapi_internal.gyp:*',
+ ],
+ 'conditions': [
+ ['disable_nacl==0 and disable_nacl_untrusted==0', {
+ 'dependencies': [
+ '../components/nacl.gyp:nacl_loader_unittests',
+ '../mojo/mojo_nacl.gyp:monacl_shell',
+ '../remoting/remoting.gyp:remoting_key_tester',
+ ]
+ }],
+ ['test_isolation_mode!="noop"', {
+ 'dependencies': [
+ '../ash/ash.gyp:ash_unittests_run',
+ '../base/base.gyp:base_unittests_run',
+ '../cc/cc_tests.gyp:cc_unittests_run',
+ '../chrome/chrome.gyp:browser_tests_run',
+ '../chrome/chrome.gyp:chrome_run',
+ '../chrome/chrome.gyp:interactive_ui_tests_run',
+ '../chrome/chrome.gyp:sync_integration_tests_run',
+ '../chrome/chrome.gyp:unit_tests_run',
+ '../components/components_tests.gyp:components_browsertests_run',
+ '../components/components_tests.gyp:components_unittests_run',
+ '../content/content_shell_and_tests.gyp:content_browsertests_run',
+ '../content/content_shell_and_tests.gyp:content_unittests_run',
+ '../crypto/crypto.gyp:crypto_unittests_run',
+ '../courgette/courgette.gyp:courgette_unittests_run',
+ '../gpu/gpu.gyp:gpu_unittests_run',
+ '../media/cast/cast.gyp:cast_unittests_run',
+ '../media/media.gyp:media_unittests_run',
+ '../net/net.gyp:net_unittests_run',
+ '../sandbox/sandbox.gyp:sandbox_linux_unittests_run',
+ '../sql/sql.gyp:sql_unittests_run',
+ '../third_party/cacheinvalidation/cacheinvalidation.gyp:cacheinvalidation_unittests_run',
+ '../ui/accessibility/accessibility.gyp:accessibility_unittests_run',
+ '../ui/app_list/app_list.gyp:app_list_unittests_run',
+ '../ui/events/events.gyp:events_unittests_run',
+ '../ui/message_center/message_center.gyp:message_center_unittests_run',
+ '../ui/touch_selection/ui_touch_selection.gyp:ui_touch_selection_unittests_run',
+ ],
+ }],
+ ],
+ }],
+ ['use_aura==1', {
+ 'dependencies': [
+ '../ui/aura/aura.gyp:aura_demo',
+ '../ui/aura/aura.gyp:aura_unittests',
+ ],
+ }],
+ ],
+ },
+ {
+ # This target, when built, should cause no actual work
+ # to be done, just update a bunch of stamp files.
+ 'target_name': 'gyp_groups',
+ 'type': 'none',
+ 'dependencies': [
+ 'All',
+ 'aura_builder',
+ 'blink_tests',
+ 'chromium_builder_asan',
+ 'chromium_builder_chromedriver',
+ 'chromium_builder_perf',
+ 'chromium_builder_tests',
+ 'chromium_builder_webrtc',
+ 'chromium_gpu_builder',
+ 'chromium_gpu_debug_builder',
+ ],
+ },
+ ]
+}
+
diff --git a/build/gyp_helper.py b/build/gyp_helper.py
index 645943a..a2cc7e1 100644
--- a/build/gyp_helper.py
+++ b/build/gyp_helper.py
@@ -42,8 +42,12 @@
file_val = file_data.get(var)
if file_val:
if var in os.environ:
- print 'INFO: Environment value for "%s" overrides value in %s.' % (
- var, os.path.abspath(file_path)
+ behavior = 'replaces'
+ if var == 'GYP_DEFINES':
+ os.environ[var] = file_val + ' ' + os.environ[var]
+ behavior = 'overrides'
+ print 'INFO: Environment value for "%s" %s value in %s' % (
+ var, behavior, os.path.abspath(file_path)
)
else:
os.environ[var] = file_val
diff --git a/build/linux/system.gyp b/build/linux/system.gyp
index 9079011..a71a5c5 100644
--- a/build/linux/system.gyp
+++ b/build/linux/system.gyp
@@ -63,6 +63,7 @@
'udev_device_get_sysname',
'udev_device_get_syspath',
'udev_device_new_from_devnum',
+ 'udev_device_new_from_subsystem_sysname',
'udev_device_new_from_syspath',
'udev_device_unref',
'udev_enumerate_add_match_subsystem',
diff --git a/build/sanitizers/tsan_suppressions.cc b/build/sanitizers/tsan_suppressions.cc
index 24c24d6..4659a3f 100644
--- a/build/sanitizers/tsan_suppressions.cc
+++ b/build/sanitizers/tsan_suppressions.cc
@@ -251,9 +251,6 @@
// http://crbug.com/364006
"race:gfx::ImageFamily::~ImageFamily\n"
-// http://crbug.com/364014
-"race:WTF::Latin1Encoding()::globalLatin1Encoding\n"
-
// https://code.google.com/p/v8/issues/detail?id=3143
"race:v8::internal::FLAG_track_double_fields\n"
@@ -328,9 +325,6 @@
// https://crbug.com/459429
"race:randomnessPid\n"
-// https://crbug.com/460243
-"race:IPC::ChannelMojoHost::OnClientLaunched\n"
-
// https://crbug.com/454655
"race:content::BrowserTestBase::PostTaskToInProcessRendererAndWait\n"
diff --git a/build/secondary/testing/gtest/BUILD.gn b/build/secondary/testing/gtest/BUILD.gn
index 96f4112..a20a09d 100644
--- a/build/secondary/testing/gtest/BUILD.gn
+++ b/build/secondary/testing/gtest/BUILD.gn
@@ -83,6 +83,9 @@
"include/gtest/internal/gtest-type-util.h",
#"gtest/src/gtest-all.cc", # Not needed by our build.
+ "../multiprocess_func_list.cc",
+ "../multiprocess_func_list.h",
+ "../platform_test.h",
"src/gtest-death-test.cc",
"src/gtest-filepath.cc",
"src/gtest-internal-inl.h",
@@ -91,9 +94,6 @@
"src/gtest-test-part.cc",
"src/gtest-typed-test.cc",
"src/gtest.cc",
- "../multiprocess_func_list.cc",
- "../multiprocess_func_list.h",
- "../platform_test.h",
]
if (is_mac) {
diff --git a/build/secondary/third_party/cacheinvalidation/BUILD.gn b/build/secondary/third_party/cacheinvalidation/BUILD.gn
index feb93d7..2e02633 100644
--- a/build/secondary/third_party/cacheinvalidation/BUILD.gn
+++ b/build/secondary/third_party/cacheinvalidation/BUILD.gn
@@ -18,10 +18,10 @@
"overrides/google/cacheinvalidation/deps/googletest.h",
"overrides/google/cacheinvalidation/deps/logging.h",
"overrides/google/cacheinvalidation/deps/mutex.h",
- "overrides/google/cacheinvalidation/deps/random.h",
"overrides/google/cacheinvalidation/deps/random.cc",
- "overrides/google/cacheinvalidation/deps/sha1-digest-function.h",
+ "overrides/google/cacheinvalidation/deps/random.h",
"overrides/google/cacheinvalidation/deps/scoped_ptr.h",
+ "overrides/google/cacheinvalidation/deps/sha1-digest-function.h",
"overrides/google/cacheinvalidation/deps/stl-namespace.h",
"overrides/google/cacheinvalidation/deps/string_util.h",
"overrides/google/cacheinvalidation/deps/time.h",
@@ -49,8 +49,8 @@
"src/google/cacheinvalidation/impl/persistence-utils.h",
"src/google/cacheinvalidation/impl/proto-converter.cc",
"src/google/cacheinvalidation/impl/proto-converter.h",
- "src/google/cacheinvalidation/impl/proto-helpers.h",
"src/google/cacheinvalidation/impl/proto-helpers.cc",
+ "src/google/cacheinvalidation/impl/proto-helpers.h",
"src/google/cacheinvalidation/impl/protocol-handler.cc",
"src/google/cacheinvalidation/impl/protocol-handler.h",
"src/google/cacheinvalidation/impl/recurring-task.cc",
@@ -70,8 +70,8 @@
"src/google/cacheinvalidation/impl/throttle.h",
"src/google/cacheinvalidation/impl/ticl-message-validator.cc",
"src/google/cacheinvalidation/impl/ticl-message-validator.h",
- "src/google/cacheinvalidation/include/invalidation-client.h",
"src/google/cacheinvalidation/include/invalidation-client-factory.h",
+ "src/google/cacheinvalidation/include/invalidation-client.h",
"src/google/cacheinvalidation/include/invalidation-listener.h",
"src/google/cacheinvalidation/include/system-resources.h",
"src/google/cacheinvalidation/include/types.h",
@@ -89,16 +89,16 @@
test("cacheinvalidation_unittests") {
sources = [
+ "src/google/cacheinvalidation/impl/invalidation-client-impl_test.cc",
+ "src/google/cacheinvalidation/impl/protocol-handler_test.cc",
+ "src/google/cacheinvalidation/impl/recurring-task_test.cc",
+ "src/google/cacheinvalidation/impl/throttle_test.cc",
"src/google/cacheinvalidation/test/deterministic-scheduler.cc",
"src/google/cacheinvalidation/test/deterministic-scheduler.h",
"src/google/cacheinvalidation/test/test-logger.cc",
"src/google/cacheinvalidation/test/test-logger.h",
"src/google/cacheinvalidation/test/test-utils.cc",
"src/google/cacheinvalidation/test/test-utils.h",
- "src/google/cacheinvalidation/impl/invalidation-client-impl_test.cc",
- "src/google/cacheinvalidation/impl/protocol-handler_test.cc",
- "src/google/cacheinvalidation/impl/recurring-task_test.cc",
- "src/google/cacheinvalidation/impl/throttle_test.cc",
]
deps = [
diff --git a/build/secondary/third_party/leveldatabase/BUILD.gn b/build/secondary/third_party/leveldatabase/BUILD.gn
index 19eef15..067af30 100644
--- a/build/secondary/third_party/leveldatabase/BUILD.gn
+++ b/build/secondary/third_party/leveldatabase/BUILD.gn
@@ -32,10 +32,10 @@
"src/db/db_impl.h",
"src/db/db_iter.cc",
"src/db/db_iter.h",
- "src/db/filename.cc",
- "src/db/filename.h",
"src/db/dbformat.cc",
"src/db/dbformat.h",
+ "src/db/filename.cc",
+ "src/db/filename.h",
"src/db/log_format.h",
"src/db/log_reader.cc",
"src/db/log_reader.h",
diff --git a/build/secondary/third_party/libsrtp/BUILD.gn b/build/secondary/third_party/libsrtp/BUILD.gn
index d9b658e..8b9647c 100644
--- a/build/secondary/third_party/libsrtp/BUILD.gn
+++ b/build/secondary/third_party/libsrtp/BUILD.gn
@@ -91,17 +91,17 @@
"srtp/include/ut_sim.h",
# headers
- "srtp/crypto/include/aes_cbc.h",
"srtp/crypto/include/aes.h",
+ "srtp/crypto/include/aes_cbc.h",
"srtp/crypto/include/aes_icm.h",
"srtp/crypto/include/alloc.h",
"srtp/crypto/include/auth.h",
"srtp/crypto/include/cipher.h",
- "srtp/crypto/include/cryptoalg.h",
"srtp/crypto/include/crypto.h",
"srtp/crypto/include/crypto_kernel.h",
"srtp/crypto/include/crypto_math.h",
"srtp/crypto/include/crypto_types.h",
+ "srtp/crypto/include/cryptoalg.h",
"srtp/crypto/include/datatypes.h",
"srtp/crypto/include/err.h",
"srtp/crypto/include/gf2_8.h",
@@ -120,8 +120,6 @@
"srtp/crypto/include/xfm.h",
# sources
- "srtp/srtp/ekt.c",
- "srtp/srtp/srtp.c",
"srtp/crypto/cipher/aes.c",
"srtp/crypto/cipher/aes_cbc.c",
"srtp/crypto/cipher/aes_icm.c",
@@ -144,6 +142,8 @@
"srtp/crypto/rng/ctr_prng.c",
"srtp/crypto/rng/prng.c",
"srtp/crypto/rng/rand_source.c",
+ "srtp/srtp/ekt.c",
+ "srtp/srtp/srtp.c",
]
if (is_clang) {
@@ -214,10 +214,10 @@
":libsrtp",
]
sources = [
+ "srtp/crypto/include/datatypes.h",
"srtp/include/getopt_s.h",
"srtp/include/rtp.h",
"srtp/include/srtp.h",
- "srtp/crypto/include/datatypes.h",
"srtp/test/getopt_s.c",
"srtp/test/rtp.c",
"srtp/test/rtpw.c",
diff --git a/build/secondary/third_party/nss/BUILD.gn b/build/secondary/third_party/nss/BUILD.gn
index ee5f112..25d449e 100644
--- a/build/secondary/third_party/nss/BUILD.gn
+++ b/build/secondary/third_party/nss/BUILD.gn
@@ -61,16 +61,16 @@
"nspr/lib/libc/src/strpbrk.c",
"nspr/lib/libc/src/strstr.c",
"nspr/lib/libc/src/strtok.c",
- "nspr/pr/include/md/prosdep.h",
"nspr/pr/include/md/_darwin.cfg",
"nspr/pr/include/md/_darwin.h",
"nspr/pr/include/md/_pcos.h",
"nspr/pr/include/md/_pth.h",
- "nspr/pr/include/md/_unixos.h",
"nspr/pr/include/md/_unix_errors.h",
+ "nspr/pr/include/md/_unixos.h",
"nspr/pr/include/md/_win32_errors.h",
"nspr/pr/include/md/_win95.cfg",
"nspr/pr/include/md/_win95.h",
+ "nspr/pr/include/md/prosdep.h",
"nspr/pr/include/nspr.h",
"nspr/pr/include/obsolete/pralarm.h",
"nspr/pr/include/obsolete/probslet.h",
@@ -621,6 +621,7 @@
"nss/lib/freebl/ec.h",
"nss/lib/freebl/ecdecode.c",
"nss/lib/freebl/ecl/ec2.h",
+ "nss/lib/freebl/ecl/ec_naf.c",
"nss/lib/freebl/ecl/ecl-curve.h",
"nss/lib/freebl/ecl/ecl-exp.h",
"nss/lib/freebl/ecl/ecl-priv.h",
@@ -638,17 +639,19 @@
"nss/lib/freebl/ecl/ecp_jac.c",
"nss/lib/freebl/ecl/ecp_jm.c",
"nss/lib/freebl/ecl/ecp_mont.c",
- "nss/lib/freebl/ecl/ec_naf.c",
"nss/lib/freebl/gcm.c",
"nss/lib/freebl/gcm.h",
- "nss/lib/freebl/intel-aes-x86-masm.asm",
- "nss/lib/freebl/intel-aes.h",
"nss/lib/freebl/hmacct.c",
"nss/lib/freebl/hmacct.h",
+ "nss/lib/freebl/intel-aes-x86-masm.asm",
+ "nss/lib/freebl/intel-aes.h",
"nss/lib/freebl/jpake.c",
"nss/lib/freebl/md2.c",
"nss/lib/freebl/md5.c",
"nss/lib/freebl/mpi/logtab.h",
+ "nss/lib/freebl/mpi/mp_gf2m-priv.h",
+ "nss/lib/freebl/mpi/mp_gf2m.c",
+ "nss/lib/freebl/mpi/mp_gf2m.h",
"nss/lib/freebl/mpi/mpcpucache.c",
"nss/lib/freebl/mpi/mpi-config.h",
"nss/lib/freebl/mpi/mpi-priv.h",
@@ -663,9 +666,6 @@
"nss/lib/freebl/mpi/mpmontg.c",
"nss/lib/freebl/mpi/mpprime.c",
"nss/lib/freebl/mpi/mpprime.h",
- "nss/lib/freebl/mpi/mp_gf2m-priv.h",
- "nss/lib/freebl/mpi/mp_gf2m.c",
- "nss/lib/freebl/mpi/mp_gf2m.h",
"nss/lib/freebl/mpi/primes.c",
"nss/lib/freebl/nss_build_config_mac.h",
"nss/lib/freebl/poly1305/poly1305-donna-x64-sse2-incremental-source.c",
diff --git a/build/secondary/third_party/sfntly/BUILD.gn b/build/secondary/third_party/sfntly/BUILD.gn
index a4dbd23..111f1cd 100644
--- a/build/secondary/third_party/sfntly/BUILD.gn
+++ b/build/secondary/third_party/sfntly/BUILD.gn
@@ -4,6 +4,10 @@
static_library("sfntly") {
sources = [
+ "cpp/src/sample/chromium/font_subsetter.cc",
+ "cpp/src/sample/chromium/font_subsetter.h",
+ "cpp/src/sample/chromium/subsetter_impl.cc",
+ "cpp/src/sample/chromium/subsetter_impl.h",
"cpp/src/sfntly/data/byte_array.cc",
"cpp/src/sfntly/data/byte_array.h",
"cpp/src/sfntly/data/font_data.cc",
@@ -113,10 +117,6 @@
"cpp/src/sfntly/table/truetype/loca_table.h",
"cpp/src/sfntly/tag.cc",
"cpp/src/sfntly/tag.h",
- "cpp/src/sample/chromium/font_subsetter.cc",
- "cpp/src/sample/chromium/font_subsetter.h",
- "cpp/src/sample/chromium/subsetter_impl.cc",
- "cpp/src/sample/chromium/subsetter_impl.h",
]
defines = [ "SFNTLY_NO_EXCEPTION" ]
diff --git a/build/toolchain/win/midl.gni b/build/toolchain/win/midl.gni
index 30bcbf7..748b0fc 100644
--- a/build/toolchain/win/midl.gni
+++ b/build/toolchain/win/midl.gni
@@ -16,6 +16,7 @@
# out_dir (optional)
# Directory to write the generated files to. Defaults to target_gen_dir.
#
+# deps (optional)
# visibility (optional)
template("midl") {
@@ -82,6 +83,10 @@
idl_target_platform,
"/Oicf",
]
+
+ if (defined(invoker.deps)) {
+ deps = invoker.deps
+ }
}
source_set(target_name) {
diff --git a/cc/BUILD.gn b/cc/BUILD.gn
index c29cda8..e217b12 100644
--- a/cc/BUILD.gn
+++ b/cc/BUILD.gn
@@ -718,158 +718,157 @@
}
}
-if (!is_win || link_chrome_on_windows) {
- test("cc_unittests") {
- sources = [
- "animation/animation_unittest.cc",
- "animation/keyframed_animation_curve_unittest.cc",
- "animation/layer_animation_controller_unittest.cc",
- "animation/scroll_offset_animation_curve_unittest.cc",
- "animation/scrollbar_animation_controller_linear_fade_unittest.cc",
- "animation/scrollbar_animation_controller_thinning_unittest.cc",
- "animation/transform_operations_unittest.cc",
- "base/float_quad_unittest.cc",
- "base/math_util_unittest.cc",
- "base/region_unittest.cc",
- "base/rolling_time_delta_history_unittest.cc",
- "base/scoped_ptr_vector_unittest.cc",
- "base/simple_enclosed_region_unittest.cc",
- "base/tiling_data_unittest.cc",
- "base/util_unittest.cc",
- "debug/frame_timing_tracker_unittest.cc",
- "debug/micro_benchmark_controller_unittest.cc",
- "input/top_controls_manager_unittest.cc",
- "layers/contents_scaling_layer_unittest.cc",
- "layers/delegated_frame_provider_unittest.cc",
- "layers/delegated_frame_resource_collection_unittest.cc",
- "layers/delegated_renderer_layer_impl_unittest.cc",
- "layers/delegated_renderer_layer_unittest.cc",
- "layers/heads_up_display_layer_impl_unittest.cc",
- "layers/heads_up_display_unittest.cc",
- "layers/io_surface_layer_impl_unittest.cc",
- "layers/layer_impl_unittest.cc",
- "layers/layer_iterator_unittest.cc",
- "layers/layer_position_constraint_unittest.cc",
- "layers/layer_unittest.cc",
- "layers/layer_utils_unittest.cc",
- "layers/nine_patch_layer_impl_unittest.cc",
- "layers/nine_patch_layer_unittest.cc",
- "layers/painted_scrollbar_layer_impl_unittest.cc",
- "layers/picture_image_layer_impl_unittest.cc",
- "layers/picture_image_layer_unittest.cc",
- "layers/picture_layer_impl_unittest.cc",
- "layers/picture_layer_unittest.cc",
- "layers/render_surface_impl_unittest.cc",
- "layers/render_surface_unittest.cc",
- "layers/scrollbar_layer_unittest.cc",
- "layers/solid_color_layer_impl_unittest.cc",
- "layers/solid_color_scrollbar_layer_impl_unittest.cc",
- "layers/surface_layer_impl_unittest.cc",
- "layers/surface_layer_unittest.cc",
- "layers/texture_layer_impl_unittest.cc",
- "layers/texture_layer_unittest.cc",
- "layers/tiled_layer_impl_unittest.cc",
- "layers/tiled_layer_unittest.cc",
- "layers/ui_resource_layer_impl_unittest.cc",
- "layers/ui_resource_layer_unittest.cc",
- "output/begin_frame_args_unittest.cc",
- "output/delegating_renderer_unittest.cc",
- "output/filter_operations_unittest.cc",
- "output/gl_renderer_unittest.cc",
- "output/output_surface_unittest.cc",
- "output/overlay_unittest.cc",
- "output/renderer_pixeltest.cc",
- "output/renderer_unittest.cc",
- "output/shader_unittest.cc",
- "output/software_renderer_unittest.cc",
- "quads/draw_quad_unittest.cc",
- "quads/list_container_unittest.cc",
- "quads/render_pass_unittest.cc",
- "resources/display_item_list_unittest.cc",
- "resources/layer_quad_unittest.cc",
- "resources/picture_layer_tiling_set_unittest.cc",
- "resources/picture_layer_tiling_unittest.cc",
- "resources/picture_pile_impl_unittest.cc",
- "resources/picture_pile_unittest.cc",
- "resources/picture_unittest.cc",
- "resources/platform_color_unittest.cc",
- "resources/prioritized_resource_unittest.cc",
- "resources/resource_provider_unittest.cc",
- "resources/resource_update_controller_unittest.cc",
- "resources/scoped_gpu_raster_unittest.cc",
- "resources/scoped_resource_unittest.cc",
- "resources/task_graph_runner_unittest.cc",
- "resources/texture_mailbox_deleter_unittest.cc",
- "resources/texture_uploader_unittest.cc",
- "resources/tile_manager_unittest.cc",
- "resources/tile_priority_unittest.cc",
- "resources/tile_task_worker_pool_unittest.cc",
- "scheduler/begin_frame_source_unittest.cc",
- "scheduler/delay_based_time_source_unittest.cc",
- "scheduler/scheduler_state_machine_unittest.cc",
- "scheduler/scheduler_unittest.cc",
- "test/layer_tree_json_parser_unittest.cc",
- "test/test_web_graphics_context_3d_unittest.cc",
- "trees/blocking_task_runner_unittest.cc",
- "trees/damage_tracker_unittest.cc",
- "trees/layer_sorter_unittest.cc",
- "trees/layer_tree_host_common_unittest.cc",
- "trees/layer_tree_host_impl_unittest.cc",
- "trees/layer_tree_host_pixeltest_blending.cc",
- "trees/layer_tree_host_pixeltest_filters.cc",
- "trees/layer_tree_host_pixeltest_masks.cc",
- "trees/layer_tree_host_pixeltest_readback.cc",
- "trees/layer_tree_host_pixeltest_synchronous.cc",
- "trees/layer_tree_host_unittest.cc",
- "trees/layer_tree_host_unittest_animation.cc",
- "trees/layer_tree_host_unittest_context.cc",
- "trees/layer_tree_host_unittest_copyrequest.cc",
- "trees/layer_tree_host_unittest_damage.cc",
- "trees/layer_tree_host_unittest_delegated.cc",
- "trees/layer_tree_host_unittest_no_message_loop.cc",
- "trees/layer_tree_host_unittest_occlusion.cc",
- "trees/layer_tree_host_unittest_picture.cc",
- "trees/layer_tree_host_unittest_proxy.cc",
- "trees/layer_tree_host_unittest_scroll.cc",
- "trees/layer_tree_impl_unittest.cc",
- "trees/occlusion_tracker_unittest.cc",
- "trees/occlusion_unittest.cc",
- "trees/property_tree_unittest.cc",
- "trees/tree_synchronizer_unittest.cc",
+test("cc_unittests") {
+ sources = [
+ "animation/animation_unittest.cc",
+ "animation/keyframed_animation_curve_unittest.cc",
+ "animation/layer_animation_controller_unittest.cc",
+ "animation/scroll_offset_animation_curve_unittest.cc",
+ "animation/scrollbar_animation_controller_linear_fade_unittest.cc",
+ "animation/scrollbar_animation_controller_thinning_unittest.cc",
+ "animation/transform_operations_unittest.cc",
+ "base/float_quad_unittest.cc",
+ "base/math_util_unittest.cc",
+ "base/region_unittest.cc",
+ "base/rolling_time_delta_history_unittest.cc",
+ "base/scoped_ptr_vector_unittest.cc",
+ "base/simple_enclosed_region_unittest.cc",
+ "base/tiling_data_unittest.cc",
+ "base/util_unittest.cc",
+ "debug/frame_timing_tracker_unittest.cc",
+ "debug/micro_benchmark_controller_unittest.cc",
+ "input/top_controls_manager_unittest.cc",
+ "layers/contents_scaling_layer_unittest.cc",
+ "layers/delegated_frame_provider_unittest.cc",
+ "layers/delegated_frame_resource_collection_unittest.cc",
+ "layers/delegated_renderer_layer_impl_unittest.cc",
+ "layers/delegated_renderer_layer_unittest.cc",
+ "layers/heads_up_display_layer_impl_unittest.cc",
+ "layers/heads_up_display_unittest.cc",
+ "layers/io_surface_layer_impl_unittest.cc",
+ "layers/layer_impl_unittest.cc",
+ "layers/layer_iterator_unittest.cc",
+ "layers/layer_position_constraint_unittest.cc",
+ "layers/layer_unittest.cc",
+ "layers/layer_utils_unittest.cc",
+ "layers/nine_patch_layer_impl_unittest.cc",
+ "layers/nine_patch_layer_unittest.cc",
+ "layers/painted_scrollbar_layer_impl_unittest.cc",
+ "layers/picture_image_layer_impl_unittest.cc",
+ "layers/picture_image_layer_unittest.cc",
+ "layers/picture_layer_impl_unittest.cc",
+ "layers/picture_layer_unittest.cc",
+ "layers/render_surface_impl_unittest.cc",
+ "layers/render_surface_unittest.cc",
+ "layers/scrollbar_layer_unittest.cc",
+ "layers/solid_color_layer_impl_unittest.cc",
+ "layers/solid_color_scrollbar_layer_impl_unittest.cc",
+ "layers/surface_layer_impl_unittest.cc",
+ "layers/surface_layer_unittest.cc",
+ "layers/texture_layer_impl_unittest.cc",
+ "layers/texture_layer_unittest.cc",
+ "layers/tiled_layer_impl_unittest.cc",
+ "layers/tiled_layer_unittest.cc",
+ "layers/ui_resource_layer_impl_unittest.cc",
+ "layers/ui_resource_layer_unittest.cc",
+ "output/begin_frame_args_unittest.cc",
+ "output/delegating_renderer_unittest.cc",
+ "output/filter_operations_unittest.cc",
+ "output/gl_renderer_unittest.cc",
+ "output/output_surface_unittest.cc",
+ "output/overlay_unittest.cc",
+ "output/renderer_pixeltest.cc",
+ "output/renderer_unittest.cc",
+ "output/shader_unittest.cc",
+ "output/software_renderer_unittest.cc",
+ "quads/draw_quad_unittest.cc",
+ "quads/list_container_unittest.cc",
+ "quads/render_pass_unittest.cc",
+ "resources/display_item_list_unittest.cc",
+ "resources/layer_quad_unittest.cc",
+ "resources/picture_layer_tiling_set_unittest.cc",
+ "resources/picture_layer_tiling_unittest.cc",
+ "resources/picture_pile_impl_unittest.cc",
+ "resources/picture_pile_unittest.cc",
+ "resources/picture_unittest.cc",
+ "resources/platform_color_unittest.cc",
+ "resources/prioritized_resource_unittest.cc",
+ "resources/resource_provider_unittest.cc",
+ "resources/resource_update_controller_unittest.cc",
+ "resources/scoped_gpu_raster_unittest.cc",
+ "resources/scoped_resource_unittest.cc",
+ "resources/task_graph_runner_unittest.cc",
+ "resources/texture_mailbox_deleter_unittest.cc",
+ "resources/texture_uploader_unittest.cc",
+ "resources/tile_manager_unittest.cc",
+ "resources/tile_priority_unittest.cc",
+ "resources/tile_task_worker_pool_unittest.cc",
+ "resources/video_resource_updater_unittest.cc",
+ "scheduler/begin_frame_source_unittest.cc",
+ "scheduler/delay_based_time_source_unittest.cc",
+ "scheduler/scheduler_state_machine_unittest.cc",
+ "scheduler/scheduler_unittest.cc",
+ "test/layer_tree_json_parser_unittest.cc",
+ "test/test_web_graphics_context_3d_unittest.cc",
+ "trees/blocking_task_runner_unittest.cc",
+ "trees/damage_tracker_unittest.cc",
+ "trees/layer_sorter_unittest.cc",
+ "trees/layer_tree_host_common_unittest.cc",
+ "trees/layer_tree_host_impl_unittest.cc",
+ "trees/layer_tree_host_pixeltest_blending.cc",
+ "trees/layer_tree_host_pixeltest_filters.cc",
+ "trees/layer_tree_host_pixeltest_masks.cc",
+ "trees/layer_tree_host_pixeltest_readback.cc",
+ "trees/layer_tree_host_pixeltest_synchronous.cc",
+ "trees/layer_tree_host_unittest.cc",
+ "trees/layer_tree_host_unittest_animation.cc",
+ "trees/layer_tree_host_unittest_context.cc",
+ "trees/layer_tree_host_unittest_copyrequest.cc",
+ "trees/layer_tree_host_unittest_damage.cc",
+ "trees/layer_tree_host_unittest_delegated.cc",
+ "trees/layer_tree_host_unittest_no_message_loop.cc",
+ "trees/layer_tree_host_unittest_occlusion.cc",
+ "trees/layer_tree_host_unittest_picture.cc",
+ "trees/layer_tree_host_unittest_proxy.cc",
+ "trees/layer_tree_host_unittest_scroll.cc",
+ "trees/layer_tree_impl_unittest.cc",
+ "trees/occlusion_tracker_unittest.cc",
+ "trees/occlusion_unittest.cc",
+ "trees/property_tree_unittest.cc",
+ "trees/tree_synchronizer_unittest.cc",
- # Surfaces test files.
- "surfaces/surface_aggregator_test_helpers.cc",
- "surfaces/surface_aggregator_test_helpers.h",
- "surfaces/surface_aggregator_unittest.cc",
- "surfaces/surface_unittest.cc",
- "surfaces/surfaces_pixeltest.cc",
+ # Surfaces test files.
+ "surfaces/surface_aggregator_test_helpers.cc",
+ "surfaces/surface_aggregator_test_helpers.h",
+ "surfaces/surface_aggregator_unittest.cc",
+ "surfaces/surface_unittest.cc",
+ "surfaces/surfaces_pixeltest.cc",
- # Setup.
- "test/cc_test_suite.cc",
- "test/run_all_unittests.cc",
- ]
+ # Setup.
+ "test/cc_test_suite.cc",
+ "test/run_all_unittests.cc",
+ ]
- configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
+ configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
- deps = [
- ":cc",
- ":test_support",
- "//base/test:test_support",
- "//cc/surfaces",
- "//cc/surfaces:surface_id",
- "//gpu",
- "//gpu:test_support",
- "//gpu/command_buffer/client:gles2_interface",
- "//gpu/command_buffer/common:gles2_utils",
- "//testing/gmock",
- "//testing/gtest",
- "//ui/events:events_base",
- "//ui/gfx",
- "//ui/gfx/geometry",
- "//ui/gfx:test_support",
- "//ui/gl",
- ]
- }
+ deps = [
+ ":cc",
+ ":test_support",
+ "//base/test:test_support",
+ "//cc/surfaces",
+ "//cc/surfaces:surface_id",
+ "//gpu",
+ "//gpu:test_support",
+ "//gpu/command_buffer/client:gles2_interface",
+ "//gpu/command_buffer/common:gles2_utils",
+ "//testing/gmock",
+ "//testing/gtest",
+ "//ui/events:events_base",
+ "//ui/gfx",
+ "//ui/gfx/geometry",
+ "//ui/gfx:test_support",
+ "//ui/gl",
+ ]
}
test("cc_perftests") {
diff --git a/cc/PRESUBMIT.py b/cc/PRESUBMIT.py
index dc826b1..fa15632 100644
--- a/cc/PRESUBMIT.py
+++ b/cc/PRESUBMIT.py
@@ -14,21 +14,11 @@
CC_SOURCE_FILES=(r'^cc[\\/].*\.(cc|h)$',)
def CheckChangeLintsClean(input_api, output_api):
- input_api.cpplint._cpplint_state.ResetErrorCounts() # reset global state
source_filter = lambda x: input_api.FilterSourceFile(
x, white_list=CC_SOURCE_FILES, black_list=None)
- files = [f.AbsoluteLocalPath() for f in
- input_api.AffectedSourceFiles(source_filter)]
- level = 1 # strict, but just warn
- for file_name in files:
- input_api.cpplint.ProcessFile(file_name, level)
-
- if not input_api.cpplint._cpplint_state.error_count:
- return []
-
- return [output_api.PresubmitPromptWarning(
- 'Changelist failed cpplint.py check.')]
+ return input_api.canned_checks.CheckChangeLintsClean(
+ input_api, output_api, source_filter, lint_filters=[], verbose_level=1)
def CheckAsserts(input_api, output_api, white_list=CC_SOURCE_FILES, black_list=None):
black_list = tuple(black_list or input_api.DEFAULT_BLACK_LIST)
diff --git a/cc/base/switches.cc b/cc/base/switches.cc
index 504e787..ae42482 100644
--- a/cc/base/switches.cc
+++ b/cc/base/switches.cc
@@ -24,9 +24,6 @@
const char kEnableMainFrameBeforeActivation[] =
"enable-main-frame-before-activation";
-const char kEnableTopControlsPositionCalculation[] =
- "enable-top-controls-position-calculation";
-
// Percentage of the top controls need to be hidden before they will auto hide.
const char kTopControlsHideThreshold[] = "top-controls-hide-threshold";
diff --git a/cc/base/switches.h b/cc/base/switches.h
index 90caef8..46fe922 100644
--- a/cc/base/switches.h
+++ b/cc/base/switches.h
@@ -20,7 +20,6 @@
CC_EXPORT extern const char kDisableCompositedAntialiasing[];
CC_EXPORT extern const char kDisableMainFrameBeforeActivation[];
CC_EXPORT extern const char kEnableMainFrameBeforeActivation[];
-CC_EXPORT extern const char kEnableTopControlsPositionCalculation[];
CC_EXPORT extern const char kJankInsteadOfCheckerboard[];
CC_EXPORT extern const char kTopControlsHideThreshold[];
CC_EXPORT extern const char kTopControlsShowThreshold[];
diff --git a/cc/blink/BUILD.gn b/cc/blink/BUILD.gn
index 9d4007b..1769efb 100644
--- a/cc/blink/BUILD.gn
+++ b/cc/blink/BUILD.gn
@@ -9,8 +9,8 @@
output_name = "cc_blink"
sources = [
- "context_provider_web_context.h",
"cc_blink_export.h",
+ "context_provider_web_context.h",
"scrollbar_impl.cc",
"scrollbar_impl.h",
"web_animation_curve_common.cc",
@@ -72,7 +72,7 @@
# GYP version: //cc/blink/cc_blink_tests.gyp:cc_blink_unittests
# TODO(GYP): make linking work on the mac.
-if (!is_mac && (!is_win || link_chrome_on_windows)) {
+if (!is_mac) {
test("cc_blink_unittests") {
sources = [
"web_animation_unittest.cc",
diff --git a/cc/cc_unittests.isolate b/cc/cc_unittests.isolate
index db47aab..eab3396 100644
--- a/cc/cc_unittests.isolate
+++ b/cc/cc_unittests.isolate
@@ -21,7 +21,6 @@
'--brave-new-test-launcher',
'--test-launcher-bot-mode',
'--asan=<(asan)',
- '--lsan=<(lsan)',
'--msan=<(msan)',
'--tsan=<(tsan)',
],
@@ -47,7 +46,6 @@
'--brave-new-test-launcher',
'--test-launcher-bot-mode',
'--asan=<(asan)',
- '--lsan=<(lsan)',
'--msan=<(msan)',
'--tsan=<(tsan)',
],
@@ -65,7 +63,6 @@
'--brave-new-test-launcher',
'--test-launcher-bot-mode',
'--asan=<(asan)',
- '--lsan=<(lsan)',
'--msan=<(msan)',
'--tsan=<(tsan)',
],
diff --git a/cc/debug/debug_rect_history.cc b/cc/debug/debug_rect_history.cc
index cde7765..c257c60 100644
--- a/cc/debug/debug_rect_history.cc
+++ b/cc/debug/debug_rect_history.cc
@@ -68,17 +68,21 @@
// not. Therefore we traverse recursively over all layers, not just the render
// surface list.
- if (!layer->update_rect().IsEmpty() && layer->DrawsContent()) {
+ Region invalidation_region = layer->GetInvalidationRegion();
+ if (!invalidation_region.IsEmpty() && layer->DrawsContent()) {
float width_scale = layer->content_bounds().width() /
static_cast<float>(layer->bounds().width());
float height_scale = layer->content_bounds().height() /
static_cast<float>(layer->bounds().height());
- gfx::Rect update_content_rect = gfx::ScaleToEnclosingRect(
- layer->update_rect(), width_scale, height_scale);
- debug_rects_.push_back(
- DebugRect(PAINT_RECT_TYPE,
- MathUtil::MapEnclosingClippedRect(
- layer->screen_space_transform(), update_content_rect)));
+
+ for (Region::Iterator it(invalidation_region); it.has_rect(); it.next()) {
+ gfx::Rect update_content_rect =
+ gfx::ScaleToEnclosingRect(it.rect(), width_scale, height_scale);
+ debug_rects_.push_back(
+ DebugRect(PAINT_RECT_TYPE,
+ MathUtil::MapEnclosingClippedRect(
+ layer->screen_space_transform(), update_content_rect)));
+ }
}
for (unsigned i = 0; i < layer->children().size(); ++i)
@@ -163,10 +167,9 @@
}
void DebugRectHistory::SaveTouchEventHandlerRects(LayerImpl* layer) {
- LayerTreeHostCommon::CallFunctionForSubtree<LayerImpl>(
- layer,
- base::Bind(&DebugRectHistory::SaveTouchEventHandlerRectsCallback,
- base::Unretained(this)));
+ LayerTreeHostCommon::CallFunctionForSubtree(layer, [this](LayerImpl* layer) {
+ SaveTouchEventHandlerRectsCallback(layer);
+ });
}
void DebugRectHistory::SaveTouchEventHandlerRectsCallback(LayerImpl* layer) {
@@ -183,10 +186,9 @@
}
void DebugRectHistory::SaveWheelEventHandlerRects(LayerImpl* layer) {
- LayerTreeHostCommon::CallFunctionForSubtree<LayerImpl>(
- layer,
- base::Bind(&DebugRectHistory::SaveWheelEventHandlerRectsCallback,
- base::Unretained(this)));
+ LayerTreeHostCommon::CallFunctionForSubtree(layer, [this](LayerImpl* layer) {
+ SaveWheelEventHandlerRectsCallback(layer);
+ });
}
void DebugRectHistory::SaveWheelEventHandlerRectsCallback(LayerImpl* layer) {
@@ -204,10 +206,9 @@
}
void DebugRectHistory::SaveScrollEventHandlerRects(LayerImpl* layer) {
- LayerTreeHostCommon::CallFunctionForSubtree<LayerImpl>(
- layer,
- base::Bind(&DebugRectHistory::SaveScrollEventHandlerRectsCallback,
- base::Unretained(this)));
+ LayerTreeHostCommon::CallFunctionForSubtree(layer, [this](LayerImpl* layer) {
+ SaveScrollEventHandlerRectsCallback(layer);
+ });
}
void DebugRectHistory::SaveScrollEventHandlerRectsCallback(LayerImpl* layer) {
@@ -225,10 +226,9 @@
}
void DebugRectHistory::SaveNonFastScrollableRects(LayerImpl* layer) {
- LayerTreeHostCommon::CallFunctionForSubtree<LayerImpl>(
- layer,
- base::Bind(&DebugRectHistory::SaveNonFastScrollableRectsCallback,
- base::Unretained(this)));
+ LayerTreeHostCommon::CallFunctionForSubtree(layer, [this](LayerImpl* layer) {
+ SaveNonFastScrollableRectsCallback(layer);
+ });
}
void DebugRectHistory::SaveNonFastScrollableRectsCallback(LayerImpl* layer) {
diff --git a/cc/debug/invalidation_benchmark.cc b/cc/debug/invalidation_benchmark.cc
index 1a6a2b8..bb98bcc 100644
--- a/cc/debug/invalidation_benchmark.cc
+++ b/cc/debug/invalidation_benchmark.cc
@@ -64,11 +64,7 @@
void InvalidationBenchmark::DidUpdateLayers(LayerTreeHost* host) {
LayerTreeHostCommon::CallFunctionForSubtree(
host->root_layer(),
- base::Bind(&InvalidationBenchmark::Run, base::Unretained(this)));
-}
-
-void InvalidationBenchmark::Run(Layer* layer) {
- layer->RunMicroBenchmark(this);
+ [this](Layer* layer) { layer->RunMicroBenchmark(this); });
}
void InvalidationBenchmark::RunOnLayer(PictureLayer* layer) {
diff --git a/cc/debug/invalidation_benchmark.h b/cc/debug/invalidation_benchmark.h
index f17fdbd..9423d5d 100644
--- a/cc/debug/invalidation_benchmark.h
+++ b/cc/debug/invalidation_benchmark.h
@@ -31,7 +31,6 @@
private:
enum Mode { FIXED_SIZE, LAYER, VIEWPORT, RANDOM };
- void Run(Layer* layer);
float LCGRandom();
Mode mode_;
diff --git a/cc/debug/picture_record_benchmark.cc b/cc/debug/picture_record_benchmark.cc
index b1b8188..3ef4708 100644
--- a/cc/debug/picture_record_benchmark.cc
+++ b/cc/debug/picture_record_benchmark.cc
@@ -57,7 +57,7 @@
void PictureRecordBenchmark::DidUpdateLayers(LayerTreeHost* host) {
LayerTreeHostCommon::CallFunctionForSubtree(
host->root_layer(),
- base::Bind(&PictureRecordBenchmark::Run, base::Unretained(this)));
+ [this](Layer* layer) { layer->RunMicroBenchmark(this); });
scoped_ptr<base::ListValue> results(new base::ListValue());
for (std::map<std::pair<int, int>, TotalTime>::iterator it = times_.begin();
@@ -83,10 +83,6 @@
NotifyDone(results.Pass());
}
-void PictureRecordBenchmark::Run(Layer* layer) {
- layer->RunMicroBenchmark(this);
-}
-
void PictureRecordBenchmark::RunOnLayer(PictureLayer* layer) {
ContentLayerClient* painter = layer->client();
gfx::Size content_bounds = layer->content_bounds();
diff --git a/cc/debug/picture_record_benchmark.h b/cc/debug/picture_record_benchmark.h
index d6330fe..3710d83 100644
--- a/cc/debug/picture_record_benchmark.h
+++ b/cc/debug/picture_record_benchmark.h
@@ -27,8 +27,6 @@
void RunOnLayer(PictureLayer* layer) override;
private:
- void Run(Layer* layer);
-
typedef std::pair<base::TimeDelta, unsigned> TotalTime;
std::map<std::pair<int, int>, TotalTime> times_;
std::vector<std::pair<int, int>> dimensions_;
diff --git a/cc/debug/rasterize_and_record_benchmark.cc b/cc/debug/rasterize_and_record_benchmark.cc
index e56a1e1..e46dcfe 100644
--- a/cc/debug/rasterize_and_record_benchmark.cc
+++ b/cc/debug/rasterize_and_record_benchmark.cc
@@ -65,7 +65,7 @@
host_ = host;
LayerTreeHostCommon::CallFunctionForSubtree(
host->root_layer(),
- base::Bind(&RasterizeAndRecordBenchmark::Run, base::Unretained(this)));
+ [this](Layer* layer) { layer->RunMicroBenchmark(this); });
DCHECK(!results_.get());
results_ = make_scoped_ptr(new base::DictionaryValue);
@@ -102,10 +102,6 @@
weak_ptr_factory_.GetWeakPtr())));
}
-void RasterizeAndRecordBenchmark::Run(Layer* layer) {
- layer->RunMicroBenchmark(this);
-}
-
void RasterizeAndRecordBenchmark::RunOnLayer(PictureLayer* layer) {
DCHECK(host_);
diff --git a/cc/debug/rasterize_and_record_benchmark.h b/cc/debug/rasterize_and_record_benchmark.h
index 30dcde0..bed446d 100644
--- a/cc/debug/rasterize_and_record_benchmark.h
+++ b/cc/debug/rasterize_and_record_benchmark.h
@@ -37,7 +37,6 @@
scoped_refptr<base::MessageLoopProxy> origin_loop) override;
private:
- void Run(Layer* layer);
void RunOnDisplayListLayer(PictureLayer* layer,
const gfx::Rect& visible_content_rect);
void RunOnPictureLayer(PictureLayer* layer,
diff --git a/cc/debug/rasterize_and_record_benchmark_impl.cc b/cc/debug/rasterize_and_record_benchmark_impl.cc
index 5a9577b..443db8c 100644
--- a/cc/debug/rasterize_and_record_benchmark_impl.cc
+++ b/cc/debug/rasterize_and_record_benchmark_impl.cc
@@ -132,9 +132,10 @@
void RasterizeAndRecordBenchmarkImpl::DidCompleteCommit(
LayerTreeHostImpl* host) {
LayerTreeHostCommon::CallFunctionForSubtree(
- host->RootLayer(),
- base::Bind(&RasterizeAndRecordBenchmarkImpl::Run,
- base::Unretained(this)));
+ host->RootLayer(), [this](LayerImpl* layer) {
+ rasterize_results_.total_layers++;
+ layer->RunMicroBenchmark(this);
+ });
scoped_ptr<base::DictionaryValue> result(new base::DictionaryValue());
result->SetDouble("rasterize_time_ms",
@@ -157,11 +158,6 @@
NotifyDone(result.Pass());
}
-void RasterizeAndRecordBenchmarkImpl::Run(LayerImpl* layer) {
- rasterize_results_.total_layers++;
- layer->RunMicroBenchmark(this);
-}
-
void RasterizeAndRecordBenchmarkImpl::RunOnLayer(PictureLayerImpl* layer) {
rasterize_results_.total_picture_layers++;
if (!layer->CanHaveTilings()) {
diff --git a/cc/debug/rasterize_and_record_benchmark_impl.h b/cc/debug/rasterize_and_record_benchmark_impl.h
index e9ca27d..ae134ab 100644
--- a/cc/debug/rasterize_and_record_benchmark_impl.h
+++ b/cc/debug/rasterize_and_record_benchmark_impl.h
@@ -31,8 +31,6 @@
void RunOnLayer(PictureLayerImpl* layer) override;
private:
- void Run(LayerImpl* layer);
-
struct RasterizeResults {
RasterizeResults();
~RasterizeResults();
diff --git a/cc/input/top_controls_manager.cc b/cc/input/top_controls_manager.cc
index 7362805..c8bd534 100644
--- a/cc/input/top_controls_manager.cc
+++ b/cc/input/top_controls_manager.cc
@@ -101,6 +101,9 @@
gfx::Vector2dF TopControlsManager::ScrollBy(
const gfx::Vector2dF& pending_delta) {
+ if (!TopControlsHeight())
+ return pending_delta;
+
if (pinch_gesture_active_)
return pending_delta;
@@ -180,6 +183,12 @@
if (top_controls_animation_ && animation_direction_ == direction)
return;
+ if (!TopControlsHeight()) {
+ client_->SetCurrentTopControlsShownRatio(
+ direction == HIDING_CONTROLS ? 0.f : 1.f);
+ return;
+ }
+
top_controls_animation_ = KeyframedFloatAnimationCurve::Create();
base::TimeDelta start_time = gfx::FrameTime::Now() - base::TimeTicks();
top_controls_animation_->AddKeyframe(
diff --git a/cc/input/top_controls_manager_unittest.cc b/cc/input/top_controls_manager_unittest.cc
index 16d0e5d..4befa15 100644
--- a/cc/input/top_controls_manager_unittest.cc
+++ b/cc/input/top_controls_manager_unittest.cc
@@ -409,8 +409,9 @@
TEST(TopControlsManagerTest, GrowingHeightKeepsTopControlsHidden) {
MockTopControlsManagerClient client(0.f, 0.5f, 0.5f);
TopControlsManager* manager = client.manager();
+ client.SetTopControlsHeight(1.f);
manager->UpdateTopControlsState(HIDDEN, HIDDEN, false);
- EXPECT_EQ(0.f, manager->ControlsTopOffset());
+ EXPECT_EQ(-1.f, manager->ControlsTopOffset());
EXPECT_EQ(0.f, manager->ContentTopOffset());
client.SetTopControlsHeight(50.f);
@@ -445,5 +446,50 @@
EXPECT_FLOAT_EQ(0.f, manager->ContentTopOffset());
}
+TEST(TopControlsManagerTest, ZeroTopControlsHeightScrolling) {
+ MockTopControlsManagerClient client(0.f, 0.5f, 0.5f);
+ client.SetCurrentTopControlsShownRatio(0.f);
+ TopControlsManager* manager = client.manager();
+ manager->UpdateTopControlsState(BOTH, BOTH, false);
+
+ manager->ScrollBegin();
+ EXPECT_FLOAT_EQ(-10.f, manager->ScrollBy(gfx::Vector2dF(0.f, -10.f)).y());
+ EXPECT_FLOAT_EQ(0.f, manager->TopControlsShownRatio());
+
+ client.SetTopControlsHeight(20.f);
+ EXPECT_FLOAT_EQ(0.f, manager->TopControlsShownRatio());
+
+ EXPECT_FLOAT_EQ(0.f, manager->ScrollBy(gfx::Vector2dF(0.f, -15.f)).y());
+ EXPECT_FLOAT_EQ(0.75f, manager->TopControlsShownRatio());
+ client.SetTopControlsHeight(0.f);
+ manager->ScrollEnd();
+
+ EXPECT_FALSE(manager->animation());
+ EXPECT_FLOAT_EQ(1.f, manager->TopControlsShownRatio());
+}
+
+TEST(TopControlsManagerTest, ZeroTopControlsHeightAnimating) {
+ MockTopControlsManagerClient client(0.f, 0.5f, 0.5f);
+ client.SetCurrentTopControlsShownRatio(0.f);
+ TopControlsManager* manager = client.manager();
+
+ manager->UpdateTopControlsState(BOTH, HIDDEN, false);
+ EXPECT_FLOAT_EQ(0.f, manager->TopControlsShownRatio());
+ manager->UpdateTopControlsState(BOTH, SHOWN, false);
+ EXPECT_FLOAT_EQ(1.f, manager->TopControlsShownRatio());
+
+ manager->UpdateTopControlsState(BOTH, HIDDEN, true);
+ EXPECT_FLOAT_EQ(0.f, manager->TopControlsShownRatio());
+ EXPECT_FALSE(manager->animation());
+ manager->UpdateTopControlsState(BOTH, SHOWN, true);
+ EXPECT_FLOAT_EQ(1.f, manager->TopControlsShownRatio());
+ EXPECT_FALSE(manager->animation());
+
+ client.SetCurrentTopControlsShownRatio(0.3f);
+ manager->MainThreadHasStoppedFlinging();
+ EXPECT_FALSE(manager->animation());
+ EXPECT_FLOAT_EQ(0.f, manager->TopControlsShownRatio());
+}
+
} // namespace
} // namespace cc
diff --git a/cc/layers/delegated_renderer_layer_impl.cc b/cc/layers/delegated_renderer_layer_impl.cc
index e1056be..08f692f 100644
--- a/cc/layers/delegated_renderer_layer_impl.cc
+++ b/cc/layers/delegated_renderer_layer_impl.cc
@@ -172,6 +172,10 @@
// Give back an empty array instead of nulls.
render_passes_in_draw_order->clear();
+
+ // The render passes given here become part of the RenderSurfaceLayerList, so
+ // changing them requires recomputing the RenderSurfaceLayerList.
+ layer_tree_impl()->set_needs_update_draw_properties();
}
void DelegatedRendererLayerImpl::ClearRenderPasses() {
diff --git a/cc/layers/delegated_renderer_layer_impl_unittest.cc b/cc/layers/delegated_renderer_layer_impl_unittest.cc
index ce6ab56..04e1b85 100644
--- a/cc/layers/delegated_renderer_layer_impl_unittest.cc
+++ b/cc/layers/delegated_renderer_layer_impl_unittest.cc
@@ -132,6 +132,169 @@
DelegatedRendererLayerImpl* delegated_renderer_layer_;
};
+TEST_F(DelegatedRendererLayerImplTest,
+ ChangeContributingRenderPassForNewFrame) {
+ FakeDelegatedRendererLayerImpl* fake_delegated_renderer_layer_impl;
+ {
+ scoped_ptr<LayerImpl> root_layer =
+ SolidColorLayerImpl::Create(host_impl_->active_tree(), 1);
+ scoped_ptr<FakeDelegatedRendererLayerImpl> delegated_renderer_layer =
+ FakeDelegatedRendererLayerImpl::Create(host_impl_->active_tree(), 2);
+
+ host_impl_->SetViewportSize(gfx::Size(100, 100));
+ root_layer->SetBounds(gfx::Size(100, 100));
+ root_layer->SetHasRenderSurface(true);
+
+ delegated_renderer_layer->SetPosition(gfx::Point(3, 3));
+ delegated_renderer_layer->SetBounds(gfx::Size(10, 10));
+ delegated_renderer_layer->SetContentBounds(gfx::Size(10, 10));
+ delegated_renderer_layer->SetDrawsContent(true);
+ delegated_renderer_layer->SetHasRenderSurface(true);
+ gfx::Transform transform;
+ transform.Translate(1.0, 1.0);
+ delegated_renderer_layer->SetTransform(transform);
+
+ RenderPassList delegated_render_passes;
+ TestRenderPass* pass1 =
+ AddRenderPass(&delegated_render_passes, RenderPassId(9, 6),
+ gfx::Rect(6, 6, 6, 6), gfx::Transform(1, 0, 0, 1, 5, 6));
+ AddQuad(pass1, gfx::Rect(0, 0, 6, 6), 33u);
+ TestRenderPass* pass2 =
+ AddRenderPass(&delegated_render_passes, RenderPassId(9, 7),
+ gfx::Rect(7, 7, 7, 7), gfx::Transform(1, 0, 0, 1, 7, 8));
+ AddQuad(pass2, gfx::Rect(0, 0, 7, 7), 22u);
+ AddRenderPassQuad(pass2, pass1);
+ TestRenderPass* pass3 =
+ AddRenderPass(&delegated_render_passes, RenderPassId(9, 8),
+ gfx::Rect(0, 0, 8, 8), gfx::Transform(1, 0, 0, 1, 9, 10));
+ AddRenderPassQuad(pass3, pass2);
+ delegated_renderer_layer->SetFrameDataForRenderPasses(
+ 1.f, delegated_render_passes);
+
+ fake_delegated_renderer_layer_impl = delegated_renderer_layer.get();
+
+ root_layer->AddChild(delegated_renderer_layer.Pass());
+
+ host_impl_->active_tree()->SetRootLayer(root_layer.Pass());
+
+ LayerTreeHostImpl::FrameData frame;
+ EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
+
+ // Root layer has one render pass, and delegated renderer layer has two
+ // contributing render passes and its own render pass.
+ ASSERT_EQ(4u, frame.render_passes.size());
+
+ host_impl_->DrawLayers(&frame, gfx::FrameTime::Now());
+ host_impl_->DidDrawAllLayers(frame);
+ }
+ {
+ // New frame makes delegated renderer layer loses its contributing render
+ // passes.
+ RenderPassList delegated_render_passes;
+ AddRenderPass(&delegated_render_passes, RenderPassId(9, 8),
+ gfx::Rect(0, 0, 8, 8), gfx::Transform(1, 0, 0, 1, 9, 10));
+ fake_delegated_renderer_layer_impl->SetFrameDataForRenderPasses(
+ 1.f, delegated_render_passes);
+
+ // Force damage to redraw a new frame.
+ host_impl_->SetViewportDamage(gfx::Rect(10, 10));
+
+ LayerTreeHostImpl::FrameData frame;
+ EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
+
+ // Each non-DelegatedRendererLayer added one RenderPass. The
+ // DelegatedRendererLayer added two contributing passes.
+ ASSERT_EQ(1u, frame.render_passes.size());
+
+ host_impl_->DrawLayers(&frame, gfx::FrameTime::Now());
+ host_impl_->DidDrawAllLayers(frame);
+ }
+}
+
+TEST_F(DelegatedRendererLayerImplTest,
+ ChangeContributingRenderPassNonFullTreeSync) {
+ FakeDelegatedRendererLayerImpl* fake_delegated_renderer_layer_impl;
+ {
+ host_impl_->CreatePendingTree();
+ scoped_ptr<LayerImpl> root_layer =
+ SolidColorLayerImpl::Create(host_impl_->pending_tree(), 1);
+ scoped_ptr<FakeDelegatedRendererLayerImpl> delegated_renderer_layer =
+ FakeDelegatedRendererLayerImpl::Create(host_impl_->pending_tree(), 2);
+
+ host_impl_->SetViewportSize(gfx::Size(100, 100));
+ root_layer->SetBounds(gfx::Size(100, 100));
+ root_layer->SetHasRenderSurface(true);
+
+ delegated_renderer_layer->SetPosition(gfx::Point(3, 3));
+ delegated_renderer_layer->SetBounds(gfx::Size(10, 10));
+ delegated_renderer_layer->SetContentBounds(gfx::Size(10, 10));
+ delegated_renderer_layer->SetDrawsContent(true);
+ delegated_renderer_layer->SetHasRenderSurface(true);
+ gfx::Transform transform;
+ transform.Translate(1.0, 1.0);
+ delegated_renderer_layer->SetTransform(transform);
+
+ RenderPassList delegated_render_passes;
+ TestRenderPass* pass1 =
+ AddRenderPass(&delegated_render_passes, RenderPassId(9, 6),
+ gfx::Rect(6, 6, 6, 6), gfx::Transform(1, 0, 0, 1, 5, 6));
+ AddQuad(pass1, gfx::Rect(0, 0, 6, 6), 33u);
+ TestRenderPass* pass2 =
+ AddRenderPass(&delegated_render_passes, RenderPassId(9, 7),
+ gfx::Rect(7, 7, 7, 7), gfx::Transform(1, 0, 0, 1, 7, 8));
+ AddQuad(pass2, gfx::Rect(0, 0, 7, 7), 22u);
+ AddRenderPassQuad(pass2, pass1);
+ TestRenderPass* pass3 =
+ AddRenderPass(&delegated_render_passes, RenderPassId(9, 8),
+ gfx::Rect(0, 0, 8, 8), gfx::Transform(1, 0, 0, 1, 9, 10));
+ AddRenderPassQuad(pass3, pass2);
+ delegated_renderer_layer->SetFrameDataForRenderPasses(
+ 1.f, delegated_render_passes);
+
+ fake_delegated_renderer_layer_impl = delegated_renderer_layer.get();
+
+ root_layer->AddChild(delegated_renderer_layer.Pass());
+
+ host_impl_->pending_tree()->SetRootLayer(root_layer.Pass());
+ host_impl_->ActivateSyncTree();
+
+ LayerTreeHostImpl::FrameData frame;
+ EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
+
+ // Root layer has one render pass, and delegated renderer layer has two
+ // contributing render passes and its own render pass.
+ ASSERT_EQ(4u, frame.render_passes.size());
+
+ host_impl_->DrawLayers(&frame, gfx::FrameTime::Now());
+ host_impl_->DidDrawAllLayers(frame);
+ }
+ {
+ // Remove contributing render passes from the delegated renderer layer.
+ host_impl_->CreatePendingTree();
+ host_impl_->pending_tree()->set_needs_full_tree_sync(false);
+ RenderPassList delegated_render_passes;
+ AddRenderPass(&delegated_render_passes, RenderPassId(9, 8),
+ gfx::Rect(0, 0, 8, 8), gfx::Transform(1, 0, 0, 1, 9, 10));
+
+ fake_delegated_renderer_layer_impl->SetFrameDataForRenderPasses(
+ 1.f, delegated_render_passes);
+
+ // Force damage to redraw a new frame.
+
+ host_impl_->ActivateSyncTree();
+ host_impl_->SetViewportDamage(gfx::Rect(100, 100));
+ LayerTreeHostImpl::FrameData frame;
+ EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
+
+ // Root layer has one render pass, and delegated renderer layer no longer
+ // has contributing render passes.
+ ASSERT_EQ(1u, frame.render_passes.size());
+
+ host_impl_->DrawLayers(&frame, gfx::FrameTime::Now());
+ host_impl_->DidDrawAllLayers(frame);
+ }
+}
+
TEST_F(DelegatedRendererLayerImplTestSimple, AddsContributingRenderPasses) {
LayerTreeHostImpl::FrameData frame;
EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
diff --git a/cc/layers/layer_impl.cc b/cc/layers/layer_impl.cc
index 0c6ddf5..0353a78 100644
--- a/cc/layers/layer_impl.cc
+++ b/cc/layers/layer_impl.cc
@@ -1590,4 +1590,8 @@
render_surface_.reset();
}
+Region LayerImpl::GetInvalidationRegion() {
+ return Region(update_rect_);
+}
+
} // namespace cc
diff --git a/cc/layers/layer_impl.h b/cc/layers/layer_impl.h
index 5de0d9a..0357252 100644
--- a/cc/layers/layer_impl.h
+++ b/cc/layers/layer_impl.h
@@ -596,6 +596,10 @@
SyncedScrollOffset* synced_scroll_offset() { return scroll_offset_.get(); }
+ // Get the correct invalidation region instead of conservative Rect
+ // for layers that provide it.
+ virtual Region GetInvalidationRegion();
+
protected:
LayerImpl(LayerTreeImpl* layer_impl,
int id,
diff --git a/cc/layers/picture_layer.cc b/cc/layers/picture_layer.cc
index e7918e2..1cfe1f1 100644
--- a/cc/layers/picture_layer.cc
+++ b/cc/layers/picture_layer.cc
@@ -89,6 +89,7 @@
host->settings().default_tile_grid_size));
}
}
+ recording_source_->DidMoveToNewCompositor();
recording_source_->SetSlowdownRasterScaleFactor(
host->debug_state().slow_down_raster_scale_factor);
}
diff --git a/cc/layers/picture_layer_impl.cc b/cc/layers/picture_layer_impl.cc
index e819afd..93d6581 100644
--- a/cc/layers/picture_layer_impl.cc
+++ b/cc/layers/picture_layer_impl.cc
@@ -331,8 +331,8 @@
CheckerboardDrawQuad* quad =
render_pass->CreateAndAppendDrawQuad<CheckerboardDrawQuad>();
SkColor color = DebugColors::DefaultCheckerboardColor();
- quad->SetNew(
- shared_quad_state, geometry_rect, visible_geometry_rect, color);
+ quad->SetNew(shared_quad_state, geometry_rect, visible_geometry_rect,
+ color, draw_properties().device_scale_factor);
} else {
SkColor color = SafeOpaqueBackgroundColor();
SolidColorDrawQuad* quad =
@@ -605,6 +605,15 @@
return raster_source_->GetFlattenedPicture();
}
+Region PictureLayerImpl::GetInvalidationRegion() {
+ // |invalidation_| gives the invalidation contained in the source frame, but
+ // is not cleared after drawing from the layer. However, update_rect() is
+ // cleared once the invalidation is drawn, which is useful for debugging
+ // visualizations. This method intersects the two to give a more exact
+ // representation of what was invalidated that is cleared after drawing.
+ return IntersectRegions(invalidation_, update_rect());
+}
+
scoped_refptr<Tile> PictureLayerImpl::CreateTile(
float contents_scale,
const gfx::Rect& content_rect) {
diff --git a/cc/layers/picture_layer_impl.h b/cc/layers/picture_layer_impl.h
index 9500e22..397cb62 100644
--- a/cc/layers/picture_layer_impl.h
+++ b/cc/layers/picture_layer_impl.h
@@ -61,6 +61,7 @@
void ReleaseResources() override;
void RecreateResources() override;
skia::RefPtr<SkPicture> GetPicture() override;
+ Region GetInvalidationRegion() override;
// PictureLayerTilingClient overrides.
scoped_refptr<Tile> CreateTile(float contents_scale,
diff --git a/cc/layers/picture_layer_unittest.cc b/cc/layers/picture_layer_unittest.cc
index afb6096..ab06bb0 100644
--- a/cc/layers/picture_layer_unittest.cc
+++ b/cc/layers/picture_layer_unittest.cc
@@ -8,6 +8,7 @@
#include "cc/layers/picture_layer_impl.h"
#include "cc/resources/resource_update_queue.h"
#include "cc/test/fake_layer_tree_host.h"
+#include "cc/test/fake_picture_layer.h"
#include "cc/test/fake_picture_layer_impl.h"
#include "cc/test/fake_proxy.h"
#include "cc/test/impl_side_painting_settings.h"
@@ -111,5 +112,58 @@
EXPECT_EQ(size.height(), 123);
}
+// PicturePile uses the source frame number as a unit for measuring invalidation
+// frequency. When a pile moves between compositors, the frame number increases
+// non-monotonically. This executes that code path under this scenario allowing
+// for the code to verify correctness with DCHECKs.
+TEST(PictureLayerTest, NonMonotonicSourceFrameNumber) {
+ LayerTreeSettings settings;
+ settings.single_thread_proxy_scheduler = false;
+
+ FakeLayerTreeHostClient host_client1(FakeLayerTreeHostClient::DIRECT_3D);
+ FakeLayerTreeHostClient host_client2(FakeLayerTreeHostClient::DIRECT_3D);
+ scoped_ptr<SharedBitmapManager> shared_bitmap_manager(
+ new TestSharedBitmapManager());
+
+ MockContentLayerClient client;
+ scoped_refptr<FakePictureLayer> layer = FakePictureLayer::Create(&client);
+
+ scoped_ptr<LayerTreeHost> host1 = LayerTreeHost::CreateSingleThreaded(
+ &host_client1, &host_client1, shared_bitmap_manager.get(), nullptr,
+ settings, base::MessageLoopProxy::current(), nullptr);
+ host_client1.SetLayerTreeHost(host1.get());
+
+ scoped_ptr<LayerTreeHost> host2 = LayerTreeHost::CreateSingleThreaded(
+ &host_client2, &host_client2, shared_bitmap_manager.get(), nullptr,
+ settings, base::MessageLoopProxy::current(), nullptr);
+ host_client2.SetLayerTreeHost(host2.get());
+
+ // The PictureLayer is put in one LayerTreeHost.
+ host1->SetRootLayer(layer);
+ // Do a main frame, record the picture layers.
+ EXPECT_EQ(0u, layer->update_count());
+ layer->SetNeedsDisplay();
+ host1->Composite(base::TimeTicks::Now());
+ EXPECT_EQ(1u, layer->update_count());
+ EXPECT_EQ(1, host1->source_frame_number());
+
+ // The source frame number in |host1| is now higher than host2.
+ layer->SetNeedsDisplay();
+ host1->Composite(base::TimeTicks::Now());
+ EXPECT_EQ(2u, layer->update_count());
+ EXPECT_EQ(2, host1->source_frame_number());
+
+ // Then moved to another LayerTreeHost.
+ host1->SetRootLayer(nullptr);
+ host2->SetRootLayer(layer);
+
+ // Do a main frame, record the picture layers. The frame number has changed
+ // non-monotonically.
+ layer->SetNeedsDisplay();
+ host2->Composite(base::TimeTicks::Now());
+ EXPECT_EQ(3u, layer->update_count());
+ EXPECT_EQ(1, host2->source_frame_number());
+}
+
} // namespace
} // namespace cc
diff --git a/cc/layers/tiled_layer_impl.cc b/cc/layers/tiled_layer_impl.cc
index 234bd44..b78a1d8 100644
--- a/cc/layers/tiled_layer_impl.cc
+++ b/cc/layers/tiled_layer_impl.cc
@@ -241,8 +241,8 @@
CheckerboardDrawQuad* checkerboard_quad =
render_pass->CreateAndAppendDrawQuad<CheckerboardDrawQuad>();
- checkerboard_quad->SetNew(
- shared_quad_state, tile_rect, visible_tile_rect, checker_color);
+ checkerboard_quad->SetNew(shared_quad_state, tile_rect,
+ visible_tile_rect, checker_color, 1.f);
append_quads_data->num_missing_tiles++;
continue;
}
diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc
index 5c560dc..578faa9 100644
--- a/cc/output/gl_renderer.cc
+++ b/cc/output/gl_renderer.cc
@@ -558,14 +558,16 @@
SkColorGetB(color) * (1.0f / 255.0f),
1));
- const int checkerboard_width = 16;
- float frequency = 1.0f / checkerboard_width;
+ const int kCheckerboardWidth = 16;
+ float frequency = 1.0f / kCheckerboardWidth;
gfx::Rect tile_rect = quad->rect;
- float tex_offset_x = tile_rect.x() % checkerboard_width;
- float tex_offset_y = tile_rect.y() % checkerboard_width;
- float tex_scale_x = tile_rect.width();
- float tex_scale_y = tile_rect.height();
+ float tex_offset_x =
+ static_cast<int>(tile_rect.x() / quad->scale) % kCheckerboardWidth;
+ float tex_offset_y =
+ static_cast<int>(tile_rect.y() / quad->scale) % kCheckerboardWidth;
+ float tex_scale_x = tile_rect.width() / quad->scale;
+ float tex_scale_y = tile_rect.height() / quad->scale;
GLC(gl_,
gl_->Uniform4f(program->fragment_shader().tex_transform_location(),
tex_offset_x,
@@ -937,7 +939,9 @@
DCHECK(!background_image);
use_shaders_for_blending = false;
} else if (background_image) {
- background_texture.reset();
+ // Reset original background texture if there is not any mask
+ if (!quad->mask_resource_id)
+ background_texture.reset();
} else if (CanApplyBlendModeUsingBlendFunc(blend_mode) &&
ShouldApplyBackgroundFilters(frame, quad)) {
// Something went wrong with applying background filters to the backdrop.
@@ -945,7 +949,11 @@
background_texture.reset();
}
}
-
+ // Need original background texture for mask?
+ bool mask_for_background =
+ background_texture && // Have original background texture
+ background_image && // Have filtered background texture
+ quad->mask_resource_id; // Have mask texture
SetBlendEnabled(
!use_shaders_for_blending &&
(quad->ShouldDrawWithBlending() || !IsDefaultBlendMode(blend_mode)));
@@ -1015,19 +1023,7 @@
highp_threshold_min_,
quad->shared_quad_state->visible_content_rect.bottom_right());
- int shader_quad_location = -1;
- int shader_edge_location = -1;
- int shader_viewport_location = -1;
- int shader_mask_sampler_location = -1;
- int shader_mask_tex_coord_scale_location = -1;
- int shader_mask_tex_coord_offset_location = -1;
- int shader_matrix_location = -1;
- int shader_alpha_location = -1;
- int shader_color_matrix_location = -1;
- int shader_color_offset_location = -1;
- int shader_tex_transform_location = -1;
- int shader_backdrop_location = -1;
- int shader_backdrop_rect_location = -1;
+ ShaderLocations locations;
DCHECK_EQ(background_texture || background_image, use_shaders_for_blending);
BlendMode shader_blend_mode = use_shaders_for_blending
@@ -1036,163 +1032,67 @@
if (use_aa && mask_texture_id && !use_color_matrix) {
const RenderPassMaskProgramAA* program = GetRenderPassMaskProgramAA(
- tex_coord_precision, mask_sampler, shader_blend_mode);
+ tex_coord_precision, mask_sampler,
+ shader_blend_mode, mask_for_background);
SetUseProgram(program->program());
- GLC(gl_, gl_->Uniform1i(program->fragment_shader().sampler_location(), 0));
-
- shader_quad_location = program->vertex_shader().quad_location();
- shader_edge_location = program->vertex_shader().edge_location();
- shader_viewport_location = program->vertex_shader().viewport_location();
- shader_mask_sampler_location =
- program->fragment_shader().mask_sampler_location();
- shader_mask_tex_coord_scale_location =
- program->fragment_shader().mask_tex_coord_scale_location();
- shader_mask_tex_coord_offset_location =
- program->fragment_shader().mask_tex_coord_offset_location();
- shader_matrix_location = program->vertex_shader().matrix_location();
- shader_alpha_location = program->fragment_shader().alpha_location();
- shader_tex_transform_location =
- program->vertex_shader().tex_transform_location();
- shader_backdrop_location = program->fragment_shader().backdrop_location();
- shader_backdrop_rect_location =
- program->fragment_shader().backdrop_rect_location();
+ program->vertex_shader().FillLocations(&locations);
+ program->fragment_shader().FillLocations(&locations);
+ GLC(gl_, gl_->Uniform1i(locations.sampler, 0));
} else if (!use_aa && mask_texture_id && !use_color_matrix) {
const RenderPassMaskProgram* program = GetRenderPassMaskProgram(
- tex_coord_precision, mask_sampler, shader_blend_mode);
+ tex_coord_precision, mask_sampler,
+ shader_blend_mode, mask_for_background);
SetUseProgram(program->program());
- GLC(gl_, gl_->Uniform1i(program->fragment_shader().sampler_location(), 0));
-
- shader_mask_sampler_location =
- program->fragment_shader().mask_sampler_location();
- shader_mask_tex_coord_scale_location =
- program->fragment_shader().mask_tex_coord_scale_location();
- shader_mask_tex_coord_offset_location =
- program->fragment_shader().mask_tex_coord_offset_location();
- shader_matrix_location = program->vertex_shader().matrix_location();
- shader_alpha_location = program->fragment_shader().alpha_location();
- shader_tex_transform_location =
- program->vertex_shader().tex_transform_location();
- shader_backdrop_location = program->fragment_shader().backdrop_location();
- shader_backdrop_rect_location =
- program->fragment_shader().backdrop_rect_location();
+ program->vertex_shader().FillLocations(&locations);
+ program->fragment_shader().FillLocations(&locations);
+ GLC(gl_, gl_->Uniform1i(locations.sampler, 0));
} else if (use_aa && !mask_texture_id && !use_color_matrix) {
const RenderPassProgramAA* program =
GetRenderPassProgramAA(tex_coord_precision, shader_blend_mode);
SetUseProgram(program->program());
- GLC(gl_, gl_->Uniform1i(program->fragment_shader().sampler_location(), 0));
-
- shader_quad_location = program->vertex_shader().quad_location();
- shader_edge_location = program->vertex_shader().edge_location();
- shader_viewport_location = program->vertex_shader().viewport_location();
- shader_matrix_location = program->vertex_shader().matrix_location();
- shader_alpha_location = program->fragment_shader().alpha_location();
- shader_tex_transform_location =
- program->vertex_shader().tex_transform_location();
- shader_backdrop_location = program->fragment_shader().backdrop_location();
- shader_backdrop_rect_location =
- program->fragment_shader().backdrop_rect_location();
+ program->vertex_shader().FillLocations(&locations);
+ program->fragment_shader().FillLocations(&locations);
+ GLC(gl_, gl_->Uniform1i(locations.sampler, 0));
} else if (use_aa && mask_texture_id && use_color_matrix) {
const RenderPassMaskColorMatrixProgramAA* program =
GetRenderPassMaskColorMatrixProgramAA(
- tex_coord_precision, mask_sampler, shader_blend_mode);
+ tex_coord_precision, mask_sampler,
+ shader_blend_mode, mask_for_background);
SetUseProgram(program->program());
- GLC(gl_, gl_->Uniform1i(program->fragment_shader().sampler_location(), 0));
-
- shader_matrix_location = program->vertex_shader().matrix_location();
- shader_quad_location = program->vertex_shader().quad_location();
- shader_tex_transform_location =
- program->vertex_shader().tex_transform_location();
- shader_edge_location = program->vertex_shader().edge_location();
- shader_viewport_location = program->vertex_shader().viewport_location();
- shader_alpha_location = program->fragment_shader().alpha_location();
- shader_mask_sampler_location =
- program->fragment_shader().mask_sampler_location();
- shader_mask_tex_coord_scale_location =
- program->fragment_shader().mask_tex_coord_scale_location();
- shader_mask_tex_coord_offset_location =
- program->fragment_shader().mask_tex_coord_offset_location();
- shader_color_matrix_location =
- program->fragment_shader().color_matrix_location();
- shader_color_offset_location =
- program->fragment_shader().color_offset_location();
- shader_backdrop_location = program->fragment_shader().backdrop_location();
- shader_backdrop_rect_location =
- program->fragment_shader().backdrop_rect_location();
+ program->vertex_shader().FillLocations(&locations);
+ program->fragment_shader().FillLocations(&locations);
+ GLC(gl_, gl_->Uniform1i(locations.sampler, 0));
} else if (use_aa && !mask_texture_id && use_color_matrix) {
const RenderPassColorMatrixProgramAA* program =
GetRenderPassColorMatrixProgramAA(tex_coord_precision,
shader_blend_mode);
SetUseProgram(program->program());
- GLC(gl_, gl_->Uniform1i(program->fragment_shader().sampler_location(), 0));
-
- shader_matrix_location = program->vertex_shader().matrix_location();
- shader_quad_location = program->vertex_shader().quad_location();
- shader_tex_transform_location =
- program->vertex_shader().tex_transform_location();
- shader_edge_location = program->vertex_shader().edge_location();
- shader_viewport_location = program->vertex_shader().viewport_location();
- shader_alpha_location = program->fragment_shader().alpha_location();
- shader_color_matrix_location =
- program->fragment_shader().color_matrix_location();
- shader_color_offset_location =
- program->fragment_shader().color_offset_location();
- shader_backdrop_location = program->fragment_shader().backdrop_location();
- shader_backdrop_rect_location =
- program->fragment_shader().backdrop_rect_location();
+ program->vertex_shader().FillLocations(&locations);
+ program->fragment_shader().FillLocations(&locations);
+ GLC(gl_, gl_->Uniform1i(locations.sampler, 0));
} else if (!use_aa && mask_texture_id && use_color_matrix) {
const RenderPassMaskColorMatrixProgram* program =
GetRenderPassMaskColorMatrixProgram(
- tex_coord_precision, mask_sampler, shader_blend_mode);
+ tex_coord_precision, mask_sampler,
+ shader_blend_mode, mask_for_background);
SetUseProgram(program->program());
- GLC(gl_, gl_->Uniform1i(program->fragment_shader().sampler_location(), 0));
-
- shader_matrix_location = program->vertex_shader().matrix_location();
- shader_tex_transform_location =
- program->vertex_shader().tex_transform_location();
- shader_mask_sampler_location =
- program->fragment_shader().mask_sampler_location();
- shader_mask_tex_coord_scale_location =
- program->fragment_shader().mask_tex_coord_scale_location();
- shader_mask_tex_coord_offset_location =
- program->fragment_shader().mask_tex_coord_offset_location();
- shader_alpha_location = program->fragment_shader().alpha_location();
- shader_color_matrix_location =
- program->fragment_shader().color_matrix_location();
- shader_color_offset_location =
- program->fragment_shader().color_offset_location();
- shader_backdrop_location = program->fragment_shader().backdrop_location();
- shader_backdrop_rect_location =
- program->fragment_shader().backdrop_rect_location();
+ program->vertex_shader().FillLocations(&locations);
+ program->fragment_shader().FillLocations(&locations);
+ GLC(gl_, gl_->Uniform1i(locations.sampler, 0));
} else if (!use_aa && !mask_texture_id && use_color_matrix) {
const RenderPassColorMatrixProgram* program =
GetRenderPassColorMatrixProgram(tex_coord_precision, shader_blend_mode);
SetUseProgram(program->program());
- GLC(gl_, gl_->Uniform1i(program->fragment_shader().sampler_location(), 0));
-
- shader_matrix_location = program->vertex_shader().matrix_location();
- shader_tex_transform_location =
- program->vertex_shader().tex_transform_location();
- shader_alpha_location = program->fragment_shader().alpha_location();
- shader_color_matrix_location =
- program->fragment_shader().color_matrix_location();
- shader_color_offset_location =
- program->fragment_shader().color_offset_location();
- shader_backdrop_location = program->fragment_shader().backdrop_location();
- shader_backdrop_rect_location =
- program->fragment_shader().backdrop_rect_location();
+ program->vertex_shader().FillLocations(&locations);
+ program->fragment_shader().FillLocations(&locations);
+ GLC(gl_, gl_->Uniform1i(locations.sampler, 0));
} else {
const RenderPassProgram* program =
GetRenderPassProgram(tex_coord_precision, shader_blend_mode);
SetUseProgram(program->program());
- GLC(gl_, gl_->Uniform1i(program->fragment_shader().sampler_location(), 0));
-
- shader_matrix_location = program->vertex_shader().matrix_location();
- shader_alpha_location = program->fragment_shader().alpha_location();
- shader_tex_transform_location =
- program->vertex_shader().tex_transform_location();
- shader_backdrop_location = program->fragment_shader().backdrop_location();
- shader_backdrop_rect_location =
- program->fragment_shader().backdrop_rect_location();
+ program->vertex_shader().FillLocations(&locations);
+ program->fragment_shader().FillLocations(&locations);
+ GLC(gl_, gl_->Uniform1i(locations.sampler, 0));
}
float tex_scale_x =
quad->rect.width() / static_cast<float>(contents_texture->size().width());
@@ -1201,22 +1101,22 @@
DCHECK_LE(tex_scale_x, 1.0f);
DCHECK_LE(tex_scale_y, 1.0f);
- DCHECK(shader_tex_transform_location != -1 || IsContextLost());
+ DCHECK(locations.tex_transform != -1 || IsContextLost());
// Flip the content vertically in the shader, as the RenderPass input
// texture is already oriented the same way as the framebuffer, but the
// projection transform does a flip.
GLC(gl_,
- gl_->Uniform4f(shader_tex_transform_location,
+ gl_->Uniform4f(locations.tex_transform,
0.0f,
tex_scale_y,
tex_scale_x,
-tex_scale_y));
GLint last_texture_unit = 0;
- if (shader_mask_sampler_location != -1) {
- DCHECK_NE(shader_mask_tex_coord_scale_location, 1);
- DCHECK_NE(shader_mask_tex_coord_offset_location, 1);
- GLC(gl_, gl_->Uniform1i(shader_mask_sampler_location, 1));
+ if (locations.mask_sampler != -1) {
+ DCHECK_NE(locations.mask_tex_coord_scale, 1);
+ DCHECK_NE(locations.mask_tex_coord_offset, 1);
+ GLC(gl_, gl_->Uniform1i(locations.mask_sampler, 1));
gfx::RectF mask_uv_rect = quad->MaskUVRect();
if (mask_sampler != SAMPLER_TYPE_2D) {
@@ -1228,56 +1128,56 @@
// and the RenderPass contents texture, so we flip the tex coords from the
// RenderPass texture to find the mask texture coords.
GLC(gl_,
- gl_->Uniform2f(shader_mask_tex_coord_offset_location,
+ gl_->Uniform2f(locations.mask_tex_coord_offset,
mask_uv_rect.x(),
mask_uv_rect.bottom()));
GLC(gl_,
- gl_->Uniform2f(shader_mask_tex_coord_scale_location,
+ gl_->Uniform2f(locations.mask_tex_coord_scale,
mask_uv_rect.width() / tex_scale_x,
-mask_uv_rect.height() / tex_scale_y));
last_texture_unit = 1;
}
- if (shader_edge_location != -1)
- GLC(gl_, gl_->Uniform3fv(shader_edge_location, 8, edge));
+ if (locations.edge != -1)
+ GLC(gl_, gl_->Uniform3fv(locations.edge, 8, edge));
- if (shader_viewport_location != -1) {
+ if (locations.viewport != -1) {
float viewport[4] = {static_cast<float>(viewport_.x()),
static_cast<float>(viewport_.y()),
static_cast<float>(viewport_.width()),
static_cast<float>(viewport_.height()), };
- GLC(gl_, gl_->Uniform4fv(shader_viewport_location, 1, viewport));
+ GLC(gl_, gl_->Uniform4fv(locations.viewport, 1, viewport));
}
- if (shader_color_matrix_location != -1) {
+ if (locations.color_matrix != -1) {
float matrix[16];
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j)
matrix[i * 4 + j] = SkScalarToFloat(color_matrix[j * 5 + i]);
}
GLC(gl_,
- gl_->UniformMatrix4fv(shader_color_matrix_location, 1, false, matrix));
+ gl_->UniformMatrix4fv(locations.color_matrix, 1, false, matrix));
}
static const float kScale = 1.0f / 255.0f;
- if (shader_color_offset_location != -1) {
+ if (locations.color_offset != -1) {
float offset[4];
for (int i = 0; i < 4; ++i)
offset[i] = SkScalarToFloat(color_matrix[i * 5 + 4]) * kScale;
- GLC(gl_, gl_->Uniform4fv(shader_color_offset_location, 1, offset));
+ GLC(gl_, gl_->Uniform4fv(locations.color_offset, 1, offset));
}
scoped_ptr<ResourceProvider::ScopedSamplerGL> shader_background_sampler_lock;
- if (shader_backdrop_location != -1) {
+ if (locations.backdrop != -1) {
DCHECK(background_texture || background_image);
- DCHECK_NE(shader_backdrop_location, 0);
- DCHECK_NE(shader_backdrop_rect_location, 0);
+ DCHECK_NE(locations.backdrop, 0);
+ DCHECK_NE(locations.backdrop_rect, 0);
- GLC(gl_, gl_->Uniform1i(shader_backdrop_location, ++last_texture_unit));
+ GLC(gl_, gl_->Uniform1i(locations.backdrop, ++last_texture_unit));
GLC(gl_,
- gl_->Uniform4f(shader_backdrop_rect_location,
+ gl_->Uniform4f(locations.backdrop_rect,
background_rect.x(),
background_rect.y(),
background_rect.width(),
@@ -1288,7 +1188,11 @@
GLC(gl_, gl_->ActiveTexture(GL_TEXTURE0 + last_texture_unit));
gl_->BindTexture(GL_TEXTURE_2D, texture->getTextureHandle());
GLC(gl_, gl_->ActiveTexture(GL_TEXTURE0));
- } else {
+ if (mask_for_background)
+ GLC(gl_, gl_->Uniform1i(locations.original_backdrop,
+ ++last_texture_unit));
+ }
+ if (background_texture) {
shader_background_sampler_lock = make_scoped_ptr(
new ResourceProvider::ScopedSamplerGL(resource_provider_,
background_texture->id(),
@@ -1299,10 +1203,10 @@
}
}
- SetShaderOpacity(quad->opacity(), shader_alpha_location);
- SetShaderQuadF(surface_quad, shader_quad_location);
+ SetShaderOpacity(quad->opacity(), locations.alpha);
+ SetShaderQuadF(surface_quad, locations.quad);
DrawQuadGeometry(
- frame, quad->quadTransform(), quad->rect, shader_matrix_location);
+ frame, quad->quadTransform(), quad->rect, locations.matrix);
// Flush the compositor context before the filter bitmap goes out of
// scope, so the draw gets processed before the filter texture gets deleted.
@@ -2804,7 +2708,8 @@
const GLRenderer::RenderPassMaskProgram* GLRenderer::GetRenderPassMaskProgram(
TexCoordPrecision precision,
SamplerType sampler,
- BlendMode blend_mode) {
+ BlendMode blend_mode,
+ bool mask_for_background) {
DCHECK_GE(precision, 0);
DCHECK_LE(precision, LAST_TEX_COORD_PRECISION);
DCHECK_GE(sampler, 0);
@@ -2812,11 +2717,13 @@
DCHECK_GE(blend_mode, 0);
DCHECK_LE(blend_mode, LAST_BLEND_MODE);
RenderPassMaskProgram* program =
- &render_pass_mask_program_[precision][sampler][blend_mode];
+ &render_pass_mask_program_[precision][sampler][blend_mode]
+ [mask_for_background ? HAS_MASK : NO_MASK];
if (!program->initialized()) {
TRACE_EVENT0("cc", "GLRenderer::renderPassMaskProgram::initialize");
program->Initialize(
- output_surface_->context_provider(), precision, sampler, blend_mode);
+ output_surface_->context_provider(), precision,
+ sampler, blend_mode, mask_for_background);
}
return program;
}
@@ -2824,7 +2731,8 @@
const GLRenderer::RenderPassMaskProgramAA*
GLRenderer::GetRenderPassMaskProgramAA(TexCoordPrecision precision,
SamplerType sampler,
- BlendMode blend_mode) {
+ BlendMode blend_mode,
+ bool mask_for_background) {
DCHECK_GE(precision, 0);
DCHECK_LE(precision, LAST_TEX_COORD_PRECISION);
DCHECK_GE(sampler, 0);
@@ -2832,11 +2740,13 @@
DCHECK_GE(blend_mode, 0);
DCHECK_LE(blend_mode, LAST_BLEND_MODE);
RenderPassMaskProgramAA* program =
- &render_pass_mask_program_aa_[precision][sampler][blend_mode];
+ &render_pass_mask_program_aa_[precision][sampler][blend_mode]
+ [mask_for_background ? HAS_MASK : NO_MASK];
if (!program->initialized()) {
TRACE_EVENT0("cc", "GLRenderer::renderPassMaskProgramAA::initialize");
program->Initialize(
- output_surface_->context_provider(), precision, sampler, blend_mode);
+ output_surface_->context_provider(), precision,
+ sampler, blend_mode, mask_for_background);
}
return program;
}
@@ -2877,9 +2787,11 @@
}
const GLRenderer::RenderPassMaskColorMatrixProgram*
-GLRenderer::GetRenderPassMaskColorMatrixProgram(TexCoordPrecision precision,
- SamplerType sampler,
- BlendMode blend_mode) {
+GLRenderer::GetRenderPassMaskColorMatrixProgram(
+ TexCoordPrecision precision,
+ SamplerType sampler,
+ BlendMode blend_mode,
+ bool mask_for_background) {
DCHECK_GE(precision, 0);
DCHECK_LE(precision, LAST_TEX_COORD_PRECISION);
DCHECK_GE(sampler, 0);
@@ -2887,20 +2799,24 @@
DCHECK_GE(blend_mode, 0);
DCHECK_LE(blend_mode, LAST_BLEND_MODE);
RenderPassMaskColorMatrixProgram* program =
- &render_pass_mask_color_matrix_program_[precision][sampler][blend_mode];
+ &render_pass_mask_color_matrix_program_[precision][sampler][blend_mode]
+ [mask_for_background ? HAS_MASK : NO_MASK];
if (!program->initialized()) {
TRACE_EVENT0("cc",
"GLRenderer::renderPassMaskColorMatrixProgram::initialize");
program->Initialize(
- output_surface_->context_provider(), precision, sampler, blend_mode);
+ output_surface_->context_provider(), precision,
+ sampler, blend_mode, mask_for_background);
}
return program;
}
const GLRenderer::RenderPassMaskColorMatrixProgramAA*
-GLRenderer::GetRenderPassMaskColorMatrixProgramAA(TexCoordPrecision precision,
- SamplerType sampler,
- BlendMode blend_mode) {
+GLRenderer::GetRenderPassMaskColorMatrixProgramAA(
+ TexCoordPrecision precision,
+ SamplerType sampler,
+ BlendMode blend_mode,
+ bool mask_for_background) {
DCHECK_GE(precision, 0);
DCHECK_LE(precision, LAST_TEX_COORD_PRECISION);
DCHECK_GE(sampler, 0);
@@ -2908,13 +2824,14 @@
DCHECK_GE(blend_mode, 0);
DCHECK_LE(blend_mode, LAST_BLEND_MODE);
RenderPassMaskColorMatrixProgramAA* program =
- &render_pass_mask_color_matrix_program_aa_[precision][sampler]
- [blend_mode];
+ &render_pass_mask_color_matrix_program_aa_[precision][sampler][blend_mode]
+ [mask_for_background ? HAS_MASK : NO_MASK];
if (!program->initialized()) {
TRACE_EVENT0("cc",
"GLRenderer::renderPassMaskColorMatrixProgramAA::initialize");
program->Initialize(
- output_surface_->context_provider(), precision, sampler, blend_mode);
+ output_surface_->context_provider(), precision,
+ sampler, blend_mode, mask_for_background);
}
return program;
}
@@ -3141,10 +3058,12 @@
tile_program_swizzle_aa_[i][j].Cleanup(gl_);
for (int k = 0; k <= LAST_BLEND_MODE; k++) {
- render_pass_mask_program_[i][j][k].Cleanup(gl_);
- render_pass_mask_program_aa_[i][j][k].Cleanup(gl_);
- render_pass_mask_color_matrix_program_aa_[i][j][k].Cleanup(gl_);
- render_pass_mask_color_matrix_program_[i][j][k].Cleanup(gl_);
+ for (int l = 0; l <= LAST_MASK_VALUE; ++l) {
+ render_pass_mask_program_[i][j][k][l].Cleanup(gl_);
+ render_pass_mask_program_aa_[i][j][k][l].Cleanup(gl_);
+ render_pass_mask_color_matrix_program_aa_[i][j][k][l].Cleanup(gl_);
+ render_pass_mask_color_matrix_program_[i][j][k][l].Cleanup(gl_);
+ }
}
}
for (int j = 0; j <= LAST_BLEND_MODE; j++) {
diff --git a/cc/output/gl_renderer.h b/cc/output/gl_renderer.h
index 25c7096..01668ab 100644
--- a/cc/output/gl_renderer.h
+++ b/cc/output/gl_renderer.h
@@ -334,11 +334,13 @@
const RenderPassMaskProgram* GetRenderPassMaskProgram(
TexCoordPrecision precision,
SamplerType sampler,
- BlendMode blend_mode);
+ BlendMode blend_mode,
+ bool mask_for_background);
const RenderPassMaskProgramAA* GetRenderPassMaskProgramAA(
TexCoordPrecision precision,
SamplerType sampler,
- BlendMode blend_mode);
+ BlendMode blend_mode,
+ bool mask_for_background);
const RenderPassColorMatrixProgram* GetRenderPassColorMatrixProgram(
TexCoordPrecision precision,
BlendMode blend_mode);
@@ -348,11 +350,13 @@
const RenderPassMaskColorMatrixProgram* GetRenderPassMaskColorMatrixProgram(
TexCoordPrecision precision,
SamplerType sampler,
- BlendMode blend_mode);
+ BlendMode blend_mode,
+ bool mask_for_background);
const RenderPassMaskColorMatrixProgramAA*
GetRenderPassMaskColorMatrixProgramAA(TexCoordPrecision precision,
SamplerType sampler,
- BlendMode blend_mode);
+ BlendMode blend_mode,
+ bool mask_for_background);
const TextureProgram* GetTextureProgram(
TexCoordPrecision precision);
@@ -407,12 +411,15 @@
RenderPassProgramAA render_pass_program_aa_[LAST_TEX_COORD_PRECISION +
1][LAST_BLEND_MODE + 1];
RenderPassMaskProgram
- render_pass_mask_program_[LAST_TEX_COORD_PRECISION +
- 1][LAST_SAMPLER_TYPE + 1][LAST_BLEND_MODE + 1];
+ render_pass_mask_program_[LAST_TEX_COORD_PRECISION + 1]
+ [LAST_SAMPLER_TYPE + 1]
+ [LAST_BLEND_MODE + 1]
+ [LAST_MASK_VALUE + 1];
RenderPassMaskProgramAA
- render_pass_mask_program_aa_[LAST_TEX_COORD_PRECISION +
- 1][LAST_SAMPLER_TYPE + 1][LAST_BLEND_MODE +
- 1];
+ render_pass_mask_program_aa_[LAST_TEX_COORD_PRECISION + 1]
+ [LAST_SAMPLER_TYPE + 1]
+ [LAST_BLEND_MODE + 1]
+ [LAST_MASK_VALUE + 1];
RenderPassColorMatrixProgram
render_pass_color_matrix_program_[LAST_TEX_COORD_PRECISION +
1][LAST_BLEND_MODE + 1];
@@ -420,13 +427,15 @@
render_pass_color_matrix_program_aa_[LAST_TEX_COORD_PRECISION +
1][LAST_BLEND_MODE + 1];
RenderPassMaskColorMatrixProgram
- render_pass_mask_color_matrix_program_[LAST_TEX_COORD_PRECISION +
- 1][LAST_SAMPLER_TYPE +
- 1][LAST_BLEND_MODE + 1];
+ render_pass_mask_color_matrix_program_[LAST_TEX_COORD_PRECISION + 1]
+ [LAST_SAMPLER_TYPE + 1]
+ [LAST_BLEND_MODE + 1]
+ [LAST_MASK_VALUE + 1];
RenderPassMaskColorMatrixProgramAA
- render_pass_mask_color_matrix_program_aa_[LAST_TEX_COORD_PRECISION +
- 1][LAST_SAMPLER_TYPE +
- 1][LAST_BLEND_MODE + 1];
+ render_pass_mask_color_matrix_program_aa_[LAST_TEX_COORD_PRECISION + 1]
+ [LAST_SAMPLER_TYPE + 1]
+ [LAST_BLEND_MODE + 1]
+ [LAST_MASK_VALUE + 1];
VideoYUVProgram video_yuv_program_[LAST_TEX_COORD_PRECISION + 1];
VideoYUVAProgram video_yuva_program_[LAST_TEX_COORD_PRECISION + 1];
diff --git a/cc/output/gl_renderer_unittest.cc b/cc/output/gl_renderer_unittest.cc
index fc70900..cec0882 100644
--- a/cc/output/gl_renderer_unittest.cc
+++ b/cc/output/gl_renderer_unittest.cc
@@ -149,14 +149,20 @@
renderer()->GetTileProgramSwizzleAA(precision, sampler));
for (int i = 0; i <= LAST_BLEND_MODE; ++i) {
BlendMode blend_mode = static_cast<BlendMode>(i);
- EXPECT_PROGRAM_VALID(
- renderer()->GetRenderPassMaskProgram(precision, sampler, blend_mode));
- EXPECT_PROGRAM_VALID(renderer()->GetRenderPassMaskProgramAA(
- precision, sampler, blend_mode));
- EXPECT_PROGRAM_VALID(renderer()->GetRenderPassMaskColorMatrixProgramAA(
- precision, sampler, blend_mode));
- EXPECT_PROGRAM_VALID(renderer()->GetRenderPassMaskColorMatrixProgram(
- precision, sampler, blend_mode));
+ for (int l = 0; l <= 1; ++l) {
+ bool mask_for_background = (l == 1);
+ EXPECT_PROGRAM_VALID(
+ renderer()->GetRenderPassMaskProgram(precision,
+ sampler,
+ blend_mode,
+ mask_for_background));
+ EXPECT_PROGRAM_VALID(renderer()->GetRenderPassMaskProgramAA(
+ precision, sampler, blend_mode, mask_for_background));
+ EXPECT_PROGRAM_VALID(renderer()->GetRenderPassMaskColorMatrixProgramAA(
+ precision, sampler, blend_mode, mask_for_background));
+ EXPECT_PROGRAM_VALID(renderer()->GetRenderPassMaskColorMatrixProgram(
+ precision, sampler, blend_mode, mask_for_background));
+ }
}
}
};
@@ -269,10 +275,15 @@
SamplerType sampler,
BlendMode blend_mode) {
EXPECT_PROGRAM_VALID(
- &renderer_->render_pass_mask_program_[precision][sampler][blend_mode]);
+ &renderer_->render_pass_mask_program_[precision]
+ [sampler]
+ [blend_mode]
+ [NO_MASK]);
EXPECT_EQ(
- renderer_->render_pass_mask_program_[precision][sampler][blend_mode]
- .program(),
+ renderer_->render_pass_mask_program_[precision]
+ [sampler]
+ [blend_mode]
+ [NO_MASK].program(),
renderer_->program_shadow_);
}
@@ -280,9 +291,9 @@
SamplerType sampler,
BlendMode blend_mode) {
EXPECT_PROGRAM_VALID(&renderer_->render_pass_mask_color_matrix_program_
- [precision][sampler][blend_mode]);
+ [precision][sampler][blend_mode][NO_MASK]);
EXPECT_EQ(renderer_->render_pass_mask_color_matrix_program_
- [precision][sampler][blend_mode].program(),
+ [precision][sampler][blend_mode][NO_MASK].program(),
renderer_->program_shadow_);
}
@@ -311,10 +322,11 @@
BlendMode blend_mode) {
EXPECT_PROGRAM_VALID(
&renderer_
- ->render_pass_mask_program_aa_[precision][sampler][blend_mode]);
+ ->render_pass_mask_program_aa_
+ [precision][sampler][blend_mode][NO_MASK]);
EXPECT_EQ(
renderer_->render_pass_mask_program_aa_[precision][sampler][blend_mode]
- .program(),
+ [NO_MASK].program(),
renderer_->program_shadow_);
}
@@ -322,9 +334,9 @@
SamplerType sampler,
BlendMode blend_mode) {
EXPECT_PROGRAM_VALID(&renderer_->render_pass_mask_color_matrix_program_aa_
- [precision][sampler][blend_mode]);
+ [precision][sampler][blend_mode][NO_MASK]);
EXPECT_EQ(renderer_->render_pass_mask_color_matrix_program_aa_
- [precision][sampler][blend_mode].program(),
+ [precision][sampler][blend_mode][NO_MASK].program(),
renderer_->program_shadow_);
}
diff --git a/cc/output/overlay_unittest.cc b/cc/output/overlay_unittest.cc
index 6ee388a..5590ec3 100644
--- a/cc/output/overlay_unittest.cc
+++ b/cc/output/overlay_unittest.cc
@@ -234,7 +234,7 @@
const gfx::Rect& rect) {
CheckerboardDrawQuad* checkerboard_quad =
render_pass->CreateAndAppendDrawQuad<CheckerboardDrawQuad>();
- checkerboard_quad->SetNew(shared_quad_state, rect, rect, SkColor());
+ checkerboard_quad->SetNew(shared_quad_state, rect, rect, SkColor(), 1.f);
}
void CreateFullscreenCheckeredQuad(ResourceProvider* resource_provider,
diff --git a/cc/output/program_binding.h b/cc/output/program_binding.h
index 9c3244c..1d5132b 100644
--- a/cc/output/program_binding.h
+++ b/cc/output/program_binding.h
@@ -58,8 +58,24 @@
void Initialize(ContextProvider* context_provider,
TexCoordPrecision precision,
+ SamplerType sampler) {
+ return Initialize(
+ context_provider, precision, sampler, BLEND_MODE_NONE, false);
+ }
+
+ void Initialize(ContextProvider* context_provider,
+ TexCoordPrecision precision,
SamplerType sampler,
- BlendMode blend_mode = BLEND_MODE_NONE) {
+ BlendMode blend_mode) {
+ return Initialize(
+ context_provider, precision, sampler, blend_mode, false);
+ }
+
+ void Initialize(ContextProvider* context_provider,
+ TexCoordPrecision precision,
+ SamplerType sampler,
+ BlendMode blend_mode,
+ bool mask_for_background) {
DCHECK(context_provider);
DCHECK(!initialized_);
@@ -67,6 +83,7 @@
return;
fragment_shader_.set_blend_mode(blend_mode);
+ fragment_shader_.set_mask_for_background(mask_for_background);
if (!ProgramBindingBase::Init(
context_provider->ContextGL(),
diff --git a/cc/output/renderer_pixeltest.cc b/cc/output/renderer_pixeltest.cc
index 9e9175e..81ad842 100644
--- a/cc/output/renderer_pixeltest.cc
+++ b/cc/output/renderer_pixeltest.cc
@@ -2045,6 +2045,109 @@
FuzzyPixelOffByOneComparator(true)));
}
+TYPED_TEST(RendererPixelTest, Checkerboards) {
+ gfx::Rect rect(this->device_viewport_size_);
+
+ RenderPassId id(1, 1);
+ scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
+
+ SharedQuadState* shared_state =
+ CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
+
+ // The color's alpha value is not used.
+ SkColor color1 = SK_ColorGREEN;
+ color1 = SkColorSetA(color1, 0);
+ SkColor color2 = SK_ColorBLUE;
+ color2 = SkColorSetA(color2, 0);
+
+ gfx::Rect content_rect(rect);
+
+ gfx::Rect top_left(content_rect);
+ gfx::Rect top_right(content_rect);
+ gfx::Rect bottom_left(content_rect);
+ gfx::Rect bottom_right(content_rect);
+ // The format is Inset(left, top, right, bottom).
+ top_left.Inset(0, 0, content_rect.width() / 2, content_rect.height() / 2);
+ top_right.Inset(content_rect.width() / 2, 0, 0, content_rect.height() / 2);
+ bottom_left.Inset(0, content_rect.height() / 2, content_rect.width() / 2, 0);
+ bottom_right.Inset(content_rect.width() / 2, content_rect.height() / 2, 0, 0);
+
+ // Appends checkerboard quads with a scale of 1.
+ CheckerboardDrawQuad* quad =
+ pass->CreateAndAppendDrawQuad<CheckerboardDrawQuad>();
+ quad->SetNew(shared_state, top_left, top_left, color1, 1.f);
+ quad = pass->CreateAndAppendDrawQuad<CheckerboardDrawQuad>();
+ quad->SetNew(shared_state, top_right, top_right, color2, 1.f);
+ quad = pass->CreateAndAppendDrawQuad<CheckerboardDrawQuad>();
+ quad->SetNew(shared_state, bottom_left, bottom_left, color2, 1.f);
+ quad = pass->CreateAndAppendDrawQuad<CheckerboardDrawQuad>();
+ quad->SetNew(shared_state, bottom_right, bottom_right, color1, 1.f);
+
+ RenderPassList pass_list;
+ pass_list.push_back(pass.Pass());
+
+ base::FilePath::StringType path =
+ IsSoftwareRenderer<TypeParam>()
+ ? FILE_PATH_LITERAL("four_blue_green_checkers.png")
+ : FILE_PATH_LITERAL("checkers.png");
+ EXPECT_TRUE(this->RunPixelTest(&pass_list, base::FilePath(path),
+ ExactPixelComparator(true)));
+}
+
+TYPED_TEST(RendererPixelTest, CheckerboardsScaled) {
+ gfx::Rect rect(this->device_viewport_size_);
+
+ RenderPassId id(1, 1);
+ scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
+
+ gfx::Transform scale;
+ scale.Scale(2.f, 2.f);
+
+ SharedQuadState* shared_state =
+ CreateTestSharedQuadState(scale, rect, pass.get());
+
+ // The color's alpha value is not used.
+ SkColor color1 = SK_ColorGREEN;
+ color1 = SkColorSetA(color1, 0);
+ SkColor color2 = SK_ColorBLUE;
+ color2 = SkColorSetA(color2, 0);
+
+ gfx::Rect content_rect(rect);
+ content_rect.Inset(0, 0, rect.width() / 2, rect.height() / 2);
+
+ gfx::Rect top_left(content_rect);
+ gfx::Rect top_right(content_rect);
+ gfx::Rect bottom_left(content_rect);
+ gfx::Rect bottom_right(content_rect);
+ // The format is Inset(left, top, right, bottom).
+ top_left.Inset(0, 0, content_rect.width() / 2, content_rect.height() / 2);
+ top_right.Inset(content_rect.width() / 2, 0, 0, content_rect.height() / 2);
+ bottom_left.Inset(0, content_rect.height() / 2, content_rect.width() / 2, 0);
+ bottom_right.Inset(content_rect.width() / 2, content_rect.height() / 2, 0, 0);
+
+ // Appends checkerboard quads with a scale of 2, and a shared quad state
+ // with a scale of 2. The checkers should be scaled by 2 * 2 = 4.
+ CheckerboardDrawQuad* quad =
+ pass->CreateAndAppendDrawQuad<CheckerboardDrawQuad>();
+ quad->SetNew(shared_state, top_left, top_left, color1, 2.f);
+ quad = pass->CreateAndAppendDrawQuad<CheckerboardDrawQuad>();
+ quad->SetNew(shared_state, top_right, top_right, color2, 2.f);
+ quad = pass->CreateAndAppendDrawQuad<CheckerboardDrawQuad>();
+ quad->SetNew(shared_state, bottom_left, bottom_left, color2, 2.f);
+ quad = pass->CreateAndAppendDrawQuad<CheckerboardDrawQuad>();
+ quad->SetNew(shared_state, bottom_right, bottom_right, color1, 2.f);
+
+ RenderPassList pass_list;
+ pass_list.push_back(pass.Pass());
+
+ base::FilePath::StringType path =
+ IsSoftwareRenderer<TypeParam>()
+ ? FILE_PATH_LITERAL("four_blue_green_checkers.png")
+ : FILE_PATH_LITERAL("checkers_big.png");
+ EXPECT_TRUE(this->RunPixelTest(&pass_list, base::FilePath(path),
+ ExactPixelComparator(true)));
+}
+
#endif // !defined(OS_ANDROID)
} // namespace
diff --git a/cc/output/shader.cc b/cc/output/shader.cc
index 1891546..883b683 100644
--- a/cc/output/shader.cc
+++ b/cc/output/shader.cc
@@ -144,6 +144,9 @@
} // namespace
+ShaderLocations::ShaderLocations() {
+}
+
TexCoordPrecision TexCoordPrecisionRequired(GLES2Interface* context,
int* highp_threshold_cache,
int highp_threshold_min,
@@ -347,6 +350,12 @@
});
}
+void VertexShaderPosTexTransform::FillLocations(
+ ShaderLocations* locations) const {
+ locations->matrix = matrix_location();
+ locations->tex_transform = tex_transform_location();
+}
+
std::string VertexShaderPosTexIdentity::GetShaderString() const {
return VERTEX_SHADER(GetShaderHead(), GetShaderBody());
}
@@ -560,6 +569,16 @@
});
}
+void VertexShaderQuadTexTransformAA::FillLocations(
+ ShaderLocations* locations) const {
+ locations->quad = quad_location();
+ locations->edge = edge_location();
+ locations->viewport = viewport_location();
+ locations->matrix = matrix_location();
+ locations->tex_transform = tex_transform_location();
+}
+
+
VertexShaderTile::VertexShaderTile()
: matrix_location_(-1),
quad_location_(-1),
@@ -722,19 +741,24 @@
});
}
-#define BLEND_MODE_UNIFORMS "s_backdropTexture", "backdropRect"
-#define UNUSED_BLEND_MODE_UNIFORMS (!has_blend_mode() ? 2 : 0)
+#define BLEND_MODE_UNIFORMS "s_backdropTexture", \
+ "s_originalBackdropTexture", \
+ "backdropRect"
+#define UNUSED_BLEND_MODE_UNIFORMS (!has_blend_mode() ? 3 : 0)
#define BLEND_MODE_SET_LOCATIONS(X, POS) \
if (has_blend_mode()) { \
- DCHECK_LT(static_cast<size_t>(POS) + 1, arraysize(X)); \
+ DCHECK_LT(static_cast<size_t>(POS) + 2, arraysize(X)); \
backdrop_location_ = locations[POS]; \
- backdrop_rect_location_ = locations[POS + 1]; \
+ original_backdrop_location_ = locations[POS + 1]; \
+ backdrop_rect_location_ = locations[POS + 2]; \
}
FragmentTexBlendMode::FragmentTexBlendMode()
: backdrop_location_(-1),
+ original_backdrop_location_(-1),
backdrop_rect_location_(-1),
- blend_mode_(BLEND_MODE_NONE) {
+ blend_mode_(BLEND_MODE_NONE),
+ mask_for_background_(false) {
}
std::string FragmentTexBlendMode::SetBlendModeFunctions(
@@ -743,28 +767,50 @@
return shader_string;
if (!has_blend_mode()) {
- return "#define ApplyBlendMode(X) (X)\n" + shader_string;
+ return "#define ApplyBlendMode(X, Y) (X)\n" + shader_string;
+ }
+
+ static const std::string kUniforms = SHADER0([]() {
+ uniform sampler2D s_backdropTexture;
+ uniform sampler2D s_originalBackdropTexture;
+ uniform TexCoordPrecision vec4 backdropRect;
+ });
+
+ std::string mixFunction;
+ if (mask_for_background()) {
+ mixFunction = SHADER0([]() {
+ vec4 MixBackdrop(TexCoordPrecision vec2 bgTexCoord, float mask) {
+ vec4 backdrop = texture2D(s_backdropTexture, bgTexCoord);
+ vec4 original_backdrop =
+ texture2D(s_originalBackdropTexture, bgTexCoord);
+ return mix(original_backdrop, backdrop, mask);
+ }
+ });
+ } else {
+ mixFunction = SHADER0([]() {
+ vec4 MixBackdrop(TexCoordPrecision vec2 bgTexCoord, float mask) {
+ return texture2D(s_backdropTexture, bgTexCoord);
+ }
+ });
}
static const std::string kFunctionApplyBlendMode = SHADER0([]() {
- uniform sampler2D s_backdropTexture;
- uniform TexCoordPrecision vec4 backdropRect;
-
- vec4 GetBackdropColor() {
+ vec4 GetBackdropColor(float mask) {
TexCoordPrecision vec2 bgTexCoord = gl_FragCoord.xy - backdropRect.xy;
bgTexCoord.x /= backdropRect.z;
bgTexCoord.y /= backdropRect.w;
- return texture2D(s_backdropTexture, bgTexCoord);
+ return MixBackdrop(bgTexCoord, mask);
}
- vec4 ApplyBlendMode(vec4 src) {
- vec4 dst = GetBackdropColor();
+ vec4 ApplyBlendMode(vec4 src, float mask) {
+ vec4 dst = GetBackdropColor(mask);
return Blend(src, dst);
}
});
return "precision mediump float;" + GetHelperFunctions() +
- GetBlendFunction() + kFunctionApplyBlendMode + shader_string;
+ GetBlendFunction() + kUniforms + mixFunction +
+ kFunctionApplyBlendMode + shader_string;
}
std::string FragmentTexBlendMode::GetHelperFunctions() const {
@@ -1100,11 +1146,19 @@
return SHADER0([]() {
void main() {
vec4 texColor = TextureLookup(s_texture, v_texCoord);
- gl_FragColor = ApplyBlendMode(texColor * alpha);
+ gl_FragColor = ApplyBlendMode(texColor * alpha, 0.0);
}
});
}
+void FragmentShaderRGBATexAlpha::FillLocations(
+ ShaderLocations* locations) const {
+ locations->sampler = sampler_location();
+ locations->alpha = alpha_location();
+ locations->backdrop = backdrop_location();
+ locations->backdrop_rect = backdrop_rect_location();
+}
+
std::string FragmentShaderRGBATexColorMatrixAlpha::GetShaderString(
TexCoordPrecision precision,
SamplerType sampler) const {
@@ -1131,11 +1185,21 @@
texColor = colorMatrix * texColor + colorOffset;
texColor.rgb *= texColor.a;
texColor = clamp(texColor, 0.0, 1.0);
- gl_FragColor = ApplyBlendMode(texColor * alpha);
+ gl_FragColor = ApplyBlendMode(texColor * alpha, 0.0);
}
});
}
+void FragmentShaderRGBATexColorMatrixAlpha::FillLocations(
+ ShaderLocations* locations) const {
+ locations->sampler = sampler_location();
+ locations->alpha = alpha_location();
+ locations->color_matrix = color_matrix_location();
+ locations->color_offset = color_offset_location();
+ locations->backdrop = backdrop_location();
+ locations->backdrop_rect = backdrop_rect_location();
+}
+
std::string FragmentShaderRGBATexVaryingAlpha::GetShaderString(
TexCoordPrecision precision,
SamplerType sampler) const {
@@ -1400,11 +1464,19 @@
vec4 d4 = min(edge_dist[0], edge_dist[1]);
vec2 d2 = min(d4.xz, d4.yw);
float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0);
- gl_FragColor = ApplyBlendMode(texColor * alpha * aa);
+ gl_FragColor = ApplyBlendMode(texColor * alpha * aa, 0.0);
}
});
}
+void FragmentShaderRGBATexAlphaAA::FillLocations(
+ ShaderLocations* locations) const {
+ locations->sampler = sampler_location();
+ locations->alpha = alpha_location();
+ locations->backdrop = backdrop_location();
+ locations->backdrop_rect = backdrop_rect_location();
+}
+
FragmentTexClampAlphaAABinding::FragmentTexClampAlphaAABinding()
: sampler_location_(-1),
alpha_location_(-1),
@@ -1555,11 +1627,25 @@
vec2(maskTexCoordOffset.x + v_texCoord.x * maskTexCoordScale.x,
maskTexCoordOffset.y + v_texCoord.y * maskTexCoordScale.y);
vec4 maskColor = TextureLookup(s_mask, maskTexCoord);
- gl_FragColor = ApplyBlendMode(texColor * alpha * maskColor.w);
+ gl_FragColor = ApplyBlendMode(
+ texColor * alpha * maskColor.w, maskColor.w);
}
});
}
+void FragmentShaderRGBATexAlphaMask::FillLocations(
+ ShaderLocations* locations) const {
+ locations->sampler = sampler_location();
+ locations->mask_sampler = mask_sampler_location();
+ locations->mask_tex_coord_scale = mask_tex_coord_scale_location();
+ locations->mask_tex_coord_offset = mask_tex_coord_offset_location();
+ locations->alpha = alpha_location();
+ locations->backdrop = backdrop_location();
+ locations->backdrop_rect = backdrop_rect_location();
+ if (mask_for_background())
+ locations->original_backdrop = original_backdrop_location();
+}
+
FragmentShaderRGBATexAlphaMaskAA::FragmentShaderRGBATexAlphaMaskAA()
: sampler_location_(-1),
mask_sampler_location_(-1),
@@ -1625,11 +1711,25 @@
vec4 d4 = min(edge_dist[0], edge_dist[1]);
vec2 d2 = min(d4.xz, d4.yw);
float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0);
- gl_FragColor = ApplyBlendMode(texColor * alpha * maskColor.w * aa);
+ gl_FragColor = ApplyBlendMode(
+ texColor * alpha * maskColor.w * aa, maskColor.w);
}
});
}
+void FragmentShaderRGBATexAlphaMaskAA::FillLocations(
+ ShaderLocations* locations) const {
+ locations->sampler = sampler_location();
+ locations->mask_sampler = mask_sampler_location();
+ locations->mask_tex_coord_scale = mask_tex_coord_scale_location();
+ locations->mask_tex_coord_offset = mask_tex_coord_offset_location();
+ locations->alpha = alpha_location();
+ locations->backdrop = backdrop_location();
+ locations->backdrop_rect = backdrop_rect_location();
+ if (mask_for_background())
+ locations->original_backdrop = original_backdrop_location();
+}
+
FragmentShaderRGBATexAlphaMaskColorMatrixAA::
FragmentShaderRGBATexAlphaMaskColorMatrixAA()
: sampler_location_(-1),
@@ -1709,11 +1809,27 @@
vec4 d4 = min(edge_dist[0], edge_dist[1]);
vec2 d2 = min(d4.xz, d4.yw);
float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0);
- gl_FragColor = ApplyBlendMode(texColor * alpha * maskColor.w * aa);
+ gl_FragColor = ApplyBlendMode(
+ texColor * alpha * maskColor.w * aa, maskColor.w);
}
});
}
+void FragmentShaderRGBATexAlphaMaskColorMatrixAA::FillLocations(
+ ShaderLocations* locations) const {
+ locations->sampler = sampler_location();
+ locations->alpha = alpha_location();
+ locations->mask_sampler = mask_sampler_location();
+ locations->mask_tex_coord_scale = mask_tex_coord_scale_location();
+ locations->mask_tex_coord_offset = mask_tex_coord_offset_location();
+ locations->color_matrix = color_matrix_location();
+ locations->color_offset = color_offset_location();
+ locations->backdrop = backdrop_location();
+ locations->backdrop_rect = backdrop_rect_location();
+ if (mask_for_background())
+ locations->original_backdrop = original_backdrop_location();
+}
+
FragmentShaderRGBATexAlphaColorMatrixAA::
FragmentShaderRGBATexAlphaColorMatrixAA()
: sampler_location_(-1),
@@ -1773,11 +1889,21 @@
vec4 d4 = min(edge_dist[0], edge_dist[1]);
vec2 d2 = min(d4.xz, d4.yw);
float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0);
- gl_FragColor = ApplyBlendMode(texColor * alpha * aa);
+ gl_FragColor = ApplyBlendMode(texColor * alpha * aa, 0.0);
}
});
}
+void FragmentShaderRGBATexAlphaColorMatrixAA::FillLocations(
+ ShaderLocations* locations) const {
+ locations->sampler = sampler_location();
+ locations->alpha = alpha_location();
+ locations->color_matrix = color_matrix_location();
+ locations->color_offset = color_offset_location();
+ locations->backdrop = backdrop_location();
+ locations->backdrop_rect = backdrop_rect_location();
+}
+
FragmentShaderRGBATexAlphaMaskColorMatrix::
FragmentShaderRGBATexAlphaMaskColorMatrix()
: sampler_location_(-1),
@@ -1850,11 +1976,27 @@
vec2(maskTexCoordOffset.x + v_texCoord.x * maskTexCoordScale.x,
maskTexCoordOffset.y + v_texCoord.y * maskTexCoordScale.y);
vec4 maskColor = TextureLookup(s_mask, maskTexCoord);
- gl_FragColor = ApplyBlendMode(texColor * alpha * maskColor.w);
+ gl_FragColor = ApplyBlendMode(
+ texColor * alpha * maskColor.w, maskColor.w);
}
});
}
+void FragmentShaderRGBATexAlphaMaskColorMatrix::FillLocations(
+ ShaderLocations* locations) const {
+ locations->sampler = sampler_location();
+ locations->mask_sampler = mask_sampler_location();
+ locations->mask_tex_coord_scale = mask_tex_coord_scale_location();
+ locations->mask_tex_coord_offset = mask_tex_coord_offset_location();
+ locations->alpha = alpha_location();
+ locations->color_matrix = color_matrix_location();
+ locations->color_offset = color_offset_location();
+ locations->backdrop = backdrop_location();
+ locations->backdrop_rect = backdrop_rect_location();
+ if (mask_for_background())
+ locations->original_backdrop = original_backdrop_location();
+}
+
FragmentShaderYUVVideo::FragmentShaderYUVVideo()
: y_texture_location_(-1),
u_texture_location_(-1),
diff --git a/cc/output/shader.h b/cc/output/shader.h
index 93407d4..561fe28 100644
--- a/cc/output/shader.h
+++ b/cc/output/shader.h
@@ -59,6 +59,32 @@
LAST_BLEND_MODE = BLEND_MODE_LUMINOSITY
};
+enum MaskMode {
+ NO_MASK = 0,
+ HAS_MASK = 1,
+ LAST_MASK_VALUE = HAS_MASK
+};
+
+struct ShaderLocations {
+ ShaderLocations();
+
+ int sampler = -1;
+ int quad = -1;
+ int edge = -1;
+ int viewport = -1;
+ int mask_sampler = -1;
+ int mask_tex_coord_scale = -1;
+ int mask_tex_coord_offset = -1;
+ int matrix = -1;
+ int alpha = -1;
+ int color_matrix = -1;
+ int color_offset = -1;
+ int tex_transform = -1;
+ int backdrop = -1;
+ int backdrop_rect = -1;
+ int original_backdrop = -1;
+};
+
// Note: The highp_threshold_cache must be provided by the caller to make
// the caching multi-thread/context safe in an easy low-overhead manner.
// The caller must make sure to clear highp_threshold_cache to 0, so it can be
@@ -156,6 +182,7 @@
std::string GetShaderString() const;
static std::string GetShaderHead();
static std::string GetShaderBody();
+ void FillLocations(ShaderLocations* locations) const;
int matrix_location() const { return matrix_location_; }
int tex_transform_location() const { return tex_transform_location_; }
@@ -228,6 +255,7 @@
std::string GetShaderString() const;
static std::string GetShaderHead();
static std::string GetShaderBody();
+ void FillLocations(ShaderLocations* locations) const;
int matrix_location() const { return matrix_location_; }
int viewport_location() const { return viewport_location_; }
@@ -325,11 +353,16 @@
class FragmentTexBlendMode {
public:
int backdrop_location() const { return backdrop_location_; }
+ int original_backdrop_location() const { return original_backdrop_location_; }
int backdrop_rect_location() const { return backdrop_rect_location_; }
BlendMode blend_mode() const { return blend_mode_; }
void set_blend_mode(BlendMode blend_mode) { blend_mode_ = blend_mode; }
bool has_blend_mode() const { return blend_mode_ != BLEND_MODE_NONE; }
+ void set_mask_for_background(bool mask_for_background) {
+ mask_for_background_ = mask_for_background;
+ }
+ bool mask_for_background() const { return mask_for_background_; }
protected:
FragmentTexBlendMode();
@@ -337,10 +370,12 @@
std::string SetBlendModeFunctions(std::string shader_string) const;
int backdrop_location_;
+ int original_backdrop_location_;
int backdrop_rect_location_;
private:
BlendMode blend_mode_;
+ bool mask_for_background_;
std::string GetHelperFunctions() const;
std::string GetBlendFunction() const;
@@ -460,6 +495,7 @@
TexCoordPrecision precision, SamplerType sampler) const;
static std::string GetShaderHead();
static std::string GetShaderBody();
+ void FillLocations(ShaderLocations* locations) const;
};
class FragmentShaderRGBATexColorMatrixAlpha
@@ -469,6 +505,7 @@
SamplerType sampler) const;
static std::string GetShaderHead();
static std::string GetShaderBody();
+ void FillLocations(ShaderLocations* locations) const;
};
class FragmentShaderRGBATexOpaque : public FragmentTexOpaqueBinding {
@@ -516,6 +553,7 @@
TexCoordPrecision precision, SamplerType sampler) const;
static std::string GetShaderHead();
static std::string GetShaderBody();
+ void FillLocations(ShaderLocations* locations) const;
int alpha_location() const { return alpha_location_; }
int sampler_location() const { return sampler_location_; }
@@ -574,7 +612,7 @@
TexCoordPrecision precision, SamplerType sampler) const;
static std::string GetShaderHead();
static std::string GetShaderBody();
-
+ void FillLocations(ShaderLocations* locations) const;
void Init(gpu::gles2::GLES2Interface* context,
unsigned program,
int* base_uniform_index);
@@ -605,7 +643,7 @@
TexCoordPrecision precision, SamplerType sampler) const;
static std::string GetShaderHead();
static std::string GetShaderBody();
-
+ void FillLocations(ShaderLocations* locations) const;
void Init(gpu::gles2::GLES2Interface* context,
unsigned program,
int* base_uniform_index);
@@ -637,7 +675,7 @@
TexCoordPrecision precision, SamplerType sampler) const;
static std::string GetShaderHead();
static std::string GetShaderBody();
-
+ void FillLocations(ShaderLocations* locations) const;
void Init(gpu::gles2::GLES2Interface* context,
unsigned program,
int* base_uniform_index);
@@ -670,7 +708,7 @@
TexCoordPrecision precision, SamplerType sampler) const;
static std::string GetShaderHead();
static std::string GetShaderBody();
-
+ void FillLocations(ShaderLocations* locations) const;
void Init(gpu::gles2::GLES2Interface* context,
unsigned program,
int* base_uniform_index);
@@ -693,7 +731,7 @@
TexCoordPrecision precision, SamplerType sampler) const;
static std::string GetShaderHead();
static std::string GetShaderBody();
-
+ void FillLocations(ShaderLocations* locations) const;
void Init(gpu::gles2::GLES2Interface* context,
unsigned program,
int* base_uniform_index);
diff --git a/cc/output/software_renderer.cc b/cc/output/software_renderer.cc
index 5360d59..a4b5428 100644
--- a/cc/output/software_renderer.cc
+++ b/cc/output/software_renderer.cc
@@ -314,7 +314,7 @@
gfx::RectF visible_quad_vertex_rect = MathUtil::ScaleRectProportional(
QuadVertexRect(), quad->rect, quad->visible_rect);
current_paint_.setColor(quad->color);
- current_paint_.setAlpha(quad->opacity() * SkColorGetA(quad->color));
+ current_paint_.setAlpha(quad->opacity());
current_canvas_->drawRect(gfx::RectFToSkRect(visible_quad_vertex_rect),
current_paint_);
}
diff --git a/cc/quads/checkerboard_draw_quad.cc b/cc/quads/checkerboard_draw_quad.cc
index 2d8957d..db6ad1e 100644
--- a/cc/quads/checkerboard_draw_quad.cc
+++ b/cc/quads/checkerboard_draw_quad.cc
@@ -10,17 +10,20 @@
namespace cc {
-CheckerboardDrawQuad::CheckerboardDrawQuad() : color(0) {}
+CheckerboardDrawQuad::CheckerboardDrawQuad() : color(0), scale(0.f) {
+}
void CheckerboardDrawQuad::SetNew(const SharedQuadState* shared_quad_state,
const gfx::Rect& rect,
const gfx::Rect& visible_rect,
- SkColor color) {
+ SkColor color,
+ float scale) {
gfx::Rect opaque_rect = SkColorGetA(color) == 255 ? rect : gfx::Rect();
bool needs_blending = false;
DrawQuad::SetAll(shared_quad_state, DrawQuad::CHECKERBOARD, rect, opaque_rect,
visible_rect, needs_blending);
this->color = color;
+ this->scale = scale;
}
void CheckerboardDrawQuad::SetAll(const SharedQuadState* shared_quad_state,
@@ -28,10 +31,12 @@
const gfx::Rect& opaque_rect,
const gfx::Rect& visible_rect,
bool needs_blending,
- SkColor color) {
+ SkColor color,
+ float scale) {
DrawQuad::SetAll(shared_quad_state, DrawQuad::CHECKERBOARD, rect, opaque_rect,
visible_rect, needs_blending);
this->color = color;
+ this->scale = scale;
}
void CheckerboardDrawQuad::IterateResources(
@@ -46,6 +51,7 @@
void CheckerboardDrawQuad::ExtendValue(
base::trace_event::TracedValue* value) const {
value->SetInteger("color", color);
+ value->SetDouble("scale", scale);
}
} // namespace cc
diff --git a/cc/quads/checkerboard_draw_quad.h b/cc/quads/checkerboard_draw_quad.h
index 1ab6338..9ecf4f0 100644
--- a/cc/quads/checkerboard_draw_quad.h
+++ b/cc/quads/checkerboard_draw_quad.h
@@ -19,16 +19,19 @@
void SetNew(const SharedQuadState* shared_quad_state,
const gfx::Rect& rect,
const gfx::Rect& visible_rect,
- SkColor color);
+ SkColor color,
+ float scale);
void SetAll(const SharedQuadState* shared_quad_state,
const gfx::Rect& rect,
const gfx::Rect& opaque_rect,
const gfx::Rect& visible_rect,
bool needs_blending,
- SkColor color);
+ SkColor color,
+ float scale);
SkColor color;
+ float scale;
void IterateResources(const ResourceIteratorCallback& callback) override;
diff --git a/cc/quads/draw_quad_unittest.cc b/cc/quads/draw_quad_unittest.cc
index b7c1bdf..5b5f0b9 100644
--- a/cc/quads/draw_quad_unittest.cc
+++ b/cc/quads/draw_quad_unittest.cc
@@ -369,16 +369,19 @@
TEST(DrawQuadTest, CopyCheckerboardDrawQuad) {
gfx::Rect visible_rect(40, 50, 30, 20);
SkColor color = 0xfabb0011;
+ float scale = 2.3f;
CREATE_SHARED_STATE();
- CREATE_QUAD_2_NEW(CheckerboardDrawQuad, visible_rect, color);
+ CREATE_QUAD_3_NEW(CheckerboardDrawQuad, visible_rect, color, scale);
EXPECT_EQ(DrawQuad::CHECKERBOARD, copy_quad->material);
EXPECT_EQ(visible_rect, copy_quad->visible_rect);
EXPECT_EQ(color, copy_quad->color);
+ EXPECT_EQ(scale, copy_quad->scale);
- CREATE_QUAD_1_ALL(CheckerboardDrawQuad, color);
+ CREATE_QUAD_2_ALL(CheckerboardDrawQuad, color, scale);
EXPECT_EQ(DrawQuad::CHECKERBOARD, copy_quad->material);
EXPECT_EQ(color, copy_quad->color);
+ EXPECT_EQ(scale, copy_quad->scale);
}
TEST(DrawQuadTest, CopyDebugBorderDrawQuad) {
@@ -736,9 +739,10 @@
TEST_F(DrawQuadIteratorTest, CheckerboardDrawQuad) {
gfx::Rect visible_rect(40, 50, 30, 20);
SkColor color = 0xfabb0011;
+ float scale = 3.2f;
CREATE_SHARED_STATE();
- CREATE_QUAD_2_NEW(CheckerboardDrawQuad, visible_rect, color);
+ CREATE_QUAD_3_NEW(CheckerboardDrawQuad, visible_rect, color, scale);
EXPECT_EQ(0, IterateAndCount(quad_new));
}
diff --git a/cc/quads/render_pass_unittest.cc b/cc/quads/render_pass_unittest.cc
index 8775d81..e6f39bc 100644
--- a/cc/quads/render_pass_unittest.cc
+++ b/cc/quads/render_pass_unittest.cc
@@ -92,8 +92,8 @@
CheckerboardDrawQuad* checkerboard_quad =
pass->CreateAndAppendDrawQuad<CheckerboardDrawQuad>();
- checkerboard_quad->SetNew(
- pass->shared_quad_state_list.back(), gfx::Rect(), gfx::Rect(), SkColor());
+ checkerboard_quad->SetNew(pass->shared_quad_state_list.back(), gfx::Rect(),
+ gfx::Rect(), SkColor(), 1.f);
RenderPassId new_id(63, 4);
@@ -143,16 +143,14 @@
CheckerboardDrawQuad* checkerboard_quad1 =
pass->CreateAndAppendDrawQuad<CheckerboardDrawQuad>();
checkerboard_quad1->SetNew(pass->shared_quad_state_list.back(),
- gfx::Rect(1, 1, 1, 1),
- gfx::Rect(1, 1, 1, 1),
- SkColor());
+ gfx::Rect(1, 1, 1, 1), gfx::Rect(1, 1, 1, 1),
+ SkColor(), 1.f);
CheckerboardDrawQuad* checkerboard_quad2 =
pass->CreateAndAppendDrawQuad<CheckerboardDrawQuad>();
checkerboard_quad2->SetNew(pass->shared_quad_state_list.back(),
- gfx::Rect(2, 2, 2, 2),
- gfx::Rect(2, 2, 2, 2),
- SkColor());
+ gfx::Rect(2, 2, 2, 2), gfx::Rect(2, 2, 2, 2),
+ SkColor(), 1.f);
// And two quads using another shared state.
SharedQuadState* shared_state2 = pass->CreateAndAppendSharedQuadState();
@@ -168,16 +166,14 @@
CheckerboardDrawQuad* checkerboard_quad3 =
pass->CreateAndAppendDrawQuad<CheckerboardDrawQuad>();
checkerboard_quad3->SetNew(pass->shared_quad_state_list.back(),
- gfx::Rect(3, 3, 3, 3),
- gfx::Rect(3, 3, 3, 3),
- SkColor());
+ gfx::Rect(3, 3, 3, 3), gfx::Rect(3, 3, 3, 3),
+ SkColor(), 1.f);
CheckerboardDrawQuad* checkerboard_quad4 =
pass->CreateAndAppendDrawQuad<CheckerboardDrawQuad>();
checkerboard_quad4->SetNew(pass->shared_quad_state_list.back(),
- gfx::Rect(4, 4, 4, 4),
- gfx::Rect(4, 4, 4, 4),
- SkColor());
+ gfx::Rect(4, 4, 4, 4), gfx::Rect(4, 4, 4, 4),
+ SkColor(), 1.f);
// A second render pass with a quad.
RenderPassId contrib_id(4, 1);
@@ -208,9 +204,8 @@
CheckerboardDrawQuad* contrib_quad =
contrib->CreateAndAppendDrawQuad<CheckerboardDrawQuad>();
contrib_quad->SetNew(contrib->shared_quad_state_list.back(),
- gfx::Rect(3, 3, 3, 3),
- gfx::Rect(3, 3, 3, 3),
- SkColor());
+ gfx::Rect(3, 3, 3, 3), gfx::Rect(3, 3, 3, 3), SkColor(),
+ 1.f);
// And a RenderPassDrawQuad for the contributing pass.
scoped_ptr<RenderPassDrawQuad> pass_quad =
@@ -267,9 +262,8 @@
CheckerboardDrawQuad* checkerboard_quad1 =
pass->CreateAndAppendDrawQuad<CheckerboardDrawQuad>();
checkerboard_quad1->SetNew(pass->shared_quad_state_list.back(),
- gfx::Rect(1, 1, 1, 1),
- gfx::Rect(1, 1, 1, 1),
- SkColor());
+ gfx::Rect(1, 1, 1, 1), gfx::Rect(1, 1, 1, 1),
+ SkColor(), 1.f);
// A shared state with no quads, they were culled.
SharedQuadState* shared_state2 = pass->CreateAndAppendSharedQuadState();
@@ -307,9 +301,8 @@
CheckerboardDrawQuad* checkerboard_quad2 =
pass->CreateAndAppendDrawQuad<CheckerboardDrawQuad>();
checkerboard_quad2->SetNew(pass->shared_quad_state_list.back(),
- gfx::Rect(3, 3, 3, 3),
- gfx::Rect(3, 3, 3, 3),
- SkColor());
+ gfx::Rect(3, 3, 3, 3), gfx::Rect(3, 3, 3, 3),
+ SkColor(), 1.f);
pass_list.push_back(pass.Pass());
diff --git a/cc/resources/display_list_recording_source.cc b/cc/resources/display_list_recording_source.cc
index 517f49f..8d2dc3e 100644
--- a/cc/resources/display_list_recording_source.cc
+++ b/cc/resources/display_list_recording_source.cc
@@ -115,6 +115,10 @@
return true;
}
+void DisplayListRecordingSource::DidMoveToNewCompositor() {
+ // No invalidation history to worry about here.
+}
+
gfx::Size DisplayListRecordingSource::GetSize() const {
return size_;
}
diff --git a/cc/resources/display_list_recording_source.h b/cc/resources/display_list_recording_source.h
index 1e713e1..e827d29 100644
--- a/cc/resources/display_list_recording_source.h
+++ b/cc/resources/display_list_recording_source.h
@@ -24,6 +24,7 @@
const gfx::Rect& visible_layer_rect,
int frame_number,
RecordingMode recording_mode) override;
+ void DidMoveToNewCompositor() override;
scoped_refptr<RasterSource> CreateRasterSource(
bool can_use_lcd_text) const override;
gfx::Size GetSize() const final;
diff --git a/cc/resources/picture.cc b/cc/resources/picture.cc
index cf5e59b..30c5845 100644
--- a/cc/resources/picture.cc
+++ b/cc/resources/picture.cc
@@ -287,7 +287,7 @@
}
int Picture::Raster(SkCanvas* canvas,
- SkDrawPictureCallback* callback,
+ SkPicture::AbortCallback* callback,
const Region& negated_content_region,
float contents_scale) const {
TRACE_EVENT_BEGIN1(
@@ -323,10 +323,10 @@
return bounds.width() * bounds.height();
}
-void Picture::Replay(SkCanvas* canvas) {
+void Picture::Replay(SkCanvas* canvas, SkPicture::AbortCallback* callback) {
TRACE_EVENT_BEGIN0("cc", "Picture::Replay");
DCHECK(picture_);
- picture_->playback(canvas);
+ picture_->playback(canvas, callback);
SkIRect bounds;
canvas->getClipDeviceBounds(&bounds);
TRACE_EVENT_END1("cc", "Picture::Replay",
diff --git a/cc/resources/picture.h b/cc/resources/picture.h
index 81c9c53..089838c 100644
--- a/cc/resources/picture.h
+++ b/cc/resources/picture.h
@@ -23,7 +23,6 @@
#include "third_party/skia/include/core/SkPicture.h"
#include "ui/gfx/geometry/rect.h"
-class SkDrawPictureCallback;
class SkPixelRef;
namespace base {
@@ -70,13 +69,13 @@
// raster operation, i.e., the parts of the canvas which will not get drawn
// to.
int Raster(SkCanvas* canvas,
- SkDrawPictureCallback* callback,
+ SkPicture::AbortCallback* callback,
const Region& negated_content_region,
float contents_scale) const;
// Draw the picture directly into the given canvas, without applying any
// clip/scale/layer transformations.
- void Replay(SkCanvas* canvas);
+ void Replay(SkCanvas* canvas, SkPicture::AbortCallback* callback = NULL);
scoped_ptr<base::Value> AsValue() const;
diff --git a/cc/resources/picture_layer_tiling_set.cc b/cc/resources/picture_layer_tiling_set.cc
index d931543..bd150f4 100644
--- a/cc/resources/picture_layer_tiling_set.cc
+++ b/cc/resources/picture_layer_tiling_set.cc
@@ -53,48 +53,53 @@
PictureLayerTilingSet::~PictureLayerTilingSet() {
}
+void PictureLayerTilingSet::CopyTilingsFromPendingTwin(
+ const PictureLayerTilingSet* pending_twin_set,
+ const scoped_refptr<RasterSource>& raster_source) {
+ if (pending_twin_set->tilings_.empty()) {
+ // If the twin (pending) tiling set is empty, it was not updated for the
+ // current frame. So we drop tilings from our set as well, instead of
+ // leaving behind unshared tilings that are all non-ideal.
+ RemoveAllTilings();
+ }
+
+ for (PictureLayerTiling* pending_twin_tiling : pending_twin_set->tilings_) {
+ float contents_scale = pending_twin_tiling->contents_scale();
+ PictureLayerTiling* this_tiling = FindTilingWithScale(contents_scale);
+ if (!this_tiling) {
+ scoped_ptr<PictureLayerTiling> new_tiling = PictureLayerTiling::Create(
+ contents_scale, raster_source, client_, max_tiles_for_interest_area_,
+ skewport_target_time_in_seconds_,
+ skewport_extrapolation_limit_in_content_pixels_);
+ tilings_.push_back(new_tiling.Pass());
+ this_tiling = tilings_.back();
+ }
+ this_tiling->CloneTilesAndPropertiesFrom(*pending_twin_tiling);
+ }
+}
+
void PictureLayerTilingSet::UpdateTilingsToCurrentRasterSource(
scoped_refptr<RasterSource> raster_source,
- const PictureLayerTilingSet* twin_set,
+ const PictureLayerTilingSet* pending_twin_set,
const Region& layer_invalidation,
float minimum_contents_scale,
float maximum_contents_scale) {
RemoveTilingsBelowScale(minimum_contents_scale);
RemoveTilingsAboveScale(maximum_contents_scale);
- // Copy over tilings that are shared with the |twin_set| tiling set (if it
- // exists).
- if (twin_set) {
- if (twin_set->tilings_.empty()) {
- // If the twin (pending) tiling set is empty, it was not updated for the
- // current frame. So we drop tilings from our set as well, instead of
- // leaving behind unshared tilings that are all non-ideal.
- RemoveAllTilings();
- }
+ // Copy over tilings that are shared with the |pending_twin_set| tiling set
+ // (if it exists).
+ if (pending_twin_set)
+ CopyTilingsFromPendingTwin(pending_twin_set, raster_source);
- for (PictureLayerTiling* twin_tiling : twin_set->tilings_) {
- float contents_scale = twin_tiling->contents_scale();
- DCHECK_GE(contents_scale, minimum_contents_scale);
- DCHECK_LE(contents_scale, maximum_contents_scale);
-
- PictureLayerTiling* this_tiling = FindTilingWithScale(contents_scale);
- if (!this_tiling) {
- scoped_ptr<PictureLayerTiling> new_tiling = PictureLayerTiling::Create(
- contents_scale, raster_source, client_,
- max_tiles_for_interest_area_, skewport_target_time_in_seconds_,
- skewport_extrapolation_limit_in_content_pixels_);
- tilings_.push_back(new_tiling.Pass());
- this_tiling = tilings_.back();
- }
- this_tiling->CloneTilesAndPropertiesFrom(*twin_tiling);
- }
- }
-
- // For unshared tilings, invalidate tiles and update them to the new raster
- // source.
+ // If the tiling is not shared (FindTilingWithScale returns nullptr) or if
+ // |this| is the sync set (pending_twin_set is nullptr), then invalidate
+ // tiles and update them to the new raster source.
for (PictureLayerTiling* tiling : tilings_) {
- if (twin_set && twin_set->FindTilingWithScale(tiling->contents_scale()))
+ if (pending_twin_set &&
+ pending_twin_set->FindTilingWithScale(tiling->contents_scale())) {
continue;
+ }
tiling->SetRasterSourceAndResize(raster_source);
tiling->Invalidate(layer_invalidation);
@@ -104,9 +109,9 @@
// raster source.
tiling->CreateMissingTilesInLiveTilesRect();
- // If |twin_set| is present, use the resolutions from there. Otherwise leave
- // all resolutions as they are.
- if (twin_set)
+ // If |pending_twin_set| is present, then |this| is active and |tiling| is
+ // not in the pending set, which means it is now NON_IDEAL_RESOLUTION.
+ if (pending_twin_set)
tiling->set_resolution(NON_IDEAL_RESOLUTION);
}
@@ -126,11 +131,12 @@
DCHECK_LE(NumHighResTilings(), 1);
// When commiting from the main thread the high res tiling may get dropped,
// but when cloning to the active tree, there should always be one.
- if (twin_set) {
+ if (pending_twin_set) {
DCHECK_EQ(1, NumHighResTilings())
<< " num tilings on active: " << tilings_.size()
- << " num tilings on pending: " << twin_set->tilings_.size()
- << " num high res on pending: " << twin_set->NumHighResTilings()
+ << " num tilings on pending: " << pending_twin_set->tilings_.size()
+ << " num high res on pending: "
+ << pending_twin_set->NumHighResTilings()
<< " are on active tree: " << (client_->GetTree() == ACTIVE_TREE);
}
}
diff --git a/cc/resources/picture_layer_tiling_set.h b/cc/resources/picture_layer_tiling_set.h
index fc1e581..a4c2fd8 100644
--- a/cc/resources/picture_layer_tiling_set.h
+++ b/cc/resources/picture_layer_tiling_set.h
@@ -55,9 +55,15 @@
PictureLayerTilingSet* recycled_twin_set);
void RemoveNonIdealTilings();
+ // This function can be called on both the active and pending tree.
+ // |pending_twin_set| represents the current pending twin. In situations where
+ // this is called on the active tree in two trees situations,
+ // |pending_twin_set| represents the tiling set from the pending twin layer.
+ // In situations where this is called on the sync tree (whether it's pending
+ // or active in cases of one tree), |pending_twin_set| should be nullptr.
void UpdateTilingsToCurrentRasterSource(
scoped_refptr<RasterSource> raster_source,
- const PictureLayerTilingSet* twin_set,
+ const PictureLayerTilingSet* pending_twin_set,
const Region& layer_invalidation,
float minimum_contents_scale,
float maximum_contents_scale);
@@ -163,6 +169,10 @@
float skewport_target_time_in_seconds,
int skewport_extrapolation_limit_in_content_pixels);
+ void CopyTilingsFromPendingTwin(
+ const PictureLayerTilingSet* pending_twin_set,
+ const scoped_refptr<RasterSource>& raster_source);
+
// Remove one tiling.
void Remove(PictureLayerTiling* tiling);
diff --git a/cc/resources/picture_pile.cc b/cc/resources/picture_pile.cc
index 2b15aea..04e0801 100644
--- a/cc/resources/picture_pile.cc
+++ b/cc/resources/picture_pile.cc
@@ -214,6 +214,11 @@
return true;
}
+void PicturePile::DidMoveToNewCompositor() {
+ for (auto& map_pair : picture_map_)
+ map_pair.second.ResetInvalidationHistory();
+}
+
bool PicturePile::ApplyInvalidationAndResize(const gfx::Rect& interest_rect,
Region* invalidation,
const gfx::Size& layer_size,
@@ -747,6 +752,11 @@
(GetInvalidationFrequency() < kInvalidationFrequencyThreshold));
}
+void PicturePile::PictureInfo::ResetInvalidationHistory() {
+ invalidation_history_.reset();
+ last_frame_number_ = 0;
+}
+
void PicturePile::SetBufferPixels(int new_buffer_pixels) {
if (new_buffer_pixels == buffer_pixels())
return;
diff --git a/cc/resources/picture_pile.h b/cc/resources/picture_pile.h
index bab06c8..bdba579 100644
--- a/cc/resources/picture_pile.h
+++ b/cc/resources/picture_pile.h
@@ -29,6 +29,7 @@
const gfx::Rect& visible_layer_rect,
int frame_number,
RecordingMode recording_mode) override;
+ void DidMoveToNewCompositor() override;
scoped_refptr<RasterSource> CreateRasterSource(
bool can_use_lcd_text) const override;
gfx::Size GetSize() const final;
@@ -57,6 +58,8 @@
return GetInvalidationFrequency();
}
+ void ResetInvalidationHistory();
+
private:
void AdvanceInvalidationHistory(int frame_number);
float GetInvalidationFrequency() const;
diff --git a/cc/resources/recording_source.h b/cc/resources/recording_source.h
index fdd8eb4..a202e63 100644
--- a/cc/resources/recording_source.h
+++ b/cc/resources/recording_source.h
@@ -39,6 +39,8 @@
int frame_number,
RecordingMode recording_mode) = 0;
+ virtual void DidMoveToNewCompositor() = 0;
+
virtual scoped_refptr<RasterSource> CreateRasterSource(
bool can_use_lcd_text) const = 0;
diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc
index 115238f..25f6597 100644
--- a/cc/resources/resource_provider.cc
+++ b/cc/resources/resource_provider.cc
@@ -898,11 +898,9 @@
GLES2Interface* gl = ContextGL();
DCHECK(gl);
- resource->gl_id = texture_id_allocator_->NextId();
- GLC(gl, gl->BindTexture(resource->target, resource->gl_id));
- GLC(gl,
- gl->ConsumeTextureCHROMIUM(resource->mailbox.target(),
- resource->mailbox.name()));
+ resource->gl_id =
+ GLC(gl, gl->CreateAndConsumeTextureCHROMIUM(resource->mailbox.target(),
+ resource->mailbox.name()));
}
if (!resource->pixels && resource->has_shared_bitmap_id &&
@@ -1595,9 +1593,6 @@
LazyCreate(source);
DCHECK(source->gl_id);
DCHECK(source->origin == Resource::INTERNAL);
- GLC(gl,
- gl->BindTexture(resource->mailbox_holder.texture_target,
- source->gl_id));
if (source->image_id) {
DCHECK(source->dirty_image);
BindImageForSampling(source);
@@ -1605,9 +1600,10 @@
// This is a resource allocated by the compositor, we need to produce it.
// Don't set a sync point, the caller will do it.
GLC(gl, gl->GenMailboxCHROMIUM(resource->mailbox_holder.mailbox.name));
- GLC(gl,
- gl->ProduceTextureCHROMIUM(resource->mailbox_holder.texture_target,
- resource->mailbox_holder.mailbox.name));
+ GLC(gl, gl->ProduceTextureDirectCHROMIUM(
+ source->gl_id, resource->mailbox_holder.texture_target,
+ resource->mailbox_holder.mailbox.name));
+
source->mailbox = TextureMailbox(resource->mailbox_holder);
} else {
DCHECK(source->mailbox.IsTexture());
@@ -2107,15 +2103,11 @@
}
DCHECK(!dest_resource->image_id);
dest_resource->allocated = true;
- gl->CopyTextureCHROMIUM(dest_resource->target,
- source_resource->gl_id,
- dest_resource->gl_id,
- 0,
- GLInternalFormat(dest_resource->format),
- GLDataType(dest_resource->format));
+ gl->CopySubTextureCHROMIUM(dest_resource->target, source_resource->gl_id,
+ dest_resource->gl_id, 0, 0);
if (source_resource->gl_read_lock_query_id) {
// End query and create a read lock fence that will prevent access to
- // source resource until CopyTextureCHROMIUM command has completed.
+// source resource until CopySubTextureCHROMIUM command has completed.
#if defined(OS_CHROMEOS)
gl->EndQueryEXT(GL_COMMANDS_ISSUED_CHROMIUM);
#else
diff --git a/cc/resources/resource_provider_unittest.cc b/cc/resources/resource_provider_unittest.cc
index fdd7fc0..24b91bf 100644
--- a/cc/resources/resource_provider_unittest.cc
+++ b/cc/resources/resource_provider_unittest.cc
@@ -97,10 +97,10 @@
MOCK_METHOD3(texParameteri, void(GLenum target, GLenum pname, GLint param));
MOCK_METHOD1(waitSyncPoint, void(GLuint sync_point));
MOCK_METHOD0(insertSyncPoint, GLuint(void));
- MOCK_METHOD2(produceTextureCHROMIUM,
- void(GLenum target, const GLbyte* mailbox));
- MOCK_METHOD2(consumeTextureCHROMIUM,
- void(GLenum target, const GLbyte* mailbox));
+ MOCK_METHOD3(produceTextureDirectCHROMIUM,
+ void(GLuint texture, GLenum target, const GLbyte* mailbox));
+ MOCK_METHOD2(createAndConsumeTextureCHROMIUM,
+ unsigned(GLenum target, const GLbyte* mailbox));
// Force all textures to be consecutive numbers starting at "1",
// so we easily can test for them.
@@ -258,25 +258,27 @@
return shared_data_->GenMailbox(mailbox);
}
- void produceTextureCHROMIUM(GLenum target, const GLbyte* mailbox) override {
- CheckTextureIsBound(target);
-
+ void produceTextureDirectCHROMIUM(GLuint texture,
+ GLenum target,
+ const GLbyte* mailbox) override {
// Delay moving the texture into the mailbox until the next
// InsertSyncPoint, so that it is not visible to other contexts that
// haven't waited on that sync point.
scoped_ptr<PendingProduceTexture> pending(new PendingProduceTexture);
memcpy(pending->mailbox, mailbox, sizeof(pending->mailbox));
base::AutoLock lock_for_texture_access(namespace_->lock);
- pending->texture = BoundTexture(target);
+ pending->texture = UnboundTexture(texture);
pending_produce_textures_.push_back(pending.Pass());
}
- void consumeTextureCHROMIUM(GLenum target, const GLbyte* mailbox) override {
- CheckTextureIsBound(target);
+ GLuint createAndConsumeTextureCHROMIUM(GLenum target,
+ const GLbyte* mailbox) override {
+ GLuint texture_id = createTexture();
base::AutoLock lock_for_texture_access(namespace_->lock);
scoped_refptr<TestTexture> texture =
shared_data_->ConsumeTexture(mailbox, last_waited_sync_point_);
- namespace_->textures.Replace(BoundTextureId(target), texture);
+ namespace_->textures.Replace(texture_id, texture);
+ return texture_id;
}
void GetPixels(const gfx::Size& size,
@@ -461,9 +463,9 @@
if (GetParam() == ResourceProvider::RESOURCE_TYPE_GL_TEXTURE) {
unsigned texture = child_context_->createTexture();
gpu::Mailbox gpu_mailbox;
- child_context_->bindTexture(GL_TEXTURE_2D, texture);
child_context_->genMailboxCHROMIUM(gpu_mailbox.name);
- child_context_->produceTextureCHROMIUM(GL_TEXTURE_2D, gpu_mailbox.name);
+ child_context_->produceTextureDirectCHROMIUM(texture, GL_TEXTURE_2D,
+ gpu_mailbox.name);
*sync_point = child_context_->insertSyncPoint();
EXPECT_LT(0u, *sync_point);
@@ -666,12 +668,11 @@
}
GLuint external_texture_id = child_context_->createExternalTexture();
- child_context_->bindTexture(GL_TEXTURE_EXTERNAL_OES, external_texture_id);
gpu::Mailbox external_mailbox;
child_context_->genMailboxCHROMIUM(external_mailbox.name);
- child_context_->produceTextureCHROMIUM(GL_TEXTURE_EXTERNAL_OES,
- external_mailbox.name);
+ child_context_->produceTextureDirectCHROMIUM(
+ external_texture_id, GL_TEXTURE_EXTERNAL_OES, external_mailbox.name);
const GLuint external_sync_point = child_context_->insertSyncPoint();
ResourceProvider::ResourceId id4 =
child_resource_provider_->CreateResourceFromTextureMailbox(
@@ -1745,9 +1746,8 @@
resource_ids_to_transfer.push_back(id);
TransferableResourceArray list;
- EXPECT_CALL(*child_context, bindTexture(GL_TEXTURE_2D, child_texture_id));
EXPECT_CALL(*child_context,
- produceTextureCHROMIUM(GL_TEXTURE_2D, _));
+ produceTextureDirectCHROMIUM(_, GL_TEXTURE_2D, _));
EXPECT_CALL(*child_context, insertSyncPoint());
child_resource_provider->PrepareSendToParent(resource_ids_to_transfer,
&list);
@@ -1757,8 +1757,9 @@
EXPECT_EQ(static_cast<unsigned>(child_filter), list[0].filter);
EXPECT_CALL(*parent_context,
- bindTexture(GL_TEXTURE_2D, parent_texture_id));
- EXPECT_CALL(*parent_context, consumeTextureCHROMIUM(GL_TEXTURE_2D, _));
+ createAndConsumeTextureCHROMIUM(GL_TEXTURE_2D, _))
+ .WillOnce(Return(parent_texture_id));
+
parent_resource_provider->ReceiveFromChild(child_id, list);
{
parent_resource_provider->WaitSyncPointIfNeeded(list[0].id);
@@ -1842,7 +1843,7 @@
GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &data);
gpu::Mailbox mailbox;
context()->genMailboxCHROMIUM(mailbox.name);
- context()->produceTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name);
+ context()->produceTextureDirectCHROMIUM(texture, GL_TEXTURE_2D, mailbox.name);
uint32 sync_point = context()->insertSyncPoint();
// All the logic below assumes that the sync points are all positive.
@@ -1876,14 +1877,15 @@
EXPECT_EQ(0u, release_sync_point);
context()->waitSyncPoint(list[0].mailbox_holder.sync_point);
- unsigned other_texture = context()->createTexture();
- context()->bindTexture(GL_TEXTURE_2D, other_texture);
- context()->consumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name);
+ unsigned other_texture =
+ context()->createAndConsumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name);
uint8_t test_data[4] = { 0 };
context()->GetPixels(
gfx::Size(1, 1), RGBA_8888, test_data);
EXPECT_EQ(0, memcmp(data, test_data, sizeof(data)));
- context()->produceTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name);
+
+ context()->produceTextureDirectCHROMIUM(other_texture, GL_TEXTURE_2D,
+ mailbox.name);
context()->deleteTexture(other_texture);
list[0].mailbox_holder.sync_point = context()->insertSyncPoint();
EXPECT_LT(0u, list[0].mailbox_holder.sync_point);
@@ -1927,14 +1929,15 @@
EXPECT_EQ(0u, release_sync_point);
context()->waitSyncPoint(list[0].mailbox_holder.sync_point);
- unsigned other_texture = context()->createTexture();
- context()->bindTexture(GL_TEXTURE_2D, other_texture);
- context()->consumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name);
+ unsigned other_texture =
+ context()->createAndConsumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name);
uint8_t test_data[4] = { 0 };
context()->GetPixels(
gfx::Size(1, 1), RGBA_8888, test_data);
EXPECT_EQ(0, memcmp(data, test_data, sizeof(data)));
- context()->produceTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name);
+
+ context()->produceTextureDirectCHROMIUM(other_texture, GL_TEXTURE_2D,
+ mailbox.name);
context()->deleteTexture(other_texture);
list[0].mailbox_holder.sync_point = context()->insertSyncPoint();
EXPECT_LT(0u, list[0].mailbox_holder.sync_point);
@@ -1955,8 +1958,8 @@
}
context()->waitSyncPoint(release_sync_point);
- context()->bindTexture(GL_TEXTURE_2D, texture);
- context()->consumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name);
+ texture =
+ context()->createAndConsumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name);
context()->deleteTexture(texture);
}
@@ -2264,7 +2267,7 @@
context()->bindTexture(GL_TEXTURE_2D, texture);
gpu::Mailbox mailbox;
context()->genMailboxCHROMIUM(mailbox.name);
- context()->produceTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name);
+ context()->produceTextureDirectCHROMIUM(texture, GL_TEXTURE_2D, mailbox.name);
uint32 sync_point = context()->insertSyncPoint();
EXPECT_LT(0u, sync_point);
@@ -2644,8 +2647,8 @@
EXPECT_CALL(*context, bindTexture(_, _)).Times(0);
EXPECT_CALL(*context, waitSyncPoint(_)).Times(0);
EXPECT_CALL(*context, insertSyncPoint()).Times(0);
- EXPECT_CALL(*context, produceTextureCHROMIUM(_, _)).Times(0);
- EXPECT_CALL(*context, consumeTextureCHROMIUM(_, _)).Times(0);
+ EXPECT_CALL(*context, produceTextureDirectCHROMIUM(_, _, _)).Times(0);
+ EXPECT_CALL(*context, createAndConsumeTextureCHROMIUM(_, _)).Times(0);
gpu::Mailbox gpu_mailbox;
memcpy(gpu_mailbox.name, "Hello world", strlen("Hello world") + 1);
@@ -2674,12 +2677,12 @@
resource_provider->WaitSyncPointIfNeeded(id);
Mock::VerifyAndClearExpectations(context);
- // Using the texture does a consume of the mailbox.
- EXPECT_CALL(*context, bindTexture(target, texture_id)).Times(2);
- EXPECT_CALL(*context, consumeTextureCHROMIUM(target, _));
+ EXPECT_CALL(*context, createAndConsumeTextureCHROMIUM(target, _))
+ .WillOnce(Return(texture_id));
+ EXPECT_CALL(*context, bindTexture(target, texture_id));
EXPECT_CALL(*context, insertSyncPoint()).Times(0);
- EXPECT_CALL(*context, produceTextureCHROMIUM(_, _)).Times(0);
+ EXPECT_CALL(*context, produceTextureDirectCHROMIUM(_, _, _)).Times(0);
// The sampler will reset these if |mailbox_nearest_neighbor| does not
// match |sampler_filter|.
@@ -2698,10 +2701,10 @@
// necessary.
EXPECT_CALL(*context, bindTexture(_, _)).Times(0);
EXPECT_CALL(*context, insertSyncPoint());
- EXPECT_CALL(*context, produceTextureCHROMIUM(_, _)).Times(0);
+ EXPECT_CALL(*context, produceTextureDirectCHROMIUM(_, _, _)).Times(0);
EXPECT_CALL(*context, waitSyncPoint(_)).Times(0);
- EXPECT_CALL(*context, consumeTextureCHROMIUM(_, _)).Times(0);
+ EXPECT_CALL(*context, createAndConsumeTextureCHROMIUM(_, _)).Times(0);
}
resource_provider->DeleteResource(id);
@@ -2786,15 +2789,14 @@
false,
1));
- unsigned texture_id = 1;
uint32 sync_point = 30;
unsigned target = GL_TEXTURE_EXTERNAL_OES;
EXPECT_CALL(*context, bindTexture(_, _)).Times(0);
EXPECT_CALL(*context, waitSyncPoint(_)).Times(0);
EXPECT_CALL(*context, insertSyncPoint()).Times(0);
- EXPECT_CALL(*context, produceTextureCHROMIUM(_, _)).Times(0);
- EXPECT_CALL(*context, consumeTextureCHROMIUM(_, _)).Times(0);
+ EXPECT_CALL(*context, produceTextureDirectCHROMIUM(_, _, _)).Times(0);
+ EXPECT_CALL(*context, createAndConsumeTextureCHROMIUM(_, _)).Times(0);
gpu::Mailbox gpu_mailbox;
memcpy(gpu_mailbox.name, "Hello world", strlen("Hello world") + 1);
@@ -2816,12 +2818,13 @@
resource_provider->WaitSyncPointIfNeeded(id);
Mock::VerifyAndClearExpectations(context);
- // Using the texture does a consume of the mailbox.
- EXPECT_CALL(*context, bindTexture(target, texture_id));
- EXPECT_CALL(*context, consumeTextureCHROMIUM(target, _));
+ unsigned texture_id = 1;
+
+ EXPECT_CALL(*context, createAndConsumeTextureCHROMIUM(target, _))
+ .WillOnce(Return(texture_id));
EXPECT_CALL(*context, insertSyncPoint()).Times(0);
- EXPECT_CALL(*context, produceTextureCHROMIUM(_, _)).Times(0);
+ EXPECT_CALL(*context, produceTextureDirectCHROMIUM(_, _, _)).Times(0);
ResourceProvider::ScopedReadLockGL lock(resource_provider.get(), id);
Mock::VerifyAndClearExpectations(context);
@@ -2830,10 +2833,10 @@
// necessary.
EXPECT_CALL(*context, bindTexture(_, _)).Times(0);
EXPECT_CALL(*context, insertSyncPoint());
- EXPECT_CALL(*context, produceTextureCHROMIUM(_, _)).Times(0);
+ EXPECT_CALL(*context, produceTextureDirectCHROMIUM(_, _, _)).Times(0);
EXPECT_CALL(*context, waitSyncPoint(_)).Times(0);
- EXPECT_CALL(*context, consumeTextureCHROMIUM(_, _)).Times(0);
+ EXPECT_CALL(*context, createAndConsumeTextureCHROMIUM(_, _)).Times(0);
}
}
@@ -2867,8 +2870,8 @@
EXPECT_CALL(*context, bindTexture(_, _)).Times(0);
EXPECT_CALL(*context, waitSyncPoint(_)).Times(0);
EXPECT_CALL(*context, insertSyncPoint()).Times(0);
- EXPECT_CALL(*context, produceTextureCHROMIUM(_, _)).Times(0);
- EXPECT_CALL(*context, consumeTextureCHROMIUM(_, _)).Times(0);
+ EXPECT_CALL(*context, produceTextureDirectCHROMIUM(_, _, _)).Times(0);
+ EXPECT_CALL(*context, createAndConsumeTextureCHROMIUM(_, _)).Times(0);
gpu::Mailbox gpu_mailbox;
memcpy(gpu_mailbox.name, "Hello world", strlen("Hello world") + 1);
@@ -2926,8 +2929,8 @@
EXPECT_CALL(*context, bindTexture(_, _)).Times(0);
EXPECT_CALL(*context, waitSyncPoint(_)).Times(0);
EXPECT_CALL(*context, insertSyncPoint()).Times(0);
- EXPECT_CALL(*context, produceTextureCHROMIUM(_, _)).Times(0);
- EXPECT_CALL(*context, consumeTextureCHROMIUM(_, _)).Times(0);
+ EXPECT_CALL(*context, produceTextureDirectCHROMIUM(_, _, _)).Times(0);
+ EXPECT_CALL(*context, createAndConsumeTextureCHROMIUM(_, _)).Times(0);
gpu::Mailbox gpu_mailbox;
memcpy(gpu_mailbox.name, "Hello world", strlen("Hello world") + 1);
diff --git a/cc/resources/task_graph_runner.cc b/cc/resources/task_graph_runner.cc
index 1a67faa..e0b3f4c 100644
--- a/cc/resources/task_graph_runner.cc
+++ b/cc/resources/task_graph_runner.cc
@@ -290,6 +290,7 @@
{
base::AutoLock lock(lock_);
+ base::ThreadRestrictions::ScopedAllowWait allow_wait;
TaskNamespaceMap::const_iterator it = namespaces_.find(token.id_);
if (it == namespaces_.end())
diff --git a/cc/scheduler/scheduler.cc b/cc/scheduler/scheduler.cc
index 904a057..70d726d 100644
--- a/cc/scheduler/scheduler.cc
+++ b/cc/scheduler/scheduler.cc
@@ -8,6 +8,7 @@
#include "base/auto_reset.h"
#include "base/logging.h"
+#include "base/profiler/scoped_tracker.h"
#include "base/single_thread_task_runner.h"
#include "base/trace_event/trace_event.h"
#include "base/trace_event/trace_event_argument.h"
@@ -78,7 +79,6 @@
const SchedulerSettings& scheduler_settings,
int layer_tree_host_id,
const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
- base::PowerMonitor* power_monitor,
scoped_ptr<BeginFrameSource> external_begin_frame_source,
SchedulerFrameSourcesConstructor* frame_sources_constructor)
: frame_source_(),
@@ -92,7 +92,6 @@
client_(client),
layer_tree_host_id_(layer_tree_host_id),
task_runner_(task_runner),
- power_monitor_(power_monitor),
state_machine_(scheduler_settings),
inside_process_scheduled_actions_(false),
inside_action_(SchedulerStateMachine::ACTION_NONE),
@@ -131,12 +130,9 @@
unthrottled_frame_source_ =
frame_sources_constructor->ConstructUnthrottledFrameSource(this);
frame_source_->AddSource(unthrottled_frame_source_);
-
- SetupPowerMonitoring();
}
Scheduler::~Scheduler() {
- TeardownPowerMonitoring();
if (frame_source_->NeedsBeginFrames())
frame_source_->SetNeedsBeginFrames(false);
}
@@ -150,27 +146,6 @@
return now;
}
-void Scheduler::SetupPowerMonitoring() {
- if (settings_.disable_hi_res_timer_tasks_on_battery) {
- DCHECK(power_monitor_);
- power_monitor_->AddObserver(this);
- state_machine_.SetImplLatencyTakesPriorityOnBattery(
- power_monitor_->IsOnBatteryPower());
- }
-}
-
-void Scheduler::TeardownPowerMonitoring() {
- if (settings_.disable_hi_res_timer_tasks_on_battery) {
- DCHECK(power_monitor_);
- power_monitor_->RemoveObserver(this);
- }
-}
-
-void Scheduler::OnPowerStateChange(bool on_battery_power) {
- DCHECK(settings_.disable_hi_res_timer_tasks_on_battery);
- state_machine_.SetImplLatencyTakesPriorityOnBattery(on_battery_power);
-}
-
void Scheduler::CommitVSyncParameters(base::TimeTicks timebase,
base::TimeDelta interval) {
// TODO(brianderson): We should not be receiving 0 intervals.
@@ -647,11 +622,25 @@
// order to wait for more user-input before starting the next commit.
// * Creating a new OuputSurface will not occur during the deadline in
// order to allow the state machine to "settle" first.
+
+ // TODO(robliao): Remove ScopedTracker below once crbug.com/461509 is fixed.
+ tracked_objects::ScopedTracker tracking_profile1(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION(
+ "461509 Scheduler::OnBeginImplFrameDeadline1"));
state_machine_.OnBeginImplFrameDeadline();
ProcessScheduledActions();
+
+ // TODO(robliao): Remove ScopedTracker below once crbug.com/461509 is fixed.
+ tracked_objects::ScopedTracker tracking_profile2(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION(
+ "461509 Scheduler::OnBeginImplFrameDeadline2"));
state_machine_.OnBeginImplFrameIdle();
ProcessScheduledActions();
+ // TODO(robliao): Remove ScopedTracker below once crbug.com/461509 is fixed.
+ tracked_objects::ScopedTracker tracking_profile3(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION(
+ "461509 Scheduler::OnBeginImplFrameDeadline3"));
client_->DidBeginImplFrameDeadline();
}
@@ -692,6 +681,10 @@
SchedulerStateMachine::Action action;
do {
+ // TODO(robliao): Remove ScopedTracker below once crbug.com/461509 is fixed.
+ tracked_objects::ScopedTracker tracking_profile1(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION(
+ "461509 Scheduler::ProcessScheduledActions1"));
action = state_machine_.NextAction();
TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler"),
"SchedulerStateMachine",
@@ -706,40 +699,96 @@
switch (action) {
case SchedulerStateMachine::ACTION_NONE:
break;
- case SchedulerStateMachine::ACTION_ANIMATE:
+ case SchedulerStateMachine::ACTION_ANIMATE: {
+ // TODO(robliao): Remove ScopedTracker below once crbug.com/461509 is
+ // fixed.
+ tracked_objects::ScopedTracker tracking_profile2(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION(
+ "461509 Scheduler::ProcessScheduledActions2"));
client_->ScheduledActionAnimate();
break;
- case SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME:
+ }
+ case SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME: {
+ // TODO(robliao): Remove ScopedTracker below once crbug.com/461509 is
+ // fixed.
+ tracked_objects::ScopedTracker tracking_profile3(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION(
+ "461509 Scheduler::ProcessScheduledActions3"));
client_->ScheduledActionSendBeginMainFrame();
break;
- case SchedulerStateMachine::ACTION_COMMIT:
+ }
+ case SchedulerStateMachine::ACTION_COMMIT: {
+ // TODO(robliao): Remove ScopedTracker below once crbug.com/461509 is
+ // fixed.
+ tracked_objects::ScopedTracker tracking_profile4(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION(
+ "461509 Scheduler::ProcessScheduledActions4"));
client_->ScheduledActionCommit();
break;
- case SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE:
+ }
+ case SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE: {
+ // TODO(robliao): Remove ScopedTracker below once crbug.com/461509 is
+ // fixed.
+ tracked_objects::ScopedTracker tracking_profile5(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION(
+ "461509 Scheduler::ProcessScheduledActions5"));
client_->ScheduledActionActivateSyncTree();
break;
- case SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE:
+ }
+ case SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE: {
+ // TODO(robliao): Remove ScopedTracker below once crbug.com/461509 is
+ // fixed.
+ tracked_objects::ScopedTracker tracking_profile6(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION(
+ "461509 Scheduler::ProcessScheduledActions6"));
DrawAndSwapIfPossible();
break;
- case SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED:
+ }
+ case SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED: {
+ // TODO(robliao): Remove ScopedTracker below once crbug.com/461509 is
+ // fixed.
+ tracked_objects::ScopedTracker tracking_profile7(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION(
+ "461509 Scheduler::ProcessScheduledActions7"));
client_->ScheduledActionDrawAndSwapForced();
break;
+ }
case SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT:
// No action is actually performed, but this allows the state machine to
// advance out of its waiting to draw state without actually drawing.
break;
- case SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION:
+ case SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION: {
+ // TODO(robliao): Remove ScopedTracker below once crbug.com/461509 is
+ // fixed.
+ tracked_objects::ScopedTracker tracking_profile8(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION(
+ "461509 Scheduler::ProcessScheduledActions8"));
client_->ScheduledActionBeginOutputSurfaceCreation();
break;
- case SchedulerStateMachine::ACTION_PREPARE_TILES:
+ }
+ case SchedulerStateMachine::ACTION_PREPARE_TILES: {
+ // TODO(robliao): Remove ScopedTracker below once crbug.com/461509 is
+ // fixed.
+ tracked_objects::ScopedTracker tracking_profile9(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION(
+ "461509 Scheduler::ProcessScheduledActions9"));
client_->ScheduledActionPrepareTiles();
break;
+ }
}
} while (action != SchedulerStateMachine::ACTION_NONE);
+ // TODO(robliao): Remove ScopedTracker below once crbug.com/461509 is fixed.
+ tracked_objects::ScopedTracker tracking_profile10(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION(
+ "461509 Scheduler::ProcessScheduledActions10"));
SetupNextBeginFrameIfNeeded();
client_->DidAnticipatedDrawTimeChange(AnticipatedDrawTime());
+ // TODO(robliao): Remove ScopedTracker below once crbug.com/461509 is fixed.
+ tracked_objects::ScopedTracker tracking_profile11(
+ FROM_HERE_WITH_EXPLICIT_FUNCTION(
+ "461509 Scheduler::ProcessScheduledActions11"));
RescheduleBeginImplFrameDeadlineIfNeeded();
}
diff --git a/cc/scheduler/scheduler.h b/cc/scheduler/scheduler.h
index 370ac25..8ed584a 100644
--- a/cc/scheduler/scheduler.h
+++ b/cc/scheduler/scheduler.h
@@ -11,8 +11,6 @@
#include "base/basictypes.h"
#include "base/cancelable_callback.h"
#include "base/memory/scoped_ptr.h"
-#include "base/power_monitor/power_monitor.h"
-#include "base/power_monitor/power_observer.h"
#include "base/time/time.h"
#include "cc/base/cc_export.h"
#include "cc/output/begin_frame_args.h"
@@ -75,22 +73,19 @@
friend class Scheduler;
};
-class CC_EXPORT Scheduler : public BeginFrameObserverMixIn,
- public base::PowerObserver {
+class CC_EXPORT Scheduler : public BeginFrameObserverMixIn {
public:
static scoped_ptr<Scheduler> Create(
SchedulerClient* client,
const SchedulerSettings& scheduler_settings,
int layer_tree_host_id,
const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
- base::PowerMonitor* power_monitor,
scoped_ptr<BeginFrameSource> external_begin_frame_source) {
SchedulerFrameSourcesConstructor frame_sources_constructor;
return make_scoped_ptr(new Scheduler(client,
scheduler_settings,
layer_tree_host_id,
task_runner,
- power_monitor,
external_begin_frame_source.Pass(),
&frame_sources_constructor));
}
@@ -100,9 +95,6 @@
// BeginFrameObserverMixin
bool OnBeginFrameMixInDelegate(const BeginFrameArgs& args) override;
- // base::PowerObserver method.
- void OnPowerStateChange(bool on_battery_power) override;
-
const SchedulerSettings& settings() const { return settings_; }
void CommitVSyncParameters(base::TimeTicks timebase,
@@ -179,7 +171,6 @@
const SchedulerSettings& scheduler_settings,
int layer_tree_host_id,
const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
- base::PowerMonitor* power_monitor,
scoped_ptr<BeginFrameSource> external_begin_frame_source,
SchedulerFrameSourcesConstructor* frame_sources_constructor);
@@ -205,8 +196,6 @@
int layer_tree_host_id_;
scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
- base::PowerMonitor* power_monitor_;
-
base::TimeDelta estimated_parent_draw_time_;
std::deque<BeginFrameArgs> begin_retro_frame_args_;
@@ -243,8 +232,6 @@
void OnBeginImplFrameDeadline();
void PollForAnticipatedDrawTriggers();
void PollToAdvanceCommitState();
- void SetupPowerMonitoring();
- void TeardownPowerMonitoring();
void UpdateActiveFrameSource();
base::TimeDelta EstimatedParentDrawTime() {
diff --git a/cc/scheduler/scheduler_state_machine.cc b/cc/scheduler/scheduler_state_machine.cc
index 4e6509f..f2f6636 100644
--- a/cc/scheduler/scheduler_state_machine.cc
+++ b/cc/scheduler/scheduler_state_machine.cc
@@ -47,7 +47,6 @@
skip_next_begin_main_frame_to_reduce_latency_(false),
skip_begin_main_frame_to_reduce_latency_(false),
continuous_painting_(false),
- impl_latency_takes_priority_on_battery_(false),
children_need_begin_frames_(false),
defer_commits_(false) {
}
@@ -236,8 +235,6 @@
state->SetBoolean("skip_next_begin_main_frame_to_reduce_latency",
skip_next_begin_main_frame_to_reduce_latency_);
state->SetBoolean("continuous_painting", continuous_painting_);
- state->SetBoolean("impl_latency_takes_priority_on_battery",
- impl_latency_takes_priority_on_battery_);
state->SetBoolean("children_need_begin_frames", children_need_begin_frames_);
state->SetBoolean("defer_commits", defer_commits_);
state->EndDictionary();
@@ -903,11 +900,6 @@
if (impl_latency_takes_priority_)
return true;
- // If we are on battery power and want to prioritize impl latency because
- // we don't trust deadline tasks to execute at the right time.
- if (impl_latency_takes_priority_on_battery_)
- return true;
-
return false;
}
diff --git a/cc/scheduler/scheduler_state_machine.h b/cc/scheduler/scheduler_state_machine.h
index f77df28..a411022 100644
--- a/cc/scheduler/scheduler_state_machine.h
+++ b/cc/scheduler/scheduler_state_machine.h
@@ -254,12 +254,6 @@
bool CouldSendBeginMainFrame() const;
- void SetImplLatencyTakesPriorityOnBattery(
- bool impl_latency_takes_priority_on_battery) {
- impl_latency_takes_priority_on_battery_ =
- impl_latency_takes_priority_on_battery;
- }
-
void SetDeferCommits(bool defer_commits);
// TODO(zmo): This is temporary for debugging crbug.com/393331.
@@ -341,7 +335,6 @@
bool skip_next_begin_main_frame_to_reduce_latency_;
bool skip_begin_main_frame_to_reduce_latency_;
bool continuous_painting_;
- bool impl_latency_takes_priority_on_battery_;
bool children_need_begin_frames_;
bool defer_commits_;
diff --git a/cc/scheduler/scheduler_unittest.cc b/cc/scheduler/scheduler_unittest.cc
index 50cc846..9346536 100644
--- a/cc/scheduler/scheduler_unittest.cc
+++ b/cc/scheduler/scheduler_unittest.cc
@@ -10,8 +10,6 @@
#include "base/logging.h"
#include "base/memory/scoped_vector.h"
#include "base/message_loop/message_loop.h"
-#include "base/power_monitor/power_monitor.h"
-#include "base/power_monitor/power_monitor_source.h"
#include "base/run_loop.h"
#include "base/time/time.h"
#include "base/trace_event/trace_event.h"
@@ -198,21 +196,6 @@
TestScheduler* scheduler_;
};
-class FakePowerMonitorSource : public base::PowerMonitorSource {
- public:
- FakePowerMonitorSource() {}
- ~FakePowerMonitorSource() override {}
- void GeneratePowerStateEvent(bool on_battery_power) {
- on_battery_power_impl_ = on_battery_power;
- ProcessPowerEvent(POWER_STATE_EVENT);
- base::MessageLoop::current()->RunUntilIdle();
- }
- bool IsOnBatteryPowerImpl() override { return on_battery_power_impl_; }
-
- private:
- bool on_battery_power_impl_;
-};
-
class FakeExternalBeginFrameSource : public BeginFrameSourceMixIn {
public:
explicit FakeExternalBeginFrameSource(FakeSchedulerClient* client)
@@ -240,10 +223,7 @@
SchedulerTest()
: now_src_(TestNowSource::Create()),
task_runner_(new OrderedSimpleTaskRunner(now_src_, true)),
- fake_external_begin_frame_source_(nullptr),
- fake_power_monitor_source_(new FakePowerMonitorSource),
- power_monitor_(make_scoped_ptr<base::PowerMonitorSource>(
- fake_power_monitor_source_)) {
+ fake_external_begin_frame_source_(nullptr) {
// A bunch of tests require Now() to be > BeginFrameArgs::DefaultInterval()
now_src_->AdvanceNow(base::TimeDelta::FromMilliseconds(100));
// Fail if we need to run 100 tasks in a row.
@@ -261,9 +241,9 @@
fake_external_begin_frame_source_ =
fake_external_begin_frame_source.get();
}
- scheduler_ = TestScheduler::Create(
- now_src_, client_.get(), scheduler_settings_, 0, task_runner_,
- &power_monitor_, fake_external_begin_frame_source.Pass());
+ scheduler_ = TestScheduler::Create(now_src_, client_.get(),
+ scheduler_settings_, 0, task_runner_,
+ fake_external_begin_frame_source.Pass());
DCHECK(scheduler_);
client_->set_scheduler(scheduler_.get());
return scheduler_.get();
@@ -386,11 +366,6 @@
CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, now_src()));
}
- base::PowerMonitor* PowerMonitor() { return &power_monitor_; }
- FakePowerMonitorSource* PowerMonitorSource() {
- return fake_power_monitor_source_;
- }
-
FakeExternalBeginFrameSource* fake_external_begin_frame_source() const {
return fake_external_begin_frame_source_;
}
@@ -412,8 +387,6 @@
scoped_refptr<TestNowSource> now_src_;
scoped_refptr<OrderedSimpleTaskRunner> task_runner_;
FakeExternalBeginFrameSource* fake_external_begin_frame_source_;
- FakePowerMonitorSource* fake_power_monitor_source_;
- base::PowerMonitor power_monitor_;
SchedulerSettings scheduler_settings_;
scoped_ptr<FakeSchedulerClient> client_;
scoped_ptr<TestScheduler> scheduler_;
@@ -2119,131 +2092,6 @@
EXPECT_ACTION("ScheduledActionActivateSyncTree", client_, 1, 2);
}
-TEST_F(SchedulerTest, SchedulerPowerMonitoring) {
- scheduler_settings_.disable_hi_res_timer_tasks_on_battery = true;
- SetUpScheduler(true);
-
- base::TimeTicks before_deadline, after_deadline;
-
- scheduler_->SetNeedsCommit();
- scheduler_->SetNeedsRedraw();
- client_->Reset();
-
- // On non-battery power
- EXPECT_FALSE(PowerMonitor()->IsOnBatteryPower());
-
- EXPECT_SCOPED(AdvanceFrame());
- client_->Reset();
-
- before_deadline = now_src()->Now();
- EXPECT_TRUE(
- task_runner().RunTasksWhile(client_->ImplFrameDeadlinePending(true)));
- after_deadline = now_src()->Now();
-
- // We post a non-zero deadline task when not on battery
- EXPECT_LT(before_deadline, after_deadline);
-
- // Switch to battery power
- PowerMonitorSource()->GeneratePowerStateEvent(true);
- EXPECT_TRUE(PowerMonitor()->IsOnBatteryPower());
-
- EXPECT_SCOPED(AdvanceFrame());
- scheduler_->SetNeedsCommit();
- scheduler_->SetNeedsRedraw();
- client_->Reset();
-
- before_deadline = now_src()->Now();
- EXPECT_TRUE(
- task_runner().RunTasksWhile(client_->ImplFrameDeadlinePending(true)));
- after_deadline = now_src()->Now();
-
- // We post a zero deadline task when on battery
- EXPECT_EQ(before_deadline, after_deadline);
-
- // Switch to non-battery power
- PowerMonitorSource()->GeneratePowerStateEvent(false);
- EXPECT_FALSE(PowerMonitor()->IsOnBatteryPower());
-
- EXPECT_SCOPED(AdvanceFrame());
- scheduler_->SetNeedsCommit();
- scheduler_->SetNeedsRedraw();
- client_->Reset();
-
- // Same as before
- before_deadline = now_src()->Now();
- EXPECT_TRUE(
- task_runner().RunTasksWhile(client_->ImplFrameDeadlinePending(true)));
- after_deadline = now_src()->Now();
-}
-
-TEST_F(SchedulerTest,
- SimulateWindowsLowResolutionTimerOnBattery_PrioritizeImplLatencyOff) {
- scheduler_settings_.use_external_begin_frame_source = true;
- SetUpScheduler(true);
-
- // Set needs commit so that the scheduler tries to wait for the main thread
- scheduler_->SetNeedsCommit();
- // Set needs redraw so that the scheduler doesn't wait too long
- scheduler_->SetNeedsRedraw();
- client_->Reset();
-
- // Switch to battery power
- PowerMonitorSource()->GeneratePowerStateEvent(true);
- EXPECT_TRUE(PowerMonitor()->IsOnBatteryPower());
-
- EXPECT_SCOPED(AdvanceFrame());
- scheduler_->SetNeedsCommit();
- scheduler_->SetNeedsRedraw();
- client_->Reset();
-
- // Disable auto-advancing of now_src
- task_runner().SetAutoAdvanceNowToPendingTasks(false);
-
- // Deadline task is pending
- EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending());
- task_runner().RunPendingTasks();
- // Deadline task is still pending
- EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending());
-
- // Advance now by 15 ms - same as windows low res timer
- now_src()->AdvanceNowMicroseconds(15000);
- EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending());
- task_runner().RunPendingTasks();
- // Deadline task finally completes
- EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending());
-}
-
-TEST_F(SchedulerTest,
- SimulateWindowsLowResolutionTimerOnBattery_PrioritizeImplLatencyOn) {
- scheduler_settings_.disable_hi_res_timer_tasks_on_battery = true;
- scheduler_settings_.use_external_begin_frame_source = true;
- SetUpScheduler(true);
-
- // Set needs commit so that the scheduler tries to wait for the main thread
- scheduler_->SetNeedsCommit();
- // Set needs redraw so that the scheduler doesn't wait too long
- scheduler_->SetNeedsRedraw();
- client_->Reset();
-
- // Switch to battery power
- PowerMonitorSource()->GeneratePowerStateEvent(true);
- EXPECT_TRUE(PowerMonitor()->IsOnBatteryPower());
-
- EXPECT_SCOPED(AdvanceFrame());
- scheduler_->SetNeedsCommit();
- scheduler_->SetNeedsRedraw();
- client_->Reset();
-
- // Disable auto-advancing of now_src
- task_runner().SetAutoAdvanceNowToPendingTasks(false);
-
- // Deadline task is pending
- EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending());
- task_runner().RunPendingTasks();
- // Deadline task runs immediately
- EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending());
-}
-
// Tests to ensure frame sources can be successfully changed while drawing.
TEST_F(SchedulerTest, SwitchFrameSourceToUnthrottled) {
scheduler_settings_.use_external_begin_frame_source = true;
diff --git a/cc/test/data/checkers.png b/cc/test/data/checkers.png
new file mode 100644
index 0000000..fdd2ee3
--- /dev/null
+++ b/cc/test/data/checkers.png
Binary files differ
diff --git a/cc/test/data/checkers_big.png b/cc/test/data/checkers_big.png
new file mode 100644
index 0000000..48edf60
--- /dev/null
+++ b/cc/test/data/checkers_big.png
Binary files differ
diff --git a/cc/test/data/mask_of_background_filter.png b/cc/test/data/mask_of_background_filter.png
new file mode 100644
index 0000000..2a96d49
--- /dev/null
+++ b/cc/test/data/mask_of_background_filter.png
Binary files differ
diff --git a/cc/test/data/mask_of_layer_with_blend.png b/cc/test/data/mask_of_layer_with_blend.png
new file mode 100644
index 0000000..35faaba
--- /dev/null
+++ b/cc/test/data/mask_of_layer_with_blend.png
Binary files differ
diff --git a/cc/test/fake_content_layer_client.cc b/cc/test/fake_content_layer_client.cc
index ab958e9..ffef555 100644
--- a/cc/test/fake_content_layer_client.cc
+++ b/cc/test/fake_content_layer_client.cc
@@ -71,8 +71,8 @@
const SkPaint& paint = it->second;
canvas =
skia::SharePtr(recorder.beginRecording(gfx::RectFToSkRect(draw_rect)));
- canvas->drawRectCoords(0.f, 0.f, draw_rect.width(), draw_rect.height(),
- paint);
+ canvas->drawRectCoords(draw_rect.x(), draw_rect.y(), draw_rect.width(),
+ draw_rect.height(), paint);
picture = skia::AdoptRef(recorder.endRecording());
list->AppendItem(DrawingDisplayItem::Create(picture));
}
@@ -81,7 +81,7 @@
it != draw_bitmaps_.end(); ++it) {
canvas = skia::SharePtr(
recorder.beginRecording(it->bitmap.width(), it->bitmap.height()));
- canvas->drawBitmap(it->bitmap, 0.f, 0.f, &it->paint);
+ canvas->drawBitmap(it->bitmap, it->point.x(), it->point.y(), &it->paint);
picture = skia::AdoptRef(recorder.endRecording());
list->AppendItem(DrawingDisplayItem::Create(picture));
}
diff --git a/cc/test/ordered_texture_map.cc b/cc/test/ordered_texture_map.cc
index ee3e2f3..649700c 100644
--- a/cc/test/ordered_texture_map.cc
+++ b/cc/test/ordered_texture_map.cc
@@ -32,7 +32,10 @@
void OrderedTextureMap::Remove(GLuint id) {
TextureMap::iterator map_it = textures_.find(id);
- DCHECK(map_it != textures_.end());
+ // for some test we generate dummy tex id, which are not registered,
+ // nothing to remove in that case.
+ if (map_it == textures_.end())
+ return;
textures_.erase(map_it);
TextureList::iterator list_it =
diff --git a/cc/test/render_pass_test_common.cc b/cc/test/render_pass_test_common.cc
index 0e3fe22..3f7f7c0 100644
--- a/cc/test/render_pass_test_common.cc
+++ b/cc/test/render_pass_test_common.cc
@@ -94,7 +94,7 @@
CheckerboardDrawQuad* checkerboard_quad =
this->CreateAndAppendDrawQuad<CheckerboardDrawQuad>();
- checkerboard_quad->SetNew(shared_state, rect, visible_rect, SK_ColorRED);
+ checkerboard_quad->SetNew(shared_state, rect, visible_rect, SK_ColorRED, 1.f);
DebugBorderDrawQuad* debug_border_quad =
this->CreateAndAppendDrawQuad<DebugBorderDrawQuad>();
diff --git a/cc/test/scheduler_test_common.cc b/cc/test/scheduler_test_common.cc
index 94bcf5f..f25d6eb 100644
--- a/cc/test/scheduler_test_common.cc
+++ b/cc/test/scheduler_test_common.cc
@@ -131,14 +131,12 @@
const SchedulerSettings& scheduler_settings,
int layer_tree_host_id,
const scoped_refptr<OrderedSimpleTaskRunner>& test_task_runner,
- base::PowerMonitor* power_monitor,
TestSchedulerFrameSourcesConstructor* frame_sources_constructor,
scoped_ptr<BeginFrameSource> external_begin_frame_source)
: Scheduler(client,
scheduler_settings,
layer_tree_host_id,
test_task_runner,
- power_monitor,
external_begin_frame_source.Pass(),
frame_sources_constructor),
now_src_(now_src) {
diff --git a/cc/test/scheduler_test_common.h b/cc/test/scheduler_test_common.h
index 00cdd75..763ccc8 100644
--- a/cc/test/scheduler_test_common.h
+++ b/cc/test/scheduler_test_common.h
@@ -164,7 +164,6 @@
const SchedulerSettings& scheduler_settings,
int layer_tree_host_id,
const scoped_refptr<OrderedSimpleTaskRunner>& task_runner,
- base::PowerMonitor* power_monitor,
scoped_ptr<BeginFrameSource> external_begin_frame_source) {
TestSchedulerFrameSourcesConstructor frame_sources_constructor(
task_runner.get(), now_src.get());
@@ -174,7 +173,6 @@
scheduler_settings,
layer_tree_host_id,
task_runner,
- power_monitor,
&frame_sources_constructor,
external_begin_frame_source.Pass()));
}
@@ -209,7 +207,6 @@
const SchedulerSettings& scheduler_settings,
int layer_tree_host_id,
const scoped_refptr<OrderedSimpleTaskRunner>& test_task_runner,
- base::PowerMonitor* power_monitor,
TestSchedulerFrameSourcesConstructor* frame_sources_constructor,
scoped_ptr<BeginFrameSource> external_begin_frame_source);
diff --git a/cc/test/test_web_graphics_context_3d.cc b/cc/test/test_web_graphics_context_3d.cc
index 28b16c8..9f20bb8 100644
--- a/cc/test/test_web_graphics_context_3d.cc
+++ b/cc/test/test_web_graphics_context_3d.cc
@@ -356,6 +356,13 @@
return namespace_->textures.TextureForId(BoundTextureId(target));
}
+scoped_refptr<TestTexture> TestWebGraphicsContext3D::UnboundTexture(
+ GLuint texture) {
+ // The caller is expected to lock the namespace for texture access.
+ namespace_->lock.AssertAcquired();
+ return namespace_->textures.TextureForId(texture);
+}
+
void TestWebGraphicsContext3D::CheckTextureIsBound(GLenum target) {
DCHECK(BoundTextureId(target));
}
@@ -466,7 +473,9 @@
GLuint TestWebGraphicsContext3D::createAndConsumeTextureCHROMIUM(
GLenum target,
const GLbyte* mailbox) {
- return createTexture();
+ GLuint texture_id = createTexture();
+ consumeTextureCHROMIUM(target, mailbox);
+ return texture_id;
}
void TestWebGraphicsContext3D::loseContextCHROMIUM(GLenum current,
diff --git a/cc/test/test_web_graphics_context_3d.h b/cc/test/test_web_graphics_context_3d.h
index c2dee45..d8219f5 100644
--- a/cc/test/test_web_graphics_context_3d.h
+++ b/cc/test/test_web_graphics_context_3d.h
@@ -441,6 +441,7 @@
void CreateNamespace();
GLuint BoundTextureId(GLenum target);
scoped_refptr<TestTexture> BoundTexture(GLenum target);
+ scoped_refptr<TestTexture> UnboundTexture(GLuint texture);
void CheckTextureIsBound(GLenum target);
unsigned context_id_;
diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc
index abc63fc..d893b33 100644
--- a/cc/trees/layer_tree_host.cc
+++ b/cc/trees/layer_tree_host.cc
@@ -211,10 +211,6 @@
proxy_->SetLayerTreeHostClientReady();
}
-static void LayerTreeHostOnOutputSurfaceCreatedCallback(Layer* layer) {
- layer->OnOutputSurfaceCreated();
-}
-
void LayerTreeHost::DeleteContentsTexturesOnImplThread(
ResourceProvider* resource_provider) {
DCHECK(proxy_->IsImplThread());
@@ -427,7 +423,7 @@
if (root_layer()) {
LayerTreeHostCommon::CallFunctionForSubtree(
- root_layer(), base::Bind(&LayerTreeHostOnOutputSurfaceCreatedCallback));
+ root_layer(), [](Layer* layer) { layer->OnOutputSurfaceCreated(); });
}
client_->DidInitializeOutputSurface();
@@ -452,11 +448,8 @@
host_impl->SetUseGpuRasterization(UseGpuRasterization());
shared_bitmap_manager_ = NULL;
gpu_memory_buffer_manager_ = NULL;
- if (settings_.calculate_top_controls_position &&
- host_impl->top_controls_manager()) {
- top_controls_manager_weak_ptr_ =
- host_impl->top_controls_manager()->AsWeakPtr();
- }
+ top_controls_manager_weak_ptr_ =
+ host_impl->top_controls_manager()->AsWeakPtr();
input_handler_weak_ptr_ = host_impl->AsWeakPtr();
return host_impl.Pass();
}
@@ -873,17 +866,12 @@
SetNeedsCommit();
}
-static void LayerTreeHostReduceMemoryCallback(Layer* layer) {
- layer->ReduceMemoryUsage();
-}
-
void LayerTreeHost::ReduceMemoryUsage() {
if (!root_layer())
return;
LayerTreeHostCommon::CallFunctionForSubtree(
- root_layer(),
- base::Bind(&LayerTreeHostReduceMemoryCallback));
+ root_layer(), [](Layer* layer) { layer->ReduceMemoryUsage(); });
}
void LayerTreeHost::SetPrioritiesForSurfaces(size_t surface_memory_bytes) {
@@ -1167,9 +1155,6 @@
void LayerTreeHost::UpdateTopControlsState(TopControlsState constraints,
TopControlsState current,
bool animate) {
- if (!settings_.calculate_top_controls_position)
- return;
-
// Top controls are only used in threaded mode.
proxy_->ImplThreadTaskRunner()->PostTask(
FROM_HERE,
diff --git a/cc/trees/layer_tree_host_common.cc b/cc/trees/layer_tree_host_common.cc
index a84cae6..e468c07 100644
--- a/cc/trees/layer_tree_host_common.cc
+++ b/cc/trees/layer_tree_host_common.cc
@@ -2495,12 +2495,6 @@
std::abs(r1.height() - r2.height()) <= tolerance;
}
-static bool ApproximatelyEqual(const gfx::Transform& a,
- const gfx::Transform& b) {
- static const float tolerance = 0.01f;
- return gfx::MatrixDistance(a, b) < tolerance;
-}
-
void LayerTreeHostCommon::CalculateDrawProperties(
CalcDrawPropsMainInputs* inputs) {
UpdateRenderSurfaces(inputs->root_layer,
@@ -2512,30 +2506,42 @@
ProcessCalcDrawPropsInputs(*inputs, &globals, &data_for_recursion);
PreCalculateMetaInformationRecursiveData recursive_data;
- PreCalculateMetaInformation(inputs->root_layer, &recursive_data);
- std::vector<AccumulatedSurfaceState<Layer>> accumulated_surface_state;
- CalculateDrawPropertiesInternal<Layer>(
- inputs->root_layer, globals, data_for_recursion,
- inputs->render_surface_layer_list, &dummy_layer_list,
- &accumulated_surface_state, inputs->current_render_surface_layer_list_id);
- // The dummy layer list should not have been used.
- DCHECK_EQ(0u, dummy_layer_list.size());
- // A root layer render_surface should always exist after
- // CalculateDrawProperties.
- DCHECK(inputs->root_layer->render_surface());
+ if (!inputs->verify_property_trees) {
+ PreCalculateMetaInformation(inputs->root_layer, &recursive_data);
+ std::vector<AccumulatedSurfaceState<Layer>> accumulated_surface_state;
+ CalculateDrawPropertiesInternal<Layer>(
+ inputs->root_layer, globals, data_for_recursion,
+ inputs->render_surface_layer_list, &dummy_layer_list,
+ &accumulated_surface_state,
+ inputs->current_render_surface_layer_list_id);
+ } else {
+ {
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug.cdp-perf"),
+ "LayerTreeHostCommon::CalculateDrawProperties");
+ PreCalculateMetaInformation(inputs->root_layer, &recursive_data);
+ std::vector<AccumulatedSurfaceState<Layer>> accumulated_surface_state;
+ CalculateDrawPropertiesInternal<Layer>(
+ inputs->root_layer, globals, data_for_recursion,
+ inputs->render_surface_layer_list, &dummy_layer_list,
+ &accumulated_surface_state,
+ inputs->current_render_surface_layer_list_id);
+ }
- if (inputs->verify_property_trees) {
// The translation from layer to property trees is an intermediate state. We
// will eventually get these data passed directly to the compositor.
TransformTree transform_tree;
ClipTree clip_tree;
OpacityTree opacity_tree;
- ComputeVisibleRectsUsingPropertyTrees(
- inputs->root_layer, inputs->page_scale_application_layer,
- inputs->page_scale_factor, inputs->device_scale_factor,
- gfx::Rect(inputs->device_viewport_size), inputs->device_transform,
- &transform_tree, &clip_tree, &opacity_tree);
+ {
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug.cdp-perf"),
+ "LayerTreeHostCommon::ComputeVisibleRectsWithPropertyTrees");
+ ComputeVisibleRectsUsingPropertyTrees(
+ inputs->root_layer, inputs->page_scale_application_layer,
+ inputs->page_scale_factor, inputs->device_scale_factor,
+ gfx::Rect(inputs->device_viewport_size), inputs->device_transform,
+ &transform_tree, &clip_tree, &opacity_tree);
+ }
LayerIterator<Layer> it, end;
for (it = LayerIterator<Layer>::Begin(inputs->render_surface_layer_list),
@@ -2550,17 +2556,18 @@
current_layer->visible_rect_from_property_trees());
CHECK(visible_rects_match);
- const bool draw_transforms_match = ApproximatelyEqual(
- current_layer->draw_transform(),
- current_layer->draw_transform_from_property_trees(transform_tree));
- CHECK(draw_transforms_match);
-
const bool draw_opacities_match =
current_layer->draw_opacity() ==
current_layer->DrawOpacityFromPropertyTrees(opacity_tree);
CHECK(draw_opacities_match);
}
}
+
+ // The dummy layer list should not have been used.
+ DCHECK_EQ(0u, dummy_layer_list.size());
+ // A root layer render_surface should always exist after
+ // CalculateDrawProperties.
+ DCHECK(inputs->root_layer->render_surface());
}
void LayerTreeHostCommon::CalculateDrawProperties(
diff --git a/cc/trees/layer_tree_host_common.h b/cc/trees/layer_tree_host_common.h
index 8666617..6c03511 100644
--- a/cc/trees/layer_tree_host_common.h
+++ b/cc/trees/layer_tree_host_common.h
@@ -125,10 +125,9 @@
static bool RenderSurfaceContributesToTarget(LayerType*,
int target_surface_layer_id);
- template <typename LayerType>
- static void CallFunctionForSubtree(
- LayerType* root_layer,
- const base::Callback<void(LayerType* layer)>& function);
+ template <typename LayerType, typename Function>
+ static void CallFunctionForSubtree(LayerType* layer,
+ const Function& function);
// Returns a layer with the given id if one exists in the subtree starting
// from the given root layer (including mask and replica layers).
@@ -205,22 +204,21 @@
return NULL;
}
-template <typename LayerType>
-void LayerTreeHostCommon::CallFunctionForSubtree(
- LayerType* root_layer,
- const base::Callback<void(LayerType* layer)>& function) {
- function.Run(root_layer);
+template <typename LayerType, typename Function>
+void LayerTreeHostCommon::CallFunctionForSubtree(LayerType* layer,
+ const Function& function) {
+ function(layer);
- if (LayerType* mask_layer = root_layer->mask_layer())
- function.Run(mask_layer);
- if (LayerType* replica_layer = root_layer->replica_layer()) {
- function.Run(replica_layer);
+ if (LayerType* mask_layer = layer->mask_layer())
+ function(mask_layer);
+ if (LayerType* replica_layer = layer->replica_layer()) {
+ function(replica_layer);
if (LayerType* mask_layer = replica_layer->mask_layer())
- function.Run(mask_layer);
+ function(mask_layer);
}
- for (size_t i = 0; i < root_layer->children().size(); ++i) {
- CallFunctionForSubtree(get_layer_as_raw_ptr(root_layer->children(), i),
+ for (size_t i = 0; i < layer->children().size(); ++i) {
+ CallFunctionForSubtree(get_layer_as_raw_ptr(layer->children(), i),
function);
}
}
diff --git a/cc/trees/layer_tree_host_common_unittest.cc b/cc/trees/layer_tree_host_common_unittest.cc
index 6f05035..6234d87 100644
--- a/cc/trees/layer_tree_host_common_unittest.cc
+++ b/cc/trees/layer_tree_host_common_unittest.cc
@@ -8812,5 +8812,43 @@
EXPECT_FALSE(grandchild->FilterIsAnimating());
}
+// Ensures that the property tree code accounts for offsets between fixed
+// position layers and their respective containers.
+TEST_F(LayerTreeHostCommonTest, PropertyTreesAccountForFixedParentOffset) {
+ scoped_refptr<Layer> root = Layer::Create();
+ scoped_refptr<Layer> child = Layer::Create();
+ scoped_refptr<LayerWithForcedDrawsContent> grandchild =
+ make_scoped_refptr(new LayerWithForcedDrawsContent());
+
+ root->AddChild(child);
+ child->AddChild(grandchild);
+
+ gfx::Transform identity_transform;
+ SetLayerPropertiesForTesting(root.get(), identity_transform, gfx::Point3F(),
+ gfx::PointF(), gfx::Size(50, 50), true, false);
+ SetLayerPropertiesForTesting(child.get(), identity_transform, gfx::Point3F(),
+ gfx::PointF(1000, 1000), gfx::Size(50, 50), true,
+ false);
+ SetLayerPropertiesForTesting(grandchild.get(), identity_transform,
+ gfx::Point3F(), gfx::PointF(-1000, -1000),
+ gfx::Size(50, 50), true, false);
+
+ root->SetMasksToBounds(true);
+ root->SetIsContainerForFixedPositionLayers(true);
+ LayerPositionConstraint constraint;
+ constraint.set_is_fixed_position(true);
+ grandchild->SetPositionConstraint(constraint);
+
+ root->SetIsContainerForFixedPositionLayers(true);
+
+ scoped_ptr<FakeLayerTreeHost> host(CreateFakeLayerTreeHost());
+ host->SetRootLayer(root);
+
+ ExecuteCalculateDrawProperties(root.get());
+
+ EXPECT_EQ(gfx::Rect(0, 0, 50, 50),
+ grandchild->visible_rect_from_property_trees());
+}
+
} // namespace
} // namespace cc
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
index eddbc60..2f4d9a9 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -241,12 +241,10 @@
TRACE_EVENT_OBJECT_CREATED_WITH_ID(
TRACE_DISABLED_BY_DEFAULT("cc.debug"), "cc::LayerTreeHostImpl", id_);
- if (settings.calculate_top_controls_position) {
- top_controls_manager_ =
- TopControlsManager::Create(this,
- settings.top_controls_show_threshold,
- settings.top_controls_hide_threshold);
- }
+ top_controls_manager_ =
+ TopControlsManager::Create(this,
+ settings.top_controls_show_threshold,
+ settings.top_controls_hide_threshold);
}
LayerTreeHostImpl::~LayerTreeHostImpl() {
@@ -916,8 +914,7 @@
}
void LayerTreeHostImpl::MainThreadHasStoppedFlinging() {
- if (top_controls_manager_)
- top_controls_manager_->MainThreadHasStoppedFlinging();
+ top_controls_manager_->MainThreadHasStoppedFlinging();
if (input_handler_client_)
input_handler_client_->MainThreadHasStoppedFlinging();
}
@@ -1423,12 +1420,10 @@
metadata.root_layer_size = active_tree_->ScrollableSize();
metadata.min_page_scale_factor = active_tree_->min_page_scale_factor();
metadata.max_page_scale_factor = active_tree_->max_page_scale_factor();
- if (top_controls_manager_) {
- metadata.location_bar_offset =
- gfx::Vector2dF(0.f, top_controls_manager_->ControlsTopOffset());
- metadata.location_bar_content_translation =
- gfx::Vector2dF(0.f, top_controls_manager_->ContentTopOffset());
- }
+ metadata.location_bar_offset =
+ gfx::Vector2dF(0.f, top_controls_manager_->ControlsTopOffset());
+ metadata.location_bar_content_translation =
+ gfx::Vector2dF(0.f, top_controls_manager_->ContentTopOffset());
active_tree_->GetViewportSelection(&metadata.selection_start,
&metadata.selection_end);
@@ -1453,10 +1448,6 @@
return metadata;
}
-static void LayerTreeHostImplDidBeginTracingCallback(LayerImpl* layer) {
- layer->DidBeginTracing();
-}
-
void LayerTreeHostImpl::DrawLayers(FrameData* frame,
base::TimeTicks frame_begin_time) {
TRACE_EVENT0("cc", "LayerTreeHostImpl::DrawLayers");
@@ -1506,11 +1497,11 @@
if (pending_tree_) {
LayerTreeHostCommon::CallFunctionForSubtree(
pending_tree_->root_layer(),
- base::Bind(&LayerTreeHostImplDidBeginTracingCallback));
+ [](LayerImpl* layer) { layer->DidBeginTracing(); });
}
LayerTreeHostCommon::CallFunctionForSubtree(
active_tree_->root_layer(),
- base::Bind(&LayerTreeHostImplDidBeginTracingCallback));
+ [](LayerImpl* layer) { layer->DidBeginTracing(); });
}
{
@@ -1662,7 +1653,7 @@
LayerImpl* inner_container = active_tree_->InnerViewportContainerLayer();
LayerImpl* outer_container = active_tree_->OuterViewportContainerLayer();
- if (!inner_container || !top_controls_manager_)
+ if (!inner_container)
return;
ViewportAnchor anchor(InnerViewportScrollLayer(),
@@ -2360,8 +2351,7 @@
InputHandler::ScrollInputType type) {
TRACE_EVENT0("cc", "LayerTreeHostImpl::ScrollBegin");
- if (top_controls_manager_)
- top_controls_manager_->ScrollBegin();
+ top_controls_manager_->ScrollBegin();
DCHECK(!CurrentlyScrollingLayer());
ClearCurrentlyScrollingLayer();
@@ -2572,9 +2562,6 @@
const gfx::Vector2dF& scroll_delta) const {
DCHECK(CurrentlyScrollingLayer());
- if (!top_controls_manager_)
- return false;
-
// Always consume if it's in the direction to show the top controls.
if (scroll_delta.y() < 0)
return true;
@@ -2815,8 +2802,7 @@
}
void LayerTreeHostImpl::ScrollEnd() {
- if (top_controls_manager_)
- top_controls_manager_->ScrollEnd();
+ top_controls_manager_->ScrollEnd();
ClearCurrentlyScrollingLayer();
}
@@ -2937,8 +2923,7 @@
active_tree_->SetCurrentlyScrollingLayer(
active_tree_->InnerViewportScrollLayer());
}
- if (top_controls_manager_)
- top_controls_manager_->PinchBegin();
+ top_controls_manager_->PinchBegin();
}
void LayerTreeHostImpl::PinchGestureUpdate(float magnify_delta,
@@ -2997,8 +2982,7 @@
pinch_gesture_end_should_clear_scrolling_layer_ = false;
ClearCurrentlyScrollingLayer();
}
- if (top_controls_manager_)
- top_controls_manager_->PinchEnd();
+ top_controls_manager_->PinchEnd();
client_->SetNeedsCommitOnImplThread();
// When a pinch ends, we may be displaying content cached at incorrect scales,
// so updating draw properties and drawing will ensure we are using the right
@@ -3093,7 +3077,7 @@
}
void LayerTreeHostImpl::AnimateTopControls(base::TimeTicks time) {
- if (!top_controls_manager_ || !top_controls_manager_->animation())
+ if (!top_controls_manager_->animation())
return;
gfx::Vector2dF scroll = top_controls_manager_->Animate(time);
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc
index b5e3a81..7ffa683 100644
--- a/cc/trees/layer_tree_host_impl_unittest.cc
+++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -2473,7 +2473,6 @@
: layer_size_(10, 10),
clip_size_(layer_size_),
top_controls_height_(50) {
- settings_.calculate_top_controls_position = true;
settings_.use_pinch_virtual_viewport = true;
viewport_size_ = gfx::Size(clip_size_.width(),
@@ -2484,7 +2483,7 @@
scoped_ptr<OutputSurface> output_surface) override {
bool init =
LayerTreeHostImplTest::CreateHostImpl(settings, output_surface.Pass());
- if (init && settings.calculate_top_controls_position) {
+ if (init) {
host_impl_->active_tree()->set_top_controls_height(top_controls_height_);
host_impl_->active_tree()->SetCurrentTopControlsShownRatio(1.f);
}
@@ -7426,7 +7425,6 @@
public:
void SetUp() override {
LayerTreeSettings settings = DefaultSettings();
- settings.calculate_top_controls_position = true;
CreateHostImpl(settings, CreateOutputSurface());
host_impl_->active_tree()->set_top_controls_height(top_controls_height_);
host_impl_->sync_tree()->set_top_controls_height(top_controls_height_);
diff --git a/cc/trees/layer_tree_host_pixeltest_masks.cc b/cc/trees/layer_tree_host_pixeltest_masks.cc
index eecc5a0..7b0e53b 100644
--- a/cc/trees/layer_tree_host_pixeltest_masks.cc
+++ b/cc/trees/layer_tree_host_pixeltest_masks.cc
@@ -282,6 +282,188 @@
#endif // !defined(OS_WIN)
+class CheckerContentLayerClient : public ContentLayerClient {
+ public:
+ CheckerContentLayerClient(const gfx::Size& bounds,
+ SkColor color,
+ bool vertical)
+ : bounds_(bounds), color_(color), vertical_(vertical) {}
+ ~CheckerContentLayerClient() override {}
+ bool FillsBoundsCompletely() const override { return false; }
+ void PaintContents(SkCanvas* canvas,
+ const gfx::Rect& rect,
+ PaintingControlSetting picture_control) override {
+ SkPaint paint;
+ paint.setStyle(SkPaint::kStroke_Style);
+ paint.setStrokeWidth(SkIntToScalar(4));
+ paint.setColor(color_);
+ canvas->clear(SK_ColorTRANSPARENT);
+ if (vertical_) {
+ for (int i = 4; i < bounds_.width(); i += 16) {
+ canvas->drawLine(i, 0, i, bounds_.height(), paint);
+ }
+ } else {
+ for (int i = 4; i < bounds_.height(); i += 16) {
+ canvas->drawLine(0, i, bounds_.width(), i, paint);
+ }
+ }
+ }
+ scoped_refptr<DisplayItemList> PaintContentsToDisplayList(
+ const gfx::Rect& clip,
+ PaintingControlSetting picture_control) override {
+ NOTIMPLEMENTED();
+ return DisplayItemList::Create();
+ }
+
+ private:
+ gfx::Size bounds_;
+ SkColor color_;
+ bool vertical_;
+};
+
+class CircleContentLayerClient : public ContentLayerClient {
+ public:
+ explicit CircleContentLayerClient(const gfx::Size& bounds)
+ : bounds_(bounds) {}
+ ~CircleContentLayerClient() override {}
+ bool FillsBoundsCompletely() const override { return false; }
+ void PaintContents(SkCanvas* canvas,
+ const gfx::Rect& rect,
+ PaintingControlSetting picture_control) override {
+ SkPaint paint;
+ paint.setStyle(SkPaint::kFill_Style);
+ paint.setColor(SK_ColorWHITE);
+ canvas->clear(SK_ColorTRANSPARENT);
+ canvas->drawCircle(bounds_.width() / 2,
+ bounds_.height() / 2,
+ bounds_.width() / 4,
+ paint);
+ }
+ scoped_refptr<DisplayItemList> PaintContentsToDisplayList(
+ const gfx::Rect& clip,
+ PaintingControlSetting picture_control) override {
+ NOTIMPLEMENTED();
+ return DisplayItemList::Create();
+ }
+
+ private:
+ gfx::Size bounds_;
+};
+
+using LayerTreeHostMasksForBackgroundFiltersPixelTest =
+ ParameterizedPixelResourceTest;
+
+INSTANTIATE_TEST_CASE_P(
+ PixelResourceTest,
+ LayerTreeHostMasksForBackgroundFiltersPixelTest,
+ ::testing::Values(
+ // SOFTWARE, Background filters aren't implemented in software
+ GL_GPU_RASTER_2D_DRAW,
+ GL_ONE_COPY_2D_STAGING_2D_DRAW,
+ GL_ONE_COPY_RECT_STAGING_2D_DRAW,
+ GL_ONE_COPY_EXTERNAL_STAGING_2D_DRAW,
+ GL_ZERO_COPY_2D_DRAW,
+ GL_ZERO_COPY_RECT_DRAW,
+ GL_ZERO_COPY_EXTERNAL_DRAW,
+ GL_ASYNC_UPLOAD_2D_DRAW));
+
+TEST_P(LayerTreeHostMasksForBackgroundFiltersPixelTest,
+ MaskOfLayerWithBackgroundFilter) {
+ scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
+ gfx::Rect(256, 256), SK_ColorWHITE);
+
+ gfx::Size picture_bounds(256, 256);
+ CheckerContentLayerClient picture_client(picture_bounds, SK_ColorGREEN, true);
+ scoped_refptr<PictureLayer> picture = PictureLayer::Create(&picture_client);
+ picture->SetBounds(picture_bounds);
+ picture->SetIsDrawable(true);
+
+ scoped_refptr<SolidColorLayer> blur = CreateSolidColorLayer(
+ gfx::Rect(256, 256), SK_ColorTRANSPARENT);
+ background->AddChild(picture);
+ background->AddChild(blur);
+
+ FilterOperations filters;
+ filters.Append(FilterOperation::CreateBlurFilter(2.f));
+ blur->SetBackgroundFilters(filters);
+
+ gfx::Size mask_bounds(256, 256);
+ CircleContentLayerClient mask_client(mask_bounds);
+ scoped_refptr<PictureLayer> mask = PictureLayer::Create(&mask_client);
+ mask->SetBounds(mask_bounds);
+ mask->SetIsDrawable(true);
+ mask->SetIsMask(true);
+ blur->SetMaskLayer(mask.get());
+
+ float percentage_pixels_large_error = 2.5f; // 2.5%, ~1600px / (256*256)
+ float percentage_pixels_small_error = 0.0f;
+ float average_error_allowed_in_bad_pixels = 60.0f;
+ int large_error_allowed = 100;
+ int small_error_allowed = 0;
+ pixel_comparator_.reset(new FuzzyPixelComparator(
+ true, // discard_alpha
+ percentage_pixels_large_error,
+ percentage_pixels_small_error,
+ average_error_allowed_in_bad_pixels,
+ large_error_allowed,
+ small_error_allowed));
+
+ RunPixelResourceTest(background,
+ base::FilePath(
+ FILE_PATH_LITERAL("mask_of_background_filter.png")));
+}
+
+TEST_P(LayerTreeHostMasksForBackgroundFiltersPixelTest,
+ MaskOfLayerWithBlend) {
+ scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(
+ gfx::Rect(256, 256), SK_ColorWHITE);
+
+ gfx::Size picture_bounds(256, 256);
+ CheckerContentLayerClient picture_client_vertical(
+ picture_bounds, SK_ColorGREEN, true);
+ scoped_refptr<PictureLayer> picture_vertical =
+ PictureLayer::Create(&picture_client_vertical);
+ picture_vertical->SetBounds(picture_bounds);
+ picture_vertical->SetIsDrawable(true);
+
+ CheckerContentLayerClient picture_client_horizontal(
+ picture_bounds, SK_ColorMAGENTA, false);
+ scoped_refptr<PictureLayer> picture_horizontal =
+ PictureLayer::Create(&picture_client_horizontal);
+ picture_horizontal->SetBounds(picture_bounds);
+ picture_horizontal->SetIsDrawable(true);
+ picture_horizontal->SetContentsOpaque(false);
+ picture_horizontal->SetBlendMode(SkXfermode::kMultiply_Mode);
+
+ background->AddChild(picture_vertical);
+ background->AddChild(picture_horizontal);
+
+ gfx::Size mask_bounds(256, 256);
+ CircleContentLayerClient mask_client(mask_bounds);
+ scoped_refptr<PictureLayer> mask = PictureLayer::Create(&mask_client);
+ mask->SetBounds(mask_bounds);
+ mask->SetIsDrawable(true);
+ mask->SetIsMask(true);
+ picture_horizontal->SetMaskLayer(mask.get());
+
+ float percentage_pixels_large_error = 0.01f; // 0.01%, ~6px / (256*256)
+ float percentage_pixels_small_error = 0.0f;
+ float average_error_allowed_in_bad_pixels = 256.0f;
+ int large_error_allowed = 256;
+ int small_error_allowed = 0;
+ pixel_comparator_.reset(new FuzzyPixelComparator(
+ true, // discard_alpha
+ percentage_pixels_large_error,
+ percentage_pixels_small_error,
+ average_error_allowed_in_bad_pixels,
+ large_error_allowed,
+ small_error_allowed));
+
+ RunPixelResourceTest(background,
+ base::FilePath(
+ FILE_PATH_LITERAL("mask_of_layer_with_blend.png")));
+}
+
} // namespace
} // namespace cc
diff --git a/cc/trees/layer_tree_host_unittest.cc b/cc/trees/layer_tree_host_unittest.cc
index f9b690d..1be61a5 100644
--- a/cc/trees/layer_tree_host_unittest.cc
+++ b/cc/trees/layer_tree_host_unittest.cc
@@ -1438,7 +1438,6 @@
// Verify that used texture is correct.
EXPECT_TRUE(context->UsedTexture(context->TextureAt(0)));
EXPECT_TRUE(context->UsedTexture(context->TextureAt(1)));
- context->ResetUsedTextures();
break;
case 1:
// Number of textures should be doubled as the first context layer
@@ -1456,7 +1455,6 @@
// New textures should have been used.
EXPECT_TRUE(context->UsedTexture(context->TextureAt(2)));
EXPECT_TRUE(context->UsedTexture(context->TextureAt(3)));
- context->ResetUsedTextures();
break;
case 2:
EndTest();
@@ -2656,8 +2654,8 @@
GLenum type,
GLintptr offset));
MOCK_METHOD1(deleteTexture, void(GLenum texture));
- MOCK_METHOD2(produceTextureCHROMIUM,
- void(GLenum target, const GLbyte* mailbox));
+ MOCK_METHOD3(produceTextureDirectCHROMIUM,
+ void(GLuint texture, GLenum target, const GLbyte* mailbox));
};
class LayerTreeHostTestIOSurfaceDrawing : public LayerTreeHostTest {
@@ -2747,12 +2745,10 @@
resource_provider->TargetForTesting(
io_surface_draw_quad->io_surface_resource_id));
- EXPECT_CALL(*mock_context_, bindTexture(GL_TEXTURE_RECTANGLE_ARB, 1))
- .Times(1);
if (delegating_renderer()) {
// The io surface layer's resource should be sent to the parent.
- EXPECT_CALL(*mock_context_,
- produceTextureCHROMIUM(GL_TEXTURE_RECTANGLE_ARB, _)).Times(1);
+ EXPECT_CALL(*mock_context_, produceTextureDirectCHROMIUM(
+ _, GL_TEXTURE_RECTANGLE_ARB, _)).Times(1);
} else {
// The io surface layer's texture is drawn.
EXPECT_CALL(*mock_context_, activeTexture(GL_TEXTURE0)).Times(AtLeast(1));
diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc
index 62e4cd3..5114fdc 100644
--- a/cc/trees/layer_tree_impl.cc
+++ b/cc/trees/layer_tree_impl.cc
@@ -121,13 +121,18 @@
}
void LayerTreeImpl::ReleaseResources() {
- if (root_layer_)
- ProcessLayersRecursive(root_layer_.get(), &LayerImpl::ReleaseResources);
+ if (root_layer_) {
+ LayerTreeHostCommon::CallFunctionForSubtree(
+ root_layer_.get(), [](LayerImpl* layer) { layer->ReleaseResources(); });
+ }
}
void LayerTreeImpl::RecreateResources() {
- if (root_layer_)
- ProcessLayersRecursive(root_layer_.get(), &LayerImpl::RecreateResources);
+ if (root_layer_) {
+ LayerTreeHostCommon::CallFunctionForSubtree(
+ root_layer_.get(),
+ [](LayerImpl* layer) { layer->RecreateResources(); });
+ }
}
void LayerTreeImpl::SetRootLayer(scoped_ptr<LayerImpl> layer) {
@@ -475,10 +480,6 @@
gfx::Rect(layer->content_bounds()));
}
-static void ApplySentScrollDeltasFromAbortedCommitTo(LayerImpl* layer) {
- layer->ApplySentScrollDeltasFromAbortedCommit();
-}
-
void LayerTreeImpl::ApplySentScrollAndScaleDeltasFromAbortedCommit() {
DCHECK(IsActiveTree());
@@ -490,7 +491,9 @@
return;
LayerTreeHostCommon::CallFunctionForSubtree(
- root_layer(), base::Bind(&ApplySentScrollDeltasFromAbortedCommitTo));
+ root_layer(), [](LayerImpl* layer) {
+ layer->ApplySentScrollDeltasFromAbortedCommit();
+ });
}
void LayerTreeImpl::SetViewportLayersFromIds(
@@ -748,17 +751,6 @@
currently_scrolling_layer_ ? currently_scrolling_layer_->id() : 0));
}
-static void DidBecomeActiveRecursive(LayerImpl* layer) {
- layer->DidBecomeActive();
- if (layer->mask_layer())
- layer->mask_layer()->DidBecomeActive();
- if (layer->replica_layer() && layer->replica_layer()->mask_layer())
- layer->replica_layer()->mask_layer()->DidBecomeActive();
-
- for (size_t i = 0; i < layer->children().size(); ++i)
- DidBecomeActiveRecursive(layer->children()[i]);
-}
-
void LayerTreeImpl::DidBecomeActive() {
if (next_activation_forces_redraw_) {
layer_tree_host_impl_->SetFullRootLayerDamage();
@@ -774,8 +766,10 @@
// if we were in a good state.
layer_tree_host_impl_->ResetRequiresHighResToDraw();
- if (root_layer())
- DidBecomeActiveRecursive(root_layer());
+ if (root_layer()) {
+ LayerTreeHostCommon::CallFunctionForSubtree(
+ root_layer(), [](LayerImpl* layer) { layer->DidBecomeActive(); });
+ }
devtools_instrumentation::DidActivateLayerTree(layer_tree_host_impl_->id(),
source_frame_number_);
@@ -1267,18 +1261,6 @@
return layers_with_copy_output_request_;
}
-void LayerTreeImpl::ProcessLayersRecursive(LayerImpl* current,
- void (LayerImpl::*function)()) {
- DCHECK(current);
- (current->*function)();
- if (current->mask_layer())
- ProcessLayersRecursive(current->mask_layer(), function);
- if (current->replica_layer())
- ProcessLayersRecursive(current->replica_layer(), function);
- for (size_t i = 0; i < current->children().size(); ++i)
- ProcessLayersRecursive(current->children()[i], function);
-}
-
template <typename LayerType>
static inline bool LayerClipsSubtree(LayerType* layer) {
return layer->masks_to_bounds() || layer->mask_layer();
diff --git a/cc/trees/layer_tree_impl.h b/cc/trees/layer_tree_impl.h
index f7b6ee4..3105e6f 100644
--- a/cc/trees/layer_tree_impl.h
+++ b/cc/trees/layer_tree_impl.h
@@ -335,8 +335,6 @@
scoped_refptr<SyncedProperty<ScaleGroup>> page_scale_factor,
scoped_refptr<SyncedTopControls> top_controls_shown_ratio,
scoped_refptr<SyncedElasticOverscroll> elastic_overscroll);
- void ProcessLayersRecursive(LayerImpl* current,
- void (LayerImpl::*function)());
float ClampPageScaleFactorToLimits(float page_scale_factor) const;
void PushPageScaleFactorAndLimits(const float* page_scale_factor,
float min_page_scale_factor,
diff --git a/cc/trees/layer_tree_settings.cc b/cc/trees/layer_tree_settings.cc
index 9d605ae..0088e91 100644
--- a/cc/trees/layer_tree_settings.cc
+++ b/cc/trees/layer_tree_settings.cc
@@ -39,7 +39,6 @@
scrollbar_fade_duration_ms(0),
scrollbar_show_scale_threshold(1.0f),
solid_color_scrollbar_color(SK_ColorWHITE),
- calculate_top_controls_position(false),
timeout_and_draw_when_animation_checkerboards(true),
maximum_number_of_failed_draws_before_draw_is_forced_(3),
layer_transforms_should_scale_layer_contents(false),
diff --git a/cc/trees/layer_tree_settings.h b/cc/trees/layer_tree_settings.h
index 06c319a..ce8d856 100644
--- a/cc/trees/layer_tree_settings.h
+++ b/cc/trees/layer_tree_settings.h
@@ -51,7 +51,6 @@
int scrollbar_fade_duration_ms;
float scrollbar_show_scale_threshold;
SkColor solid_color_scrollbar_color;
- bool calculate_top_controls_position;
bool timeout_and_draw_when_animation_checkerboards;
int maximum_number_of_failed_draws_before_draw_is_forced_;
bool layer_transforms_should_scale_layer_contents;
diff --git a/cc/trees/property_tree_builder.cc b/cc/trees/property_tree_builder.cc
index 0c080dd..6f3f792 100644
--- a/cc/trees/property_tree_builder.cc
+++ b/cc/trees/property_tree_builder.cc
@@ -128,10 +128,9 @@
layer->should_flatten_transform() &&
!layer->parent()->should_flatten_transform();
- bool requires_node = is_root || is_scrollable || is_fixed ||
- has_significant_transform || has_animated_transform ||
- is_page_scale_application_layer || flattening_change ||
- has_surface;
+ bool requires_node = is_root || is_scrollable || has_significant_transform ||
+ has_animated_transform || has_surface ||
+ is_page_scale_application_layer || flattening_change;
Layer* transform_parent = GetTransformParent(data_from_ancestor, layer);
@@ -139,8 +138,21 @@
gfx::Vector2dF parent_offset;
if (transform_parent) {
// TODO(vollick): This is to mimic existing bugs (crbug.com/441447).
- if (!is_fixed)
+ if (!is_fixed) {
parent_offset = transform_parent->offset_to_transform_parent();
+ } else if (data_from_ancestor.transform_tree_parent !=
+ data_from_ancestor.transform_fixed_parent) {
+ gfx::Vector2dF fixed_offset = data_from_ancestor.transform_tree_parent
+ ->offset_to_transform_parent();
+ gfx::Transform parent_to_parent;
+ data_from_ancestor.transform_tree->ComputeTransform(
+ data_from_ancestor.transform_tree_parent->transform_tree_index(),
+ data_from_ancestor.transform_fixed_parent->transform_tree_index(),
+ &parent_to_parent);
+
+ fixed_offset += parent_to_parent.To2dTranslation();
+ parent_offset += fixed_offset;
+ }
gfx::Transform to_parent;
Layer* source = data_from_ancestor.transform_tree_parent;
diff --git a/cc/trees/single_thread_proxy.cc b/cc/trees/single_thread_proxy.cc
index e45b182..401a4b8 100644
--- a/cc/trees/single_thread_proxy.cc
+++ b/cc/trees/single_thread_proxy.cc
@@ -104,7 +104,6 @@
scheduler_settings,
layer_tree_host_->id(),
MainThreadTaskRunner(),
- base::PowerMonitor::Get(),
external_begin_frame_source_.Pass());
scheduler_on_impl_thread_->SetCanStart();
scheduler_on_impl_thread_->SetVisible(layer_tree_host_impl_->visible());
diff --git a/cc/trees/thread_proxy.cc b/cc/trees/thread_proxy.cc
index 4efb401..8c766f2 100644
--- a/cc/trees/thread_proxy.cc
+++ b/cc/trees/thread_proxy.cc
@@ -1171,7 +1171,6 @@
scheduler_settings,
impl().layer_tree_host_id,
ImplThreadTaskRunner(),
- base::PowerMonitor::Get(),
impl().external_begin_frame_source.Pass());
impl().scheduler->SetVisible(impl().layer_tree_host_impl->visible());
impl_thread_weak_ptr_ = impl().weak_factory.GetWeakPtr();
diff --git a/examples/bitmap_uploader/bitmap_uploader.h b/examples/bitmap_uploader/bitmap_uploader.h
index d7c84c2..56d06dd 100644
--- a/examples/bitmap_uploader/bitmap_uploader.h
+++ b/examples/bitmap_uploader/bitmap_uploader.h
@@ -22,7 +22,7 @@
class BitmapUploader : public ResourceReturner {
public:
explicit BitmapUploader(View* view);
- virtual ~BitmapUploader();
+ ~BitmapUploader() override;
void Init(Shell* shell);
diff --git a/examples/browser/browser.cc b/examples/browser/browser.cc
index 527cbb9..22c6f1e 100644
--- a/examples/browser/browser.cc
+++ b/examples/browser/browser.cc
@@ -39,7 +39,7 @@
browser_host_services_impl_.AddService(this);
}
- virtual ~Browser() {
+ ~Browser() override {
if (root_)
root_->RemoveObserver(this);
}
diff --git a/examples/content_handler_demo/content_handler_demo.cc b/examples/content_handler_demo/content_handler_demo.cc
index 29166f8..e0081ee 100644
--- a/examples/content_handler_demo/content_handler_demo.cc
+++ b/examples/content_handler_demo/content_handler_demo.cc
@@ -21,17 +21,17 @@
ScopedDataPipeConsumerHandle body)
: binding_(this, request.Pass()), body_(body.Pass()) {}
- virtual void Initialize(ShellPtr shell,
- Array<String> args,
- const mojo::String& url) override {
+ void Initialize(ShellPtr shell,
+ Array<String> args,
+ const mojo::String& url) override {
shell_ = shell.Pass();
}
- virtual void RequestQuit() override {}
+ void RequestQuit() override {}
- virtual void AcceptConnection(const String& requestor_url,
- InterfaceRequest<ServiceProvider> services,
- ServiceProviderPtr exported_services,
- const String& url) override {
+ void AcceptConnection(const String& requestor_url,
+ InterfaceRequest<ServiceProvider> services,
+ ServiceProviderPtr exported_services,
+ const String& url) override {
printf(
"ContentHandler::OnConnect - url:%s - requestor_url:%s - body "
"follows\n\n",
diff --git a/examples/echo/echo_client.cc b/examples/echo/echo_client.cc
index 5e18a07..36b0fd3 100644
--- a/examples/echo/echo_client.cc
+++ b/examples/echo/echo_client.cc
@@ -25,7 +25,7 @@
class EchoClientDelegate : public ApplicationDelegate {
public:
- virtual void Initialize(ApplicationImpl* app) override {
+ void Initialize(ApplicationImpl* app) override {
app->ConnectToService("mojo:echo_server", &echo_);
echo_->EchoString("hello world", ResponsePrinter());
diff --git a/examples/embedded_app/embedded_app.cc b/examples/embedded_app/embedded_app.cc
index cc3d6b0..e1ddcd0 100644
--- a/examples/embedded_app/embedded_app.cc
+++ b/examples/embedded_app/embedded_app.cc
@@ -50,43 +50,42 @@
public ViewObserver {
public:
EmbeddedApp() : shell_(nullptr) { url::AddStandardScheme("mojo"); }
- virtual ~EmbeddedApp() {}
+ ~EmbeddedApp() override {}
private:
// Overridden from ApplicationDelegate:
- virtual void Initialize(ApplicationImpl* app) override {
+ void Initialize(ApplicationImpl* app) override {
shell_ = app->shell();
view_manager_client_factory_.reset(
new ViewManagerClientFactory(app->shell(), this));
}
- virtual bool ConfigureIncomingConnection(
- ApplicationConnection* connection) override {
+ bool ConfigureIncomingConnection(ApplicationConnection* connection) override {
connection->AddService(view_manager_client_factory_.get());
return true;
}
// Overridden from ViewManagerDelegate:
- virtual void OnEmbed(View* root,
- InterfaceRequest<ServiceProvider> services,
- ServiceProviderPtr exposed_services) override {
+ void OnEmbed(View* root,
+ InterfaceRequest<ServiceProvider> services,
+ ServiceProviderPtr exposed_services) override {
root->AddObserver(this);
Window* window = new Window(root, exposed_services.Pass(), shell_);
windows_[root->id()] = window;
window->bitmap_uploader.SetColor(
kColors[next_color_++ % arraysize(kColors)]);
}
- virtual void OnViewManagerDisconnected(ViewManager* view_manager) override {
+ void OnViewManagerDisconnected(ViewManager* view_manager) override {
base::MessageLoop::current()->Quit();
}
// Overridden from ViewObserver:
- virtual void OnViewDestroyed(View* view) override {
+ void OnViewDestroyed(View* view) override {
DCHECK(windows_.find(view->id()) != windows_.end());
windows_.erase(view->id());
}
- virtual void OnViewInputEvent(View* view, const EventPtr& event) override {
+ void OnViewInputEvent(View* view, const EventPtr& event) override {
if (event->action == EVENT_TYPE_MOUSE_RELEASED) {
if (event->flags & EVENT_FLAGS_LEFT_MOUSE_BUTTON) {
URLRequestPtr request(URLRequest::New());
diff --git a/examples/forwarding_content_handler/forwarding_content_handler.cc b/examples/forwarding_content_handler/forwarding_content_handler.cc
index fbee750..b394f99 100644
--- a/examples/forwarding_content_handler/forwarding_content_handler.cc
+++ b/examples/forwarding_content_handler/forwarding_content_handler.cc
@@ -57,14 +57,13 @@
private:
// Overridden from ApplicationDelegate:
- virtual bool ConfigureIncomingConnection(
- ApplicationConnection* connection) override {
+ bool ConfigureIncomingConnection(ApplicationConnection* connection) override {
connection->AddService(&content_handler_factory_);
return true;
}
// Overridden from ContentHandlerFactory::ManagedDelegate:
- virtual scoped_ptr<ContentHandlerFactory::HandledApplicationHolder>
+ scoped_ptr<ContentHandlerFactory::HandledApplicationHolder>
CreateApplication(InterfaceRequest<Application> application_request,
URLResponsePtr response) override {
CHECK(!response.is_null());
diff --git a/examples/ganesh_app/ganesh_app.cc b/examples/ganesh_app/ganesh_app.cc
index 0896fb4..9c860cc 100644
--- a/examples/ganesh_app/ganesh_app.cc
+++ b/examples/ganesh_app/ganesh_app.cc
@@ -19,7 +19,7 @@
public mojo::ViewManagerDelegate {
public:
GaneshApp() {}
- virtual ~GaneshApp() {}
+ ~GaneshApp() override {}
void Initialize(mojo::ApplicationImpl* app) override {
shell_ = app->shell();
diff --git a/examples/ganesh_app/ganesh_view.h b/examples/ganesh_app/ganesh_view.h
index a066bcd..d072893 100644
--- a/examples/ganesh_app/ganesh_view.h
+++ b/examples/ganesh_app/ganesh_view.h
@@ -20,7 +20,7 @@
class GaneshView : public TextureUploader::Client, public mojo::ViewObserver {
public:
GaneshView(mojo::Shell* shell, mojo::View* view);
- ~GaneshView();
+ ~GaneshView() override;
private:
void OnViewDestroyed(mojo::View* view) override;
diff --git a/examples/ganesh_app/texture_uploader.h b/examples/ganesh_app/texture_uploader.h
index 01374c5..20fc6da 100644
--- a/examples/ganesh_app/texture_uploader.h
+++ b/examples/ganesh_app/texture_uploader.h
@@ -34,7 +34,7 @@
TextureUploader(Client* client,
mojo::Shell* shell,
base::WeakPtr<mojo::GLContext> context);
- ~TextureUploader();
+ ~TextureUploader() override;
void Upload(scoped_ptr<mojo::GLTexture> texture);
diff --git a/examples/nesting_app/nesting_app.cc b/examples/nesting_app/nesting_app.cc
index 7d45df2..5b00f6d 100644
--- a/examples/nesting_app/nesting_app.cc
+++ b/examples/nesting_app/nesting_app.cc
@@ -39,28 +39,27 @@
public ViewObserver {
public:
NestingApp() : nested_(nullptr), shell_(nullptr) {}
- virtual ~NestingApp() {}
+ ~NestingApp() override {}
private:
// Overridden from ApplicationDelegate:
- virtual void Initialize(ApplicationImpl* app) override {
+ void Initialize(ApplicationImpl* app) override {
shell_ = app->shell();
view_manager_client_factory_.reset(
new ViewManagerClientFactory(app->shell(), this));
}
// Overridden from ApplicationImpl:
- virtual bool ConfigureIncomingConnection(
- ApplicationConnection* connection) override {
+ bool ConfigureIncomingConnection(ApplicationConnection* connection) override {
connection->ConnectToService(&window_manager_);
connection->AddService(view_manager_client_factory_.get());
return true;
}
// Overridden from ViewManagerDelegate:
- virtual void OnEmbed(View* root,
- InterfaceRequest<ServiceProvider> services,
- ServiceProviderPtr exposed_services) override {
+ void OnEmbed(View* root,
+ InterfaceRequest<ServiceProvider> services,
+ ServiceProviderPtr exposed_services) override {
root->AddObserver(this);
bitmap_uploader_.reset(new BitmapUploader(root));
bitmap_uploader_->Init(shell_);
@@ -75,16 +74,16 @@
nested_->SetVisible(true);
nested_->Embed(kEmbeddedAppURL);
}
- virtual void OnViewManagerDisconnected(ViewManager* view_manager) override {
- base::MessageLoop::current()->Quit();
+ void OnViewManagerDisconnected(ViewManager* view_manager) override {
+ base::MessageLoop::current()->Quit();
}
// Overridden from ViewObserver:
- virtual void OnViewDestroyed(View* view) override {
+ void OnViewDestroyed(View* view) override {
// TODO(beng): reap views & child Views.
nested_ = NULL;
}
- virtual void OnViewInputEvent(View* view, const EventPtr& event) override {
+ void OnViewInputEvent(View* view, const EventPtr& event) override {
if (event->action == EVENT_TYPE_MOUSE_RELEASED)
window_manager_->CloseWindow(view->id());
}
diff --git a/examples/pdf_viewer/pdf_viewer.cc b/examples/pdf_viewer/pdf_viewer.cc
index 8fb502d..bd9ff04 100644
--- a/examples/pdf_viewer/pdf_viewer.cc
+++ b/examples/pdf_viewer/pdf_viewer.cc
@@ -58,7 +58,7 @@
FetchPDF(response.Pass());
}
- virtual ~PDFView() {
+ ~PDFView() override {
if (doc_)
FPDF_CloseDocument(doc_);
for (auto& roots : embedder_for_roots_) {
@@ -69,22 +69,21 @@
private:
// Overridden from ApplicationDelegate:
- virtual void Initialize(ApplicationImpl* app) override {
+ void Initialize(ApplicationImpl* app) override {
app_ = app;
view_manager_client_factory_.reset(
new ViewManagerClientFactory(app->shell(), this));
}
- virtual bool ConfigureIncomingConnection(
- ApplicationConnection* connection) override {
+ bool ConfigureIncomingConnection(ApplicationConnection* connection) override {
connection->AddService(view_manager_client_factory_.get());
return true;
}
// Overridden from ViewManagerDelegate:
- virtual void OnEmbed(View* root,
- InterfaceRequest<ServiceProvider> services,
- ServiceProviderPtr exposed_services) override {
+ void OnEmbed(View* root,
+ InterfaceRequest<ServiceProvider> services,
+ ServiceProviderPtr exposed_services) override {
DCHECK(embedder_for_roots_.find(root) == embedder_for_roots_.end());
root->AddObserver(this);
EmbedderData* embedder_data = new EmbedderData(app_->shell(), root);
@@ -92,17 +91,17 @@
DrawBitmap(embedder_data);
}
- virtual void OnViewManagerDisconnected(ViewManager* view_manager) override {}
+ void OnViewManagerDisconnected(ViewManager* view_manager) override {}
// Overridden from ViewObserver:
- virtual void OnViewBoundsChanged(View* view,
- const Rect& old_bounds,
- const Rect& new_bounds) override {
+ void OnViewBoundsChanged(View* view,
+ const Rect& old_bounds,
+ const Rect& new_bounds) override {
DCHECK(embedder_for_roots_.find(view) != embedder_for_roots_.end());
DrawBitmap(embedder_for_roots_[view]);
}
- virtual void OnViewInputEvent(View* view, const EventPtr& event) override {
+ void OnViewInputEvent(View* view, const EventPtr& event) override {
DCHECK(embedder_for_roots_.find(view) != embedder_for_roots_.end());
if (event->key_data &&
(event->action != EVENT_TYPE_KEY_PRESSED || event->key_data->is_char)) {
@@ -125,7 +124,7 @@
}
}
- virtual void OnViewDestroyed(View* view) override {
+ void OnViewDestroyed(View* view) override {
DCHECK(embedder_for_roots_.find(view) != embedder_for_roots_.end());
const auto& it = embedder_for_roots_.find(view);
DCHECK(it != embedder_for_roots_.end());
@@ -218,18 +217,17 @@
FPDF_InitLibrary();
}
- virtual ~PDFViewer() { FPDF_DestroyLibrary(); }
+ ~PDFViewer() override { FPDF_DestroyLibrary(); }
private:
// Overridden from ApplicationDelegate:
- virtual bool ConfigureIncomingConnection(
- ApplicationConnection* connection) override {
+ bool ConfigureIncomingConnection(ApplicationConnection* connection) override {
connection->AddService(&content_handler_factory_);
return true;
}
// Overridden from ContentHandlerFactory::ManagedDelegate:
- virtual scoped_ptr<ContentHandlerFactory::HandledApplicationHolder>
+ scoped_ptr<ContentHandlerFactory::HandledApplicationHolder>
CreateApplication(InterfaceRequest<Application> application_request,
URLResponsePtr response) override {
return make_handled_factory_holder(new mojo::ApplicationImpl(
diff --git a/examples/png_viewer/png_viewer.cc b/examples/png_viewer/png_viewer.cc
index e929cdb..8e0be4d 100644
--- a/examples/png_viewer/png_viewer.cc
+++ b/examples/png_viewer/png_viewer.cc
@@ -62,7 +62,7 @@
DecodePNG(response.Pass());
}
- virtual ~PNGView() {
+ ~PNGView() override {
for (auto& roots : embedder_for_roots_) {
roots.first->RemoveObserver(this);
delete roots.second;
@@ -76,23 +76,23 @@
static const uint16_t kZoomStep = 20;
// Overridden from ApplicationDelegate:
- virtual void Initialize(ApplicationImpl* app) override {
+ void Initialize(ApplicationImpl* app) override {
app_ = app;
view_manager_client_factory_.reset(
new ViewManagerClientFactory(app->shell(), this));
}
// Overridden from ApplicationDelegate:
- virtual bool ConfigureIncomingConnection(
+ bool ConfigureIncomingConnection(
ApplicationConnection* connection) override {
connection->AddService(view_manager_client_factory_.get());
return true;
}
// Overridden from ViewManagerDelegate:
- virtual void OnEmbed(View* root,
- InterfaceRequest<ServiceProvider> services,
- ServiceProviderPtr exposed_services) override {
+ void OnEmbed(View* root,
+ InterfaceRequest<ServiceProvider> services,
+ ServiceProviderPtr exposed_services) override {
// TODO(qsr): The same view should be embeddable on multiple views.
DCHECK(embedder_for_roots_.find(root) == embedder_for_roots_.end());
root->AddObserver(this);
@@ -104,17 +104,17 @@
BitmapUploader::BGRA);
}
- virtual void OnViewManagerDisconnected(ViewManager* view_manager) override {
+ void OnViewManagerDisconnected(ViewManager* view_manager) override {
}
// Overridden from ViewObserver:
- virtual void OnViewBoundsChanged(View* view,
- const Rect& old_bounds,
- const Rect& new_bounds) override {
+ void OnViewBoundsChanged(View* view,
+ const Rect& old_bounds,
+ const Rect& new_bounds) override {
DCHECK(embedder_for_roots_.find(view) != embedder_for_roots_.end());
}
- virtual void OnViewDestroyed(View* view) override {
+ void OnViewDestroyed(View* view) override {
// TODO(aa): Need to figure out how shutdown works.
const auto& it = embedder_for_roots_.find(view);
DCHECK(it != embedder_for_roots_.end());
@@ -202,14 +202,13 @@
private:
// Overridden from ApplicationDelegate:
- virtual bool ConfigureIncomingConnection(
- ApplicationConnection* connection) override {
+ bool ConfigureIncomingConnection(ApplicationConnection* connection) override {
connection->AddService(&content_handler_factory_);
return true;
}
// Overridden from ContentHandlerFactory::ManagedDelegate:
- virtual scoped_ptr<ContentHandlerFactory::HandledApplicationHolder>
+ scoped_ptr<ContentHandlerFactory::HandledApplicationHolder>
CreateApplication(InterfaceRequest<Application> application_request,
URLResponsePtr response) override {
return make_handled_factory_holder(new mojo::ApplicationImpl(
diff --git a/examples/recursive_content_handler/recursive_content_handler.cc b/examples/recursive_content_handler/recursive_content_handler.cc
index 42a73f8..f93c427 100644
--- a/examples/recursive_content_handler/recursive_content_handler.cc
+++ b/examples/recursive_content_handler/recursive_content_handler.cc
@@ -23,14 +23,14 @@
private:
// Overridden from ApplicationDelegate:
- virtual bool ConfigureIncomingConnection(
+ bool ConfigureIncomingConnection(
ApplicationConnection* connection) override {
connection->AddService(&content_handler_factory_);
return true;
}
// Overridden from ContentHandlerFactory::ManagedDelegate:
- virtual scoped_ptr<ContentHandlerFactory::HandledApplicationHolder>
+ scoped_ptr<ContentHandlerFactory::HandledApplicationHolder>
CreateApplication(InterfaceRequest<Application> application_request,
URLResponsePtr response) override {
LOG(INFO) << "RecursiveContentHandler called with url: " << response->url;
diff --git a/examples/sky_compositor_app/sky_compositor_app.cc b/examples/sky_compositor_app/sky_compositor_app.cc
index 1a72095..dd4589d 100644
--- a/examples/sky_compositor_app/sky_compositor_app.cc
+++ b/examples/sky_compositor_app/sky_compositor_app.cc
@@ -35,7 +35,7 @@
public sky::LayerHostClient {
public:
SkyCompositorApp() : shell_(nullptr), view_(nullptr) {}
- virtual ~SkyCompositorApp() {}
+ ~SkyCompositorApp() override {}
void Initialize(mojo::ApplicationImpl* app) override {
shell_ = app->shell();
diff --git a/examples/surfaces_app/child_app.cc b/examples/surfaces_app/child_app.cc
index f154536..0344610 100644
--- a/examples/surfaces_app/child_app.cc
+++ b/examples/surfaces_app/child_app.cc
@@ -17,23 +17,22 @@
class ChildApp : public ApplicationDelegate, public InterfaceFactory<Child> {
public:
ChildApp() {}
- virtual ~ChildApp() {}
+ ~ChildApp() override {}
- virtual void Initialize(ApplicationImpl* app) override {
+ void Initialize(ApplicationImpl* app) override {
surfaces_service_connection_ =
app->ConnectToApplication("mojo:surfaces_service");
}
// ApplicationDelegate implementation.
- virtual bool ConfigureIncomingConnection(
- ApplicationConnection* connection) override {
+ bool ConfigureIncomingConnection(ApplicationConnection* connection) override {
connection->AddService(this);
return true;
}
// InterfaceFactory<Child> implementation.
- virtual void Create(ApplicationConnection* connection,
- InterfaceRequest<Child> request) override {
+ void Create(ApplicationConnection* connection,
+ InterfaceRequest<Child> request) override {
new ChildImpl(surfaces_service_connection_, request.Pass());
}
diff --git a/examples/surfaces_app/child_gl_app.cc b/examples/surfaces_app/child_gl_app.cc
index 5630b24..77c8561 100644
--- a/examples/surfaces_app/child_gl_app.cc
+++ b/examples/surfaces_app/child_gl_app.cc
@@ -19,9 +19,9 @@
class ChildGLApp : public ApplicationDelegate, public InterfaceFactory<Child> {
public:
ChildGLApp() {}
- virtual ~ChildGLApp() {}
+ ~ChildGLApp() override {}
- virtual void Initialize(ApplicationImpl* app) override {
+ void Initialize(ApplicationImpl* app) override {
surfaces_service_connection_ =
app->ConnectToApplication("mojo:surfaces_service");
// TODO(jamesr): Should be mojo:gpu_service
@@ -29,15 +29,15 @@
}
// ApplicationDelegate implementation.
- virtual bool ConfigureIncomingConnection(
+ bool ConfigureIncomingConnection(
ApplicationConnection* connection) override {
connection->AddService(this);
return true;
}
// InterfaceFactory<Child> implementation.
- virtual void Create(ApplicationConnection* connection,
- InterfaceRequest<Child> request) override {
+ void Create(ApplicationConnection* connection,
+ InterfaceRequest<Child> request) override {
CommandBufferPtr command_buffer;
gpu_service_->CreateOffscreenGLES2Context(GetProxy(&command_buffer));
new ChildGLImpl(surfaces_service_connection_, command_buffer.Pass(),
diff --git a/examples/wget/wget.cc b/examples/wget/wget.cc
index 3db71f4..455bf77 100644
--- a/examples/wget/wget.cc
+++ b/examples/wget/wget.cc
@@ -71,7 +71,7 @@
class WGetApp : public ApplicationDelegate {
public:
- virtual void Initialize(ApplicationImpl* app) override {
+ void Initialize(ApplicationImpl* app) override {
app->ConnectToService("mojo:network_service", &network_service_);
Start(app->args());
}
diff --git a/examples/window_manager/window_manager.cc b/examples/window_manager/window_manager.cc
index fe57255..d363ab9 100644
--- a/examples/window_manager/window_manager.cc
+++ b/examples/window_manager/window_manager.cc
@@ -287,8 +287,7 @@
window_manager_app_->Initialize(app);
}
- virtual bool ConfigureIncomingConnection(
- ApplicationConnection* connection) override {
+ bool ConfigureIncomingConnection(ApplicationConnection* connection) override {
connection->AddService<IWindowManager>(this);
window_manager_app_->ConfigureIncomingConnection(connection);
return true;
diff --git a/examples/wm_flow/app/app.cc b/examples/wm_flow/app/app.cc
index 8827191..dcb7ee2 100644
--- a/examples/wm_flow/app/app.cc
+++ b/examples/wm_flow/app/app.cc
@@ -85,13 +85,13 @@
public mojo::ViewObserver {
public:
WMFlowApp() : shell_(nullptr), embed_count_(0) {}
- virtual ~WMFlowApp() { STLDeleteValues(&uploaders_); }
+ ~WMFlowApp() override { STLDeleteValues(&uploaders_); }
private:
typedef std::map<mojo::View*, mojo::BitmapUploader*> ViewToUploader;
// Overridden from ApplicationDelegate:
- virtual void Initialize(mojo::ApplicationImpl* app) override {
+ void Initialize(mojo::ApplicationImpl* app) override {
shell_ = app->shell();
view_manager_client_factory_.reset(
new mojo::ViewManagerClientFactory(app->shell(), this));
@@ -103,16 +103,16 @@
OpenNewWindow();
OpenNewWindow();
}
- virtual bool ConfigureIncomingConnection(
+ bool ConfigureIncomingConnection(
mojo::ApplicationConnection* connection) override {
connection->AddService(view_manager_client_factory_.get());
return true;
}
// Overridden from mojo::ViewManagerDelegate:
- virtual void OnEmbed(mojo::View* root,
- mojo::InterfaceRequest<mojo::ServiceProvider> services,
- mojo::ServiceProviderPtr exposed_services) override {
+ void OnEmbed(mojo::View* root,
+ mojo::InterfaceRequest<mojo::ServiceProvider> services,
+ mojo::ServiceProviderPtr exposed_services) override {
root->AddObserver(this);
mojo::BitmapUploader* uploader = new mojo::BitmapUploader(root);
uploaders_[root] = uploader;
@@ -148,20 +148,19 @@
embeddee_->HelloBack(base::Bind(&WMFlowApp::HelloBackAck,
base::Unretained(this)));
}
- virtual void OnViewManagerDisconnected(
- mojo::ViewManager* view_manager) override {
+ void OnViewManagerDisconnected(mojo::ViewManager* view_manager) override {
STLDeleteValues(&uploaders_);
}
// Overridden from mojo::ViewObserver:
- virtual void OnViewInputEvent(mojo::View* view,
- const mojo::EventPtr& event) override {
+ void OnViewInputEvent(mojo::View* view,
+ const mojo::EventPtr& event) override {
if (event->action == mojo::EVENT_TYPE_MOUSE_RELEASED &&
event->flags & mojo::EVENT_FLAGS_LEFT_MOUSE_BUTTON) {
OpenNewWindow();
}
}
- virtual void OnViewDestroyed(mojo::View* view) override {
+ void OnViewDestroyed(mojo::View* view) override {
if (uploaders_.find(view) != uploaders_.end()) {
delete uploaders_[view];
uploaders_.erase(view);
diff --git a/examples/wm_flow/embedded/embedded.cc b/examples/wm_flow/embedded/embedded.cc
index fe79eee..6c7ac0f 100644
--- a/examples/wm_flow/embedded/embedded.cc
+++ b/examples/wm_flow/embedded/embedded.cc
@@ -50,7 +50,7 @@
WMFlowEmbedded() : shell_(nullptr) {
embeddee_provider_impl_.AddService(this);
}
- virtual ~WMFlowEmbedded() {}
+ ~WMFlowEmbedded() override {}
private:
// Overridden from Application:
diff --git a/examples/wm_flow/wm/frame_controller.h b/examples/wm_flow/wm/frame_controller.h
index e251c76..025b1c0 100644
--- a/examples/wm_flow/wm/frame_controller.h
+++ b/examples/wm_flow/wm/frame_controller.h
@@ -36,7 +36,7 @@
mojo::View* view,
mojo::View** app_view,
window_manager::WindowManagerApp* window_manager_app);
- virtual ~FrameController();
+ ~FrameController() override;
// mojo::InterfaceFactory<examples::WindowFrameHost> implementation.
void Create(
diff --git a/examples/wm_flow/wm/wm.cc b/examples/wm_flow/wm/wm.cc
index c7dfc52..492f9bb 100644
--- a/examples/wm_flow/wm/wm.cc
+++ b/examples/wm_flow/wm/wm.cc
@@ -29,26 +29,26 @@
root_(NULL),
window_container_(NULL),
next_window_origin_(10, 10) {}
- virtual ~SimpleWM() {}
+ ~SimpleWM() override {}
private:
// Overridden from mojo::ApplicationDelegate:
- virtual void Initialize(mojo::ApplicationImpl* impl) override {
+ void Initialize(mojo::ApplicationImpl* impl) override {
// FIXME: Mojo applications don't know their URLs yet:
// https://docs.google.com/a/chromium.org/document/d/1AQ2y6ekzvbdaMF5WrUQmneyXJnke-MnYYL4Gz1AKDos
url_ = GURL(impl->args()[1]);
window_manager_app_->Initialize(impl);
}
- virtual bool ConfigureIncomingConnection(
+ bool ConfigureIncomingConnection(
mojo::ApplicationConnection* connection) override {
window_manager_app_->ConfigureIncomingConnection(connection);
return true;
}
// Overridden from mojo::ViewManagerDelegate:
- virtual void OnEmbed(mojo::View* root,
- mojo::InterfaceRequest<mojo::ServiceProvider> services,
- mojo::ServiceProviderPtr exposed_services) override {
+ void OnEmbed(mojo::View* root,
+ mojo::InterfaceRequest<mojo::ServiceProvider> services,
+ mojo::ServiceProviderPtr exposed_services) override {
root_ = root;
window_container_ = root->view_manager()->CreateView();
@@ -59,15 +59,14 @@
window_manager_app_->InitFocus(make_scoped_ptr(
new window_manager::BasicFocusRules(window_container_)));
}
- virtual void OnViewManagerDisconnected(
- mojo::ViewManager* view_manager) override {
+ void OnViewManagerDisconnected(mojo::ViewManager* view_manager) override {
root_ = NULL;
}
// Overridden from mojo::WindowManagerDelegate:
- virtual void Embed(const mojo::String& url,
- mojo::InterfaceRequest<mojo::ServiceProvider> services,
- mojo::ServiceProviderPtr exposed_services) override {
+ void Embed(const mojo::String& url,
+ mojo::InterfaceRequest<mojo::ServiceProvider> services,
+ mojo::ServiceProviderPtr exposed_services) override {
DCHECK(root_);
mojo::View* app_view = NULL;
CreateTopLevelWindow(&app_view);
@@ -75,15 +74,15 @@
}
// Overridden from mojo::ViewObserver:
- virtual void OnViewInputEvent(mojo::View* view,
- const mojo::EventPtr& event) override {
+ void OnViewInputEvent(mojo::View* view,
+ const mojo::EventPtr& event) override {
if (event->action == mojo::EVENT_TYPE_MOUSE_RELEASED &&
event->flags & mojo::EVENT_FLAGS_RIGHT_MOUSE_BUTTON &&
view->parent() == window_container_) {
CloseWindow(view);
}
}
- virtual void OnViewDestroyed(mojo::View* view) override {
+ void OnViewDestroyed(mojo::View* view) override {
view->RemoveObserver(this);
}
diff --git a/gpu/BUILD.gn b/gpu/BUILD.gn
index 5b39586..6f011f7 100644
--- a/gpu/BUILD.gn
+++ b/gpu/BUILD.gn
@@ -64,221 +64,219 @@
]
}
-if (!is_win || link_chrome_on_windows) {
- test("gl_tests") {
- sources = [
- "command_buffer/tests/compressed_texture_test.cc",
- "command_buffer/tests/gl_bind_uniform_location_unittest.cc",
- "command_buffer/tests/gl_chromium_framebuffer_multisample_unittest.cc",
- "command_buffer/tests/gl_chromium_path_rendering_unittest.cc",
- "command_buffer/tests/gl_clear_framebuffer_unittest.cc",
- "command_buffer/tests/gl_copy_texture_CHROMIUM_unittest.cc",
- "command_buffer/tests/gl_depth_texture_unittest.cc",
- "command_buffer/tests/gl_gpu_memory_buffer_unittest.cc",
- "command_buffer/tests/gl_lose_context_chromium_unittest.cc",
- "command_buffer/tests/gl_manager.cc",
- "command_buffer/tests/gl_manager.h",
- "command_buffer/tests/gl_pointcoord_unittest.cc",
- "command_buffer/tests/gl_program_unittest.cc",
- "command_buffer/tests/gl_query_unittest.cc",
- "command_buffer/tests/gl_readback_unittest.cc",
- "command_buffer/tests/gl_shared_resources_unittest.cc",
- "command_buffer/tests/gl_stream_draw_unittest.cc",
- "command_buffer/tests/gl_test_utils.cc",
- "command_buffer/tests/gl_test_utils.h",
- "command_buffer/tests/gl_tests_main.cc",
- "command_buffer/tests/gl_texture_mailbox_unittest.cc",
- "command_buffer/tests/gl_texture_storage_unittest.cc",
- "command_buffer/tests/gl_unittest.cc",
- "command_buffer/tests/gl_unittests_android.cc",
- "command_buffer/tests/gl_virtual_contexts_unittest.cc",
- "command_buffer/tests/occlusion_query_unittest.cc",
- ]
+test("gl_tests") {
+ sources = [
+ "command_buffer/tests/compressed_texture_test.cc",
+ "command_buffer/tests/gl_bind_uniform_location_unittest.cc",
+ "command_buffer/tests/gl_chromium_framebuffer_multisample_unittest.cc",
+ "command_buffer/tests/gl_chromium_path_rendering_unittest.cc",
+ "command_buffer/tests/gl_clear_framebuffer_unittest.cc",
+ "command_buffer/tests/gl_copy_texture_CHROMIUM_unittest.cc",
+ "command_buffer/tests/gl_depth_texture_unittest.cc",
+ "command_buffer/tests/gl_gpu_memory_buffer_unittest.cc",
+ "command_buffer/tests/gl_lose_context_chromium_unittest.cc",
+ "command_buffer/tests/gl_manager.cc",
+ "command_buffer/tests/gl_manager.h",
+ "command_buffer/tests/gl_pointcoord_unittest.cc",
+ "command_buffer/tests/gl_program_unittest.cc",
+ "command_buffer/tests/gl_query_unittest.cc",
+ "command_buffer/tests/gl_readback_unittest.cc",
+ "command_buffer/tests/gl_shared_resources_unittest.cc",
+ "command_buffer/tests/gl_stream_draw_unittest.cc",
+ "command_buffer/tests/gl_test_utils.cc",
+ "command_buffer/tests/gl_test_utils.h",
+ "command_buffer/tests/gl_tests_main.cc",
+ "command_buffer/tests/gl_texture_mailbox_unittest.cc",
+ "command_buffer/tests/gl_texture_storage_unittest.cc",
+ "command_buffer/tests/gl_unittest.cc",
+ "command_buffer/tests/gl_unittests_android.cc",
+ "command_buffer/tests/gl_virtual_contexts_unittest.cc",
+ "command_buffer/tests/occlusion_query_unittest.cc",
+ ]
- defines = [ "GL_GLEXT_PROTOTYPES" ]
+ defines = [ "GL_GLEXT_PROTOTYPES" ]
- configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
+ configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
- deps = [
- ":gpu",
- ":test_support",
- "//base",
- "//base/test:test_support",
- "//base/third_party/dynamic_annotations",
- "//testing/gmock",
- "//testing/gtest",
- "//third_party/angle:translator",
- "//ui/gfx",
- "//ui/gfx:test_support",
- "//ui/gfx/geometry",
- "//ui/gl",
- "//gpu/command_buffer/common:gles2_utils",
- "//gpu/command_buffer/client:gles2_c_lib",
- "//gpu/command_buffer/client:gles2_implementation",
- ]
+ deps = [
+ ":gpu",
+ ":test_support",
+ "//base",
+ "//base/test:test_support",
+ "//base/third_party/dynamic_annotations",
+ "//testing/gmock",
+ "//testing/gtest",
+ "//third_party/angle:translator",
+ "//ui/gfx",
+ "//ui/gfx:test_support",
+ "//ui/gfx/geometry",
+ "//ui/gl",
+ "//gpu/command_buffer/common:gles2_utils",
+ "//gpu/command_buffer/client:gles2_c_lib",
+ "//gpu/command_buffer/client:gles2_implementation",
+ ]
- libs = []
+ libs = []
- if (is_android) {
- deps += [ "//testing/android:native_test_native_code" ]
- libs += [ "android" ]
- }
-
- # TODO(GYP)
- # ['OS == "win"', {
- # 'dependencies': [
- # '../third_party/angle/src/build_angle.gyp:libEGL',
- # '../third_party/angle/src/build_angle.gyp:libGLESv2',
- # ],
- # }],
+ if (is_android) {
+ deps += [ "//testing/android:native_test_native_code" ]
+ libs += [ "android" ]
}
- test("gpu_unittests") {
- sources = [
- "command_buffer/client/buffer_tracker_unittest.cc",
- "command_buffer/client/client_test_helper.cc",
- "command_buffer/client/client_test_helper.h",
- "command_buffer/client/cmd_buffer_helper_test.cc",
- "command_buffer/client/fenced_allocator_test.cc",
- "command_buffer/client/gles2_implementation_unittest.cc",
- "command_buffer/client/mapped_memory_unittest.cc",
- "command_buffer/client/program_info_manager_unittest.cc",
- "command_buffer/client/query_tracker_unittest.cc",
- "command_buffer/client/ring_buffer_test.cc",
- "command_buffer/client/transfer_buffer_unittest.cc",
- "command_buffer/client/vertex_array_object_manager_unittest.cc",
- "command_buffer/common/bitfield_helpers_test.cc",
- "command_buffer/common/command_buffer_mock.cc",
- "command_buffer/common/command_buffer_mock.h",
- "command_buffer/common/command_buffer_shared_test.cc",
- "command_buffer/common/debug_marker_manager_unittest.cc",
- "command_buffer/common/gles2_cmd_format_test.cc",
- "command_buffer/common/gles2_cmd_format_test_autogen.h",
- "command_buffer/common/gles2_cmd_utils_unittest.cc",
- "command_buffer/common/id_allocator_test.cc",
- "command_buffer/common/trace_event.h",
- "command_buffer/common/unittest_main.cc",
- "command_buffer/service/async_pixel_transfer_delegate_mock.cc",
- "command_buffer/service/async_pixel_transfer_delegate_mock.h",
- "command_buffer/service/async_pixel_transfer_manager_mock.cc",
- "command_buffer/service/async_pixel_transfer_manager_mock.h",
- "command_buffer/service/buffer_manager_unittest.cc",
- "command_buffer/service/cmd_parser_test.cc",
- "command_buffer/service/command_buffer_service_unittest.cc",
- "command_buffer/service/common_decoder_unittest.cc",
- "command_buffer/service/context_group_unittest.cc",
- "command_buffer/service/feature_info_unittest.cc",
- "command_buffer/service/framebuffer_manager_unittest.cc",
- "command_buffer/service/gl_surface_mock.cc",
- "command_buffer/service/gl_surface_mock.h",
- "command_buffer/service/gles2_cmd_decoder_unittest.cc",
- "command_buffer/service/gles2_cmd_decoder_unittest.h",
- "command_buffer/service/gles2_cmd_decoder_unittest_0_autogen.h",
- "command_buffer/service/gles2_cmd_decoder_unittest_1.cc",
- "command_buffer/service/gles2_cmd_decoder_unittest_1_autogen.h",
- "command_buffer/service/gles2_cmd_decoder_unittest_2.cc",
- "command_buffer/service/gles2_cmd_decoder_unittest_2_autogen.h",
- "command_buffer/service/gles2_cmd_decoder_unittest_3.cc",
- "command_buffer/service/gles2_cmd_decoder_unittest_3_autogen.h",
- "command_buffer/service/gles2_cmd_decoder_unittest_async_pixel.cc",
- "command_buffer/service/gles2_cmd_decoder_unittest_attribs.cc",
- "command_buffer/service/gles2_cmd_decoder_unittest_base.cc",
- "command_buffer/service/gles2_cmd_decoder_unittest_base.h",
- "command_buffer/service/gles2_cmd_decoder_unittest_context_state.cc",
- "command_buffer/service/gles2_cmd_decoder_unittest_drawing.cc",
- "command_buffer/service/gles2_cmd_decoder_unittest_extensions.cc",
- "command_buffer/service/gles2_cmd_decoder_unittest_framebuffers.cc",
- "command_buffer/service/gles2_cmd_decoder_unittest_programs.cc",
- "command_buffer/service/gles2_cmd_decoder_unittest_textures.cc",
- "command_buffer/service/gles2_cmd_decoder_unittest_valuebuffer.cc",
- "command_buffer/service/gpu_scheduler_unittest.cc",
- "command_buffer/service/gpu_service_test.cc",
- "command_buffer/service/gpu_service_test.h",
- "command_buffer/service/gpu_tracer_unittest.cc",
- "command_buffer/service/id_manager_unittest.cc",
- "command_buffer/service/mailbox_manager_unittest.cc",
- "command_buffer/service/memory_program_cache_unittest.cc",
- "command_buffer/service/mocks.cc",
- "command_buffer/service/mocks.h",
- "command_buffer/service/program_cache_unittest.cc",
- "command_buffer/service/program_manager_unittest.cc",
- "command_buffer/service/query_manager_unittest.cc",
- "command_buffer/service/renderbuffer_manager_unittest.cc",
- "command_buffer/service/shader_manager_unittest.cc",
- "command_buffer/service/shader_translator_cache_unittest.cc",
- "command_buffer/service/shader_translator_unittest.cc",
- "command_buffer/service/test_helper.cc",
- "command_buffer/service/test_helper.h",
- "command_buffer/service/texture_manager_unittest.cc",
- "command_buffer/service/transfer_buffer_manager_unittest.cc",
- "command_buffer/service/valuebuffer_manager_unittest.cc",
- "command_buffer/service/vertex_array_manager_unittest.cc",
- "command_buffer/service/vertex_attrib_manager_unittest.cc",
- "config/gpu_blacklist_unittest.cc",
- "config/gpu_control_list_entry_unittest.cc",
- "config/gpu_control_list_number_info_unittest.cc",
- "config/gpu_control_list_os_info_unittest.cc",
- "config/gpu_control_list_unittest.cc",
- "config/gpu_control_list_version_info_unittest.cc",
- "config/gpu_driver_bug_list_unittest.cc",
- "config/gpu_info_collector_unittest.cc",
- "config/gpu_info_unittest.cc",
- "config/gpu_test_config_unittest.cc",
- "config/gpu_test_expectations_parser_unittest.cc",
- "config/gpu_util_unittest.cc",
- ]
+ # TODO(GYP)
+ # ['OS == "win"', {
+ # 'dependencies': [
+ # '../third_party/angle/src/build_angle.gyp:libEGL',
+ # '../third_party/angle/src/build_angle.gyp:libGLESv2',
+ # ],
+ # }],
+}
- configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
+test("gpu_unittests") {
+ sources = [
+ "command_buffer/client/buffer_tracker_unittest.cc",
+ "command_buffer/client/client_test_helper.cc",
+ "command_buffer/client/client_test_helper.h",
+ "command_buffer/client/cmd_buffer_helper_test.cc",
+ "command_buffer/client/fenced_allocator_test.cc",
+ "command_buffer/client/gles2_implementation_unittest.cc",
+ "command_buffer/client/mapped_memory_unittest.cc",
+ "command_buffer/client/program_info_manager_unittest.cc",
+ "command_buffer/client/query_tracker_unittest.cc",
+ "command_buffer/client/ring_buffer_test.cc",
+ "command_buffer/client/transfer_buffer_unittest.cc",
+ "command_buffer/client/vertex_array_object_manager_unittest.cc",
+ "command_buffer/common/bitfield_helpers_test.cc",
+ "command_buffer/common/command_buffer_mock.cc",
+ "command_buffer/common/command_buffer_mock.h",
+ "command_buffer/common/command_buffer_shared_test.cc",
+ "command_buffer/common/debug_marker_manager_unittest.cc",
+ "command_buffer/common/gles2_cmd_format_test.cc",
+ "command_buffer/common/gles2_cmd_format_test_autogen.h",
+ "command_buffer/common/gles2_cmd_utils_unittest.cc",
+ "command_buffer/common/id_allocator_test.cc",
+ "command_buffer/common/trace_event.h",
+ "command_buffer/common/unittest_main.cc",
+ "command_buffer/service/async_pixel_transfer_delegate_mock.cc",
+ "command_buffer/service/async_pixel_transfer_delegate_mock.h",
+ "command_buffer/service/async_pixel_transfer_manager_mock.cc",
+ "command_buffer/service/async_pixel_transfer_manager_mock.h",
+ "command_buffer/service/buffer_manager_unittest.cc",
+ "command_buffer/service/cmd_parser_test.cc",
+ "command_buffer/service/command_buffer_service_unittest.cc",
+ "command_buffer/service/common_decoder_unittest.cc",
+ "command_buffer/service/context_group_unittest.cc",
+ "command_buffer/service/feature_info_unittest.cc",
+ "command_buffer/service/framebuffer_manager_unittest.cc",
+ "command_buffer/service/gl_surface_mock.cc",
+ "command_buffer/service/gl_surface_mock.h",
+ "command_buffer/service/gles2_cmd_decoder_unittest.cc",
+ "command_buffer/service/gles2_cmd_decoder_unittest.h",
+ "command_buffer/service/gles2_cmd_decoder_unittest_0_autogen.h",
+ "command_buffer/service/gles2_cmd_decoder_unittest_1.cc",
+ "command_buffer/service/gles2_cmd_decoder_unittest_1_autogen.h",
+ "command_buffer/service/gles2_cmd_decoder_unittest_2.cc",
+ "command_buffer/service/gles2_cmd_decoder_unittest_2_autogen.h",
+ "command_buffer/service/gles2_cmd_decoder_unittest_3.cc",
+ "command_buffer/service/gles2_cmd_decoder_unittest_3_autogen.h",
+ "command_buffer/service/gles2_cmd_decoder_unittest_async_pixel.cc",
+ "command_buffer/service/gles2_cmd_decoder_unittest_attribs.cc",
+ "command_buffer/service/gles2_cmd_decoder_unittest_base.cc",
+ "command_buffer/service/gles2_cmd_decoder_unittest_base.h",
+ "command_buffer/service/gles2_cmd_decoder_unittest_context_state.cc",
+ "command_buffer/service/gles2_cmd_decoder_unittest_drawing.cc",
+ "command_buffer/service/gles2_cmd_decoder_unittest_extensions.cc",
+ "command_buffer/service/gles2_cmd_decoder_unittest_framebuffers.cc",
+ "command_buffer/service/gles2_cmd_decoder_unittest_programs.cc",
+ "command_buffer/service/gles2_cmd_decoder_unittest_textures.cc",
+ "command_buffer/service/gles2_cmd_decoder_unittest_valuebuffer.cc",
+ "command_buffer/service/gpu_scheduler_unittest.cc",
+ "command_buffer/service/gpu_service_test.cc",
+ "command_buffer/service/gpu_service_test.h",
+ "command_buffer/service/gpu_tracer_unittest.cc",
+ "command_buffer/service/id_manager_unittest.cc",
+ "command_buffer/service/mailbox_manager_unittest.cc",
+ "command_buffer/service/memory_program_cache_unittest.cc",
+ "command_buffer/service/mocks.cc",
+ "command_buffer/service/mocks.h",
+ "command_buffer/service/program_cache_unittest.cc",
+ "command_buffer/service/program_manager_unittest.cc",
+ "command_buffer/service/query_manager_unittest.cc",
+ "command_buffer/service/renderbuffer_manager_unittest.cc",
+ "command_buffer/service/shader_manager_unittest.cc",
+ "command_buffer/service/shader_translator_cache_unittest.cc",
+ "command_buffer/service/shader_translator_unittest.cc",
+ "command_buffer/service/test_helper.cc",
+ "command_buffer/service/test_helper.h",
+ "command_buffer/service/texture_manager_unittest.cc",
+ "command_buffer/service/transfer_buffer_manager_unittest.cc",
+ "command_buffer/service/valuebuffer_manager_unittest.cc",
+ "command_buffer/service/vertex_array_manager_unittest.cc",
+ "command_buffer/service/vertex_attrib_manager_unittest.cc",
+ "config/gpu_blacklist_unittest.cc",
+ "config/gpu_control_list_entry_unittest.cc",
+ "config/gpu_control_list_number_info_unittest.cc",
+ "config/gpu_control_list_os_info_unittest.cc",
+ "config/gpu_control_list_unittest.cc",
+ "config/gpu_control_list_version_info_unittest.cc",
+ "config/gpu_driver_bug_list_unittest.cc",
+ "config/gpu_info_collector_unittest.cc",
+ "config/gpu_info_unittest.cc",
+ "config/gpu_test_config_unittest.cc",
+ "config/gpu_test_expectations_parser_unittest.cc",
+ "config/gpu_util_unittest.cc",
+ ]
- deps = [
- ":gpu",
- ":test_support",
- "//base",
- "//base/test:test_support",
- "//base/third_party/dynamic_annotations",
- "//testing/gmock",
- "//testing/gtest",
- "//third_party/angle:translator",
- "//ui/gfx",
- "//ui/gfx:test_support",
- "//ui/gfx/geometry",
- "//ui/gl",
- "//gpu/command_buffer/common:gles2_utils",
- "//gpu/command_buffer/client:gles2_c_lib",
- "//gpu/command_buffer/client:gles2_implementation",
- ]
- }
+ configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
- test("gpu_perftests") {
- sources = [
- "perftests/measurements.cc",
- "perftests/run_all_tests.cc",
- "perftests/texture_upload_perftest.cc",
- ]
+ deps = [
+ ":gpu",
+ ":test_support",
+ "//base",
+ "//base/test:test_support",
+ "//base/third_party/dynamic_annotations",
+ "//testing/gmock",
+ "//testing/gtest",
+ "//third_party/angle:translator",
+ "//ui/gfx",
+ "//ui/gfx:test_support",
+ "//ui/gfx/geometry",
+ "//ui/gl",
+ "//gpu/command_buffer/common:gles2_utils",
+ "//gpu/command_buffer/client:gles2_c_lib",
+ "//gpu/command_buffer/client:gles2_implementation",
+ ]
+}
- deps = [
- "//base",
- "//base/test:test_support",
- "//gpu/command_buffer/service",
- "//testing/gtest",
- "//testing/perf",
- "//ui/gfx/geometry",
- "//ui/gl",
- ]
- }
+test("gpu_perftests") {
+ sources = [
+ "perftests/measurements.cc",
+ "perftests/run_all_tests.cc",
+ "perftests/texture_upload_perftest.cc",
+ ]
- test("angle_unittests") {
- sources = [
- "angle_unittest_main.cc",
- ]
+ deps = [
+ "//base",
+ "//base/test:test_support",
+ "//gpu/command_buffer/service",
+ "//testing/gtest",
+ "//testing/perf",
+ "//ui/gfx/geometry",
+ "//ui/gl",
+ ]
+}
- deps = [
- "//base",
- "//base/test:test_support",
- "//base/third_party/dynamic_annotations",
- "//testing/gmock",
- "//testing/gtest",
- "//third_party/angle:translator_static",
- ]
- }
+test("angle_unittests") {
+ sources = [
+ "angle_unittest_main.cc",
+ ]
+
+ deps = [
+ "//base",
+ "//base/test:test_support",
+ "//base/third_party/dynamic_annotations",
+ "//testing/gmock",
+ "//testing/gtest",
+ "//third_party/angle:translator_static",
+ ]
}
diff --git a/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_copy_texture.txt b/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_copy_texture.txt
index ad9ca68..6845991 100644
--- a/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_copy_texture.txt
+++ b/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_copy_texture.txt
@@ -36,15 +36,18 @@
New Procedures and Functions
- void glCopyTextureCHROMIUM (GLenum target, GLenum source_id,
- GLenum dest_id, GLint level,
- GLint internal_format, GLenum dest_type)
+ The command
- Copies the contents of texture referred to by <source_id> to texture
- <dest_id>.
+ void glCopyTextureCHROMIUM (GLenum target, GLenum source_id,
+ GLenum dest_id,
+ GLint internal_format, GLenum dest_type)
- Texture level 0 is copied from the source image to level <level> of the
- destination texture. The level parameter must be 0 at present.
+ Copies the contents of texture referred to by <source_id> to <dest_id>
+ texture. If <source_id> texture is not defined or has different dimension
+ to <dest_id> texture, define <source_id> texture same to <dest_id> texture.
+
+ Texture level 0 is copied from the source image to level 0 of the
+ destination texture.
The internal format of the destination texture is converted to that
specified by <internal_format>. Must be one of the following symbolic
@@ -87,8 +90,37 @@
been bound as GL_TEXTURE_2D, GL_TEXTURE_RECTANGLE_ARB or
GL_TEXTURE_EXTERNAL_OES objects.
- INVALID_VALUE is generated if <level> is not a valid level of the
- destination texture, or if level 0 of the source texture is not defined.
+ INVALID_VALUE is generated if level 0 of the source texture is not defined.
+
+ The command
+
+ void glCopySubTextureCHROMIUM (GLenum target, GLenum source_id,
+ GLenum dest_id,
+ GLint xoffset, GLint yoffset)
+
+ Copies the sub contents of texture referred to by <source_id> to <dest_id>
+ texture without redefining <dest_id> texture.
+
+ See CopyTextureCHROMIUM for the interpretation of the <target> arguments.
+
+ <xoffset> and <yoffset> specify a texel offset in the x and y direction
+ respectively within the destination texture.
+
+ INVALID_OPERATION is generated if source internal_format and destination
+ internal_format are not one of the valid formats described above.
+
+ INVALID_VALUE is generated if <target> is not GL_TEXTURE_2D.
+
+ INVALID_OPERATION is generated if the destination texture has not been
+ defined.
+
+ INVALID_VALUE is generated if level 0 of the source texture or
+ the destination texture is not defined.
+
+ INVALID_VALUE is generated if <xoffset> < 0 , or <yoffset> < 0.
+
+ INVALID_VALUE is generated if (<xoffset> + source_width) > dest_width,
+ or (<yoffset> + source_height) > dest_height.
Errors
diff --git a/gpu/GLES2/gl2chromium_autogen.h b/gpu/GLES2/gl2chromium_autogen.h
index af745c1..60404dc 100644
--- a/gpu/GLES2/gl2chromium_autogen.h
+++ b/gpu/GLES2/gl2chromium_autogen.h
@@ -279,6 +279,7 @@
#define glPostSubBufferCHROMIUM GLES2_GET_FUN(PostSubBufferCHROMIUM)
#define glTexImageIOSurface2DCHROMIUM GLES2_GET_FUN(TexImageIOSurface2DCHROMIUM)
#define glCopyTextureCHROMIUM GLES2_GET_FUN(CopyTextureCHROMIUM)
+#define glCopySubTextureCHROMIUM GLES2_GET_FUN(CopySubTextureCHROMIUM)
#define glDrawArraysInstancedANGLE GLES2_GET_FUN(DrawArraysInstancedANGLE)
#define glDrawElementsInstancedANGLE GLES2_GET_FUN(DrawElementsInstancedANGLE)
#define glVertexAttribDivisorANGLE GLES2_GET_FUN(VertexAttribDivisorANGLE)
diff --git a/gpu/GLES2/gl2extchromium.h b/gpu/GLES2/gl2extchromium.h
index 6a31b8f..ec85bf2 100644
--- a/gpu/GLES2/gl2extchromium.h
+++ b/gpu/GLES2/gl2extchromium.h
@@ -394,13 +394,29 @@
#define GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM 0x9241
#endif
#ifdef GL_GLEXT_PROTOTYPES
-GL_APICALL void GL_APIENTRY glCopyTextureCHROMIUM(
- GLenum target, GLenum source_id, GLenum dest_id, GLint level,
- GLint internalformat, GLenum dest_type);
+GL_APICALL void GL_APIENTRY glCopyTextureCHROMIUM(GLenum target,
+ GLenum source_id,
+ GLenum dest_id,
+ GLint internalformat,
+ GLenum dest_type);
+
+GL_APICALL void GL_APIENTRY glCopySubTextureCHROMIUM(GLenum target,
+ GLenum source_id,
+ GLenum dest_id,
+ GLint xoffset,
+ GLint yoffset);
#endif
-typedef void (GL_APIENTRYP PFNGLCOPYTEXTURECHROMIUMPROC) (
- GLenum target, GLenum source_id, GLenum dest_id, GLint level,
- GLint internalformat, GLenum dest_type);
+typedef void(GL_APIENTRYP PFNGLCOPYTEXTURECHROMIUMPROC)(GLenum target,
+ GLenum source_id,
+ GLenum dest_id,
+ GLint internalformat,
+ GLenum dest_type);
+
+typedef void(GL_APIENTRYP PFNGLCOPYSUBTEXTURECHROMIUMPROC)(GLenum target,
+ GLenum source_id,
+ GLenum dest_id,
+ GLint xoffset,
+ GLint yoffset);
#endif /* GL_CHROMIUM_copy_texture */
/* GL_CHROMIUM_lose_context */
diff --git a/gpu/blink/webgraphicscontext3d_impl.cc b/gpu/blink/webgraphicscontext3d_impl.cc
index 4f728cf..581e102 100644
--- a/gpu/blink/webgraphicscontext3d_impl.cc
+++ b/gpu/blink/webgraphicscontext3d_impl.cc
@@ -809,8 +809,39 @@
DELEGATE_TO_GL_3(getQueryObjectuivEXT, GetQueryObjectuivEXT,
WebGLId, WGC3Denum, WGC3Duint*)
-DELEGATE_TO_GL_6(copyTextureCHROMIUM, CopyTextureCHROMIUM, WGC3Denum,
- WebGLId, WebGLId, WGC3Dint, WGC3Denum, WGC3Denum);
+void WebGraphicsContext3DImpl::copyTextureCHROMIUM(WGC3Denum target,
+ WebGLId source_id,
+ WebGLId dest_id,
+ WGC3Dint level,
+ WGC3Denum internal_format,
+ WGC3Denum dest_type) {
+ copyTextureCHROMIUM(target, source_id, dest_id, internal_format, dest_type);
+}
+
+void WebGraphicsContext3DImpl::copySubTextureCHROMIUM(WGC3Denum target,
+ WebGLId source_id,
+ WebGLId dest_id,
+ WGC3Dint level,
+ WGC3Dint xoffset,
+ WGC3Dint yoffset) {
+ copySubTextureCHROMIUM(target, source_id, dest_id, xoffset, yoffset);
+}
+
+DELEGATE_TO_GL_5(copyTextureCHROMIUM,
+ CopyTextureCHROMIUM,
+ WGC3Denum,
+ WebGLId,
+ WebGLId,
+ WGC3Denum,
+ WGC3Denum);
+
+DELEGATE_TO_GL_5(copySubTextureCHROMIUM,
+ CopySubTextureCHROMIUM,
+ WGC3Denum,
+ WebGLId,
+ WebGLId,
+ WGC3Dint,
+ WGC3Dint);
DELEGATE_TO_GL_3(bindUniformLocationCHROMIUM, BindUniformLocationCHROMIUM,
WebGLId, WGC3Dint, const WGC3Dchar*)
@@ -1183,6 +1214,8 @@
output_attribs->fail_if_major_perf_caveat =
attributes.failIfMajorPerformanceCaveat;
output_attribs->bind_generates_resource = false;
+ output_attribs->es3_context_required =
+ (attributes.webGL && attributes.webGLVersion == 2);
}
} // namespace gpu_blink
diff --git a/gpu/blink/webgraphicscontext3d_impl.h b/gpu/blink/webgraphicscontext3d_impl.h
index ff2ca97..a0d1461 100644
--- a/gpu/blink/webgraphicscontext3d_impl.h
+++ b/gpu/blink/webgraphicscontext3d_impl.h
@@ -451,11 +451,33 @@
virtual void getQueryObjectuivEXT(
WebGLId query, WGC3Denum pname, WGC3Duint* params);
- virtual void copyTextureCHROMIUM(WGC3Denum target, WebGLId source_id,
- WebGLId dest_id, WGC3Dint level,
+ // TODO(dshwang): Remove |level| in Blink and then remove it.
+ void copyTextureCHROMIUM(WGC3Denum target,
+ WebGLId source_id,
+ WebGLId dest_id,
+ WGC3Dint level,
+ WGC3Denum internal_format,
+ WGC3Denum dest_type) override;
+
+ void copySubTextureCHROMIUM(WGC3Denum target,
+ WebGLId source_id,
+ WebGLId dest_id,
+ WGC3Dint level,
+ WGC3Dint xoffset,
+ WGC3Dint yoffset) override;
+
+ virtual void copyTextureCHROMIUM(WGC3Denum target,
+ WebGLId source_id,
+ WebGLId dest_id,
WGC3Denum internal_format,
WGC3Denum dest_type);
+ virtual void copySubTextureCHROMIUM(WGC3Denum target,
+ WebGLId sourceId,
+ WebGLId destId,
+ WGC3Dint xoffset,
+ WGC3Dint yoffset);
+
virtual void bindUniformLocationCHROMIUM(WebGLId program, WGC3Dint location,
const WGC3Dchar* uniform);
diff --git a/gpu/command_buffer/build_gles2_cmd_buffer.py b/gpu/command_buffer/build_gles2_cmd_buffer.py
index 8dba53b..5e6d9d9 100755
--- a/gpu/command_buffer/build_gles2_cmd_buffer.py
+++ b/gpu/command_buffer/build_gles2_cmd_buffer.py
@@ -3008,6 +3008,12 @@
'extension': True,
'chromium': True,
},
+ 'CopySubTextureCHROMIUM': {
+ 'decoder_func': 'DoCopySubTextureCHROMIUM',
+ 'unit_test': False,
+ 'extension': True,
+ 'chromium': True,
+ },
'TexStorage2DEXT': {
'unit_test': False,
'extension': True,
diff --git a/gpu/command_buffer/client/BUILD.gn b/gpu/command_buffer/client/BUILD.gn
index a5532cb..7e47f24 100644
--- a/gpu/command_buffer/client/BUILD.gn
+++ b/gpu/command_buffer/client/BUILD.gn
@@ -140,6 +140,27 @@
]
}
+# Library emulates GLES2 using command_buffers.
+component("gles2_implementation_no_check") {
+ sources = gles2_implementation_source_files
+
+ # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
+ configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
+
+ defines = [
+ "GLES2_IMPL_IMPLEMENTATION",
+ "GLES2_CONFORMANCE_TESTS=1",
+ ]
+
+ deps = [
+ ":gles2_cmd_helper",
+ "//base",
+ "//gpu/command_buffer/common:gles2_utils",
+ "//ui/gfx",
+ "//ui/gfx/geometry",
+ ]
+}
+
component("gl_in_process_context") {
sources = [
"gl_in_process_context.cc",
diff --git a/gpu/command_buffer/client/gles2_c_lib_autogen.h b/gpu/command_buffer/client/gles2_c_lib_autogen.h
index 87616e7..7e0da4b 100644
--- a/gpu/command_buffer/client/gles2_c_lib_autogen.h
+++ b/gpu/command_buffer/client/gles2_c_lib_autogen.h
@@ -1158,12 +1158,19 @@
void GLES2CopyTextureCHROMIUM(GLenum target,
GLenum source_id,
GLenum dest_id,
- GLint level,
GLint internalformat,
GLenum dest_type) {
- gles2::GetGLContext()->CopyTextureCHROMIUM(target, source_id, dest_id, level,
+ gles2::GetGLContext()->CopyTextureCHROMIUM(target, source_id, dest_id,
internalformat, dest_type);
}
+void GLES2CopySubTextureCHROMIUM(GLenum target,
+ GLenum source_id,
+ GLenum dest_id,
+ GLint xoffset,
+ GLint yoffset) {
+ gles2::GetGLContext()->CopySubTextureCHROMIUM(target, source_id, dest_id,
+ xoffset, yoffset);
+}
void GLES2DrawArraysInstancedANGLE(GLenum mode,
GLint first,
GLsizei count,
@@ -2361,6 +2368,10 @@
reinterpret_cast<GLES2FunctionPointer>(glCopyTextureCHROMIUM),
},
{
+ "glCopySubTextureCHROMIUM",
+ reinterpret_cast<GLES2FunctionPointer>(glCopySubTextureCHROMIUM),
+ },
+ {
"glDrawArraysInstancedANGLE",
reinterpret_cast<GLES2FunctionPointer>(glDrawArraysInstancedANGLE),
},
diff --git a/gpu/command_buffer/client/gles2_cmd_helper_autogen.h b/gpu/command_buffer/client/gles2_cmd_helper_autogen.h
index 4c1ad05..ad3eb58 100644
--- a/gpu/command_buffer/client/gles2_cmd_helper_autogen.h
+++ b/gpu/command_buffer/client/gles2_cmd_helper_autogen.h
@@ -2312,13 +2312,24 @@
void CopyTextureCHROMIUM(GLenum target,
GLenum source_id,
GLenum dest_id,
- GLint level,
GLint internalformat,
GLenum dest_type) {
gles2::cmds::CopyTextureCHROMIUM* c =
GetCmdSpace<gles2::cmds::CopyTextureCHROMIUM>();
if (c) {
- c->Init(target, source_id, dest_id, level, internalformat, dest_type);
+ c->Init(target, source_id, dest_id, internalformat, dest_type);
+ }
+}
+
+void CopySubTextureCHROMIUM(GLenum target,
+ GLenum source_id,
+ GLenum dest_id,
+ GLint xoffset,
+ GLint yoffset) {
+ gles2::cmds::CopySubTextureCHROMIUM* c =
+ GetCmdSpace<gles2::cmds::CopySubTextureCHROMIUM>();
+ if (c) {
+ c->Init(target, source_id, dest_id, xoffset, yoffset);
}
}
diff --git a/gpu/command_buffer/client/gles2_implementation_autogen.h b/gpu/command_buffer/client/gles2_implementation_autogen.h
index c570c45..8e032e4 100644
--- a/gpu/command_buffer/client/gles2_implementation_autogen.h
+++ b/gpu/command_buffer/client/gles2_implementation_autogen.h
@@ -873,10 +873,15 @@
void CopyTextureCHROMIUM(GLenum target,
GLenum source_id,
GLenum dest_id,
- GLint level,
GLint internalformat,
GLenum dest_type) override;
+void CopySubTextureCHROMIUM(GLenum target,
+ GLenum source_id,
+ GLenum dest_id,
+ GLint xoffset,
+ GLint yoffset) override;
+
void DrawArraysInstancedANGLE(GLenum mode,
GLint first,
GLsizei count,
diff --git a/gpu/command_buffer/client/gles2_implementation_impl_autogen.h b/gpu/command_buffer/client/gles2_implementation_impl_autogen.h
index 641efde..98447bf 100644
--- a/gpu/command_buffer/client/gles2_implementation_impl_autogen.h
+++ b/gpu/command_buffer/client/gles2_implementation_impl_autogen.h
@@ -3108,18 +3108,32 @@
void GLES2Implementation::CopyTextureCHROMIUM(GLenum target,
GLenum source_id,
GLenum dest_id,
- GLint level,
GLint internalformat,
GLenum dest_type) {
GPU_CLIENT_SINGLE_THREAD_CHECK();
GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCopyTextureCHROMIUM("
<< GLES2Util::GetStringEnum(target) << ", "
<< GLES2Util::GetStringEnum(source_id) << ", "
- << GLES2Util::GetStringEnum(dest_id) << ", " << level
- << ", " << internalformat << ", "
+ << GLES2Util::GetStringEnum(dest_id) << ", "
+ << internalformat << ", "
<< GLES2Util::GetStringPixelType(dest_type) << ")");
- helper_->CopyTextureCHROMIUM(target, source_id, dest_id, level,
- internalformat, dest_type);
+ helper_->CopyTextureCHROMIUM(target, source_id, dest_id, internalformat,
+ dest_type);
+ CheckGLError();
+}
+
+void GLES2Implementation::CopySubTextureCHROMIUM(GLenum target,
+ GLenum source_id,
+ GLenum dest_id,
+ GLint xoffset,
+ GLint yoffset) {
+ GPU_CLIENT_SINGLE_THREAD_CHECK();
+ GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCopySubTextureCHROMIUM("
+ << GLES2Util::GetStringEnum(target) << ", "
+ << GLES2Util::GetStringEnum(source_id) << ", "
+ << GLES2Util::GetStringEnum(dest_id) << ", " << xoffset
+ << ", " << yoffset << ")");
+ helper_->CopySubTextureCHROMIUM(target, source_id, dest_id, xoffset, yoffset);
CheckGLError();
}
diff --git a/gpu/command_buffer/client/gles2_implementation_unittest.cc b/gpu/command_buffer/client/gles2_implementation_unittest.cc
index 2acbc63..3af9413 100644
--- a/gpu/command_buffer/client/gles2_implementation_unittest.cc
+++ b/gpu/command_buffer/client/gles2_implementation_unittest.cc
@@ -381,8 +381,7 @@
static const GLuint kMaxTransformFeedbackSeparateAttribs = 4;
static const GLuint kMaxUniformBufferBindings = 36;
static const GLuint kStartId = 1024;
- static const GLuint kBuffersStartId =
- GLES2Implementation::kClientSideArrayId + 2 * kNumTestContexts;
+ static const GLuint kBuffersStartId = 1;
static const GLuint kFramebuffersStartId = 1;
static const GLuint kProgramsAndShadersStartId = 1;
static const GLuint kRenderbuffersStartId = 1;
diff --git a/gpu/command_buffer/client/gles2_implementation_unittest_autogen.h b/gpu/command_buffer/client/gles2_implementation_unittest_autogen.h
index 9b43afe..2d8480a 100644
--- a/gpu/command_buffer/client/gles2_implementation_unittest_autogen.h
+++ b/gpu/command_buffer/client/gles2_implementation_unittest_autogen.h
@@ -2749,9 +2749,20 @@
cmds::CopyTextureCHROMIUM cmd;
};
Cmds expected;
- expected.cmd.Init(1, 2, 3, 4, GL_ALPHA, GL_UNSIGNED_BYTE);
+ expected.cmd.Init(1, 2, 3, GL_ALPHA, GL_UNSIGNED_BYTE);
- gl_->CopyTextureCHROMIUM(1, 2, 3, 4, GL_ALPHA, GL_UNSIGNED_BYTE);
+ gl_->CopyTextureCHROMIUM(1, 2, 3, GL_ALPHA, GL_UNSIGNED_BYTE);
+ EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
+}
+
+TEST_F(GLES2ImplementationTest, CopySubTextureCHROMIUM) {
+ struct Cmds {
+ cmds::CopySubTextureCHROMIUM cmd;
+ };
+ Cmds expected;
+ expected.cmd.Init(1, 2, 3, 4, 5);
+
+ gl_->CopySubTextureCHROMIUM(1, 2, 3, 4, 5);
EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
}
diff --git a/gpu/command_buffer/client/gles2_interface_autogen.h b/gpu/command_buffer/client/gles2_interface_autogen.h
index d5b4f93..f93ec07 100644
--- a/gpu/command_buffer/client/gles2_interface_autogen.h
+++ b/gpu/command_buffer/client/gles2_interface_autogen.h
@@ -641,9 +641,13 @@
virtual void CopyTextureCHROMIUM(GLenum target,
GLenum source_id,
GLenum dest_id,
- GLint level,
GLint internalformat,
GLenum dest_type) = 0;
+virtual void CopySubTextureCHROMIUM(GLenum target,
+ GLenum source_id,
+ GLenum dest_id,
+ GLint xoffset,
+ GLint yoffset) = 0;
virtual void DrawArraysInstancedANGLE(GLenum mode,
GLint first,
GLsizei count,
diff --git a/gpu/command_buffer/client/gles2_interface_stub_autogen.h b/gpu/command_buffer/client/gles2_interface_stub_autogen.h
index 5ad9385..0381b32 100644
--- a/gpu/command_buffer/client/gles2_interface_stub_autogen.h
+++ b/gpu/command_buffer/client/gles2_interface_stub_autogen.h
@@ -624,9 +624,13 @@
void CopyTextureCHROMIUM(GLenum target,
GLenum source_id,
GLenum dest_id,
- GLint level,
GLint internalformat,
GLenum dest_type) override;
+void CopySubTextureCHROMIUM(GLenum target,
+ GLenum source_id,
+ GLenum dest_id,
+ GLint xoffset,
+ GLint yoffset) override;
void DrawArraysInstancedANGLE(GLenum mode,
GLint first,
GLsizei count,
diff --git a/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h b/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h
index b3f40ac..0f2e5fd 100644
--- a/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h
+++ b/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h
@@ -1069,10 +1069,15 @@
void GLES2InterfaceStub::CopyTextureCHROMIUM(GLenum /* target */,
GLenum /* source_id */,
GLenum /* dest_id */,
- GLint /* level */,
GLint /* internalformat */,
GLenum /* dest_type */) {
}
+void GLES2InterfaceStub::CopySubTextureCHROMIUM(GLenum /* target */,
+ GLenum /* source_id */,
+ GLenum /* dest_id */,
+ GLint /* xoffset */,
+ GLint /* yoffset */) {
+}
void GLES2InterfaceStub::DrawArraysInstancedANGLE(GLenum /* mode */,
GLint /* first */,
GLsizei /* count */,
diff --git a/gpu/command_buffer/client/gles2_trace_implementation_autogen.h b/gpu/command_buffer/client/gles2_trace_implementation_autogen.h
index e5a69a4..8a9be79 100644
--- a/gpu/command_buffer/client/gles2_trace_implementation_autogen.h
+++ b/gpu/command_buffer/client/gles2_trace_implementation_autogen.h
@@ -624,9 +624,13 @@
void CopyTextureCHROMIUM(GLenum target,
GLenum source_id,
GLenum dest_id,
- GLint level,
GLint internalformat,
GLenum dest_type) override;
+void CopySubTextureCHROMIUM(GLenum target,
+ GLenum source_id,
+ GLenum dest_id,
+ GLint xoffset,
+ GLint yoffset) override;
void DrawArraysInstancedANGLE(GLenum mode,
GLint first,
GLsizei count,
diff --git a/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h b/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h
index 6dbbc93..d1479b1 100644
--- a/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h
+++ b/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h
@@ -1821,14 +1821,22 @@
void GLES2TraceImplementation::CopyTextureCHROMIUM(GLenum target,
GLenum source_id,
GLenum dest_id,
- GLint level,
GLint internalformat,
GLenum dest_type) {
TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::CopyTextureCHROMIUM");
- gl_->CopyTextureCHROMIUM(target, source_id, dest_id, level, internalformat,
+ gl_->CopyTextureCHROMIUM(target, source_id, dest_id, internalformat,
dest_type);
}
+void GLES2TraceImplementation::CopySubTextureCHROMIUM(GLenum target,
+ GLenum source_id,
+ GLenum dest_id,
+ GLint xoffset,
+ GLint yoffset) {
+ TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::CopySubTextureCHROMIUM");
+ gl_->CopySubTextureCHROMIUM(target, source_id, dest_id, xoffset, yoffset);
+}
+
void GLES2TraceImplementation::DrawArraysInstancedANGLE(GLenum mode,
GLint first,
GLsizei count,
diff --git a/gpu/command_buffer/cmd_buffer_functions.txt b/gpu/command_buffer/cmd_buffer_functions.txt
index a03af9e..140db2c 100644
--- a/gpu/command_buffer/cmd_buffer_functions.txt
+++ b/gpu/command_buffer/cmd_buffer_functions.txt
@@ -263,7 +263,8 @@
GL_APICALL void GL_APIENTRY glGetTranslatedShaderSourceANGLE (GLidShader shader, GLsizeiNotNegative bufsize, GLsizeiOptional* length, char* source);
GL_APICALL void GL_APIENTRY glPostSubBufferCHROMIUM (GLint x, GLint y, GLint width, GLint height);
GL_APICALL void GL_APIENTRY glTexImageIOSurface2DCHROMIUM (GLenumTextureBindTarget target, GLsizei width, GLsizei height, GLuint ioSurfaceId, GLuint plane);
-GL_APICALL void GL_APIENTRY glCopyTextureCHROMIUM (GLenum target, GLenum source_id, GLenum dest_id, GLint level, GLintTextureInternalFormat internalformat, GLenumPixelType dest_type);
+GL_APICALL void GL_APIENTRY glCopyTextureCHROMIUM (GLenum target, GLenum source_id, GLenum dest_id, GLintTextureInternalFormat internalformat, GLenumPixelType dest_type);
+GL_APICALL void GL_APIENTRY glCopySubTextureCHROMIUM (GLenum target, GLenum source_id, GLenum dest_id, GLint xoffset, GLint yoffset);
GL_APICALL void GL_APIENTRY glDrawArraysInstancedANGLE (GLenumDrawMode mode, GLint first, GLsizei count, GLsizei primcount);
GL_APICALL void GL_APIENTRY glDrawElementsInstancedANGLE (GLenumDrawMode mode, GLsizei count, GLenumIndexType type, const void* indices, GLsizei primcount);
GL_APICALL void GL_APIENTRY glVertexAttribDivisorANGLE (GLuint index, GLuint divisor);
diff --git a/gpu/command_buffer/common/gles2_cmd_format_autogen.h b/gpu/command_buffer/common/gles2_cmd_format_autogen.h
index 71b1f3f..d3cb00a 100644
--- a/gpu/command_buffer/common/gles2_cmd_format_autogen.h
+++ b/gpu/command_buffer/common/gles2_cmd_format_autogen.h
@@ -11375,14 +11375,12 @@
void Init(GLenum _target,
GLenum _source_id,
GLenum _dest_id,
- GLint _level,
GLint _internalformat,
GLenum _dest_type) {
SetHeader();
target = _target;
source_id = _source_id;
dest_id = _dest_id;
- level = _level;
internalformat = _internalformat;
dest_type = _dest_type;
}
@@ -11391,11 +11389,10 @@
GLenum _target,
GLenum _source_id,
GLenum _dest_id,
- GLint _level,
GLint _internalformat,
GLenum _dest_type) {
- static_cast<ValueType*>(cmd)->Init(_target, _source_id, _dest_id, _level,
- _internalformat, _dest_type);
+ static_cast<ValueType*>(cmd)
+ ->Init(_target, _source_id, _dest_id, _internalformat, _dest_type);
return NextCmdAddress<ValueType>(cmd);
}
@@ -11403,13 +11400,12 @@
uint32_t target;
uint32_t source_id;
uint32_t dest_id;
- int32_t level;
int32_t internalformat;
uint32_t dest_type;
};
-static_assert(sizeof(CopyTextureCHROMIUM) == 28,
- "size of CopyTextureCHROMIUM should be 28");
+static_assert(sizeof(CopyTextureCHROMIUM) == 24,
+ "size of CopyTextureCHROMIUM should be 24");
static_assert(offsetof(CopyTextureCHROMIUM, header) == 0,
"offset of CopyTextureCHROMIUM header should be 0");
static_assert(offsetof(CopyTextureCHROMIUM, target) == 4,
@@ -11418,12 +11414,69 @@
"offset of CopyTextureCHROMIUM source_id should be 8");
static_assert(offsetof(CopyTextureCHROMIUM, dest_id) == 12,
"offset of CopyTextureCHROMIUM dest_id should be 12");
-static_assert(offsetof(CopyTextureCHROMIUM, level) == 16,
- "offset of CopyTextureCHROMIUM level should be 16");
-static_assert(offsetof(CopyTextureCHROMIUM, internalformat) == 20,
- "offset of CopyTextureCHROMIUM internalformat should be 20");
-static_assert(offsetof(CopyTextureCHROMIUM, dest_type) == 24,
- "offset of CopyTextureCHROMIUM dest_type should be 24");
+static_assert(offsetof(CopyTextureCHROMIUM, internalformat) == 16,
+ "offset of CopyTextureCHROMIUM internalformat should be 16");
+static_assert(offsetof(CopyTextureCHROMIUM, dest_type) == 20,
+ "offset of CopyTextureCHROMIUM dest_type should be 20");
+
+struct CopySubTextureCHROMIUM {
+ typedef CopySubTextureCHROMIUM ValueType;
+ static const CommandId kCmdId = kCopySubTextureCHROMIUM;
+ static const cmd::ArgFlags kArgFlags = cmd::kFixed;
+ static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3);
+
+ static uint32_t ComputeSize() {
+ return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT
+ }
+
+ void SetHeader() { header.SetCmd<ValueType>(); }
+
+ void Init(GLenum _target,
+ GLenum _source_id,
+ GLenum _dest_id,
+ GLint _xoffset,
+ GLint _yoffset) {
+ SetHeader();
+ target = _target;
+ source_id = _source_id;
+ dest_id = _dest_id;
+ xoffset = _xoffset;
+ yoffset = _yoffset;
+ }
+
+ void* Set(void* cmd,
+ GLenum _target,
+ GLenum _source_id,
+ GLenum _dest_id,
+ GLint _xoffset,
+ GLint _yoffset) {
+ static_cast<ValueType*>(cmd)
+ ->Init(_target, _source_id, _dest_id, _xoffset, _yoffset);
+ return NextCmdAddress<ValueType>(cmd);
+ }
+
+ gpu::CommandHeader header;
+ uint32_t target;
+ uint32_t source_id;
+ uint32_t dest_id;
+ int32_t xoffset;
+ int32_t yoffset;
+};
+
+static_assert(sizeof(CopySubTextureCHROMIUM) == 24,
+ "size of CopySubTextureCHROMIUM should be 24");
+static_assert(offsetof(CopySubTextureCHROMIUM, header) == 0,
+ "offset of CopySubTextureCHROMIUM header should be 0");
+static_assert(offsetof(CopySubTextureCHROMIUM, target) == 4,
+ "offset of CopySubTextureCHROMIUM target should be 4");
+static_assert(offsetof(CopySubTextureCHROMIUM, source_id) == 8,
+ "offset of CopySubTextureCHROMIUM source_id should be 8");
+static_assert(offsetof(CopySubTextureCHROMIUM, dest_id) == 12,
+ "offset of CopySubTextureCHROMIUM dest_id should be 12");
+static_assert(offsetof(CopySubTextureCHROMIUM, xoffset) == 16,
+ "offset of CopySubTextureCHROMIUM xoffset should be 16");
+static_assert(offsetof(CopySubTextureCHROMIUM, yoffset) == 20,
+ "offset of CopySubTextureCHROMIUM yoffset should be 20");
struct DrawArraysInstancedANGLE {
typedef DrawArraysInstancedANGLE ValueType;
diff --git a/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h b/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h
index 1d18fa8..3162276 100644
--- a/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h
+++ b/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h
@@ -3914,19 +3914,34 @@
TEST_F(GLES2FormatTest, CopyTextureCHROMIUM) {
cmds::CopyTextureCHROMIUM& cmd = *GetBufferAs<cmds::CopyTextureCHROMIUM>();
- void* next_cmd =
- cmd.Set(&cmd, static_cast<GLenum>(11), static_cast<GLenum>(12),
- static_cast<GLenum>(13), static_cast<GLint>(14),
- static_cast<GLint>(15), static_cast<GLenum>(16));
+ void* next_cmd = cmd.Set(&cmd, static_cast<GLenum>(11),
+ static_cast<GLenum>(12), static_cast<GLenum>(13),
+ static_cast<GLint>(14), static_cast<GLenum>(15));
EXPECT_EQ(static_cast<uint32_t>(cmds::CopyTextureCHROMIUM::kCmdId),
cmd.header.command);
EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u);
EXPECT_EQ(static_cast<GLenum>(11), cmd.target);
EXPECT_EQ(static_cast<GLenum>(12), cmd.source_id);
EXPECT_EQ(static_cast<GLenum>(13), cmd.dest_id);
- EXPECT_EQ(static_cast<GLint>(14), cmd.level);
- EXPECT_EQ(static_cast<GLint>(15), cmd.internalformat);
- EXPECT_EQ(static_cast<GLenum>(16), cmd.dest_type);
+ EXPECT_EQ(static_cast<GLint>(14), cmd.internalformat);
+ EXPECT_EQ(static_cast<GLenum>(15), cmd.dest_type);
+ CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd));
+}
+
+TEST_F(GLES2FormatTest, CopySubTextureCHROMIUM) {
+ cmds::CopySubTextureCHROMIUM& cmd =
+ *GetBufferAs<cmds::CopySubTextureCHROMIUM>();
+ void* next_cmd = cmd.Set(&cmd, static_cast<GLenum>(11),
+ static_cast<GLenum>(12), static_cast<GLenum>(13),
+ static_cast<GLint>(14), static_cast<GLint>(15));
+ EXPECT_EQ(static_cast<uint32_t>(cmds::CopySubTextureCHROMIUM::kCmdId),
+ cmd.header.command);
+ EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u);
+ EXPECT_EQ(static_cast<GLenum>(11), cmd.target);
+ EXPECT_EQ(static_cast<GLenum>(12), cmd.source_id);
+ EXPECT_EQ(static_cast<GLenum>(13), cmd.dest_id);
+ EXPECT_EQ(static_cast<GLint>(14), cmd.xoffset);
+ EXPECT_EQ(static_cast<GLint>(15), cmd.yoffset);
CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd));
}
diff --git a/gpu/command_buffer/common/gles2_cmd_ids_autogen.h b/gpu/command_buffer/common/gles2_cmd_ids_autogen.h
index eec1c04..1c739e8 100644
--- a/gpu/command_buffer/common/gles2_cmd_ids_autogen.h
+++ b/gpu/command_buffer/common/gles2_cmd_ids_autogen.h
@@ -254,41 +254,42 @@
OP(PostSubBufferCHROMIUM) /* 495 */ \
OP(TexImageIOSurface2DCHROMIUM) /* 496 */ \
OP(CopyTextureCHROMIUM) /* 497 */ \
- OP(DrawArraysInstancedANGLE) /* 498 */ \
- OP(DrawElementsInstancedANGLE) /* 499 */ \
- OP(VertexAttribDivisorANGLE) /* 500 */ \
- OP(GenMailboxCHROMIUM) /* 501 */ \
- OP(ProduceTextureCHROMIUMImmediate) /* 502 */ \
- OP(ProduceTextureDirectCHROMIUMImmediate) /* 503 */ \
- OP(ConsumeTextureCHROMIUMImmediate) /* 504 */ \
- OP(CreateAndConsumeTextureCHROMIUMImmediate) /* 505 */ \
- OP(BindUniformLocationCHROMIUMBucket) /* 506 */ \
- OP(GenValuebuffersCHROMIUMImmediate) /* 507 */ \
- OP(DeleteValuebuffersCHROMIUMImmediate) /* 508 */ \
- OP(IsValuebufferCHROMIUM) /* 509 */ \
- OP(BindValuebufferCHROMIUM) /* 510 */ \
- OP(SubscribeValueCHROMIUM) /* 511 */ \
- OP(PopulateSubscribedValuesCHROMIUM) /* 512 */ \
- OP(UniformValuebufferCHROMIUM) /* 513 */ \
- OP(BindTexImage2DCHROMIUM) /* 514 */ \
- OP(ReleaseTexImage2DCHROMIUM) /* 515 */ \
- OP(TraceBeginCHROMIUM) /* 516 */ \
- OP(TraceEndCHROMIUM) /* 517 */ \
- OP(AsyncTexSubImage2DCHROMIUM) /* 518 */ \
- OP(AsyncTexImage2DCHROMIUM) /* 519 */ \
- OP(WaitAsyncTexImage2DCHROMIUM) /* 520 */ \
- OP(WaitAllAsyncTexImage2DCHROMIUM) /* 521 */ \
- OP(DiscardFramebufferEXTImmediate) /* 522 */ \
- OP(LoseContextCHROMIUM) /* 523 */ \
- OP(InsertSyncPointCHROMIUM) /* 524 */ \
- OP(WaitSyncPointCHROMIUM) /* 525 */ \
- OP(DrawBuffersEXTImmediate) /* 526 */ \
- OP(DiscardBackbufferCHROMIUM) /* 527 */ \
- OP(ScheduleOverlayPlaneCHROMIUM) /* 528 */ \
- OP(SwapInterval) /* 529 */ \
- OP(MatrixLoadfCHROMIUMImmediate) /* 530 */ \
- OP(MatrixLoadIdentityCHROMIUM) /* 531 */ \
- OP(BlendBarrierKHR) /* 532 */
+ OP(CopySubTextureCHROMIUM) /* 498 */ \
+ OP(DrawArraysInstancedANGLE) /* 499 */ \
+ OP(DrawElementsInstancedANGLE) /* 500 */ \
+ OP(VertexAttribDivisorANGLE) /* 501 */ \
+ OP(GenMailboxCHROMIUM) /* 502 */ \
+ OP(ProduceTextureCHROMIUMImmediate) /* 503 */ \
+ OP(ProduceTextureDirectCHROMIUMImmediate) /* 504 */ \
+ OP(ConsumeTextureCHROMIUMImmediate) /* 505 */ \
+ OP(CreateAndConsumeTextureCHROMIUMImmediate) /* 506 */ \
+ OP(BindUniformLocationCHROMIUMBucket) /* 507 */ \
+ OP(GenValuebuffersCHROMIUMImmediate) /* 508 */ \
+ OP(DeleteValuebuffersCHROMIUMImmediate) /* 509 */ \
+ OP(IsValuebufferCHROMIUM) /* 510 */ \
+ OP(BindValuebufferCHROMIUM) /* 511 */ \
+ OP(SubscribeValueCHROMIUM) /* 512 */ \
+ OP(PopulateSubscribedValuesCHROMIUM) /* 513 */ \
+ OP(UniformValuebufferCHROMIUM) /* 514 */ \
+ OP(BindTexImage2DCHROMIUM) /* 515 */ \
+ OP(ReleaseTexImage2DCHROMIUM) /* 516 */ \
+ OP(TraceBeginCHROMIUM) /* 517 */ \
+ OP(TraceEndCHROMIUM) /* 518 */ \
+ OP(AsyncTexSubImage2DCHROMIUM) /* 519 */ \
+ OP(AsyncTexImage2DCHROMIUM) /* 520 */ \
+ OP(WaitAsyncTexImage2DCHROMIUM) /* 521 */ \
+ OP(WaitAllAsyncTexImage2DCHROMIUM) /* 522 */ \
+ OP(DiscardFramebufferEXTImmediate) /* 523 */ \
+ OP(LoseContextCHROMIUM) /* 524 */ \
+ OP(InsertSyncPointCHROMIUM) /* 525 */ \
+ OP(WaitSyncPointCHROMIUM) /* 526 */ \
+ OP(DrawBuffersEXTImmediate) /* 527 */ \
+ OP(DiscardBackbufferCHROMIUM) /* 528 */ \
+ OP(ScheduleOverlayPlaneCHROMIUM) /* 529 */ \
+ OP(SwapInterval) /* 530 */ \
+ OP(MatrixLoadfCHROMIUMImmediate) /* 531 */ \
+ OP(MatrixLoadIdentityCHROMIUM) /* 532 */ \
+ OP(BlendBarrierKHR) /* 533 */
enum CommandId {
kStartPoint = cmd::kLastCommonId, // All GLES2 commands start after this.
diff --git a/gpu/command_buffer/common/gles2_cmd_utils.cc b/gpu/command_buffer/common/gles2_cmd_utils.cc
index 3985193..0950b41 100644
--- a/gpu/command_buffer/common/gles2_cmd_utils.cc
+++ b/gpu/command_buffer/common/gles2_cmd_utils.cc
@@ -894,6 +894,7 @@
const int32 kBindGeneratesResource = 0x10000;
const int32 kFailIfMajorPerfCaveat = 0x10001;
const int32 kLoseContextWhenOutOfMemory = 0x10002;
+const int32 kES3ContextRequired = 0x10003;
} // namespace
@@ -909,7 +910,8 @@
buffer_preserved(true),
bind_generates_resource(true),
fail_if_major_perf_caveat(false),
- lose_context_when_out_of_memory(false) {}
+ lose_context_when_out_of_memory(false),
+ es3_context_required(false) {}
void ContextCreationAttribHelper::Serialize(std::vector<int32>* attribs) const {
if (alpha_size != -1) {
@@ -952,6 +954,8 @@
attribs->push_back(fail_if_major_perf_caveat ? 1 : 0);
attribs->push_back(kLoseContextWhenOutOfMemory);
attribs->push_back(lose_context_when_out_of_memory ? 1 : 0);
+ attribs->push_back(kES3ContextRequired);
+ attribs->push_back(es3_context_required ? 1 : 0);
attribs->push_back(kNone);
}
@@ -1006,6 +1010,9 @@
case kLoseContextWhenOutOfMemory:
lose_context_when_out_of_memory = value != 0;
break;
+ case kES3ContextRequired:
+ es3_context_required = value != 0;
+ break;
case kNone:
// Terminate list, even if more attributes.
return true;
diff --git a/gpu/command_buffer/common/gles2_cmd_utils.h b/gpu/command_buffer/common/gles2_cmd_utils.h
index 3528cfd..9dd8f28 100644
--- a/gpu/command_buffer/common/gles2_cmd_utils.h
+++ b/gpu/command_buffer/common/gles2_cmd_utils.h
@@ -223,6 +223,7 @@
bool bind_generates_resource;
bool fail_if_major_perf_caveat;
bool lose_context_when_out_of_memory;
+ bool es3_context_required;
};
} // namespace gles2
diff --git a/gpu/command_buffer/common/id_allocator.cc b/gpu/command_buffer/common/id_allocator.cc
index 507b14e..eccb468 100644
--- a/gpu/command_buffer/common/id_allocator.cc
+++ b/gpu/command_buffer/common/id_allocator.cc
@@ -6,84 +6,200 @@
#include "gpu/command_buffer/common/id_allocator.h"
+#include <limits>
#include "base/logging.h"
namespace gpu {
-IdAllocator::IdAllocator() {}
+IdAllocator::IdAllocator() {
+ COMPILE_ASSERT(kInvalidResource == 0u, invalid_resource_is_not_zero);
+ // Simplify the code by making sure that lower_bound(id) never
+ // returns the beginning of the map, if id is valid (eg !=
+ // kInvalidResource).
+ used_ids_.insert(std::make_pair(0u, 0u));
+}
IdAllocator::~IdAllocator() {}
ResourceId IdAllocator::AllocateID() {
- ResourceId id;
- ResourceIdSet::iterator iter = free_ids_.begin();
- if (iter != free_ids_.end()) {
- id = *iter;
- } else {
- id = LastUsedId() + 1;
- if (!id) {
- // We wrapped around to 0.
- id = FindFirstUnusedId();
- }
- }
- MarkAsUsed(id);
- return id;
+ return AllocateIDRange(1u);
}
ResourceId IdAllocator::AllocateIDAtOrAbove(ResourceId desired_id) {
- ResourceId id;
- ResourceIdSet::iterator iter = free_ids_.lower_bound(desired_id);
- if (iter != free_ids_.end()) {
- id = *iter;
- } else if (LastUsedId() < desired_id) {
- id = desired_id;
- } else {
- id = LastUsedId() + 1;
- if (!id) {
- // We wrapped around to 0.
- id = FindFirstUnusedId();
- }
+ if (desired_id == 0u || desired_id == 1u) {
+ return AllocateIDRange(1u);
}
- MarkAsUsed(id);
- return id;
+
+ ResourceIdRangeMap::iterator current = used_ids_.lower_bound(desired_id);
+ ResourceIdRangeMap::iterator next = current;
+ if (current == used_ids_.end() || current->first > desired_id) {
+ current--;
+ } else {
+ next++;
+ }
+
+ ResourceId first_id = current->first;
+ ResourceId last_id = current->second;
+
+ DCHECK(desired_id >= first_id);
+
+ if (desired_id - 1u <= last_id) {
+ // Append to current range.
+ last_id++;
+ if (last_id == 0) {
+ // The increment overflowed.
+ return AllocateIDRange(1u);
+ }
+
+ current->second = last_id;
+
+ if (next != used_ids_.end() && next->first - 1u == last_id) {
+ // Merge with next range.
+ current->second = next->second;
+ used_ids_.erase(next);
+ }
+ return last_id;
+ } else if (next != used_ids_.end() && next->first - 1u == desired_id) {
+ // Prepend to next range.
+ ResourceId last_existing_id = next->second;
+ used_ids_.erase(next);
+ used_ids_.insert(std::make_pair(desired_id, last_existing_id));
+ return desired_id;
+ }
+ used_ids_.insert(std::make_pair(desired_id, desired_id));
+ return desired_id;
+}
+
+ResourceId IdAllocator::AllocateIDRange(uint32_t range) {
+ DCHECK(range > 0u);
+
+ ResourceIdRangeMap::iterator current = used_ids_.begin();
+ ResourceIdRangeMap::iterator next = current;
+
+ while (++next != used_ids_.end()) {
+ if (next->first - current->second > range) {
+ break;
+ }
+ current = next;
+ }
+
+ ResourceId first_id = current->second + 1u;
+ ResourceId last_id = first_id + range - 1u;
+
+ if (first_id == 0u || last_id < first_id) {
+ return kInvalidResource;
+ }
+
+ current->second = last_id;
+
+ if (next != used_ids_.end() && next->first - 1u == last_id) {
+ // Merge with next range.
+ current->second = next->second;
+ used_ids_.erase(next);
+ }
+
+ return first_id;
}
bool IdAllocator::MarkAsUsed(ResourceId id) {
DCHECK(id);
- free_ids_.erase(id);
- std::pair<ResourceIdSet::iterator, bool> result = used_ids_.insert(id);
- return result.second;
+ ResourceIdRangeMap::iterator current = used_ids_.lower_bound(id);
+ if (current != used_ids_.end() && current->first == id) {
+ return false;
+ }
+
+ ResourceIdRangeMap::iterator next = current;
+ --current;
+
+ if (current->second >= id) {
+ return false;
+ }
+
+ DCHECK(current->first < id && current->second < id);
+
+ if (current->second + 1u == id) {
+ // Append to current range.
+ current->second = id;
+ if (next != used_ids_.end() && next->first - 1u == id) {
+ // Merge with next range.
+ current->second = next->second;
+ used_ids_.erase(next);
+ }
+ return true;
+ } else if (next != used_ids_.end() && next->first - 1u == id) {
+ // Prepend to next range.
+ ResourceId last_existing_id = next->second;
+ used_ids_.erase(next);
+ used_ids_.insert(std::make_pair(id, last_existing_id));
+ return true;
+ }
+
+ used_ids_.insert(std::make_pair(id, id));
+ return true;
}
void IdAllocator::FreeID(ResourceId id) {
- if (id) {
- used_ids_.erase(id);
- free_ids_.insert(id);
+ FreeIDRange(id, 1u);
+}
+
+void IdAllocator::FreeIDRange(ResourceId first_id, uint32 range) {
+ COMPILE_ASSERT(kInvalidResource == 0u, invalid_resource_is_not_zero);
+
+ if (range == 0u || (first_id == 0u && range == 1u)) {
+ return;
+ }
+
+ if (first_id == 0u) {
+ first_id++;
+ range--;
+ }
+
+ ResourceId last_id = first_id + range - 1u;
+ if (last_id < first_id) {
+ last_id = std::numeric_limits<ResourceId>::max();
+ }
+
+ while (true) {
+ ResourceIdRangeMap::iterator current = used_ids_.lower_bound(last_id);
+ if (current == used_ids_.end() || current->first > last_id) {
+ --current;
+ }
+
+ if (current->second < first_id) {
+ return;
+ }
+
+ if (current->first >= first_id) {
+ ResourceId last_existing_id = current->second;
+ used_ids_.erase(current);
+ if (last_id < last_existing_id) {
+ used_ids_.insert(std::make_pair(last_id + 1u, last_existing_id));
+ }
+ } else if (current->second <= last_id) {
+ current->second = first_id - 1u;
+ } else {
+ DCHECK(current->first < first_id && current->second > last_id);
+ ResourceId last_existing_id = current->second;
+ current->second = first_id - 1u;
+ used_ids_.insert(std::make_pair(last_id + 1u, last_existing_id));
+ }
}
}
bool IdAllocator::InUse(ResourceId id) const {
- return id == kInvalidResource || used_ids_.find(id) != used_ids_.end();
-}
-
-ResourceId IdAllocator::LastUsedId() const {
- if (used_ids_.empty()) {
- return 0u;
- } else {
- return *used_ids_.rbegin();
+ if (id == kInvalidResource) {
+ return false;
}
-}
-ResourceId IdAllocator::FindFirstUnusedId() const {
- ResourceId id = 1;
- for (ResourceIdSet::const_iterator it = used_ids_.begin();
- it != used_ids_.end(); ++it) {
- if ((*it) != id) {
- return id;
+ ResourceIdRangeMap::const_iterator current = used_ids_.lower_bound(id);
+ if (current != used_ids_.end()) {
+ if (current->first == id) {
+ return true;
}
- ++id;
}
- return id;
+
+ --current;
+ return current->second >= id;
}
} // namespace gpu
diff --git a/gpu/command_buffer/common/id_allocator.h b/gpu/command_buffer/common/id_allocator.h
index b877083..118424f 100644
--- a/gpu/command_buffer/common/id_allocator.h
+++ b/gpu/command_buffer/common/id_allocator.h
@@ -9,7 +9,7 @@
#include <stdint.h>
-#include <set>
+#include <map>
#include <utility>
#include "base/compiler_specific.h"
@@ -36,27 +36,28 @@
// Note: may wrap if it starts near limit.
ResourceId AllocateIDAtOrAbove(ResourceId desired_id);
+ // Allocates |range| amount of contiguous ids.
+ // Returns the first id to |first_id| or |kInvalidResource| if
+ // allocation failed.
+ ResourceId AllocateIDRange(uint32_t range);
+
// Marks an id as used. Returns false if id was already used.
bool MarkAsUsed(ResourceId id);
// Frees a resource ID.
void FreeID(ResourceId id);
+ // Frees a |range| amount of contiguous ids, starting from |first_id|.
+ void FreeIDRange(ResourceId first_id, uint32_t range);
+
// Checks whether or not a resource ID is in use.
bool InUse(ResourceId id) const;
private:
- // TODO(gman): This would work much better with ranges or a hash table.
- typedef std::set<ResourceId> ResourceIdSet;
+ // first_id -> last_id mapping.
+ typedef std::map<ResourceId, ResourceId> ResourceIdRangeMap;
- // The highest ID on the used list.
- ResourceId LastUsedId() const;
-
- // Lowest ID that isn't on the used list. This is slow, use as a last resort.
- ResourceId FindFirstUnusedId() const;
-
- ResourceIdSet used_ids_;
- ResourceIdSet free_ids_;
+ ResourceIdRangeMap used_ids_;
DISALLOW_COPY_AND_ASSIGN(IdAllocator);
};
diff --git a/gpu/command_buffer/common/id_allocator_test.cc b/gpu/command_buffer/common/id_allocator_test.cc
index adeed5b..7d93906 100644
--- a/gpu/command_buffer/common/id_allocator_test.cc
+++ b/gpu/command_buffer/common/id_allocator_test.cc
@@ -125,4 +125,123 @@
EXPECT_NE(kInvalidResource, id3);
}
+TEST_F(IdAllocatorTest, AllocateIDRange) {
+ const ResourceId kMaxPossibleOffset = std::numeric_limits<ResourceId>::max();
+
+ IdAllocator* allocator = id_allocator();
+
+ ResourceId id1 = allocator->AllocateIDRange(1);
+ EXPECT_EQ(1u, id1);
+ ResourceId id2 = allocator->AllocateIDRange(2);
+ EXPECT_EQ(2u, id2);
+ ResourceId id3 = allocator->AllocateIDRange(3);
+ EXPECT_EQ(4u, id3);
+ ResourceId id4 = allocator->AllocateID();
+ EXPECT_EQ(7u, id4);
+ allocator->FreeID(3);
+ ResourceId id5 = allocator->AllocateIDRange(1);
+ EXPECT_EQ(3u, id5);
+ allocator->FreeID(5);
+ allocator->FreeID(2);
+ allocator->FreeID(4);
+ ResourceId id6 = allocator->AllocateIDRange(2);
+ EXPECT_EQ(4u, id6);
+ ResourceId id7 = allocator->AllocateIDAtOrAbove(kMaxPossibleOffset);
+ EXPECT_EQ(kMaxPossibleOffset, id7);
+ ResourceId id8 = allocator->AllocateIDAtOrAbove(kMaxPossibleOffset);
+ EXPECT_EQ(2u, id8);
+ ResourceId id9 = allocator->AllocateIDRange(50);
+ EXPECT_EQ(8u, id9);
+ ResourceId id10 = allocator->AllocateIDRange(50);
+ EXPECT_EQ(58u, id10);
+ // Remove all the low-numbered ids.
+ allocator->FreeID(1);
+ allocator->FreeID(15);
+ allocator->FreeIDRange(2, 107);
+ ResourceId id11 = allocator->AllocateIDRange(100);
+ EXPECT_EQ(1u, id11);
+ allocator->FreeID(kMaxPossibleOffset);
+ ResourceId id12 = allocator->AllocateIDRange(100);
+ EXPECT_EQ(101u, id12);
+
+ ResourceId id13 = allocator->AllocateIDAtOrAbove(kMaxPossibleOffset - 2u);
+ EXPECT_EQ(kMaxPossibleOffset - 2u, id13);
+ ResourceId id14 = allocator->AllocateIDRange(3);
+ EXPECT_EQ(201u, id14);
+}
+
+TEST_F(IdAllocatorTest, AllocateIDRangeEndNoEffect) {
+ const ResourceId kMaxPossibleOffset = std::numeric_limits<ResourceId>::max();
+
+ IdAllocator* allocator = id_allocator();
+ ResourceId id1 = allocator->AllocateIDAtOrAbove(kMaxPossibleOffset - 2u);
+ EXPECT_EQ(kMaxPossibleOffset - 2u, id1);
+ ResourceId id3 = allocator->AllocateIDRange(3);
+ EXPECT_EQ(1u, id3);
+ ResourceId id2 = allocator->AllocateIDRange(2);
+ EXPECT_EQ(4u, id2);
+}
+
+TEST_F(IdAllocatorTest, AllocateFullIDRange) {
+ const uint32_t kMaxPossibleRange = std::numeric_limits<uint32_t>::max();
+ const ResourceId kFreedId = 555u;
+ IdAllocator* allocator = id_allocator();
+
+ ResourceId id1 = allocator->AllocateIDRange(kMaxPossibleRange);
+ EXPECT_EQ(1u, id1);
+ ResourceId id2 = allocator->AllocateID();
+ EXPECT_EQ(0u, id2);
+ allocator->FreeID(kFreedId);
+ ResourceId id3 = allocator->AllocateID();
+ EXPECT_EQ(kFreedId, id3);
+ ResourceId id4 = allocator->AllocateID();
+ EXPECT_EQ(0u, id4);
+ allocator->FreeID(kFreedId + 1u);
+ allocator->FreeID(kFreedId + 4u);
+ allocator->FreeID(kFreedId + 3u);
+ allocator->FreeID(kFreedId + 5u);
+ allocator->FreeID(kFreedId + 2u);
+ ResourceId id5 = allocator->AllocateIDRange(5);
+ EXPECT_EQ(kFreedId + 1u, id5);
+}
+
+TEST_F(IdAllocatorTest, AllocateIDRangeNoWrapInRange) {
+ const uint32_t kMaxPossibleRange = std::numeric_limits<uint32_t>::max();
+ const ResourceId kAllocId = 10u;
+ IdAllocator* allocator = id_allocator();
+
+ ResourceId id1 = allocator->AllocateIDAtOrAbove(kAllocId);
+ EXPECT_EQ(kAllocId, id1);
+ ResourceId id2 = allocator->AllocateIDRange(kMaxPossibleRange - 5u);
+ EXPECT_EQ(0u, id2);
+ ResourceId id3 = allocator->AllocateIDRange(kMaxPossibleRange - kAllocId);
+ EXPECT_EQ(kAllocId + 1u, id3);
+}
+
+TEST_F(IdAllocatorTest, AllocateIdMax) {
+ const uint32_t kMaxPossibleRange = std::numeric_limits<uint32_t>::max();
+
+ IdAllocator* allocator = id_allocator();
+ ResourceId id = allocator->AllocateIDRange(kMaxPossibleRange);
+ EXPECT_EQ(1u, id);
+ allocator->FreeIDRange(id, kMaxPossibleRange - 1u);
+ ResourceId id2 = allocator->AllocateIDRange(kMaxPossibleRange);
+ EXPECT_EQ(0u, id2);
+ allocator->FreeIDRange(id, kMaxPossibleRange);
+ ResourceId id3 = allocator->AllocateIDRange(kMaxPossibleRange);
+ EXPECT_EQ(1u, id3);
+}
+
+TEST_F(IdAllocatorTest, ZeroIdCases) {
+ IdAllocator* allocator = id_allocator();
+ EXPECT_FALSE(allocator->InUse(0));
+ ResourceId id1 = allocator->AllocateIDAtOrAbove(0);
+ EXPECT_NE(0u, id1);
+ EXPECT_FALSE(allocator->InUse(0));
+ allocator->FreeID(0);
+ EXPECT_FALSE(allocator->InUse(0));
+ EXPECT_TRUE(allocator->InUse(id1));
+ allocator->FreeID(id1);
+ EXPECT_FALSE(allocator->InUse(id1));
+}
} // namespace gpu
diff --git a/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc b/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc
index 9098aba..d41ee9d 100644
--- a/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc
+++ b/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc
@@ -32,6 +32,11 @@
namespace {
+const GLfloat kIdentityMatrix[16] = {1.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 1.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 1.0f};
+
enum VertexShaderId {
VERTEX_SHADER_COPY_TEXTURE,
VERTEX_SHADER_COPY_TEXTURE_FLIP_Y,
@@ -188,7 +193,6 @@
bool BindFramebufferTexture2D(GLenum target,
GLuint texture_id,
- GLint level,
GLuint framebuffer) {
DCHECK(target == GL_TEXTURE_2D || target == GL_TEXTURE_RECTANGLE_ARB);
glActiveTexture(GL_TEXTURE0);
@@ -200,8 +204,8 @@
glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebuffer);
- glFramebufferTexture2DEXT(
- GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, target, texture_id, level);
+ glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, target,
+ texture_id, 0);
#ifndef NDEBUG
GLenum fb_status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER);
@@ -217,28 +221,20 @@
GLenum source_target,
GLuint source_id,
GLuint dest_id,
- GLint dest_level,
GLenum dest_internal_format,
GLsizei width,
GLsizei height,
GLuint framebuffer) {
DCHECK(source_target == GL_TEXTURE_2D ||
source_target == GL_TEXTURE_RECTANGLE_ARB);
- if (BindFramebufferTexture2D(
- source_target, source_id, 0 /* level */, framebuffer)) {
+ if (BindFramebufferTexture2D(source_target, source_id, framebuffer)) {
glBindTexture(GL_TEXTURE_2D, dest_id);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glCopyTexImage2D(GL_TEXTURE_2D,
- dest_level,
- dest_internal_format,
- 0 /* x */,
- 0 /* y */,
- width,
- height,
- 0 /* border */);
+ glCopyTexImage2D(GL_TEXTURE_2D, 0 /* level */, dest_internal_format,
+ 0 /* x */, 0 /* y */, width, height, 0 /* border */);
}
decoder->RestoreTextureState(source_id);
@@ -248,6 +244,45 @@
decoder->RestoreFramebufferBindings();
}
+void DoCopyTexSubImage2D(const gpu::gles2::GLES2Decoder* decoder,
+ GLenum source_target,
+ GLuint source_id,
+ GLuint dest_id,
+ GLint xoffset,
+ GLint yoffset,
+ GLsizei source_width,
+ GLsizei source_height,
+ GLuint framebuffer) {
+ DCHECK(source_target == GL_TEXTURE_2D ||
+ source_target == GL_TEXTURE_RECTANGLE_ARB);
+ if (BindFramebufferTexture2D(source_target, source_id, framebuffer)) {
+ glBindTexture(GL_TEXTURE_2D, dest_id);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glCopyTexSubImage2D(GL_TEXTURE_2D, 0 /* level */, xoffset, yoffset,
+ 0 /* x */, 0 /* y */, source_width, source_height);
+ }
+
+ decoder->RestoreTextureState(source_id);
+ decoder->RestoreTextureState(dest_id);
+ decoder->RestoreTextureUnitBindings(0);
+ decoder->RestoreActiveTexture();
+ decoder->RestoreFramebufferBindings();
+}
+
+// Copy from SkMatrix44::preTranslate
+void PreTranslate(GLfloat* matrix, GLfloat dx, GLfloat dy, GLfloat dz) {
+ if (!dx && !dy && !dz)
+ return;
+
+ for (int i = 0; i < 4; ++i) {
+ matrix[(3 * 4) + i] = matrix[(0 * 4) + i] * dx + matrix[(1 * 4) + i] * dy +
+ matrix[(2 * 4) + i] * dz + matrix[(3 * 4) + i];
+ }
+}
+
} // namespace
namespace gpu {
@@ -318,7 +353,6 @@
GLuint source_id,
GLenum source_internal_format,
GLuint dest_id,
- GLint dest_level,
GLenum dest_internal_format,
GLsizei width,
GLsizei height,
@@ -342,7 +376,6 @@
source_target,
source_id,
dest_id,
- dest_level,
dest_internal_format,
width,
height,
@@ -350,22 +383,51 @@
return;
}
- // Use default transform matrix if no transform passed in.
- const static GLfloat default_matrix[16] = {1.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 1.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 1.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 1.0f};
- DoCopyTextureWithTransform(decoder,
- source_target,
- source_id,
- dest_id,
- dest_level,
- width,
- height,
- flip_y,
- premultiply_alpha,
- unpremultiply_alpha,
- default_matrix);
+ // Use kIdentityMatrix if no transform passed in.
+ DoCopyTextureWithTransform(decoder, source_target, source_id, dest_id, width,
+ height, flip_y, premultiply_alpha,
+ unpremultiply_alpha, kIdentityMatrix);
+}
+
+void CopyTextureCHROMIUMResourceManager::DoCopySubTexture(
+ const gles2::GLES2Decoder* decoder,
+ GLenum source_target,
+ GLuint source_id,
+ GLenum source_internal_format,
+ GLuint dest_id,
+ GLenum dest_internal_format,
+ GLint xoffset,
+ GLint yoffset,
+ GLsizei dest_width,
+ GLsizei dest_height,
+ GLsizei source_width,
+ GLsizei source_height,
+ bool flip_y,
+ bool premultiply_alpha,
+ bool unpremultiply_alpha) {
+ bool premultiply_alpha_change = premultiply_alpha ^ unpremultiply_alpha;
+ // GL_INVALID_OPERATION is generated if the currently bound framebuffer's
+ // format does not contain a superset of the components required by the base
+ // format of internalformat.
+ // https://www.khronos.org/opengles/sdk/docs/man/xhtml/glCopyTexImage2D.xml
+ bool source_format_contain_superset_of_dest_format =
+ (source_internal_format == dest_internal_format &&
+ source_internal_format != GL_BGRA_EXT) ||
+ (source_internal_format == GL_RGBA && dest_internal_format == GL_RGB);
+ // GL_TEXTURE_RECTANGLE_ARB on FBO is supported by OpenGL, not GLES2,
+ // so restrict this to GL_TEXTURE_2D.
+ if (source_target == GL_TEXTURE_2D && !flip_y && !premultiply_alpha_change &&
+ source_format_contain_superset_of_dest_format) {
+ DoCopyTexSubImage2D(decoder, source_target, source_id, dest_id, xoffset,
+ yoffset, source_width, source_height, framebuffer_);
+ return;
+ }
+
+ // Use kIdentityMatrix if no transform passed in.
+ DoCopySubTextureWithTransform(
+ decoder, source_target, source_id, dest_id, xoffset, yoffset, dest_width,
+ dest_height, source_width, source_height, flip_y, premultiply_alpha,
+ unpremultiply_alpha, kIdentityMatrix);
}
void CopyTextureCHROMIUMResourceManager::DoCopyTextureWithTransform(
@@ -373,16 +435,61 @@
GLenum source_target,
GLuint source_id,
GLuint dest_id,
- GLint dest_level,
GLsizei width,
GLsizei height,
bool flip_y,
bool premultiply_alpha,
bool unpremultiply_alpha,
const GLfloat transform_matrix[16]) {
+ GLsizei dest_width = width;
+ GLsizei dest_height = height;
+ DoCopyTextureInternal(decoder, source_target, source_id, dest_id, 0, 0,
+ dest_width, dest_height, width, height, flip_y,
+ premultiply_alpha, unpremultiply_alpha,
+ transform_matrix);
+}
+
+void CopyTextureCHROMIUMResourceManager::DoCopySubTextureWithTransform(
+ const gles2::GLES2Decoder* decoder,
+ GLenum source_target,
+ GLuint source_id,
+ GLuint dest_id,
+ GLint xoffset,
+ GLint yoffset,
+ GLsizei dest_width,
+ GLsizei dest_height,
+ GLsizei source_width,
+ GLsizei source_height,
+ bool flip_y,
+ bool premultiply_alpha,
+ bool unpremultiply_alpha,
+ const GLfloat transform_matrix[16]) {
+ DoCopyTextureInternal(decoder, source_target, source_id, dest_id, xoffset,
+ yoffset, dest_width, dest_height, source_width,
+ source_height, flip_y, premultiply_alpha,
+ unpremultiply_alpha, transform_matrix);
+}
+
+void CopyTextureCHROMIUMResourceManager::DoCopyTextureInternal(
+ const gles2::GLES2Decoder* decoder,
+ GLenum source_target,
+ GLuint source_id,
+ GLuint dest_id,
+ GLint xoffset,
+ GLint yoffset,
+ GLsizei dest_width,
+ GLsizei dest_height,
+ GLsizei source_width,
+ GLsizei source_height,
+ bool flip_y,
+ bool premultiply_alpha,
+ bool unpremultiply_alpha,
+ const GLfloat transform_matrix[16]) {
DCHECK(source_target == GL_TEXTURE_2D ||
source_target == GL_TEXTURE_RECTANGLE_ARB ||
source_target == GL_TEXTURE_EXTERNAL_OES);
+ DCHECK(xoffset >= 0 && xoffset + source_width <= dest_width);
+ DCHECK(yoffset >= 0 && yoffset + source_height <= dest_height);
if (!initialized_) {
DLOG(ERROR) << "CopyTextureCHROMIUM: Uninitialized manager.";
return;
@@ -426,24 +533,38 @@
}
glUseProgram(info->program);
-#ifndef NDEBUG
- glValidateProgram(info->program);
- GLint validation_status;
- glGetProgramiv(info->program, GL_VALIDATE_STATUS, &validation_status);
- if (GL_TRUE != validation_status) {
- DLOG(ERROR) << "CopyTextureCHROMIUM: Invalid shader.";
- return;
- }
-#endif
+ if (!xoffset && !yoffset) {
+ glUniformMatrix4fv(info->matrix_handle, 1, GL_FALSE, transform_matrix);
+ } else {
+ // transform offsets from ([0, dest_width], [0, dest_height]) coord.
+ // to ([-1, 1], [-1, 1]) coord.
+ GLfloat xoffset_on_vertex = ((2.f * xoffset) / dest_width);
+ GLfloat yoffset_on_vertex = ((2.f * yoffset) / dest_height);
- glUniformMatrix4fv(info->matrix_handle, 1, GL_FALSE, transform_matrix);
+ // Pass view_matrix * offset_matrix to the program.
+ GLfloat view_transform[16];
+ memcpy(view_transform, transform_matrix, 16 * sizeof(GLfloat));
+ PreTranslate(view_transform, xoffset_on_vertex, yoffset_on_vertex, 0);
+ glUniformMatrix4fv(info->matrix_handle, 1, GL_FALSE, view_transform);
+ }
if (source_target == GL_TEXTURE_RECTANGLE_ARB)
- glUniform2f(info->half_size_handle, width / 2.0f, height / 2.0f);
+ glUniform2f(info->half_size_handle, source_width / 2.0f,
+ source_height / 2.0f);
else
glUniform2f(info->half_size_handle, 0.5f, 0.5f);
- if (BindFramebufferTexture2D(
- GL_TEXTURE_2D, dest_id, dest_level, framebuffer_)) {
+ if (BindFramebufferTexture2D(GL_TEXTURE_2D, dest_id, framebuffer_)) {
+#ifndef NDEBUG
+ // glValidateProgram of MACOSX validates FBO unlike other platforms, so
+ // glValidateProgram must be called after FBO binding. crbug.com/463439
+ glValidateProgram(info->program);
+ GLint validation_status;
+ glGetProgramiv(info->program, GL_VALIDATE_STATUS, &validation_status);
+ if (GL_TRUE != validation_status) {
+ DLOG(ERROR) << "CopyTextureCHROMIUM: Invalid shader.";
+ return;
+ }
+#endif
decoder->ClearAllAttributes();
glEnableVertexAttribArray(kVertexPositionAttrib);
@@ -466,7 +587,7 @@
glDepthMask(GL_FALSE);
glDisable(GL_BLEND);
- glViewport(0, 0, width, height);
+ glViewport(0, 0, dest_width, dest_height);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
}
diff --git a/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.h b/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.h
index 083fc4c..5c62141 100644
--- a/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.h
+++ b/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.h
@@ -35,7 +35,6 @@
GLuint source_id,
GLenum source_internal_format,
GLuint dest_id,
- GLint dest_level,
GLenum dest_internal_format,
GLsizei width,
GLsizei height,
@@ -43,13 +42,28 @@
bool premultiply_alpha,
bool unpremultiply_alpha);
+ void DoCopySubTexture(const gles2::GLES2Decoder* decoder,
+ GLenum source_target,
+ GLuint source_id,
+ GLenum source_internal_format,
+ GLuint dest_id,
+ GLenum dest_internal_format,
+ GLint xoffset,
+ GLint yoffset,
+ GLsizei dest_width,
+ GLsizei dest_height,
+ GLsizei source_width,
+ GLsizei source_height,
+ bool flip_y,
+ bool premultiply_alpha,
+ bool unpremultiply_alpha);
+
// This will apply a transform on the source texture before copying to
// destination texture.
void DoCopyTextureWithTransform(const gles2::GLES2Decoder* decoder,
GLenum source_target,
GLuint source_id,
GLuint dest_id,
- GLint dest_level,
GLsizei width,
GLsizei height,
bool flip_y,
@@ -57,6 +71,21 @@
bool unpremultiply_alpha,
const GLfloat transform_matrix[16]);
+ void DoCopySubTextureWithTransform(const gles2::GLES2Decoder* decoder,
+ GLenum source_target,
+ GLuint source_id,
+ GLuint dest_id,
+ GLint xoffset,
+ GLint yoffset,
+ GLsizei dest_width,
+ GLsizei dest_height,
+ GLsizei source_width,
+ GLsizei source_height,
+ bool flip_y,
+ bool premultiply_alpha,
+ bool unpremultiply_alpha,
+ const GLfloat transform_matrix[16]);
+
// The attributes used during invocation of the extension.
static const GLuint kVertexPositionAttrib = 0;
@@ -74,6 +103,21 @@
GLuint sampler_handle;
};
+ void DoCopyTextureInternal(const gles2::GLES2Decoder* decoder,
+ GLenum source_target,
+ GLuint source_id,
+ GLuint dest_id,
+ GLint xoffset,
+ GLint yoffset,
+ GLsizei dest_width,
+ GLsizei dest_height,
+ GLsizei source_width,
+ GLsizei source_height,
+ bool flip_y,
+ bool premultiply_alpha,
+ bool unpremultiply_alpha,
+ const GLfloat transform_matrix[16]);
+
bool initialized_;
typedef std::vector<GLuint> ShaderVector;
ShaderVector vertex_shaders_;
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index 8c24d3c..f76c085 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -81,10 +81,15 @@
namespace {
-static const char kOESDerivativeExtension[] = "GL_OES_standard_derivatives";
-static const char kEXTFragDepthExtension[] = "GL_EXT_frag_depth";
-static const char kEXTDrawBuffersExtension[] = "GL_EXT_draw_buffers";
-static const char kEXTShaderTextureLodExtension[] = "GL_EXT_shader_texture_lod";
+const char kOESDerivativeExtension[] = "GL_OES_standard_derivatives";
+const char kEXTFragDepthExtension[] = "GL_EXT_frag_depth";
+const char kEXTDrawBuffersExtension[] = "GL_EXT_draw_buffers";
+const char kEXTShaderTextureLodExtension[] = "GL_EXT_shader_texture_lod";
+
+const GLfloat kIdentityMatrix[16] = {1.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 1.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 1.0f};
static bool PrecisionMeetsSpecForHighpFloat(GLint rangeMin,
GLint rangeMax,
@@ -585,7 +590,7 @@
bool Initialize(const scoped_refptr<gfx::GLSurface>& surface,
const scoped_refptr<gfx::GLContext>& context,
bool offscreen,
- const gfx::Size& size,
+ const gfx::Size& offscreen_size,
const DisallowedFeatures& disallowed_features,
const std::vector<int32>& attribs) override;
void Destroy(bool have_context) override;
@@ -936,13 +941,17 @@
GLuint io_surface_id,
GLuint plane);
- void DoCopyTextureCHROMIUM(
- GLenum target,
- GLuint source_id,
- GLuint target_id,
- GLint level,
- GLenum internal_format,
- GLenum dest_type);
+ void DoCopyTextureCHROMIUM(GLenum target,
+ GLuint source_id,
+ GLuint dest_id,
+ GLenum internal_format,
+ GLenum dest_type);
+
+ void DoCopySubTextureCHROMIUM(GLenum target,
+ GLuint source_id,
+ GLuint dest_id,
+ GLint xoffset,
+ GLint yoffset);
// Wrapper for TexStorage2DEXT.
void DoTexStorage2DEXT(
@@ -1658,6 +1667,11 @@
GLenum target, GLint level, GLint xoffset, GLint yoffset,
GLsizei width, GLsizei height, GLenum format,
Texture* texture);
+ bool ValidateCopyTextureCHROMIUM(const char* function_name,
+ GLenum target,
+ TextureRef* source_texture_ref,
+ TextureRef* dest_texture_ref,
+ GLenum dest_internal_format);
void RenderWarning(const char* filename, int line, const std::string& msg);
void PerformanceWarning(
@@ -2434,13 +2448,17 @@
const scoped_refptr<gfx::GLSurface>& surface,
const scoped_refptr<gfx::GLContext>& context,
bool offscreen,
- const gfx::Size& size,
+ const gfx::Size& offscreen_size,
const DisallowedFeatures& disallowed_features,
const std::vector<int32>& attribs) {
TRACE_EVENT0("gpu", "GLES2DecoderImpl::Initialize");
DCHECK(context->IsCurrent(surface.get()));
DCHECK(!context_.get());
+ ContextCreationAttribHelper attrib_parser;
+ if (!attrib_parser.Parse(attribs))
+ return false;
+
surfaceless_ = surface->IsSurfaceless() && !offscreen;
set_initialized();
@@ -2457,7 +2475,10 @@
}
if (base::CommandLine::ForCurrentProcess()->HasSwitch(
- switches::kEnableUnsafeES3APIs)) {
+ switches::kEnableUnsafeES3APIs) &&
+ attrib_parser.es3_context_required) {
+ // TODO(zmo): We need to implement capabilities check to ensure we can
+ // actually create ES3 contexts.
set_unsafe_es3_apis_enabled(true);
}
@@ -2470,10 +2491,6 @@
context_ = context;
surface_ = surface;
- ContextCreationAttribHelper attrib_parser;
- if (!attrib_parser.Parse(attribs))
- return false;
-
// Create GPU Tracer for timing values.
gpu_tracer_.reset(new GPUTracer(this));
@@ -2675,12 +2692,15 @@
// Allocate the render buffers at their initial size and check the status
// of the frame buffers is okay.
- if (!ResizeOffscreenFrameBuffer(size)) {
+ if (!ResizeOffscreenFrameBuffer(offscreen_size)) {
LOG(ERROR) << "Could not allocate offscreen buffer storage.";
Destroy(true);
return false;
}
+ state_.viewport_width = offscreen_size.width();
+ state_.viewport_height = offscreen_size.height();
+
// Allocate the offscreen saved color texture.
DCHECK(offscreen_saved_color_format_);
offscreen_saved_color_texture_->AllocateStorage(
@@ -2720,6 +2740,9 @@
glGetIntegerv(GL_STENCIL_BITS, &v);
back_buffer_has_stencil_ = attrib_parser.stencil_size != 0 && v > 0;
}
+
+ state_.viewport_width = surface->GetSize().width();
+ state_.viewport_height = surface->GetSize().height();
}
// OpenGL ES 2.0 implicitly enables the desktop GL capability
@@ -2742,9 +2765,6 @@
return false;
}
- state_.viewport_width = size.width();
- state_.viewport_height = size.height();
-
GLint viewport_params[4] = { 0 };
glGetIntegerv(GL_MAX_VIEWPORT_DIMS, viewport_params);
viewport_max_width_ = viewport_params[0];
@@ -2956,9 +2976,15 @@
features().nv_draw_buffers ? 1 : 0;
}
- ShShaderSpec shader_spec = force_webgl_glsl_validation_ ? SH_WEBGL_SPEC
- : SH_GLES2_SPEC;
- if (shader_spec == SH_WEBGL_SPEC && features().enable_shader_name_hashing)
+ ShShaderSpec shader_spec;
+ if (force_webgl_glsl_validation_) {
+ shader_spec = unsafe_es3_apis_enabled() ? SH_WEBGL2_SPEC : SH_WEBGL_SPEC;
+ } else {
+ shader_spec = unsafe_es3_apis_enabled() ? SH_GLES3_SPEC : SH_GLES2_SPEC;
+ }
+
+ if ((shader_spec == SH_WEBGL_SPEC || shader_spec == SH_WEBGL2_SPEC) &&
+ features().enable_shader_name_hashing)
resources.HashFunction = &CityHash64;
else
resources.HashFunction = NULL;
@@ -10935,40 +10961,78 @@
}
}
-void GLES2DecoderImpl::DoCopyTextureCHROMIUM(
- GLenum target, GLuint source_id, GLuint dest_id, GLint level,
- GLenum internal_format, GLenum dest_type) {
- TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoCopyTextureCHROMIUM");
-
- TextureRef* dest_texture_ref = GetTexture(dest_id);
- TextureRef* source_texture_ref = GetTexture(source_id);
-
+bool GLES2DecoderImpl::ValidateCopyTextureCHROMIUM(
+ const char* function_name,
+ GLenum target,
+ TextureRef* source_texture_ref,
+ TextureRef* dest_texture_ref,
+ GLenum dest_internal_format) {
if (!source_texture_ref || !dest_texture_ref) {
- LOCAL_SET_GL_ERROR(
- GL_INVALID_VALUE, "glCopyTextureCHROMIUM", "unknown texture id");
- return;
+ LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "unknown texture id");
+ return false;
}
if (GL_TEXTURE_2D != target) {
- LOCAL_SET_GL_ERROR(
- GL_INVALID_VALUE, "glCopyTextureCHROMIUM", "invalid texture target");
- return;
+ LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name,
+ "invalid texture target");
+ return false;
}
Texture* source_texture = source_texture_ref->texture();
Texture* dest_texture = dest_texture_ref->texture();
+ if (source_texture == dest_texture) {
+ LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, function_name,
+ "source and destination textures are the same");
+ return false;
+ }
+
if (dest_texture->target() != GL_TEXTURE_2D ||
(source_texture->target() != GL_TEXTURE_2D &&
source_texture->target() != GL_TEXTURE_RECTANGLE_ARB &&
source_texture->target() != GL_TEXTURE_EXTERNAL_OES)) {
- LOCAL_SET_GL_ERROR(GL_INVALID_VALUE,
- "glCopyTextureCHROMIUM",
+ LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name,
"invalid texture target binding");
- return;
+ return false;
}
- int source_width, source_height, dest_width, dest_height;
+ GLenum source_type = 0;
+ GLenum source_internal_format = 0;
+ source_texture->GetLevelType(source_texture->target(), 0, &source_type,
+ &source_internal_format);
+ // The destination format should be GL_RGB, or GL_RGBA. GL_ALPHA,
+ // GL_LUMINANCE, and GL_LUMINANCE_ALPHA are not supported because they are not
+ // renderable on some platforms.
+ bool valid_dest_format = dest_internal_format == GL_RGB ||
+ dest_internal_format == GL_RGBA ||
+ dest_internal_format == GL_BGRA_EXT;
+ bool valid_source_format = source_internal_format == GL_ALPHA ||
+ source_internal_format == GL_RGB ||
+ source_internal_format == GL_RGBA ||
+ source_internal_format == GL_LUMINANCE ||
+ source_internal_format == GL_LUMINANCE_ALPHA ||
+ source_internal_format == GL_BGRA_EXT;
+ if (!valid_source_format || !valid_dest_format) {
+ LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, function_name,
+ "invalid internal format");
+ return false;
+ }
+ return true;
+}
+
+void GLES2DecoderImpl::DoCopyTextureCHROMIUM(GLenum target,
+ GLuint source_id,
+ GLuint dest_id,
+ GLenum internal_format,
+ GLenum dest_type) {
+ TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoCopyTextureCHROMIUM");
+
+ TextureRef* source_texture_ref = GetTexture(source_id);
+ TextureRef* dest_texture_ref = GetTexture(dest_id);
+ Texture* source_texture = source_texture_ref->texture();
+ Texture* dest_texture = dest_texture_ref->texture();
+ int source_width = 0;
+ int source_height = 0;
gfx::GLImage* image =
source_texture->GetLevelImage(source_texture->target(), 0);
if (image) {
@@ -10991,43 +11055,36 @@
}
// Check that this type of texture is allowed.
- if (!texture_manager()->ValidForTarget(
- source_texture->target(), level, source_width, source_height, 1)) {
+ if (!texture_manager()->ValidForTarget(source_texture->target(), 0,
+ source_width, source_height, 1)) {
LOCAL_SET_GL_ERROR(
GL_INVALID_VALUE, "glCopyTextureCHROMIUM", "Bad dimensions");
return;
}
}
- // Clear the source texture if necessary.
- if (!texture_manager()->ClearTextureLevel(
- this, source_texture_ref, source_texture->target(), 0)) {
- LOCAL_SET_GL_ERROR(
- GL_OUT_OF_MEMORY, "glCopyTextureCHROMIUM", "dimensions too big");
- return;
- }
-
GLenum source_type = 0;
GLenum source_internal_format = 0;
source_texture->GetLevelType(
source_texture->target(), 0, &source_type, &source_internal_format);
- // The destination format should be GL_RGB, or GL_RGBA. GL_ALPHA,
- // GL_LUMINANCE, and GL_LUMINANCE_ALPHA are not supported because they are not
- // renderable on some platforms.
- bool valid_dest_format = internal_format == GL_RGB ||
- internal_format == GL_RGBA ||
- internal_format == GL_BGRA_EXT;
- bool valid_source_format = source_internal_format == GL_ALPHA ||
- source_internal_format == GL_RGB ||
- source_internal_format == GL_RGBA ||
- source_internal_format == GL_LUMINANCE ||
- source_internal_format == GL_LUMINANCE_ALPHA ||
- source_internal_format == GL_BGRA_EXT;
- if (!valid_source_format || !valid_dest_format) {
- LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION,
- "glCopyTextureCHROMIUM",
- "invalid internal format");
+ if (dest_texture->IsImmutable()) {
+ LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glCopyTextureCHROMIUM",
+ "texture is immutable");
+ return;
+ }
+
+ if (!ValidateCopyTextureCHROMIUM("glCopyTextureCHROMIUM", target,
+ source_texture_ref, dest_texture_ref,
+ internal_format)) {
+ return;
+ }
+
+ // Clear the source texture if necessary.
+ if (!texture_manager()->ClearTextureLevel(this, source_texture_ref,
+ source_texture->target(), 0)) {
+ LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, "glCopyTextureCHROMIUM",
+ "dimensions too big");
return;
}
@@ -11044,11 +11101,13 @@
GLenum dest_type_previous = dest_type;
GLenum dest_internal_format = internal_format;
- bool dest_level_defined = dest_texture->GetLevelSize(
- GL_TEXTURE_2D, level, &dest_width, &dest_height);
+ int dest_width = 0;
+ int dest_height = 0;
+ bool dest_level_defined =
+ dest_texture->GetLevelSize(GL_TEXTURE_2D, 0, &dest_width, &dest_height);
if (dest_level_defined) {
- dest_texture->GetLevelType(GL_TEXTURE_2D, level, &dest_type_previous,
+ dest_texture->GetLevelType(GL_TEXTURE_2D, 0, &dest_type_previous,
&dest_internal_format);
}
@@ -11060,9 +11119,8 @@
// Ensure that the glTexImage2D succeeds.
LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCopyTextureCHROMIUM");
glBindTexture(GL_TEXTURE_2D, dest_texture->service_id());
- glTexImage2D(
- GL_TEXTURE_2D, level, internal_format, source_width, source_height,
- 0, internal_format, dest_type, NULL);
+ glTexImage2D(GL_TEXTURE_2D, 0, internal_format, source_width, source_height,
+ 0, internal_format, dest_type, NULL);
GLenum error = LOCAL_PEEK_GL_ERROR("glCopyTextureCHROMIUM");
if (error != GL_NO_ERROR) {
RestoreCurrentTextureBindings(&state_, GL_TEXTURE_2D);
@@ -11070,11 +11128,11 @@
}
texture_manager()->SetLevelInfo(
- dest_texture_ref, GL_TEXTURE_2D, level, internal_format, source_width,
+ dest_texture_ref, GL_TEXTURE_2D, 0, internal_format, source_width,
source_height, 1, 0, internal_format, dest_type, true);
} else {
- texture_manager()->SetLevelCleared(
- dest_texture_ref, GL_TEXTURE_2D, level, true);
+ texture_manager()->SetLevelCleared(dest_texture_ref, GL_TEXTURE_2D, 0,
+ true);
}
ScopedModifyPixels modify(dest_texture_ref);
@@ -11082,7 +11140,7 @@
// Try using GLImage::CopyTexImage when possible.
bool unpack_premultiply_alpha_change =
unpack_premultiply_alpha_ ^ unpack_unpremultiply_alpha_;
- if (image && !unpack_flip_y_ && !unpack_premultiply_alpha_change && !level) {
+ if (image && !unpack_flip_y_ && !unpack_premultiply_alpha_change) {
glBindTexture(GL_TEXTURE_2D, dest_texture->service_id());
if (image->CopyTexImage(GL_TEXTURE_2D))
return;
@@ -11094,36 +11152,159 @@
// before presenting.
if (source_texture->target() == GL_TEXTURE_EXTERNAL_OES) {
// TODO(hkuang): get the StreamTexture transform matrix in GPU process
- // instead of using default matrix crbug.com/226218.
- const static GLfloat default_matrix[16] = {1.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 1.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 1.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 1.0f};
+ // instead of using kIdentityMatrix crbug.com/226218.
copy_texture_CHROMIUM_->DoCopyTextureWithTransform(
- this,
- source_texture->target(),
- source_texture->service_id(),
- dest_texture->service_id(),
- level,
- source_width,
- source_height,
- unpack_flip_y_,
- unpack_premultiply_alpha_,
- unpack_unpremultiply_alpha_,
- default_matrix);
+ this, source_texture->target(), source_texture->service_id(),
+ dest_texture->service_id(), source_width, source_height, unpack_flip_y_,
+ unpack_premultiply_alpha_, unpack_unpremultiply_alpha_,
+ kIdentityMatrix);
} else {
- copy_texture_CHROMIUM_->DoCopyTexture(this,
- source_texture->target(),
- source_texture->service_id(),
- source_internal_format,
- dest_texture->service_id(),
- level,
- internal_format,
- source_width,
- source_height,
- unpack_flip_y_,
- unpack_premultiply_alpha_,
- unpack_unpremultiply_alpha_);
+ copy_texture_CHROMIUM_->DoCopyTexture(
+ this, source_texture->target(), source_texture->service_id(),
+ source_internal_format, dest_texture->service_id(), internal_format,
+ source_width, source_height, unpack_flip_y_, unpack_premultiply_alpha_,
+ unpack_unpremultiply_alpha_);
+ }
+
+ DoDidUseTexImageIfNeeded(source_texture, source_texture->target());
+}
+
+void GLES2DecoderImpl::DoCopySubTextureCHROMIUM(GLenum target,
+ GLuint source_id,
+ GLuint dest_id,
+ GLint xoffset,
+ GLint yoffset) {
+ TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoCopySubTextureCHROMIUM");
+
+ TextureRef* source_texture_ref = GetTexture(source_id);
+ TextureRef* dest_texture_ref = GetTexture(dest_id);
+ Texture* source_texture = source_texture_ref->texture();
+ Texture* dest_texture = dest_texture_ref->texture();
+ int source_width = 0;
+ int source_height = 0;
+ gfx::GLImage* image =
+ source_texture->GetLevelImage(source_texture->target(), 0);
+ if (image) {
+ gfx::Size size = image->GetSize();
+ source_width = size.width();
+ source_height = size.height();
+ if (source_width <= 0 || source_height <= 0) {
+ LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM",
+ "invalid image size");
+ return;
+ }
+ } else {
+ if (!source_texture->GetLevelSize(source_texture->target(), 0,
+ &source_width, &source_height)) {
+ LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM",
+ "source texture has no level 0");
+ return;
+ }
+
+ // Check that this type of texture is allowed.
+ if (!texture_manager()->ValidForTarget(source_texture->target(), 0,
+ source_width, source_height, 1)) {
+ LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM",
+ "source texture bad dimensions");
+ return;
+ }
+ }
+
+ GLenum source_type = 0;
+ GLenum source_internal_format = 0;
+ source_texture->GetLevelType(source_texture->target(), 0, &source_type,
+ &source_internal_format);
+ GLenum dest_type = 0;
+ GLenum dest_internal_format = 0;
+ bool dest_level_defined = dest_texture->GetLevelType(
+ dest_texture->target(), 0, &dest_type, &dest_internal_format);
+ if (!dest_level_defined) {
+ LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glCopySubTextureCHROMIUM",
+ "destination texture is not defined");
+ return;
+ }
+ if (!dest_texture->ValidForTexture(dest_texture->target(), 0, xoffset,
+ yoffset, source_width, source_height,
+ dest_type)) {
+ LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM",
+ "destination texture bad dimensions.");
+ return;
+ }
+
+ if (!ValidateCopyTextureCHROMIUM("glCopySubTextureCHROMIUM", target,
+ source_texture_ref, dest_texture_ref,
+ dest_internal_format)) {
+ return;
+ }
+
+ // Clear the source texture if necessary.
+ if (!texture_manager()->ClearTextureLevel(this, source_texture_ref,
+ source_texture->target(), 0)) {
+ LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, "glCopySubTextureCHROMIUM",
+ "source texture dimensions too big");
+ return;
+ }
+
+ // Defer initializing the CopyTextureCHROMIUMResourceManager until it is
+ // needed because it takes 10s of milliseconds to initialize.
+ if (!copy_texture_CHROMIUM_.get()) {
+ LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCopySubTextureCHROMIUM");
+ copy_texture_CHROMIUM_.reset(new CopyTextureCHROMIUMResourceManager());
+ copy_texture_CHROMIUM_->Initialize(this);
+ RestoreCurrentFramebufferBindings();
+ if (LOCAL_PEEK_GL_ERROR("glCopySubTextureCHROMIUM") != GL_NO_ERROR)
+ return;
+ }
+
+ int dest_width = 0;
+ int dest_height = 0;
+ bool ok =
+ dest_texture->GetLevelSize(GL_TEXTURE_2D, 0, &dest_width, &dest_height);
+ DCHECK(ok);
+ if (xoffset != 0 || yoffset != 0 || source_width != dest_width ||
+ source_height != dest_height) {
+ if (!texture_manager()->ClearTextureLevel(this, dest_texture_ref, target,
+ 0)) {
+ LOCAL_SET_GL_ERROR(GL_OUT_OF_MEMORY, "glCopySubTextureCHROMIUM",
+ "destination texture dimensions too big");
+ return;
+ }
+ } else {
+ texture_manager()->SetLevelCleared(dest_texture_ref, GL_TEXTURE_2D, 0,
+ true);
+ }
+
+ ScopedModifyPixels modify(dest_texture_ref);
+
+ // Try using GLImage::CopyTexSubImage when possible.
+ bool unpack_premultiply_alpha_change =
+ unpack_premultiply_alpha_ ^ unpack_unpremultiply_alpha_;
+ if (image && !unpack_flip_y_ && !unpack_premultiply_alpha_change &&
+ !xoffset && !yoffset) {
+ glBindTexture(GL_TEXTURE_2D, dest_texture->service_id());
+ if (image->CopyTexImage(GL_TEXTURE_2D))
+ return;
+ }
+
+ DoWillUseTexImageIfNeeded(source_texture, source_texture->target());
+
+ // GL_TEXTURE_EXTERNAL_OES texture requires apply a transform matrix
+ // before presenting.
+ if (source_texture->target() == GL_TEXTURE_EXTERNAL_OES) {
+ // TODO(hkuang): get the StreamTexture transform matrix in GPU process
+ // instead of using kIdentityMatrix crbug.com/226218.
+ copy_texture_CHROMIUM_->DoCopySubTextureWithTransform(
+ this, source_texture->target(), source_texture->service_id(),
+ dest_texture->service_id(), xoffset, yoffset, dest_width, dest_height,
+ source_width, source_height, unpack_flip_y_, unpack_premultiply_alpha_,
+ unpack_unpremultiply_alpha_, kIdentityMatrix);
+ } else {
+ copy_texture_CHROMIUM_->DoCopySubTexture(
+ this, source_texture->target(), source_texture->service_id(),
+ source_internal_format, dest_texture->service_id(),
+ dest_internal_format, xoffset, yoffset, dest_width, dest_height,
+ source_width, source_height, unpack_flip_y_, unpack_premultiply_alpha_,
+ unpack_unpremultiply_alpha_);
}
DoDidUseTexImageIfNeeded(source_texture, source_texture->target());
@@ -11728,10 +11909,6 @@
return;
}
- static GLfloat kIdentityMatrix[16] = {1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f,
- 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 1.0f};
-
GLfloat* target_matrix = matrix_mode == GL_PATH_PROJECTION_CHROMIUM
? state_.projection_matrix
: state_.modelview_matrix;
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.h b/gpu/command_buffer/service/gles2_cmd_decoder.h
index 5ccdf7b..0cbe0fe 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.h
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.h
@@ -115,13 +115,13 @@
// offscreen: whether to make the context offscreen or not. When FBO 0 is
// bound, offscreen contexts render to an internal buffer, onscreen ones
// to the surface.
- // size: the size if the GL context is offscreen.
+ // offscreen_size: the size if the GL context is offscreen.
// Returns:
// true if successful.
virtual bool Initialize(const scoped_refptr<gfx::GLSurface>& surface,
const scoped_refptr<gfx::GLContext>& context,
bool offscreen,
- const gfx::Size& size,
+ const gfx::Size& offscreen_size,
const DisallowedFeatures& disallowed_features,
const std::vector<int32>& attribs) = 0;
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h b/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
index c3dfb5d..3c353c4 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
@@ -4330,7 +4330,6 @@
GLenum target = static_cast<GLenum>(c.target);
GLenum source_id = static_cast<GLenum>(c.source_id);
GLenum dest_id = static_cast<GLenum>(c.dest_id);
- GLint level = static_cast<GLint>(c.level);
GLint internalformat = static_cast<GLint>(c.internalformat);
GLenum dest_type = static_cast<GLenum>(c.dest_type);
if (!validators_->texture_internal_format.IsValid(internalformat)) {
@@ -4343,8 +4342,22 @@
"dest_type");
return error::kNoError;
}
- DoCopyTextureCHROMIUM(target, source_id, dest_id, level, internalformat,
- dest_type);
+ DoCopyTextureCHROMIUM(target, source_id, dest_id, internalformat, dest_type);
+ return error::kNoError;
+}
+
+error::Error GLES2DecoderImpl::HandleCopySubTextureCHROMIUM(
+ uint32_t immediate_data_size,
+ const void* cmd_data) {
+ const gles2::cmds::CopySubTextureCHROMIUM& c =
+ *static_cast<const gles2::cmds::CopySubTextureCHROMIUM*>(cmd_data);
+ (void)c;
+ GLenum target = static_cast<GLenum>(c.target);
+ GLenum source_id = static_cast<GLenum>(c.source_id);
+ GLenum dest_id = static_cast<GLenum>(c.dest_id);
+ GLint xoffset = static_cast<GLint>(c.xoffset);
+ GLint yoffset = static_cast<GLint>(c.yoffset);
+ DoCopySubTextureCHROMIUM(target, source_id, dest_id, xoffset, yoffset);
return error::kNoError;
}
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_3_autogen.h b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_3_autogen.h
index f8f4984..29a55ba 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_3_autogen.h
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_3_autogen.h
@@ -235,6 +235,7 @@
// TODO(gman): PostSubBufferCHROMIUM
// TODO(gman): TexImageIOSurface2DCHROMIUM
// TODO(gman): CopyTextureCHROMIUM
+// TODO(gman): CopySubTextureCHROMIUM
// TODO(gman): DrawArraysInstancedANGLE
// TODO(gman): DrawElementsInstancedANGLE
// TODO(gman): VertexAttribDivisorANGLE
diff --git a/gpu/command_buffer/service/gpu_switches.cc b/gpu/command_buffer/service/gpu_switches.cc
index a2d43e9..2e4e083 100644
--- a/gpu/command_buffer/service/gpu_switches.cc
+++ b/gpu/command_buffer/service/gpu_switches.cc
@@ -65,9 +65,6 @@
const char kEnableThreadedTextureMailboxes[] =
"enable-threaded-texture-mailboxes";
-// Enable OpenGL ES 3 APIs without proper service side validation.
-const char kEnableUnsafeES3APIs[] = "enable-unsafe-es3-apis";
-
// Include ANGLE's intermediate representation (AST) output in shader
// compilation info logs.
const char kGLShaderIntermOutput[] = "gl-shader-interm-output";
@@ -92,7 +89,6 @@
kGpuProgramCacheSizeKb,
kDisableGpuShaderDiskCache,
kEnableShareGroupAsyncTextureUpload,
- kEnableUnsafeES3APIs,
kEnableSubscribeUniformExtension,
kGLShaderIntermOutput,
kEmulateShaderPrecision,
diff --git a/gpu/command_buffer/service/gpu_switches.h b/gpu/command_buffer/service/gpu_switches.h
index 5ed2861..47364a1 100644
--- a/gpu/command_buffer/service/gpu_switches.h
+++ b/gpu/command_buffer/service/gpu_switches.h
@@ -28,7 +28,6 @@
GPU_EXPORT extern const char kEnableShareGroupAsyncTextureUpload[];
GPU_EXPORT extern const char kEnableSubscribeUniformExtension[];
GPU_EXPORT extern const char kEnableThreadedTextureMailboxes[];
-GPU_EXPORT extern const char kEnableUnsafeES3APIs[];
GPU_EXPORT extern const char kGLShaderIntermOutput[];
GPU_EXPORT extern const char kEmulateShaderPrecision[];
diff --git a/gpu/command_buffer/service/gpu_tracer_unittest.cc b/gpu/command_buffer/service/gpu_tracer_unittest.cc
index 6566f6a..946d8ae 100644
--- a/gpu/command_buffer/service/gpu_tracer_unittest.cc
+++ b/gpu/command_buffer/service/gpu_tracer_unittest.cc
@@ -207,6 +207,15 @@
extensions = "GL_ARB_timer_query GL_ARB_occlusion_query";
}
GpuServiceTest::SetUpWithGLVersion(gl_version, extensions);
+
+ // Disjoint check should only be called by kTracerTypeDisjointTimer type.
+ if (GetTimerType() == gfx::GPUTiming::kTimerTypeDisjoint) {
+ EXPECT_CALL(*gl_, GetIntegerv(GL_GPU_DISJOINT_EXT, _)).Times(AtLeast(1))
+ .WillRepeatedly(
+ Invoke(&gl_fake_queries_, &GlFakeQueries::GetIntegerv));
+ } else {
+ EXPECT_CALL(*gl_, GetIntegerv(GL_GPU_DISJOINT_EXT, _)).Times(Exactly(0));
+ }
gpu_timing_client_ = GetGLContext()->CreateGPUTimingClient();
gpu_timing_client_->SetCpuTimeForTesting(base::Bind(&FakeCpuTime));
gl_fake_queries_.Reset();
@@ -290,15 +299,6 @@
}
void ExpectTracerOffsetQueryMocks() {
- // Disjoint check should only be called by kTracerTypeDisjointTimer type.
- if (GetTimerType() == gfx::GPUTiming::kTimerTypeDisjoint) {
- EXPECT_CALL(*gl_, GetIntegerv(GL_GPU_DISJOINT_EXT, _)).Times(AtLeast(1))
- .WillRepeatedly(
- Invoke(&gl_fake_queries_, &GlFakeQueries::GetIntegerv));
- } else {
- EXPECT_CALL(*gl_, GetIntegerv(GL_GPU_DISJOINT_EXT, _)).Times(Exactly(0));
- }
-
if (GetTimerType() != gfx::GPUTiming::kTimerTypeARB) {
EXPECT_CALL(*gl_, GetInteger64v(GL_TIMESTAMP, NotNull()))
.Times(Exactly(0));
@@ -537,7 +537,17 @@
gl_fake_queries_.SetCurrentGLTime(end_timestamp);
g_fakeCPUTime = expect_end_time;
+
+ // Create GPUTimingClient to make sure disjoint value is correct. This
+ // should not interfere with the tracer's disjoint value.
+ scoped_refptr<gfx::GPUTimingClient> disjoint_client =
+ GetGLContext()->CreateGPUTimingClient();
+
+ // We assert here based on the disjoint_client because if disjoints are not
+ // working properly there is no point testing the tracer output.
+ ASSERT_FALSE(disjoint_client->CheckAndResetTimerErrors());
gl_fake_queries_.SetDisjoint();
+ ASSERT_TRUE(disjoint_client->CheckAndResetTimerErrors());
ExpectOutputterEndMocks(outputter_ref_.get(), category_name, trace_name,
expect_start_time, expect_end_time, false);
@@ -642,6 +652,37 @@
ASSERT_TRUE(tracer_tester_->EndDecoding());
}
+TEST_F(GpuDisjointTimerTracerTest, MultipleClientsDisjointTest) {
+ scoped_refptr<gfx::GPUTimingClient> client1 =
+ GetGLContext()->CreateGPUTimingClient();
+ scoped_refptr<gfx::GPUTimingClient> client2 =
+ GetGLContext()->CreateGPUTimingClient();
+
+ // Test both clients are initialized as no errors.
+ ASSERT_FALSE(client1->CheckAndResetTimerErrors());
+ ASSERT_FALSE(client2->CheckAndResetTimerErrors());
+
+ // Issue a disjoint.
+ gl_fake_queries_.SetDisjoint();
+
+ ASSERT_TRUE(client1->CheckAndResetTimerErrors());
+ ASSERT_TRUE(client2->CheckAndResetTimerErrors());
+
+ // Test both are now reset.
+ ASSERT_FALSE(client1->CheckAndResetTimerErrors());
+ ASSERT_FALSE(client2->CheckAndResetTimerErrors());
+
+ // Issue a disjoint.
+ gl_fake_queries_.SetDisjoint();
+
+ // Test new client disjoint value is cleared.
+ scoped_refptr<gfx::GPUTimingClient> client3 =
+ GetGLContext()->CreateGPUTimingClient();
+ ASSERT_TRUE(client1->CheckAndResetTimerErrors());
+ ASSERT_TRUE(client2->CheckAndResetTimerErrors());
+ ASSERT_FALSE(client3->CheckAndResetTimerErrors());
+}
+
} // namespace
} // namespace gles2
} // namespace gpu
diff --git a/gpu/command_buffer/service/image_factory.cc b/gpu/command_buffer/service/image_factory.cc
index 1665c1e..9a2d458 100644
--- a/gpu/command_buffer/service/image_factory.cc
+++ b/gpu/command_buffer/service/image_factory.cc
@@ -4,6 +4,7 @@
#include "gpu/command_buffer/service/image_factory.h"
+#include "gpu/command_buffer/common/capabilities.h"
#include "ui/gl/gl_bindings.h"
namespace gpu {
@@ -93,4 +94,52 @@
}
}
+// static
+bool ImageFactory::IsGpuMemoryBufferFormatSupported(
+ gfx::GpuMemoryBuffer::Format format,
+ const gpu::Capabilities& capabilities) {
+ switch (format) {
+ case gfx::GpuMemoryBuffer::ATC:
+ case gfx::GpuMemoryBuffer::ATCIA:
+ return capabilities.texture_format_atc;
+ case gfx::GpuMemoryBuffer::BGRA_8888:
+ return capabilities.texture_format_bgra8888;
+ case gfx::GpuMemoryBuffer::DXT1:
+ return capabilities.texture_format_dxt1;
+ case gfx::GpuMemoryBuffer::DXT5:
+ return capabilities.texture_format_dxt5;
+ case gfx::GpuMemoryBuffer::ETC1:
+ return capabilities.texture_format_etc1;
+ case gfx::GpuMemoryBuffer::RGBA_8888:
+ case gfx::GpuMemoryBuffer::RGBX_8888:
+ return true;
+ }
+
+ NOTREACHED();
+ return false;
+}
+
+// static
+bool ImageFactory::IsImageSizeValidForGpuMemoryBufferFormat(
+ const gfx::Size& size,
+ gfx::GpuMemoryBuffer::Format format) {
+ switch (format) {
+ case gfx::GpuMemoryBuffer::ATC:
+ case gfx::GpuMemoryBuffer::ATCIA:
+ case gfx::GpuMemoryBuffer::DXT1:
+ case gfx::GpuMemoryBuffer::DXT5:
+ case gfx::GpuMemoryBuffer::ETC1:
+ // Compressed images must have a width and height that's evenly divisible
+ // by the block size.
+ return size.width() % 4 == 0 && size.height() % 4 == 0;
+ case gfx::GpuMemoryBuffer::RGBA_8888:
+ case gfx::GpuMemoryBuffer::BGRA_8888:
+ case gfx::GpuMemoryBuffer::RGBX_8888:
+ return true;
+ }
+
+ NOTREACHED();
+ return false;
+}
+
} // namespace gpu
diff --git a/gpu/command_buffer/service/image_factory.h b/gpu/command_buffer/service/image_factory.h
index 40dd15a..b581342 100644
--- a/gpu/command_buffer/service/image_factory.h
+++ b/gpu/command_buffer/service/image_factory.h
@@ -15,6 +15,7 @@
}
namespace gpu {
+struct Capabilities;
class GPU_EXPORT ImageFactory {
public:
@@ -35,6 +36,16 @@
unsigned internalformat,
gfx::GpuMemoryBuffer::Format format);
+ // Returns true if |format| is supported by |capabilities|.
+ static bool IsGpuMemoryBufferFormatSupported(
+ gfx::GpuMemoryBuffer::Format format,
+ const Capabilities& capabilities);
+
+ // Returns true if |size| is valid for |format|.
+ static bool IsImageSizeValidForGpuMemoryBufferFormat(
+ const gfx::Size& size,
+ gfx::GpuMemoryBuffer::Format format);
+
// Creates a GLImage instance for GPU memory buffer identified by |handle|.
// |client_id| should be set to the client requesting the creation of instance
// and can be used by factory implementation to verify access rights.
diff --git a/gpu/command_buffer/service/shader_translator.cc b/gpu/command_buffer/service/shader_translator.cc
index 98d738d..c0904c7 100644
--- a/gpu/command_buffer/service/shader_translator.cc
+++ b/gpu/command_buffer/service/shader_translator.cc
@@ -110,13 +110,19 @@
// Make sure Init is called only once.
DCHECK(compiler_ == NULL);
DCHECK(shader_type == GL_FRAGMENT_SHADER || shader_type == GL_VERTEX_SHADER);
- DCHECK(shader_spec == SH_GLES2_SPEC || shader_spec == SH_WEBGL_SPEC);
+ DCHECK(shader_spec == SH_GLES2_SPEC || shader_spec == SH_WEBGL_SPEC ||
+ shader_spec == SH_GLES3_SPEC || shader_spec == SH_WEBGL2_SPEC);
DCHECK(resources != NULL);
g_translator_initializer.Get();
- ShShaderOutput shader_output =
- (glsl_implementation_type == kGlslES ? SH_ESSL_OUTPUT : SH_GLSL_OUTPUT);
+ ShShaderOutput shader_output;
+ if (glsl_implementation_type == kGlslES) {
+ shader_output = SH_ESSL_OUTPUT;
+ } else {
+ shader_output = (shader_spec == SH_WEBGL2_SPEC) ? SH_GLSL_CORE_OUTPUT :
+ SH_GLSL_COMPATIBILITY_OUTPUT;
+ }
{
TRACE_EVENT0("gpu", "ShConstructCompiler");
diff --git a/gpu/command_buffer/tests/gl_copy_texture_CHROMIUM_unittest.cc b/gpu/command_buffer/tests/gl_copy_texture_CHROMIUM_unittest.cc
index 2c44e1a..ff15241 100644
--- a/gpu/command_buffer/tests/gl_copy_texture_CHROMIUM_unittest.cc
+++ b/gpu/command_buffer/tests/gl_copy_texture_CHROMIUM_unittest.cc
@@ -17,8 +17,18 @@
namespace gpu {
+namespace {
+enum CopyType { TexImage, TexSubImage };
+const CopyType kCopyTypes[] = {
+ TexImage,
+ TexSubImage,
+};
+}
+
// A collection of tests that exercise the GL_CHROMIUM_copy_texture extension.
-class GLCopyTextureCHROMIUMTest : public testing::Test {
+class GLCopyTextureCHROMIUMTest
+ : public testing::Test,
+ public ::testing::WithParamInterface<CopyType> {
protected:
void SetUp() override {
gl_.Initialize(GLManager::Options());
@@ -50,16 +60,29 @@
GLuint framebuffer_id_;
};
+INSTANTIATE_TEST_CASE_P(CopyType,
+ GLCopyTextureCHROMIUMTest,
+ ::testing::ValuesIn(kCopyTypes));
+
// Test to ensure that the basic functionality of the extension works.
-TEST_F(GLCopyTextureCHROMIUMTest, Basic) {
+TEST_P(GLCopyTextureCHROMIUMTest, Basic) {
+ CopyType copy_type = GetParam();
uint8 pixels[1 * 4] = { 255u, 0u, 0u, 255u };
glBindTexture(GL_TEXTURE_2D, textures_[0]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
pixels);
- glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, GL_RGBA,
- GL_UNSIGNED_BYTE);
+ if (copy_type == TexImage) {
+ glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], GL_RGBA,
+ GL_UNSIGNED_BYTE);
+ } else {
+ glBindTexture(GL_TEXTURE_2D, textures_[1]);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
+ nullptr);
+
+ glCopySubTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, 0);
+ }
EXPECT_TRUE(glGetError() == GL_NO_ERROR);
// Check the FB is still bound.
@@ -76,7 +99,51 @@
EXPECT_TRUE(GL_NO_ERROR == glGetError());
}
-TEST_F(GLCopyTextureCHROMIUMTest, InternalFormat) {
+TEST_P(GLCopyTextureCHROMIUMTest, ImmutableTexture) {
+ if (!GLTestHelper::HasExtension("GL_EXT_texture_storage")) {
+ LOG(INFO) << "GL_EXT_texture_storage not supported. Skipping test...";
+ return;
+ }
+ CopyType copy_type = GetParam();
+
+ uint8 pixels[1 * 4] = {255u, 0u, 0u, 255u};
+
+ glBindTexture(GL_TEXTURE_2D, textures_[0]);
+ glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8_OES, 1, 1);
+ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE,
+ pixels);
+
+ glBindTexture(GL_TEXTURE_2D, textures_[1]);
+ glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8_OES, 1, 1);
+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
+ textures_[1], 0);
+ EXPECT_TRUE(glGetError() == GL_NO_ERROR);
+
+ if (copy_type == TexImage) {
+ glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], GL_RGBA,
+ GL_UNSIGNED_BYTE);
+ EXPECT_TRUE(glGetError() == GL_INVALID_OPERATION);
+ } else {
+ glCopySubTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, 0);
+ EXPECT_TRUE(glGetError() == GL_NO_ERROR);
+
+ // Check the FB is still bound.
+ GLint value = 0;
+ glGetIntegerv(GL_FRAMEBUFFER_BINDING, &value);
+ GLuint fb_id = value;
+ EXPECT_EQ(framebuffer_id_, fb_id);
+
+ // Check that FB is complete.
+ EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE),
+ glCheckFramebufferStatus(GL_FRAMEBUFFER));
+
+ GLTestHelper::CheckPixels(0, 0, 1, 1, 0, pixels);
+ EXPECT_TRUE(GL_NO_ERROR == glGetError());
+ }
+}
+
+TEST_P(GLCopyTextureCHROMIUMTest, InternalFormat) {
+ CopyType copy_type = GetParam();
GLint src_formats[] = {GL_ALPHA, GL_RGB, GL_RGBA,
GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_BGRA_EXT};
GLint dest_formats[] = {GL_RGB, GL_RGBA};
@@ -85,33 +152,34 @@
for (size_t dest_index = 0; dest_index < arraysize(dest_formats);
dest_index++) {
glBindTexture(GL_TEXTURE_2D, textures_[0]);
- glTexImage2D(GL_TEXTURE_2D,
- 0,
- src_formats[src_index],
- 1,
- 1,
- 0,
- src_formats[src_index],
- GL_UNSIGNED_BYTE,
- NULL);
+ glTexImage2D(GL_TEXTURE_2D, 0, src_formats[src_index], 1, 1, 0,
+ src_formats[src_index], GL_UNSIGNED_BYTE, nullptr);
EXPECT_TRUE(GL_NO_ERROR == glGetError());
- glCopyTextureCHROMIUM(GL_TEXTURE_2D,
- textures_[0],
- textures_[1],
- 0,
- dest_formats[dest_index],
- GL_UNSIGNED_BYTE);
+ if (copy_type == TexImage) {
+ glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1],
+ dest_formats[dest_index], GL_UNSIGNED_BYTE);
+ } else {
+ glBindTexture(GL_TEXTURE_2D, textures_[1]);
+ glTexImage2D(GL_TEXTURE_2D, 0, dest_formats[dest_index], 1, 1, 0,
+ dest_formats[dest_index], GL_UNSIGNED_BYTE, nullptr);
+ EXPECT_TRUE(GL_NO_ERROR == glGetError());
+
+ glCopySubTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0,
+ 0);
+ }
+
EXPECT_TRUE(GL_NO_ERROR == glGetError()) << "src_index:" << src_index
<< " dest_index:" << dest_index;
}
}
}
-TEST_F(GLCopyTextureCHROMIUMTest, InternalFormatNotSupported) {
+TEST_P(GLCopyTextureCHROMIUMTest, InternalFormatNotSupported) {
+ CopyType copy_type = GetParam();
glBindTexture(GL_TEXTURE_2D, textures_[0]);
- glTexImage2D(
- GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
+ nullptr);
EXPECT_TRUE(GL_NO_ERROR == glGetError());
// Check unsupported format reports error.
@@ -119,12 +187,17 @@
GL_LUMINANCE_ALPHA};
for (size_t dest_index = 0; dest_index < arraysize(unsupported_dest_formats);
dest_index++) {
- glCopyTextureCHROMIUM(GL_TEXTURE_2D,
- textures_[0],
- textures_[1],
- 0,
- unsupported_dest_formats[dest_index],
- GL_UNSIGNED_BYTE);
+ if (copy_type == TexImage) {
+ glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1],
+ unsupported_dest_formats[dest_index],
+ GL_UNSIGNED_BYTE);
+ } else {
+ glBindTexture(GL_TEXTURE_2D, textures_[1]);
+ glTexImage2D(GL_TEXTURE_2D, 0, unsupported_dest_formats[dest_index], 1, 1,
+ 0, unsupported_dest_formats[dest_index], GL_UNSIGNED_BYTE,
+ nullptr);
+ glCopySubTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, 0);
+ }
EXPECT_TRUE(GL_INVALID_OPERATION == glGetError())
<< "dest_index:" << dest_index;
}
@@ -163,8 +236,8 @@
// If the dest texture has different properties, glCopyTextureCHROMIUM()
// redefines them.
- glCopyTextureCHROMIUM(
- GL_TEXTURE_2D, textures_[0], textures_[1], 0, GL_RGBA, GL_UNSIGNED_BYTE);
+ glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], GL_RGBA,
+ GL_UNSIGNED_BYTE);
EXPECT_TRUE(GL_NO_ERROR == glGetError());
// glTexSubImage2D() succeeds because textures_[1] is redefined into 2x2
@@ -189,7 +262,8 @@
}
// Test that the extension respects the flip-y pixel storage setting.
-TEST_F(GLCopyTextureCHROMIUMTest, FlipY) {
+TEST_P(GLCopyTextureCHROMIUMTest, FlipY) {
+ CopyType copy_type = GetParam();
uint8 pixels[2][2][4];
for (int x = 0; x < 2; ++x) {
for (int y = 0; y < 2; ++y) {
@@ -205,8 +279,16 @@
pixels);
glPixelStorei(GL_UNPACK_FLIP_Y_CHROMIUM, GL_TRUE);
- glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, GL_RGBA,
- GL_UNSIGNED_BYTE);
+
+ if (copy_type == TexImage) {
+ glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], GL_RGBA,
+ GL_UNSIGNED_BYTE);
+ } else {
+ glBindTexture(GL_TEXTURE_2D, textures_[1]);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
+ nullptr);
+ glCopySubTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, 0);
+ }
EXPECT_TRUE(GL_NO_ERROR == glGetError());
uint8 copied_pixels[2][2][4] = {{{0}}};
@@ -225,7 +307,8 @@
// Test that the extension respects the GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM
// storage setting.
-TEST_F(GLCopyTextureCHROMIUMTest, PremultiplyAlpha) {
+TEST_P(GLCopyTextureCHROMIUMTest, PremultiplyAlpha) {
+ CopyType copy_type = GetParam();
uint8 pixels[1 * 4] = { 2, 2, 2, 128 };
glBindTexture(GL_TEXTURE_2D, textures_[0]);
@@ -233,8 +316,15 @@
pixels);
glPixelStorei(GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM, GL_TRUE);
- glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, GL_RGBA,
- GL_UNSIGNED_BYTE);
+ if (copy_type == TexImage) {
+ glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], GL_RGBA,
+ GL_UNSIGNED_BYTE);
+ } else {
+ glBindTexture(GL_TEXTURE_2D, textures_[1]);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
+ nullptr);
+ glCopySubTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, 0);
+ }
EXPECT_TRUE(GL_NO_ERROR == glGetError());
uint8 copied_pixels[1 * 4] = {0};
@@ -249,7 +339,8 @@
// Test that the extension respects the GL_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM
// storage setting.
-TEST_F(GLCopyTextureCHROMIUMTest, UnpremultiplyAlpha) {
+TEST_P(GLCopyTextureCHROMIUMTest, UnpremultiplyAlpha) {
+ CopyType copy_type = GetParam();
uint8 pixels[1 * 4] = { 16, 16, 16, 128 };
glBindTexture(GL_TEXTURE_2D, textures_[0]);
@@ -257,8 +348,15 @@
pixels);
glPixelStorei(GL_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM, GL_TRUE);
- glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, GL_RGBA,
- GL_UNSIGNED_BYTE);
+ if (copy_type == TexImage) {
+ glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], GL_RGBA,
+ GL_UNSIGNED_BYTE);
+ } else {
+ glBindTexture(GL_TEXTURE_2D, textures_[1]);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
+ nullptr);
+ glCopySubTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, 0);
+ }
EXPECT_TRUE(GL_NO_ERROR == glGetError());
uint8 copied_pixels[1 * 4] = {0};
@@ -271,7 +369,8 @@
EXPECT_TRUE(GL_NO_ERROR == glGetError());
}
-TEST_F(GLCopyTextureCHROMIUMTest, FlipYAndPremultiplyAlpha) {
+TEST_P(GLCopyTextureCHROMIUMTest, FlipYAndPremultiplyAlpha) {
+ CopyType copy_type = GetParam();
uint8 pixels[2][2][4];
for (int x = 0; x < 2; ++x) {
for (int y = 0; y < 2; ++y) {
@@ -289,8 +388,15 @@
glPixelStorei(GL_UNPACK_FLIP_Y_CHROMIUM, GL_TRUE);
glPixelStorei(GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM, GL_TRUE);
- glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, GL_RGBA,
- GL_UNSIGNED_BYTE);
+ if (copy_type == TexImage) {
+ glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], GL_RGBA,
+ GL_UNSIGNED_BYTE);
+ } else {
+ glBindTexture(GL_TEXTURE_2D, textures_[1]);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
+ nullptr);
+ glCopySubTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, 0);
+ }
EXPECT_TRUE(GL_NO_ERROR == glGetError());
uint8 copied_pixels[2][2][4] = {{{0}}};
@@ -307,7 +413,8 @@
EXPECT_TRUE(GL_NO_ERROR == glGetError());
}
-TEST_F(GLCopyTextureCHROMIUMTest, FlipYAndUnpremultiplyAlpha) {
+TEST_P(GLCopyTextureCHROMIUMTest, FlipYAndUnpremultiplyAlpha) {
+ CopyType copy_type = GetParam();
uint8 pixels[2][2][4];
for (int x = 0; x < 2; ++x) {
for (int y = 0; y < 2; ++y) {
@@ -325,8 +432,15 @@
glPixelStorei(GL_UNPACK_FLIP_Y_CHROMIUM, GL_TRUE);
glPixelStorei(GL_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM, GL_TRUE);
- glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, GL_RGBA,
- GL_UNSIGNED_BYTE);
+ if (copy_type == TexImage) {
+ glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], GL_RGBA,
+ GL_UNSIGNED_BYTE);
+ } else {
+ glBindTexture(GL_TEXTURE_2D, textures_[1]);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
+ nullptr);
+ glCopySubTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, 0);
+ }
EXPECT_TRUE(GL_NO_ERROR == glGetError());
uint8 copied_pixels[2][2][4] = {{{0}}};
@@ -356,7 +470,8 @@
// Validate that some basic GL state is not touched upon execution of
// the extension.
-TEST_F(GLCopyTextureCHROMIUMTest, BasicStatePreservation) {
+TEST_P(GLCopyTextureCHROMIUMTest, BasicStatePreservation) {
+ CopyType copy_type = GetParam();
uint8 pixels[1 * 4] = { 255u, 0u, 0u, 255u };
glBindFramebuffer(GL_FRAMEBUFFER, 0);
@@ -365,6 +480,12 @@
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
pixels);
+ if (copy_type == TexSubImage) {
+ glBindTexture(GL_TEXTURE_2D, textures_[1]);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
+ nullptr);
+ }
+
GLboolean reference_settings[2] = { GL_TRUE, GL_FALSE };
for (int x = 0; x < 2; ++x) {
GLboolean setting = reference_settings[x];
@@ -378,8 +499,12 @@
glActiveTexture(GL_TEXTURE1 + x);
- glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0,
- GL_RGBA, GL_UNSIGNED_BYTE);
+ if (copy_type == TexImage) {
+ glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], GL_RGBA,
+ GL_UNSIGNED_BYTE);
+ } else {
+ glCopySubTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, 0);
+ }
EXPECT_TRUE(GL_NO_ERROR == glGetError());
EXPECT_EQ(setting, glIsEnabled(GL_DEPTH_TEST));
@@ -409,13 +534,20 @@
// Verify that invocation of the extension does not modify the bound
// texture state.
-TEST_F(GLCopyTextureCHROMIUMTest, TextureStatePreserved) {
+TEST_P(GLCopyTextureCHROMIUMTest, TextureStatePreserved) {
+ CopyType copy_type = GetParam();
// Setup the texture used for the extension invocation.
uint8 pixels[1 * 4] = { 255u, 0u, 0u, 255u };
glBindTexture(GL_TEXTURE_2D, textures_[0]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
pixels);
+ if (copy_type == TexSubImage) {
+ glBindTexture(GL_TEXTURE_2D, textures_[1]);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
+ nullptr);
+ }
+
GLuint texture_ids[2];
glGenTextures(2, texture_ids);
@@ -425,8 +557,12 @@
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, texture_ids[1]);
- glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0,
- GL_RGBA, GL_UNSIGNED_BYTE);
+ if (copy_type == TexImage) {
+ glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], GL_RGBA,
+ GL_UNSIGNED_BYTE);
+ } else {
+ glCopySubTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, 0);
+ }
EXPECT_TRUE(GL_NO_ERROR == glGetError());
GLint active_texture = 0;
@@ -451,13 +587,20 @@
// Verify that invocation of the extension does not perturb the currently
// bound FBO state.
-TEST_F(GLCopyTextureCHROMIUMTest, FBOStatePreserved) {
+TEST_P(GLCopyTextureCHROMIUMTest, FBOStatePreserved) {
+ CopyType copy_type = GetParam();
// Setup the texture used for the extension invocation.
uint8 pixels[1 * 4] = { 255u, 0u, 0u, 255u };
glBindTexture(GL_TEXTURE_2D, textures_[0]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
pixels);
+ if (copy_type == TexSubImage) {
+ glBindTexture(GL_TEXTURE_2D, textures_[1]);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
+ nullptr);
+ }
+
GLuint texture_id;
glGenTextures(1, &texture_id);
glBindTexture(GL_TEXTURE_2D, texture_id);
@@ -485,8 +628,12 @@
glClear(GL_COLOR_BUFFER_BIT);
GLTestHelper::CheckPixels(0, 0, 1, 1, 0, expected_color);
- glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0,
- GL_RGBA, GL_UNSIGNED_BYTE);
+ if (copy_type == TexImage) {
+ glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], GL_RGBA,
+ GL_UNSIGNED_BYTE);
+ } else {
+ glCopySubTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, 0);
+ }
EXPECT_TRUE(GL_NO_ERROR == glGetError());
EXPECT_TRUE(glIsFramebuffer(framebuffer_id));
@@ -534,7 +681,8 @@
EXPECT_TRUE(GL_NO_ERROR == glGetError());
}
-TEST_F(GLCopyTextureCHROMIUMTest, ProgramStatePreservation) {
+TEST_P(GLCopyTextureCHROMIUMTest, ProgramStatePreservation) {
+ CopyType copy_type = GetParam();
// unbind the one created in setup.
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glBindTexture(GL_TEXTURE_2D, 0);
@@ -588,8 +736,15 @@
glBindTexture(GL_TEXTURE_2D, textures_[0]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
pixels);
- glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, GL_RGBA,
- GL_UNSIGNED_BYTE);
+ if (copy_type == TexImage) {
+ glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], GL_RGBA,
+ GL_UNSIGNED_BYTE);
+ } else {
+ glBindTexture(GL_TEXTURE_2D, textures_[1]);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
+ nullptr);
+ glCopySubTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, 0);
+ }
// test using program after
glClear(GL_COLOR_BUFFER_BIT);
@@ -605,14 +760,22 @@
}
// Test that glCopyTextureCHROMIUM doesn't leak uninitialized textures.
-TEST_F(GLCopyTextureCHROMIUMTest, UninitializedSource) {
+TEST_P(GLCopyTextureCHROMIUMTest, UninitializedSource) {
+ CopyType copy_type = GetParam();
const GLsizei kWidth = 64, kHeight = 64;
glBindTexture(GL_TEXTURE_2D, textures_[0]);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kWidth, kHeight,
- 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kWidth, kHeight, 0, GL_RGBA,
+ GL_UNSIGNED_BYTE, nullptr);
- glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, GL_RGBA,
- GL_UNSIGNED_BYTE);
+ if (copy_type == TexImage) {
+ glCopyTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], GL_RGBA,
+ GL_UNSIGNED_BYTE);
+ } else {
+ glBindTexture(GL_TEXTURE_2D, textures_[1]);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kWidth, kHeight, 0, GL_RGBA,
+ GL_UNSIGNED_BYTE, nullptr);
+ glCopySubTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 0, 0);
+ }
EXPECT_TRUE(GL_NO_ERROR == glGetError());
uint8 pixels[kHeight][kWidth][4] = {{{1}}};
@@ -629,4 +792,56 @@
EXPECT_TRUE(GL_NO_ERROR == glGetError());
}
+TEST_F(GLCopyTextureCHROMIUMTest, CopySubTextureDimension) {
+ glBindTexture(GL_TEXTURE_2D, textures_[0]);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
+ nullptr);
+
+ glBindTexture(GL_TEXTURE_2D, textures_[1]);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE,
+ nullptr);
+
+ glCopySubTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 1, 1);
+ EXPECT_TRUE(GL_NO_ERROR == glGetError());
+
+ // xoffset < 0
+ glCopySubTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], -1, 1);
+ EXPECT_TRUE(glGetError() == GL_INVALID_VALUE);
+
+ // xoffset + source_width > dest_width
+ glCopySubTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 2, 2);
+ EXPECT_TRUE(glGetError() == GL_INVALID_VALUE);
+}
+
+TEST_F(GLCopyTextureCHROMIUMTest, CopySubTextureOffset) {
+ uint8 red[1 * 4] = {255u, 0u, 0u, 255u};
+ glBindTexture(GL_TEXTURE_2D, textures_[0]);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
+ red);
+
+ uint8 transparent_pixel[4 * 4] = {
+ 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u};
+ glBindTexture(GL_TEXTURE_2D, textures_[1]);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
+ transparent_pixel);
+
+ glCopySubTextureCHROMIUM(GL_TEXTURE_2D, textures_[0], textures_[1], 1, 1);
+ EXPECT_TRUE(glGetError() == GL_NO_ERROR);
+
+ // Check the FB is still bound.
+ GLint value = 0;
+ glGetIntegerv(GL_FRAMEBUFFER_BINDING, &value);
+ GLuint fb_id = value;
+ EXPECT_EQ(framebuffer_id_, fb_id);
+
+ // Check that FB is complete.
+ EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE),
+ glCheckFramebufferStatus(GL_FRAMEBUFFER));
+
+ uint8 transparent[1 * 4] = {0u, 0u, 0u, 0u};
+ GLTestHelper::CheckPixels(0, 0, 1, 1, 0, transparent);
+ GLTestHelper::CheckPixels(1, 1, 1, 1, 0, red);
+ EXPECT_TRUE(GL_NO_ERROR == glGetError());
+}
+
} // namespace gpu
diff --git a/gpu/command_buffer/tests/gl_gpu_memory_buffer_unittest.cc b/gpu/command_buffer/tests/gl_gpu_memory_buffer_unittest.cc
index 8430dfb..9e37d55 100644
--- a/gpu/command_buffer/tests/gl_gpu_memory_buffer_unittest.cc
+++ b/gpu/command_buffer/tests/gl_gpu_memory_buffer_unittest.cc
@@ -109,7 +109,6 @@
glCopyTextureCHROMIUM(GL_TEXTURE_2D,
texture_ids_[0],
texture_ids_[1],
- 0,
GL_RGBA,
GL_UNSIGNED_BYTE);
EXPECT_TRUE(glGetError() == GL_NO_ERROR);
diff --git a/gpu/gpu_unittests.isolate b/gpu/gpu_unittests.isolate
index e64633c..a718aac 100644
--- a/gpu/gpu_unittests.isolate
+++ b/gpu/gpu_unittests.isolate
@@ -20,7 +20,6 @@
'--brave-new-test-launcher',
'--test-launcher-bot-mode',
'--asan=<(asan)',
- '--lsan=<(lsan)',
'--msan=<(msan)',
'--tsan=<(tsan)',
],
@@ -38,7 +37,6 @@
'--brave-new-test-launcher',
'--test-launcher-bot-mode',
'--asan=<(asan)',
- '--lsan=<(lsan)',
'--msan=<(msan)',
'--tsan=<(tsan)',
],
@@ -52,7 +50,6 @@
'--brave-new-test-launcher',
'--test-launcher-bot-mode',
'--asan=<(asan)',
- '--lsan=<(lsan)',
'--msan=<(msan)',
'--tsan=<(tsan)',
],
diff --git a/gpu/perftests/run_all_tests.cc b/gpu/perftests/run_all_tests.cc
index ed0df88..60a6b03 100644
--- a/gpu/perftests/run_all_tests.cc
+++ b/gpu/perftests/run_all_tests.cc
@@ -9,7 +9,10 @@
int main(int argc, char** argv) {
base::TestSuite test_suite(argc, argv);
+ // Always run the perf tests serially, to avoid distorting
+ // perf measurements with randomness resulting from running
+ // in parallel.
const auto& run_test_suite =
base::Bind(&base::TestSuite::Run, base::Unretained(&test_suite));
- return base::LaunchUnitTests(argc, argv, run_test_suite);
+ return base::LaunchUnitTestsSerially(argc, argv, run_test_suite);
}
diff --git a/gpu/perftests/texture_upload_perftest.cc b/gpu/perftests/texture_upload_perftest.cc
index 495ef86..5f76746 100644
--- a/gpu/perftests/texture_upload_perftest.cc
+++ b/gpu/perftests/texture_upload_perftest.cc
@@ -193,6 +193,7 @@
glDeleteTextures(1, &color_texture_);
CheckNoGlError();
+ gpu_timing_client_ = nullptr;
gl_context_ = nullptr;
surface_ = nullptr;
}
diff --git a/mojo/application/content_handler_factory.h b/mojo/application/content_handler_factory.h
index 271655e..8b59bd9 100644
--- a/mojo/application/content_handler_factory.h
+++ b/mojo/application/content_handler_factory.h
@@ -32,7 +32,7 @@
class ManagedDelegate : public Delegate {
public:
- virtual ~ManagedDelegate() {}
+ ~ManagedDelegate() override {}
// Implement this method to create the Application for the given content.
// This method will be called on a new thread. The application will be run
// on this new thread, and the returned value will be kept alive until the
@@ -47,7 +47,7 @@
};
explicit ContentHandlerFactory(Delegate* delegate);
- virtual ~ContentHandlerFactory();
+ ~ContentHandlerFactory() override;
private:
// From InterfaceFactory:
diff --git a/mojo/edk/system/data_pipe.h b/mojo/edk/system/data_pipe.h
index 8096e01..c539f1b 100644
--- a/mojo/edk/system/data_pipe.h
+++ b/mojo/edk/system/data_pipe.h
@@ -230,7 +230,7 @@
bool has_local_consumer,
const MojoCreateDataPipeOptions& validated_options,
scoped_ptr<DataPipeImpl> impl);
- virtual ~DataPipe();
+ ~DataPipe() override;
// |ChannelEndpointClient| implementation:
bool OnReadMessage(unsigned port, MessageInTransit* message) override;
diff --git a/mojo/nacl/BUILD.gn b/mojo/nacl/BUILD.gn
index d7d1a99..c4aea69 100644
--- a/mojo/nacl/BUILD.gn
+++ b/mojo/nacl/BUILD.gn
@@ -17,7 +17,7 @@
"//nacl_bindings:monacl_sel",
]
- data_deps = [ "//nacl_bindings:irt_mojo(//native_client/build/toolchain/nacl:irt_${cpu_arch})" ]
+ data_deps = [ "//nacl_bindings:irt_mojo(//native_client/build/toolchain/nacl:irt_${target_cpu})" ]
}
}
@@ -49,7 +49,7 @@
group("mojo_nacl_tests") {
testonly = true
nacl_toolchain =
- "//native_client/build/toolchain/nacl:clang_newlib_${cpu_arch}"
+ "//native_client/build/toolchain/nacl:clang_newlib_${target_cpu}"
deps = [
":monacl_shell",
":monacl_test($nacl_toolchain)",
diff --git a/mojo/public/mojo_application.gni b/mojo/public/mojo_application.gni
index 0cf7bff..ce8cf9e 100644
--- a/mojo/public/mojo_application.gni
+++ b/mojo/public/mojo_application.gni
@@ -155,7 +155,7 @@
nexe_target_name = base_target_name + "_nexe"
nexe_name = base_target_name + ".nexe"
- output = "${base_target_name}_${cpu_arch}.nexe.mojo"
+ output = "${base_target_name}_${target_cpu}.nexe.mojo"
executable(nexe_target_name) {
output_name = base_target_name
diff --git a/mojo/public/python/src/common.h b/mojo/public/python/src/common.h
index 2ada2a4..70dddc7 100644
--- a/mojo/public/python/src/common.h
+++ b/mojo/public/python/src/common.h
@@ -56,7 +56,7 @@
class PythonClosure : public mojo::Closure::Runnable {
public:
PythonClosure(PyObject* callable, const mojo::Closure& quit);
- ~PythonClosure();
+ ~PythonClosure() override;
void Run() const override;
diff --git a/mojo/services/view_manager/public/cpp/tests/view_unittest.cc b/mojo/services/view_manager/public/cpp/tests/view_unittest.cc
index abbd712..09d1bde 100644
--- a/mojo/services/view_manager/public/cpp/tests/view_unittest.cc
+++ b/mojo/services/view_manager/public/cpp/tests/view_unittest.cc
@@ -742,7 +742,7 @@
explicit SharedPropertyChangeObserver(View* view) : view_(view) {
view_->AddObserver(this);
}
- virtual ~SharedPropertyChangeObserver() { view_->RemoveObserver(this); }
+ ~SharedPropertyChangeObserver() override { view_->RemoveObserver(this); }
Changes GetAndClearChanges() {
Changes changes;
@@ -835,7 +835,7 @@
old_property_value_(-1) {
view_->AddObserver(this);
}
- virtual ~LocalPropertyChangeObserver() { view_->RemoveObserver(this); }
+ ~LocalPropertyChangeObserver() override { view_->RemoveObserver(this); }
PropertyChangeInfo PropertyChangeInfoAndClear() {
PropertyChangeInfo result(property_key_, old_property_value_);
diff --git a/mojo/services/view_manager/public/cpp/view_tracker.h b/mojo/services/view_manager/public/cpp/view_tracker.h
index 1d6bf14..cfc2b9d 100644
--- a/mojo/services/view_manager/public/cpp/view_tracker.h
+++ b/mojo/services/view_manager/public/cpp/view_tracker.h
@@ -34,7 +34,7 @@
bool Contains(View* view);
// ViewObserver overrides:
- virtual void OnViewDestroying(View* view) override;
+ void OnViewDestroying(View* view) override;
private:
Views views_;
diff --git a/mojo/skia/ganesh_context.h b/mojo/skia/ganesh_context.h
index 1bbc20c..460ea4f 100644
--- a/mojo/skia/ganesh_context.h
+++ b/mojo/skia/ganesh_context.h
@@ -31,7 +31,7 @@
};
explicit GaneshContext(base::WeakPtr<GLContext> gl_context);
- ~GaneshContext();
+ ~GaneshContext() override;
// Note: You must be in a GaneshContext::Scope to use GrContext.
GrContext* gr() const {
diff --git a/mojo/tools/package_manager/package_manager_application.h b/mojo/tools/package_manager/package_manager_application.h
index af23710..d50e11c 100644
--- a/mojo/tools/package_manager/package_manager_application.h
+++ b/mojo/tools/package_manager/package_manager_application.h
@@ -23,7 +23,7 @@
public PackageFetcherDelegate {
public:
PackageManagerApplication();
- virtual ~PackageManagerApplication();
+ ~PackageManagerApplication() override;
private:
struct PendingLoad {
@@ -43,12 +43,12 @@
void PendingLoadComplete(const GURL& url);
// ApplicationDelegate implementation.
- virtual void Initialize(ApplicationImpl* app) override;
+ void Initialize(ApplicationImpl* app) override;
// PackageFetcher.
- virtual void FetchSucceeded(const GURL& url,
- const base::FilePath& name) override;
- virtual void FetchFailed(const GURL& url) override;
+ void FetchSucceeded(const GURL& url,
+ const base::FilePath& name) override;
+ void FetchFailed(const GURL& url) override;
mojo::NetworkServicePtr network_service_;
diff --git a/mojo/tools/roll/cc_strip_video.patch b/mojo/tools/roll/cc_strip_video.patch
index 827171b..a992d5d 100644
--- a/mojo/tools/roll/cc_strip_video.patch
+++ b/mojo/tools/roll/cc_strip_video.patch
@@ -1,5 +1,5 @@
diff --git a/cc/BUILD.gn b/cc/BUILD.gn
-index 6fe0694..803b0f9 100644
+index 9c4752d..e217b12 100644
--- a/cc/BUILD.gn
+++ b/cc/BUILD.gn
@@ -222,13 +222,6 @@ component("cc") {
@@ -34,30 +34,22 @@
"test/geometry_test_utils.cc",
"test/geometry_test_utils.h",
"test/impl_side_painting_settings.h",
-@@ -783,7 +772,6 @@ if (!is_win || link_chrome_on_windows) {
- "layers/tiled_layer_unittest.cc",
- "layers/ui_resource_layer_impl_unittest.cc",
- "layers/ui_resource_layer_unittest.cc",
-- "layers/video_layer_impl_unittest.cc",
- "output/begin_frame_args_unittest.cc",
- "output/delegating_renderer_unittest.cc",
- "output/filter_operations_unittest.cc",
-@@ -816,7 +804,6 @@ if (!is_win || link_chrome_on_windows) {
- "resources/tile_manager_unittest.cc",
- "resources/tile_priority_unittest.cc",
- "resources/tile_task_worker_pool_unittest.cc",
-- "resources/video_resource_updater_unittest.cc",
- "scheduler/begin_frame_source_unittest.cc",
- "scheduler/delay_based_time_source_unittest.cc",
- "scheduler/scheduler_state_machine_unittest.cc",
-@@ -844,7 +831,6 @@ if (!is_win || link_chrome_on_windows) {
- "trees/layer_tree_host_unittest_picture.cc",
- "trees/layer_tree_host_unittest_proxy.cc",
- "trees/layer_tree_host_unittest_scroll.cc",
-- "trees/layer_tree_host_unittest_video.cc",
- "trees/layer_tree_impl_unittest.cc",
- "trees/occlusion_tracker_unittest.cc",
- "trees/occlusion_unittest.cc",
+@@ -782,7 +771,6 @@ test("cc_unittests") {
+ "layers/tiled_layer_unittest.cc",
+ "layers/ui_resource_layer_impl_unittest.cc",
+ "layers/ui_resource_layer_unittest.cc",
+- "layers/video_layer_impl_unittest.cc",
+ "output/begin_frame_args_unittest.cc",
+ "output/delegating_renderer_unittest.cc",
+ "output/filter_operations_unittest.cc",
+@@ -843,7 +831,6 @@ test("cc_unittests") {
+ "trees/layer_tree_host_unittest_picture.cc",
+ "trees/layer_tree_host_unittest_proxy.cc",
+ "trees/layer_tree_host_unittest_scroll.cc",
+- "trees/layer_tree_host_unittest_video.cc",
+ "trees/layer_tree_impl_unittest.cc",
+ "trees/occlusion_tracker_unittest.cc",
+ "trees/occlusion_unittest.cc",
diff --git a/cc/layers/video_frame_provider.h b/cc/layers/video_frame_provider.h
deleted file mode 100644
index 784d951..0000000
@@ -250,7 +242,7 @@
-
-} // namespace cc
diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc
-index 6142d96..5c560dc 100644
+index 2016447..578faa9 100644
--- a/cc/output/gl_renderer.cc
+++ b/cc/output/gl_renderer.cc
@@ -13,7 +13,6 @@
@@ -262,7 +254,7 @@
#include "cc/output/compositor_frame_metadata.h"
#include "cc/output/context_provider.h"
diff --git a/cc/output/renderer_pixeltest.cc b/cc/output/renderer_pixeltest.cc
-index 743e1cf..9e9175e 100644
+index b30b0a5..81ad842 100644
--- a/cc/output/renderer_pixeltest.cc
+++ b/cc/output/renderer_pixeltest.cc
@@ -12,7 +12,6 @@
@@ -276,7 +268,7 @@
@@ -388,453 +387,6 @@ TEST_F(GLRendererPixelTest, NonPremultipliedTextureWithBackground) {
FuzzyPixelOffByOneComparator(true)));
}
-
+
-class VideoGLRendererPixelTest : public GLRendererPixelTest {
- protected:
- void CreateTestYUVVideoDrawQuad_Striped(const SharedQuadState* shared_state,
@@ -726,7 +718,7 @@
-
TYPED_TEST(RendererPixelTest, FastPassColorFilterAlpha) {
gfx::Rect viewport_rect(this->device_viewport_size_);
-
+
diff --git a/cc/quads/yuv_video_draw_quad.h b/cc/quads/yuv_video_draw_quad.h
index 358929e..15bce98 100644
--- a/cc/quads/yuv_video_draw_quad.h
@@ -737,22 +729,22 @@
#include "cc/base/cc_export.h"
-#include "cc/layers/video_layer_impl.h"
#include "cc/quads/draw_quad.h"
-
+
namespace cc {
diff --git a/cc/resources/drawing_display_item.cc b/cc/resources/drawing_display_item.cc
index 648f9de..6dffad9 100644
--- a/cc/resources/drawing_display_item.cc
+++ b/cc/resources/drawing_display_item.cc
@@ -6,6 +6,7 @@
-
+
#include <string>
-
+
+#include "base/logging.h"
#include "base/strings/stringprintf.h"
#include "base/trace_event/trace_event_argument.h"
#include "cc/debug/picture_debug_util.h"
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc
-index 70fa92b..38b2d66 100644
+index 4b2bc75..7ffa683 100644
--- a/cc/trees/layer_tree_host_impl_unittest.cc
+++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -27,7 +27,6 @@
@@ -784,7 +776,7 @@
using ::testing::AtLeast;
using ::testing::_;
-using media::VideoFrame;
-
+
namespace cc {
namespace {
@@ -96,7 +92,6 @@ class LayerTreeHostImplTest : public testing::Test,
@@ -793,12 +785,12 @@
current_priority_cutoff_value_(0) {
- media::InitializeMediaLibraryForTesting();
}
-
+
LayerTreeSettings DefaultSettings() {
-@@ -5463,18 +5458,6 @@ TEST_F(LayerTreeHostImplTest, LayersFreeTextures) {
+@@ -5486,18 +5481,6 @@ TEST_F(LayerTreeHostImplTest, LayersFreeTextures) {
root_layer->SetBounds(gfx::Size(10, 10));
root_layer->SetHasRenderSurface(true);
-
+
- scoped_refptr<VideoFrame> softwareFrame =
- media::VideoFrame::CreateColorFrame(
- gfx::Size(4, 4), 0x80, 0x80, 0x80, base::TimeDelta());
@@ -814,10 +806,10 @@
scoped_ptr<IOSurfaceLayerImpl> io_surface_layer =
IOSurfaceLayerImpl::Create(host_impl_->active_tree(), 5);
io_surface_layer->SetBounds(gfx::Size(10, 10));
-@@ -6555,16 +6538,6 @@ TEST_F(LayerTreeHostImplTest,
+@@ -6578,16 +6561,6 @@ TEST_F(LayerTreeHostImplTest,
scoped_ptr<SolidColorLayerImpl> root_layer =
SolidColorLayerImpl::Create(host_impl_->active_tree(), 1);
-
+
- // VideoLayerImpl will not be drawn.
- FakeVideoFrameProvider provider;
- scoped_ptr<VideoLayerImpl> video_layer = VideoLayerImpl::Create(
@@ -832,7 +824,7 @@
EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
host_impl_->DrawLayers(&frame, gfx::FrameTime::Now());
diff --git a/cc/trees/layer_tree_host_unittest.cc b/cc/trees/layer_tree_host_unittest.cc
-index 48be5b8..f9b690d 100644
+index c52132e..1be61a5 100644
--- a/cc/trees/layer_tree_host_unittest.cc
+++ b/cc/trees/layer_tree_host_unittest.cc
@@ -18,7 +18,6 @@
@@ -851,10 +843,10 @@
#include "cc/test/geometry_test_utils.h"
#include "cc/test/impl_side_painting_settings.h"
#include "cc/test/layer_tree_test.h"
-@@ -4167,28 +4165,6 @@ class LayerInvalidateCausesDraw : public LayerTreeHostTest {
+@@ -4163,28 +4161,6 @@ class LayerInvalidateCausesDraw : public LayerTreeHostTest {
int num_draws_;
};
-
+
-// VideoLayer must support being invalidated and then passing that along
-// to the compositor thread, even though no resources are updated in
-// response to that invalidation.
@@ -908,7 +900,7 @@
-#include "media/base/media.h"
-
-using media::VideoFrame;
-
+
namespace cc {
namespace {
@@ -66,7 +60,6 @@ class LayerTreeHostContextTest : public LayerTreeTest {
@@ -917,12 +909,12 @@
async_output_surface_creation_(false) {
- media::InitializeMediaLibraryForTesting();
}
-
+
void LoseContext() {
@@ -1055,41 +1048,6 @@ class LayerTreeHostContextTestDontUseLostResources
layer_with_mask->SetMaskLayer(mask.get());
root->AddChild(layer_with_mask);
-
+
- scoped_refptr<VideoLayer> video_color =
- VideoLayer::Create(&color_frame_provider_, media::VIDEO_ROTATION_0);
- video_color->SetBounds(gfx::Size(10, 10));
@@ -962,7 +954,7 @@
// TODO(danakj): IOSurface layer can not be transported. crbug.com/239335
scoped_refptr<IOSurfaceLayer> io_surface = IOSurfaceLayer::Create();
@@ -1119,14 +1077,6 @@ class LayerTreeHostContextTestDontUseLostResources
-
+
void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) override {
LayerTreeHostContextTest::CommitCompleteOnThread(host_impl);
-
@@ -974,7 +966,7 @@
- scaled_hw_frame_provider_.set_frame(NULL);
- }
}
-
+
DrawResult PrepareToDrawOnThread(LayerTreeHostImpl* host_impl,
@@ -1175,14 +1125,6 @@ class LayerTreeHostContextTestDontUseLostResources
scoped_refptr<DelegatedFrameResourceCollection>
@@ -989,5 +981,5 @@
- FakeVideoFrameProvider hw_frame_provider_;
- FakeVideoFrameProvider scaled_hw_frame_provider_;
};
-
+
SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostContextTestDontUseLostResources);
diff --git a/mojo/tools/roll/disable_find_bad_constructs.patch b/mojo/tools/roll/disable_find_bad_constructs.patch
new file mode 100644
index 0000000..4549e5b
--- /dev/null
+++ b/mojo/tools/roll/disable_find_bad_constructs.patch
@@ -0,0 +1,18 @@
+diff --git a/build/config/clang/BUILD.gn b/build/config/clang/BUILD.gn
+index 39fe251..721e87c 100644
+--- a/build/config/clang/BUILD.gn
++++ b/build/config/clang/BUILD.gn
+@@ -21,13 +21,6 @@ config("find_bad_constructs") {
+ "//third_party/llvm-build/Release+Asserts/lib/libFindBadConstructs.so",
+ root_build_dir) ]
+ }
+-
+- cflags += [
+- "-Xclang",
+- "-add-plugin",
+- "-Xclang",
+- "find-bad-constructs",
+- ]
+ }
+ }
+
diff --git a/sandbox/linux/BUILD.gn b/sandbox/linux/BUILD.gn
index c4ce4fc..ccb186a 100644
--- a/sandbox/linux/BUILD.gn
+++ b/sandbox/linux/BUILD.gn
@@ -314,12 +314,12 @@
if (compile_suid_client) {
component("suid_sandbox_client") {
sources = [
- "suid/common/sandbox.h",
- "suid/common/suid_unsafe_environment_variables.h",
"suid/client/setuid_sandbox_client.cc",
"suid/client/setuid_sandbox_client.h",
"suid/client/setuid_sandbox_host.cc",
"suid/client/setuid_sandbox_host.h",
+ "suid/common/sandbox.h",
+ "suid/common/suid_unsafe_environment_variables.h",
]
defines = [ "SANDBOX_IMPLEMENTATION" ]
diff --git a/sandbox/linux/integration_tests/bpf_dsl_seccomp_unittest.cc b/sandbox/linux/integration_tests/bpf_dsl_seccomp_unittest.cc
index 2d337c6..8e7e144 100644
--- a/sandbox/linux/integration_tests/bpf_dsl_seccomp_unittest.cc
+++ b/sandbox/linux/integration_tests/bpf_dsl_seccomp_unittest.cc
@@ -651,6 +651,10 @@
return UnsafeTrap(AllowRedirectedSyscall, NULL);
}
+#if !defined(ADDRESS_SANITIZER)
+// ASan does not allow changing the signal handler for SIGBUS, and treats it as
+// a fatal signal.
+
int bus_handler_fd_ = -1;
void SigBusHandler(int, siginfo_t* info, void* void_context) {
@@ -679,6 +683,7 @@
BPF_ASSERT(close(fds[1]) == 0);
BPF_ASSERT(c == 0x55);
}
+#endif // !defined(ADDRESS_SANITIZER)
BPF_TEST_C(SandboxBPF, SigMask, RedirectAllSyscallsPolicy) {
// Signal masks are potentially tricky to handle. For instance, if we
diff --git a/services/http_server/http_server_app.cc b/services/http_server/http_server_app.cc
index e4486fe..98e4dd7 100644
--- a/services/http_server/http_server_app.cc
+++ b/services/http_server/http_server_app.cc
@@ -18,9 +18,9 @@
public mojo::InterfaceFactory<HttpServerFactory> {
public:
HttpServerApp() {}
- ~HttpServerApp() {}
+ ~HttpServerApp() override {}
- virtual void Initialize(mojo::ApplicationImpl* app) override { app_ = app; }
+ void Initialize(mojo::ApplicationImpl* app) override { app_ = app; }
private:
// ApplicationDelegate:
diff --git a/services/js/js_app.h b/services/js/js_app.h
index 8e7e793..adcf45e 100644
--- a/services/js/js_app.h
+++ b/services/js/js_app.h
@@ -27,7 +27,7 @@
public:
JSApp(mojo::InterfaceRequest<mojo::Application> application_request,
mojo::URLResponsePtr response);
- virtual ~JSApp();
+ ~JSApp() override;
private:
static const char kMainModuleName[];
diff --git a/services/kiosk_wm/kiosk_wm.h b/services/kiosk_wm/kiosk_wm.h
index 309f50e..c5814cc 100644
--- a/services/kiosk_wm/kiosk_wm.h
+++ b/services/kiosk_wm/kiosk_wm.h
@@ -30,7 +30,7 @@
public ui::AcceleratorTarget {
public:
KioskWM();
- virtual ~KioskWM();
+ ~KioskWM() override;
base::WeakPtr<KioskWM> GetWeakPtr();
diff --git a/services/kiosk_wm/navigator_host_impl.h b/services/kiosk_wm/navigator_host_impl.h
index 7ff7355..f258e4f 100644
--- a/services/kiosk_wm/navigator_host_impl.h
+++ b/services/kiosk_wm/navigator_host_impl.h
@@ -16,7 +16,7 @@
class NavigatorHostImpl : public mojo::NavigatorHost {
public:
NavigatorHostImpl(KioskWM* kiosk_wm);
- ~NavigatorHostImpl();
+ ~NavigatorHostImpl() override;
void Bind(mojo::InterfaceRequest<mojo::NavigatorHost> request);
diff --git a/services/nacl/BUILD.gn b/services/nacl/BUILD.gn
index a30fe86..51ef84c 100644
--- a/services/nacl/BUILD.gn
+++ b/services/nacl/BUILD.gn
@@ -21,6 +21,6 @@
"//url",
]
- data_deps = [ "//nacl_bindings:irt_mojo(//native_client/build/toolchain/nacl:irt_${cpu_arch})" ]
+ data_deps = [ "//nacl_bindings:irt_mojo(//native_client/build/toolchain/nacl:irt_${target_cpu})" ]
}
}
diff --git a/services/reaper/reaper_impl.h b/services/reaper/reaper_impl.h
index b0ae2a4..760841d 100644
--- a/services/reaper/reaper_impl.h
+++ b/services/reaper/reaper_impl.h
@@ -33,7 +33,7 @@
typedef uint64 AppSecret;
ReaperImpl();
- ~ReaperImpl();
+ ~ReaperImpl() override;
void GetApplicationSecret(const GURL& caller_app,
const mojo::Callback<void(AppSecret)>&);
diff --git a/services/surfaces/surfaces_scheduler.cc b/services/surfaces/surfaces_scheduler.cc
index 500ef97..b5edb05 100644
--- a/services/surfaces/surfaces_scheduler.cc
+++ b/services/surfaces/surfaces_scheduler.cc
@@ -11,8 +11,7 @@
SurfacesScheduler::SurfacesScheduler() {
cc::SchedulerSettings settings;
scheduler_ = cc::Scheduler::Create(
- this, settings, 0, base::MessageLoop::current()->task_runner(), nullptr,
- nullptr);
+ this, settings, 0, base::MessageLoop::current()->task_runner(), nullptr);
scheduler_->SetCanStart();
scheduler_->SetVisible(true);
scheduler_->SetCanDraw(true);
diff --git a/services/surfaces/surfaces_scheduler.h b/services/surfaces/surfaces_scheduler.h
index 5e2e5c4..1c98af1 100644
--- a/services/surfaces/surfaces_scheduler.h
+++ b/services/surfaces/surfaces_scheduler.h
@@ -18,7 +18,7 @@
class SurfacesScheduler : public cc::SchedulerClient {
public:
SurfacesScheduler();
- ~SurfacesScheduler();
+ ~SurfacesScheduler() override;
void SetNeedsDraw();
diff --git a/services/window_manager/focus_controller.h b/services/window_manager/focus_controller.h
index 20f966e..6837c68 100644
--- a/services/window_manager/focus_controller.h
+++ b/services/window_manager/focus_controller.h
@@ -25,7 +25,7 @@
public:
// |rules| cannot be null.
explicit FocusController(scoped_ptr<FocusRules> rules);
- virtual ~FocusController();
+ ~FocusController() override;
void AddObserver(FocusControllerObserver* observer);
void RemoveObserver(FocusControllerObserver* observer);
diff --git a/services/window_manager/focus_controller_unittest.cc b/services/window_manager/focus_controller_unittest.cc
index a657e36..ba47c73 100644
--- a/services/window_manager/focus_controller_unittest.cc
+++ b/services/window_manager/focus_controller_unittest.cc
@@ -1071,7 +1071,7 @@
disposition_view->parent()->RemoveChild(disposition_view);
window_to_destroy_ = disposition_view;
}
- virtual void TearDown() override {
+ void TearDown() override {
if (window_to_destroy_)
window_to_destroy_->Destroy();
diff --git a/services/window_manager/window_manager_apptest.cc b/services/window_manager/window_manager_apptest.cc
index 818999f..1f8519e 100644
--- a/services/window_manager/window_manager_apptest.cc
+++ b/services/window_manager/window_manager_apptest.cc
@@ -31,7 +31,7 @@
private:
// ApplicationDelegate:
- virtual void Initialize(ApplicationImpl* app) override {
+ void Initialize(ApplicationImpl* app) override {
view_manager_client_factory_.reset(
new ViewManagerClientFactory(app->shell(), this));
}
diff --git a/shell/app_child_process.cc b/shell/app_child_process.cc
index 0054037..387aa5f 100644
--- a/shell/app_child_process.cc
+++ b/shell/app_child_process.cc
@@ -84,7 +84,7 @@
public:
AppContext()
: io_thread_("io_thread"), controller_thread_("controller_thread") {}
- ~AppContext() {}
+ ~AppContext() override {}
void Init() {
// Initialize Mojo before starting any threads.
diff --git a/shell/application_manager/application_manager.h b/shell/application_manager/application_manager.h
index fee8cdf..05a4fc9 100644
--- a/shell/application_manager/application_manager.h
+++ b/shell/application_manager/application_manager.h
@@ -215,13 +215,12 @@
// Note: The keys are URLs after mapping and resolving.
URLToNativeOptionsMap url_to_native_options_;
- base::WeakPtrFactory<ApplicationManager> weak_ptr_factory_;
-
base::SequencedWorkerPool* blocking_pool_;
NetworkServicePtr network_service_;
MimeTypeToURLMap mime_type_to_url_;
ScopedVector<NativeRunner> native_runners_;
bool disable_cache_;
+ base::WeakPtrFactory<ApplicationManager> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(ApplicationManager);
};
diff --git a/shell/launcher_main.cc b/shell/launcher_main.cc
index 410417b..4a95d53 100644
--- a/shell/launcher_main.cc
+++ b/shell/launcher_main.cc
@@ -46,7 +46,7 @@
&app_args_);
}
- ~Launcher() {
+ ~Launcher() override {
// TODO(vtl): We need to destroy this before calling
// ShutdownIPCSupportOnIOThread(). This is all quite sketchy, and we really
// should convert all of this to running the application on the main thread,
diff --git a/shell/test/pingable_app.cc b/shell/test/pingable_app.cc
index a22ddbe..b864098 100644
--- a/shell/test/pingable_app.cc
+++ b/shell/test/pingable_app.cc
@@ -40,7 +40,7 @@
public mojo::InterfaceFactory<Pingable> {
public:
PingableApp() {}
- ~PingableApp() {}
+ ~PingableApp() override {}
private:
// ApplicationDelegate:
diff --git a/skia/BUILD.gn b/skia/BUILD.gn
index aede7dc..472a8cf 100644
--- a/skia/BUILD.gn
+++ b/skia/BUILD.gn
@@ -251,6 +251,9 @@
sources = [
# Chrome sources.
"config/SkUserConfig.h",
+ "ext/SkDiscardableMemory_chrome.cc",
+ "ext/SkDiscardableMemory_chrome.h",
+ "ext/SkMemory_new_handler.cpp",
"ext/analysis_canvas.cc",
"ext/analysis_canvas.h",
"ext/benchmarking_canvas.cc",
@@ -279,15 +282,12 @@
"ext/recursive_gaussian_convolution.cc",
"ext/recursive_gaussian_convolution.h",
"ext/refptr.h",
- "ext/SkDiscardableMemory_chrome.h",
- "ext/SkDiscardableMemory_chrome.cc",
- "ext/SkMemory_new_handler.cpp",
"ext/skia_utils_base.cc",
"ext/skia_utils_base.h",
- "ext/skia_utils_ios.mm",
"ext/skia_utils_ios.h",
- "ext/skia_utils_mac.mm",
+ "ext/skia_utils_ios.mm",
"ext/skia_utils_mac.h",
+ "ext/skia_utils_mac.mm",
"ext/skia_utils_win.cc",
"ext/skia_utils_win.h",
]
@@ -317,7 +317,6 @@
# Remove unused util files include in utils.gypi
sources -= [
"//third_party/skia/include/utils/SkBoundaryPatch.h",
- "//third_party/skia/include/utils/SkFrontBufferedStream.h",
"//third_party/skia/include/utils/SkCamera.h",
"//third_party/skia/include/utils/SkCanvasStateUtils.h",
"//third_party/skia/include/utils/SkCubicInterval.h",
@@ -325,24 +324,24 @@
"//third_party/skia/include/utils/SkDebugUtils.h",
"//third_party/skia/include/utils/SkDumpCanvas.h",
"//third_party/skia/include/utils/SkEventTracer.h",
+ "//third_party/skia/include/utils/SkFrontBufferedStream.h",
"//third_party/skia/include/utils/SkInterpolator.h",
"//third_party/skia/include/utils/SkLayer.h",
"//third_party/skia/include/utils/SkMeshUtils.h",
"//third_party/skia/include/utils/SkNinePatch.h",
- "//third_party/skia/include/utils/SkParse.h",
"//third_party/skia/include/utils/SkParsePaint.h",
"//third_party/skia/include/utils/SkParsePath.h",
"//third_party/skia/include/utils/SkRandom.h",
"//third_party/skia/src/utils/SkBitmapHasher.cpp",
"//third_party/skia/src/utils/SkBitmapHasher.h",
"//third_party/skia/src/utils/SkBoundaryPatch.cpp",
- "//third_party/skia/src/utils/SkFrontBufferedStream.cpp",
"//third_party/skia/src/utils/SkCamera.cpp",
"//third_party/skia/src/utils/SkCanvasStack.h",
"//third_party/skia/src/utils/SkCubicInterval.cpp",
"//third_party/skia/src/utils/SkCullPoints.cpp",
"//third_party/skia/src/utils/SkDumpCanvas.cpp",
"//third_party/skia/src/utils/SkFloatUtils.h",
+ "//third_party/skia/src/utils/SkFrontBufferedStream.cpp",
"//third_party/skia/src/utils/SkInterpolator.cpp",
"//third_party/skia/src/utils/SkLayer.cpp",
"//third_party/skia/src/utils/SkMD5.cpp",
@@ -350,8 +349,6 @@
"//third_party/skia/src/utils/SkMeshUtils.cpp",
"//third_party/skia/src/utils/SkNinePatch.cpp",
"//third_party/skia/src/utils/SkOSFile.cpp",
- "//third_party/skia/src/utils/SkParse.cpp",
- "//third_party/skia/src/utils/SkParseColor.cpp",
"//third_party/skia/src/utils/SkParsePath.cpp",
"//third_party/skia/src/utils/SkPathUtils.cpp",
"//third_party/skia/src/utils/SkSHA1.cpp",
@@ -360,8 +357,8 @@
"//third_party/skia/src/utils/SkTLogic.h",
# We don't currently need to change thread affinity, so leave out this complexity for now.
- "//third_party/skia/src/utils/SkThreadUtils_pthread_mach.cpp",
"//third_party/skia/src/utils/SkThreadUtils_pthread_linux.cpp",
+ "//third_party/skia/src/utils/SkThreadUtils_pthread_mach.cpp",
#testing
"//third_party/skia/src/fonts/SkGScalerContext.cpp",
@@ -404,8 +401,8 @@
if (is_win) {
sources -= [
"//third_party/skia/src/ports/SkOSFile_posix.cpp",
- "//third_party/skia/src/ports/SkTime_Unix.cpp",
"//third_party/skia/src/ports/SkTLS_pthread.cpp",
+ "//third_party/skia/src/ports/SkTime_Unix.cpp",
]
} else {
sources -= [
@@ -432,16 +429,16 @@
if (!is_linux) {
sources -= [
- "//third_party/skia/src/ports/SkFontHost_fontconfig.cpp",
"//third_party/skia/src/fonts/SkFontMgr_fontconfig.cpp",
"//third_party/skia/src/ports/SkFontConfigInterface_direct.cpp",
+ "//third_party/skia/src/ports/SkFontHost_fontconfig.cpp",
]
}
if (!is_linux && !is_android) {
sources -= [
- "//third_party/skia/src/ports/SkFontHost_FreeType_common.cpp",
"//third_party/skia/src/ports/SkFontHost_FreeType.cpp",
+ "//third_party/skia/src/ports/SkFontHost_FreeType_common.cpp",
]
}
diff --git a/skia/config/SkUserConfig.h b/skia/config/SkUserConfig.h
index 37ca466..d9b6297 100644
--- a/skia/config/SkUserConfig.h
+++ b/skia/config/SkUserConfig.h
@@ -79,6 +79,10 @@
//#define SK_DEBUG
//#define SK_RELEASE
+#ifdef DCHECK_ALWAYS_ON
+ #undef SK_RELEASE
+ #define SK_DEBUG
+#endif
/* If, in debugging mode, Skia needs to stop (presumably to invoke a debugger)
it will call SK_CRASH(). If this is not defined it, it is defined in
diff --git a/skia/ext/benchmarking_canvas.cc b/skia/ext/benchmarking_canvas.cc
index 409d56b..0dd6949 100644
--- a/skia/ext/benchmarking_canvas.cc
+++ b/skia/ext/benchmarking_canvas.cc
@@ -2,250 +2,760 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "base/containers/hash_tables.h"
#include "base/logging.h"
+#include "base/strings/stringprintf.h"
#include "base/time/time.h"
#include "skia/ext/benchmarking_canvas.h"
-#include "third_party/skia/include/core/SkSurface.h"
-#include "third_party/skia/include/utils/SkNWayCanvas.h"
+#include "third_party/skia/include/core/SkColorFilter.h"
+#include "third_party/skia/include/core/SkImageFilter.h"
+#include "third_party/skia/include/core/SkPicture.h"
+#include "third_party/skia/include/core/SkRegion.h"
+#include "third_party/skia/include/core/SkTextBlob.h"
+#include "third_party/skia/include/core/SkXfermode.h"
+
+namespace {
+
+class FlagsBuilder {
+public:
+ FlagsBuilder(char separator)
+ : separator_(separator) {}
+
+ void addFlag(bool flag_val, const char flag_name[]) {
+ if (!flag_val)
+ return;
+ if (!oss_.str().empty())
+ oss_ << separator_;
+
+ oss_ << flag_name;
+ }
+
+ std::string str() const {
+ return oss_.str();
+ }
+
+private:
+ char separator_;
+ std::ostringstream oss_;
+};
+
+WARN_UNUSED_RESULT
+scoped_ptr<base::Value> AsValue(bool b) {
+ scoped_ptr<base::FundamentalValue> val(new base::FundamentalValue(b));
+
+ return val.Pass();
+}
+
+WARN_UNUSED_RESULT
+scoped_ptr<base::Value> AsValue(SkScalar scalar) {
+ scoped_ptr<base::FundamentalValue> val(new base::FundamentalValue(scalar));
+
+ return val.Pass();
+}
+
+WARN_UNUSED_RESULT
+scoped_ptr<base::Value> AsValue(const SkSize& size) {
+ scoped_ptr<base::DictionaryValue> val(new base::DictionaryValue());
+ val->Set("width", AsValue(size.width()));
+ val->Set("height", AsValue(size.height()));
+
+ return val.Pass();
+}
+
+WARN_UNUSED_RESULT
+scoped_ptr<base::Value> AsValue(const SkPoint& point) {
+ scoped_ptr<base::DictionaryValue> val(new base::DictionaryValue());
+ val->Set("x", AsValue(point.x()));
+ val->Set("y", AsValue(point.y()));
+
+ return val.Pass();
+}
+
+WARN_UNUSED_RESULT
+scoped_ptr<base::Value> AsValue(const SkRect& rect) {
+ scoped_ptr<base::DictionaryValue> val(new base::DictionaryValue());
+ val->Set("left", AsValue(rect.fLeft));
+ val->Set("top", AsValue(rect.fTop));
+ val->Set("right", AsValue(rect.fRight));
+ val->Set("bottom", AsValue(rect.fBottom));
+
+ return val.Pass();
+}
+
+WARN_UNUSED_RESULT
+scoped_ptr<base::Value> AsValue(const SkRRect& rrect) {
+ scoped_ptr<base::DictionaryValue> radii_val(new base::DictionaryValue());
+ radii_val->Set("upper-left", AsValue(rrect.radii(SkRRect::kUpperLeft_Corner)));
+ radii_val->Set("upper-right", AsValue(rrect.radii(SkRRect::kUpperRight_Corner)));
+ radii_val->Set("lower-right", AsValue(rrect.radii(SkRRect::kLowerRight_Corner)));
+ radii_val->Set("lower-left", AsValue(rrect.radii(SkRRect::kLowerLeft_Corner)));
+
+ scoped_ptr<base::DictionaryValue> val(new base::DictionaryValue());
+ val->Set("rect", AsValue(rrect.rect()));
+ val->Set("radii", radii_val.Pass());
+
+ return val.Pass();
+}
+
+WARN_UNUSED_RESULT
+scoped_ptr<base::Value> AsValue(const SkMatrix& matrix) {
+ scoped_ptr<base::ListValue> val(new base::ListValue());
+ for (int i = 0; i < 9; ++i)
+ val->Append(AsValue(matrix[i]).release()); // no scoped_ptr-aware Append() variant
+
+ return val.Pass();
+}
+
+WARN_UNUSED_RESULT
+scoped_ptr<base::Value> AsValue(SkColor color) {
+ scoped_ptr<base::DictionaryValue> val(new base::DictionaryValue());
+ val->SetInteger("a", SkColorGetA(color));
+ val->SetInteger("r", SkColorGetR(color));
+ val->SetInteger("g", SkColorGetG(color));
+ val->SetInteger("b", SkColorGetB(color));
+
+ return val.Pass();
+}
+
+WARN_UNUSED_RESULT
+scoped_ptr<base::Value> AsValue(SkXfermode::Mode mode) {
+ scoped_ptr<base::StringValue> val(
+ new base::StringValue(SkXfermode::ModeName(mode)));
+
+ return val.Pass();
+}
+
+WARN_UNUSED_RESULT
+scoped_ptr<base::Value> AsValue(SkCanvas::PointMode mode) {
+ static const char* gModeStrings[] = { "Points", "Lines", "Polygon" };
+ DCHECK_LT(static_cast<size_t>(mode), SK_ARRAY_COUNT(gModeStrings));
+
+ scoped_ptr<base::StringValue> val(new base::StringValue(gModeStrings[mode]));
+
+ return val.Pass();
+}
+
+WARN_UNUSED_RESULT
+scoped_ptr<base::Value> AsValue(const SkXfermode& xfermode) {
+ SkXfermode::Mode mode;
+ if (xfermode.asMode(&mode))
+ return AsValue(mode);
+
+ scoped_ptr<base::StringValue> val(new base::StringValue("unknown"));
+ return val.Pass();
+}
+
+WARN_UNUSED_RESULT
+scoped_ptr<base::Value> AsValue(const SkColorFilter& filter) {
+ scoped_ptr<base::DictionaryValue> val(new base::DictionaryValue());
+
+ if (unsigned flags = filter.getFlags()) {
+ FlagsBuilder builder('|');
+ builder.addFlag(flags & SkColorFilter::kAlphaUnchanged_Flag,
+ "kAlphaUnchanged_Flag");
+ builder.addFlag(flags & SkColorFilter::kHasFilter16_Flag,
+ "kHasFilter16_Flag");
+
+ val->SetString("flags", builder.str());
+ }
+
+ SkScalar color_matrix[20];
+ if (filter.asColorMatrix(color_matrix)) {
+ scoped_ptr<base::ListValue> color_matrix_val(new base::ListValue());
+ for (unsigned i = 0; i < 20; ++i)
+ color_matrix_val->Append(AsValue(color_matrix[i]).release());
+
+ val->Set("color_matrix", color_matrix_val.Pass());
+ }
+
+ SkColor color;
+ SkXfermode::Mode mode;
+ if (filter.asColorMode(&color, &mode)) {
+ scoped_ptr<base::DictionaryValue> color_mode_val(
+ new base::DictionaryValue());
+ color_mode_val->Set("color", AsValue(color));
+ color_mode_val->Set("mode", AsValue(mode));
+
+ val->Set("color_mode", color_mode_val.Pass());
+ }
+
+ if (filter.asComponentTable(nullptr)) {
+ scoped_ptr<base::DictionaryValue> component_table_val(
+ new base::DictionaryValue());
+ // use this as a marker for now
+ val->Set("component_table", component_table_val.Pass());
+ }
+
+ return val.Pass();
+}
+
+WARN_UNUSED_RESULT
+scoped_ptr<base::Value> AsValue(const SkImageFilter& filter) {
+ scoped_ptr<base::DictionaryValue> val(new base::DictionaryValue());
+ val->SetInteger("inputs", filter.countInputs());
+
+ SkColorFilter* color_filter;
+ if (filter.asColorFilter(&color_filter)) {
+ val->Set("color_filter", AsValue(*color_filter));
+ SkSafeUnref(color_filter); // ref'd in asColorFilter
+ }
+
+ return val.Pass();
+}
+
+WARN_UNUSED_RESULT
+scoped_ptr<base::Value> AsValue(const SkPaint& paint) {
+ scoped_ptr<base::DictionaryValue> val(new base::DictionaryValue());
+ SkPaint default_paint;
+
+ if (paint.getColor() != default_paint.getColor())
+ val->Set("Color", AsValue(paint.getColor()));
+
+ if (paint.getStyle() != default_paint.getStyle()) {
+ static const char* gStyleStrings[] = { "Fill", "Stroke", "StrokeFill" };
+ DCHECK_LT(static_cast<size_t>(paint.getStyle()),
+ SK_ARRAY_COUNT(gStyleStrings));
+ val->SetString("Style", gStyleStrings[paint.getStyle()]);
+ }
+
+ if (paint.getXfermode() != default_paint.getXfermode()) {
+ DCHECK(paint.getXfermode());
+ val->Set("Xfermode", AsValue(*paint.getXfermode()));
+ }
+
+ if (paint.getFlags()) {
+ FlagsBuilder builder('|');
+ builder.addFlag(paint.isAntiAlias(), "AntiAlias");
+ builder.addFlag(paint.isDither(), "Dither");
+ builder.addFlag(paint.isUnderlineText(), "UnderlineText");
+ builder.addFlag(paint.isStrikeThruText(), "StrikeThruText");
+ builder.addFlag(paint.isFakeBoldText(), "FakeBoldText");
+ builder.addFlag(paint.isLinearText(), "LinearText");
+ builder.addFlag(paint.isSubpixelText(), "SubpixelText");
+ builder.addFlag(paint.isDevKernText(), "DevKernText");
+ builder.addFlag(paint.isLCDRenderText(), "LCDRenderText");
+ builder.addFlag(paint.isEmbeddedBitmapText(), "EmbeddedBitmapText");
+ builder.addFlag(paint.isAutohinted(), "Autohinted");
+ builder.addFlag(paint.isVerticalText(), "VerticalText");
+ builder.addFlag(paint.getFlags() & SkPaint::kGenA8FromLCD_Flag,
+ "GenA8FromLCD");
+
+ val->SetString("Flags", builder.str());
+ }
+
+ if (paint.getFilterLevel() != default_paint.getFilterLevel()) {
+ static const char* gFilterLevelStrings[] =
+ { "None", "Low", "Medium", "High" };
+ DCHECK_LT(static_cast<size_t>(paint.getFilterLevel()),
+ SK_ARRAY_COUNT(gFilterLevelStrings));
+ val->SetString("FilterLevel", gFilterLevelStrings[paint.getFilterLevel()]);
+ }
+
+ if (paint.getTextSize() != default_paint.getTextSize())
+ val->SetDouble("TextSize", paint.getTextSize());
+
+ if (paint.getTextScaleX() != default_paint.getTextScaleX())
+ val->SetDouble("TextScaleX", paint.getTextScaleX());
+
+ if (paint.getTextSkewX() != default_paint.getTextSkewX())
+ val->SetDouble("TextSkewX", paint.getTextSkewX());
+
+ if (paint.getColorFilter())
+ val->Set("ColorFilter", AsValue(*paint.getColorFilter()));
+
+ if (paint.getImageFilter())
+ val->Set("ImageFilter", AsValue(*paint.getImageFilter()));
+
+ return val.Pass();
+}
+
+WARN_UNUSED_RESULT
+scoped_ptr<base::Value> AsValue(SkCanvas::SaveFlags flags) {
+ FlagsBuilder builder('|');
+ builder.addFlag(flags & SkCanvas::kHasAlphaLayer_SaveFlag,
+ "kHasAlphaLayer");
+ builder.addFlag(flags & SkCanvas::kFullColorLayer_SaveFlag,
+ "kFullColorLayer");
+ builder.addFlag(flags & SkCanvas::kClipToLayer_SaveFlag,
+ "kClipToLayer");
+
+ scoped_ptr<base::StringValue> val(new base::StringValue(builder.str()));
+
+ return val.Pass();
+}
+
+WARN_UNUSED_RESULT
+scoped_ptr<base::Value> AsValue(SkRegion::Op op) {
+ static const char* gOpStrings[] = { "Difference",
+ "Intersect",
+ "Union",
+ "XOR",
+ "ReverseDifference",
+ "Replace"
+ };
+ DCHECK_LT(static_cast<size_t>(op), SK_ARRAY_COUNT(gOpStrings));
+ scoped_ptr<base::StringValue> val(new base::StringValue(gOpStrings[op]));
+ return val.Pass();
+}
+
+WARN_UNUSED_RESULT
+scoped_ptr<base::Value> AsValue(const SkRegion& region) {
+ scoped_ptr<base::DictionaryValue> val(new base::DictionaryValue());
+ val->Set("bounds", AsValue(SkRect::Make(region.getBounds())));
+
+ return val.Pass();
+}
+
+WARN_UNUSED_RESULT
+scoped_ptr<base::Value> AsValue(const SkPicture& picture) {
+ scoped_ptr<base::DictionaryValue> val(new base::DictionaryValue());
+ val->Set("cull-rect", AsValue(picture.cullRect()));
+
+ return val.Pass();
+}
+
+WARN_UNUSED_RESULT
+scoped_ptr<base::Value> AsValue(const SkBitmap& bitmap) {
+ scoped_ptr<base::DictionaryValue> val(new base::DictionaryValue());
+ val->Set("size", AsValue(SkSize::Make(bitmap.width(), bitmap.height())));
+
+ return val.Pass();
+}
+
+WARN_UNUSED_RESULT
+scoped_ptr<base::Value> AsValue(const SkImage& image) {
+ scoped_ptr<base::DictionaryValue> val(new base::DictionaryValue());
+ val->Set("size", AsValue(SkSize::Make(image.width(), image.height())));
+
+ return val.Pass();
+}
+
+WARN_UNUSED_RESULT
+scoped_ptr<base::Value> AsValue(const SkTextBlob& blob) {
+ scoped_ptr<base::DictionaryValue> val(new base::DictionaryValue());
+ val->Set("bounds", AsValue(blob.bounds()));
+
+ return val.Pass();
+}
+
+WARN_UNUSED_RESULT
+scoped_ptr<base::Value> AsValue(const SkPath& path) {
+ scoped_ptr<base::DictionaryValue> val(new base::DictionaryValue());
+
+ static const char* gFillStrings[] =
+ { "winding", "even-odd", "inverse-winding", "inverse-even-odd" };
+ DCHECK_LT(static_cast<size_t>(path.getFillType()),
+ SK_ARRAY_COUNT(gFillStrings));
+ val->SetString("fill-type", gFillStrings[path.getFillType()]);
+
+ static const char* gConvexityStrings[] = { "Unknown", "Convex", "Concave" };
+ DCHECK_LT(static_cast<size_t>(path.getConvexity()),
+ SK_ARRAY_COUNT(gConvexityStrings));
+ val->SetString("convexity", gConvexityStrings[path.getConvexity()]);
+
+ val->SetBoolean("is-rect", path.isRect(nullptr));
+ val->Set("bounds", AsValue(path.getBounds()));
+
+ static const char* gVerbStrings[] =
+ { "move", "line", "quad", "conic", "cubic", "close", "done" };
+ static const int gPtsPerVerb[] = { 1, 1, 2, 2, 3, 0, 0 };
+ static const int gPtOffsetPerVerb[] = { 0, 1, 1, 1, 1, 0, 0 };
+ SK_COMPILE_ASSERT(
+ SK_ARRAY_COUNT(gVerbStrings) == static_cast<size_t>(SkPath::kDone_Verb + 1),
+ gVerbStrings_size_mismatch);
+ SK_COMPILE_ASSERT(
+ SK_ARRAY_COUNT(gVerbStrings) == SK_ARRAY_COUNT(gPtsPerVerb),
+ gPtsPerVerb_size_mismatch);
+ SK_COMPILE_ASSERT(
+ SK_ARRAY_COUNT(gVerbStrings) == SK_ARRAY_COUNT(gPtOffsetPerVerb),
+ gPtOffsetPerVerb_size_mismatch);
+
+ scoped_ptr<base::ListValue> verbs_val(new base::ListValue());
+ SkPath::Iter iter(const_cast<SkPath&>(path), false);
+ SkPoint points[4];
+
+ for(SkPath::Verb verb = iter.next(points, false);
+ verb != SkPath::kDone_Verb; verb = iter.next(points, false)) {
+ DCHECK_LT(static_cast<size_t>(verb), SK_ARRAY_COUNT(gVerbStrings));
+
+ scoped_ptr<base::DictionaryValue> verb_val(new base::DictionaryValue());
+ scoped_ptr<base::ListValue> pts_val(new base::ListValue());
+
+ for (int i = 0; i < gPtsPerVerb[verb]; ++i)
+ pts_val->Append(AsValue(points[i + gPtOffsetPerVerb[verb]]).release());
+
+ verb_val->Set(gVerbStrings[verb], pts_val.Pass());
+
+ if (SkPath::kConic_Verb == verb)
+ verb_val->Set("weight", AsValue(iter.conicWeight()));
+
+ verbs_val->Append(verb_val.release());
+ }
+ val->Set("verbs", verbs_val.Pass());
+
+ return val.Pass();
+}
+
+template<typename T>
+WARN_UNUSED_RESULT
+scoped_ptr<base::Value> AsListValue(const T array[], size_t count) {
+ scoped_ptr<base::ListValue> val(new base::ListValue());
+
+ for (size_t i = 0; i < count; ++i)
+ val->Append(AsValue(array[i]).release());
+
+ return val.Pass();
+}
+
+} // namespace
namespace skia {
-class AutoStamper {
+class BenchmarkingCanvas::AutoOp {
public:
- AutoStamper(TimingCanvas* timing_canvas);
- ~AutoStamper();
+ AutoOp(BenchmarkingCanvas* canvas, const char op_name[],
+ const SkPaint* paint = nullptr)
+ : canvas_(canvas)
+ , op_record_(new base::DictionaryValue())
+ , op_params_(new base::ListValue()) {
+
+ DCHECK(canvas);
+ DCHECK(op_name);
+
+ op_record_->SetString("cmd_string", op_name);
+ op_record_->Set("info", op_params_);
+
+ if (paint)
+ this->addParam("paint", AsValue(*paint));
+
+ start_ticks_ = base::TimeTicks::Now();
+ }
+
+ ~AutoOp() {
+ base::TimeDelta ticks = base::TimeTicks::Now() - start_ticks_;
+ op_record_->SetDouble("cmd_time", ticks.InMillisecondsF());
+
+ canvas_->op_records_.Append(op_record_);
+ }
+
+ void addParam(const char name[], scoped_ptr<base::Value> value) {
+ scoped_ptr<base::DictionaryValue> param(new base::DictionaryValue());
+ param->Set(name, value.Pass());
+
+ op_params_->Append(param.release());
+ }
private:
- TimingCanvas* timing_canvas_;
+ BenchmarkingCanvas* canvas_;
+ base::DictionaryValue* op_record_;
+ base::ListValue* op_params_;
base::TimeTicks start_ticks_;
};
-class TimingCanvas : public SkNWayCanvas {
-public:
- TimingCanvas(int width, int height, const BenchmarkingCanvas* track_canvas)
- : SkNWayCanvas(width, height)
- , tracking_canvas_(track_canvas) {
- surface_ = skia::AdoptRef(SkSurface::NewRasterN32Premul(width, height));
-
- addCanvas(surface_->getCanvas());
- }
-
- ~TimingCanvas() override {}
-
- double GetTime(size_t index) {
- TimingsMap::const_iterator timing_info = timings_map_.find(index);
- return timing_info != timings_map_.end()
- ? timing_info->second.InMillisecondsF()
- : 0.0;
- }
-
- // SkCanvas overrides.
- void willSave() override {
- AutoStamper stamper(this);
- SkNWayCanvas::willSave();
- }
-
- SaveLayerStrategy willSaveLayer(const SkRect* bounds,
- const SkPaint* paint,
- SaveFlags flags) override {
- AutoStamper stamper(this);
- return SkNWayCanvas::willSaveLayer(bounds, paint, flags);
- }
-
- void willRestore() override {
- AutoStamper stamper(this);
- SkNWayCanvas::willRestore();
- }
-
- void onDrawPaint(const SkPaint& paint) override {
- AutoStamper stamper(this);
- SkNWayCanvas::onDrawPaint(paint);
- }
-
- void onDrawPoints(PointMode mode,
- size_t count,
- const SkPoint pts[],
- const SkPaint& paint) override {
- AutoStamper stamper(this);
- SkNWayCanvas::onDrawPoints(mode, count, pts, paint);
- }
-
- void onDrawOval(const SkRect& rect, const SkPaint& paint) override {
- AutoStamper stamper(this);
- SkNWayCanvas::onDrawOval(rect, paint);
- }
-
- void onDrawRect(const SkRect& rect, const SkPaint& paint) override {
- AutoStamper stamper(this);
- SkNWayCanvas::onDrawRect(rect, paint);
- }
-
- void onDrawRRect(const SkRRect& rrect, const SkPaint& paint) override {
- AutoStamper stamper(this);
- SkNWayCanvas::onDrawRRect(rrect, paint);
- }
-
- void onDrawPath(const SkPath& path, const SkPaint& paint) override {
- AutoStamper stamper(this);
- SkNWayCanvas::onDrawPath(path, paint);
- }
-
- void onDrawBitmap(const SkBitmap& bitmap,
- SkScalar left,
- SkScalar top,
- const SkPaint* paint) override {
- AutoStamper stamper(this);
- SkNWayCanvas::onDrawBitmap(bitmap, left, top, paint);
- }
-
- void onDrawBitmapRect(const SkBitmap& bitmap,
- const SkRect* src,
- const SkRect& dst,
- const SkPaint* paint,
- DrawBitmapRectFlags flags) override {
- AutoStamper stamper(this);
- SkNWayCanvas::onDrawBitmapRect(bitmap, src, dst, paint, flags);
- }
-
- void onDrawSprite(const SkBitmap& bitmap,
- int left,
- int top,
- const SkPaint* paint) override {
- AutoStamper stamper(this);
- SkNWayCanvas::onDrawSprite(bitmap, left, top, paint);
- }
-
- void onDrawVertices(VertexMode vmode,
- int vertexCount,
- const SkPoint vertices[],
- const SkPoint texs[],
- const SkColor colors[],
- SkXfermode* xmode,
- const uint16_t indices[],
- int indexCount,
- const SkPaint& paint) override {
- AutoStamper stamper(this);
- SkNWayCanvas::onDrawVertices(vmode, vertexCount, vertices, texs, colors,
- xmode, indices, indexCount, paint);
- }
-
-protected:
- void onDrawText(const void* text,
- size_t byteLength,
- SkScalar x,
- SkScalar y,
- const SkPaint& paint) override {
- AutoStamper stamper(this);
- SkNWayCanvas::onDrawText(text, byteLength, x, y, paint);
- }
-
- void onDrawPosText(const void* text,
- size_t byteLength,
- const SkPoint pos[],
- const SkPaint& paint) override {
- AutoStamper stamper(this);
- SkNWayCanvas::onDrawPosText(text, byteLength, pos, paint);
- }
-
- void onDrawPosTextH(const void* text,
- size_t byteLength,
- const SkScalar xpos[],
- SkScalar constY,
- const SkPaint& paint) override {
- AutoStamper stamper(this);
- SkNWayCanvas::onDrawPosTextH(text, byteLength, xpos, constY, paint);
- }
-
- void onDrawTextOnPath(const void* text,
- size_t byteLength,
- const SkPath& path,
- const SkMatrix* matrix,
- const SkPaint& paint) override {
- AutoStamper stamper(this);
- SkNWayCanvas::onDrawTextOnPath(text, byteLength, path, matrix, paint);
- }
-
- void onClipRect(const SkRect& rect,
- SkRegion::Op op,
- ClipEdgeStyle edge_style) override {
- AutoStamper stamper(this);
- SkNWayCanvas::onClipRect(rect, op, edge_style);
- }
-
- void onClipRRect(const SkRRect& rrect,
- SkRegion::Op op,
- ClipEdgeStyle edge_style) override {
- AutoStamper stamper(this);
- SkNWayCanvas::onClipRRect(rrect, op, edge_style);
- }
-
- void onClipPath(const SkPath& path,
- SkRegion::Op op,
- ClipEdgeStyle edge_style) override {
- AutoStamper stamper(this);
- SkNWayCanvas::onClipPath(path, op, edge_style);
- }
-
- void onClipRegion(const SkRegion& region, SkRegion::Op op) override {
- AutoStamper stamper(this);
- SkNWayCanvas::onClipRegion(region, op);
- }
-
- void onDrawPicture(const SkPicture* picture,
- const SkMatrix* matrix,
- const SkPaint* paint) override {
- AutoStamper stamper(this);
- SkNWayCanvas::onDrawPicture(picture, matrix, paint);
- }
-
-private:
- typedef base::hash_map<size_t, base::TimeDelta> TimingsMap;
- TimingsMap timings_map_;
-
- skia::RefPtr<SkSurface> surface_;
-
- friend class AutoStamper;
- const BenchmarkingCanvas* tracking_canvas_;
-};
-
-AutoStamper::AutoStamper(TimingCanvas *timing_canvas)
- : timing_canvas_(timing_canvas) {
- start_ticks_ = base::TimeTicks::Now();
-}
-
-AutoStamper::~AutoStamper() {
- base::TimeDelta delta = base::TimeTicks::Now() - start_ticks_;
- int command_index = timing_canvas_->tracking_canvas_->CommandCount() - 1;
- DCHECK_GE(command_index, 0);
- timing_canvas_->timings_map_[command_index] = delta;
-}
-
-BenchmarkingCanvas::BenchmarkingCanvas(int width, int height)
- : SkNWayCanvas(width, height) {
- debug_canvas_ = skia::AdoptRef(SkNEW_ARGS(SkDebugCanvas, (width, height)));
- timing_canvas_ = skia::AdoptRef(SkNEW_ARGS(TimingCanvas, (width, height, this)));
-
- addCanvas(debug_canvas_.get());
- addCanvas(timing_canvas_.get());
+BenchmarkingCanvas::BenchmarkingCanvas(SkCanvas* canvas, unsigned flags)
+ : INHERITED(canvas->imageInfo().width(),
+ canvas->imageInfo().height())
+ , flags_(flags) {
+ addCanvas(canvas);
}
BenchmarkingCanvas::~BenchmarkingCanvas() {
- removeAll();
}
size_t BenchmarkingCanvas::CommandCount() const {
- return debug_canvas_->getSize();
+ return op_records_.GetSize();
}
-SkDrawCommand* BenchmarkingCanvas::GetCommand(size_t index) {
- DCHECK_LT(index, static_cast<size_t>(debug_canvas_->getSize()));
- return debug_canvas_->getDrawCommandAt(index);
+const base::ListValue& BenchmarkingCanvas::Commands() const {
+ return op_records_;
}
double BenchmarkingCanvas::GetTime(size_t index) {
- DCHECK_LT(index, static_cast<size_t>(debug_canvas_->getSize()));
- return timing_canvas_->GetTime(index);
+ const base::DictionaryValue* op;
+ if (!op_records_.GetDictionary(index, &op))
+ return 0;
+
+ double t;
+ if (!op->GetDouble("cmd_time", &t))
+ return 0;
+
+ return t;
+}
+
+void BenchmarkingCanvas::willSave() {
+ AutoOp op(this, "Save");
+
+ INHERITED::willSave();
+}
+
+SkCanvas::SaveLayerStrategy BenchmarkingCanvas::willSaveLayer(const SkRect* rect,
+ const SkPaint* paint,
+ SaveFlags flags) {
+ AutoOp op(this, "SaveLayer", paint);
+ if (rect)
+ op.addParam("bounds", AsValue(*rect));
+ if (paint)
+ op.addParam("paint", AsValue(*paint));
+ if (flags)
+ op.addParam("flags", AsValue(flags));
+
+ return INHERITED::willSaveLayer(rect, paint, flags);
+}
+
+void BenchmarkingCanvas::willRestore() {
+ AutoOp op(this, "Restore");
+
+ INHERITED::willRestore();
+}
+
+void BenchmarkingCanvas::didConcat(const SkMatrix& m) {
+ AutoOp op(this, "Concat");
+ op.addParam("matrix", AsValue(m));
+
+ INHERITED::didConcat(m);
+}
+
+void BenchmarkingCanvas::didSetMatrix(const SkMatrix& m) {
+ AutoOp op(this, "SetMatrix");
+ op.addParam("matrix", AsValue(m));
+
+ INHERITED::didSetMatrix(m);
+}
+
+void BenchmarkingCanvas::onClipRect(const SkRect& rect,
+ SkRegion::Op region_op,
+ SkCanvas::ClipEdgeStyle style) {
+ AutoOp op(this, "ClipRect");
+ op.addParam("rect", AsValue(rect));
+ op.addParam("op", AsValue(region_op));
+ op.addParam("anti-alias", AsValue(style == kSoft_ClipEdgeStyle));
+
+ INHERITED::onClipRect(rect, region_op, style);
+}
+
+void BenchmarkingCanvas::onClipRRect(const SkRRect& rrect,
+ SkRegion::Op region_op,
+ SkCanvas::ClipEdgeStyle style) {
+ AutoOp op(this, "ClipRRect");
+ op.addParam("rrect", AsValue(rrect));
+ op.addParam("op", AsValue(region_op));
+ op.addParam("anti-alias", AsValue(style == kSoft_ClipEdgeStyle));
+
+ INHERITED::onClipRRect(rrect, region_op, style);
+}
+
+void BenchmarkingCanvas::onClipPath(const SkPath& path,
+ SkRegion::Op region_op,
+ SkCanvas::ClipEdgeStyle style) {
+ AutoOp op(this, "ClipPath");
+ op.addParam("path", AsValue(path));
+ op.addParam("op", AsValue(region_op));
+ op.addParam("anti-alias", AsValue(style == kSoft_ClipEdgeStyle));
+
+ INHERITED::onClipPath(path, region_op, style);
+}
+
+void BenchmarkingCanvas::onClipRegion(const SkRegion& region,
+ SkRegion::Op region_op) {
+ AutoOp op(this, "ClipRegion");
+ op.addParam("region", AsValue(region));
+ op.addParam("op", AsValue(region_op));
+
+ INHERITED::onClipRegion(region, region_op);
+}
+
+void BenchmarkingCanvas::onDrawPaint(const SkPaint& paint) {
+ AutoOp op(this, "DrawPaint", &paint);
+
+ INHERITED::onDrawPaint(paint);
+}
+
+void BenchmarkingCanvas::onDrawPoints(PointMode mode, size_t count,
+ const SkPoint pts[], const SkPaint& paint) {
+ AutoOp op(this, "DrawPoints", &paint);
+ op.addParam("mode", AsValue(mode));
+ op.addParam("points", AsListValue(pts, count));
+
+ INHERITED::onDrawPoints(mode, count, pts, paint);
+}
+
+void BenchmarkingCanvas::onDrawRect(const SkRect& rect, const SkPaint& paint) {
+ AutoOp op(this, "DrawRect", &paint);
+ op.addParam("rect", AsValue(rect));
+
+ INHERITED::onDrawRect(rect, paint);
+}
+
+void BenchmarkingCanvas::onDrawOval(const SkRect& rect, const SkPaint& paint) {
+ AutoOp op(this, "DrawOval", &paint);
+ op.addParam("rect", AsValue(rect));
+
+ INHERITED::onDrawOval(rect, paint);
+}
+
+void BenchmarkingCanvas::onDrawRRect(const SkRRect& rrect, const SkPaint& paint) {
+ AutoOp op(this, "DrawRRect", &paint);
+ op.addParam("rrect", AsValue(rrect));
+
+ INHERITED::onDrawRRect(rrect, paint);
+}
+
+void BenchmarkingCanvas::onDrawDRRect(const SkRRect& outer, const SkRRect& inner,
+ const SkPaint& paint) {
+ AutoOp op(this, "DrawDRRect", &paint);
+ op.addParam("outer", AsValue(outer));
+ op.addParam("inner", AsValue(inner));
+
+ INHERITED::onDrawDRRect(outer, inner, paint);
+}
+
+void BenchmarkingCanvas::onDrawPath(const SkPath& path, const SkPaint& paint) {
+ AutoOp op(this, "DrawPath", &paint);
+ op.addParam("path", AsValue(path));
+
+ INHERITED::onDrawPath(path, paint);
+}
+
+void BenchmarkingCanvas::onDrawPicture(const SkPicture* picture,
+ const SkMatrix* matrix,
+ const SkPaint* paint) {
+ DCHECK(picture);
+ AutoOp op(this, "DrawPicture", paint);
+ op.addParam("picture", AsValue(picture));
+ if (matrix)
+ op.addParam("matrix", AsValue(*matrix));
+
+ INHERITED::drawPicture(picture, matrix, paint);
+}
+
+void BenchmarkingCanvas::onDrawBitmap(const SkBitmap& bitmap,
+ SkScalar left,
+ SkScalar top,
+ const SkPaint* paint) {
+ AutoOp op(this, "DrawBitmap", paint);
+ op.addParam("bitmap", AsValue(bitmap));
+ op.addParam("left", AsValue(left));
+ op.addParam("top", AsValue(top));
+
+ INHERITED::onDrawBitmap(bitmap, left, top, paint);
+}
+
+void BenchmarkingCanvas::onDrawBitmapRect(const SkBitmap& bitmap,
+ const SkRect* src,
+ const SkRect& dst,
+ const SkPaint* paint,
+ DrawBitmapRectFlags flags) {
+ AutoOp op(this, "DrawBitmapRect", paint);
+ op.addParam("bitmap", AsValue(bitmap));
+ if (src)
+ op.addParam("src", AsValue(*src));
+ op.addParam("dst", AsValue(dst));
+
+ INHERITED::onDrawBitmapRect(bitmap, src, dst, paint, flags);
+}
+
+void BenchmarkingCanvas::onDrawImage(const SkImage* image,
+ SkScalar left,
+ SkScalar top,
+ const SkPaint* paint) {
+ DCHECK(image);
+ AutoOp op(this, "DrawImage", paint);
+ op.addParam("image", AsValue(*image));
+ op.addParam("left", AsValue(left));
+ op.addParam("top", AsValue(top));
+
+ INHERITED::onDrawImage(image, left, top, paint);
+}
+
+void BenchmarkingCanvas::onDrawImageRect(const SkImage* image, const SkRect* src,
+ const SkRect& dst, const SkPaint* paint) {
+ DCHECK(image);
+ AutoOp op(this, "DrawImageRect", paint);
+ op.addParam("image", AsValue(*image));
+ if (src)
+ op.addParam("src", AsValue(*src));
+ op.addParam("dst", AsValue(dst));
+
+ INHERITED::onDrawImageRect(image, src, dst, paint);
+}
+
+void BenchmarkingCanvas::onDrawBitmapNine(const SkBitmap& bitmap,
+ const SkIRect& center,
+ const SkRect& dst,
+ const SkPaint* paint) {
+ AutoOp op(this, "DrawBitmapNine", paint);
+ op.addParam("bitmap", AsValue(bitmap));
+ op.addParam("center", AsValue(SkRect::Make(center)));
+ op.addParam("dst", AsValue(dst));
+
+ INHERITED::onDrawBitmapNine(bitmap, center, dst, paint);
+}
+
+void BenchmarkingCanvas::onDrawSprite(const SkBitmap& bitmap, int left, int top,
+ const SkPaint* paint) {
+ AutoOp op(this, "DrawSprite", paint);
+ op.addParam("bitmap", AsValue(bitmap));
+ op.addParam("left", AsValue(SkIntToScalar(left)));
+ op.addParam("top", AsValue(SkIntToScalar(top)));
+
+ INHERITED::onDrawSprite(bitmap, left, top, paint);
+}
+
+void BenchmarkingCanvas::onDrawText(const void* text, size_t byteLength,
+ SkScalar x, SkScalar y,
+ const SkPaint& paint) {
+ AutoOp op(this, "DrawText", &paint);
+ op.addParam("count", AsValue(SkIntToScalar(paint.countText(text, byteLength))));
+ op.addParam("x", AsValue(x));
+ op.addParam("y", AsValue(y));
+
+ INHERITED::onDrawText(text, byteLength, x, y, paint);
+}
+
+void BenchmarkingCanvas::onDrawPosText(const void* text, size_t byteLength,
+ const SkPoint pos[], const SkPaint& paint) {
+ AutoOp op(this, "DrawPosText", &paint);
+
+ int count = paint.countText(text, byteLength);
+ op.addParam("count", AsValue(SkIntToScalar(count)));
+ op.addParam("pos", AsListValue(pos, count));
+
+ INHERITED::onDrawPosText(text, byteLength, pos, paint);
+}
+
+void BenchmarkingCanvas::onDrawPosTextH(const void* text, size_t byteLength,
+ const SkScalar xpos[], SkScalar constY,
+ const SkPaint& paint) {
+ AutoOp op(this, "DrawPosTextH", &paint);
+ op.addParam("constY", AsValue(constY));
+
+ int count = paint.countText(text, byteLength);
+ op.addParam("count", AsValue(SkIntToScalar(count)));
+ op.addParam("pos", AsListValue(xpos, count));
+
+ INHERITED::onDrawPosTextH(text, byteLength, xpos, constY, paint);
+}
+
+void BenchmarkingCanvas::onDrawTextOnPath(const void* text, size_t byteLength,
+ const SkPath& path, const SkMatrix* matrix,
+ const SkPaint& paint) {
+ AutoOp op(this, "DrawTextOnPath", &paint);
+ op.addParam("count", AsValue(SkIntToScalar(paint.countText(text, byteLength))));
+ op.addParam("path", AsValue(path));
+ if (matrix)
+ op.addParam("matrix", AsValue(*matrix));
+
+ INHERITED::onDrawTextOnPath(text, byteLength, path, matrix, paint);
+}
+
+void BenchmarkingCanvas::onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y,
+ const SkPaint& paint) {
+ DCHECK(blob);
+ AutoOp op(this, "DrawTextBlob", &paint);
+ op.addParam("blob", AsValue(*blob));
+ op.addParam("x", AsValue(x));
+ op.addParam("y", AsValue(y));
+
+ INHERITED::onDrawTextBlob(blob, x, y, paint);
}
} // namespace skia
diff --git a/skia/ext/benchmarking_canvas.h b/skia/ext/benchmarking_canvas.h
index 50289a5..4f2e257 100644
--- a/skia/ext/benchmarking_canvas.h
+++ b/skia/ext/benchmarking_canvas.h
@@ -5,45 +5,86 @@
#ifndef SKIA_EXT_BENCHMARKING_CANVAS_H_
#define SKIA_EXT_BENCHMARKING_CANVAS_H_
-#include "base/compiler_specific.h"
-#include "skia/ext/refptr.h"
+#include "base/values.h"
#include "third_party/skia/include/utils/SkNWayCanvas.h"
-#include "third_party/skia/src/utils/debugger/SkDebugCanvas.h"
namespace skia {
-class TimingCanvas;
-
class SK_API BenchmarkingCanvas : public SkNWayCanvas {
public:
- BenchmarkingCanvas(int width, int height);
+ BenchmarkingCanvas(SkCanvas* canvas, unsigned flags = 0);
~BenchmarkingCanvas() override;
+ enum Flags {
+ // TODO(fmalita): add overdraw visualization support
+ // (http://crbug.com/461534)
+ kOverdrawVisualization_Flag = 0x01,
+ };
+
// Returns the number of draw commands executed on this canvas.
size_t CommandCount() const;
- // Get draw command info for a given index.
- SkDrawCommand* GetCommand(size_t index);
+ // Returns the list of executed draw commands.
+ const base::ListValue& Commands() const;
// Return the recorded render time (milliseconds) for a draw command index.
double GetTime(size_t index);
-private:
- // In order to avoid introducing a Skia version dependency, this
- // implementation dispatches draw commands in lock-step to two distinct
- // canvases:
- // * a SkDebugCanvas used for gathering command info and tracking
- // the current command index
- // * a SkiaTimingCanvas used for measuring raster paint times (and relying
- // on the former for tracking the current command index).
- //
- // This way, if the SkCanvas API is extended, we don't need to worry about
- // updating content::SkiaTimingCanvas to accurately override all new methods
- // (to avoid timing info indices from getting out of sync), as SkDebugCanvas
- // already does that for us.
+protected:
+ // SkCanvas overrides
+ void willSave() override;
+ SaveLayerStrategy willSaveLayer(const SkRect*,
+ const SkPaint*,
+ SaveFlags) override;
+ void willRestore() override;
- skia::RefPtr<SkDebugCanvas> debug_canvas_;
- skia::RefPtr<TimingCanvas> timing_canvas_;
+ void didConcat(const SkMatrix&) override;
+ void didSetMatrix(const SkMatrix&) override;
+
+ void onClipRect(const SkRect&, SkRegion::Op, ClipEdgeStyle) override;
+ void onClipRRect(const SkRRect&, SkRegion::Op, ClipEdgeStyle) override;
+ void onClipPath(const SkPath&, SkRegion::Op, ClipEdgeStyle) override;
+ void onClipRegion(const SkRegion&, SkRegion::Op) override;
+
+ void onDrawPaint(const SkPaint&) override;
+ void onDrawPoints(PointMode, size_t count, const SkPoint pts[],
+ const SkPaint&) override;
+ void onDrawRect(const SkRect&, const SkPaint&) override;
+ void onDrawOval(const SkRect&, const SkPaint&) override;
+ void onDrawRRect(const SkRRect&, const SkPaint&) override;
+ void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) override;
+ void onDrawPath(const SkPath&, const SkPaint&) override;
+
+ void onDrawPicture(const SkPicture*, const SkMatrix*, const SkPaint*) override;
+
+ void onDrawBitmap(const SkBitmap&, SkScalar left, SkScalar top, const SkPaint*) override;
+ void onDrawBitmapRect(const SkBitmap&, const SkRect* src, const SkRect& dst,
+ const SkPaint*, DrawBitmapRectFlags flags) override;
+ void onDrawImage(const SkImage*, SkScalar left, SkScalar top, const SkPaint*) override;
+ void onDrawImageRect(const SkImage*, const SkRect* src, const SkRect& dst,
+ const SkPaint*) override;
+ void onDrawBitmapNine(const SkBitmap&, const SkIRect& center, const SkRect& dst,
+ const SkPaint*) override;
+ void onDrawSprite(const SkBitmap&, int left, int top, const SkPaint*) override;
+
+ void onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y,
+ const SkPaint&) override;
+ void onDrawPosText(const void* text, size_t byteLength, const SkPoint pos[],
+ const SkPaint&) override;
+ void onDrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[],
+ SkScalar constY, const SkPaint&) override;
+ void onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path,
+ const SkMatrix* matrix, const SkPaint&) override;
+ void onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y,
+ const SkPaint& paint) override;
+
+private:
+ typedef SkNWayCanvas INHERITED;
+
+ class AutoOp;
+
+ base::ListValue op_records_;
+ unsigned flags_;
};
}
diff --git a/skia/skia_library.gypi b/skia/skia_library.gypi
index 2163a79..04e428a 100644
--- a/skia/skia_library.gypi
+++ b/skia/skia_library.gypi
@@ -102,7 +102,6 @@
'../third_party/skia/include/utils/SkLayer.h',
'../third_party/skia/include/utils/SkMeshUtils.h',
'../third_party/skia/include/utils/SkNinePatch.h',
- '../third_party/skia/include/utils/SkParse.h',
'../third_party/skia/include/utils/SkParsePaint.h',
'../third_party/skia/include/utils/SkParsePath.h',
'../third_party/skia/include/utils/SkRandom.h',
@@ -124,8 +123,6 @@
'../third_party/skia/src/utils/SkMeshUtils.cpp',
'../third_party/skia/src/utils/SkNinePatch.cpp',
'../third_party/skia/src/utils/SkOSFile.cpp',
- '../third_party/skia/src/utils/SkParse.cpp',
- '../third_party/skia/src/utils/SkParseColor.cpp',
'../third_party/skia/src/utils/SkParsePath.cpp',
'../third_party/skia/src/utils/SkPathUtils.cpp',
'../third_party/skia/src/utils/SkSHA1.cpp',
diff --git a/skia/skia_test_expectations.txt b/skia/skia_test_expectations.txt
index c8fd3a4..5927d5c 100644
--- a/skia/skia_test_expectations.txt
+++ b/skia/skia_test_expectations.txt
@@ -51,66 +51,4 @@
# We fixed a blending bug.
crbug.com/459579 virtual/gpu/fast/canvas/canvas-composite-transformclip.html [ ImageOnlyFailure ]
-# http://crrev/928853003 (SK_SUPPORT_LEGACY_ARCTO_QUADS)
-crbug.com/458898 accessibility/svg-bounds.html [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 fast/canvas/arc360.html [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 fast/canvas/canvas-arc-circumference-fill.html [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 fast/canvas/canvas-arc-circumference.html [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 fast/canvas/canvas-composite.html [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 fast/canvas/canvas-composite-transformclip.html [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 fast/canvas/canvas-ellipse-circumference-fill.html [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 fast/canvas/canvas-ellipse-circumference.html [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 fast/canvas/canvas-ellipse-connecting-line.html [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 fast/canvas/canvas-scroll-path-into-view.html [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 fast/canvas/image-object-in-canvas.html [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 svg/animations/animateMotion-accumulate-2b.svg [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 svg/batik/text/smallFonts.svg [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 svg/batik/text/textFeatures.svg [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 svg/batik/text/textProperties.svg [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 svg/custom/animate-path-discrete.svg [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 svg/custom/circular-marker-reference-1.svg [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 svg/custom/circular-marker-reference-2.svg [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 svg/custom/circular-marker-reference-3.svg [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 svg/custom/circular-marker-reference-4.svg [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 svg/custom/marker-opacity.svg [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 svg/custom/non-circular-marker-reference.svg [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 svg/custom/use-css-no-effect-on-shadow-tree.svg [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 svg/W3C-SVG-1.1/animate-elem-37-t.svg [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 svg/W3C-SVG-1.1/animate-elem-41-t.svg [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 svg/W3C-SVG-1.1/animate-elem-78-t.svg [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 svg/W3C-SVG-1.1/animate-elem-80-t.svg [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 svg/W3C-SVG-1.1/painting-stroke-03-t.svg [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 svg/W3C-SVG-1.1/paths-data-10-t.svg [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 svg/W3C-SVG-1.1/struct-group-03-t.svg [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 svg/W3C-SVG-1.2-Tiny/struct-use-recursion-02-t.svg [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 svg/W3C-SVG-1.2-Tiny/struct-use-recursion-03-t.svg [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 virtual/display_list_2d_canvas/fast/canvas/arc360.html [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 virtual/display_list_2d_canvas/fast/canvas/canvas-arc-circumference-fill.html [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 virtual/display_list_2d_canvas/fast/canvas/canvas-arc-circumference.html [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 virtual/display_list_2d_canvas/fast/canvas/canvas-composite.html [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 virtual/display_list_2d_canvas/fast/canvas/canvas-composite-transformclip.html [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 virtual/display_list_2d_canvas/fast/canvas/canvas-ellipse-circumference-fill.html [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 virtual/display_list_2d_canvas/fast/canvas/canvas-ellipse-circumference.html [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 virtual/display_list_2d_canvas/fast/canvas/canvas-ellipse-connecting-line.html [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 virtual/display_list_2d_canvas/fast/canvas/canvas-scroll-path-into-view.html [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 virtual/display_list_2d_canvas/fast/canvas/image-object-in-canvas.html [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 virtual/gpu/fast/canvas/arc360.html [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 virtual/gpu/fast/canvas/canvas-arc-circumference-fill.html [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 virtual/gpu/fast/canvas/canvas-arc-circumference.html [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 virtual/gpu/fast/canvas/canvas-composite.html [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 virtual/gpu/fast/canvas/canvas-ellipse-circumference-fill.html [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 virtual/gpu/fast/canvas/canvas-ellipse-circumference.html [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 virtual/gpu/fast/canvas/canvas-ellipse-connecting-line.html [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 virtual/gpu/fast/canvas/canvas-scroll-path-into-view.html [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 virtual/slimmingpaint/fast/canvas/arc360.html [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 virtual/slimmingpaint/fast/canvas/canvas-arc-circumference-fill.html [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 virtual/slimmingpaint/fast/canvas/canvas-arc-circumference.html [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 virtual/slimmingpaint/fast/canvas/canvas-composite.html [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 virtual/slimmingpaint/fast/canvas/canvas-composite-transformclip.html [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 virtual/slimmingpaint/fast/canvas/canvas-ellipse-circumference-fill.html [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 virtual/slimmingpaint/fast/canvas/canvas-ellipse-circumference.html [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 virtual/slimmingpaint/fast/canvas/canvas-ellipse-connecting-line.html [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 virtual/slimmingpaint/fast/canvas/canvas-scroll-path-into-view.html [ ImageOnlyFailure Failure Pass ]
-crbug.com/458898 virtual/slimmingpaint/fast/canvas/image-object-in-canvas.html [ ImageOnlyFailure Failure Pass ]
-
# END OVERRIDES HERE (this line ensures that the file is newline-terminated)
diff --git a/sky/compositor/layer_host.h b/sky/compositor/layer_host.h
index 1e4fcc7..36bf2df 100644
--- a/sky/compositor/layer_host.h
+++ b/sky/compositor/layer_host.h
@@ -22,7 +22,7 @@
class LayerHost : public SurfaceHolder::Client {
public:
explicit LayerHost(LayerHostClient* client);
- ~LayerHost();
+ ~LayerHost() override;
LayerHostClient* client() const { return client_; }
diff --git a/sky/engine/BUILD.gn b/sky/engine/BUILD.gn
index cc9d406..b94f7d5 100644
--- a/sky/engine/BUILD.gn
+++ b/sky/engine/BUILD.gn
@@ -46,7 +46,7 @@
# nullptr) conflict with upcoming c++0x types.
cflags_cc = [ "-Wno-c++0x-compat" ]
- if (is_linux && cpu_arch == "arm") {
+ if (is_linux && target_cpu == "arm") {
# Due to a bug in gcc arm, we get warnings about uninitialized
# timesNewRoman.unstatic.3258 and colorTransparent.unstatic.4879.
cflags += [ "-Wno-uninitialized" ]
diff --git a/sky/engine/config.gni b/sky/engine/config.gni
index 9575923..d6214be 100644
--- a/sky/engine/config.gni
+++ b/sky/engine/config.gni
@@ -8,7 +8,7 @@
import("//build/config/android/config.gni")
}
-if (cpu_arch == "arm") {
+if (target_cpu == "arm") {
import("//build/config/arm.gni")
} else {
# TODO(brettw) remove this once && early-out is checked in.
diff --git a/sky/engine/platform/BUILD.gn b/sky/engine/platform/BUILD.gn
index da61f25..c0bae3b 100644
--- a/sky/engine/platform/BUILD.gn
+++ b/sky/engine/platform/BUILD.gn
@@ -640,7 +640,7 @@
direct_dependent_configs = [ "//build/config/linux:fontconfig" ]
}
- if (cpu_arch == "arm") {
+ if (target_cpu == "arm") {
deps += [ ":sky_arm_neon" ]
}
}
@@ -713,7 +713,7 @@
include_dirs = [ "$root_build_dir" ]
}
-if (cpu_arch == "arm") {
+if (target_cpu == "arm") {
source_set("sky_arm_neon") {
sources = [
"graphics/cpu/arm/WebGLImageConversionNEON.h",
diff --git a/sky/engine/platform/graphics/ImageDecodingStoreTest.cpp b/sky/engine/platform/graphics/ImageDecodingStoreTest.cpp
index c0650fc..0e153c8 100644
--- a/sky/engine/platform/graphics/ImageDecodingStoreTest.cpp
+++ b/sky/engine/platform/graphics/ImageDecodingStoreTest.cpp
@@ -38,7 +38,7 @@
class ImageDecodingStoreTest : public ::testing::Test, public MockImageDecoderClient {
public:
- virtual void SetUp()
+ void SetUp() override
{
ImageDecodingStore::instance()->setCacheLimitInBytes(1024 * 1024);
m_data = SharedBuffer::create();
@@ -46,17 +46,17 @@
m_decodersDestroyed = 0;
}
- virtual void TearDown()
+ void TearDown() override
{
ImageDecodingStore::instance()->clear();
}
- virtual void decoderBeingDestroyed()
+ void decoderBeingDestroyed() override
{
++m_decodersDestroyed;
}
- virtual void frameBufferRequested()
+ void frameBufferRequested() override
{
// Decoder is never used by ImageDecodingStore.
ASSERT_TRUE(false);
diff --git a/sky/engine/platform/graphics/gpu/DrawingBufferTest.cpp b/sky/engine/platform/graphics/gpu/DrawingBufferTest.cpp
index bc9794b..cbc4074 100644
--- a/sky/engine/platform/graphics/gpu/DrawingBufferTest.cpp
+++ b/sky/engine/platform/graphics/gpu/DrawingBufferTest.cpp
@@ -205,7 +205,7 @@
class DrawingBufferTest : public Test {
protected:
- virtual void SetUp()
+ void SetUp() override
{
RefPtr<FakeContextEvictionManager> contextEvictionManager = adoptRef(new FakeContextEvictionManager());
OwnPtr<WebGraphicsContext3DForTests> context = adoptPtr(new WebGraphicsContext3DForTests);
@@ -443,7 +443,7 @@
class DrawingBufferImageChromiumTest : public DrawingBufferTest {
protected:
- virtual void SetUp()
+ void SetUp() override
{
RefPtr<FakeContextEvictionManager> contextEvictionManager = adoptRef(new FakeContextEvictionManager());
OwnPtr<WebGraphicsContext3DForTests> context = adoptPtr(new WebGraphicsContext3DForTests);
@@ -456,7 +456,7 @@
testing::Mock::VerifyAndClearExpectations(webContext());
}
- virtual void TearDown()
+ void TearDown() override
{
RuntimeEnabledFeatures::setWebGLImageChromiumEnabled(false);
}
diff --git a/sky/engine/platform/text/LineEnding.cpp b/sky/engine/platform/text/LineEnding.cpp
index 80ee70a..ac71b2e 100644
--- a/sky/engine/platform/text/LineEnding.cpp
+++ b/sky/engine/platform/text/LineEnding.cpp
@@ -50,16 +50,16 @@
: m_buffer(buffer)
{
}
- virtual ~CStringBuffer() { }
+ ~CStringBuffer() override { }
- virtual char* allocate(size_t size) override
+ char* allocate(size_t size) override
{
char* ptr;
m_buffer = CString::newUninitialized(size, ptr);
return ptr;
}
- virtual void copy(const CString& source) override
+ void copy(const CString& source) override
{
m_buffer = source;
}
@@ -76,16 +76,16 @@
: m_buffer(buffer)
{
}
- virtual ~VectorCharAppendBuffer() { }
+ ~VectorCharAppendBuffer() override { }
- virtual char* allocate(size_t size) override
+ char* allocate(size_t size) override
{
size_t oldSize = m_buffer.size();
m_buffer.grow(oldSize + size);
return m_buffer.data() + oldSize;
}
- virtual void copy(const CString& source) override
+ void copy(const CString& source) override
{
m_buffer.append(source.data(), source.length());
}
diff --git a/sky/tools/debugger/debugger.cc b/sky/tools/debugger/debugger.cc
index ed17436..7ba8c5f 100644
--- a/sky/tools/debugger/debugger.cc
+++ b/sky/tools/debugger/debugger.cc
@@ -29,7 +29,7 @@
public http_server::HttpHandler {
public:
SkyDebugger() : is_tracing_(false), handler_binding_(this) {}
- virtual ~SkyDebugger() {}
+ ~SkyDebugger() override {}
private:
// mojo::ApplicationDelegate:
diff --git a/sky/tools/debugger/trace_collector.h b/sky/tools/debugger/trace_collector.h
index ce8db02..8c6c322 100644
--- a/sky/tools/debugger/trace_collector.h
+++ b/sky/tools/debugger/trace_collector.h
@@ -18,7 +18,7 @@
typedef base::Callback<void(std::string)> TraceCallback;
explicit TraceCollector(mojo::ScopedDataPipeConsumerHandle source);
- ~TraceCollector();
+ ~TraceCollector() override;
void GetTrace(TraceCallback callback);
diff --git a/sky/tools/tester/test_harness_impl.h b/sky/tools/tester/test_harness_impl.h
index 3067b52..18f8696 100644
--- a/sky/tools/tester/test_harness_impl.h
+++ b/sky/tools/tester/test_harness_impl.h
@@ -19,7 +19,7 @@
public:
TestHarnessImpl(TestRunner* runner,
mojo::InterfaceRequest<TestHarness> request);
- virtual ~TestHarnessImpl();
+ ~TestHarnessImpl() override;
private:
// TestHarness implementation.
diff --git a/sky/tools/tester/test_runner.cc b/sky/tools/tester/test_runner.cc
index c726989..5982382 100644
--- a/sky/tools/tester/test_runner.cc
+++ b/sky/tools/tester/test_runner.cc
@@ -20,8 +20,8 @@
const std::string& url,
bool enable_pixel_dumping)
: client_(client),
- weak_ptr_factory_(this),
- enable_pixel_dumping_(enable_pixel_dumping) {
+ enable_pixel_dumping_(enable_pixel_dumping),
+ weak_ptr_factory_(this) {
CHECK(client);
mojo::ServiceProviderPtr test_harness_provider;
diff --git a/sky/tools/tester/test_runner.h b/sky/tools/tester/test_runner.h
index 57bfab2..8810240 100644
--- a/sky/tools/tester/test_runner.h
+++ b/sky/tools/tester/test_runner.h
@@ -45,8 +45,8 @@
mojo::ServiceProviderImpl test_harness_provider_impl_;
TestRunnerClient* client_;
- base::WeakPtrFactory<TestRunner> weak_ptr_factory_;
bool enable_pixel_dumping_;
+ base::WeakPtrFactory<TestRunner> weak_ptr_factory_;
MOJO_DISALLOW_COPY_AND_ASSIGN(TestRunner);
};
diff --git a/sky/tools/tester/tester.cc b/sky/tools/tester/tester.cc
index 631ca4e..f0af25c 100644
--- a/sky/tools/tester/tester.cc
+++ b/sky/tools/tester/tester.cc
@@ -64,17 +64,17 @@
root_(NULL),
content_(NULL),
weak_ptr_factory_(this) {}
- virtual ~SkyTester() {}
+ ~SkyTester() override {}
private:
// Overridden from mojo::ApplicationDelegate:
- virtual void Initialize(mojo::ApplicationImpl* impl) override {
+ void Initialize(mojo::ApplicationImpl* impl) override {
window_manager_app_->Initialize(impl);
if (impl->args().size() >= 2)
url_from_args_ = impl->args()[1];
}
- virtual bool ConfigureIncomingConnection(
+ bool ConfigureIncomingConnection(
mojo::ApplicationConnection* connection) override {
window_manager_app_->ConfigureIncomingConnection(connection);
if (test_runner_)
@@ -83,9 +83,9 @@
}
// Overridden from mojo::ViewManagerDelegate:
- virtual void OnEmbed(mojo::View* root,
- mojo::InterfaceRequest<mojo::ServiceProvider> services,
- mojo::ServiceProviderPtr exposed_services) override {
+ void OnEmbed(mojo::View* root,
+ mojo::InterfaceRequest<mojo::ServiceProvider> services,
+ mojo::ServiceProviderPtr exposed_services) override {
root_ = root;
root_->AddObserver(this);
@@ -100,22 +100,21 @@
}
// Overridden from window_manager::WindowManagerDelegate:
- virtual void Embed(const mojo::String& url,
- mojo::InterfaceRequest<mojo::ServiceProvider> services,
- mojo::ServiceProviderPtr exposed_services) override {}
+ void Embed(const mojo::String& url,
+ mojo::InterfaceRequest<mojo::ServiceProvider> services,
+ mojo::ServiceProviderPtr exposed_services) override {}
- virtual void OnViewManagerDisconnected(
- mojo::ViewManager* view_manager) override {
+ void OnViewManagerDisconnected(mojo::ViewManager* view_manager) override {
root_ = NULL;
}
- virtual void OnViewDestroyed(mojo::View* view) override {
+ void OnViewDestroyed(mojo::View* view) override {
view->RemoveObserver(this);
}
- virtual void OnViewBoundsChanged(mojo::View* view,
- const mojo::Rect& old_bounds,
- const mojo::Rect& new_bounds) override {
+ void OnViewBoundsChanged(mojo::View* view,
+ const mojo::Rect& old_bounds,
+ const mojo::Rect& new_bounds) override {
content_->SetBounds(new_bounds);
}
diff --git a/sky/viewer/internals.h b/sky/viewer/internals.h
index fc76d36..f94f268 100644
--- a/sky/viewer/internals.h
+++ b/sky/viewer/internals.h
@@ -17,7 +17,7 @@
class Internals : public base::SupportsUserData::Data,
public mojo::Shell {
public:
- virtual ~Internals();
+ ~Internals() override;
static void Create(Dart_Isolate isolate, DocumentView* document_view);
diff --git a/sky/viewer/viewer.cc b/sky/viewer/viewer.cc
index 61c92da..7f043b3 100644
--- a/sky/viewer/viewer.cc
+++ b/sky/viewer/viewer.cc
@@ -27,11 +27,11 @@
public:
Viewer() {}
- virtual ~Viewer() { blink::shutdown(); }
+ ~Viewer() override { blink::shutdown(); }
private:
// Overridden from ApplicationDelegate:
- virtual void Initialize(mojo::ApplicationImpl* app) override {
+ void Initialize(mojo::ApplicationImpl* app) override {
RuntimeFlags::Initialize(app);
mojo::NetworkServicePtr network_service;
@@ -43,15 +43,15 @@
tracing_.Initialize(app);
}
- virtual bool ConfigureIncomingConnection(
+ bool ConfigureIncomingConnection(
mojo::ApplicationConnection* connection) override {
connection->AddService<mojo::ContentHandler>(this);
return true;
}
// Overridden from InterfaceFactory<ContentHandler>
- virtual void Create(mojo::ApplicationConnection* connection,
- mojo::InterfaceRequest<mojo::ContentHandler> request) override {
+ void Create(mojo::ApplicationConnection* connection,
+ mojo::InterfaceRequest<mojo::ContentHandler> request) override {
new ContentHandlerImpl(request.Pass());
}
diff --git a/testing/android/java/src/org/chromium/native_test/ChromeNativeTestInstrumentationTestRunner.java b/testing/android/java/src/org/chromium/native_test/ChromeNativeTestInstrumentationTestRunner.java
index cc89268..4e1a067 100644
--- a/testing/android/java/src/org/chromium/native_test/ChromeNativeTestInstrumentationTestRunner.java
+++ b/testing/android/java/src/org/chromium/native_test/ChromeNativeTestInstrumentationTestRunner.java
@@ -12,17 +12,13 @@
import android.os.Environment;
import android.util.Log;
-import org.chromium.net.test.TestServerSpawner;
-
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
-import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
@@ -36,15 +32,11 @@
public static final String EXTRA_ONLY_OUTPUT_FAILURES =
"org.chromium.native_test.ChromeNativeTestInstrumentationTestRunner."
+ "OnlyOutputFailures";
- public static final String EXTRA_ENABLE_TEST_SERVER_SPAWNER =
- "org.chromium.native_test.ChromeNativeTestInstrumentationTestRunner."
- + "EnableTestServerSpawner";
private static final String TAG = "ChromeNativeTestInstrumentationTestRunner";
private static final int ACCEPT_TIMEOUT_MS = 5000;
private static final Pattern RE_TEST_OUTPUT = Pattern.compile("\\[ *([^ ]*) *\\] ?([^ ]+) .*");
- private static final int SERVER_SPAWNER_PORT = 0;
private static interface ResultsBundleGenerator {
public Bundle generate(Map<String, TestResult> rawResults);
@@ -57,10 +49,6 @@
private ResultsBundleGenerator mBundleGenerator;
private boolean mOnlyOutputFailures;
- private boolean mEnableTestServerSpawner;
- private TestServerSpawner mTestServerSpawner;
- private Thread mTestServerSpawnerThread;
-
@Override
public void onCreate(Bundle arguments) {
mCommandLineFile = arguments.getString(ChromeNativeTestActivity.EXTRA_COMMAND_LINE_FILE);
@@ -77,55 +65,16 @@
mLogBundle = new Bundle();
mBundleGenerator = new RobotiumBundleGenerator();
mOnlyOutputFailures = arguments.containsKey(EXTRA_ONLY_OUTPUT_FAILURES);
- mEnableTestServerSpawner = arguments.containsKey(EXTRA_ENABLE_TEST_SERVER_SPAWNER);
- mTestServerSpawner = null;
- mTestServerSpawnerThread = null;
start();
}
@Override
public void onStart() {
super.onStart();
-
- setUp();
Bundle results = runTests();
- tearDown();
-
finish(Activity.RESULT_OK, results);
}
- private void setUp() {
- if (mEnableTestServerSpawner) {
- Log.i(TAG, "Test server spawner enabled.");
- try {
- mTestServerSpawner = new TestServerSpawner(SERVER_SPAWNER_PORT, ACCEPT_TIMEOUT_MS);
-
- File portFile = new File(
- Environment.getExternalStorageDirectory(), "net-test-server-ports");
- OutputStreamWriter writer =
- new OutputStreamWriter(new FileOutputStream(portFile));
- writer.write(Integer.toString(mTestServerSpawner.getServerPort()) + ":0");
- writer.close();
-
- mTestServerSpawnerThread = new Thread(mTestServerSpawner);
- mTestServerSpawnerThread.start();
- } catch (IOException e) {
- Log.e(TAG, "Error creating TestServerSpawner: " + e.toString());
- }
- }
- }
-
- private void tearDown() {
- if (mTestServerSpawnerThread != null) {
- try {
- mTestServerSpawner.stop();
- mTestServerSpawnerThread.join();
- } catch (InterruptedException e) {
- Log.e(TAG, "Interrupted while shutting down test server spawner: " + e.toString());
- }
- }
- }
-
/** Runs the tests in the ChromeNativeTestActivity and returns a Bundle containing the results.
*/
private Bundle runTests() {
diff --git a/testing/buildbot/OWNERS b/testing/buildbot/OWNERS
index 8b86544..c3c145a 100644
--- a/testing/buildbot/OWNERS
+++ b/testing/buildbot/OWNERS
@@ -12,3 +12,8 @@
phajdan.jr@chromium.org
sky@chromium.org
thakis@chromium.org
+
+per-file chromium.perf.json=eakuefner@chromium.org
+per-file chromium.perf.json=fmeawad@chromium.org
+per-file chromium.perf.json=simonhatch@chromium.org
+per-file chromium.perf.json=sullivan@chromium.org
diff --git a/testing/buildbot/chromium.perf.json b/testing/buildbot/chromium.perf.json
index 2c63c08..6e748c7 100644
--- a/testing/buildbot/chromium.perf.json
+++ b/testing/buildbot/chromium.perf.json
@@ -1,2 +1,60 @@
{
+ "Android Nexus4 Perf": {
+ "scripts": [
+ {
+ "name": "host_info",
+ "script": "host_info.py"
+ }
+ ]
+ },
+ "Android Nexus5 Perf": {
+ "scripts": [
+ {
+ "name": "host_info",
+ "script": "host_info.py"
+ }
+ ]
+ },
+ "Android Nexus7v2 Perf": {
+ "scripts": [
+ {
+ "name": "host_info",
+ "script": "host_info.py"
+ }
+ ]
+ },
+ "Android Nexus10 Perf": {
+ "scripts": [
+ {
+ "name": "host_info",
+ "script": "host_info.py"
+ }
+ ]
+ },
+ "Android MotoE Perf": {
+ "scripts": [
+ {
+ "name": "host_info",
+ "script": "host_info.py"
+ }
+ ]
+ },
+ "Mac 10.8 Perf (1)": {
+ "scripts": [
+ {
+ "name": "gpu_perftests",
+ "script": "gtest_perf_test.py",
+ "args": ["gpu_perftests", "--test-launcher-print-test-stdio=always"]
+ }
+ ]
+ },
+ "Mac 10.9 Perf (1)": {
+ "scripts": [
+ {
+ "name": "gpu_perftests",
+ "script": "gtest_perf_test.py",
+ "args": ["gpu_perftests", "--test-launcher-print-test-stdio=always"]
+ }
+ ]
+ }
}
diff --git a/testing/buildbot/chromium.webkit.json b/testing/buildbot/chromium.webkit.json
index ae8f0b4..9933e3b 100644
--- a/testing/buildbot/chromium.webkit.json
+++ b/testing/buildbot/chromium.webkit.json
@@ -1,4 +1,238 @@
{
+ "WebKit XP": {
+ "gtest_tests": [
+ "blink_heap_unittests",
+ "blink_platform_unittests",
+ "webkit_unit_tests",
+ "wtf_unittests"
+ ],
+ "scripts": [
+ {
+ "name": "webkit_lint",
+ "script": "webkit_lint.py"
+ },
+ {
+ "name": "webkit_python_tests",
+ "script": "webkit_python_tests.py"
+ }
+ ]
+ },
+ "WebKit Win7": {
+ "gtest_tests": [
+ "blink_heap_unittests",
+ "blink_platform_unittests",
+ "webkit_unit_tests",
+ "wtf_unittests"
+ ],
+ "scripts": [
+ {
+ "name": "webkit_lint",
+ "script": "webkit_lint.py"
+ },
+ {
+ "name": "webkit_python_tests",
+ "script": "webkit_python_tests.py"
+ }
+ ]
+ },
+ "WebKit Win7 (dbg)": {
+ "gtest_tests": [
+ "blink_heap_unittests",
+ "blink_platform_unittests",
+ "webkit_unit_tests",
+ "wtf_unittests"
+ ],
+ "scripts": [
+ {
+ "name": "webkit_lint",
+ "script": "webkit_lint.py"
+ },
+ {
+ "name": "webkit_python_tests",
+ "script": "webkit_python_tests.py"
+ }
+ ]
+ },
+ "WebKit Mac10.6": {
+ "gtest_tests": [
+ "blink_heap_unittests",
+ "blink_platform_unittests",
+ "webkit_unit_tests",
+ "wtf_unittests"
+ ],
+ "scripts": [
+ {
+ "name": "webkit_lint",
+ "script": "webkit_lint.py"
+ },
+ {
+ "name": "webkit_python_tests",
+ "script": "webkit_python_tests.py"
+ }
+ ]
+ },
+ "WebKit Mac10.7": {
+ "gtest_tests": [
+ "blink_heap_unittests",
+ "blink_platform_unittests",
+ "webkit_unit_tests",
+ "wtf_unittests"
+ ],
+ "scripts": [
+ {
+ "name": "webkit_lint",
+ "script": "webkit_lint.py"
+ },
+ {
+ "name": "webkit_python_tests",
+ "script": "webkit_python_tests.py"
+ }
+ ]
+ },
+ "WebKit Mac10.8": {
+ "gtest_tests": [
+ "blink_heap_unittests",
+ "blink_platform_unittests",
+ "webkit_unit_tests",
+ "wtf_unittests"
+ ],
+ "scripts": [
+ {
+ "name": "webkit_lint",
+ "script": "webkit_lint.py"
+ },
+ {
+ "name": "webkit_python_tests",
+ "script": "webkit_python_tests.py"
+ }
+ ]
+ },
+ "WebKit Mac10.8 (retina)": {
+ "gtest_tests": [
+ "blink_heap_unittests",
+ "blink_platform_unittests",
+ "webkit_unit_tests",
+ "wtf_unittests"
+ ],
+ "scripts": [
+ {
+ "name": "webkit_lint",
+ "script": "webkit_lint.py"
+ },
+ {
+ "name": "webkit_python_tests",
+ "script": "webkit_python_tests.py"
+ }
+ ]
+ },
+ "WebKit Mac10.9": {
+ "gtest_tests": [
+ "blink_heap_unittests",
+ "blink_platform_unittests",
+ "webkit_unit_tests",
+ "wtf_unittests"
+ ],
+ "scripts": [
+ {
+ "name": "webkit_lint",
+ "script": "webkit_lint.py"
+ },
+ {
+ "name": "webkit_python_tests",
+ "script": "webkit_python_tests.py"
+ }
+ ]
+ },
+ "WebKit Mac10.6 (dbg)": {
+ "gtest_tests": [
+ "blink_heap_unittests",
+ "blink_platform_unittests",
+ "webkit_unit_tests",
+ "wtf_unittests"
+ ],
+ "scripts": [
+ {
+ "name": "webkit_lint",
+ "script": "webkit_lint.py"
+ },
+ {
+ "name": "webkit_python_tests",
+ "script": "webkit_python_tests.py"
+ }
+ ]
+ },
+ "WebKit Mac10.7 (dbg)": {
+ "gtest_tests": [
+ "blink_heap_unittests",
+ "blink_platform_unittests",
+ "webkit_unit_tests",
+ "wtf_unittests"
+ ],
+ "scripts": [
+ {
+ "name": "webkit_lint",
+ "script": "webkit_lint.py"
+ },
+ {
+ "name": "webkit_python_tests",
+ "script": "webkit_python_tests.py"
+ }
+ ]
+ },
+ "WebKit Linux": {
+ "gtest_tests": [
+ "blink_heap_unittests",
+ "blink_platform_unittests",
+ "webkit_unit_tests",
+ "wtf_unittests"
+ ],
+ "scripts": [
+ {
+ "name": "webkit_lint",
+ "script": "webkit_lint.py"
+ },
+ {
+ "name": "webkit_python_tests",
+ "script": "webkit_python_tests.py"
+ }
+ ]
+ },
+ "WebKit Linux 32": {
+ "gtest_tests": [
+ "blink_heap_unittests",
+ "blink_platform_unittests",
+ "webkit_unit_tests",
+ "wtf_unittests"
+ ],
+ "scripts": [
+ {
+ "name": "webkit_lint",
+ "script": "webkit_lint.py"
+ },
+ {
+ "name": "webkit_python_tests",
+ "script": "webkit_python_tests.py"
+ }
+ ]
+ },
+ "WebKit Linux (dbg)": {
+ "gtest_tests": [
+ "blink_heap_unittests",
+ "blink_platform_unittests",
+ "webkit_unit_tests",
+ "wtf_unittests"
+ ],
+ "scripts": [
+ {
+ "name": "webkit_lint",
+ "script": "webkit_lint.py"
+ },
+ {
+ "name": "webkit_python_tests",
+ "script": "webkit_python_tests.py"
+ }
+ ]
+ },
"Linux ChromiumOS Tests (1)": {
"gtest_tests": [
"accessibility_unittests",
diff --git a/testing/buildbot/trybot_analyze_config.json b/testing/buildbot/trybot_analyze_config.json
index 7921d66..a469ddd 100644
--- a/testing/buildbot/trybot_analyze_config.json
+++ b/testing/buildbot/trybot_analyze_config.json
@@ -34,12 +34,17 @@
"third_party/accessibility-audit/axs_testing.js",
"third_party/hunspell_dictionaries/.*",
"third_party/zlib/google/test/data/.*",
- "tools/clang/scripts/plugin_flags.sh",
+ "tools/clang/scripts/plugin_flags.py",
"tools/clang/scripts/update.py",
"tools/clang/scripts/update.sh",
"tools/metrics/histograms/histograms.xml",
"tools/perf/.*",
"tools/telemetry/.*"
]
+ },
+ "ios": {
+ "exclusions": [
+ "ios/build/bots/.*"
+ ]
}
}
diff --git a/testing/chromoting/chromoting_integration_tests.isolate b/testing/chromoting/chromoting_integration_tests.isolate
index be04bd6..82bf5f1 100644
--- a/testing/chromoting/chromoting_integration_tests.isolate
+++ b/testing/chromoting/chromoting_integration_tests.isolate
@@ -30,6 +30,7 @@
'../../remoting/tools/internal/test-account-host-config.json',
'<(PRODUCT_DIR)/remoting/com.google.chrome.remote_desktop.json',
'<(PRODUCT_DIR)/remoting/com.google.chrome.remote_assistance.json',
+ '<(PRODUCT_DIR)/remoting-me2me-host.deb',
],
},
}],
@@ -79,20 +80,7 @@
],
},
}],
- ['OS=="mac"', {
- 'variables': {
- 'command': [
- '../test_env.py',
- '<(PRODUCT_DIR)/browser_tests<(EXECUTABLE_SUFFIX)',
- '--gtest_filter=RemoteDesktopBrowserTest.MANUAL_Launch',
- '--run-manual',
- '--ui-test-action-timeout=100000',
- '--webapp-unpacked=<(PRODUCT_DIR)/remoting/remoting.webapp',
- '--extension-name=Chromoting',
- ],
- },
- }],
- ['OS=="win"', {
+ ['OS=="win" or OS=="mac"', {
'variables': {
'command': [
'../test_env.py',
@@ -100,7 +88,7 @@
'--gtest_filter=RemoteDesktopBrowserTest.MANUAL_Launch:RemoteDesktopBrowserTest.MANUAL_Auth',
'--run-manual',
'--ui-test-action-timeout=100000',
- '--webapp-unpacked=<(PRODUCT_DIR)/remoting/remoting.webapp',
+ '--webapp-unpacked=<(PRODUCT_DIR)/remoting/remoting.webapp.v2',
'--extension-name=Chromoting',
'--accounts-file=../../remoting/tools/internal/test_accounts.json',
'--account-type=gmail',
diff --git a/testing/commit_queue/config.json b/testing/commit_queue/config.json
index 8ae6e31..a335f78 100644
--- a/testing/commit_queue/config.json
+++ b/testing/commit_queue/config.json
@@ -5,6 +5,7 @@
"trybots": {
"launched": {
"tryserver.chromium.linux": {
+ "android_amp_rel_tests_recipe": ["defaulttests"],
"cast_shell": ["defaulttests"],
"cast_shell_apk": ["defaulttests"],
"linux_android_rel_ng": ["defaulttests"],
diff --git a/testing/scripts/webkit_lint.py b/testing/scripts/webkit_lint.py
new file mode 100755
index 0000000..eeb9367
--- /dev/null
+++ b/testing/scripts/webkit_lint.py
@@ -0,0 +1,43 @@
+#!/usr/bin/env python
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import json
+import os
+import sys
+
+
+import common
+
+
+def main_run(args):
+ with common.temporary_file() as tempfile_path:
+ rc = common.run_command([
+ sys.executable,
+ os.path.join(common.SRC_DIR, 'third_party', 'WebKit',
+ 'Tools', 'Scripts', 'lint-test-expectations'),
+ '--json', tempfile_path
+ ])
+
+ with open(tempfile_path) as f:
+ failures = json.load(f)
+
+ json.dump({
+ 'valid': True,
+ 'failures': failures,
+ }, args.output)
+
+ return rc
+
+
+def main_compile_targets(args):
+ json.dump([], args.output)
+
+
+if __name__ == '__main__':
+ funcs = {
+ 'run': main_run,
+ 'compile_targets': main_compile_targets,
+ }
+ sys.exit(common.run_script(sys.argv[1:], funcs))
diff --git a/testing/scripts/webkit_python_tests.py b/testing/scripts/webkit_python_tests.py
new file mode 100755
index 0000000..b0c2fbc
--- /dev/null
+++ b/testing/scripts/webkit_python_tests.py
@@ -0,0 +1,47 @@
+#!/usr/bin/env python
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import json
+import os
+import sys
+
+
+import common
+
+
+def main_run(args):
+ with common.temporary_file() as tempfile_path:
+ rc = common.run_command([
+ sys.executable,
+ os.path.join(common.SRC_DIR, 'third_party', 'WebKit',
+ 'Tools', 'Scripts', 'test-webkitpy'),
+ '--write-full-results-to', tempfile_path,
+ ])
+
+ with open(tempfile_path) as f:
+ results = json.load(f)
+
+ parsed_results = common.parse_common_test_results(results)
+ failures = parsed_results['unexpected_failures']
+
+ json.dump({
+ 'valid': bool(rc <= common.MAX_FAILURES_EXIT_STATUS and
+ ((rc == 0) or failures)),
+ 'failures': failures.keys(),
+ }, args.output)
+
+ return rc
+
+
+def main_compile_targets(args):
+ json.dump([], args.output)
+
+
+if __name__ == '__main__':
+ funcs = {
+ 'run': main_run,
+ 'compile_targets': main_compile_targets,
+ }
+ sys.exit(common.run_script(sys.argv[1:], funcs))
diff --git a/third_party/ashmem/BUILD.gn b/third_party/ashmem/BUILD.gn
index a3f7e6a..5e92b37 100644
--- a/third_party/ashmem/BUILD.gn
+++ b/third_party/ashmem/BUILD.gn
@@ -6,7 +6,7 @@
source_set("ashmem") {
sources = [
- "ashmem.h",
"ashmem-dev.c",
+ "ashmem.h",
]
}
diff --git a/third_party/fontconfig/BUILD.gn b/third_party/fontconfig/BUILD.gn
index 21f42ce..9af485f 100644
--- a/third_party/fontconfig/BUILD.gn
+++ b/third_party/fontconfig/BUILD.gn
@@ -36,8 +36,8 @@
"src/src/fcstat.c",
"src/src/fcstr.c",
"src/src/fcxml.c",
- "src/src/ftglue.h",
"src/src/ftglue.c",
+ "src/src/ftglue.h",
]
include_dirs = [
diff --git a/third_party/harfbuzz-ng/BUILD.gn b/third_party/harfbuzz-ng/BUILD.gn
index 90b200f..b370348 100644
--- a/third_party/harfbuzz-ng/BUILD.gn
+++ b/third_party/harfbuzz-ng/BUILD.gn
@@ -47,91 +47,91 @@
"src/hb-atomic-private.hh",
"src/hb-blob.cc",
"src/hb-blob.h",
- "src/hb-buffer.cc",
"src/hb-buffer-deserialize-json.hh",
"src/hb-buffer-deserialize-text.hh",
- "src/hb-buffer.h",
"src/hb-buffer-private.hh",
"src/hb-buffer-serialize.cc",
+ "src/hb-buffer.cc",
+ "src/hb-buffer.h",
"src/hb-cache-private.hh",
"src/hb-common.cc",
"src/hb-common.h",
"src/hb-deprecated.h",
+ "src/hb-face-private.hh",
"src/hb-face.cc",
"src/hb-face.h",
- "src/hb-face-private.hh",
"src/hb-fallback-shape.cc",
+ "src/hb-font-private.hh",
"src/hb-font.cc",
"src/hb-font.h",
- "src/hb-font-private.hh",
- "src/hb.h",
"src/hb-icu.cc",
"src/hb-icu.h",
"src/hb-mutex-private.hh",
"src/hb-object-private.hh",
"src/hb-open-file-private.hh",
"src/hb-open-type-private.hh",
- "src/hb-ot.h",
"src/hb-ot-head-table.hh",
"src/hb-ot-hhea-table.hh",
"src/hb-ot-hmtx-table.hh",
- "src/hb-ot-layout.cc",
"src/hb-ot-layout-common-private.hh",
"src/hb-ot-layout-gdef-table.hh",
"src/hb-ot-layout-gpos-table.hh",
- "src/hb-ot-layout-gsubgpos-private.hh",
"src/hb-ot-layout-gsub-table.hh",
- "src/hb-ot-layout.h",
+ "src/hb-ot-layout-gsubgpos-private.hh",
"src/hb-ot-layout-private.hh",
- "src/hb-ot-map.cc",
+ "src/hb-ot-layout.cc",
+ "src/hb-ot-layout.h",
"src/hb-ot-map-private.hh",
+ "src/hb-ot-map.cc",
"src/hb-ot-maxp-table.hh",
"src/hb-ot-name-table.hh",
- "src/hb-ot-shape.cc",
- "src/hb-ot-shape-complex-arabic.cc",
"src/hb-ot-shape-complex-arabic-fallback.hh",
"src/hb-ot-shape-complex-arabic-table.hh",
+ "src/hb-ot-shape-complex-arabic.cc",
"src/hb-ot-shape-complex-default.cc",
"src/hb-ot-shape-complex-hangul.cc",
"src/hb-ot-shape-complex-hebrew.cc",
- "src/hb-ot-shape-complex-indic.cc",
"src/hb-ot-shape-complex-indic-machine.hh",
"src/hb-ot-shape-complex-indic-private.hh",
"src/hb-ot-shape-complex-indic-table.cc",
- "src/hb-ot-shape-complex-myanmar.cc",
+ "src/hb-ot-shape-complex-indic.cc",
"src/hb-ot-shape-complex-myanmar-machine.hh",
+ "src/hb-ot-shape-complex-myanmar.cc",
"src/hb-ot-shape-complex-private.hh",
- "src/hb-ot-shape-complex-sea.cc",
"src/hb-ot-shape-complex-sea-machine.hh",
+ "src/hb-ot-shape-complex-sea.cc",
"src/hb-ot-shape-complex-thai.cc",
"src/hb-ot-shape-complex-tibetan.cc",
- "src/hb-ot-shape-fallback.cc",
"src/hb-ot-shape-fallback-private.hh",
- "src/hb-ot-shape.h",
- "src/hb-ot-shape-normalize.cc",
+ "src/hb-ot-shape-fallback.cc",
"src/hb-ot-shape-normalize-private.hh",
+ "src/hb-ot-shape-normalize.cc",
"src/hb-ot-shape-private.hh",
+ "src/hb-ot-shape.cc",
+ "src/hb-ot-shape.h",
"src/hb-ot-tag.cc",
"src/hb-ot-tag.h",
+ "src/hb-ot.h",
"src/hb-private.hh",
+ "src/hb-set-private.hh",
"src/hb-set.cc",
"src/hb-set.h",
- "src/hb-set-private.hh",
- "src/hb-shape.cc",
- "src/hb-shape.h",
+ "src/hb-shape-plan-private.hh",
"src/hb-shape-plan.cc",
"src/hb-shape-plan.h",
- "src/hb-shape-plan-private.hh",
- "src/hb-shaper.cc",
+ "src/hb-shape.cc",
+ "src/hb-shape.h",
"src/hb-shaper-impl-private.hh",
"src/hb-shaper-list.hh",
"src/hb-shaper-private.hh",
+ "src/hb-shaper.cc",
+ "src/hb-unicode-private.hh",
"src/hb-unicode.cc",
"src/hb-unicode.h",
- "src/hb-unicode-private.hh",
"src/hb-utf-private.hh",
"src/hb-version.h",
"src/hb-warning.cc",
+ "src/hb.h",
]
defines = [
diff --git a/third_party/harfbuzz-ng/src/hb-buffer.cc b/third_party/harfbuzz-ng/src/hb-buffer.cc
index 0500aa2..942177c 100644
--- a/third_party/harfbuzz-ng/src/hb-buffer.cc
+++ b/third_party/harfbuzz-ng/src/hb-buffer.cc
@@ -454,7 +454,7 @@
info[j] = t;
}
- if (pos) {
+ if (have_positions) {
for (i = start, j = end - 1; i < j; i++, j--) {
hb_glyph_position_t t;
diff --git a/third_party/libxml/BUILD.gn b/third_party/libxml/BUILD.gn
index 992e92a..299a110 100644
--- a/third_party/libxml/BUILD.gn
+++ b/third_party/libxml/BUILD.gn
@@ -27,24 +27,43 @@
static_library("libxml") {
output_name = "libxml2"
sources = [
- "chromium/libxml_utils.h",
"chromium/libxml_utils.cc",
+ "chromium/libxml_utils.h",
"linux/config.h",
"linux/include/libxml/xmlversion.h",
"mac/config.h",
"mac/include/libxml/xmlversion.h",
+ "src/DOCBparser.c",
+ "src/HTMLparser.c",
+ "src/HTMLtree.c",
+ "src/SAX.c",
+ "src/SAX2.c",
+ "src/acconfig.h",
+ "src/c14n.c",
+ "src/catalog.c",
+ "src/chvalid.c",
+ "src/debugXML.c",
+ "src/dict.c",
+ "src/elfgcchack.h",
+ "src/encoding.c",
+ "src/entities.c",
+ "src/error.c",
+ "src/globals.c",
+ "src/hash.c",
+ "src/include/libxml/DOCBparser.h",
+ "src/include/libxml/HTMLparser.h",
+ "src/include/libxml/HTMLtree.h",
+ "src/include/libxml/SAX.h",
+ "src/include/libxml/SAX2.h",
"src/include/libxml/c14n.h",
"src/include/libxml/catalog.h",
"src/include/libxml/chvalid.h",
"src/include/libxml/debugXML.h",
"src/include/libxml/dict.h",
- "src/include/libxml/DOCBparser.h",
"src/include/libxml/encoding.h",
"src/include/libxml/entities.h",
"src/include/libxml/globals.h",
"src/include/libxml/hash.h",
- "src/include/libxml/HTMLparser.h",
- "src/include/libxml/HTMLtree.h",
"src/include/libxml/list.h",
"src/include/libxml/nanoftp.h",
"src/include/libxml/nanohttp.h",
@@ -52,8 +71,6 @@
"src/include/libxml/parserInternals.h",
"src/include/libxml/pattern.h",
"src/include/libxml/relaxng.h",
- "src/include/libxml/SAX.h",
- "src/include/libxml/SAX2.h",
"src/include/libxml/schemasInternals.h",
"src/include/libxml/schematron.h",
"src/include/libxml/threads.h",
@@ -62,10 +79,10 @@
"src/include/libxml/valid.h",
"src/include/libxml/xinclude.h",
"src/include/libxml/xlink.h",
+ "src/include/libxml/xmlIO.h",
"src/include/libxml/xmlautomata.h",
"src/include/libxml/xmlerror.h",
"src/include/libxml/xmlexports.h",
- "src/include/libxml/xmlIO.h",
"src/include/libxml/xmlmemory.h",
"src/include/libxml/xmlmodule.h",
"src/include/libxml/xmlreader.h",
@@ -81,21 +98,6 @@
"src/include/libxml/xpointer.h",
"src/include/win32config.h",
"src/include/wsockcompat.h",
- "src/acconfig.h",
- "src/c14n.c",
- "src/catalog.c",
- "src/chvalid.c",
- "src/debugXML.c",
- "src/dict.c",
- "src/DOCBparser.c",
- "src/elfgcchack.h",
- "src/encoding.c",
- "src/entities.c",
- "src/error.c",
- "src/globals.c",
- "src/hash.c",
- "src/HTMLparser.c",
- "src/HTMLtree.c",
"src/legacy.c",
"src/libxml.h",
"src/list.c",
@@ -105,8 +107,6 @@
"src/parserInternals.c",
"src/pattern.c",
"src/relaxng.c",
- "src/SAX.c",
- "src/SAX2.c",
"src/schematron.c",
"src/threads.c",
"src/tree.c",
diff --git a/third_party/mesa/BUILD.gn b/third_party/mesa/BUILD.gn
index 468a7e6..acdca86 100644
--- a/third_party/mesa/BUILD.gn
+++ b/third_party/mesa/BUILD.gn
@@ -149,19 +149,19 @@
"src/src/glsl/glsl_types.cpp",
"src/src/glsl/glsl_types.h",
"src/src/glsl/hir_field_selection.cpp",
+ "src/src/glsl/ir.cpp",
+ "src/src/glsl/ir.h",
"src/src/glsl/ir_basic_block.cpp",
"src/src/glsl/ir_basic_block.h",
"src/src/glsl/ir_builder.cpp",
"src/src/glsl/ir_builder.h",
"src/src/glsl/ir_clone.cpp",
"src/src/glsl/ir_constant_expression.cpp",
- "src/src/glsl/ir.cpp",
"src/src/glsl/ir_expression_flattening.cpp",
"src/src/glsl/ir_expression_flattening.h",
- "src/src/glsl/ir_function_can_inline.cpp",
"src/src/glsl/ir_function.cpp",
+ "src/src/glsl/ir_function_can_inline.cpp",
"src/src/glsl/ir_function_detect_recursion.cpp",
- "src/src/glsl/ir.h",
"src/src/glsl/ir_hierarchical_visitor.cpp",
"src/src/glsl/ir_hierarchical_visitor.h",
"src/src/glsl/ir_hv_accept.cpp",
@@ -176,11 +176,11 @@
"src/src/glsl/ir_validate.cpp",
"src/src/glsl/ir_variable_refcount.cpp",
"src/src/glsl/ir_variable_refcount.h",
- "src/src/glsl/linker.cpp",
- "src/src/glsl/linker.h",
"src/src/glsl/link_functions.cpp",
"src/src/glsl/link_uniform_initializers.cpp",
"src/src/glsl/link_uniforms.cpp",
+ "src/src/glsl/linker.cpp",
+ "src/src/glsl/linker.h",
"src/src/glsl/loop_analysis.cpp",
"src/src/glsl/loop_analysis.h",
"src/src/glsl/loop_controls.cpp",
@@ -250,7 +250,11 @@
static_library("mesa") {
sources = [
"$generated_src_dir/mesa/builtin_function.cpp",
+ "$generated_src_dir/mesa/enums.c",
"$generated_src_dir/mesa/glapi_mapi_tmp_shared.h",
+ "$generated_src_dir/mesa/lex.yy.c",
+ "$generated_src_dir/mesa/program/program_parse.tab.c",
+ "$generated_src_dir/mesa/program/program_parse.tab.h",
"src/src/mapi/mapi/entry.c",
"src/src/mapi/mapi/entry.h",
"src/src/mapi/mapi/mapi_glapi.c",
@@ -312,7 +316,6 @@
"src/src/mesa/main/drawtex.h",
"src/src/mesa/main/enable.c",
"src/src/mesa/main/enable.h",
- "$generated_src_dir/mesa/enums.c",
"src/src/mesa/main/enums.h",
"src/src/mesa/main/errors.c",
"src/src/mesa/main/errors.h",
@@ -474,7 +477,6 @@
"src/src/mesa/program/hash_table.h",
"src/src/mesa/program/ir_to_mesa.cpp",
"src/src/mesa/program/ir_to_mesa.h",
- "$generated_src_dir/mesa/lex.yy.c",
"src/src/mesa/program/nvfragparse.c",
"src/src/mesa/program/nvfragparse.h",
"src/src/mesa/program/nvvertparse.c",
@@ -500,8 +502,6 @@
"src/src/mesa/program/prog_statevars.h",
"src/src/mesa/program/program.c",
"src/src/mesa/program/program.h",
- "$generated_src_dir/mesa/program/program_parse.tab.c",
- "$generated_src_dir/mesa/program/program_parse.tab.h",
"src/src/mesa/program/program_parse_extra.c",
"src/src/mesa/program/programopt.c",
"src/src/mesa/program/programopt.h",
diff --git a/third_party/mesa/mesa.gyp b/third_party/mesa/mesa.gyp
index bf2afcd..82027b3 100644
--- a/third_party/mesa/mesa.gyp
+++ b/third_party/mesa/mesa.gyp
@@ -80,6 +80,7 @@
# which is used by gallium/auxiliary/Makefile.
'-fsanitize=null',
'-fsanitize=vptr',
+ '-fsanitize-coverage=<(sanitizer_coverage)',
],
}],
],
diff --git a/third_party/ots/BUILD.gn b/third_party/ots/BUILD.gn
index 513dce6..c9d339a 100644
--- a/third_party/ots/BUILD.gn
+++ b/third_party/ots/BUILD.gn
@@ -8,8 +8,8 @@
source_set("ots") {
sources = [
- "include/ots-memory-stream.h",
"include/opentype-sanitiser.h",
+ "include/ots-memory-stream.h",
"src/cff.cc",
"src/cff.h",
"src/cff_type2_charstring.cc",
@@ -46,10 +46,10 @@
"src/loca.h",
"src/ltsh.cc",
"src/ltsh.h",
- "src/maxp.cc",
- "src/maxp.h",
"src/math.cc",
"src/math_.h",
+ "src/maxp.cc",
+ "src/maxp.h",
"src/metrics.cc",
"src/metrics.h",
"src/name.cc",
diff --git a/third_party/protobuf/BUILD.gn b/third_party/protobuf/BUILD.gn
index 6825f1e..d94a4cb 100644
--- a/third_party/protobuf/BUILD.gn
+++ b/third_party/protobuf/BUILD.gn
@@ -95,6 +95,7 @@
}
public_configs = [
":protobuf_config",
+
# TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
"//build/config/compiler:no_size_t_to_int_warning",
]
@@ -118,57 +119,57 @@
sources = protobuf_lite_sources
sources += [
- "src/google/protobuf/descriptor.h",
- "src/google/protobuf/descriptor.pb.h",
- "src/google/protobuf/descriptor_database.h",
- "src/google/protobuf/dynamic_message.h",
- "src/google/protobuf/generated_enum_reflection.h",
- "src/google/protobuf/generated_message_reflection.h",
- "src/google/protobuf/message.h",
- "src/google/protobuf/reflection_ops.h",
- "src/google/protobuf/service.h",
- "src/google/protobuf/text_format.h",
- "src/google/protobuf/wire_format.h",
- "src/google/protobuf/io/gzip_stream.h",
- "src/google/protobuf/io/printer.h",
- "src/google/protobuf/io/tokenizer.h",
- "src/google/protobuf/io/zero_copy_stream_impl.h",
"src/google/protobuf/compiler/code_generator.h",
"src/google/protobuf/compiler/command_line_interface.h",
"src/google/protobuf/compiler/importer.h",
"src/google/protobuf/compiler/java/java_doc_comment.cc",
"src/google/protobuf/compiler/java/java_doc_comment.h",
"src/google/protobuf/compiler/parser.h",
- "src/google/protobuf/stubs/strutil.cc",
- "src/google/protobuf/stubs/strutil.h",
- "src/google/protobuf/stubs/substitute.cc",
- "src/google/protobuf/stubs/substitute.h",
+ "src/google/protobuf/descriptor.cc",
+ "src/google/protobuf/descriptor.h",
+ "src/google/protobuf/descriptor.pb.cc",
+ "src/google/protobuf/descriptor.pb.h",
+ "src/google/protobuf/descriptor_database.cc",
+ "src/google/protobuf/descriptor_database.h",
+ "src/google/protobuf/dynamic_message.cc",
+ "src/google/protobuf/dynamic_message.h",
+ "src/google/protobuf/extension_set_heavy.cc",
+ "src/google/protobuf/generated_enum_reflection.h",
+ "src/google/protobuf/generated_message_reflection.cc",
+ "src/google/protobuf/generated_message_reflection.h",
+ "src/google/protobuf/io/gzip_stream.h",
+ "src/google/protobuf/io/printer.h",
+ "src/google/protobuf/io/tokenizer.h",
+ "src/google/protobuf/io/zero_copy_stream_impl.h",
+ "src/google/protobuf/message.cc",
+ "src/google/protobuf/message.h",
+ "src/google/protobuf/reflection_ops.cc",
+ "src/google/protobuf/reflection_ops.h",
+ "src/google/protobuf/service.cc",
+ "src/google/protobuf/service.h",
"src/google/protobuf/stubs/stl_util.h",
"src/google/protobuf/stubs/stringprintf.cc",
"src/google/protobuf/stubs/stringprintf.h",
"src/google/protobuf/stubs/structurally_valid.cc",
+ "src/google/protobuf/stubs/strutil.cc",
+ "src/google/protobuf/stubs/strutil.h",
+ "src/google/protobuf/stubs/substitute.cc",
+ "src/google/protobuf/stubs/substitute.h",
"src/google/protobuf/stubs/template_util.h",
"src/google/protobuf/stubs/type_traits.h",
- "src/google/protobuf/descriptor.cc",
- "src/google/protobuf/descriptor.pb.cc",
- "src/google/protobuf/descriptor_database.cc",
- "src/google/protobuf/dynamic_message.cc",
- "src/google/protobuf/extension_set_heavy.cc",
- "src/google/protobuf/generated_message_reflection.cc",
- "src/google/protobuf/message.cc",
- "src/google/protobuf/reflection_ops.cc",
- "src/google/protobuf/service.cc",
"src/google/protobuf/text_format.cc",
+ "src/google/protobuf/text_format.h",
"src/google/protobuf/wire_format.cc",
+ "src/google/protobuf/wire_format.h",
# This file pulls in zlib, but it's not actually used by protoc, so
# instead of compiling zlib for the host, let's just exclude this.
# "src/src/google/protobuf/io/gzip_stream.cc",
+ "src/google/protobuf/compiler/importer.cc",
+ "src/google/protobuf/compiler/parser.cc",
"src/google/protobuf/io/printer.cc",
"src/google/protobuf/io/tokenizer.cc",
"src/google/protobuf/io/zero_copy_stream_impl.cc",
- "src/google/protobuf/compiler/importer.cc",
- "src/google/protobuf/compiler/parser.cc",
]
configs -= [ "//build/config/compiler:chromium_code" ]
@@ -178,6 +179,7 @@
}
public_configs = [
":protobuf_config",
+
# TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
"//build/config/compiler:no_size_t_to_int_warning",
]
@@ -191,12 +193,6 @@
sources = [
"src/google/protobuf/compiler/code_generator.cc",
"src/google/protobuf/compiler/command_line_interface.cc",
- "src/google/protobuf/compiler/plugin.cc",
- "src/google/protobuf/compiler/plugin.pb.cc",
- "src/google/protobuf/compiler/subprocess.cc",
- "src/google/protobuf/compiler/subprocess.h",
- "src/google/protobuf/compiler/zip_writer.cc",
- "src/google/protobuf/compiler/zip_writer.h",
"src/google/protobuf/compiler/cpp/cpp_enum.cc",
"src/google/protobuf/compiler/cpp/cpp_enum.h",
"src/google/protobuf/compiler/cpp/cpp_enum_field.cc",
@@ -243,8 +239,14 @@
"src/google/protobuf/compiler/java/java_service.h",
"src/google/protobuf/compiler/java/java_string_field.cc",
"src/google/protobuf/compiler/java/java_string_field.h",
- "src/google/protobuf/compiler/python/python_generator.cc",
"src/google/protobuf/compiler/main.cc",
+ "src/google/protobuf/compiler/plugin.cc",
+ "src/google/protobuf/compiler/plugin.pb.cc",
+ "src/google/protobuf/compiler/python/python_generator.cc",
+ "src/google/protobuf/compiler/subprocess.cc",
+ "src/google/protobuf/compiler/subprocess.h",
+ "src/google/protobuf/compiler/zip_writer.cc",
+ "src/google/protobuf/compiler/zip_writer.h",
]
configs -= [ "//build/config/compiler:chromium_code" ]
@@ -262,3 +264,68 @@
deps += [ "//build/config/sanitizers:deps" ]
}
}
+
+copy("copy_google") {
+ sources = [
+ "__init__.py",
+ ]
+ outputs = [
+ "$root_gen_dir/google/{{source_file_part}}",
+ ]
+}
+
+copy("copy_google_protobuf") {
+ sources = [
+ "python/google/protobuf/__init__.py",
+ "python/google/protobuf/descriptor.py",
+ "python/google/protobuf/descriptor_database.py",
+ "python/google/protobuf/descriptor_pool.py",
+ "python/google/protobuf/message.py",
+ "python/google/protobuf/message_factory.py",
+ "python/google/protobuf/reflection.py",
+ "python/google/protobuf/service.py",
+ "python/google/protobuf/service_reflection.py",
+ "python/google/protobuf/text_format.py",
+
+ # TODO(ncarter): protoc"s python generator treats
+ # descriptor.proto specially, but it's not possible to trigger
+ # the special treatment unless you run protoc from ./src/src
+ # (the treatment is based on the path to the .proto file
+ # matching a constant exactly). I'm not sure how to convince
+ # gyp to execute a rule from a different directory. Until this
+ # is resolved, use a copy of descriptor_pb2.py that I manually
+ # generated.
+ "descriptor_pb2.py",
+ ]
+ outputs = [
+ "$root_gen_dir/google/protobuf/{{source_file_part}}",
+ ]
+}
+
+copy("copy_google_protobuf_internal") {
+ sources = [
+ "python/google/protobuf/internal/__init__.py",
+ "python/google/protobuf/internal/api_implementation.py",
+ "python/google/protobuf/internal/containers.py",
+ "python/google/protobuf/internal/cpp_message.py",
+ "python/google/protobuf/internal/decoder.py",
+ "python/google/protobuf/internal/encoder.py",
+ "python/google/protobuf/internal/enum_type_wrapper.py",
+ "python/google/protobuf/internal/generator_test.py",
+ "python/google/protobuf/internal/message_listener.py",
+ "python/google/protobuf/internal/python_message.py",
+ "python/google/protobuf/internal/type_checkers.py",
+ "python/google/protobuf/internal/wire_format.py",
+ ]
+ outputs = [
+ "$root_gen_dir/google/protobuf/internal/{{source_file_part}}",
+ ]
+}
+
+group("py_proto") {
+ public_deps = [
+ ":copy_google",
+ ":copy_google_protobuf",
+ ":copy_google_protobuf_internal",
+ ]
+}
diff --git a/third_party/yasm/BUILD.gn b/third_party/yasm/BUILD.gn
index a09a495..9ed8e46 100644
--- a/third_party/yasm/BUILD.gn
+++ b/third_party/yasm/BUILD.gn
@@ -124,13 +124,13 @@
executable("re2c") {
sources = [
- "source/patched-yasm/tools/re2c/main.c",
+ "source/patched-yasm/tools/re2c/actions.c",
"source/patched-yasm/tools/re2c/code.c",
"source/patched-yasm/tools/re2c/dfa.c",
- "source/patched-yasm/tools/re2c/parser.c",
- "source/patched-yasm/tools/re2c/actions.c",
- "source/patched-yasm/tools/re2c/scanner.c",
+ "source/patched-yasm/tools/re2c/main.c",
"source/patched-yasm/tools/re2c/mbo_getopt.c",
+ "source/patched-yasm/tools/re2c/parser.c",
+ "source/patched-yasm/tools/re2c/scanner.c",
"source/patched-yasm/tools/re2c/substr.c",
"source/patched-yasm/tools/re2c/translate.c",
]
@@ -203,8 +203,8 @@
"source/patched-yasm/modules/objfmts/macho/macho-objfmt.c",
"source/patched-yasm/modules/objfmts/rdf/rdf-objfmt.c",
"source/patched-yasm/modules/objfmts/xdf/xdf-objfmt.c",
- "source/patched-yasm/modules/parsers/gas/gas-parse.c",
"source/patched-yasm/modules/parsers/gas/gas-parse-intel.c",
+ "source/patched-yasm/modules/parsers/gas/gas-parse.c",
"source/patched-yasm/modules/parsers/gas/gas-parser.c",
"source/patched-yasm/modules/parsers/nasm/nasm-parse.c",
"source/patched-yasm/modules/parsers/nasm/nasm-parser.c",
diff --git a/tools/clang/blink_gc_plugin/BlinkGCPlugin.cpp b/tools/clang/blink_gc_plugin/BlinkGCPlugin.cpp
index 85cf086..2d221d7 100644
--- a/tools/clang/blink_gc_plugin/BlinkGCPlugin.cpp
+++ b/tools/clang/blink_gc_plugin/BlinkGCPlugin.cpp
@@ -315,6 +315,20 @@
return true;
}
+ bool VisitUnresolvedMemberExpr(UnresolvedMemberExpr* member) {
+ for (Decl* decl : member->decls()) {
+ if (CXXMethodDecl* method = dyn_cast<CXXMethodDecl>(decl)) {
+ if (method->getParent() == receiver_->record() &&
+ Config::GetTraceMethodType(method) ==
+ Config::TRACE_AFTER_DISPATCH_METHOD) {
+ dispatched_to_receiver_ = true;
+ return true;
+ }
+ }
+ }
+ return true;
+ }
+
private:
RecordInfo* receiver_;
bool dispatched_to_receiver_;
@@ -325,8 +339,12 @@
// - A base is traced if a base-qualified call to a trace method is found.
class CheckTraceVisitor : public RecursiveASTVisitor<CheckTraceVisitor> {
public:
- CheckTraceVisitor(CXXMethodDecl* trace, RecordInfo* info)
- : trace_(trace), info_(info), delegates_to_traceimpl_(false) {}
+ CheckTraceVisitor(CXXMethodDecl* trace, RecordInfo* info, RecordCache* cache)
+ : trace_(trace),
+ info_(info),
+ cache_(cache),
+ delegates_to_traceimpl_(false) {
+ }
bool delegates_to_traceimpl() const { return delegates_to_traceimpl_; }
@@ -370,17 +388,8 @@
if (CheckTraceBaseCall(call))
return true;
- // If we find a call to registerWeakMembers which is unresolved we
- // unsoundly consider all weak members as traced.
- // TODO: Find out how to validate weak member tracing for unresolved call.
- if (expr->getMemberName().getAsString() == kRegisterWeakMembersName) {
- for (RecordInfo::Fields::iterator it = info_->GetFields().begin();
- it != info_->GetFields().end();
- ++it) {
- if (it->second.edge()->IsWeakMember())
- it->second.MarkTraced();
- }
- }
+ if (expr->getMemberName().getAsString() == kRegisterWeakMembersName)
+ MarkAllWeakMembersTraced();
QualType base = expr->getBaseType();
if (!base->isPointerType())
@@ -408,6 +417,18 @@
}
private:
+ bool IsTraceCallName(const std::string& name) {
+ if (trace_->getName() == kTraceImplName)
+ return name == kTraceName;
+ if (trace_->getName() == kTraceAfterDispatchImplName)
+ return name == kTraceAfterDispatchName;
+ // Currently, a manually dispatched class cannot have mixin bases (having
+ // one would add a vtable which we explicitly check against). This means
+ // that we can only make calls to a trace method of the same name. Revisit
+ // this if our mixin/vtable assumption changes.
+ return name == trace_->getName();
+ }
+
CXXRecordDecl* GetDependentTemplatedDecl(CXXDependentScopeMemberExpr* expr) {
NestedNameSpecifier* qual = expr->getQualifier();
if (!qual)
@@ -424,18 +445,23 @@
CXXDependentScopeMemberExpr* expr) {
string fn_name = expr->getMember().getAsString();
- // Check for VisitorDispatcher::trace(field)
+ // Check for VisitorDispatcher::trace(field) and
+ // VisitorDispatcher::registerWeakMembers.
if (!expr->isImplicitAccess()) {
if (clang::DeclRefExpr* base_decl =
clang::dyn_cast<clang::DeclRefExpr>(expr->getBase())) {
- if (Config::IsVisitorDispatcherType(base_decl->getType()) &&
- call->getNumArgs() == 1 && fn_name == kTraceName) {
- FindFieldVisitor finder;
- finder.TraverseStmt(call->getArg(0));
- if (finder.field())
- FoundField(finder.field());
+ if (Config::IsVisitorDispatcherType(base_decl->getType())) {
+ if (call->getNumArgs() == 1 && fn_name == kTraceName) {
+ FindFieldVisitor finder;
+ finder.TraverseStmt(call->getArg(0));
+ if (finder.field())
+ FoundField(finder.field());
- return;
+ return;
+ } else if (call->getNumArgs() == 1 &&
+ fn_name == kRegisterWeakMembersName) {
+ MarkAllWeakMembersTraced();
+ }
}
}
}
@@ -445,13 +471,12 @@
return;
// Check for Super<T>::trace(visitor)
- if (call->getNumArgs() == 1 && fn_name == trace_->getName()) {
+ if (call->getNumArgs() == 1 && IsTraceCallName(fn_name)) {
RecordInfo::Bases::iterator it = info_->GetBases().begin();
for (; it != info_->GetBases().end(); ++it) {
if (it->first->getName() == tmpl->getName())
it->second.MarkTraced();
}
- return;
}
// Check for TraceIfNeeded<T>::trace(visitor, &field)
@@ -524,29 +549,54 @@
func_name = callee->getMemberName().getAsString();
}
- if (trace_->getName() == kTraceImplName) {
- if (func_name != kTraceName)
- return false;
- } else if (trace_->getName() == kTraceAfterDispatchImplName) {
- if (func_name != kTraceAfterDispatchName)
- return false;
- } else {
- // Currently, a manually dispatched class cannot have mixin bases (having
- // one would add a vtable which we explicitly check against). This means
- // that we can only make calls to a trace method of the same name. Revisit
- // this if our mixin/vtable assumption changes.
- if (func_name != trace_->getName())
- return false;
- }
-
if (!callee_record)
return false;
- RecordInfo::Bases::iterator iter = info_->GetBases().find(callee_record);
- if (iter == info_->GetBases().end())
+
+ if (!IsTraceCallName(func_name))
return false;
- iter->second.MarkTraced();
- return true;
+ for (auto& base : info_->GetBases()) {
+ // We want to deal with omitted trace() function in an intermediary
+ // class in the class hierarchy, e.g.:
+ // class A : public GarbageCollected<A> { trace() { ... } };
+ // class B : public A { /* No trace(); have nothing to trace. */ };
+ // class C : public B { trace() { B::trace(visitor); } }
+ // where, B::trace() is actually A::trace(), and in some cases we get
+ // A as |callee_record| instead of B. We somehow need to mark B as
+ // traced if we find A::trace() call.
+ //
+ // To solve this, here we keep going up the class hierarchy as long as
+ // they are not required to have a trace method. The implementation is
+ // a simple DFS, where |base_records| represents the set of base classes
+ // we need to visit.
+
+ std::vector<CXXRecordDecl*> base_records;
+ base_records.push_back(base.first);
+
+ while (!base_records.empty()) {
+ CXXRecordDecl* base_record = base_records.back();
+ base_records.pop_back();
+
+ if (base_record == callee_record) {
+ // If we find a matching trace method, pretend the user has written
+ // a correct trace() method of the base; in the example above, we
+ // find A::trace() here and mark B as correctly traced.
+ base.second.MarkTraced();
+ return true;
+ }
+
+ if (RecordInfo* base_info = cache_->Lookup(base_record)) {
+ if (!base_info->RequiresTraceMethod()) {
+ // If this base class is not required to have a trace method, then
+ // the actual trace method may be defined in an ancestor.
+ for (auto& inner_base : base_info->GetBases())
+ base_records.push_back(inner_base.first);
+ }
+ }
+ }
+ }
+
+ return false;
}
bool CheckTraceFieldCall(CXXMemberCallExpr* call) {
@@ -609,7 +659,8 @@
};
// Nested checking for weak callbacks.
- CheckTraceVisitor(RecordInfo* info) : trace_(0), info_(info) {}
+ CheckTraceVisitor(RecordInfo* info)
+ : trace_(nullptr), info_(info), cache_(nullptr) {}
bool IsWeakCallback() { return !trace_; }
@@ -641,8 +692,19 @@
}
}
+ void MarkAllWeakMembersTraced() {
+ // If we find a call to registerWeakMembers which is unresolved we
+ // unsoundly consider all weak members as traced.
+ // TODO: Find out how to validate weak member tracing for unresolved call.
+ for (auto& field : info_->GetFields()) {
+ if (field.second.edge()->IsWeakMember())
+ field.second.MarkTraced();
+ }
+ }
+
CXXMethodDecl* trace_;
RecordInfo* info_;
+ RecordCache* cache_;
bool delegates_to_traceimpl_;
};
@@ -1069,7 +1131,8 @@
CheckLeftMostDerived(info);
CheckDispatch(info);
if (CXXMethodDecl* newop = info->DeclaresNewOperator())
- ReportClassOverridesNew(info, newop);
+ if (!Config::IsIgnoreAnnotated(newop))
+ ReportClassOverridesNew(info, newop);
if (info->IsGCMixinInstance()) {
// Require that declared GCMixin implementations
// also provide a trace() override.
@@ -1365,7 +1428,8 @@
// Determine what type of tracing method this is (dispatch or trace).
void CheckTraceOrDispatchMethod(RecordInfo* parent, CXXMethodDecl* method) {
Config::TraceMethodType trace_type = Config::GetTraceMethodType(method);
- if (trace_type != Config::TRACE_METHOD ||
+ if (trace_type == Config::TRACE_AFTER_DISPATCH_METHOD ||
+ trace_type == Config::TRACE_AFTER_DISPATCH_IMPL_METHOD ||
!parent->GetTraceDispatchMethod()) {
CheckTraceMethod(parent, method, trace_type);
}
@@ -1387,7 +1451,7 @@
}
}
- CheckTraceVisitor visitor(trace, parent);
+ CheckTraceVisitor visitor(trace, parent, &cache_);
visitor.TraverseCXXMethodDecl(trace);
// Skip reporting if this trace method is a just delegate to
diff --git a/tools/clang/blink_gc_plugin/CMakeLists.txt b/tools/clang/blink_gc_plugin/CMakeLists.txt
index c511edf..7f1dee3 100644
--- a/tools/clang/blink_gc_plugin/CMakeLists.txt
+++ b/tools/clang/blink_gc_plugin/CMakeLists.txt
@@ -1,6 +1,6 @@
# This line is read by update.sh and other scripts in tools/clang/scripts
# Note: The spaces are significant.
-set(LIBRARYNAME BlinkGCPlugin_14)
+set(LIBRARYNAME BlinkGCPlugin)
add_llvm_loadable_module("lib${LIBRARYNAME}"
BlinkGCPlugin.cpp
diff --git a/tools/clang/blink_gc_plugin/Config.h b/tools/clang/blink_gc_plugin/Config.h
index c2d39b7..02cbee9 100644
--- a/tools/clang/blink_gc_plugin/Config.h
+++ b/tools/clang/blink_gc_plugin/Config.h
@@ -236,7 +236,7 @@
if (name == kTraceAfterDispatchName)
return TRACE_AFTER_DISPATCH_METHOD;
if (name == kTraceImplName)
- return TRACE_AFTER_DISPATCH_METHOD;
+ return TRACE_IMPL_METHOD;
if (name == kTraceAfterDispatchImplName)
return TRACE_AFTER_DISPATCH_IMPL_METHOD;
diff --git a/tools/clang/blink_gc_plugin/Edge.h b/tools/clang/blink_gc_plugin/Edge.h
index d0b78b5..7659968 100644
--- a/tools/clang/blink_gc_plugin/Edge.h
+++ b/tools/clang/blink_gc_plugin/Edge.h
@@ -24,6 +24,7 @@
// Bare-bones visitor.
class EdgeVisitor {
public:
+ virtual ~EdgeVisitor() {}
virtual void VisitValue(Value*) {}
virtual void VisitRawPtr(RawPtr*) {}
virtual void VisitRefPtr(RefPtr*) {}
diff --git a/tools/clang/blink_gc_plugin/RecordInfo.cpp b/tools/clang/blink_gc_plugin/RecordInfo.cpp
index 0257415..bda33fa 100644
--- a/tools/clang/blink_gc_plugin/RecordInfo.cpp
+++ b/tools/clang/blink_gc_plugin/RecordInfo.cpp
@@ -427,39 +427,50 @@
if (Config::IsGCBase(name_))
return;
CXXMethodDecl* trace = nullptr;
+ CXXMethodDecl* trace_impl = nullptr;
CXXMethodDecl* trace_after_dispatch = nullptr;
bool has_adjust_and_mark = false;
bool has_is_heap_object_alive = false;
- for (CXXRecordDecl::method_iterator it = record_->method_begin();
- it != record_->method_end();
- ++it) {
- switch (Config::GetTraceMethodType(*it)) {
+ for (Decl* decl : record_->decls()) {
+ CXXMethodDecl* method = dyn_cast<CXXMethodDecl>(decl);
+ if (!method) {
+ if (FunctionTemplateDecl* func_template =
+ dyn_cast<FunctionTemplateDecl>(decl))
+ method = dyn_cast<CXXMethodDecl>(func_template->getTemplatedDecl());
+ }
+ if (!method)
+ continue;
+
+ switch (Config::GetTraceMethodType(method)) {
case Config::TRACE_METHOD:
- trace = *it;
+ trace = method;
break;
case Config::TRACE_AFTER_DISPATCH_METHOD:
- trace_after_dispatch = *it;
+ trace_after_dispatch = method;
break;
case Config::TRACE_IMPL_METHOD:
+ trace_impl = method;
+ break;
case Config::TRACE_AFTER_DISPATCH_IMPL_METHOD:
break;
case Config::NOT_TRACE_METHOD:
- if (it->getNameAsString() == kFinalizeName) {
- finalize_dispatch_method_ = *it;
- } else if (it->getNameAsString() == kAdjustAndMarkName) {
+ if (method->getNameAsString() == kFinalizeName) {
+ finalize_dispatch_method_ = method;
+ } else if (method->getNameAsString() == kAdjustAndMarkName) {
has_adjust_and_mark = true;
- } else if (it->getNameAsString() == kIsHeapObjectAliveName) {
+ } else if (method->getNameAsString() == kIsHeapObjectAliveName) {
has_is_heap_object_alive = true;
}
break;
}
}
+
// Record if class defines the two GCMixin methods.
has_gc_mixin_methods_ =
has_adjust_and_mark && has_is_heap_object_alive ? kTrue : kFalse;
if (trace_after_dispatch) {
trace_method_ = trace_after_dispatch;
- trace_dispatch_method_ = trace;
+ trace_dispatch_method_ = trace_impl ? trace_impl : trace;
} else {
// TODO: Can we never have a dispatch method called trace without the same
// class defining a traceAfterDispatch method?
diff --git a/tools/clang/blink_gc_plugin/RecordInfo.h b/tools/clang/blink_gc_plugin/RecordInfo.h
index 82fb604..da2f415 100644
--- a/tools/clang/blink_gc_plugin/RecordInfo.h
+++ b/tools/clang/blink_gc_plugin/RecordInfo.h
@@ -23,6 +23,7 @@
class GraphPoint {
public:
GraphPoint() : traced_(false) {}
+ virtual ~GraphPoint() {}
void MarkTraced() { traced_ = true; }
bool IsProperlyTraced() { return traced_ || !NeedsTracing().IsNeeded(); }
virtual const TracingStatus NeedsTracing() = 0;
diff --git a/tools/clang/blink_gc_plugin/tests/heap/stubs.h b/tools/clang/blink_gc_plugin/tests/heap/stubs.h
index 3220178..e8ff1b3 100644
--- a/tools/clang/blink_gc_plugin/tests/heap/stubs.h
+++ b/tools/clang/blink_gc_plugin/tests/heap/stubs.h
@@ -220,7 +220,10 @@
class InlinedGlobalMarkingVisitor
: public VisitorHelper<InlinedGlobalMarkingVisitor> {
public:
- InlinedGlobalMarkingVisitor* operator->() { return this; }
+ InlinedGlobalMarkingVisitor* operator->() { return this; }
+
+ template<typename T, void (T::*method)(Visitor*)>
+ void registerWeakMembers(const T* obj);
};
class GarbageCollectedMixin {
diff --git a/tools/clang/blink_gc_plugin/tests/register_weak_members_template.cpp b/tools/clang/blink_gc_plugin/tests/register_weak_members_template.cpp
new file mode 100644
index 0000000..6742c22
--- /dev/null
+++ b/tools/clang/blink_gc_plugin/tests/register_weak_members_template.cpp
@@ -0,0 +1,7 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "register_weak_members_template.h"
+
+// Nothing to define here.
diff --git a/tools/clang/blink_gc_plugin/tests/register_weak_members_template.h b/tools/clang/blink_gc_plugin/tests/register_weak_members_template.h
new file mode 100644
index 0000000..7d3905a
--- /dev/null
+++ b/tools/clang/blink_gc_plugin/tests/register_weak_members_template.h
@@ -0,0 +1,43 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef REGISTER_WEAK_MEMBERS_TEMPLATE_H_
+#define REGISTER_WEAK_MEMBERS_TEMPLATE_H_
+
+#include "heap/stubs.h"
+
+namespace blink {
+
+class X : public GarbageCollected<X> {
+ public:
+ void trace(Visitor* visitor) { traceImpl(visitor); }
+ void trace(InlinedGlobalMarkingVisitor visitor) { traceImpl(visitor); }
+
+ private:
+ template <typename VisitorDispatcher>
+ void traceImpl(VisitorDispatcher visitor) {}
+};
+
+class HasUntracedWeakMembers : public GarbageCollected<HasUntracedWeakMembers> {
+ public:
+ void trace(Visitor* visitor) { traceImpl(visitor); }
+ void trace(InlinedGlobalMarkingVisitor visitor) { traceImpl(visitor); }
+
+ // Don't have to be defined for the purpose of this test.
+ void clearWeakMembers(Visitor* visitor);
+
+ private:
+ template <typename VisitorDispatcher>
+ void traceImpl(VisitorDispatcher visitor) {
+ visitor->template registerWeakMembers<
+ HasUntracedWeakMembers,
+ &HasUntracedWeakMembers::clearWeakMembers>(this);
+ }
+
+ WeakMember<X> x_;
+};
+
+}
+
+#endif // REGISTER_WEAK_MEMBERS_TEMPLATE_H_
diff --git a/tools/clang/blink_gc_plugin/tests/register_weak_members_template.txt b/tools/clang/blink_gc_plugin/tests/register_weak_members_template.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/tools/clang/blink_gc_plugin/tests/register_weak_members_template.txt
@@ -0,0 +1 @@
+
diff --git a/tools/clang/blink_gc_plugin/tests/test.sh b/tools/clang/blink_gc_plugin/tests/test.sh
index 02c7477..95bb261 100755
--- a/tools/clang/blink_gc_plugin/tests/test.sh
+++ b/tools/clang/blink_gc_plugin/tests/test.sh
@@ -29,6 +29,7 @@
flags="$(cat "${3}")"
fi
local output="$("${CLANG_PATH}" -c -Wno-c++11-extensions \
+ -Wno-inaccessible-base \
-Xclang -load -Xclang "${PLUGIN_PATH}" \
-Xclang -add-plugin -Xclang blink-gc-plugin ${flags} ${1} 2>&1)"
local json="${input%cpp}graph.json"
diff --git a/tools/clang/blink_gc_plugin/tests/trace_after_dispatch_impl.cpp b/tools/clang/blink_gc_plugin/tests/trace_after_dispatch_impl.cpp
index 706624d..53a6855 100644
--- a/tools/clang/blink_gc_plugin/tests/trace_after_dispatch_impl.cpp
+++ b/tools/clang/blink_gc_plugin/tests/trace_after_dispatch_impl.cpp
@@ -6,9 +6,11 @@
namespace blink {
-void TraceAfterDispatchInlinedBase::trace(Visitor* visitor) {
- // Implement a simple form of manual dispatching, because BlinkGCPlugin gets
- // angry if dispatching statements are missing.
+template <typename VisitorDispatcher>
+inline void TraceAfterDispatchInlinedBase::traceImpl(
+ VisitorDispatcher visitor) {
+ // Implement a simple form of manual dispatching, because BlinkGCPlugin
+ // checks if the tracing is dispatched to all derived classes.
//
// This function has to be implemented out-of-line, since we need to know the
// definition of derived classes here.
@@ -21,6 +23,15 @@
}
void TraceAfterDispatchExternBase::trace(Visitor* visitor) {
+ traceImpl(visitor);
+}
+
+void TraceAfterDispatchExternBase::trace(InlinedGlobalMarkingVisitor visitor) {
+ traceImpl(visitor);
+}
+
+template <typename VisitorDispatcher>
+inline void TraceAfterDispatchExternBase::traceImpl(VisitorDispatcher visitor) {
if (tag_ == DERIVED) {
static_cast<TraceAfterDispatchExternDerived*>(this)->traceAfterDispatch(
visitor);
@@ -33,6 +44,11 @@
traceAfterDispatchImpl(visitor);
}
+void TraceAfterDispatchExternBase::traceAfterDispatch(
+ InlinedGlobalMarkingVisitor visitor) {
+ traceAfterDispatchImpl(visitor);
+}
+
template <typename VisitorDispatcher>
inline void TraceAfterDispatchExternBase::traceAfterDispatchImpl(
VisitorDispatcher visitor) {
@@ -43,6 +59,11 @@
traceAfterDispatchImpl(visitor);
}
+void TraceAfterDispatchExternDerived::traceAfterDispatch(
+ InlinedGlobalMarkingVisitor visitor) {
+ traceAfterDispatchImpl(visitor);
+}
+
template <typename VisitorDispatcher>
inline void TraceAfterDispatchExternDerived::traceAfterDispatchImpl(
VisitorDispatcher visitor) {
diff --git a/tools/clang/blink_gc_plugin/tests/trace_after_dispatch_impl.h b/tools/clang/blink_gc_plugin/tests/trace_after_dispatch_impl.h
index e55c06e..fe25279 100644
--- a/tools/clang/blink_gc_plugin/tests/trace_after_dispatch_impl.h
+++ b/tools/clang/blink_gc_plugin/tests/trace_after_dispatch_impl.h
@@ -23,12 +23,19 @@
public:
explicit TraceAfterDispatchInlinedBase(ClassTag tag) : tag_(tag) {}
- void trace(Visitor* visitor);
+ void trace(Visitor* visitor) { traceImpl(visitor); }
+ void trace(InlinedGlobalMarkingVisitor visitor) { traceImpl(visitor); }
void traceAfterDispatch(Visitor* visitor) { traceAfterDispatchImpl(visitor); }
+ void traceAfterDispatch(InlinedGlobalMarkingVisitor visitor) {
+ traceAfterDispatchImpl(visitor);
+ }
private:
template <typename VisitorDispatcher>
+ void traceImpl(VisitorDispatcher visitor);
+
+ template <typename VisitorDispatcher>
void traceAfterDispatchImpl(VisitorDispatcher visitor) {
visitor->trace(x_base_);
}
@@ -42,6 +49,9 @@
TraceAfterDispatchInlinedDerived() : TraceAfterDispatchInlinedBase(DERIVED) {}
void traceAfterDispatch(Visitor* visitor) { traceAfterDispatchImpl(visitor); }
+ void traceAfterDispatch(InlinedGlobalMarkingVisitor visitor) {
+ traceAfterDispatchImpl(visitor);
+ }
private:
template <typename VisitorDispatcher>
@@ -59,11 +69,16 @@
explicit TraceAfterDispatchExternBase(ClassTag tag) : tag_(tag) {}
void trace(Visitor* visitor);
+ void trace(InlinedGlobalMarkingVisitor visitor);
void traceAfterDispatch(Visitor* visitor);
+ void traceAfterDispatch(InlinedGlobalMarkingVisitor visitor);
private:
template <typename VisitorDispatcher>
+ void traceImpl(VisitorDispatcher visitor);
+
+ template <typename VisitorDispatcher>
void traceAfterDispatchImpl(VisitorDispatcher visitor);
ClassTag tag_;
@@ -75,6 +90,7 @@
TraceAfterDispatchExternDerived() : TraceAfterDispatchExternBase(DERIVED) {}
void traceAfterDispatch(Visitor* visitor);
+ void traceAfterDispatch(InlinedGlobalMarkingVisitor visitor);
private:
template <typename VisitorDispatcher>
diff --git a/tools/clang/blink_gc_plugin/tests/trace_after_dispatch_impl_error.cpp b/tools/clang/blink_gc_plugin/tests/trace_after_dispatch_impl_error.cpp
index 1ea1936..23798f7 100644
--- a/tools/clang/blink_gc_plugin/tests/trace_after_dispatch_impl_error.cpp
+++ b/tools/clang/blink_gc_plugin/tests/trace_after_dispatch_impl_error.cpp
@@ -6,24 +6,37 @@
namespace blink {
-void TraceAfterDispatchInlinedBase::trace(Visitor* visitor) {
- // Implement a simple form of manual dispatching, because BlinkGCPlugin gets
- // angry if dispatching statements are missing.
+template <typename VisitorDispatcher>
+inline void TraceAfterDispatchInlinedBase::traceImpl(
+ VisitorDispatcher visitor) {
+ // Implement a simple form of manual dispatching, because BlinkGCPlugin
+ // checks if the tracing is dispatched to all derived classes.
//
// This function has to be implemented out-of-line, since we need to know the
// definition of derived classes here.
if (tag_ == DERIVED) {
- static_cast<TraceAfterDispatchInlinedDerived*>(this)->traceAfterDispatch(
- visitor);
+ // Missing dispatch call:
+ // static_cast<TraceAfterDispatchInlinedDerived*>(this)->traceAfterDispatch(
+ // visitor);
} else {
traceAfterDispatch(visitor);
}
}
void TraceAfterDispatchExternBase::trace(Visitor* visitor) {
+ traceImpl(visitor);
+}
+
+void TraceAfterDispatchExternBase::trace(InlinedGlobalMarkingVisitor visitor) {
+ traceImpl(visitor);
+}
+
+template <typename VisitorDispatcher>
+inline void TraceAfterDispatchExternBase::traceImpl(VisitorDispatcher visitor) {
if (tag_ == DERIVED) {
- static_cast<TraceAfterDispatchExternDerived*>(this)->traceAfterDispatch(
- visitor);
+ // Missing dispatch call:
+ // static_cast<TraceAfterDispatchExternDerived*>(this)->traceAfterDispatch(
+ // visitor);
} else {
traceAfterDispatch(visitor);
}
@@ -33,6 +46,11 @@
traceAfterDispatchImpl(visitor);
}
+void TraceAfterDispatchExternBase::traceAfterDispatch(
+ InlinedGlobalMarkingVisitor visitor) {
+ traceAfterDispatchImpl(visitor);
+}
+
template <typename VisitorDispatcher>
inline void TraceAfterDispatchExternBase::traceAfterDispatchImpl(
VisitorDispatcher visitor) {
@@ -43,6 +61,11 @@
traceAfterDispatchImpl(visitor);
}
+void TraceAfterDispatchExternDerived::traceAfterDispatch(
+ InlinedGlobalMarkingVisitor visitor) {
+ traceAfterDispatchImpl(visitor);
+}
+
template <typename VisitorDispatcher>
inline void TraceAfterDispatchExternDerived::traceAfterDispatchImpl(
VisitorDispatcher visitor) {
diff --git a/tools/clang/blink_gc_plugin/tests/trace_after_dispatch_impl_error.h b/tools/clang/blink_gc_plugin/tests/trace_after_dispatch_impl_error.h
index 441ef32..b480e39 100644
--- a/tools/clang/blink_gc_plugin/tests/trace_after_dispatch_impl_error.h
+++ b/tools/clang/blink_gc_plugin/tests/trace_after_dispatch_impl_error.h
@@ -23,12 +23,19 @@
public:
explicit TraceAfterDispatchInlinedBase(ClassTag tag) : tag_(tag) {}
- void trace(Visitor* visitor);
+ void trace(Visitor* visitor) { traceImpl(visitor); }
+ void trace(InlinedGlobalMarkingVisitor visitor) { traceImpl(visitor); }
void traceAfterDispatch(Visitor* visitor) { traceAfterDispatchImpl(visitor); }
+ void traceAfterDispatch(InlinedGlobalMarkingVisitor visitor) {
+ traceAfterDispatchImpl(visitor);
+ }
private:
template <typename VisitorDispatcher>
+ void traceImpl(VisitorDispatcher visitor);
+
+ template <typename VisitorDispatcher>
void traceAfterDispatchImpl(VisitorDispatcher visitor) {
// No trace call; should get a warning.
}
@@ -42,6 +49,9 @@
TraceAfterDispatchInlinedDerived() : TraceAfterDispatchInlinedBase(DERIVED) {}
void traceAfterDispatch(Visitor* visitor) { traceAfterDispatchImpl(visitor); }
+ void traceAfterDispatch(InlinedGlobalMarkingVisitor visitor) {
+ traceAfterDispatchImpl(visitor);
+ }
private:
template <typename VisitorDispatcher>
@@ -58,11 +68,16 @@
explicit TraceAfterDispatchExternBase(ClassTag tag) : tag_(tag) {}
void trace(Visitor* visitor);
+ void trace(InlinedGlobalMarkingVisitor visitor);
void traceAfterDispatch(Visitor* visitor);
+ void traceAfterDispatch(InlinedGlobalMarkingVisitor visitor);
private:
template <typename VisitorDispatcher>
+ void traceImpl(VisitorDispatcher visitor);
+
+ template <typename VisitorDispatcher>
void traceAfterDispatchImpl(VisitorDispatcher visitor);
ClassTag tag_;
@@ -74,6 +89,7 @@
TraceAfterDispatchExternDerived() : TraceAfterDispatchExternBase(DERIVED) {}
void traceAfterDispatch(Visitor* visitor);
+ void traceAfterDispatch(InlinedGlobalMarkingVisitor visitor);
private:
template <typename VisitorDispatcher>
diff --git a/tools/clang/blink_gc_plugin/tests/trace_after_dispatch_impl_error.txt b/tools/clang/blink_gc_plugin/tests/trace_after_dispatch_impl_error.txt
index 68b5a72..058fccb 100644
--- a/tools/clang/blink_gc_plugin/tests/trace_after_dispatch_impl_error.txt
+++ b/tools/clang/blink_gc_plugin/tests/trace_after_dispatch_impl_error.txt
@@ -1,28 +1,34 @@
+trace_after_dispatch_impl_error.cpp:10:1: warning: [blink-gc] Missing dispatch to class 'TraceAfterDispatchInlinedDerived' in manual trace dispatch.
+inline void TraceAfterDispatchInlinedBase::traceImpl(
+^
+trace_after_dispatch_impl_error.cpp:35:1: warning: [blink-gc] Missing dispatch to class 'TraceAfterDispatchExternDerived' in manual trace dispatch.
+inline void TraceAfterDispatchExternBase::traceImpl(VisitorDispatcher visitor) {
+^
In file included from trace_after_dispatch_impl_error.cpp:5:
-./trace_after_dispatch_impl_error.h:32:3: warning: [blink-gc] Class 'TraceAfterDispatchInlinedBase' has untraced fields that require tracing.
+./trace_after_dispatch_impl_error.h:39:3: warning: [blink-gc] Class 'TraceAfterDispatchInlinedBase' has untraced fields that require tracing.
void traceAfterDispatchImpl(VisitorDispatcher visitor) {
^
-./trace_after_dispatch_impl_error.h:37:3: note: [blink-gc] Untraced field 'x_base_' declared here:
+./trace_after_dispatch_impl_error.h:44:3: note: [blink-gc] Untraced field 'x_base_' declared here:
Member<X> x_base_;
^
-./trace_after_dispatch_impl_error.h:48:3: warning: [blink-gc] Base class 'TraceAfterDispatchInlinedBase' of derived class 'TraceAfterDispatchInlinedDerived' requires tracing.
+./trace_after_dispatch_impl_error.h:58:3: warning: [blink-gc] Base class 'TraceAfterDispatchInlinedBase' of derived class 'TraceAfterDispatchInlinedDerived' requires tracing.
void traceAfterDispatchImpl(VisitorDispatcher visitor) {
^
-./trace_after_dispatch_impl_error.h:48:3: warning: [blink-gc] Class 'TraceAfterDispatchInlinedDerived' has untraced fields that require tracing.
-./trace_after_dispatch_impl_error.h:52:3: note: [blink-gc] Untraced field 'x_derived_' declared here:
+./trace_after_dispatch_impl_error.h:58:3: warning: [blink-gc] Class 'TraceAfterDispatchInlinedDerived' has untraced fields that require tracing.
+./trace_after_dispatch_impl_error.h:62:3: note: [blink-gc] Untraced field 'x_derived_' declared here:
Member<X> x_derived_;
^
-trace_after_dispatch_impl_error.cpp:37:1: warning: [blink-gc] Class 'TraceAfterDispatchExternBase' has untraced fields that require tracing.
+trace_after_dispatch_impl_error.cpp:55:1: warning: [blink-gc] Class 'TraceAfterDispatchExternBase' has untraced fields that require tracing.
inline void TraceAfterDispatchExternBase::traceAfterDispatchImpl(
^
-./trace_after_dispatch_impl_error.h:69:3: note: [blink-gc] Untraced field 'x_base_' declared here:
+./trace_after_dispatch_impl_error.h:84:3: note: [blink-gc] Untraced field 'x_base_' declared here:
Member<X> x_base_;
^
-trace_after_dispatch_impl_error.cpp:47:1: warning: [blink-gc] Base class 'TraceAfterDispatchExternBase' of derived class 'TraceAfterDispatchExternDerived' requires tracing.
+trace_after_dispatch_impl_error.cpp:70:1: warning: [blink-gc] Base class 'TraceAfterDispatchExternBase' of derived class 'TraceAfterDispatchExternDerived' requires tracing.
inline void TraceAfterDispatchExternDerived::traceAfterDispatchImpl(
^
-trace_after_dispatch_impl_error.cpp:47:1: warning: [blink-gc] Class 'TraceAfterDispatchExternDerived' has untraced fields that require tracing.
-./trace_after_dispatch_impl_error.h:82:3: note: [blink-gc] Untraced field 'x_derived_' declared here:
+trace_after_dispatch_impl_error.cpp:70:1: warning: [blink-gc] Class 'TraceAfterDispatchExternDerived' has untraced fields that require tracing.
+./trace_after_dispatch_impl_error.h:98:3: note: [blink-gc] Untraced field 'x_derived_' declared here:
Member<X> x_derived_;
^
-6 warnings generated.
+8 warnings generated.
diff --git a/tools/clang/blink_gc_plugin/tests/traceimpl_dependent_scope.cpp b/tools/clang/blink_gc_plugin/tests/traceimpl_dependent_scope.cpp
new file mode 100644
index 0000000..11b576c
--- /dev/null
+++ b/tools/clang/blink_gc_plugin/tests/traceimpl_dependent_scope.cpp
@@ -0,0 +1,13 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "traceimpl_dependent_scope.h"
+
+namespace blink {
+
+// Template instantiation.
+template class Derived<int>;
+template class DerivedMissingTrace<int>;
+
+}
diff --git a/tools/clang/blink_gc_plugin/tests/traceimpl_dependent_scope.h b/tools/clang/blink_gc_plugin/tests/traceimpl_dependent_scope.h
new file mode 100644
index 0000000..0d079f6
--- /dev/null
+++ b/tools/clang/blink_gc_plugin/tests/traceimpl_dependent_scope.h
@@ -0,0 +1,62 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef TRACEIMPL_DEPENDENT_SCOPE_H_
+#define TRACEIMPL_DEPENDENT_SCOPE_H_
+
+#include "heap/stubs.h"
+
+namespace blink {
+
+class X : public GarbageCollected<X> {
+ public:
+ virtual void trace(Visitor*) {}
+};
+
+template <typename T>
+class Base : public GarbageCollected<Base<T> > {
+ public:
+ virtual void trace(Visitor* visitor) { traceImpl(visitor); }
+ virtual void trace(InlinedGlobalMarkingVisitor visitor) {
+ traceImpl(visitor);
+ }
+
+ private:
+ template <typename VisitorDispatcher>
+ void traceImpl(VisitorDispatcher visitor) {}
+};
+
+template <typename T>
+class Derived : public Base<T> {
+ public:
+ void trace(Visitor* visitor) override { traceImpl(visitor); }
+ void trace(InlinedGlobalMarkingVisitor visitor) override {
+ traceImpl(visitor);
+ }
+
+ private:
+ template <typename VisitorDispatcher>
+ void traceImpl(VisitorDispatcher visitor) {
+ Base<T>::trace(visitor);
+ }
+};
+
+template <typename T>
+class DerivedMissingTrace : public Base<T> {
+ public:
+ void trace(Visitor* visitor) override { traceImpl(visitor); }
+ void trace(InlinedGlobalMarkingVisitor visitor) override {
+ traceImpl(visitor);
+ }
+
+ private:
+ template <typename VisitorDispatcher>
+ void traceImpl(VisitorDispatcher visitor) {
+ // Missing Base<T>::trace(visitor).
+ }
+};
+
+}
+
+#endif // TRACEIMPL_DEPENDENT_SCOPE_H_
diff --git a/tools/clang/blink_gc_plugin/tests/traceimpl_dependent_scope.txt b/tools/clang/blink_gc_plugin/tests/traceimpl_dependent_scope.txt
new file mode 100644
index 0000000..e1aab33
--- /dev/null
+++ b/tools/clang/blink_gc_plugin/tests/traceimpl_dependent_scope.txt
@@ -0,0 +1,5 @@
+In file included from traceimpl_dependent_scope.cpp:5:
+./traceimpl_dependent_scope.h:55:3: warning: [blink-gc] Base class 'Base<int>' of derived class 'DerivedMissingTrace<int>' requires tracing.
+ void traceImpl(VisitorDispatcher visitor) {
+ ^
+1 warning generated.
diff --git a/tools/clang/blink_gc_plugin/tests/traceimpl_omitted_trace.cpp b/tools/clang/blink_gc_plugin/tests/traceimpl_omitted_trace.cpp
new file mode 100644
index 0000000..b6dc2df
--- /dev/null
+++ b/tools/clang/blink_gc_plugin/tests/traceimpl_omitted_trace.cpp
@@ -0,0 +1,7 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "traceimpl_omitted_trace.h"
+
+// Nothing to define here.
diff --git a/tools/clang/blink_gc_plugin/tests/traceimpl_omitted_trace.h b/tools/clang/blink_gc_plugin/tests/traceimpl_omitted_trace.h
new file mode 100644
index 0000000..3c5e955
--- /dev/null
+++ b/tools/clang/blink_gc_plugin/tests/traceimpl_omitted_trace.h
@@ -0,0 +1,47 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef TRACEIMPL_OMITTED_TRACE_H_
+#define TRACEIMPL_OMITTED_TRACE_H_
+
+#include "heap/stubs.h"
+
+namespace blink {
+
+class A : public GarbageCollected<A> {
+ public:
+ virtual void trace(Visitor* visitor) { traceImpl(visitor); }
+ virtual void trace(InlinedGlobalMarkingVisitor visitor) {
+ traceImpl(visitor);
+ }
+
+ private:
+ template <typename VisitorDispatcher>
+ void traceImpl(VisitorDispatcher visitor) {}
+};
+
+class B : public A {
+ // trace() isn't necessary because we've got nothing to trace here.
+};
+
+class C : public B {
+ public:
+ void trace(Visitor* visitor) override { traceImpl(visitor); }
+ void trace(InlinedGlobalMarkingVisitor visitor) override {
+ traceImpl(visitor);
+ }
+
+ private:
+ template <typename VisitorDispatcher>
+ void traceImpl(VisitorDispatcher visitor) {
+ // B::trace() is actually A::trace(), and in certain cases we only get
+ // limited information like "there is a function call that will be resolved
+ // to A::trace()". We still want to mark B as traced.
+ B::trace(visitor);
+ }
+};
+
+}
+
+#endif // TRACEIMPL_OMITTED_TRACE_H_
diff --git a/tools/clang/blink_gc_plugin/tests/traceimpl_omitted_trace.txt b/tools/clang/blink_gc_plugin/tests/traceimpl_omitted_trace.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/tools/clang/blink_gc_plugin/tests/traceimpl_omitted_trace.txt
@@ -0,0 +1 @@
+
diff --git a/tools/clang/plugins/ChromeClassTester.cpp b/tools/clang/plugins/ChromeClassTester.cpp
index 9cbc84a..48d6a73 100644
--- a/tools/clang/plugins/ChromeClassTester.cpp
+++ b/tools/clang/plugins/ChromeClassTester.cpp
@@ -149,7 +149,10 @@
banned_directories_.push_back("/courgette/");
banned_directories_.push_back("/pdf/");
banned_directories_.push_back("/ppapi/");
- banned_directories_.push_back("/usr/");
+ banned_directories_.push_back("/usr/include/");
+ banned_directories_.push_back("/usr/lib/");
+ banned_directories_.push_back("/usr/local/include/");
+ banned_directories_.push_back("/usr/local/lib/");
banned_directories_.push_back("/testing/");
banned_directories_.push_back("/v8/");
banned_directories_.push_back("/dart/");
@@ -263,11 +266,6 @@
filename = resolvedPath;
}
- // On linux, chrome is often checked out to /usr/local/google. Due to the
- // "usr" rule in banned_directories_, all diagnostics would be suppressed
- // in that case. As a workaround, strip that prefix.
- filename = lstrip(filename, "/usr/local/google");
-
for (size_t i = 0; i < banned_directories_.size(); ++i) {
// If any of the banned directories occur as a component in filename,
// this file is rejected.
diff --git a/tools/clang/scripts/blink_gc_plugin_flags.sh b/tools/clang/scripts/blink_gc_plugin_flags.sh
index 3654808..38ea72d 100755
--- a/tools/clang/scripts/blink_gc_plugin_flags.sh
+++ b/tools/clang/scripts/blink_gc_plugin_flags.sh
@@ -13,9 +13,6 @@
else
LIBSUFFIX=so
fi
-LIBNAME=\
-$(grep 'set(LIBRARYNAME' "$SRC_DIR"/tools/clang/blink_gc_plugin/CMakeLists.txt \
- | cut -d ' ' -f 2 | tr -d ')')
FLAGS=""
PREFIX="-Xclang -plugin-arg-blink-gc-plugin -Xclang"
@@ -31,5 +28,5 @@
fi
done
-echo -Xclang -load -Xclang $CLANG_LIB_PATH/lib$LIBNAME.$LIBSUFFIX \
+echo -Xclang -load -Xclang $CLANG_LIB_PATH/libBlinkGCPlugin.$LIBSUFFIX \
-Xclang -add-plugin -Xclang blink-gc-plugin $FLAGS
diff --git a/tools/clang/scripts/package.sh b/tools/clang/scripts/package.sh
index e0c0fcc..25cd6f0 100755
--- a/tools/clang/scripts/package.sh
+++ b/tools/clang/scripts/package.sh
@@ -52,6 +52,7 @@
LLVM_BUILD_DIR="${THIS_DIR}/../../../third_party/llvm-build"
LLVM_BIN_DIR="${LLVM_BUILD_DIR}/Release+Asserts/bin"
LLVM_LIB_DIR="${LLVM_BUILD_DIR}/Release+Asserts/lib"
+STAMP_FILE="${LLVM_DIR}/../llvm-build/cr_build_revision"
echo "Diff in llvm:" | tee buildlog.txt
svn stat "${LLVM_DIR}" 2>&1 | tee -a buildlog.txt
@@ -86,8 +87,7 @@
"${THIS_DIR}"/update.sh --bootstrap --force-local-build --run-tests \
${extra_flags} 2>&1 | tee -a buildlog.txt
-R=$("${LLVM_BIN_DIR}/clang" --version | \
- sed -ne 's/clang version .*(trunk \([0-9]*\))/\1/p')
+R=$(cat "${STAMP_FILE}")
PDIR=clang-$R
rm -rf $PDIR
@@ -95,6 +95,11 @@
mkdir $PDIR/bin
mkdir $PDIR/lib
+GOLDDIR=llvmgold-$R
+if [ "$(uname -s)" = "Linux" ]; then
+ mkdir -p $GOLDDIR/lib
+fi
+
if [ "$(uname -s)" = "Darwin" ]; then
SO_EXT="dylib"
else
@@ -122,11 +127,12 @@
# Copy plugins. Some of the dylibs are pretty big, so copy only the ones we
# care about.
cp "${LLVM_LIB_DIR}/libFindBadConstructs.${SO_EXT}" $PDIR/lib
+cp "${LLVM_LIB_DIR}/libBlinkGCPlugin.${SO_EXT}" $PDIR/lib
-BLINKGCPLUGIN_LIBNAME=\
-$(grep 'set(LIBRARYNAME' "$THIS_DIR"/../blink_gc_plugin/CMakeLists.txt \
- | cut -d ' ' -f 2 | tr -d ')')
-cp "${LLVM_LIB_DIR}/lib${BLINKGCPLUGIN_LIBNAME}.${SO_EXT}" $PDIR/lib
+# Copy gold plugin on Linux.
+if [ "$(uname -s)" = "Linux" ]; then
+ cp "${LLVM_LIB_DIR}/LLVMgold.${SO_EXT}" $GOLDDIR/lib
+fi
if [[ -n "${gcc_toolchain}" ]]; then
# Copy the stdlibc++.so.6 we linked Clang against so it can run.
@@ -173,6 +179,10 @@
tar zcf $PDIR.tgz -C $PDIR bin lib buildlog.txt
fi
+if [ "$(uname -s)" = "Linux" ]; then
+ tar zcf $GOLDDIR.tgz -C $GOLDDIR lib
+fi
+
if [ "$(uname -s)" = "Darwin" ]; then
PLATFORM=Mac
else
@@ -182,3 +192,9 @@
echo To upload, run:
echo gsutil cp -a public-read $PDIR.tgz \
gs://chromium-browser-clang/$PLATFORM/$PDIR.tgz
+if [ "$(uname -s)" = "Linux" ]; then
+ echo gsutil cp -a public-read $GOLDDIR.tgz \
+ gs://chromium-browser-clang/$PLATFORM/$GOLDDIR.tgz
+fi
+
+# FIXME: Warn if the file already exists on the server.
diff --git a/tools/clang/scripts/plugin_flags.py b/tools/clang/scripts/plugin_flags.py
new file mode 100755
index 0000000..3f61d6b
--- /dev/null
+++ b/tools/clang/scripts/plugin_flags.py
@@ -0,0 +1,29 @@
+#!/usr/bin/env python
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# This script returns the flags that should be used when GYP_DEFINES contains
+# clang_use_chrome_plugins. The flags are stored in a script so that they can
+# be changed on the bots without requiring a master restart.
+
+import os
+import sys
+
+# Path constants. (All of these should be absolute paths.)
+THIS_DIR = os.path.abspath(os.path.dirname(__file__))
+CHROMIUM_DIR = os.path.abspath(os.path.join(THIS_DIR, '..', '..', '..'))
+CLANG_LIB_PATH = os.path.join(CHROMIUM_DIR, 'third_party', 'llvm-build',
+ 'Release+Asserts', 'lib')
+
+if sys.platform == 'darwin':
+ LIBSUFFIX = 'dylib'
+else:
+ LIBSUFFIX = 'so'
+
+LIB_PATH = os.path.join(
+ CLANG_LIB_PATH,
+ 'libFindBadConstructs.' + LIBSUFFIX)
+
+print ('-Xclang -load -Xclang %s'
+ ' -Xclang -add-plugin -Xclang find-bad-constructs') % LIB_PATH
diff --git a/tools/clang/scripts/plugin_flags.sh b/tools/clang/scripts/plugin_flags.sh
deleted file mode 100755
index 81fe0f1..0000000
--- a/tools/clang/scripts/plugin_flags.sh
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/usr/bin/env bash
-# Copyright (c) 2012 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# This script returns the flags that should be used when GYP_DEFINES contains
-# clang_use_chrome_plugins. The flags are stored in a script so that they can
-# be changed on the bots without requiring a master restart.
-
-SRC_ABS_DIR=$(cd $(dirname $0)/../../.. && echo $PWD)
-CLANG_LIB_PATH=$SRC_ABS_DIR/third_party/llvm-build/Release+Asserts/lib
-
-if uname -s | grep -q Darwin; then
- LIBSUFFIX=dylib
-else
- LIBSUFFIX=so
-fi
-
-echo -Xclang -load -Xclang $CLANG_LIB_PATH/libFindBadConstructs.$LIBSUFFIX \
- -Xclang -add-plugin -Xclang find-bad-constructs \
- -Xclang -plugin-arg-find-bad-constructs -Xclang check-weak-ptr-factory-order \
- -Xclang -plugin-arg-find-bad-constructs -Xclang strict-virtual-specifiers
diff --git a/tools/clang/scripts/repackage.sh b/tools/clang/scripts/repackage.sh
deleted file mode 100755
index e19ab7e..0000000
--- a/tools/clang/scripts/repackage.sh
+++ /dev/null
@@ -1,67 +0,0 @@
-#!/bin/bash
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# This script will check out llvm and clang, build a full package
-# with the latest plugin revisions and then repackage an existing
-# clang-package with the new plugin revisions.
-
-# The new package can be uploaded to replace the existing clang
-# package at the same clang revision.
-
-THIS_DIR="$(dirname "${0}")"
-LLVM_BUILD_DIR="${THIS_DIR}/../../../third_party/llvm-build"
-LLVM_TAR_DIR="${LLVM_BUILD_DIR}/Release+Asserts"
-LLVM_BIN_DIR="${LLVM_TAR_DIR}/bin"
-LLVM_LIB_DIR="${LLVM_TAR_DIR}/lib"
-
-set -eu
-
-if [ "$(uname -s)" = "Darwin" ]; then
- PLATFORM=Mac
- SO_EXT="dylib"
-else
- PLATFORM=Linux_x64
- SO_EXT="so"
-fi
-
-# Build clang with the new plugin revisions.
-"$THIS_DIR"/package.sh $@
-
-R=$("${LLVM_BIN_DIR}/clang" --version | \
- sed -ne 's/clang version .*(trunk \([0-9]*\))/\1/p')
-PDIR=clang-$R
-
-if [ ! -f "$PDIR.tgz" ]; then
- echo "Could not find package archive $PDIR.tgz generated by package.sh"
- exit 1
-fi
-
-# We don't want to change the clang binary, so fetch the current clang
-# package and add the plugin shared-libraries to the existing package.
-rm -rf $LLVM_BUILD_DIR
-"$THIS_DIR"/update.sh
-
-LIBNAME=\
-$(grep 'set(LIBRARYNAME' "$THIS_DIR"/../blink_gc_plugin/CMakeLists.txt \
- | cut -d ' ' -f 2 | tr -d ')')
-LIBFILE=lib$LIBNAME.$SO_EXT
-
-# Check that we are actually creating the plugin at a new revision.
-if [ -f "$LLVM_LIB_DIR/$LIBFILE" ]; then
- echo "The plugin revision $LIBNAME is already in the existing package."
- exit 1
-fi
-
-cp $PDIR/lib/$LIBFILE "$LLVM_LIB_DIR/"
-if [ "$(uname -s)" = "Darwin" ]; then
- tar zcf ${PDIR}_repack.tgz -C "$LLVM_TAR_DIR" bin include lib buildlog.txt
-else
- tar zcf ${PDIR}_repack.tgz -C "$LLVM_TAR_DIR" bin lib buildlog.txt
-fi
-
-echo The clang package has been repackaged with $LIBNAME
-echo To upload, run:
-echo gsutil cp -a public-read ${PDIR}_repack.tgz \
- gs://chromium-browser-clang/$PLATFORM/$PDIR.tgz
diff --git a/tools/clang/scripts/update.py b/tools/clang/scripts/update.py
index 6e55d0c..cb0878d 100755
--- a/tools/clang/scripts/update.py
+++ b/tools/clang/scripts/update.py
@@ -24,7 +24,7 @@
# in bringup. Use a pinned revision to make it slightly more stable.
if (re.search(r'\b(asan)=1', os.environ.get('GYP_DEFINES', '')) and
not 'LLVM_FORCE_HEAD_REVISION' in os.environ):
- LLVM_WIN_REVISION = '228702'
+ LLVM_WIN_REVISION = '229860'
# Path constants. (All of these should be absolute paths.)
THIS_DIR = os.path.abspath(os.path.dirname(__file__))
diff --git a/tools/clang/scripts/update.sh b/tools/clang/scripts/update.sh
index 7c60472..ae90743 100755
--- a/tools/clang/scripts/update.sh
+++ b/tools/clang/scripts/update.sh
@@ -8,7 +8,12 @@
# Do NOT CHANGE this if you don't know what you're doing -- see
# https://code.google.com/p/chromium/wiki/UpdatingClang
# Reverting problematic clang rolls is safe, though.
-CLANG_REVISION=223108
+CLANG_REVISION=231191
+
+# This is incremented when pushing a new build of Clang at the same revision.
+CLANG_SUB_REVISION=1
+
+PACKAGE_VERSION="${CLANG_REVISION}-${CLANG_SUB_REVISION}"
THIS_DIR="$(dirname "${0}")"
LLVM_DIR="${THIS_DIR}/../../../third_party/llvm"
@@ -23,6 +28,7 @@
ANDROID_NDK_DIR="${THIS_DIR}/../../../third_party/android_tools/ndk"
STAMP_FILE="${LLVM_DIR}/../llvm-build/cr_build_revision"
CHROMIUM_TOOLS_DIR="${THIS_DIR}/.."
+BINUTILS_DIR="${THIS_DIR}/../../../third_party/binutils"
ABS_CHROMIUM_TOOLS_DIR="${PWD}/${CHROMIUM_TOOLS_DIR}"
ABS_LIBCXX_DIR="${PWD}/${LIBCXX_DIR}"
@@ -30,10 +36,13 @@
ABS_LLVM_DIR="${PWD}/${LLVM_DIR}"
ABS_LLVM_BUILD_DIR="${PWD}/${LLVM_BUILD_DIR}"
ABS_COMPILER_RT_DIR="${PWD}/${COMPILER_RT_DIR}"
+ABS_BINUTILS_DIR="${PWD}/${BINUTILS_DIR}"
# ${A:-a} returns $A if it's set, a else.
LLVM_REPO_URL=${LLVM_URL:-https://llvm.org/svn/llvm-project}
+CDS_URL=https://commondatastorage.googleapis.com/chromium-browser-clang
+
if [[ -z "$GYP_DEFINES" ]]; then
GYP_DEFINES=
fi
@@ -51,6 +60,7 @@
# --print-revision, stamp file logic, etc. all works naturally.
CLANG_REVISION=$(svn info "$LLVM_REPO_URL" \
| grep 'Last Changed Rev' | awk '{ printf $4; }')
+ PACKAGE_VERSION="${CLANG_REVISION}-0"
fi
# Use both the clang revision and the plugin revisions to test for updates.
@@ -88,7 +98,7 @@
force_local_build=yes
;;
--print-revision)
- echo $CLANG_REVISION
+ echo $PACKAGE_VERSION
exit 0
;;
--run-tests)
@@ -161,6 +171,40 @@
with_android=
fi
+ LLVM_BUILD_TOOLS_DIR="${ABS_LLVM_DIR}/../llvm-build-tools"
+
+ if [[ "${OS}" == "Linux" ]] && [[ -z "${gcc_toolchain}" ]]; then
+ if [[ $(gcc -dumpversion) < "4.7.0" ]]; then
+ # We need a newer GCC version.
+ if [[ ! -e "${LLVM_BUILD_TOOLS_DIR}/gcc482" ]]; then
+ echo "Downloading pre-built GCC 4.8.2..."
+ mkdir -p "${LLVM_BUILD_TOOLS_DIR}"
+ curl --fail -L "${CDS_URL}/tools/gcc482.tgz" | \
+ tar zxf - -C "${LLVM_BUILD_TOOLS_DIR}"
+ echo Done
+ fi
+ gcc_toolchain="${LLVM_BUILD_TOOLS_DIR}/gcc482"
+ else
+ # Always set gcc_toolchain; llvm-symbolizer needs the bundled libstdc++.
+ gcc_toolchain="$(dirname $(dirname $(which gcc)))"
+ fi
+ fi
+
+ if [[ "${OS}" == "Linux" ]]; then
+ # TODO(hans): Might need to make this work on Mac eventually.
+ if [[ $(cmake --version | grep -Eo '[0-9.]+') < "3.0" ]]; then
+ # We need a newer CMake version.
+ if [[ ! -e "${LLVM_BUILD_TOOLS_DIR}/cmake310" ]]; then
+ echo "Downloading pre-built CMake 3.10..."
+ mkdir -p "${LLVM_BUILD_TOOLS_DIR}"
+ curl --fail -L "${CDS_URL}/tools/cmake310.tgz" | \
+ tar zxf - -C "${LLVM_BUILD_TOOLS_DIR}"
+ echo Done
+ fi
+ export PATH="${LLVM_BUILD_TOOLS_DIR}/cmake310/bin:${PATH}"
+ fi
+ fi
+
echo "LLVM_FORCE_HEAD_REVISION was set; using r${CLANG_REVISION}"
fi
@@ -193,8 +237,8 @@
PREVIOUSLY_BUILT_REVISON=$(cat "${STAMP_FILE}")
if [[ -z "$force_local_build" ]] && \
[[ "${PREVIOUSLY_BUILT_REVISON}" = \
- "${CLANG_AND_PLUGINS_REVISION}" ]]; then
- echo "Clang already at ${CLANG_AND_PLUGINS_REVISION}"
+ "${PACKAGE_VERSION}" ]]; then
+ echo "Clang already at ${PACKAGE_VERSION}"
exit 0
fi
fi
@@ -205,8 +249,7 @@
if [[ -z "$force_local_build" ]]; then
# Check if there's a prebuilt binary and if so just fetch that. That's faster,
# and goma relies on having matching binary hashes on client and server too.
- CDS_URL=https://commondatastorage.googleapis.com/chromium-browser-clang
- CDS_FILE="clang-${CLANG_REVISION}.tgz"
+ CDS_FILE="clang-${PACKAGE_VERSION}.tgz"
CDS_OUT_DIR=$(mktemp -d -t clang_download.XXXXXX)
CDS_OUTPUT="${CDS_OUT_DIR}/${CDS_FILE}"
if [ "${OS}" = "Linux" ]; then
@@ -228,12 +271,12 @@
rm -rf "${LLVM_BUILD_DIR}"
mkdir -p "${LLVM_BUILD_DIR}"
tar -xzf "${CDS_OUTPUT}" -C "${LLVM_BUILD_DIR}"
- echo clang "${CLANG_REVISION}" unpacked
- echo "${CLANG_AND_PLUGINS_REVISION}" > "${STAMP_FILE}"
+ echo clang "${PACKAGE_VERSION}" unpacked
+ echo "${PACKAGE_VERSION}" > "${STAMP_FILE}"
rm -rf "${CDS_OUT_DIR}"
exit 0
else
- echo Did not find prebuilt clang at r"${CLANG_REVISION}", building
+ echo Did not find prebuilt clang "${PACKAGE_VERSION}", building
fi
fi
@@ -277,6 +320,8 @@
"${CLANG_DIR}/lib/Sema/SemaExprCXX.cpp" \
"${CLANG_DIR}/test/SemaCXX/default2.cpp" \
"${CLANG_DIR}/test/SemaCXX/typo-correction-delayed.cpp" \
+ "${COMPILER_RT_DIR}/lib/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cc" \
+ "${COMPILER_RT_DIR}/test/tsan/signal_segv_handler.cc" \
; do
if [[ -e "${i}" ]]; then
rm -f "${i}" # For unversioned files.
@@ -359,349 +404,6 @@
patch -p0
popd
- # Apply r223211: "Revert r222997."
- pushd "${LLVM_DIR}"
- cat << 'EOF' |
---- a/lib/Transforms/Instrumentation/MemorySanitizer.cpp
-+++ b/lib/Transforms/Instrumentation/MemorySanitizer.cpp
-@@ -921,8 +921,6 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
- Value *OriginPtr =
- getOriginPtrForArgument(&FArg, EntryIRB, ArgOffset);
- setOrigin(A, EntryIRB.CreateLoad(OriginPtr));
-- } else {
-- setOrigin(A, getCleanOrigin());
- }
- }
- ArgOffset += RoundUpToAlignment(Size, kShadowTLSAlignment);
-@@ -942,13 +940,15 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
- /// \brief Get the origin for a value.
- Value *getOrigin(Value *V) {
- if (!MS.TrackOrigins) return nullptr;
-- if (!PropagateShadow) return getCleanOrigin();
-- if (isa<Constant>(V)) return getCleanOrigin();
-- assert((isa<Instruction>(V) || isa<Argument>(V)) &&
-- "Unexpected value type in getOrigin()");
-- Value *Origin = OriginMap[V];
-- assert(Origin && "Missing origin");
-- return Origin;
-+ if (isa<Instruction>(V) || isa<Argument>(V)) {
-+ Value *Origin = OriginMap[V];
-+ if (!Origin) {
-+ DEBUG(dbgs() << "NO ORIGIN: " << *V << "\n");
-+ Origin = getCleanOrigin();
-+ }
-+ return Origin;
-+ }
-+ return getCleanOrigin();
- }
-
- /// \brief Get the origin for i-th argument of the instruction I.
-@@ -1088,7 +1088,6 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
- IRB.CreateStore(getCleanShadow(&I), ShadowPtr);
-
- setShadow(&I, getCleanShadow(&I));
-- setOrigin(&I, getCleanOrigin());
- }
-
- void visitAtomicRMWInst(AtomicRMWInst &I) {
-EOF
- patch -p1
- popd
-
- # Apply r223219: "Preserve LD_LIBRARY_PATH when using the 'env' command"
- pushd "${CLANG_DIR}"
- cat << 'EOF' |
---- a/test/Driver/env.c
-+++ b/test/Driver/env.c
-@@ -5,12 +5,14 @@
- // REQUIRES: shell
- //
- // The PATH variable is heavily used when trying to find a linker.
--// RUN: env -i LC_ALL=C %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \
-+// RUN: env -i LC_ALL=C LD_LIBRARY_PATH="$LD_LIBRARY_PATH" \
-+// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \
- // RUN: --target=i386-unknown-linux \
- // RUN: --sysroot=%S/Inputs/basic_linux_tree \
- // RUN: | FileCheck --check-prefix=CHECK-LD-32 %s
- //
--// RUN: env -i LC_ALL=C PATH="" %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \
-+// RUN: env -i LC_ALL=C PATH="" LD_LIBRARY_PATH="$LD_LIBRARY_PATH" \
-+// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \
- // RUN: --target=i386-unknown-linux \
- // RUN: --sysroot=%S/Inputs/basic_linux_tree \
- // RUN: | FileCheck --check-prefix=CHECK-LD-32 %s
-EOF
- patch -p1
- popd
-
- # Revert r220714: "Frontend: Define __EXCEPTIONS if -fexceptions is passed"
- pushd "${CLANG_DIR}"
- cat << 'EOF' |
---- a/lib/Frontend/InitPreprocessor.cpp
-+++ b/lib/Frontend/InitPreprocessor.cpp
-@@ -566,7 +566,7 @@ static void InitializePredefinedMacros(const TargetInfo &TI,
- Builder.defineMacro("__BLOCKS__");
- }
-
-- if (!LangOpts.MSVCCompat && LangOpts.Exceptions)
-+ if (!LangOpts.MSVCCompat && LangOpts.CXXExceptions)
- Builder.defineMacro("__EXCEPTIONS");
- if (!LangOpts.MSVCCompat && LangOpts.RTTI)
- Builder.defineMacro("__GXX_RTTI");
-diff --git a/test/Frontend/exceptions.c b/test/Frontend/exceptions.c
-index 981b5b9..4bbaaa3 100644
---- a/test/Frontend/exceptions.c
-+++ b/test/Frontend/exceptions.c
-@@ -1,9 +1,6 @@
--// RUN: %clang_cc1 -fms-compatibility -fexceptions -fcxx-exceptions -DMS_MODE -verify %s
-+// RUN: %clang_cc1 -fms-compatibility -fexceptions -fcxx-exceptions -verify %s
- // expected-no-diagnostics
-
--// RUN: %clang_cc1 -fms-compatibility -fexceptions -verify %s
--// expected-no-diagnostics
--
--#if defined(MS_MODE) && defined(__EXCEPTIONS)
-+#if defined(__EXCEPTIONS)
- #error __EXCEPTIONS should not be defined.
- #endif
-diff --git a/test/Preprocessor/predefined-exceptions.m b/test/Preprocessor/predefined-exceptions.m
-index 0791075..c13f429 100644
---- a/test/Preprocessor/predefined-exceptions.m
-+++ b/test/Preprocessor/predefined-exceptions.m
-@@ -1,6 +1,6 @@
- // RUN: %clang_cc1 -x objective-c -fobjc-exceptions -fexceptions -E -dM %s | FileCheck -check-prefix=CHECK-OBJC-NOCXX %s
- // CHECK-OBJC-NOCXX: #define OBJC_ZEROCOST_EXCEPTIONS 1
--// CHECK-OBJC-NOCXX: #define __EXCEPTIONS 1
-+// CHECK-OBJC-NOCXX-NOT: #define __EXCEPTIONS 1
-
- // RUN: %clang_cc1 -x objective-c++ -fobjc-exceptions -fexceptions -fcxx-exceptions -E -dM %s | FileCheck -check-prefix=CHECK-OBJC-CXX %s
- // CHECK-OBJC-CXX: #define OBJC_ZEROCOST_EXCEPTIONS 1
-EOF
- patch -p1
- popd
-
- # Apply r223177: "Ensure typos in the default values of template parameters get diagnosed."
- pushd "${CLANG_DIR}"
- cat << 'EOF' |
---- a/lib/Parse/ParseTemplate.cpp
-+++ b/lib/Parse/ParseTemplate.cpp
-@@ -676,7 +676,7 @@ Parser::ParseNonTypeTemplateParameter(unsigned Depth, unsigned Position) {
- GreaterThanIsOperatorScope G(GreaterThanIsOperator, false);
- EnterExpressionEvaluationContext Unevaluated(Actions, Sema::Unevaluated);
-
-- DefaultArg = ParseAssignmentExpression();
-+ DefaultArg = Actions.CorrectDelayedTyposInExpr(ParseAssignmentExpression());
- if (DefaultArg.isInvalid())
- SkipUntil(tok::comma, tok::greater, StopAtSemi | StopBeforeMatch);
- }
-diff --git a/test/SemaCXX/default2.cpp b/test/SemaCXX/default2.cpp
-index 1626044..c4d40b4 100644
---- a/test/SemaCXX/default2.cpp
-+++ b/test/SemaCXX/default2.cpp
-@@ -122,3 +122,9 @@ class XX {
- void A(int length = -1 ) { }
- void B() { A(); }
- };
-+
-+template <int I = (1 * I)> struct S {}; // expected-error-re {{use of undeclared identifier 'I'{{$}}}}
-+S<1> s;
-+
-+template <int I1 = I2, int I2 = 1> struct T {}; // expected-error-re {{use of undeclared identifier 'I2'{{$}}}}
-+T<0, 1> t;
-diff --git a/test/SemaCXX/typo-correction-delayed.cpp b/test/SemaCXX/typo-correction-delayed.cpp
-index bff1d76..7bf9258 100644
---- a/test/SemaCXX/typo-correction-delayed.cpp
-+++ b/test/SemaCXX/typo-correction-delayed.cpp
-@@ -102,3 +102,7 @@ void f(int *i) {
- __atomic_load(i, i, something_something); // expected-error-re {{use of undeclared identifier 'something_something'{{$}}}}
- }
- }
-+
-+const int DefaultArg = 9; // expected-note {{'DefaultArg' declared here}}
-+template <int I = defaultArg> struct S {}; // expected-error {{use of undeclared identifier 'defaultArg'; did you mean 'DefaultArg'?}}
-+S<1> s;
-EOF
- patch -p1
- popd
-
- # Apply r223209: "Handle delayed corrections in a couple more error paths in ParsePostfixExpressionSuffix."
- pushd "${CLANG_DIR}"
- cat << 'EOF' |
---- a/lib/Parse/ParseExpr.cpp
-+++ b/lib/Parse/ParseExpr.cpp
-@@ -1390,6 +1390,7 @@ Parser::ParsePostfixExpressionSuffix(ExprResult LHS) {
- SourceLocation OpenLoc = ConsumeToken();
-
- if (ParseSimpleExpressionList(ExecConfigExprs, ExecConfigCommaLocs)) {
-+ (void)Actions.CorrectDelayedTyposInExpr(LHS);
- LHS = ExprError();
- }
-
-@@ -1440,6 +1441,7 @@ Parser::ParsePostfixExpressionSuffix(ExprResult LHS) {
- if (Tok.isNot(tok::r_paren)) {
- if (ParseExpressionList(ArgExprs, CommaLocs, &Sema::CodeCompleteCall,
- LHS.get())) {
-+ (void)Actions.CorrectDelayedTyposInExpr(LHS);
- LHS = ExprError();
- }
- }
-diff --git a/test/SemaCXX/typo-correction-delayed.cpp b/test/SemaCXX/typo-correction-delayed.cpp
-index 7bf9258..f7ef015 100644
---- a/test/SemaCXX/typo-correction-delayed.cpp
-+++ b/test/SemaCXX/typo-correction-delayed.cpp
-@@ -106,3 +106,9 @@ void f(int *i) {
- const int DefaultArg = 9; // expected-note {{'DefaultArg' declared here}}
- template <int I = defaultArg> struct S {}; // expected-error {{use of undeclared identifier 'defaultArg'; did you mean 'DefaultArg'?}}
- S<1> s;
-+
-+namespace foo {}
-+void test_paren_suffix() {
-+ foo::bar({5, 6}); // expected-error-re {{no member named 'bar' in namespace 'foo'{{$}}}} \
-+ // expected-error {{expected expression}}
-+}
-EOF
- patch -p1
- popd
-
- # Apply r223705: "Handle possible TypoExprs in member initializers."
- pushd "${CLANG_DIR}"
- cat << 'EOF' |
---- a/lib/Sema/SemaDeclCXX.cpp
-+++ b/lib/Sema/SemaDeclCXX.cpp
-@@ -2813,6 +2813,11 @@ Sema::BuildMemInitializer(Decl *ConstructorD,
- SourceLocation IdLoc,
- Expr *Init,
- SourceLocation EllipsisLoc) {
-+ ExprResult Res = CorrectDelayedTyposInExpr(Init);
-+ if (!Res.isUsable())
-+ return true;
-+ Init = Res.get();
-+
- if (!ConstructorD)
- return true;
-
-diff --git a/test/SemaCXX/typo-correction-delayed.cpp b/test/SemaCXX/typo-correction-delayed.cpp
-index f7ef015..d303b58 100644
---- a/test/SemaCXX/typo-correction-delayed.cpp
-+++ b/test/SemaCXX/typo-correction-delayed.cpp
-@@ -112,3 +112,10 @@ void test_paren_suffix() {
- foo::bar({5, 6}); // expected-error-re {{no member named 'bar' in namespace 'foo'{{$}}}} \
- // expected-error {{expected expression}}
- }
-+
-+const int kNum = 10; // expected-note {{'kNum' declared here}}
-+class SomeClass {
-+ int Kind;
-+public:
-+ explicit SomeClass() : Kind(kSum) {} // expected-error {{use of undeclared identifier 'kSum'; did you mean 'kNum'?}}
-+};
-EOF
- patch -p1
- popd
-
- # Apply r224172: "Typo correction: Ignore temporary binding exprs after overload resolution"
- pushd "${CLANG_DIR}"
- cat << 'EOF' |
---- a/lib/Sema/SemaExprCXX.cpp
-+++ b/lib/Sema/SemaExprCXX.cpp
-@@ -6105,8 +6105,13 @@ public:
- auto Result = BaseTransform::RebuildCallExpr(Callee, LParenLoc, Args,
- RParenLoc, ExecConfig);
- if (auto *OE = dyn_cast<OverloadExpr>(Callee)) {
-- if (!Result.isInvalid() && Result.get())
-- OverloadResolution[OE] = cast<CallExpr>(Result.get())->getCallee();
-+ if (!Result.isInvalid() && Result.get()) {
-+ Expr *ResultCall = Result.get();
-+ if (auto *BE = dyn_cast<CXXBindTemporaryExpr>(ResultCall))
-+ ResultCall = BE->getSubExpr();
-+ if (auto *CE = dyn_cast<CallExpr>(ResultCall))
-+ OverloadResolution[OE] = CE->getCallee();
-+ }
- }
- return Result;
- }
-diff --git a/test/SemaCXX/typo-correction-delayed.cpp b/test/SemaCXX/typo-correction-delayed.cpp
-index d303b58..d42888f 100644
---- a/test/SemaCXX/typo-correction-delayed.cpp
-+++ b/test/SemaCXX/typo-correction-delayed.cpp
-@@ -119,3 +119,23 @@ class SomeClass {
- public:
- explicit SomeClass() : Kind(kSum) {} // expected-error {{use of undeclared identifier 'kSum'; did you mean 'kNum'?}}
- };
-+
-+extern "C" int printf(const char *, ...);
-+
-+// There used to be an issue with typo resolution inside overloads.
-+struct AssertionResult {
-+ ~AssertionResult();
-+ operator bool();
-+ int val;
-+};
-+AssertionResult Compare(const char *a, const char *b);
-+AssertionResult Compare(int a, int b);
-+int main() {
-+ // expected-note@+1 {{'result' declared here}}
-+ const char *result;
-+ // expected-error@+1 {{use of undeclared identifier 'resulta'; did you mean 'result'?}}
-+ if (AssertionResult ar = (Compare("value1", resulta)))
-+ ;
-+ else
-+ printf("ar: %d\n", ar.val);
-+}
-EOF
- patch -p1
- popd
-
- # Apply r224173: "Implement feedback on r224172 in PR21899"
- pushd "${CLANG_DIR}"
- cat << 'EOF' |
---- a/lib/Sema/SemaExprCXX.cpp
-+++ b/lib/Sema/SemaExprCXX.cpp
-@@ -6105,7 +6105,7 @@ public:
- auto Result = BaseTransform::RebuildCallExpr(Callee, LParenLoc, Args,
- RParenLoc, ExecConfig);
- if (auto *OE = dyn_cast<OverloadExpr>(Callee)) {
-- if (!Result.isInvalid() && Result.get()) {
-+ if (Result.isUsable()) {
- Expr *ResultCall = Result.get();
- if (auto *BE = dyn_cast<CXXBindTemporaryExpr>(ResultCall))
- ResultCall = BE->getSubExpr();
-diff --git a/test/SemaCXX/typo-correction-delayed.cpp b/test/SemaCXX/typo-correction-delayed.cpp
-index d42888f..7879d29 100644
---- a/test/SemaCXX/typo-correction-delayed.cpp
-+++ b/test/SemaCXX/typo-correction-delayed.cpp
-@@ -120,22 +120,13 @@ public:
- explicit SomeClass() : Kind(kSum) {} // expected-error {{use of undeclared identifier 'kSum'; did you mean 'kNum'?}}
- };
-
--extern "C" int printf(const char *, ...);
--
- // There used to be an issue with typo resolution inside overloads.
--struct AssertionResult {
-- ~AssertionResult();
-- operator bool();
-- int val;
--};
--AssertionResult Compare(const char *a, const char *b);
--AssertionResult Compare(int a, int b);
--int main() {
-+struct AssertionResult { ~AssertionResult(); };
-+AssertionResult Overload(const char *a);
-+AssertionResult Overload(int a);
-+void UseOverload() {
- // expected-note@+1 {{'result' declared here}}
- const char *result;
- // expected-error@+1 {{use of undeclared identifier 'resulta'; did you mean 'result'?}}
-- if (AssertionResult ar = (Compare("value1", resulta)))
-- ;
-- else
-- printf("ar: %d\n", ar.val);
-+ Overload(resulta);
- }
-EOF
- patch -p1
- popd
-
# This Go bindings test doesn't work after the bootstrap build on Linux. (PR21552)
pushd "${LLVM_DIR}"
cat << 'EOF' |
@@ -718,6 +420,7 @@
patch -p0
popd
+
fi
# Echo all commands.
@@ -842,6 +545,12 @@
LDFLAGS+="-stdlib=libc++ -L${PWD}/libcxxbuild"
fi
+# Find the binutils include dir for the gold plugin.
+BINUTILS_INCDIR=""
+if [ "${OS}" = "Linux" ]; then
+ BINUTILS_INCDIR="${ABS_BINUTILS_DIR}/Linux_x64/Release/include"
+fi
+
# Hook the Chromium tools into the LLVM build. Several Chromium tools have
# dependencies on LLVM/Clang libraries. The LLVM build detects implicit tools
# in the tools subdirectory, so install a shim CMakeLists.txt that forwards to
@@ -861,6 +570,7 @@
-DCMAKE_BUILD_TYPE=Release \
-DLLVM_ENABLE_ASSERTIONS=ON \
-DLLVM_ENABLE_THREADS=OFF \
+ -DLLVM_BINUTILS_INCDIR="${BINUTILS_INCDIR}" \
-DCMAKE_C_COMPILER="${CC}" \
-DCMAKE_CXX_COMPILER="${CXX}" \
-DCMAKE_C_FLAGS="${CFLAGS}" \
@@ -970,4 +680,4 @@
fi
# After everything is done, log success for this revision.
-echo "${CLANG_AND_PLUGINS_REVISION}" > "${STAMP_FILE}"
+echo "${PACKAGE_VERSION}" > "${STAMP_FILE}"
diff --git a/tools/generate_library_loader/generate_library_loader.gni b/tools/generate_library_loader/generate_library_loader.gni
index 2b6874a..24f753b 100644
--- a/tools/generate_library_loader/generate_library_loader.gni
+++ b/tools/generate_library_loader/generate_library_loader.gni
@@ -60,8 +60,8 @@
public_configs = [ invoker.config ]
}
sources = [
- output_h,
output_cc,
+ output_h,
]
deps = [
":${target_name}_loader",
diff --git a/tools/gritsettings/resource_ids b/tools/gritsettings/resource_ids
index efd5760..d2b3ede 100644
--- a/tools/gritsettings/resource_ids
+++ b/tools/gritsettings/resource_ids
@@ -215,6 +215,9 @@
"ui/login/login_resources.grd": {
"includes": [28300],
},
+ "ui/oobe/oobe_resources.grd": {
+ "includes": [28310],
+ },
"chrome/browser/resources/translate_internals_resources.grd": {
"includes": [28500],
},
diff --git a/tools/relocation_packer/BUILD.gn b/tools/relocation_packer/BUILD.gn
index e95dbcf..563a64d 100644
--- a/tools/relocation_packer/BUILD.gn
+++ b/tools/relocation_packer/BUILD.gn
@@ -28,8 +28,8 @@
"src/elf_file.cc",
"src/leb128.cc",
"src/packer.cc",
- "src/sleb128.cc",
"src/run_length_encoder.cc",
+ "src/sleb128.cc",
]
}
@@ -53,9 +53,9 @@
"src/elf_file_unittest.cc",
"src/leb128_unittest.cc",
"src/packer_unittest.cc",
- "src/sleb128_unittest.cc",
- "src/run_length_encoder_unittest.cc",
"src/run_all_unittests.cc",
+ "src/run_length_encoder_unittest.cc",
+ "src/sleb128_unittest.cc",
]
rebased_test_data = rebase_path("test_data", root_build_dir)
data = [
diff --git a/tools/valgrind/drmemory/suppressions.txt b/tools/valgrind/drmemory/suppressions.txt
index d6f6096..c429a9f 100644
--- a/tools/valgrind/drmemory/suppressions.txt
+++ b/tools/valgrind/drmemory/suppressions.txt
@@ -742,3 +742,20 @@
*!content::ContentMainRunnerImpl::Run
*!content::ContentMain
*!content::LaunchTests
+
+UNINITIALIZED READ
+name=http://crbug.com/463204
+skia.dll!_ltod3
+skia.dll!SkPaint::measure_text
+skia.dll!SkPaint::measureText
+content.dll!content::DoPreSandboxWarmupForTypeface
+content.dll!content::`anonymous namespace'::WarmupDirectWrite
+
+UNADDRESSABLE ACCESS
+name=http://crbug.com/463261
+...
+blink_web.dll!blink::WebFrameWidgetImpl::selectionBounds
+content.dll!content::RenderWidget::GetSelectionBounds
+content.dll!content::RenderWidget::UpdateSelectionBounds
+content.dll!content::RenderWidget::willBeginCompositorFrame
+cc.dll!base::internal::InvokeHelper<>::MakeItSo
diff --git a/tools/valgrind/gtest_exclude/base_unittests.gtest-drmemory_win32.txt b/tools/valgrind/gtest_exclude/base_unittests.gtest-drmemory_win32.txt
index 72a2478..cc442bc 100644
--- a/tools/valgrind/gtest_exclude/base_unittests.gtest-drmemory_win32.txt
+++ b/tools/valgrind/gtest_exclude/base_unittests.gtest-drmemory_win32.txt
@@ -36,5 +36,3 @@
# so we can avoid excluding this for light mode.
MessageLoopTestTypeUI.RecursiveDenial3
-# crbug/461816
-PEImageTest.EnumeratesPE
diff --git a/tools/valgrind/gtest_exclude/components_unittests.gtest.txt b/tools/valgrind/gtest_exclude/components_unittests.gtest.txt
index ab9ecfc..e6a2b3f 100644
--- a/tools/valgrind/gtest_exclude/components_unittests.gtest.txt
+++ b/tools/valgrind/gtest_exclude/components_unittests.gtest.txt
@@ -3,3 +3,6 @@
# Fails under valgrind, see http://crbug.com/444516
AudioDirectiveListTest.*
+
+# http://crbug.com/462352
+FeedbackUploaderChromeTest.VariationHeaders
diff --git a/tools/valgrind/gtest_exclude/content_browsertests.gtest-drmemory.txt b/tools/valgrind/gtest_exclude/content_browsertests.gtest-drmemory.txt
index 6d9febd..2ec3183 100644
--- a/tools/valgrind/gtest_exclude/content_browsertests.gtest-drmemory.txt
+++ b/tools/valgrind/gtest_exclude/content_browsertests.gtest-drmemory.txt
@@ -1,3 +1,6 @@
+# http://crbug.com/293125
+WebRtcBrowserTest.CanMakeEmptyCallThenAddStreamsAndRenegotiate
+
# crbug.com/395172
WebRtcBrowserTest.CanForwardRemoteStream
WebRtcBrowserTest.CanForwardRemoteStream720p
@@ -23,8 +26,12 @@
# crbug.com/461489
ServiceWorkerVersionBrowserTest.TimeoutStartingWorker
-# http://crbug.com/293125
-WebRtcBrowserTest.CanMakeEmptyCallThenAddStreamsAndRenegotiate
-
# http://crbug.com/456131
BrowserSideNavigationBrowserTest.BrowserInitiatedNavigations
+
+# http://crbug.com/464029
+WebRtcBrowserTest.CallAndModifyStream
+
+# http://crbug.com/464033
+RenderFrameHostImplBrowserTest.IsFocused_AtLoad
+RenderFrameHostImplBrowserTest.IsFocused_Widget
diff --git a/tools/valgrind/gtest_exclude/gfx_unittests.gtest-memcheck.txt b/tools/valgrind/gtest_exclude/gfx_unittests.gtest-memcheck.txt
deleted file mode 100644
index 3aaaafc..0000000
--- a/tools/valgrind/gtest_exclude/gfx_unittests.gtest-memcheck.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-# http://crbug.com/402209
-FontRenderParamsTest.Default
diff --git a/tools/valgrind/gtest_exclude/media_unittests.gtest_mac.txt b/tools/valgrind/gtest_exclude/media_unittests.gtest_mac.txt
index 7f60330..44a4117 100644
--- a/tools/valgrind/gtest_exclude/media_unittests.gtest_mac.txt
+++ b/tools/valgrind/gtest_exclude/media_unittests.gtest_mac.txt
@@ -7,3 +7,6 @@
# Times out under Valgrind, http://crbug.com/444578
PipelineIntegrationTest.*
+
+# Hangs the whole Mac Valgrind bot: http://crbug.com/462483
+MidiManagerMacTest.*
diff --git a/tools/valgrind/gtest_exclude/mojo_system_unittests.gtest-drmemory.txt b/tools/valgrind/gtest_exclude/mojo_system_unittests.gtest-drmemory.txt
index 24fd314..5149d6c 100644
--- a/tools/valgrind/gtest_exclude/mojo_system_unittests.gtest-drmemory.txt
+++ b/tools/valgrind/gtest_exclude/mojo_system_unittests.gtest-drmemory.txt
@@ -2,3 +2,5 @@
RemoteMessagePipeTest.HandlePassing
# crbug.com/440828
EmbedderTest.MultiprocessChannels
+# crbug.com/464019
+DataPipeImplTest*.TwoPhaseAllOrNone
diff --git a/tools/valgrind/gtest_exclude/ui_base_unittests.gtest.txt b/tools/valgrind/gtest_exclude/ui_base_unittests.gtest.txt
deleted file mode 100644
index 59ec948..0000000
--- a/tools/valgrind/gtest_exclude/ui_base_unittests.gtest.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-# Hangs, fails on cros valgrind. crbug.com/427818
-TouchExplorationTest.*
diff --git a/tools/valgrind/locate_valgrind.sh b/tools/valgrind/locate_valgrind.sh
index 5d0a06b..11d4d83 100755
--- a/tools/valgrind/locate_valgrind.sh
+++ b/tools/valgrind/locate_valgrind.sh
@@ -36,32 +36,24 @@
PLATFORM="mac_10.7"
;;
*)
- echo "Unknown platform:" >&2
- uname -a >&2
- echo "We'll try to search for valgrind binaries installed in /usr/local" >&2
- PLATFORM=
+ (echo "Sorry, your platform is not supported:" &&
+ uname -a
+ echo
+ echo "If you're on Mac OS X, please see http://crbug.com/441425") >&2
+ exit 42
esac
- if [ "$PLATFORM" != "" ]
+ # The binaries should be in third_party/valgrind
+ # (checked out from deps/third_party/valgrind/binaries).
+ CHROME_VALGRIND="$THISDIR/../../third_party/valgrind/$PLATFORM"
+
+ # TODO(timurrrr): readlink -f is not present on Mac...
+ if [ "$PLATFORM" != "mac" ] && \
+ [ "$PLATFORM" != "mac_10.6" ] && \
+ [ "$PLATFORM" != "mac_10.7" ]
then
- # The binaries should be in third_party/valgrind
- # (checked out from deps/third_party/valgrind/binaries).
- CHROME_VALGRIND="$THISDIR/../../third_party/valgrind/$PLATFORM"
-
- # TODO(timurrrr): readlink -f is not present on Mac...
- if [ "$PLATFORM" != "mac" ] && \
- [ "$PLATFORM" != "mac_10.6" ] && \
- [ "$PLATFORM" != "mac_10.7" ]
- then
- # Get rid of all "../" dirs
- CHROME_VALGRIND=`readlink -f $CHROME_VALGRIND`
- fi
-
- if ! test -x $CHROME_VALGRIND/bin/valgrind
- then
- # We couldn't find the binaries in third_party/valgrind
- CHROME_VALGRIND=""
- fi
+ # Get rid of all "../" dirs
+ CHROME_VALGRIND=$(readlink -f $CHROME_VALGRIND)
fi
fi
diff --git a/tools/valgrind/memcheck/suppressions.txt b/tools/valgrind/memcheck/suppressions.txt
index 9ea9570..121f26b 100644
--- a/tools/valgrind/memcheck/suppressions.txt
+++ b/tools/valgrind/memcheck/suppressions.txt
@@ -501,6 +501,16 @@
fun:_ZN10extensions19ExtensionManagement7RefreshEv
fun:_ZN10extensions19ExtensionManagement22OnExtensionPrefChangedEv
}
+{
+ bug_464462
+ Memcheck:Uninitialized
+ fun:_ZN7content14ManifestParser16ParseIconDensityERKN4base15DictionaryValueE
+ fun:_ZN7content14ManifestParser10ParseIconsERKN4base15DictionaryValueE
+ fun:_ZN7content14ManifestParser5ParseEv
+ fun:_ZN7content18ManifestParserTest21ParseManifestWithURLsERKN4base16BasicStringPieceISsEERK4GURLS8_
+ fun:_ZN7content18ManifestParserTest13ParseManifestERKN4base16BasicStringPieceISsEE
+ fun:_ZN7content45ManifestParserTest_IconDensityParseRules_Test8TestBodyEv
+}
#-----------------------------------------------------------------------
# 3. Suppressions for real chromium bugs that are not yet fixed.
diff --git a/ui/android/java/src/org/chromium/ui/base/Clipboard.java b/ui/android/java/src/org/chromium/ui/base/Clipboard.java
index aaa500e..67aaca2 100644
--- a/ui/android/java/src/org/chromium/ui/base/Clipboard.java
+++ b/ui/android/java/src/org/chromium/ui/base/Clipboard.java
@@ -4,12 +4,13 @@
package org.chromium.ui.base;
+import android.annotation.TargetApi;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
+import android.os.Build;
import android.widget.Toast;
-import org.chromium.base.ApiCompatibilityUtils;
import org.chromium.base.CalledByNative;
import org.chromium.base.JNINamespace;
import org.chromium.ui.R;
@@ -20,6 +21,10 @@
*/
@JNINamespace("ui")
public class Clipboard {
+
+ private static final boolean IS_HTML_CLIPBOARD_SUPPORTED =
+ Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN;
+
// Necessary for coercing clipboard contents to text if they require
// access to network resources, etceteras (e.g., URI in clipboard)
private final Context mContext;
@@ -83,9 +88,10 @@
* @return a Java string with the html text if any, or null if there is no html
* text or no entries on the primary clip.
*/
+ @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
@CalledByNative
private String getHTMLText() {
- if (isHTMLClipboardSupported()) {
+ if (IS_HTML_CLIPBOARD_SUPPORTED) {
final ClipData clip = mClipboardManager.getPrimaryClip();
if (clip != null && clip.getItemCount() > 0) {
return clip.getItemAt(0).getHtmlText();
@@ -129,8 +135,9 @@
* @param label The Plain-text label for the HTML content.
* @param text Plain-text representation of the HTML content.
*/
+ @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
public void setHTMLText(final String html, final String label, final String text) {
- if (isHTMLClipboardSupported()) {
+ if (IS_HTML_CLIPBOARD_SUPPORTED) {
setPrimaryClipNoException(ClipData.newHtmlText(label, text, html));
}
}
@@ -150,7 +157,7 @@
@CalledByNative
private static boolean isHTMLClipboardSupported() {
- return ApiCompatibilityUtils.isHTMLClipboardSupported();
+ return IS_HTML_CLIPBOARD_SUPPORTED;
}
private void setPrimaryClipNoException(ClipData clip) {
diff --git a/ui/android/java/src/org/chromium/ui/gl/SurfaceTexturePlatformWrapper.java b/ui/android/java/src/org/chromium/ui/gl/SurfaceTexturePlatformWrapper.java
index 5f4c598..e785af6 100644
--- a/ui/android/java/src/org/chromium/ui/gl/SurfaceTexturePlatformWrapper.java
+++ b/ui/android/java/src/org/chromium/ui/gl/SurfaceTexturePlatformWrapper.java
@@ -60,12 +60,6 @@
}
@CalledByNative
- private static void setDefaultBufferSize(SurfaceTexture surfaceTexture, int width,
- int height) {
- surfaceTexture.setDefaultBufferSize(width, height);
- }
-
- @CalledByNative
private static void getTransformMatrix(SurfaceTexture surfaceTexture, float[] matrix) {
surfaceTexture.getTransformMatrix(matrix);
}
diff --git a/ui/events/event_dispatcher_unittest.cc b/ui/events/event_dispatcher_unittest.cc
index ad00122..d6caf00 100644
--- a/ui/events/event_dispatcher_unittest.cc
+++ b/ui/events/event_dispatcher_unittest.cc
@@ -18,7 +18,7 @@
class TestTarget : public EventTarget {
public:
TestTarget() : parent_(NULL), valid_(true) {}
- virtual ~TestTarget() {}
+ ~TestTarget() override {}
void set_parent(TestTarget* parent) { parent_ = parent; }
@@ -38,19 +38,19 @@
private:
// Overridden from EventTarget:
- virtual bool CanAcceptEvent(const ui::Event& event) override {
+ bool CanAcceptEvent(const ui::Event& event) override {
return true;
}
- virtual EventTarget* GetParentTarget() override {
+ EventTarget* GetParentTarget() override {
return parent_;
}
- virtual scoped_ptr<EventTargetIterator> GetChildIterator() override {
+ scoped_ptr<EventTargetIterator> GetChildIterator() override {
return scoped_ptr<EventTargetIterator>();
}
- virtual EventTargeter* GetEventTargeter() override {
+ EventTargeter* GetEventTargeter() override {
return NULL;
}
@@ -71,7 +71,7 @@
received_pre_target_(false) {
}
- virtual ~TestEventHandler() {}
+ ~TestEventHandler() override {}
virtual void ReceivedEvent(Event* event) {
static_cast<TestTarget*>(event->target())->AddHandlerId(id_);
@@ -94,7 +94,7 @@
private:
// Overridden from EventHandler:
- virtual void OnEvent(Event* event) override {
+ void OnEvent(Event* event) override {
ui::EventHandler::OnEvent(event);
ReceivedEvent(event);
SetStatusOnEvent(event);
@@ -123,7 +123,7 @@
set_cancelable(false);
}
- virtual ~NonCancelableEvent() {}
+ ~NonCancelableEvent() override {}
private:
DISALLOW_COPY_AND_ASSIGN(NonCancelableEvent);
@@ -138,10 +138,10 @@
dispatcher_delegate_(delegate) {
}
- virtual ~EventHandlerDestroyDispatcherDelegate() {}
+ ~EventHandlerDestroyDispatcherDelegate() override {}
private:
- virtual void ReceivedEvent(Event* event) override {
+ void ReceivedEvent(Event* event) override {
TestEventHandler::ReceivedEvent(event);
delete dispatcher_delegate_;
}
@@ -155,10 +155,10 @@
class InvalidateTargetEventHandler : public TestEventHandler {
public:
explicit InvalidateTargetEventHandler(int id) : TestEventHandler(id) {}
- virtual ~InvalidateTargetEventHandler() {}
+ ~InvalidateTargetEventHandler() override {}
private:
- virtual void ReceivedEvent(Event* event) override {
+ void ReceivedEvent(Event* event) override {
TestEventHandler::ReceivedEvent(event);
TestTarget* target = static_cast<TestTarget*>(event->target());
target->set_valid(false);
@@ -177,7 +177,7 @@
dispatcher_delegate_(NULL) {
}
- virtual ~EventHandlerDestroyer() {
+ ~EventHandlerDestroyer() override {
CHECK(!to_destroy_);
}
@@ -186,7 +186,7 @@
}
private:
- virtual void ReceivedEvent(Event* event) override {
+ void ReceivedEvent(Event* event) override {
TestEventHandler::ReceivedEvent(event);
delete to_destroy_;
to_destroy_ = NULL;
@@ -207,7 +207,7 @@
public:
TestEventDispatcher() {}
- virtual ~TestEventDispatcher() {}
+ ~TestEventDispatcher() override {}
EventDispatchDetails ProcessEvent(EventTarget* target, Event* event) {
return DispatchEvent(target, event);
@@ -215,7 +215,7 @@
private:
// Overridden from EventDispatcherDelegate:
- virtual bool CanDispatchToTarget(EventTarget* target) override {
+ bool CanDispatchToTarget(EventTarget* target) override {
TestTarget* test_target = static_cast<TestTarget*>(target);
return test_target->valid();
}
diff --git a/ui/events/event_processor_unittest.cc b/ui/events/event_processor_unittest.cc
index 33a8162..90b2ad9 100644
--- a/ui/events/event_processor_unittest.cc
+++ b/ui/events/event_processor_unittest.cc
@@ -20,10 +20,10 @@
class EventProcessorTest : public testing::Test {
public:
EventProcessorTest() {}
- virtual ~EventProcessorTest() {}
+ ~EventProcessorTest() override {}
// testing::Test:
- virtual void SetUp() override {
+ void SetUp() override {
processor_.SetRoot(scoped_ptr<EventTarget>(new TestEventTarget()));
processor_.Reset();
root()->SetEventTargeter(make_scoped_ptr(new EventTargeter()));
@@ -78,7 +78,7 @@
class BoundsTestTarget : public TestEventTarget {
public:
BoundsTestTarget() {}
- virtual ~BoundsTestTarget() {}
+ ~BoundsTestTarget() override {}
void set_bounds(gfx::Rect rect) { bounds_ = rect; }
gfx::Rect bounds() const { return bounds_; }
@@ -106,8 +106,8 @@
private:
// EventTarget:
- virtual void ConvertEventToTarget(EventTarget* target,
- LocatedEvent* event) override {
+ void ConvertEventToTarget(EventTarget* target,
+ LocatedEvent* event) override {
event->ConvertLocationToTarget(this,
static_cast<BoundsTestTarget*>(target));
}
@@ -182,10 +182,10 @@
public:
ReDispatchEventHandler(EventProcessor* processor, EventTarget* target)
: processor_(processor), expected_target_(target) {}
- virtual ~ReDispatchEventHandler() {}
+ ~ReDispatchEventHandler() override {}
// TestEventHandler:
- virtual void OnMouseEvent(MouseEvent* event) override {
+ void OnMouseEvent(MouseEvent* event) override {
TestEventHandler::OnMouseEvent(event);
EXPECT_EQ(expected_target_, event->target());
@@ -322,11 +322,11 @@
class IgnoreEventTargeter : public EventTargeter {
public:
IgnoreEventTargeter() {}
- virtual ~IgnoreEventTargeter() {}
+ ~IgnoreEventTargeter() override {}
private:
// EventTargeter:
- virtual bool SubtreeShouldBeExploredForEvent(
+ bool SubtreeShouldBeExploredForEvent(
EventTarget* target, const LocatedEvent& event) override {
return false;
}
@@ -364,16 +364,16 @@
public:
explicit BubblingEventTargeter(TestEventTarget* initial_target)
: initial_target_(initial_target) {}
- virtual ~BubblingEventTargeter() {}
+ ~BubblingEventTargeter() override {}
private:
// EventTargeter:
- virtual EventTarget* FindTargetForEvent(EventTarget* root,
+ EventTarget* FindTargetForEvent(EventTarget* root,
Event* event) override {
return initial_target_;
}
- virtual EventTarget* FindNextBestTarget(EventTarget* previous_target,
+ EventTarget* FindNextBestTarget(EventTarget* previous_target,
Event* event) override {
return previous_target->GetParentTarget();
}
diff --git a/ui/events/event_rewriter_unittest.cc b/ui/events/event_rewriter_unittest.cc
index 08e592f..3129ae3 100644
--- a/ui/events/event_rewriter_unittest.cc
+++ b/ui/events/event_rewriter_unittest.cc
@@ -22,7 +22,7 @@
public:
explicit TestEvent(EventType type)
: Event(type, base::TimeDelta(), 0), unique_id_(next_unique_id_++) {}
- virtual ~TestEvent() {}
+ ~TestEvent() override {}
int unique_id() const { return unique_id_; }
private:
@@ -38,14 +38,14 @@
class TestEventRewriteProcessor : public test::TestEventProcessor {
public:
TestEventRewriteProcessor() {}
- virtual ~TestEventRewriteProcessor() { CheckAllReceived(); }
+ ~TestEventRewriteProcessor() override { CheckAllReceived(); }
void AddExpectedEvent(EventType type) { expected_events_.push_back(type); }
// Test that all expected events have been received.
void CheckAllReceived() { EXPECT_TRUE(expected_events_.empty()); }
// EventProcessor:
- virtual EventDispatchDetails OnEventFromSource(Event* event) override {
+ EventDispatchDetails OnEventFromSource(Event* event) override {
EXPECT_FALSE(expected_events_.empty());
EXPECT_EQ(expected_events_.front(), event->type());
expected_events_.pop_front();
@@ -62,7 +62,7 @@
public:
explicit TestEventRewriteSource(EventProcessor* processor)
: processor_(processor) {}
- virtual EventProcessor* GetEventProcessor() override { return processor_; }
+ EventProcessor* GetEventProcessor() override { return processor_; }
void Send(EventType type) {
scoped_ptr<Event> event(new TestEvent(type));
(void)SendEventToProcessor(event.get());
@@ -83,16 +83,15 @@
CHECK_NE(EVENT_REWRITE_DISPATCH_ANOTHER, status);
}
- virtual EventRewriteStatus RewriteEvent(const Event& event,
- scoped_ptr<Event>* rewritten_event)
+ EventRewriteStatus RewriteEvent(const Event& event,
+ scoped_ptr<Event>* rewritten_event)
override {
if (status_ == EVENT_REWRITE_REWRITTEN)
rewritten_event->reset(new TestEvent(type_));
return status_;
}
- virtual EventRewriteStatus NextDispatchEvent(const Event& last_event,
- scoped_ptr<Event>* new_event)
- override {
+ EventRewriteStatus NextDispatchEvent(const Event& last_event,
+ scoped_ptr<Event>* new_event) override {
NOTREACHED();
return status_;
}
@@ -113,9 +112,8 @@
rules_.insert(std::pair<RewriteCase, RewriteResult>(
RewriteCase(from_state, from_type), r));
}
- virtual EventRewriteStatus RewriteEvent(const Event& event,
- scoped_ptr<Event>* rewritten_event)
- override {
+ EventRewriteStatus RewriteEvent(const Event& event,
+ scoped_ptr<Event>* rewritten_event) override {
RewriteRules::iterator find =
rules_.find(RewriteCase(state_, event.type()));
if (find == rules_.end())
@@ -130,9 +128,8 @@
state_ = find->second.state;
return find->second.status;
}
- virtual EventRewriteStatus NextDispatchEvent(const Event& last_event,
- scoped_ptr<Event>* new_event)
- override {
+ EventRewriteStatus NextDispatchEvent(const Event& last_event,
+ scoped_ptr<Event>* new_event) override {
EXPECT_TRUE(last_rewritten_event_);
const TestEvent* arg_last = static_cast<const TestEvent*>(&last_event);
EXPECT_EQ(last_rewritten_event_->unique_id(), arg_last->unique_id());
diff --git a/ui/events/gesture_detection/gesture_provider_unittest.cc b/ui/events/gesture_detection/gesture_provider_unittest.cc
index da305ff..bf483ef 100644
--- a/ui/events/gesture_detection/gesture_provider_unittest.cc
+++ b/ui/events/gesture_detection/gesture_provider_unittest.cc
@@ -58,7 +58,7 @@
class GestureProviderTest : public testing::Test, public GestureProviderClient {
public:
GestureProviderTest() {}
- virtual ~GestureProviderTest() {}
+ ~GestureProviderTest() override {}
static MockMotionEvent ObtainMotionEvent(base::TimeTicks event_time,
MotionEvent::Action action,
@@ -123,15 +123,15 @@
}
// Test
- virtual void SetUp() override { SetUpWithConfig(GetDefaultConfig()); }
+ void SetUp() override { SetUpWithConfig(GetDefaultConfig()); }
- virtual void TearDown() override {
+ void TearDown() override {
gestures_.clear();
gesture_provider_.reset();
}
// GestureProviderClient
- virtual void OnGestureEvent(const GestureEventData& gesture) override {
+ void OnGestureEvent(const GestureEventData& gesture) override {
if (gesture.type() == ET_GESTURE_SCROLL_BEGIN)
active_scroll_begin_event_.reset(new GestureEventData(gesture));
gestures_.push_back(gesture);
diff --git a/ui/events/gesture_detection/motion_event_buffer_unittest.cc b/ui/events/gesture_detection/motion_event_buffer_unittest.cc
index badbd98..0b77dfe 100644
--- a/ui/events/gesture_detection/motion_event_buffer_unittest.cc
+++ b/ui/events/gesture_detection/motion_event_buffer_unittest.cc
@@ -41,14 +41,14 @@
public MotionEventBufferClient {
public:
MotionEventBufferTest() : needs_flush_(false) {}
- virtual ~MotionEventBufferTest() {}
+ ~MotionEventBufferTest() override {}
// MotionEventBufferClient implementation.
- virtual void ForwardMotionEvent(const MotionEvent& event) override {
+ void ForwardMotionEvent(const MotionEvent& event) override {
forwarded_events_.push_back(event.Clone().release());
}
- virtual void SetNeedsFlush() override { needs_flush_ = true; }
+ void SetNeedsFlush() override { needs_flush_ = true; }
bool GetAndResetNeedsFlush() {
bool needs_flush = needs_flush_;
diff --git a/ui/events/gesture_detection/touch_disposition_gesture_filter_unittest.cc b/ui/events/gesture_detection/touch_disposition_gesture_filter_unittest.cc
index d8a2551..fa31056 100644
--- a/ui/events/gesture_detection/touch_disposition_gesture_filter_unittest.cc
+++ b/ui/events/gesture_detection/touch_disposition_gesture_filter_unittest.cc
@@ -23,20 +23,20 @@
public:
TouchDispositionGestureFilterTest()
: cancel_after_next_gesture_(false), sent_gesture_count_(0) {}
- virtual ~TouchDispositionGestureFilterTest() {}
+ ~TouchDispositionGestureFilterTest() override {}
// testing::Test
- virtual void SetUp() override {
+ void SetUp() override {
queue_.reset(new TouchDispositionGestureFilter(this));
touch_event_.set_flags(kDefaultEventFlags);
}
- virtual void TearDown() override {
+ void TearDown() override {
queue_.reset();
}
// TouchDispositionGestureFilterClient
- virtual void ForwardGestureEvent(const GestureEventData& event) override {
+ void ForwardGestureEvent(const GestureEventData& event) override {
++sent_gesture_count_;
last_sent_gesture_.reset(new GestureEventData(event));
sent_gestures_.push_back(event.type());
diff --git a/ui/events/gesture_detection/velocity_tracker_unittest.cc b/ui/events/gesture_detection/velocity_tracker_unittest.cc
index 9b45053..c5cf15c 100644
--- a/ui/events/gesture_detection/velocity_tracker_unittest.cc
+++ b/ui/events/gesture_detection/velocity_tracker_unittest.cc
@@ -43,7 +43,7 @@
class VelocityTrackerTest : public testing::Test {
public:
VelocityTrackerTest() {}
- virtual ~VelocityTrackerTest() {}
+ ~VelocityTrackerTest() override {}
protected:
static MockMotionEvent Sample(MotionEvent::Action action,
diff --git a/ui/events/gestures/gesture_provider_impl.h b/ui/events/gestures/gesture_provider_impl.h
index 118c78b..fd907e1 100644
--- a/ui/events/gestures/gesture_provider_impl.h
+++ b/ui/events/gestures/gesture_provider_impl.h
@@ -27,7 +27,7 @@
class EVENTS_EXPORT GestureProviderImpl : public GestureProviderClient {
public:
GestureProviderImpl(GestureProviderImplClient* client);
- virtual ~GestureProviderImpl();
+ ~GestureProviderImpl() override;
bool OnTouchEvent(const TouchEvent& event);
void OnTouchEventAck(bool event_consumed);
@@ -35,7 +35,7 @@
ScopedVector<GestureEvent>* GetAndResetPendingGestures();
// GestureProviderClient implementation
- virtual void OnGestureEvent(const GestureEventData& gesture) override;
+ void OnGestureEvent(const GestureEventData& gesture) override;
private:
bool IsConsideredDoubleTap(const GestureEventData& previous_tap,
diff --git a/ui/events/gestures/gesture_provider_impl_unittest.cc b/ui/events/gestures/gesture_provider_impl_unittest.cc
index 66cc808..fadedc1 100644
--- a/ui/events/gestures/gesture_provider_impl_unittest.cc
+++ b/ui/events/gestures/gesture_provider_impl_unittest.cc
@@ -15,15 +15,15 @@
public:
GestureProviderImplTest() {}
- virtual ~GestureProviderImplTest() {}
+ ~GestureProviderImplTest() override {}
- virtual void OnGestureEvent(GestureEvent* event) override {}
+ void OnGestureEvent(GestureEvent* event) override {}
- virtual void SetUp() override {
+ void SetUp() override {
provider_.reset(new GestureProviderImpl(this));
}
- virtual void TearDown() override { provider_.reset(); }
+ void TearDown() override { provider_.reset(); }
GestureProviderImpl* provider() { return provider_.get(); }
diff --git a/ui/events/gestures/gesture_recognizer_impl.h b/ui/events/gestures/gesture_recognizer_impl.h
index d87045a..9957356 100644
--- a/ui/events/gestures/gesture_recognizer_impl.h
+++ b/ui/events/gestures/gesture_recognizer_impl.h
@@ -31,22 +31,22 @@
typedef std::map<int, GestureConsumer*> TouchIdToConsumerMap;
GestureRecognizerImpl();
- virtual ~GestureRecognizerImpl();
+ ~GestureRecognizerImpl() override;
std::vector<GestureEventHelper*>& helpers() { return helpers_; }
// Overridden from GestureRecognizer
- virtual GestureConsumer* GetTouchLockedTarget(
+ GestureConsumer* GetTouchLockedTarget(
const TouchEvent& event) override;
- virtual GestureConsumer* GetTargetForGestureEvent(
+ GestureConsumer* GetTargetForGestureEvent(
const GestureEvent& event) override;
- virtual GestureConsumer* GetTargetForLocation(
+ GestureConsumer* GetTargetForLocation(
const gfx::PointF& location, int source_device_id) override;
- virtual void TransferEventsTo(GestureConsumer* current_consumer,
- GestureConsumer* new_consumer) override;
- virtual bool GetLastTouchPointForTarget(GestureConsumer* consumer,
- gfx::PointF* point) override;
- virtual bool CancelActiveTouches(GestureConsumer* consumer) override;
+ void TransferEventsTo(GestureConsumer* current_consumer,
+ GestureConsumer* new_consumer) override;
+ bool GetLastTouchPointForTarget(GestureConsumer* consumer,
+ gfx::PointF* point) override;
+ bool CancelActiveTouches(GestureConsumer* consumer) override;
protected:
virtual GestureProviderImpl* GetGestureProviderForConsumer(
@@ -59,26 +59,25 @@
void DispatchGestureEvent(GestureEvent* event);
// Overridden from GestureRecognizer
- virtual bool ProcessTouchEventPreDispatch(const TouchEvent& event,
- GestureConsumer* consumer) override;
+ bool ProcessTouchEventPreDispatch(const TouchEvent& event,
+ GestureConsumer* consumer) override;
- virtual Gestures* ProcessTouchEventPostDispatch(
+ Gestures* ProcessTouchEventPostDispatch(
const TouchEvent& event,
ui::EventResult result,
GestureConsumer* consumer) override;
- virtual Gestures* ProcessTouchEventOnAsyncAck(
+ Gestures* ProcessTouchEventOnAsyncAck(
const TouchEvent& event,
ui::EventResult result,
GestureConsumer* consumer) override;
- virtual bool CleanupStateForConsumer(GestureConsumer* consumer)
- override;
- virtual void AddGestureEventHelper(GestureEventHelper* helper) override;
- virtual void RemoveGestureEventHelper(GestureEventHelper* helper) override;
+ bool CleanupStateForConsumer(GestureConsumer* consumer) override;
+ void AddGestureEventHelper(GestureEventHelper* helper) override;
+ void RemoveGestureEventHelper(GestureEventHelper* helper) override;
// Overridden from GestureProviderImplClient
- virtual void OnGestureEvent(GestureEvent* event) override;
+ void OnGestureEvent(GestureEvent* event) override;
// Convenience method to find the GestureEventHelper that can dispatch events
// to a specific |consumer|.
diff --git a/ui/events/gestures/motion_event_impl.h b/ui/events/gestures/motion_event_impl.h
index cac09e8..e2b90a2 100644
--- a/ui/events/gestures/motion_event_impl.h
+++ b/ui/events/gestures/motion_event_impl.h
@@ -19,31 +19,31 @@
class EVENTS_EXPORT MotionEventImpl : public MotionEvent {
public:
MotionEventImpl();
- virtual ~MotionEventImpl();
+ ~MotionEventImpl() override;
void OnTouch(const TouchEvent& touch);
// MotionEvent implementation.
- virtual int GetId() const override;
- virtual Action GetAction() const override;
- virtual int GetActionIndex() const override;
- virtual size_t GetPointerCount() const override;
- virtual int GetPointerId(size_t pointer_index) const override;
- virtual float GetX(size_t pointer_index) const override;
- virtual float GetY(size_t pointer_index) const override;
- virtual float GetRawX(size_t pointer_index) const override;
- virtual float GetRawY(size_t pointer_index) const override;
- virtual float GetTouchMajor(size_t pointer_index) const override;
- virtual float GetTouchMinor(size_t pointer_index) const override;
- virtual float GetOrientation(size_t pointer_index) const override;
- virtual float GetPressure(size_t pointer_index) const override;
- virtual ToolType GetToolType(size_t pointer_index) const override;
- virtual int GetButtonState() const override;
- virtual int GetFlags() const override;
- virtual base::TimeTicks GetEventTime() const override;
+ int GetId() const override;
+ Action GetAction() const override;
+ int GetActionIndex() const override;
+ size_t GetPointerCount() const override;
+ int GetPointerId(size_t pointer_index) const override;
+ float GetX(size_t pointer_index) const override;
+ float GetY(size_t pointer_index) const override;
+ float GetRawX(size_t pointer_index) const override;
+ float GetRawY(size_t pointer_index) const override;
+ float GetTouchMajor(size_t pointer_index) const override;
+ float GetTouchMinor(size_t pointer_index) const override;
+ float GetOrientation(size_t pointer_index) const override;
+ float GetPressure(size_t pointer_index) const override;
+ ToolType GetToolType(size_t pointer_index) const override;
+ int GetButtonState() const override;
+ int GetFlags() const override;
+ base::TimeTicks GetEventTime() const override;
- virtual scoped_ptr<MotionEvent> Clone() const override;
- virtual scoped_ptr<MotionEvent> Cancel() const override;
+ scoped_ptr<MotionEvent> Clone() const override;
+ scoped_ptr<MotionEvent> Cancel() const override;
int GetSourceDeviceId(size_t pointer_index) const;
diff --git a/ui/events/platform/platform_event_builder_x_unittest.cc b/ui/events/platform/platform_event_builder_x_unittest.cc
index ad0d438..40b4f40 100644
--- a/ui/events/platform/platform_event_builder_x_unittest.cc
+++ b/ui/events/platform/platform_event_builder_x_unittest.cc
@@ -16,7 +16,7 @@
class PlatformEventBuilderXTest : public testing::Test {
public:
PlatformEventBuilderXTest() {}
- virtual ~PlatformEventBuilderXTest() {}
+ ~PlatformEventBuilderXTest() override {}
void SetUp() override {
DeviceDataManagerX11::CreateInstance();
diff --git a/ui/events/platform/platform_event_source_unittest.cc b/ui/events/platform/platform_event_source_unittest.cc
index cc34960..cc305cb 100644
--- a/ui/events/platform/platform_event_source_unittest.cc
+++ b/ui/events/platform/platform_event_source_unittest.cc
@@ -48,7 +48,7 @@
TestPlatformEventSource()
: stop_stream_(false) {
}
- virtual ~TestPlatformEventSource() {}
+ ~TestPlatformEventSource() override {}
uint32_t Dispatch(const PlatformEvent& event) { return DispatchEvent(event); }
@@ -65,7 +65,7 @@
}
// PlatformEventSource:
- virtual void StopCurrentEventStream() override {
+ void StopCurrentEventStream() override {
stop_stream_ = true;
}
@@ -83,7 +83,7 @@
stop_stream_(false) {
PlatformEventSource::GetInstance()->AddPlatformEventDispatcher(this);
}
- virtual ~TestPlatformEventDispatcher() {
+ ~TestPlatformEventDispatcher() override {
PlatformEventSource::GetInstance()->RemovePlatformEventDispatcher(this);
}
@@ -93,11 +93,11 @@
protected:
// PlatformEventDispatcher:
- virtual bool CanDispatchEvent(const PlatformEvent& event) override {
+ bool CanDispatchEvent(const PlatformEvent& event) override {
return true;
}
- virtual uint32_t DispatchEvent(const PlatformEvent& event) override {
+ uint32_t DispatchEvent(const PlatformEvent& event) override {
list_->push_back(id_);
return post_dispatch_action_;
}
@@ -117,17 +117,17 @@
: id_(id), list_(list) {
PlatformEventSource::GetInstance()->AddPlatformEventObserver(this);
}
- virtual ~TestPlatformEventObserver() {
+ ~TestPlatformEventObserver() override {
PlatformEventSource::GetInstance()->RemovePlatformEventObserver(this);
}
protected:
// PlatformEventObserver:
- virtual void WillProcessEvent(const PlatformEvent& event) override {
+ void WillProcessEvent(const PlatformEvent& event) override {
list_->push_back(id_);
}
- virtual void DidProcessEvent(const PlatformEvent& event) override {}
+ void DidProcessEvent(const PlatformEvent& event) override {}
private:
int id_;
@@ -139,13 +139,13 @@
class PlatformEventTest : public testing::Test {
public:
PlatformEventTest() {}
- virtual ~PlatformEventTest() {}
+ ~PlatformEventTest() override {}
TestPlatformEventSource* source() { return source_.get(); }
protected:
// testing::Test:
- virtual void SetUp() override {
+ void SetUp() override {
source_.reset(new TestPlatformEventSource());
}
@@ -334,7 +334,7 @@
public:
RunCallbackDuringDispatch(int id, std::vector<int>* list)
: TestPlatformEventDispatcher(id, list) {}
- virtual ~RunCallbackDuringDispatch() {}
+ ~RunCallbackDuringDispatch() override {}
void set_callback(const base::Closure& callback) {
callback_ = callback;
@@ -342,7 +342,7 @@
protected:
// PlatformEventDispatcher:
- virtual uint32_t DispatchEvent(const PlatformEvent& event) override {
+ uint32_t DispatchEvent(const PlatformEvent& event) override {
if (!callback_.is_null())
callback_.Run();
return TestPlatformEventDispatcher::DispatchEvent(event);
@@ -497,7 +497,7 @@
class PlatformEventTestWithMessageLoop : public PlatformEventTest {
public:
PlatformEventTestWithMessageLoop() {}
- virtual ~PlatformEventTestWithMessageLoop() {}
+ ~PlatformEventTestWithMessageLoop() override {}
void Run() {
message_loop_.PostTask(
@@ -530,7 +530,7 @@
: public PlatformEventTestWithMessageLoop {
public:
// PlatformEventTestWithMessageLoop:
- virtual void RunTestImpl() override {
+ void RunTestImpl() override {
std::vector<int> list;
TestPlatformEventDispatcher dispatcher(10, &list);
TestPlatformEventObserver observer(15, &list);
@@ -569,7 +569,7 @@
public:
DestroyScopedHandleDispatcher(int id, std::vector<int>* list)
: TestPlatformEventDispatcher(id, list) {}
- virtual ~DestroyScopedHandleDispatcher() {}
+ ~DestroyScopedHandleDispatcher() override {}
void SetScopedHandle(scoped_ptr<ScopedEventDispatcher> handler) {
handler_ = handler.Pass();
@@ -581,11 +581,11 @@
private:
// PlatformEventDispatcher:
- virtual bool CanDispatchEvent(const PlatformEvent& event) override {
+ bool CanDispatchEvent(const PlatformEvent& event) override {
return true;
}
- virtual uint32_t DispatchEvent(const PlatformEvent& event) override {
+ uint32_t DispatchEvent(const PlatformEvent& event) override {
handler_.reset();
uint32_t action = TestPlatformEventDispatcher::DispatchEvent(event);
if (!callback_.is_null()) {
@@ -640,7 +640,7 @@
}
// PlatformEventTestWithMessageLoop:
- virtual void RunTestImpl() override {
+ void RunTestImpl() override {
std::vector<int> list;
TestPlatformEventDispatcher dispatcher(10, &list);
TestPlatformEventObserver observer(15, &list);
@@ -740,7 +740,7 @@
}
// PlatformEventTestWithMessageLoop:
- virtual void RunTestImpl() override {
+ void RunTestImpl() override {
std::vector<int> list;
TestPlatformEventDispatcher dispatcher(10, &list);
TestPlatformEventObserver observer(15, &list);
diff --git a/ui/events/platform/x11/device_data_manager_x11.h b/ui/events/platform/x11/device_data_manager_x11.h
index 9f064f2..801b1c5 100644
--- a/ui/events/platform/x11/device_data_manager_x11.h
+++ b/ui/events/platform/x11/device_data_manager_x11.h
@@ -238,7 +238,7 @@
private:
DeviceDataManagerX11();
- virtual ~DeviceDataManagerX11();
+ ~DeviceDataManagerX11() override;
// Initialize the XInput related system information.
bool InitializeXInputInternal();
diff --git a/ui/events/platform/x11/platform_event_utils_x_unittest.cc b/ui/events/platform/x11/platform_event_utils_x_unittest.cc
index 1d89404..cba2844 100644
--- a/ui/events/platform/x11/platform_event_utils_x_unittest.cc
+++ b/ui/events/platform/x11/platform_event_utils_x_unittest.cc
@@ -85,9 +85,9 @@
class PlatformEventUtilsXTest : public testing::Test {
public:
PlatformEventUtilsXTest() {}
- virtual ~PlatformEventUtilsXTest() {}
+ ~PlatformEventUtilsXTest() override {}
- virtual void SetUp() override {
+ void SetUp() override {
DeviceDataManagerX11::CreateInstance();
ui::TouchFactory::GetInstance()->ResetForTest();
}
diff --git a/ui/events/platform/x11/x11_event_source.h b/ui/events/platform/x11/x11_event_source.h
index 206ca5a..6501eb7 100644
--- a/ui/events/platform/x11/x11_event_source.h
+++ b/ui/events/platform/x11/x11_event_source.h
@@ -24,7 +24,7 @@
class EVENTS_EXPORT X11EventSource : public PlatformEventSource {
public:
explicit X11EventSource(XDisplay* display);
- virtual ~X11EventSource();
+ ~X11EventSource() override;
static X11EventSource* GetInstance();
@@ -48,8 +48,8 @@
private:
// PlatformEventSource:
- virtual uint32_t DispatchEvent(XEvent* xevent) override;
- virtual void StopCurrentEventStream() override;
+ uint32_t DispatchEvent(XEvent* xevent) override;
+ void StopCurrentEventStream() override;
// The connection to the X11 server used to receive the events.
XDisplay* display_;
diff --git a/ui/events/platform/x11/x11_event_source_libevent.cc b/ui/events/platform/x11/x11_event_source_libevent.cc
index 8ad7931..0df1977 100644
--- a/ui/events/platform/x11/x11_event_source_libevent.cc
+++ b/ui/events/platform/x11/x11_event_source_libevent.cc
@@ -22,7 +22,7 @@
AddEventWatcher();
}
- virtual ~X11EventSourceLibevent() {
+ ~X11EventSourceLibevent() override {
}
private:
@@ -39,16 +39,16 @@
}
// PlatformEventSource:
- virtual void OnDispatcherListChanged() override {
+ void OnDispatcherListChanged() override {
AddEventWatcher();
}
// base::MessagePumpLibevent::Watcher:
- virtual void OnFileCanReadWithoutBlocking(int fd) override {
+ void OnFileCanReadWithoutBlocking(int fd) override {
DispatchXEvents();
}
- virtual void OnFileCanWriteWithoutBlocking(int fd) override {
+ void OnFileCanWriteWithoutBlocking(int fd) override {
NOTREACHED();
}
diff --git a/ui/gfx/animation/animation.h b/ui/gfx/animation/animation.h
index 81e8e2b..d7d7d3a 100644
--- a/ui/gfx/animation/animation.h
+++ b/ui/gfx/animation/animation.h
@@ -82,7 +82,7 @@
// AnimationContainer::Element overrides
void SetStartTime(base::TimeTicks start_time) override;
- virtual void Step(base::TimeTicks time_now) = 0;
+ void Step(base::TimeTicks time_now) override = 0;
base::TimeDelta GetTimerInterval() const override;
private:
diff --git a/ui/gl/android/surface_texture.cc b/ui/gl/android/surface_texture.cc
index bf9012a..a9f52dc 100644
--- a/ui/gl/android/surface_texture.cc
+++ b/ui/gl/android/surface_texture.cc
@@ -87,19 +87,6 @@
env->ReleaseFloatArrayElements(jmatrix.obj(), elements, JNI_ABORT);
}
-void SurfaceTexture::SetDefaultBufferSize(int width, int height) {
- JNIEnv* env = base::android::AttachCurrentThread();
-
- if (width > 0 && height > 0) {
- Java_SurfaceTexturePlatformWrapper_setDefaultBufferSize(
- env, j_surface_texture_.obj(), static_cast<jint>(width),
- static_cast<jint>(height));
- } else {
- LOG(WARNING) << "Not setting surface texture buffer size - "
- "width or height is 0";
- }
-}
-
void SurfaceTexture::AttachToGLContext() {
if (GlContextMethodsAvailable()) {
int texture_id;
diff --git a/ui/gl/android/surface_texture.h b/ui/gl/android/surface_texture.h
index 05bc5a3..b22e5c4 100644
--- a/ui/gl/android/surface_texture.h
+++ b/ui/gl/android/surface_texture.h
@@ -46,9 +46,6 @@
// texture image set by the most recent call to updateTexImage.
void GetTransformMatrix(float mtx[16]);
- // Set the default size of the image buffers.
- void SetDefaultBufferSize(int width, int height);
-
// Attach the SurfaceTexture to the texture currently bound to
// GL_TEXTURE_EXTERNAL_OES.
void AttachToGLContext();
diff --git a/ui/gl/gl_context_egl.cc b/ui/gl/gl_context_egl.cc
index 5fa2c44..950558b 100644
--- a/ui/gl/gl_context_egl.cc
+++ b/ui/gl/gl_context_egl.cc
@@ -4,6 +4,7 @@
#include "ui/gl/gl_context_egl.h"
+#include "base/command_line.h"
#include "base/logging.h"
#include "base/memory/scoped_ptr.h"
#include "base/trace_event/trace_event.h"
@@ -38,12 +39,18 @@
DCHECK(compatible_surface);
DCHECK(!context_);
- static const EGLint kContextAttributes[] = {
- EGL_CONTEXT_CLIENT_VERSION, 2,
+ EGLint context_client_version = 2;
+ if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kEnableUnsafeES3APIs)) {
+ context_client_version = 3;
+ }
+
+ const EGLint kContextAttributes[] = {
+ EGL_CONTEXT_CLIENT_VERSION, context_client_version,
EGL_NONE
};
- static const EGLint kContextRobustnessAttributes[] = {
- EGL_CONTEXT_CLIENT_VERSION, 2,
+ const EGLint kContextRobustnessAttributes[] = {
+ EGL_CONTEXT_CLIENT_VERSION, context_client_version,
EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT,
EGL_LOSE_CONTEXT_ON_RESET_EXT,
EGL_NONE
diff --git a/ui/gl/gl_image_memory.cc b/ui/gl/gl_image_memory.cc
index 6b9a519..ca106b7 100644
--- a/ui/gl/gl_image_memory.cc
+++ b/ui/gl/gl_image_memory.cc
@@ -183,30 +183,6 @@
return false;
}
-// static
-bool GLImageMemory::ValidSize(const gfx::Size& size,
- gfx::GpuMemoryBuffer::Format format) {
- switch (format) {
- case gfx::GpuMemoryBuffer::ATC:
- case gfx::GpuMemoryBuffer::ATCIA:
- case gfx::GpuMemoryBuffer::DXT1:
- case gfx::GpuMemoryBuffer::DXT5:
- case gfx::GpuMemoryBuffer::ETC1:
- // Compressed images must have a width and height that's evenly divisible
- // by the block size.
- return size.width() % 4 == 0 && size.height() % 4 == 0;
- case gfx::GpuMemoryBuffer::RGBA_8888:
- case gfx::GpuMemoryBuffer::BGRA_8888:
- return true;
- case gfx::GpuMemoryBuffer::RGBX_8888:
- NOTREACHED();
- return false;
- }
-
- NOTREACHED();
- return false;
-}
-
bool GLImageMemory::Initialize(const unsigned char* memory,
gfx::GpuMemoryBuffer::Format format) {
if (!ValidInternalFormat(internalformat_)) {
@@ -221,6 +197,8 @@
DCHECK(memory);
DCHECK(!memory_);
+ DCHECK_IMPLIES(IsCompressedFormat(format), size_.width() % 4 == 0);
+ DCHECK_IMPLIES(IsCompressedFormat(format), size_.height() % 4 == 0);
memory_ = memory;
format_ = format;
return true;
diff --git a/ui/gl/gl_image_memory.h b/ui/gl/gl_image_memory.h
index befc3a8..a50a380 100644
--- a/ui/gl/gl_image_memory.h
+++ b/ui/gl/gl_image_memory.h
@@ -26,9 +26,6 @@
gfx::GpuMemoryBuffer::Format format,
size_t* stride_in_bytes);
- static bool ValidSize(const gfx::Size& size,
- gfx::GpuMemoryBuffer::Format format);
-
bool Initialize(const unsigned char* memory,
gfx::GpuMemoryBuffer::Format format);
diff --git a/ui/gl/gl_image_shared_memory.cc b/ui/gl/gl_image_shared_memory.cc
index 363ebf5..d9e31a7 100644
--- a/ui/gl/gl_image_shared_memory.cc
+++ b/ui/gl/gl_image_shared_memory.cc
@@ -18,9 +18,6 @@
if (size.IsEmpty())
return false;
- if (!GLImageMemory::ValidSize(size, format))
- return false;
-
size_t stride_in_bytes = 0;
if (!GLImageMemory::StrideInBytes(size.width(), format, &stride_in_bytes))
return false;
diff --git a/ui/gl/gl_surface.h b/ui/gl/gl_surface.h
index 48d7cd2..da70422 100644
--- a/ui/gl/gl_surface.h
+++ b/ui/gl/gl_surface.h
@@ -156,6 +156,15 @@
static scoped_refptr<GLSurface> CreateViewGLSurface(
gfx::AcceleratedWidget window);
+#if defined(USE_OZONE)
+ // Create a GL surface that renders directly into a window with surfaceless
+ // semantics - there is no default framebuffer and the primary surface must
+ // be presented as an overlay. If surfaceless mode is not supported or
+ // enabled it will return a null pointer.
+ static scoped_refptr<GLSurface> CreateSurfacelessViewGLSurface(
+ gfx::AcceleratedWidget window);
+#endif // defined(USE_OZONE)
+
// Create a GL surface used for offscreen rendering.
static scoped_refptr<GLSurface> CreateOffscreenGLSurface(
const gfx::Size& size);
diff --git a/ui/gl/gl_surface_egl.cc b/ui/gl/gl_surface_egl.cc
index 2dcdc88..61c3c05 100644
--- a/ui/gl/gl_surface_egl.cc
+++ b/ui/gl/gl_surface_egl.cc
@@ -37,6 +37,10 @@
#define EGL_FIXED_SIZE_ANGLE 0x3201
#endif
+#if !defined(EGL_OPENGL_ES3_BIT)
+#define EGL_OPENGL_ES3_BIT 0x00000040
+#endif
+
#if defined(OS_WIN)
// From ANGLE's egl/eglext.h.
@@ -172,13 +176,18 @@
// Choose an EGL configuration.
// On X this is only used for PBuffer surfaces.
- static const EGLint kConfigAttribs[] = {
+ EGLint renderable_type = EGL_OPENGL_ES2_BIT;
+ if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kEnableUnsafeES3APIs)) {
+ renderable_type = EGL_OPENGL_ES3_BIT;
+ }
+ const EGLint kConfigAttribs[] = {
EGL_BUFFER_SIZE, 32,
EGL_ALPHA_SIZE, 8,
EGL_BLUE_SIZE, 8,
EGL_GREEN_SIZE, 8,
EGL_RED_SIZE, 8,
- EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
+ EGL_RENDERABLE_TYPE, renderable_type,
EGL_SURFACE_TYPE, EGL_WINDOW_BIT | EGL_PBUFFER_BIT,
EGL_NONE
};
diff --git a/ui/gl/gl_surface_ozone.cc b/ui/gl/gl_surface_ozone.cc
index cba706b..47ea8d6 100644
--- a/ui/gl/gl_surface_ozone.cc
+++ b/ui/gl/gl_surface_ozone.cc
@@ -4,16 +4,20 @@
#include "ui/gl/gl_surface.h"
+#include "base/bind.h"
#include "base/logging.h"
#include "base/memory/ref_counted.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/gl/gl_context.h"
#include "ui/gl/gl_image.h"
+#include "ui/gl/gl_image_linux_dma_buffer.h"
#include "ui/gl/gl_implementation.h"
#include "ui/gl/gl_surface_egl.h"
#include "ui/gl/gl_surface_osmesa.h"
#include "ui/gl/gl_surface_stub.h"
+#include "ui/gl/scoped_binders.h"
#include "ui/gl/scoped_make_current.h"
+#include "ui/ozone/public/native_pixmap.h"
#include "ui/ozone/public/surface_factory_ozone.h"
#include "ui/ozone/public/surface_ozone_egl.h"
@@ -157,15 +161,15 @@
return SwapBuffersAsync(callback);
}
- private:
+ protected:
~GLSurfaceOzoneSurfaceless() override {
Destroy(); // EGL surface must be destroyed before SurfaceOzone
}
bool Flush() {
glFlush();
- // TODO: the following should be replaced by a per surface flush as it gets
- // implemented in GL drivers.
+ // TODO: crbug.com/462360 the following should be replaced by a per surface
+ // flush as it gets implemented in GL drivers.
if (has_implicit_external_sync_) {
const EGLint attrib_list[] = {
EGL_SYNC_CONDITION_KHR,
@@ -182,6 +186,8 @@
} else {
return false;
}
+ } else if (ozone_surface_->IsUniversalDisplayLinkDevice()) {
+ glFinish();
}
return true;
}
@@ -194,6 +200,157 @@
DISALLOW_COPY_AND_ASSIGN(GLSurfaceOzoneSurfaceless);
};
+// This provides surface-like semantics implemented through surfaceless.
+// A framebuffer is bound automatically.
+class GL_EXPORT GLSurfaceOzoneSurfacelessSurfaceImpl
+ : public GLSurfaceOzoneSurfaceless {
+ public:
+ GLSurfaceOzoneSurfacelessSurfaceImpl(
+ scoped_ptr<ui::SurfaceOzoneEGL> ozone_surface,
+ AcceleratedWidget widget)
+ : GLSurfaceOzoneSurfaceless(ozone_surface.Pass(), widget),
+ fbo_(0),
+ current_surface_(0) {
+ for (auto& texture : textures_)
+ texture = 0;
+ }
+
+ unsigned int GetBackingFrameBufferObject() override { return fbo_; }
+
+ bool OnMakeCurrent(GLContext* context) override {
+ if (!fbo_) {
+ glGenFramebuffersEXT(1, &fbo_);
+ if (!fbo_)
+ return false;
+ glGenTextures(arraysize(textures_), textures_);
+ if (!CreatePixmaps())
+ return false;
+ }
+ BindFramebuffer();
+ glBindFramebufferEXT(GL_FRAMEBUFFER, fbo_);
+ return SurfacelessEGL::OnMakeCurrent(context);
+ }
+
+ bool Resize(const gfx::Size& size) override {
+ if (size == GetSize())
+ return true;
+ return GLSurfaceOzoneSurfaceless::Resize(size) && CreatePixmaps();
+ }
+
+ bool SupportsPostSubBuffer() override { return false; }
+
+ bool SwapBuffers() override {
+ if (!images_[current_surface_]->ScheduleOverlayPlane(
+ widget_, 0, OverlayTransform::OVERLAY_TRANSFORM_NONE,
+ gfx::Rect(GetSize()), gfx::RectF(1, 1)))
+ return false;
+ if (!GLSurfaceOzoneSurfaceless::SwapBuffers())
+ return false;
+ current_surface_ ^= 1;
+ BindFramebuffer();
+ return true;
+ }
+
+ bool SwapBuffersAsync(const SwapCompletionCallback& callback) override {
+ if (!images_[current_surface_]->ScheduleOverlayPlane(
+ widget_, 0, OverlayTransform::OVERLAY_TRANSFORM_NONE,
+ gfx::Rect(GetSize()), gfx::RectF(1, 1)))
+ return false;
+ if (!GLSurfaceOzoneSurfaceless::SwapBuffersAsync(callback))
+ return false;
+ current_surface_ ^= 1;
+ BindFramebuffer();
+ return true;
+ }
+
+ void Destroy() override {
+ GLContext* current_context = GLContext::GetCurrent();
+ DCHECK(current_context && current_context->IsCurrent(this));
+ glBindFramebufferEXT(GL_FRAMEBUFFER, 0);
+ if (fbo_) {
+ glDeleteTextures(arraysize(textures_), textures_);
+ for (auto& texture : textures_)
+ texture = 0;
+ glDeleteFramebuffersEXT(1, &fbo_);
+ fbo_ = 0;
+ }
+ for (auto image : images_) {
+ if (image)
+ image->Destroy(true);
+ }
+ }
+
+ private:
+ class SurfaceImage : public GLImageLinuxDMABuffer {
+ public:
+ SurfaceImage(const gfx::Size& size, unsigned internalformat)
+ : GLImageLinuxDMABuffer(size, internalformat) {}
+
+ bool Initialize(scoped_refptr<ui::NativePixmap> pixmap,
+ gfx::GpuMemoryBuffer::Format format) {
+ base::FileDescriptor handle(pixmap->GetDmaBufFd(), false);
+ if (!GLImageLinuxDMABuffer::Initialize(handle, format,
+ pixmap->GetDmaBufPitch()))
+ return false;
+ pixmap_ = pixmap;
+ return true;
+ }
+ bool ScheduleOverlayPlane(gfx::AcceleratedWidget widget,
+ int z_order,
+ gfx::OverlayTransform transform,
+ const gfx::Rect& bounds_rect,
+ const gfx::RectF& crop_rect) override {
+ return ui::SurfaceFactoryOzone::GetInstance()->ScheduleOverlayPlane(
+ widget, z_order, transform, pixmap_, bounds_rect, crop_rect);
+ }
+
+ private:
+ ~SurfaceImage() override {}
+
+ scoped_refptr<ui::NativePixmap> pixmap_;
+ };
+
+ ~GLSurfaceOzoneSurfacelessSurfaceImpl() override {
+ DCHECK(!fbo_);
+ for (size_t i = 0; i < arraysize(textures_); i++)
+ DCHECK(!textures_[i]) << "texture " << i << " not released";
+ }
+
+ void BindFramebuffer() {
+ ScopedFrameBufferBinder fb(fbo_);
+ glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
+ GL_TEXTURE_2D, textures_[current_surface_], 0);
+ }
+
+ bool CreatePixmaps() {
+ if (!fbo_)
+ return true;
+ for (size_t i = 0; i < arraysize(textures_); i++) {
+ scoped_refptr<ui::NativePixmap> pixmap =
+ ui::SurfaceFactoryOzone::GetInstance()->CreateNativePixmap(
+ widget_, GetSize(), ui::SurfaceFactoryOzone::RGBA_8888,
+ ui::SurfaceFactoryOzone::SCANOUT);
+ if (!pixmap)
+ return false;
+ scoped_refptr<SurfaceImage> image = new SurfaceImage(GetSize(), GL_RGBA);
+ if (!image->Initialize(pixmap, gfx::GpuMemoryBuffer::Format::BGRA_8888))
+ return false;
+ images_[i] = image;
+ // Bind image to texture.
+ ScopedTextureBinder binder(GL_TEXTURE_2D, textures_[i]);
+ if (!images_[i]->BindTexImage(GL_TEXTURE_2D))
+ return false;
+ }
+ return true;
+ }
+
+ GLuint fbo_;
+ GLuint textures_[2];
+ scoped_refptr<GLImage> images_[2];
+ int current_surface_;
+ DISALLOW_COPY_AND_ASSIGN(GLSurfaceOzoneSurfacelessSurfaceImpl);
+};
+
} // namespace
// static
@@ -215,6 +372,27 @@
}
// static
+scoped_refptr<GLSurface> GLSurface::CreateSurfacelessViewGLSurface(
+ gfx::AcceleratedWidget window) {
+ if (GetGLImplementation() == kGLImplementationEGLGLES2 &&
+ window != kNullAcceleratedWidget &&
+ GLSurfaceEGL::IsEGLSurfacelessContextSupported() &&
+ ui::SurfaceFactoryOzone::GetInstance()->CanShowPrimaryPlaneAsOverlay()) {
+ scoped_ptr<ui::SurfaceOzoneEGL> surface_ozone =
+ ui::SurfaceFactoryOzone::GetInstance()
+ ->CreateSurfacelessEGLSurfaceForWidget(window);
+ if (!surface_ozone)
+ return nullptr;
+ scoped_refptr<GLSurface> surface;
+ surface = new GLSurfaceOzoneSurfaceless(surface_ozone.Pass(), window);
+ if (surface->Initialize())
+ return surface;
+ }
+
+ return nullptr;
+}
+
+// static
scoped_refptr<GLSurface> GLSurface::CreateViewGLSurface(
gfx::AcceleratedWidget window) {
if (GetGLImplementation() == kGLImplementationOSMesaGL) {
@@ -234,7 +412,8 @@
->CreateSurfacelessEGLSurfaceForWidget(window);
if (!surface_ozone)
return NULL;
- surface = new GLSurfaceOzoneSurfaceless(surface_ozone.Pass(), window);
+ surface = new GLSurfaceOzoneSurfacelessSurfaceImpl(surface_ozone.Pass(),
+ window);
} else {
scoped_ptr<ui::SurfaceOzoneEGL> surface_ozone =
ui::SurfaceFactoryOzone::GetInstance()->CreateEGLSurfaceForWidget(
diff --git a/ui/gl/gl_switches.cc b/ui/gl/gl_switches.cc
index 479ff69..8817156 100644
--- a/ui/gl/gl_switches.cc
+++ b/ui/gl/gl_switches.cc
@@ -58,6 +58,9 @@
// On Windows only: use the WARP software rasterizer in the GPU process.
const char kUseWarp[] = "use-warp";
+// Enable OpenGL ES 3 APIs without proper service side validation.
+const char kEnableUnsafeES3APIs[] = "enable-unsafe-es3-apis";
+
// Disables GL drawing operations which produce pixel output. With this
// the GL output will not be correct but tests will run faster.
const char kDisableGLDrawingForTests[] = "disable-gl-drawing-for-tests";
@@ -74,6 +77,7 @@
kDisableD3D11,
kEnableGPUServiceLogging,
kEnableGPUServiceTracing,
+ kEnableUnsafeES3APIs,
kGpuNoContextLost,
kDisableGLDrawingForTests,
kOverrideUseGLWithOSMesaForTests,
diff --git a/ui/gl/gl_switches.h b/ui/gl/gl_switches.h
index ce27df0..0715ad9 100644
--- a/ui/gl/gl_switches.h
+++ b/ui/gl/gl_switches.h
@@ -36,6 +36,7 @@
GL_EXPORT extern const char kTestGLLib[];
GL_EXPORT extern const char kUseGpuInTests[];
GL_EXPORT extern const char kUseWarp[];
+GL_EXPORT extern const char kEnableUnsafeES3APIs[];
// These flags are used by the test harness code, not passed in by users.
GL_EXPORT extern const char kDisableGLDrawingForTests[];
diff --git a/ui/gl/gpu_timing.cc b/ui/gl/gpu_timing.cc
index 22a4a64..a3b697f 100644
--- a/ui/gl/gpu_timing.cc
+++ b/ui/gl/gpu_timing.cc
@@ -30,6 +30,17 @@
return new GPUTimingClient(this);
}
+uint32_t GPUTiming::GetDisjointCount() {
+ if (timer_type_ == kTimerTypeDisjoint) {
+ GLint disjoint_value = 0;
+ glGetIntegerv(GL_GPU_DISJOINT_EXT, &disjoint_value);
+ if (disjoint_value) {
+ disjoint_counter_++;
+ }
+ }
+ return disjoint_counter_;
+}
+
GPUTimer::~GPUTimer() {
glDeleteQueriesARB(2, queries_);
}
@@ -87,6 +98,7 @@
: gpu_timing_(gpu_timing) {
if (gpu_timing) {
timer_type_ = gpu_timing->GetTimerType();
+ disjoint_counter_ = gpu_timing_->GetDisjointCount();
}
}
@@ -111,12 +123,13 @@
bool GPUTimingClient::CheckAndResetTimerErrors() {
if (timer_type_ == GPUTiming::kTimerTypeDisjoint) {
- GLint disjoint_value = 0;
- glGetIntegerv(GL_GPU_DISJOINT_EXT, &disjoint_value);
- return disjoint_value != 0;
- } else {
- return false;
+ DCHECK(gpu_timing_ != nullptr);
+ const uint32_t total_disjoint_count = gpu_timing_->GetDisjointCount();
+ const bool disjoint_triggered = total_disjoint_count != disjoint_counter_;
+ disjoint_counter_ = total_disjoint_count;
+ return disjoint_triggered;
}
+ return false;
}
int64 GPUTimingClient::CalculateTimerOffset() {
diff --git a/ui/gl/gpu_timing.h b/ui/gl/gpu_timing.h
index 9702fe1..1c8f8cf 100644
--- a/ui/gl/gpu_timing.h
+++ b/ui/gl/gpu_timing.h
@@ -52,6 +52,7 @@
};
TimerType GetTimerType() const { return timer_type_; }
+ uint32_t GetDisjointCount();
private:
friend struct base::DefaultDeleter<GPUTiming>;
@@ -62,6 +63,7 @@
scoped_refptr<GPUTimingClient> CreateGPUTimingClient();
TimerType timer_type_ = kTimerTypeInvalid;
+ uint32_t disjoint_counter_ = 0;
DISALLOW_COPY_AND_ASSIGN(GPUTiming);
};
@@ -125,6 +127,7 @@
GPUTiming* gpu_timing_;
GPUTiming::TimerType timer_type_ = GPUTiming::kTimerTypeInvalid;
int64 offset_ = 0; // offset cache when timer_type_ == kTimerTypeARB
+ uint32_t disjoint_counter_ = 0;
bool offset_valid_ = false;
base::Callback<int64(void)> cpu_time_for_testing_;
diff --git a/ui/platform_window/x11/x11_window.h b/ui/platform_window/x11/x11_window.h
index 6e1184c..eb75912 100644
--- a/ui/platform_window/x11/x11_window.h
+++ b/ui/platform_window/x11/x11_window.h
@@ -21,7 +21,7 @@
public PlatformEventDispatcher {
public:
explicit X11Window(PlatformWindowDelegate* delegate);
- virtual ~X11Window();
+ ~X11Window() override;
private:
void Destroy();
@@ -29,23 +29,23 @@
void ProcessXInput2Event(XEvent* xevent);
// PlatformWindow:
- virtual void Show() override;
- virtual void Hide() override;
- virtual void Close() override;
- virtual void SetBounds(const gfx::Rect& bounds) override;
- virtual gfx::Rect GetBounds() override;
- virtual void SetCapture() override;
- virtual void ReleaseCapture() override;
- virtual void ToggleFullscreen() override;
- virtual void Maximize() override;
- virtual void Minimize() override;
- virtual void Restore() override;
- virtual void SetCursor(PlatformCursor cursor) override;
- virtual void MoveCursorTo(const gfx::Point& location) override;
+ void Show() override;
+ void Hide() override;
+ void Close() override;
+ void SetBounds(const gfx::Rect& bounds) override;
+ gfx::Rect GetBounds() override;
+ void SetCapture() override;
+ void ReleaseCapture() override;
+ void ToggleFullscreen() override;
+ void Maximize() override;
+ void Minimize() override;
+ void Restore() override;
+ void SetCursor(PlatformCursor cursor) override;
+ void MoveCursorTo(const gfx::Point& location) override;
// PlatformEventDispatcher:
- virtual bool CanDispatchEvent(const PlatformEvent& event) override;
- virtual uint32_t DispatchEvent(const PlatformEvent& event) override;
+ bool CanDispatchEvent(const PlatformEvent& event) override;
+ uint32_t DispatchEvent(const PlatformEvent& event) override;
PlatformWindowDelegate* delegate_;