Update from https://crrev.com/307664
This includes changes to the following:
mojo/tools/roll/cc_strip_video.patch due to
https://codereview.chromium.org/786583002 (renaming files)
ui/compositor/compositor.h due to https://codereview.chromium.org/783373002
(adding a parameter to ApplyViewportDeltas)
services/surfaces/surfaces_scheduler due to
https://codereview.chromium.org/767083005 (renaming a method)
TBR=jamesr@chromium.org
Review URL: https://codereview.chromium.org/787803004
diff --git a/DEPS b/DEPS
index 3ff8a41..22f9112 100644
--- a/DEPS
+++ b/DEPS
@@ -22,11 +22,11 @@
'libcxx_revision': '48198f9110397fff47fe7c37cbfa296be7d44d3d',
'libcxxabi_revision': '4ad1009ab3a59fa7a6896d74d5e4de5885697f95',
'sfntly_revision': '1bdaae8fc788a5ac8936d68bf24f37d977a13dac',
- 'skia_revision': 'cf56009d9058d25933d9840bf6cf9fdf6a80f647',
+ 'skia_revision': 'f9d09c969f8ffa664bc5cd40a71077e3dc46e0aa',
# 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': '4f77f25857dd9ca5b51749006d6183c3eeb2d49b',
+ 'v8_revision': '49dd4474ba5b874fd2ac982be8c34d09052dcd85',
# Three lines of non-changing comments so that
# the commit queue can handle CLs rolling ANGLE
# and whatever else without interference from each other.
@@ -34,7 +34,7 @@
# 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': '535aff24c308a715751028173e569596bcfe12a7',
+ 'buildtools_revision': '05dd6a24723170d7c6ff35b537ee02947f619891',
# Three lines of non-changing comments so that
# the commit queue can handle CLs rolling PDFium
# and whatever else without interference from each other.
@@ -42,7 +42,7 @@
# Three lines of non-changing comments so that
# the commit queue can handle CLs rolling BoringSSL
# and whatever else without interference from each other.
- 'boringssl_revision': '00505ec2e1e4c3047b4f61a306f2ac1372fa7640',
+ 'boringssl_revision': '306e520cda7d2f0afee9ba634dae629f994b096c',
# Three lines of non-changing comments so that
# the commit queue can handle CLs rolling lss
# and whatever else without interference from each other.
diff --git a/base/android/java/src/org/chromium/base/TraceEvent.java b/base/android/java/src/org/chromium/base/TraceEvent.java
index 1c7e534..164ccf8 100644
--- a/base/android/java/src/org/chromium/base/TraceEvent.java
+++ b/base/android/java/src/org/chromium/base/TraceEvent.java
@@ -221,15 +221,6 @@
}
/**
- * Convenience wrapper around the versions of startAsync() that take string parameters.
- * @param id The id of the asynchronous event.
- * @see #begin()
- */
- public static void startAsync(long id) {
- if (sEnabled) nativeStartAsync(getCallerName(), id, null);
- }
-
- /**
* Triggers the 'start' native trace event with no arguments.
* @param name The name of the event.
* @param id The id of the asynchronous event.
@@ -249,15 +240,6 @@
}
/**
- * Convenience wrapper around the versions of finishAsync() that take string parameters.
- * @param id The id of the asynchronous event.
- * @see #begin()
- */
- public static void finishAsync(long id) {
- if (sEnabled) nativeFinishAsync(getCallerName(), id, null);
- }
-
- /**
* Triggers the 'finish' native trace event with no arguments.
* @param name The name of the event.
* @param id The id of the asynchronous event.
diff --git a/base/id_map.h b/base/id_map.h
index 9cbc1f8..852c138 100644
--- a/base/id_map.h
+++ b/base/id_map.h
@@ -53,13 +53,14 @@
Releaser<OS, 0>::release_all(&data_);
}
- // Sets whether Add should CHECK if passed in NULL data. Default is false.
+ // Sets whether Add and Replace should DCHECK if passed in NULL data.
+ // Default is false.
void set_check_on_null_data(bool value) { check_on_null_data_ = value; }
// Adds a view with an automatically generated unique ID. See AddWithID.
KeyType Add(T* data) {
DCHECK(CalledOnValidThread());
- CHECK(!check_on_null_data_ || data);
+ DCHECK(!check_on_null_data_ || data);
KeyType this_id = next_id_;
DCHECK(data_.find(this_id) == data_.end()) << "Inserting duplicate item";
data_[this_id] = data;
@@ -73,7 +74,7 @@
// two methods may not be mixed, or duplicate IDs may be generated
void AddWithID(T* data, KeyType id) {
DCHECK(CalledOnValidThread());
- CHECK(!check_on_null_data_ || data);
+ DCHECK(!check_on_null_data_ || data);
DCHECK(data_.find(id) == data_.end()) << "Inserting duplicate item";
data_[id] = data;
}
@@ -94,6 +95,25 @@
}
}
+ // Replaces the value for |id| with |new_data| and returns a pointer to the
+ // existing value. If there is no entry for |id|, the map is not altered and
+ // nullptr is returned. The OwnershipSemantics of the map have no effect on
+ // how the existing value is treated, the IDMap does not delete the existing
+ // value being replaced.
+ T* Replace(KeyType id, T* new_data) {
+ DCHECK(CalledOnValidThread());
+ DCHECK(!check_on_null_data_ || new_data);
+ typename HashTable::iterator i = data_.find(id);
+ if (i == data_.end()) {
+ NOTREACHED() << "Attempting to replace an item not in the list";
+ return nullptr;
+ }
+
+ T* temp = i->second;
+ i->second = new_data;
+ return temp;
+ }
+
void Clear() {
DCHECK(CalledOnValidThread());
if (iteration_depth_ == 0) {
diff --git a/base/id_map_unittest.cc b/base/id_map_unittest.cc
index c005a69..a9fb2b9 100644
--- a/base/id_map_unittest.cc
+++ b/base/id_map_unittest.cc
@@ -53,6 +53,9 @@
EXPECT_EQ(&obj1, map.Lookup(1));
EXPECT_EQ(&obj2, map.Lookup(2));
+ EXPECT_EQ(&obj2, map.Replace(2, &obj1));
+ EXPECT_EQ(&obj1, map.Lookup(2));
+
EXPECT_EQ(0, map.iteration_depth());
}
diff --git a/base/strings/string_util_unittest.cc b/base/strings/string_util_unittest.cc
index f29baac..923116d 100644
--- a/base/strings/string_util_unittest.cc
+++ b/base/strings/string_util_unittest.cc
@@ -494,10 +494,10 @@
const char chars_with_nul[] = "test\0string";
const int length_with_nul = arraysize(chars_with_nul) - 1;
std::string string_with_nul(chars_with_nul, length_with_nul);
- std::wstring wide_with_nul = ASCIIToWide(string_with_nul);
- EXPECT_EQ(static_cast<std::wstring::size_type>(length_with_nul),
- wide_with_nul.length());
- std::string narrow_with_nul = UTF16ToASCII(WideToUTF16(wide_with_nul));
+ base::string16 string16_with_nul = ASCIIToUTF16(string_with_nul);
+ EXPECT_EQ(static_cast<base::string16::size_type>(length_with_nul),
+ string16_with_nul.length());
+ std::string narrow_with_nul = UTF16ToASCII(string16_with_nul);
EXPECT_EQ(static_cast<std::string::size_type>(length_with_nul),
narrow_with_nul.length());
EXPECT_EQ(0, string_with_nul.compare(narrow_with_nul));
diff --git a/base/strings/utf_string_conversions.cc b/base/strings/utf_string_conversions.cc
index 9796eec..1480d48 100644
--- a/base/strings/utf_string_conversions.cc
+++ b/base/strings/utf_string_conversions.cc
@@ -209,11 +209,6 @@
#endif
-std::wstring ASCIIToWide(const StringPiece& ascii) {
- DCHECK(IsStringASCII(ascii)) << ascii;
- return std::wstring(ascii.begin(), ascii.end());
-}
-
string16 ASCIIToUTF16(const StringPiece& ascii) {
DCHECK(IsStringASCII(ascii)) << ascii;
return string16(ascii.begin(), ascii.end());
diff --git a/base/strings/utf_string_conversions.h b/base/strings/utf_string_conversions.h
index 13e0b71..06a3bc6 100644
--- a/base/strings/utf_string_conversions.h
+++ b/base/strings/utf_string_conversions.h
@@ -39,9 +39,8 @@
std::string* output);
BASE_EXPORT std::string UTF16ToUTF8(const string16& utf16);
-// These convert an ASCII string, typically a hardcoded constant, to a
-// UTF16/Wide string.
-BASE_EXPORT std::wstring ASCIIToWide(const StringPiece& ascii);
+// This converts an ASCII string, typically a hardcoded constant, to a UTF16
+// string.
BASE_EXPORT string16 ASCIIToUTF16(const StringPiece& ascii);
// Converts to 7-bit ASCII by truncating. The result must be known to be ASCII
diff --git a/base/tuple.h b/base/tuple.h
index 12f7f84..16f5124 100644
--- a/base/tuple.h
+++ b/base/tuple.h
@@ -31,6 +31,29 @@
#include "base/bind_helpers.h"
+// Index sequences
+//
+// Minimal clone of the similarly-named C++14 functionality.
+
+template <size_t...>
+struct IndexSequence {};
+
+template <size_t... Ns>
+struct MakeIndexSequenceImpl;
+
+template <size_t... Ns>
+struct MakeIndexSequenceImpl<0, Ns...> {
+ using Type = IndexSequence<Ns...>;
+};
+
+template <size_t N, size_t... Ns>
+struct MakeIndexSequenceImpl<N, Ns...> {
+ using Type = typename MakeIndexSequenceImpl<N - 1, N - 1, Ns...>::Type;
+};
+
+template <size_t N>
+using MakeIndexSequence = typename MakeIndexSequenceImpl<N>::Type;
+
// Traits ----------------------------------------------------------------------
//
// A simple traits class for tuple arguments.
@@ -53,9 +76,6 @@
typedef P& ParamType;
};
-template <class P>
-struct TupleTypes { };
-
// Tuple -----------------------------------------------------------------------
//
// This set of classes is useful for bundling 0 or more heterogeneous data types
@@ -70,73 +90,70 @@
// want filled by the dispatchee, and the tuple is merely a container for that
// output (a "tier"). See MakeRefTuple and its usages.
-struct Tuple0 {
- typedef Tuple0 ValueTuple;
- typedef Tuple0 RefTuple;
- typedef Tuple0 ParamTuple;
-};
+template <typename... Ts>
+struct Tuple;
-template <class A>
-struct Tuple1 {
+template <>
+struct Tuple<> {};
+
+template <typename A>
+struct Tuple<A> {
public:
typedef A TypeA;
- Tuple1() {}
- explicit Tuple1(typename TupleTraits<A>::ParamType a) : a(a) {}
+ Tuple() {}
+ explicit Tuple(typename TupleTraits<A>::ParamType a) : a(a) {}
A a;
};
-template <class A, class B>
-struct Tuple2 {
+template <typename A, typename B>
+struct Tuple<A, B> {
public:
typedef A TypeA;
typedef B TypeB;
- Tuple2() {}
- Tuple2(typename TupleTraits<A>::ParamType a,
- typename TupleTraits<B>::ParamType b)
- : a(a), b(b) {
- }
+ Tuple() {}
+ Tuple(typename TupleTraits<A>::ParamType a,
+ typename TupleTraits<B>::ParamType b)
+ : a(a), b(b) {}
A a;
B b;
};
-template <class A, class B, class C>
-struct Tuple3 {
+template <typename A, typename B, typename C>
+struct Tuple<A, B, C> {
public:
typedef A TypeA;
typedef B TypeB;
typedef C TypeC;
- Tuple3() {}
- Tuple3(typename TupleTraits<A>::ParamType a,
- typename TupleTraits<B>::ParamType b,
- typename TupleTraits<C>::ParamType c)
- : a(a), b(b), c(c){
- }
+ Tuple() {}
+ Tuple(typename TupleTraits<A>::ParamType a,
+ typename TupleTraits<B>::ParamType b,
+ typename TupleTraits<C>::ParamType c)
+ : a(a), b(b), c(c) {}
A a;
B b;
C c;
};
-template <class A, class B, class C, class D>
-struct Tuple4 {
+template <typename A, typename B, typename C, typename D>
+struct Tuple<A, B, C, D> {
public:
typedef A TypeA;
typedef B TypeB;
typedef C TypeC;
typedef D TypeD;
- Tuple4() {}
- Tuple4(typename TupleTraits<A>::ParamType a,
- typename TupleTraits<B>::ParamType b,
- typename TupleTraits<C>::ParamType c,
- typename TupleTraits<D>::ParamType d)
- : a(a), b(b), c(c), d(d) {
- }
+ Tuple() {}
+ Tuple(typename TupleTraits<A>::ParamType a,
+ typename TupleTraits<B>::ParamType b,
+ typename TupleTraits<C>::ParamType c,
+ typename TupleTraits<D>::ParamType d)
+ : a(a), b(b), c(c), d(d) {}
A a;
B b;
@@ -144,8 +161,8 @@
D d;
};
-template <class A, class B, class C, class D, class E>
-struct Tuple5 {
+template <typename A, typename B, typename C, typename D, typename E>
+struct Tuple<A, B, C, D, E> {
public:
typedef A TypeA;
typedef B TypeB;
@@ -153,14 +170,13 @@
typedef D TypeD;
typedef E TypeE;
- Tuple5() {}
- Tuple5(typename TupleTraits<A>::ParamType a,
- typename TupleTraits<B>::ParamType b,
- typename TupleTraits<C>::ParamType c,
- typename TupleTraits<D>::ParamType d,
- typename TupleTraits<E>::ParamType e)
- : a(a), b(b), c(c), d(d), e(e) {
- }
+ Tuple() {}
+ Tuple(typename TupleTraits<A>::ParamType a,
+ typename TupleTraits<B>::ParamType b,
+ typename TupleTraits<C>::ParamType c,
+ typename TupleTraits<D>::ParamType d,
+ typename TupleTraits<E>::ParamType e)
+ : a(a), b(b), c(c), d(d), e(e) {}
A a;
B b;
@@ -169,8 +185,13 @@
E e;
};
-template <class A, class B, class C, class D, class E, class F>
-struct Tuple6 {
+template <typename A,
+ typename B,
+ typename C,
+ typename D,
+ typename E,
+ typename F>
+struct Tuple<A, B, C, D, E, F> {
public:
typedef A TypeA;
typedef B TypeB;
@@ -179,15 +200,14 @@
typedef E TypeE;
typedef F TypeF;
- Tuple6() {}
- Tuple6(typename TupleTraits<A>::ParamType a,
- typename TupleTraits<B>::ParamType b,
- typename TupleTraits<C>::ParamType c,
- typename TupleTraits<D>::ParamType d,
- typename TupleTraits<E>::ParamType e,
- typename TupleTraits<F>::ParamType f)
- : a(a), b(b), c(c), d(d), e(e), f(f) {
- }
+ Tuple() {}
+ Tuple(typename TupleTraits<A>::ParamType a,
+ typename TupleTraits<B>::ParamType b,
+ typename TupleTraits<C>::ParamType c,
+ typename TupleTraits<D>::ParamType d,
+ typename TupleTraits<E>::ParamType e,
+ typename TupleTraits<F>::ParamType f)
+ : a(a), b(b), c(c), d(d), e(e), f(f) {}
A a;
B b;
@@ -197,8 +217,14 @@
F f;
};
-template <class A, class B, class C, class D, class E, class F, class G>
-struct Tuple7 {
+template <typename A,
+ typename B,
+ typename C,
+ typename D,
+ typename E,
+ typename F,
+ typename G>
+struct Tuple<A, B, C, D, E, F, G> {
public:
typedef A TypeA;
typedef B TypeB;
@@ -208,16 +234,15 @@
typedef F TypeF;
typedef G TypeG;
- Tuple7() {}
- Tuple7(typename TupleTraits<A>::ParamType a,
- typename TupleTraits<B>::ParamType b,
- typename TupleTraits<C>::ParamType c,
- typename TupleTraits<D>::ParamType d,
- typename TupleTraits<E>::ParamType e,
- typename TupleTraits<F>::ParamType f,
- typename TupleTraits<G>::ParamType g)
- : a(a), b(b), c(c), d(d), e(e), f(f), g(g) {
- }
+ Tuple() {}
+ Tuple(typename TupleTraits<A>::ParamType a,
+ typename TupleTraits<B>::ParamType b,
+ typename TupleTraits<C>::ParamType c,
+ typename TupleTraits<D>::ParamType d,
+ typename TupleTraits<E>::ParamType e,
+ typename TupleTraits<F>::ParamType f,
+ typename TupleTraits<G>::ParamType g)
+ : a(a), b(b), c(c), d(d), e(e), f(f), g(g) {}
A a;
B b;
@@ -228,9 +253,15 @@
G g;
};
-template <class A, class B, class C, class D, class E, class F, class G,
- class H>
-struct Tuple8 {
+template <typename A,
+ typename B,
+ typename C,
+ typename D,
+ typename E,
+ typename F,
+ typename G,
+ typename H>
+struct Tuple<A, B, C, D, E, F, G, H> {
public:
typedef A TypeA;
typedef B TypeB;
@@ -241,17 +272,16 @@
typedef G TypeG;
typedef H TypeH;
- Tuple8() {}
- Tuple8(typename TupleTraits<A>::ParamType a,
- typename TupleTraits<B>::ParamType b,
- typename TupleTraits<C>::ParamType c,
- typename TupleTraits<D>::ParamType d,
- typename TupleTraits<E>::ParamType e,
- typename TupleTraits<F>::ParamType f,
- typename TupleTraits<G>::ParamType g,
- typename TupleTraits<H>::ParamType h)
- : a(a), b(b), c(c), d(d), e(e), f(f), g(g), h(h) {
- }
+ Tuple() {}
+ Tuple(typename TupleTraits<A>::ParamType a,
+ typename TupleTraits<B>::ParamType b,
+ typename TupleTraits<C>::ParamType c,
+ typename TupleTraits<D>::ParamType d,
+ typename TupleTraits<E>::ParamType e,
+ typename TupleTraits<F>::ParamType f,
+ typename TupleTraits<G>::ParamType g,
+ typename TupleTraits<H>::ParamType h)
+ : a(a), b(b), c(c), d(d), e(e), f(f), g(g), h(h) {}
A a;
B b;
@@ -263,157 +293,144 @@
H h;
};
+// Deprecated compat aliases
+
+using Tuple0 = Tuple<>;
+template <typename A>
+using Tuple1 = Tuple<A>;
+template <typename A, typename B>
+using Tuple2 = Tuple<A, B>;
+template <typename A, typename B, typename C>
+using Tuple3 = Tuple<A, B, C>;
+template <typename A, typename B, typename C, typename D>
+using Tuple4 = Tuple<A, B, C, D>;
+template <typename A, typename B, typename C, typename D, typename E>
+using Tuple5 = Tuple<A, B, C, D, E>;
+template <typename A,
+ typename B,
+ typename C,
+ typename D,
+ typename E,
+ typename F>
+using Tuple6 = Tuple<A, B, C, D, E, F>;
+template <typename A,
+ typename B,
+ typename C,
+ typename D,
+ typename E,
+ typename F,
+ typename G>
+using Tuple7 = Tuple<A, B, C, D, E, F, G>;
+template <typename A,
+ typename B,
+ typename C,
+ typename D,
+ typename E,
+ typename F,
+ typename G,
+ typename H>
+using Tuple8 = Tuple<A, B, C, D, E, F, G, H>;
+
+// Tuple element --------------------------------------------------------------
+
+template <size_t N, typename T>
+struct TupleElement;
+
+template <typename T, typename... Ts>
+struct TupleElement<0, Tuple<T, Ts...>> {
+ using Type = T;
+};
+
+template <size_t N, typename T, typename... Ts>
+struct TupleElement<N, Tuple<T, Ts...>> {
+ using Type = typename TupleElement<N - 1, Tuple<Ts...>>::Type;
+};
+
+// Tuple getters --------------------------------------------------------------
+
+template <size_t, typename T>
+struct TupleGetter;
+
+template <typename... Ts>
+struct TupleGetter<0, Tuple<Ts...>> {
+ using Elem = typename TupleElement<0, Tuple<Ts...>>::Type;
+ static Elem& Get(Tuple<Ts...>& t) { return t.a; }
+ static const Elem& Get(const Tuple<Ts...>& t) { return t.a; }
+};
+
+template <typename... Ts>
+struct TupleGetter<1, Tuple<Ts...>> {
+ using Elem = typename TupleElement<1, Tuple<Ts...>>::Type;
+ static Elem& Get(Tuple<Ts...>& t) { return t.b; }
+ static const Elem& Get(const Tuple<Ts...>& t) { return t.b; }
+};
+
+template <typename... Ts>
+struct TupleGetter<2, Tuple<Ts...>> {
+ using Elem = typename TupleElement<2, Tuple<Ts...>>::Type;
+ static Elem& Get(Tuple<Ts...>& t) { return t.c; }
+ static const Elem& Get(const Tuple<Ts...>& t) { return t.c; }
+};
+
+template <typename... Ts>
+struct TupleGetter<3, Tuple<Ts...>> {
+ using Elem = typename TupleElement<3, Tuple<Ts...>>::Type;
+ static Elem& Get(Tuple<Ts...>& t) { return t.d; }
+ static const Elem& Get(const Tuple<Ts...>& t) { return t.d; }
+};
+
+template <typename... Ts>
+struct TupleGetter<4, Tuple<Ts...>> {
+ using Elem = typename TupleElement<4, Tuple<Ts...>>::Type;
+ static Elem& Get(Tuple<Ts...>& t) { return t.e; }
+ static const Elem& Get(const Tuple<Ts...>& t) { return t.e; }
+};
+
+template <typename... Ts>
+struct TupleGetter<5, Tuple<Ts...>> {
+ using Elem = typename TupleElement<5, Tuple<Ts...>>::Type;
+ static Elem& Get(Tuple<Ts...>& t) { return t.f; }
+ static const Elem& Get(const Tuple<Ts...>& t) { return t.f; }
+};
+
+template <typename... Ts>
+struct TupleGetter<6, Tuple<Ts...>> {
+ using Elem = typename TupleElement<6, Tuple<Ts...>>::Type;
+ static Elem& Get(Tuple<Ts...>& t) { return t.g; }
+ static const Elem& Get(const Tuple<Ts...>& t) { return t.g; }
+};
+
+template <typename... Ts>
+struct TupleGetter<7, Tuple<Ts...>> {
+ using Elem = typename TupleElement<7, Tuple<Ts...>>::Type;
+ static Elem& Get(Tuple<Ts...>& t) { return t.h; }
+ static const Elem& Get(const Tuple<Ts...>& t) { return t.h; }
+};
+
+template <size_t I, typename... Ts>
+typename TupleElement<I, Tuple<Ts...>>::Type& get(Tuple<Ts...>& tuple) {
+ return TupleGetter<I, Tuple<Ts...>>::Get(tuple);
+}
+
+template <size_t I, typename... Ts>
+const typename TupleElement<I, Tuple<Ts...>>::Type& get(
+ const Tuple<Ts...>& tuple) {
+ return TupleGetter<I, Tuple<Ts...>>::Get(tuple);
+}
+
// Tuple types ----------------------------------------------------------------
//
// Allows for selection of ValueTuple/RefTuple/ParamTuple without needing the
// definitions of class types the tuple takes as parameters.
-template <>
-struct TupleTypes< Tuple0 > {
- typedef Tuple0 ValueTuple;
- typedef Tuple0 RefTuple;
- typedef Tuple0 ParamTuple;
-};
+template <typename T>
+struct TupleTypes;
-template <class A>
-struct TupleTypes< Tuple1<A> > {
- typedef Tuple1<typename TupleTraits<A>::ValueType> ValueTuple;
- typedef Tuple1<typename TupleTraits<A>::RefType> RefTuple;
- typedef Tuple1<typename TupleTraits<A>::ParamType> ParamTuple;
-};
-
-template <class A, class B>
-struct TupleTypes< Tuple2<A, B> > {
- typedef Tuple2<typename TupleTraits<A>::ValueType,
- typename TupleTraits<B>::ValueType> ValueTuple;
-typedef Tuple2<typename TupleTraits<A>::RefType,
- typename TupleTraits<B>::RefType> RefTuple;
- typedef Tuple2<typename TupleTraits<A>::ParamType,
- typename TupleTraits<B>::ParamType> ParamTuple;
-};
-
-template <class A, class B, class C>
-struct TupleTypes< Tuple3<A, B, C> > {
- typedef Tuple3<typename TupleTraits<A>::ValueType,
- typename TupleTraits<B>::ValueType,
- typename TupleTraits<C>::ValueType> ValueTuple;
-typedef Tuple3<typename TupleTraits<A>::RefType,
- typename TupleTraits<B>::RefType,
- typename TupleTraits<C>::RefType> RefTuple;
- typedef Tuple3<typename TupleTraits<A>::ParamType,
- typename TupleTraits<B>::ParamType,
- typename TupleTraits<C>::ParamType> ParamTuple;
-};
-
-template <class A, class B, class C, class D>
-struct TupleTypes< Tuple4<A, B, C, D> > {
- typedef Tuple4<typename TupleTraits<A>::ValueType,
- typename TupleTraits<B>::ValueType,
- typename TupleTraits<C>::ValueType,
- typename TupleTraits<D>::ValueType> ValueTuple;
-typedef Tuple4<typename TupleTraits<A>::RefType,
- typename TupleTraits<B>::RefType,
- typename TupleTraits<C>::RefType,
- typename TupleTraits<D>::RefType> RefTuple;
- typedef Tuple4<typename TupleTraits<A>::ParamType,
- typename TupleTraits<B>::ParamType,
- typename TupleTraits<C>::ParamType,
- typename TupleTraits<D>::ParamType> ParamTuple;
-};
-
-template <class A, class B, class C, class D, class E>
-struct TupleTypes< Tuple5<A, B, C, D, E> > {
- typedef Tuple5<typename TupleTraits<A>::ValueType,
- typename TupleTraits<B>::ValueType,
- typename TupleTraits<C>::ValueType,
- typename TupleTraits<D>::ValueType,
- typename TupleTraits<E>::ValueType> ValueTuple;
-typedef Tuple5<typename TupleTraits<A>::RefType,
- typename TupleTraits<B>::RefType,
- typename TupleTraits<C>::RefType,
- typename TupleTraits<D>::RefType,
- typename TupleTraits<E>::RefType> RefTuple;
- typedef Tuple5<typename TupleTraits<A>::ParamType,
- typename TupleTraits<B>::ParamType,
- typename TupleTraits<C>::ParamType,
- typename TupleTraits<D>::ParamType,
- typename TupleTraits<E>::ParamType> ParamTuple;
-};
-
-template <class A, class B, class C, class D, class E, class F>
-struct TupleTypes< Tuple6<A, B, C, D, E, F> > {
- typedef Tuple6<typename TupleTraits<A>::ValueType,
- typename TupleTraits<B>::ValueType,
- typename TupleTraits<C>::ValueType,
- typename TupleTraits<D>::ValueType,
- typename TupleTraits<E>::ValueType,
- typename TupleTraits<F>::ValueType> ValueTuple;
-typedef Tuple6<typename TupleTraits<A>::RefType,
- typename TupleTraits<B>::RefType,
- typename TupleTraits<C>::RefType,
- typename TupleTraits<D>::RefType,
- typename TupleTraits<E>::RefType,
- typename TupleTraits<F>::RefType> RefTuple;
- typedef Tuple6<typename TupleTraits<A>::ParamType,
- typename TupleTraits<B>::ParamType,
- typename TupleTraits<C>::ParamType,
- typename TupleTraits<D>::ParamType,
- typename TupleTraits<E>::ParamType,
- typename TupleTraits<F>::ParamType> ParamTuple;
-};
-
-template <class A, class B, class C, class D, class E, class F, class G>
-struct TupleTypes< Tuple7<A, B, C, D, E, F, G> > {
- typedef Tuple7<typename TupleTraits<A>::ValueType,
- typename TupleTraits<B>::ValueType,
- typename TupleTraits<C>::ValueType,
- typename TupleTraits<D>::ValueType,
- typename TupleTraits<E>::ValueType,
- typename TupleTraits<F>::ValueType,
- typename TupleTraits<G>::ValueType> ValueTuple;
-typedef Tuple7<typename TupleTraits<A>::RefType,
- typename TupleTraits<B>::RefType,
- typename TupleTraits<C>::RefType,
- typename TupleTraits<D>::RefType,
- typename TupleTraits<E>::RefType,
- typename TupleTraits<F>::RefType,
- typename TupleTraits<G>::RefType> RefTuple;
- typedef Tuple7<typename TupleTraits<A>::ParamType,
- typename TupleTraits<B>::ParamType,
- typename TupleTraits<C>::ParamType,
- typename TupleTraits<D>::ParamType,
- typename TupleTraits<E>::ParamType,
- typename TupleTraits<F>::ParamType,
- typename TupleTraits<G>::ParamType> ParamTuple;
-};
-
-template <class A, class B, class C, class D, class E, class F, class G,
- class H>
-struct TupleTypes< Tuple8<A, B, C, D, E, F, G, H> > {
- typedef Tuple8<typename TupleTraits<A>::ValueType,
- typename TupleTraits<B>::ValueType,
- typename TupleTraits<C>::ValueType,
- typename TupleTraits<D>::ValueType,
- typename TupleTraits<E>::ValueType,
- typename TupleTraits<F>::ValueType,
- typename TupleTraits<G>::ValueType,
- typename TupleTraits<H>::ValueType> ValueTuple;
-typedef Tuple8<typename TupleTraits<A>::RefType,
- typename TupleTraits<B>::RefType,
- typename TupleTraits<C>::RefType,
- typename TupleTraits<D>::RefType,
- typename TupleTraits<E>::RefType,
- typename TupleTraits<F>::RefType,
- typename TupleTraits<G>::RefType,
- typename TupleTraits<H>::RefType> RefTuple;
- typedef Tuple8<typename TupleTraits<A>::ParamType,
- typename TupleTraits<B>::ParamType,
- typename TupleTraits<C>::ParamType,
- typename TupleTraits<D>::ParamType,
- typename TupleTraits<E>::ParamType,
- typename TupleTraits<F>::ParamType,
- typename TupleTraits<G>::ParamType,
- typename TupleTraits<H>::ParamType> ParamTuple;
+template <typename... Ts>
+struct TupleTypes<Tuple<Ts...>> {
+ using ValueTuple = Tuple<typename TupleTraits<Ts>::ValueType...>;
+ using RefTuple = Tuple<typename TupleTraits<Ts>::RefType...>;
+ using ParamTuple = Tuple<typename TupleTraits<Ts>::ParamType...>;
};
// Tuple creators -------------------------------------------------------------
@@ -421,105 +438,17 @@
// Helper functions for constructing tuples while inferring the template
// argument types.
-inline Tuple0 MakeTuple() {
- return Tuple0();
-}
-
-template <class A>
-inline Tuple1<A> MakeTuple(const A& a) {
- return Tuple1<A>(a);
-}
-
-template <class A, class B>
-inline Tuple2<A, B> MakeTuple(const A& a, const B& b) {
- return Tuple2<A, B>(a, b);
-}
-
-template <class A, class B, class C>
-inline Tuple3<A, B, C> MakeTuple(const A& a, const B& b, const C& c) {
- return Tuple3<A, B, C>(a, b, c);
-}
-
-template <class A, class B, class C, class D>
-inline Tuple4<A, B, C, D> MakeTuple(const A& a, const B& b, const C& c,
- const D& d) {
- return Tuple4<A, B, C, D>(a, b, c, d);
-}
-
-template <class A, class B, class C, class D, class E>
-inline Tuple5<A, B, C, D, E> MakeTuple(const A& a, const B& b, const C& c,
- const D& d, const E& e) {
- return Tuple5<A, B, C, D, E>(a, b, c, d, e);
-}
-
-template <class A, class B, class C, class D, class E, class F>
-inline Tuple6<A, B, C, D, E, F> MakeTuple(const A& a, const B& b, const C& c,
- const D& d, const E& e, const F& f) {
- return Tuple6<A, B, C, D, E, F>(a, b, c, d, e, f);
-}
-
-template <class A, class B, class C, class D, class E, class F, class G>
-inline Tuple7<A, B, C, D, E, F, G> MakeTuple(const A& a, const B& b, const C& c,
- const D& d, const E& e, const F& f,
- const G& g) {
- return Tuple7<A, B, C, D, E, F, G>(a, b, c, d, e, f, g);
-}
-
-template <class A, class B, class C, class D, class E, class F, class G,
- class H>
-inline Tuple8<A, B, C, D, E, F, G, H> MakeTuple(const A& a, const B& b,
- const C& c, const D& d,
- const E& e, const F& f,
- const G& g, const H& h) {
- return Tuple8<A, B, C, D, E, F, G, H>(a, b, c, d, e, f, g, h);
+template <typename... Ts>
+inline Tuple<Ts...> MakeTuple(const Ts&... arg) {
+ return Tuple<Ts...>(arg...);
}
// The following set of helpers make what Boost refers to as "Tiers" - a tuple
// of references.
-template <class A>
-inline Tuple1<A&> MakeRefTuple(A& a) {
- return Tuple1<A&>(a);
-}
-
-template <class A, class B>
-inline Tuple2<A&, B&> MakeRefTuple(A& a, B& b) {
- return Tuple2<A&, B&>(a, b);
-}
-
-template <class A, class B, class C>
-inline Tuple3<A&, B&, C&> MakeRefTuple(A& a, B& b, C& c) {
- return Tuple3<A&, B&, C&>(a, b, c);
-}
-
-template <class A, class B, class C, class D>
-inline Tuple4<A&, B&, C&, D&> MakeRefTuple(A& a, B& b, C& c, D& d) {
- return Tuple4<A&, B&, C&, D&>(a, b, c, d);
-}
-
-template <class A, class B, class C, class D, class E>
-inline Tuple5<A&, B&, C&, D&, E&> MakeRefTuple(A& a, B& b, C& c, D& d, E& e) {
- return Tuple5<A&, B&, C&, D&, E&>(a, b, c, d, e);
-}
-
-template <class A, class B, class C, class D, class E, class F>
-inline Tuple6<A&, B&, C&, D&, E&, F&> MakeRefTuple(A& a, B& b, C& c, D& d, E& e,
- F& f) {
- return Tuple6<A&, B&, C&, D&, E&, F&>(a, b, c, d, e, f);
-}
-
-template <class A, class B, class C, class D, class E, class F, class G>
-inline Tuple7<A&, B&, C&, D&, E&, F&, G&> MakeRefTuple(A& a, B& b, C& c, D& d,
- E& e, F& f, G& g) {
- return Tuple7<A&, B&, C&, D&, E&, F&, G&>(a, b, c, d, e, f, g);
-}
-
-template <class A, class B, class C, class D, class E, class F, class G,
- class H>
-inline Tuple8<A&, B&, C&, D&, E&, F&, G&, H&> MakeRefTuple(A& a, B& b, C& c,
- D& d, E& e, F& f,
- G& g, H& h) {
- return Tuple8<A&, B&, C&, D&, E&, F&, G&, H&>(a, b, c, d, e, f, g, h);
+template <typename... Ts>
+inline Tuple<Ts&...> MakeRefTuple(Ts&... arg) {
+ return Tuple<Ts&...>(arg...);
}
// Dispatchers ----------------------------------------------------------------
@@ -533,759 +462,94 @@
// Non-Static Dispatchers with no out params.
-template <class ObjT, class Method>
-inline void DispatchToMethod(ObjT* obj, Method method, const Tuple0& arg) {
- (obj->*method)();
-}
-
-template <class ObjT, class Method, class A>
+template <typename ObjT, typename Method, typename A>
inline void DispatchToMethod(ObjT* obj, Method method, const A& arg) {
(obj->*method)(base::internal::UnwrapTraits<A>::Unwrap(arg));
}
-template <class ObjT, class Method, class A>
-inline void DispatchToMethod(ObjT* obj, Method method, const Tuple1<A>& arg) {
- (obj->*method)(base::internal::UnwrapTraits<A>::Unwrap(arg.a));
+template <typename ObjT, typename Method, typename... Ts, size_t... Ns>
+inline void DispatchToMethodImpl(ObjT* obj,
+ Method method,
+ const Tuple<Ts...>& arg,
+ IndexSequence<Ns...>) {
+ (obj->*method)(base::internal::UnwrapTraits<Ts>::Unwrap(get<Ns>(arg))...);
}
-template<class ObjT, class Method, class A, class B>
+template <typename ObjT, typename Method, typename... Ts>
inline void DispatchToMethod(ObjT* obj,
Method method,
- const Tuple2<A, B>& arg) {
- (obj->*method)(base::internal::UnwrapTraits<A>::Unwrap(arg.a),
- base::internal::UnwrapTraits<B>::Unwrap(arg.b));
-}
-
-template<class ObjT, class Method, class A, class B, class C>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const Tuple3<A, B, C>& arg) {
- (obj->*method)(base::internal::UnwrapTraits<A>::Unwrap(arg.a),
- base::internal::UnwrapTraits<B>::Unwrap(arg.b),
- base::internal::UnwrapTraits<C>::Unwrap(arg.c));
-}
-
-template<class ObjT, class Method, class A, class B, class C, class D>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const Tuple4<A, B, C, D>& arg) {
- (obj->*method)(base::internal::UnwrapTraits<A>::Unwrap(arg.a),
- base::internal::UnwrapTraits<B>::Unwrap(arg.b),
- base::internal::UnwrapTraits<C>::Unwrap(arg.c),
- base::internal::UnwrapTraits<D>::Unwrap(arg.d));
-}
-
-template<class ObjT, class Method, class A, class B, class C, class D, class E>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const Tuple5<A, B, C, D, E>& arg) {
- (obj->*method)(base::internal::UnwrapTraits<A>::Unwrap(arg.a),
- base::internal::UnwrapTraits<B>::Unwrap(arg.b),
- base::internal::UnwrapTraits<C>::Unwrap(arg.c),
- base::internal::UnwrapTraits<D>::Unwrap(arg.d),
- base::internal::UnwrapTraits<E>::Unwrap(arg.e));
-}
-
-template<class ObjT, class Method, class A, class B, class C, class D, class E,
- class F>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const Tuple6<A, B, C, D, E, F>& arg) {
- (obj->*method)(base::internal::UnwrapTraits<A>::Unwrap(arg.a),
- base::internal::UnwrapTraits<B>::Unwrap(arg.b),
- base::internal::UnwrapTraits<C>::Unwrap(arg.c),
- base::internal::UnwrapTraits<D>::Unwrap(arg.d),
- base::internal::UnwrapTraits<E>::Unwrap(arg.e),
- base::internal::UnwrapTraits<F>::Unwrap(arg.f));
-}
-
-template<class ObjT, class Method, class A, class B, class C, class D, class E,
- class F, class G>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const Tuple7<A, B, C, D, E, F, G>& arg) {
- (obj->*method)(base::internal::UnwrapTraits<A>::Unwrap(arg.a),
- base::internal::UnwrapTraits<B>::Unwrap(arg.b),
- base::internal::UnwrapTraits<C>::Unwrap(arg.c),
- base::internal::UnwrapTraits<D>::Unwrap(arg.d),
- base::internal::UnwrapTraits<E>::Unwrap(arg.e),
- base::internal::UnwrapTraits<F>::Unwrap(arg.f),
- base::internal::UnwrapTraits<G>::Unwrap(arg.g));
-}
-
-template<class ObjT, class Method, class A, class B, class C, class D, class E,
- class F, class G, class H>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const Tuple8<A, B, C, D, E, F, G, H>& arg) {
- (obj->*method)(base::internal::UnwrapTraits<A>::Unwrap(arg.a),
- base::internal::UnwrapTraits<B>::Unwrap(arg.b),
- base::internal::UnwrapTraits<C>::Unwrap(arg.c),
- base::internal::UnwrapTraits<D>::Unwrap(arg.d),
- base::internal::UnwrapTraits<E>::Unwrap(arg.e),
- base::internal::UnwrapTraits<F>::Unwrap(arg.f),
- base::internal::UnwrapTraits<G>::Unwrap(arg.g),
- base::internal::UnwrapTraits<H>::Unwrap(arg.h));
+ const Tuple<Ts...>& arg) {
+ DispatchToMethodImpl(obj, method, arg, MakeIndexSequence<sizeof...(Ts)>());
}
// Static Dispatchers with no out params.
-template <class Function>
-inline void DispatchToFunction(Function function, const Tuple0& arg) {
- (*function)();
+template <typename Function, typename A>
+inline void DispatchToMethod(Function function, const A& arg) {
+ (*function)(base::internal::UnwrapTraits<A>::Unwrap(arg));
}
-template <class Function, class A>
-inline void DispatchToFunction(Function function, const A& arg) {
- (*function)(arg);
+template <typename Function, typename... Ts, size_t... Ns>
+inline void DispatchToFunctionImpl(Function function,
+ const Tuple<Ts...>& arg,
+ IndexSequence<Ns...>) {
+ (*function)(base::internal::UnwrapTraits<Ts>::Unwrap(get<Ns>(arg))...);
}
-template <class Function, class A>
-inline void DispatchToFunction(Function function, const Tuple1<A>& arg) {
- (*function)(base::internal::UnwrapTraits<A>::Unwrap(arg.a));
+template <typename Function, typename... Ts>
+inline void DispatchToFunction(Function function, const Tuple<Ts...>& arg) {
+ DispatchToFunctionImpl(function, arg, MakeIndexSequence<sizeof...(Ts)>());
}
-template<class Function, class A, class B>
-inline void DispatchToFunction(Function function, const Tuple2<A, B>& arg) {
- (*function)(base::internal::UnwrapTraits<A>::Unwrap(arg.a),
- base::internal::UnwrapTraits<B>::Unwrap(arg.b));
+// Dispatchers with out parameters.
+
+template <typename ObjT,
+ typename Method,
+ typename In,
+ typename... OutTs,
+ size_t... OutNs>
+inline void DispatchToMethodImpl(ObjT* obj,
+ Method method,
+ const In& in,
+ Tuple<OutTs...>* out,
+ IndexSequence<OutNs...>) {
+ (obj->*method)(base::internal::UnwrapTraits<In>::Unwrap(in),
+ &get<OutNs>(*out)...);
}
-template<class Function, class A, class B, class C>
-inline void DispatchToFunction(Function function, const Tuple3<A, B, C>& arg) {
- (*function)(base::internal::UnwrapTraits<A>::Unwrap(arg.a),
- base::internal::UnwrapTraits<B>::Unwrap(arg.b),
- base::internal::UnwrapTraits<C>::Unwrap(arg.c));
-}
-
-template<class Function, class A, class B, class C, class D>
-inline void DispatchToFunction(Function function,
- const Tuple4<A, B, C, D>& arg) {
- (*function)(base::internal::UnwrapTraits<A>::Unwrap(arg.a),
- base::internal::UnwrapTraits<B>::Unwrap(arg.b),
- base::internal::UnwrapTraits<C>::Unwrap(arg.c),
- base::internal::UnwrapTraits<D>::Unwrap(arg.d));
-}
-
-template<class Function, class A, class B, class C, class D, class E>
-inline void DispatchToFunction(Function function,
- const Tuple5<A, B, C, D, E>& arg) {
- (*function)(base::internal::UnwrapTraits<A>::Unwrap(arg.a),
- base::internal::UnwrapTraits<B>::Unwrap(arg.b),
- base::internal::UnwrapTraits<C>::Unwrap(arg.c),
- base::internal::UnwrapTraits<D>::Unwrap(arg.d),
- base::internal::UnwrapTraits<E>::Unwrap(arg.e));
-}
-
-template<class Function, class A, class B, class C, class D, class E, class F>
-inline void DispatchToFunction(Function function,
- const Tuple6<A, B, C, D, E, F>& arg) {
- (*function)(base::internal::UnwrapTraits<A>::Unwrap(arg.a),
- base::internal::UnwrapTraits<B>::Unwrap(arg.b),
- base::internal::UnwrapTraits<C>::Unwrap(arg.c),
- base::internal::UnwrapTraits<D>::Unwrap(arg.d),
- base::internal::UnwrapTraits<E>::Unwrap(arg.e),
- base::internal::UnwrapTraits<F>::Unwrap(arg.f));
-}
-
-template<class Function, class A, class B, class C, class D, class E, class F,
- class G>
-inline void DispatchToFunction(Function function,
- const Tuple7<A, B, C, D, E, F, G>& arg) {
- (*function)(base::internal::UnwrapTraits<A>::Unwrap(arg.a),
- base::internal::UnwrapTraits<B>::Unwrap(arg.b),
- base::internal::UnwrapTraits<C>::Unwrap(arg.c),
- base::internal::UnwrapTraits<D>::Unwrap(arg.d),
- base::internal::UnwrapTraits<E>::Unwrap(arg.e),
- base::internal::UnwrapTraits<F>::Unwrap(arg.f),
- base::internal::UnwrapTraits<G>::Unwrap(arg.g));
-}
-
-template<class Function, class A, class B, class C, class D, class E, class F,
- class G, class H>
-inline void DispatchToFunction(Function function,
- const Tuple8<A, B, C, D, E, F, G, H>& arg) {
- (*function)(base::internal::UnwrapTraits<A>::Unwrap(arg.a),
- base::internal::UnwrapTraits<B>::Unwrap(arg.b),
- base::internal::UnwrapTraits<C>::Unwrap(arg.c),
- base::internal::UnwrapTraits<D>::Unwrap(arg.d),
- base::internal::UnwrapTraits<E>::Unwrap(arg.e),
- base::internal::UnwrapTraits<F>::Unwrap(arg.f),
- base::internal::UnwrapTraits<G>::Unwrap(arg.g),
- base::internal::UnwrapTraits<H>::Unwrap(arg.h));
-}
-
-// Dispatchers with 0 out param (as a Tuple0).
-
-template <class ObjT, class Method>
+template <typename ObjT, typename Method, typename In, typename... OutTs>
inline void DispatchToMethod(ObjT* obj,
Method method,
- const Tuple0& arg, Tuple0*) {
- (obj->*method)();
+ const In& in,
+ Tuple<OutTs...>* out) {
+ DispatchToMethodImpl(obj, method, in, out,
+ MakeIndexSequence<sizeof...(OutTs)>());
}
-template <class ObjT, class Method, class A>
-inline void DispatchToMethod(ObjT* obj, Method method, const A& arg, Tuple0*) {
- (obj->*method)(base::internal::UnwrapTraits<A>::Unwrap(arg));
+template <typename ObjT,
+ typename Method,
+ typename... InTs,
+ typename... OutTs,
+ size_t... InNs,
+ size_t... OutNs>
+inline void DispatchToMethodImpl(ObjT* obj,
+ Method method,
+ const Tuple<InTs...>& in,
+ Tuple<OutTs...>* out,
+ IndexSequence<InNs...>,
+ IndexSequence<OutNs...>) {
+ (obj->*method)(base::internal::UnwrapTraits<InTs>::Unwrap(get<InNs>(in))...,
+ &get<OutNs>(*out)...);
}
-template <class ObjT, class Method, class A>
+template <typename ObjT, typename Method, typename... InTs, typename... OutTs>
inline void DispatchToMethod(ObjT* obj,
Method method,
- const Tuple1<A>& arg, Tuple0*) {
- (obj->*method)(base::internal::UnwrapTraits<A>::Unwrap(arg.a));
-}
-
-template<class ObjT, class Method, class A, class B>
-inline void DispatchToMethod(ObjT* obj,
- Method method,
- const Tuple2<A, B>& arg, Tuple0*) {
- (obj->*method)(base::internal::UnwrapTraits<A>::Unwrap(arg.a),
- base::internal::UnwrapTraits<B>::Unwrap(arg.b));
-}
-
-template<class ObjT, class Method, class A, class B, class C>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const Tuple3<A, B, C>& arg, Tuple0*) {
- (obj->*method)(base::internal::UnwrapTraits<A>::Unwrap(arg.a),
- base::internal::UnwrapTraits<B>::Unwrap(arg.b),
- base::internal::UnwrapTraits<C>::Unwrap(arg.c));
-}
-
-template<class ObjT, class Method, class A, class B, class C, class D>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const Tuple4<A, B, C, D>& arg, Tuple0*) {
- (obj->*method)(base::internal::UnwrapTraits<A>::Unwrap(arg.a),
- base::internal::UnwrapTraits<B>::Unwrap(arg.b),
- base::internal::UnwrapTraits<C>::Unwrap(arg.c),
- base::internal::UnwrapTraits<D>::Unwrap(arg.d));
-}
-
-template<class ObjT, class Method, class A, class B, class C, class D, class E>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const Tuple5<A, B, C, D, E>& arg, Tuple0*) {
- (obj->*method)(base::internal::UnwrapTraits<A>::Unwrap(arg.a),
- base::internal::UnwrapTraits<B>::Unwrap(arg.b),
- base::internal::UnwrapTraits<C>::Unwrap(arg.c),
- base::internal::UnwrapTraits<D>::Unwrap(arg.d),
- base::internal::UnwrapTraits<E>::Unwrap(arg.e));
-}
-
-template<class ObjT, class Method, class A, class B, class C, class D, class E,
- class F>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const Tuple6<A, B, C, D, E, F>& arg, Tuple0*) {
- (obj->*method)(base::internal::UnwrapTraits<A>::Unwrap(arg.a),
- base::internal::UnwrapTraits<B>::Unwrap(arg.b),
- base::internal::UnwrapTraits<C>::Unwrap(arg.c),
- base::internal::UnwrapTraits<D>::Unwrap(arg.d),
- base::internal::UnwrapTraits<E>::Unwrap(arg.e),
- base::internal::UnwrapTraits<F>::Unwrap(arg.f));
-}
-
-// Dispatchers with 1 out param.
-
-template<class ObjT, class Method,
- class OutA>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const Tuple0& in,
- Tuple1<OutA>* out) {
- (obj->*method)(&out->a);
-}
-
-template<class ObjT, class Method, class InA,
- class OutA>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const InA& in,
- Tuple1<OutA>* out) {
- (obj->*method)(in, &out->a);
-}
-
-template<class ObjT, class Method, class InA,
- class OutA>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const Tuple1<InA>& in,
- Tuple1<OutA>* out) {
- (obj->*method)(base::internal::UnwrapTraits<InA>::Unwrap(in.a), &out->a);
-}
-
-template<class ObjT, class Method, class InA, class InB,
- class OutA>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const Tuple2<InA, InB>& in,
- Tuple1<OutA>* out) {
- (obj->*method)(base::internal::UnwrapTraits<InA>::Unwrap(in.a),
- base::internal::UnwrapTraits<InB>::Unwrap(in.b),
- &out->a);
-}
-
-template<class ObjT, class Method, class InA, class InB, class InC,
- class OutA>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const Tuple3<InA, InB, InC>& in,
- Tuple1<OutA>* out) {
- (obj->*method)(base::internal::UnwrapTraits<InA>::Unwrap(in.a),
- base::internal::UnwrapTraits<InB>::Unwrap(in.b),
- base::internal::UnwrapTraits<InC>::Unwrap(in.c),
- &out->a);
-}
-
-template<class ObjT, class Method, class InA, class InB, class InC, class InD,
- class OutA>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const Tuple4<InA, InB, InC, InD>& in,
- Tuple1<OutA>* out) {
- (obj->*method)(base::internal::UnwrapTraits<InA>::Unwrap(in.a),
- base::internal::UnwrapTraits<InB>::Unwrap(in.b),
- base::internal::UnwrapTraits<InC>::Unwrap(in.c),
- base::internal::UnwrapTraits<InD>::Unwrap(in.d),
- &out->a);
-}
-
-template<class ObjT, class Method, class InA, class InB, class InC, class InD,
- class InE, class OutA>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const Tuple5<InA, InB, InC, InD, InE>& in,
- Tuple1<OutA>* out) {
- (obj->*method)(base::internal::UnwrapTraits<InA>::Unwrap(in.a),
- base::internal::UnwrapTraits<InB>::Unwrap(in.b),
- base::internal::UnwrapTraits<InC>::Unwrap(in.c),
- base::internal::UnwrapTraits<InD>::Unwrap(in.d),
- base::internal::UnwrapTraits<InE>::Unwrap(in.e),
- &out->a);
-}
-
-template<class ObjT, class Method,
- class InA, class InB, class InC, class InD, class InE, class InF,
- class OutA>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const Tuple6<InA, InB, InC, InD, InE, InF>& in,
- Tuple1<OutA>* out) {
- (obj->*method)(base::internal::UnwrapTraits<InA>::Unwrap(in.a),
- base::internal::UnwrapTraits<InB>::Unwrap(in.b),
- base::internal::UnwrapTraits<InC>::Unwrap(in.c),
- base::internal::UnwrapTraits<InD>::Unwrap(in.d),
- base::internal::UnwrapTraits<InE>::Unwrap(in.e),
- base::internal::UnwrapTraits<InF>::Unwrap(in.f),
- &out->a);
-}
-
-// Dispatchers with 2 out params.
-
-template<class ObjT, class Method,
- class OutA, class OutB>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const Tuple0& in,
- Tuple2<OutA, OutB>* out) {
- (obj->*method)(&out->a, &out->b);
-}
-
-template<class ObjT, class Method, class InA,
- class OutA, class OutB>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const InA& in,
- Tuple2<OutA, OutB>* out) {
- (obj->*method)(in, &out->a, &out->b);
-}
-
-template<class ObjT, class Method, class InA,
- class OutA, class OutB>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const Tuple1<InA>& in,
- Tuple2<OutA, OutB>* out) {
- (obj->*method)(
- base::internal::UnwrapTraits<InA>::Unwrap(in.a), &out->a, &out->b);
-}
-
-template<class ObjT, class Method, class InA, class InB,
- class OutA, class OutB>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const Tuple2<InA, InB>& in,
- Tuple2<OutA, OutB>* out) {
- (obj->*method)(base::internal::UnwrapTraits<InA>::Unwrap(in.a),
- base::internal::UnwrapTraits<InB>::Unwrap(in.b),
- &out->a,
- &out->b);
-}
-
-template<class ObjT, class Method, class InA, class InB, class InC,
- class OutA, class OutB>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const Tuple3<InA, InB, InC>& in,
- Tuple2<OutA, OutB>* out) {
- (obj->*method)(base::internal::UnwrapTraits<InA>::Unwrap(in.a),
- base::internal::UnwrapTraits<InB>::Unwrap(in.b),
- base::internal::UnwrapTraits<InC>::Unwrap(in.c),
- &out->a,
- &out->b);
-}
-
-template<class ObjT, class Method, class InA, class InB, class InC, class InD,
- class OutA, class OutB>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const Tuple4<InA, InB, InC, InD>& in,
- Tuple2<OutA, OutB>* out) {
- (obj->*method)(base::internal::UnwrapTraits<InA>::Unwrap(in.a),
- base::internal::UnwrapTraits<InB>::Unwrap(in.b),
- base::internal::UnwrapTraits<InC>::Unwrap(in.c),
- base::internal::UnwrapTraits<InD>::Unwrap(in.d),
- &out->a,
- &out->b);
-}
-
-template<class ObjT, class Method,
- class InA, class InB, class InC, class InD, class InE,
- class OutA, class OutB>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const Tuple5<InA, InB, InC, InD, InE>& in,
- Tuple2<OutA, OutB>* out) {
- (obj->*method)(base::internal::UnwrapTraits<InA>::Unwrap(in.a),
- base::internal::UnwrapTraits<InB>::Unwrap(in.b),
- base::internal::UnwrapTraits<InC>::Unwrap(in.c),
- base::internal::UnwrapTraits<InD>::Unwrap(in.d),
- base::internal::UnwrapTraits<InE>::Unwrap(in.e),
- &out->a,
- &out->b);
-}
-
-template<class ObjT, class Method,
- class InA, class InB, class InC, class InD, class InE, class InF,
- class OutA, class OutB>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const Tuple6<InA, InB, InC, InD, InE, InF>& in,
- Tuple2<OutA, OutB>* out) {
- (obj->*method)(base::internal::UnwrapTraits<InA>::Unwrap(in.a),
- base::internal::UnwrapTraits<InB>::Unwrap(in.b),
- base::internal::UnwrapTraits<InC>::Unwrap(in.c),
- base::internal::UnwrapTraits<InD>::Unwrap(in.d),
- base::internal::UnwrapTraits<InE>::Unwrap(in.e),
- base::internal::UnwrapTraits<InF>::Unwrap(in.f),
- &out->a,
- &out->b);
-}
-
-// Dispatchers with 3 out params.
-
-template<class ObjT, class Method,
- class OutA, class OutB, class OutC>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const Tuple0& in,
- Tuple3<OutA, OutB, OutC>* out) {
- (obj->*method)(&out->a, &out->b, &out->c);
-}
-
-template<class ObjT, class Method, class InA,
- class OutA, class OutB, class OutC>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const InA& in,
- Tuple3<OutA, OutB, OutC>* out) {
- (obj->*method)(in, &out->a, &out->b, &out->c);
-}
-
-template<class ObjT, class Method, class InA,
- class OutA, class OutB, class OutC>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const Tuple1<InA>& in,
- Tuple3<OutA, OutB, OutC>* out) {
- (obj->*method)(base::internal::UnwrapTraits<InA>::Unwrap(in.a),
- &out->a,
- &out->b,
- &out->c);
-}
-
-template<class ObjT, class Method, class InA, class InB,
- class OutA, class OutB, class OutC>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const Tuple2<InA, InB>& in,
- Tuple3<OutA, OutB, OutC>* out) {
- (obj->*method)(base::internal::UnwrapTraits<InA>::Unwrap(in.a),
- base::internal::UnwrapTraits<InB>::Unwrap(in.b),
- &out->a,
- &out->b,
- &out->c);
-}
-
-template<class ObjT, class Method, class InA, class InB, class InC,
- class OutA, class OutB, class OutC>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const Tuple3<InA, InB, InC>& in,
- Tuple3<OutA, OutB, OutC>* out) {
- (obj->*method)(base::internal::UnwrapTraits<InA>::Unwrap(in.a),
- base::internal::UnwrapTraits<InB>::Unwrap(in.b),
- base::internal::UnwrapTraits<InC>::Unwrap(in.c),
- &out->a,
- &out->b,
- &out->c);
-}
-
-template<class ObjT, class Method, class InA, class InB, class InC, class InD,
- class OutA, class OutB, class OutC>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const Tuple4<InA, InB, InC, InD>& in,
- Tuple3<OutA, OutB, OutC>* out) {
- (obj->*method)(base::internal::UnwrapTraits<InA>::Unwrap(in.a),
- base::internal::UnwrapTraits<InB>::Unwrap(in.b),
- base::internal::UnwrapTraits<InC>::Unwrap(in.c),
- base::internal::UnwrapTraits<InD>::Unwrap(in.d),
- &out->a,
- &out->b,
- &out->c);
-}
-
-template<class ObjT, class Method,
- class InA, class InB, class InC, class InD, class InE,
- class OutA, class OutB, class OutC>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const Tuple5<InA, InB, InC, InD, InE>& in,
- Tuple3<OutA, OutB, OutC>* out) {
- (obj->*method)(base::internal::UnwrapTraits<InA>::Unwrap(in.a),
- base::internal::UnwrapTraits<InB>::Unwrap(in.b),
- base::internal::UnwrapTraits<InC>::Unwrap(in.c),
- base::internal::UnwrapTraits<InD>::Unwrap(in.d),
- base::internal::UnwrapTraits<InE>::Unwrap(in.e),
- &out->a,
- &out->b,
- &out->c);
-}
-
-template<class ObjT, class Method,
- class InA, class InB, class InC, class InD, class InE, class InF,
- class OutA, class OutB, class OutC>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const Tuple6<InA, InB, InC, InD, InE, InF>& in,
- Tuple3<OutA, OutB, OutC>* out) {
- (obj->*method)(base::internal::UnwrapTraits<InA>::Unwrap(in.a),
- base::internal::UnwrapTraits<InB>::Unwrap(in.b),
- base::internal::UnwrapTraits<InC>::Unwrap(in.c),
- base::internal::UnwrapTraits<InD>::Unwrap(in.d),
- base::internal::UnwrapTraits<InE>::Unwrap(in.e),
- base::internal::UnwrapTraits<InF>::Unwrap(in.f),
- &out->a,
- &out->b,
- &out->c);
-}
-
-// Dispatchers with 4 out params.
-
-template<class ObjT, class Method,
- class OutA, class OutB, class OutC, class OutD>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const Tuple0& in,
- Tuple4<OutA, OutB, OutC, OutD>* out) {
- (obj->*method)(&out->a, &out->b, &out->c, &out->d);
-}
-
-template<class ObjT, class Method, class InA,
- class OutA, class OutB, class OutC, class OutD>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const InA& in,
- Tuple4<OutA, OutB, OutC, OutD>* out) {
- (obj->*method)(base::internal::UnwrapTraits<InA>::Unwrap(in),
- &out->a,
- &out->b,
- &out->c,
- &out->d);
-}
-
-template<class ObjT, class Method, class InA,
- class OutA, class OutB, class OutC, class OutD>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const Tuple1<InA>& in,
- Tuple4<OutA, OutB, OutC, OutD>* out) {
- (obj->*method)(base::internal::UnwrapTraits<InA>::Unwrap(in.a),
- &out->a,
- &out->b,
- &out->c,
- &out->d);
-}
-
-template<class ObjT, class Method, class InA, class InB,
- class OutA, class OutB, class OutC, class OutD>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const Tuple2<InA, InB>& in,
- Tuple4<OutA, OutB, OutC, OutD>* out) {
- (obj->*method)(base::internal::UnwrapTraits<InA>::Unwrap(in.a),
- base::internal::UnwrapTraits<InB>::Unwrap(in.b),
- &out->a,
- &out->b,
- &out->c,
- &out->d);
-}
-
-template<class ObjT, class Method, class InA, class InB, class InC,
- class OutA, class OutB, class OutC, class OutD>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const Tuple3<InA, InB, InC>& in,
- Tuple4<OutA, OutB, OutC, OutD>* out) {
- (obj->*method)(base::internal::UnwrapTraits<InA>::Unwrap(in.a),
- base::internal::UnwrapTraits<InB>::Unwrap(in.b),
- base::internal::UnwrapTraits<InC>::Unwrap(in.c),
- &out->a,
- &out->b,
- &out->c,
- &out->d);
-}
-
-template<class ObjT, class Method, class InA, class InB, class InC, class InD,
- class OutA, class OutB, class OutC, class OutD>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const Tuple4<InA, InB, InC, InD>& in,
- Tuple4<OutA, OutB, OutC, OutD>* out) {
- (obj->*method)(base::internal::UnwrapTraits<InA>::Unwrap(in.a),
- base::internal::UnwrapTraits<InB>::Unwrap(in.b),
- base::internal::UnwrapTraits<InC>::Unwrap(in.c),
- base::internal::UnwrapTraits<InD>::Unwrap(in.d),
- &out->a,
- &out->b,
- &out->c,
- &out->d);
-}
-
-template<class ObjT, class Method,
- class InA, class InB, class InC, class InD, class InE,
- class OutA, class OutB, class OutC, class OutD>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const Tuple5<InA, InB, InC, InD, InE>& in,
- Tuple4<OutA, OutB, OutC, OutD>* out) {
- (obj->*method)(base::internal::UnwrapTraits<InA>::Unwrap(in.a),
- base::internal::UnwrapTraits<InB>::Unwrap(in.b),
- base::internal::UnwrapTraits<InC>::Unwrap(in.c),
- base::internal::UnwrapTraits<InD>::Unwrap(in.d),
- base::internal::UnwrapTraits<InE>::Unwrap(in.e),
- &out->a,
- &out->b,
- &out->c,
- &out->d);
-}
-
-template<class ObjT, class Method,
- class InA, class InB, class InC, class InD, class InE, class InF,
- class OutA, class OutB, class OutC, class OutD>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const Tuple6<InA, InB, InC, InD, InE, InF>& in,
- Tuple4<OutA, OutB, OutC, OutD>* out) {
- (obj->*method)(base::internal::UnwrapTraits<InA>::Unwrap(in.a),
- base::internal::UnwrapTraits<InB>::Unwrap(in.b),
- base::internal::UnwrapTraits<InC>::Unwrap(in.c),
- base::internal::UnwrapTraits<InD>::Unwrap(in.d),
- base::internal::UnwrapTraits<InE>::Unwrap(in.e),
- base::internal::UnwrapTraits<InF>::Unwrap(in.f),
- &out->a,
- &out->b,
- &out->c,
- &out->d);
-}
-
-// Dispatchers with 5 out params.
-
-template<class ObjT, class Method,
- class OutA, class OutB, class OutC, class OutD, class OutE>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const Tuple0& in,
- Tuple5<OutA, OutB, OutC, OutD, OutE>* out) {
- (obj->*method)(&out->a, &out->b, &out->c, &out->d, &out->e);
-}
-
-template<class ObjT, class Method, class InA,
- class OutA, class OutB, class OutC, class OutD, class OutE>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const InA& in,
- Tuple5<OutA, OutB, OutC, OutD, OutE>* out) {
- (obj->*method)(base::internal::UnwrapTraits<InA>::Unwrap(in),
- &out->a,
- &out->b,
- &out->c,
- &out->d,
- &out->e);
-}
-
-template<class ObjT, class Method, class InA,
- class OutA, class OutB, class OutC, class OutD, class OutE>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const Tuple1<InA>& in,
- Tuple5<OutA, OutB, OutC, OutD, OutE>* out) {
- (obj->*method)(base::internal::UnwrapTraits<InA>::Unwrap(in.a),
- &out->a,
- &out->b,
- &out->c,
- &out->d,
- &out->e);
-}
-
-template<class ObjT, class Method, class InA, class InB,
- class OutA, class OutB, class OutC, class OutD, class OutE>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const Tuple2<InA, InB>& in,
- Tuple5<OutA, OutB, OutC, OutD, OutE>* out) {
- (obj->*method)(base::internal::UnwrapTraits<InA>::Unwrap(in.a),
- base::internal::UnwrapTraits<InB>::Unwrap(in.b),
- &out->a,
- &out->b,
- &out->c,
- &out->d,
- &out->e);
-}
-
-template<class ObjT, class Method, class InA, class InB, class InC,
- class OutA, class OutB, class OutC, class OutD, class OutE>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const Tuple3<InA, InB, InC>& in,
- Tuple5<OutA, OutB, OutC, OutD, OutE>* out) {
- (obj->*method)(base::internal::UnwrapTraits<InA>::Unwrap(in.a),
- base::internal::UnwrapTraits<InB>::Unwrap(in.b),
- base::internal::UnwrapTraits<InC>::Unwrap(in.c),
- &out->a,
- &out->b,
- &out->c,
- &out->d,
- &out->e);
-}
-
-template<class ObjT, class Method, class InA, class InB, class InC, class InD,
- class OutA, class OutB, class OutC, class OutD, class OutE>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const Tuple4<InA, InB, InC, InD>& in,
- Tuple5<OutA, OutB, OutC, OutD, OutE>* out) {
- (obj->*method)(base::internal::UnwrapTraits<InA>::Unwrap(in.a),
- base::internal::UnwrapTraits<InB>::Unwrap(in.b),
- base::internal::UnwrapTraits<InC>::Unwrap(in.c),
- base::internal::UnwrapTraits<InD>::Unwrap(in.d),
- &out->a,
- &out->b,
- &out->c,
- &out->d,
- &out->e);
-}
-
-template<class ObjT, class Method,
- class InA, class InB, class InC, class InD, class InE,
- class OutA, class OutB, class OutC, class OutD, class OutE>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const Tuple5<InA, InB, InC, InD, InE>& in,
- Tuple5<OutA, OutB, OutC, OutD, OutE>* out) {
- (obj->*method)(base::internal::UnwrapTraits<InA>::Unwrap(in.a),
- base::internal::UnwrapTraits<InB>::Unwrap(in.b),
- base::internal::UnwrapTraits<InC>::Unwrap(in.c),
- base::internal::UnwrapTraits<InD>::Unwrap(in.d),
- base::internal::UnwrapTraits<InE>::Unwrap(in.e),
- &out->a,
- &out->b,
- &out->c,
- &out->d,
- &out->e);
-}
-
-template<class ObjT, class Method,
- class InA, class InB, class InC, class InD, class InE, class InF,
- class OutA, class OutB, class OutC, class OutD, class OutE>
-inline void DispatchToMethod(ObjT* obj, Method method,
- const Tuple6<InA, InB, InC, InD, InE, InF>& in,
- Tuple5<OutA, OutB, OutC, OutD, OutE>* out) {
- (obj->*method)(base::internal::UnwrapTraits<InA>::Unwrap(in.a),
- base::internal::UnwrapTraits<InB>::Unwrap(in.b),
- base::internal::UnwrapTraits<InC>::Unwrap(in.c),
- base::internal::UnwrapTraits<InD>::Unwrap(in.d),
- base::internal::UnwrapTraits<InE>::Unwrap(in.e),
- base::internal::UnwrapTraits<InF>::Unwrap(in.f),
- &out->a,
- &out->b,
- &out->c,
- &out->d,
- &out->e);
+ const Tuple<InTs...>& in,
+ Tuple<OutTs...>* out) {
+ DispatchToMethodImpl(obj, method, in, out,
+ MakeIndexSequence<sizeof...(InTs)>(),
+ MakeIndexSequence<sizeof...(OutTs)>());
}
#endif // BASE_TUPLE_H__
diff --git a/build/OWNERS b/build/OWNERS
index 72e8ffc..d1529af 100644
--- a/build/OWNERS
+++ b/build/OWNERS
@@ -1 +1,3 @@
-*
+cjhopman@chromium.org
+scottmg@chromium.org
+thakis@chromium.org
diff --git a/build/all.gyp b/build/all.gyp
index 9c325fb..149ac0a 100644
--- a/build/all.gyp
+++ b/build/all.gyp
@@ -36,8 +36,14 @@
'../url/url.gyp:*',
],
'conditions': [
+ ['OS!="ios" and OS!="mac"', {
+ 'dependencies': [
+ '../ui/touch_selection/ui_touch_selection.gyp:*',
+ ],
+ }],
['OS=="ios"', {
'dependencies': [
+ '../chrome/chrome.gyp:browser',
'../ios/ios.gyp:*',
# NOTE: This list of targets is present because
# mojo_base.gyp:mojo_base cannot be built on iOS, as
@@ -312,6 +318,11 @@
'../url/url.gyp:url_unittests',
],
'conditions': [
+ ['OS!="ios" and OS!="mac"', {
+ 'dependencies': [
+ '../ui/touch_selection/ui_touch_selection.gyp:ui_touch_selection_unittests',
+ ],
+ }],
['OS!="ios" and OS!="android"', {
'dependencies': [
'../cc/blink/cc_blink_tests.gyp:cc_blink_unittests',
@@ -463,8 +474,10 @@
}],
['disable_nacl==0 and disable_nacl_untrusted==0', {
'dependencies': [
- '../mojo/mojo_nacl.gyp:*',
- '../testing/gtest_nacl.gyp:*',
+ '../mojo/mojo_nacl.gyp:mojo_nacl',
+ '../mojo/mojo_nacl.gyp:monacl_codegen',
+ '../mojo/mojo_nacl.gyp:monacl_sel',
+ '../mojo/mojo_nacl.gyp:monacl_shell',
],
}],
],
@@ -536,6 +549,7 @@
'../chrome/chrome.gyp:load_library_perf_tests',
'../chrome/chrome.gyp:performance_browser_tests',
'../chrome/chrome.gyp:sync_performance_tests',
+ '../content/content_shell_and_tests.gyp:content_shell',
'../media/media.gyp:media_perftests',
'../tools/perf/clear_system_cache/clear_system_cache.gyp:*',
'../tools/telemetry/telemetry.gyp:*',
@@ -834,6 +848,7 @@
'../tools/android/findbugs_plugin/findbugs_plugin.gyp:findbugs_plugin_test',
'../ui/base/ui_base_tests.gyp:ui_base_unittests',
'../ui/events/events.gyp:events_unittests',
+ '../ui/touch_selection/ui_touch_selection.gyp:ui_touch_selection_unittests',
# Unit test bundles packaged as an apk.
'../android_webview/android_webview.gyp:android_webview_test_apk',
'../android_webview/android_webview.gyp:android_webview_unittests_apk',
@@ -862,6 +877,7 @@
'../ui/base/ui_base_tests.gyp:ui_base_unittests_apk',
'../ui/events/events.gyp:events_unittests_apk',
'../ui/gfx/gfx_tests.gyp:gfx_unittests_apk',
+ '../ui/touch_selection/ui_touch_selection.gyp:ui_touch_selection_unittests_apk',
],
'conditions': [
['enable_webrtc==1 and "<(libpeer_target_type)"=="static_library"', {
@@ -1075,6 +1091,7 @@
'../ui/base/ui_base_tests.gyp:ui_base_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',
'../ui/views/views.gyp:views_unittests',
'../url/url.gyp:url_unittests',
],
@@ -1179,6 +1196,7 @@
'../ui/events/events.gyp:events_unittests',
'../ui/gfx/gfx_tests.gyp:gfx_unittests',
'../ui/keyboard/keyboard.gyp:keyboard_unittests',
+ '../ui/touch_selection/ui_touch_selection.gyp:ui_touch_selection_unittests',
'../url/url.gyp:url_unittests',
],
},
@@ -1219,6 +1237,7 @@
'../third_party/widevine/cdm/widevine_cdm.gyp:widevinecdmadapter',
'../ui/base/ui_base_tests.gyp:ui_base_unittests',
'../ui/gfx/gfx_tests.gyp:gfx_unittests',
+ '../ui/touch_selection/ui_touch_selection.gyp:ui_touch_selection_unittests',
'../ui/views/views.gyp:views_unittests',
'../url/url.gyp:url_unittests',
],
@@ -1267,6 +1286,7 @@
'../ui/keyboard/keyboard.gyp:*',
'../ui/message_center/message_center.gyp:*',
'../ui/snapshot/snapshot.gyp:snapshot_unittests',
+ '../ui/touch_selection/ui_touch_selection.gyp:ui_touch_selection_unittests',
'../ui/views/examples/examples.gyp:views_examples_with_content_exe',
'../ui/views/views.gyp:views',
'../ui/views/views.gyp:views_unittests',
diff --git a/build/android/OWNERS b/build/android/OWNERS
new file mode 100644
index 0000000..bd675fb
--- /dev/null
+++ b/build/android/OWNERS
@@ -0,0 +1,2 @@
+jbudorick@chromium.org
+klundberg@chromium.org
diff --git a/build/android/adb_run_mojo_shell b/build/android/adb_run_mojo_shell
index 18e796d..b585e4a 100755
--- a/build/android/adb_run_mojo_shell
+++ b/build/android/adb_run_mojo_shell
@@ -5,10 +5,12 @@
# found in the LICENSE file.
optional_url=$1
+parameters=$2
adb logcat -c
adb shell am start -S \
-a android.intent.action.VIEW \
-n org.chromium.mojo_shell_apk/.MojoShellActivity \
+ ${parameters:+--esa parameters "$parameters"} \
${optional_url:+-d "$optional_url"}
adb logcat -s MojoShellApplication MojoShellActivity chromium
diff --git a/build/android/gyp/write_build_config.py b/build/android/gyp/write_build_config.py
index a14ef77..bf887e3 100755
--- a/build/android/gyp/write_build_config.py
+++ b/build/android/gyp/write_build_config.py
@@ -95,13 +95,14 @@
if not options.type in [
- 'java_library', 'android_resources', 'android_apk']:
+ 'java_library', 'android_resources', 'android_apk', 'deps_dex']:
raise Exception('Unknown type: <%s>' % options.type)
required_options = ['build_config'] + {
'java_library': ['jar_path'],
'android_resources': ['resources_zip'],
- 'android_apk': ['jar_path', 'dex_path', 'resources_zip']
+ 'android_apk': ['jar_path', 'dex_path', 'resources_zip'],
+ 'deps_dex': ['dex_path']
}[options.type]
if options.native_libs:
@@ -213,10 +214,8 @@
c['package_name'] for c in all_resources_deps if 'package_name' in c]
- # Dependencies for the final dex file of an apk or the standalone .dex.jar
- # output of a library.
- if options.type == 'android_apk' or (options.type == "java_library"
- and options.supports_android):
+ # Dependencies for the final dex file of an apk or a 'deps_dex'.
+ if options.type in ['android_apk', 'deps_dex']:
config['final_dex'] = {}
dex_config = config['final_dex']
# TODO(cjhopman): proguard version
diff --git a/build/android/pylib/device/device_utils.py b/build/android/pylib/device/device_utils.py
index 403f235..553e960 100644
--- a/build/android/pylib/device/device_utils.py
+++ b/build/android/pylib/device/device_utils.py
@@ -19,6 +19,7 @@
import pylib.android_commands
from pylib import cmd_helper
+from pylib import constants
from pylib.device import adb_wrapper
from pylib.device import decorators
from pylib.device import device_errors
@@ -42,7 +43,17 @@
Returns:
A list containing the configured AVDs.
"""
- return pylib.android_commands.GetAVDs()
+ lines = cmd_helper.GetCmdOutput([
+ os.path.join(constants.ANDROID_SDK_ROOT, 'tools', 'android'),
+ 'list', 'avd']).splitlines()
+ avds = []
+ for line in lines:
+ if 'Name:' not in line:
+ continue
+ key, value = (s.strip() for s in line.split(':', 1))
+ if key == 'Name':
+ avds.append(value)
+ return avds
@decorators.WithExplicitTimeoutAndRetries(
@@ -343,30 +354,15 @@
DeviceUnreachableError on missing device.
"""
package_name = apk_helper.GetPackageName(apk_path)
- device_path = self.old_interface.GetApplicationPath(package_name)
+ device_path = self.GetApplicationPath(package_name)
if device_path is not None:
- files_changed = self.old_interface.GetFilesChanged(
- apk_path, device_path, ignore_filenames=True)
- if len(files_changed) > 0:
- should_install = True
- if not reinstall:
- out = self.old_interface.Uninstall(package_name)
- for line in out.splitlines():
- if 'Failure' in line:
- raise device_errors.CommandFailedError(line.strip(), str(self))
- else:
- should_install = False
+ should_install = bool(self._GetChangedFilesImpl(apk_path, device_path))
+ if should_install and not reinstall:
+ self.adb.Uninstall(package_name)
else:
should_install = True
if should_install:
- try:
- out = self.old_interface.Install(apk_path, reinstall=reinstall)
- for line in out.splitlines():
- if 'Failure' in line:
- raise device_errors.CommandFailedError(line.strip(), str(self))
- except AssertionError as e:
- raise device_errors.CommandFailedError(
- str(e), str(self)), None, sys.exc_info()[2]
+ self.adb.Install(apk_path, reinstall=reinstall)
@decorators.WithTimeoutAndRetriesFromInstance()
def RunShellCommand(self, cmd, check_return=False, cwd=None, env=None,
diff --git a/build/android/pylib/device/device_utils_test.py b/build/android/pylib/device/device_utils_test.py
index 512a7d4..c451ef3 100755
--- a/build/android/pylib/device/device_utils_test.py
+++ b/build/android/pylib/device/device_utils_test.py
@@ -69,6 +69,21 @@
device_utils.DeviceUtils('')
+class DeviceUtilsGetAVDsTest(mock_calls.TestCase):
+
+ def testGetAVDs(self):
+ with self.assertCall(
+ mock.call.pylib.cmd_helper.GetCmdOutput([mock.ANY, 'list', 'avd']),
+ 'Available Android Virtual Devices:\n'
+ ' Name: my_android5.0\n'
+ ' Path: /some/path/to/.android/avd/my_android5.0.avd\n'
+ ' Target: Android 5.0 (API level 21)\n'
+ ' Tag/ABI: default/x86\n'
+ ' Skin: WVGA800\n'):
+ self.assertEquals(['my_android5.0'],
+ device_utils.GetAVDs())
+
+
class MockTempFile(object):
def __init__(self, name='/tmp/some/file'):
@@ -496,86 +511,61 @@
self.device.Reboot(block=True)
-class DeviceUtilsInstallTest(DeviceUtilsOldImplTest):
+class DeviceUtilsInstallTest(DeviceUtilsNewImplTest):
def testInstall_noPriorInstall(self):
- with mock.patch('os.path.isfile', return_value=True), (
- mock.patch('pylib.utils.apk_helper.GetPackageName',
- return_value='this.is.a.test.package')):
- with self.assertCallsSequence([
- ("adb -s 0123456789abcdef shell 'pm path this.is.a.test.package'",
- ''),
- ("adb -s 0123456789abcdef install /fake/test/app.apk",
- 'Success\r\n')]):
- self.device.Install('/fake/test/app.apk', retries=0)
+ with self.assertCalls(
+ (mock.call.pylib.utils.apk_helper.GetPackageName('/fake/test/app.apk'),
+ 'this.is.a.test.package'),
+ (self.call.device.GetApplicationPath('this.is.a.test.package'), None),
+ self.call.adb.Install('/fake/test/app.apk', reinstall=False)):
+ self.device.Install('/fake/test/app.apk', retries=0)
def testInstall_differentPriorInstall(self):
- def mockGetFilesChanged(host_path, device_path, ignore_filenames):
- return [(host_path, device_path)]
-
- with mock.patch('os.path.isfile', return_value=True), (
- mock.patch('os.path.exists', return_value=True)), (
- mock.patch('pylib.utils.apk_helper.GetPackageName',
- return_value='this.is.a.test.package')), (
- mock.patch('pylib.constants.GetOutDirectory',
- return_value='/fake/test/out')), (
- mock.patch('pylib.android_commands.AndroidCommands.GetFilesChanged',
- side_effect=mockGetFilesChanged)):
- with self.assertCallsSequence([
- ("adb -s 0123456789abcdef shell 'pm path this.is.a.test.package'",
- 'package:/fake/data/app/this.is.a.test.package.apk\r\n'),
- # GetFilesChanged is mocked, so its adb calls are omitted.
- ('adb -s 0123456789abcdef uninstall this.is.a.test.package',
- 'Success\r\n'),
- ('adb -s 0123456789abcdef install /fake/test/app.apk',
- 'Success\r\n')]):
- self.device.Install('/fake/test/app.apk', retries=0)
+ with self.assertCalls(
+ (mock.call.pylib.utils.apk_helper.GetPackageName('/fake/test/app.apk'),
+ 'this.is.a.test.package'),
+ (self.call.device.GetApplicationPath('this.is.a.test.package'),
+ '/fake/data/app/this.is.a.test.package.apk'),
+ (self.call.device._GetChangedFilesImpl(
+ '/fake/test/app.apk', '/fake/data/app/this.is.a.test.package.apk'),
+ [('/fake/test/app.apk', '/fake/data/app/this.is.a.test.package.apk')]),
+ self.call.adb.Uninstall('this.is.a.test.package'),
+ self.call.adb.Install('/fake/test/app.apk', reinstall=False)):
+ self.device.Install('/fake/test/app.apk', retries=0)
def testInstall_differentPriorInstall_reinstall(self):
- def mockGetFilesChanged(host_path, device_path, ignore_filenames):
- return [(host_path, device_path)]
-
- with mock.patch('os.path.isfile', return_value=True), (
- mock.patch('pylib.utils.apk_helper.GetPackageName',
- return_value='this.is.a.test.package')), (
- mock.patch('pylib.constants.GetOutDirectory',
- return_value='/fake/test/out')), (
- mock.patch('pylib.android_commands.AndroidCommands.GetFilesChanged',
- side_effect=mockGetFilesChanged)):
- with self.assertCallsSequence([
- ("adb -s 0123456789abcdef shell 'pm path this.is.a.test.package'",
- 'package:/fake/data/app/this.is.a.test.package.apk\r\n'),
- # GetFilesChanged is mocked, so its adb calls are omitted.
- ('adb -s 0123456789abcdef install -r /fake/test/app.apk',
- 'Success\r\n')]):
- self.device.Install('/fake/test/app.apk', reinstall=True, retries=0)
+ with self.assertCalls(
+ (mock.call.pylib.utils.apk_helper.GetPackageName('/fake/test/app.apk'),
+ 'this.is.a.test.package'),
+ (self.call.device.GetApplicationPath('this.is.a.test.package'),
+ '/fake/data/app/this.is.a.test.package.apk'),
+ (self.call.device._GetChangedFilesImpl(
+ '/fake/test/app.apk', '/fake/data/app/this.is.a.test.package.apk'),
+ [('/fake/test/app.apk', '/fake/data/app/this.is.a.test.package.apk')]),
+ self.call.adb.Install('/fake/test/app.apk', reinstall=True)):
+ self.device.Install('/fake/test/app.apk', reinstall=True, retries=0)
def testInstall_identicalPriorInstall(self):
- def mockGetFilesChanged(host_path, device_path, ignore_filenames):
- return []
-
- with mock.patch('pylib.utils.apk_helper.GetPackageName',
- return_value='this.is.a.test.package'), (
- mock.patch('pylib.android_commands.AndroidCommands.GetFilesChanged',
- side_effect=mockGetFilesChanged)):
- with self.assertCallsSequence([
- ("adb -s 0123456789abcdef shell 'pm path this.is.a.test.package'",
- 'package:/fake/data/app/this.is.a.test.package.apk\r\n')
- # GetFilesChanged is mocked, so its adb calls are omitted.
- ]):
- self.device.Install('/fake/test/app.apk', retries=0)
+ with self.assertCalls(
+ (mock.call.pylib.utils.apk_helper.GetPackageName('/fake/test/app.apk'),
+ 'this.is.a.test.package'),
+ (self.call.device.GetApplicationPath('this.is.a.test.package'),
+ '/fake/data/app/this.is.a.test.package.apk'),
+ (self.call.device._GetChangedFilesImpl(
+ '/fake/test/app.apk', '/fake/data/app/this.is.a.test.package.apk'),
+ [])):
+ self.device.Install('/fake/test/app.apk', retries=0)
def testInstall_fails(self):
- with mock.patch('os.path.isfile', return_value=True), (
- mock.patch('pylib.utils.apk_helper.GetPackageName',
- return_value='this.is.a.test.package')):
- with self.assertCallsSequence([
- ("adb -s 0123456789abcdef shell 'pm path this.is.a.test.package'",
- ''),
- ("adb -s 0123456789abcdef install /fake/test/app.apk",
- 'Failure\r\n')]):
- with self.assertRaises(device_errors.CommandFailedError):
- self.device.Install('/fake/test/app.apk', retries=0)
+ with self.assertCalls(
+ (mock.call.pylib.utils.apk_helper.GetPackageName('/fake/test/app.apk'),
+ 'this.is.a.test.package'),
+ (self.call.device.GetApplicationPath('this.is.a.test.package'), None),
+ (self.call.adb.Install('/fake/test/app.apk', reinstall=False),
+ self.CommandError('Failure\r\n'))):
+ with self.assertRaises(device_errors.CommandFailedError):
+ self.device.Install('/fake/test/app.apk', retries=0)
class DeviceUtilsRunShellCommandTest(DeviceUtilsNewImplTest):
diff --git a/build/android/pylib/gtest/gtest_config.py b/build/android/pylib/gtest/gtest_config.py
index 0cb8b35..20aaf68 100644
--- a/build/android/pylib/gtest/gtest_config.py
+++ b/build/android/pylib/gtest/gtest_config.py
@@ -36,6 +36,7 @@
'sql_unittests',
'sync_unit_tests',
'ui_base_unittests',
+ 'ui_touch_selection_unittests',
'unit_tests',
'webkit_unit_tests',
]
diff --git a/build/android/test_runner.py b/build/android/test_runner.py
index 1c06331..68827b9 100755
--- a/build/android/test_runner.py
+++ b/build/android/test_runner.py
@@ -864,8 +864,8 @@
results=results,
test_type=test.TestType(),
test_package=test_run.TestPackage(),
- annotation=args.annotations,
- flakiness_server=args.flakiness_dashboard_server)
+ annotation=getattr(args, 'annotations', None),
+ flakiness_server=getattr(args, 'flakiness_dashboard_server', None))
if args.json_results_file:
json_results.GenerateJsonResultsFile(
diff --git a/build/build-ctags.sh b/build/build-ctags.sh
index 825da27..61e017e 100755
--- a/build/build-ctags.sh
+++ b/build/build-ctags.sh
@@ -36,7 +36,7 @@
# errors about components that you just happen to have not built (NaCl, for
# example).
$(ctags_cmd "$extraexcludes") 2> /dev/null || fail $1
- mv -f .tmp_tags .tags
+ mv -f .tmp_tags tags
}
# We always build the top level but leave all submodules as optional.
diff --git a/build/common.gypi b/build/common.gypi
index 204a133..c899e14 100644
--- a/build/common.gypi
+++ b/build/common.gypi
@@ -1974,7 +1974,7 @@
'enable_pepper_cdms%': 0,
}],
- ['OS=="android"', {
+ ['OS=="android" or chromecast==1', {
'enable_browser_cdms%': 1,
}, {
'enable_browser_cdms%': 0,
diff --git a/build/config/android/config.gni b/build/config/android/config.gni
index 82405dd..60934c2 100644
--- a/build/config/android/config.gni
+++ b/build/config/android/config.gni
@@ -12,7 +12,9 @@
if (has_chrome_android_internal) {
import("//clank/config.gni")
- } else {
+ }
+
+ if (!defined(default_android_sdk_root)) {
default_android_sdk_root = "//third_party/android_tools/sdk"
default_android_sdk_version = "21"
default_android_sdk_build_tools_version = "21.0.1"
diff --git a/build/config/android/internal_rules.gni b/build/config/android/internal_rules.gni
index ce6e428..3772769 100644
--- a/build/config/android/internal_rules.gni
+++ b/build/config/android/internal_rules.gni
@@ -66,12 +66,13 @@
testonly = invoker.testonly
}
- assert(defined(invoker.sources))
assert(defined(invoker.output))
action(target_name) {
script = "//build/android/gyp/dex.py"
depfile = "$target_gen_dir/$target_name.d"
- sources = invoker.sources
+ if (defined(invoker.sources)) {
+ sources = invoker.sources
+ }
outputs = [
depfile,
invoker.output,
@@ -103,7 +104,9 @@
args += invoker.args
}
- args += rebase_path(invoker.sources, root_build_dir)
+ if (defined(invoker.sources)) {
+ args += rebase_path(invoker.sources, root_build_dir)
+ }
}
}
@@ -163,7 +166,7 @@
build_config = invoker.build_config
assert(type == "android_apk" || type == "java_library" ||
- type == "android_resources")
+ type == "android_resources" || type == "deps_dex")
action(target_name) {
script = "//build/android/gyp/write_build_config.py"
@@ -201,11 +204,12 @@
is_java_library = type == "java_library"
is_apk = type == "android_apk"
is_android_resources = type == "android_resources"
+ is_deps_dex = type == "deps_dex"
- supports_android = is_apk || is_android_resources ||
+ supports_android = is_apk || is_android_resources || is_deps_dex ||
(is_java_library && defined(invoker.supports_android) &&
invoker.supports_android)
- requires_android = is_apk || is_android_resources ||
+ requires_android = is_apk || is_android_resources || is_deps_dex ||
(is_java_library && defined(invoker.requires_android) &&
invoker.requires_android)
@@ -216,6 +220,7 @@
assert(is_java_library || true)
assert(is_apk || true)
assert(is_android_resources || true)
+ assert(is_deps_dex || true)
if (is_java_library || is_apk) {
args += [
@@ -224,7 +229,7 @@
]
}
- if (is_apk || (is_java_library && supports_android)) {
+ if (is_apk || is_deps_dex || (is_java_library && supports_android)) {
args += [
"--dex-path",
rebase_path(invoker.dex_path, root_build_dir),
@@ -898,22 +903,6 @@
]
output = _dex_path
}
-
- if (defined(invoker.standalone_dex_path)) {
- _final_deps += [ ":${_template_name}__standalone_dex" ]
- _rebased_build_config = rebase_path(_build_config, root_build_dir)
- dex("${_template_name}__standalone_dex") {
- sources = [
- _jar_path,
- ]
- inputs = [
- _build_config,
- ]
- output = invoker.standalone_dex_path
- dex_arg_key = "${_rebased_build_config}:final_dex:dependency_dex_files"
- args = [ "--inputs=@FileArg($dex_arg_key)" ]
- }
- }
}
group(target_name) {
@@ -1061,3 +1050,25 @@
}
}
}
+
+# Produces a single .dex.jar out of a set of Java dependencies.
+template("deps_dex") {
+ build_config = "$target_gen_dir/${target_name}.build_config"
+ write_build_config("${target_name}__build_config") {
+ type = "deps_dex"
+ deps = invoker.deps
+
+ build_config = build_config
+ dex_path = invoker.dex_path
+ }
+
+ rebased_build_config = rebase_path(build_config, root_build_dir)
+ dex(target_name) {
+ inputs = [
+ build_config,
+ ]
+ output = invoker.dex_path
+ dex_arg_key = "${rebased_build_config}:final_dex:dependency_dex_files"
+ args = [ "--inputs=@FileArg($dex_arg_key)" ]
+ }
+}
diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni
index 5d0cb37..5075da9 100644
--- a/build/config/android/rules.gni
+++ b/build/config/android/rules.gni
@@ -922,8 +922,6 @@
#
# dex_path: If set, the resulting .dex.jar file will be placed under this
# path.
-# standalone_dex_path: If set, a standalone .dex.jar containing the code from
-# the library and all dependencies will be placed under this path.
#
#
# Example
@@ -986,9 +984,6 @@
if (defined(invoker.dex_path)) {
dex_path = invoker.dex_path
}
- if (defined(invoker.standalone_dex_path)) {
- standalone_dex_path = invoker.standalone_dex_path
- }
supports_android = true
requires_android = true
@@ -1005,6 +1000,20 @@
}
}
+# Declare a target that packages a set of Java dependencies into a standalone
+# .dex.jar.
+#
+# Variables
+# deps: specifies the dependencies of this target. Android libraries in deps
+# will be packaged into the resulting .dex.jar file.
+# dex_path: location at which the output file will be put
+template("android_standalone_library") {
+ deps_dex(target_name) {
+ deps = invoker.deps
+ dex_path = invoker.dex_path
+ }
+}
+
# Declare an Android library target for a prebuilt jar
#
# This target creates an Android library containing java code and Android
@@ -1399,8 +1408,7 @@
group(target_name) {
deps = final_deps
if (defined(invoker.datadeps)) {
- # TODO(cjhopman): Fix this when group datadeps works.
- deps += invoker.datadeps
+ datadeps = invoker.datadeps
}
}
}
@@ -1455,6 +1463,9 @@
"//tools/android/forwarder2",
"//tools/android/md5sum",
]
+ if (defined(invoker.datadeps)) {
+ datadeps += invoker.datadeps
+ }
}
}
diff --git a/build/ios/grit_whitelist.txt b/build/ios/grit_whitelist.txt
index 17d9f89..0d9faa0 100644
--- a/build/ios/grit_whitelist.txt
+++ b/build/ios/grit_whitelist.txt
@@ -153,6 +153,7 @@
IDS_AUTOFILL_FIELD_LABEL_STATE
IDS_AUTOFILL_FIELD_LABEL_ZIP_CODE
IDS_AUTOFILL_OPTIONS_POPUP
+IDS_AUTOFILL_PASSWORD_FIELD_SUGGESTIONS_TITLE
IDS_AUTOFILL_SCAN_CREDIT_CARD
IDS_AUTOFILL_WARNING_FORM_DISABLED
IDS_AUTOFILL_WARNING_INSECURE_CONNECTION
diff --git a/build/sanitizers/sanitizer_options.cc b/build/sanitizers/sanitizer_options.cc
index a3b05c1..614a4a6 100644
--- a/build/sanitizers/sanitizer_options.cc
+++ b/build/sanitizers/sanitizer_options.cc
@@ -71,7 +71,8 @@
#elif defined(OS_MACOSX)
const char *kAsanDefaultOptions =
"strict_memcmp=0 replace_intrin=0 check_printf=1 use_sigaltstack=1 "
- "strip_path_prefix=Release/../../ fast_unwind_on_fatal=1 ";
+ "strip_path_prefix=Release/../../ fast_unwind_on_fatal=1 "
+ "detect_stack_use_after_return=1 ";
static const char kNaClDefaultOptions[] = "handle_segv=0";
static const char kNaClFlag[] = "--type=nacl-loader";
#endif // OS_LINUX
diff --git a/cc/BUILD.gn b/cc/BUILD.gn
index 0e1a6a3..592fd6e 100644
--- a/cc/BUILD.gn
+++ b/cc/BUILD.gn
@@ -320,8 +320,8 @@
"quads/yuv_video_draw_quad.h",
"resources/bitmap_content_layer_updater.cc",
"resources/bitmap_content_layer_updater.h",
- "resources/bitmap_raster_worker_pool.cc",
- "resources/bitmap_raster_worker_pool.h",
+ "resources/bitmap_tile_task_worker_pool.cc",
+ "resources/bitmap_tile_task_worker_pool.h",
"resources/bitmap_skpicture_content_layer_updater.cc",
"resources/bitmap_skpicture_content_layer_updater.h",
"resources/clip_display_item.cc",
@@ -342,8 +342,8 @@
"resources/eviction_tile_priority_queue.h",
"resources/filter_display_item.cc",
"resources/filter_display_item.h",
- "resources/gpu_raster_worker_pool.cc",
- "resources/gpu_raster_worker_pool.h",
+ "resources/gpu_tile_task_worker_pool.cc",
+ "resources/gpu_tile_task_worker_pool.h",
"resources/image_layer_updater.cc",
"resources/image_layer_updater.h",
"resources/layer_painter.h",
@@ -357,8 +357,8 @@
"resources/managed_tile_state.h",
"resources/memory_history.cc",
"resources/memory_history.h",
- "resources/one_copy_raster_worker_pool.cc",
- "resources/one_copy_raster_worker_pool.h",
+ "resources/one_copy_tile_task_worker_pool.cc",
+ "resources/one_copy_tile_task_worker_pool.h",
"resources/picture.cc",
"resources/picture.h",
"resources/picture_layer_tiling.cc",
@@ -369,8 +369,8 @@
"resources/picture_pile.h",
"resources/picture_pile_impl.cc",
"resources/picture_pile_impl.h",
- "resources/pixel_buffer_raster_worker_pool.cc",
- "resources/pixel_buffer_raster_worker_pool.h",
+ "resources/pixel_buffer_tile_task_worker_pool.cc",
+ "resources/pixel_buffer_tile_task_worker_pool.h",
"resources/platform_color.h",
"resources/prioritized_resource.cc",
"resources/prioritized_resource.h",
@@ -385,10 +385,10 @@
"resources/raster_source_helper.h",
"resources/raster_tile_priority_queue.cc",
"resources/raster_tile_priority_queue.h",
- "resources/raster_worker_pool.cc",
- "resources/raster_worker_pool.h",
- "resources/rasterizer.cc",
- "resources/rasterizer.h",
+ "resources/tile_task_worker_pool.cc",
+ "resources/tile_task_worker_pool.h",
+ "resources/tile_task_runner.cc",
+ "resources/tile_task_runner.h",
"resources/release_callback.h",
"resources/resource.cc",
"resources/resource.h",
@@ -449,8 +449,8 @@
"resources/ui_resource_client.h",
"resources/ui_resource_request.cc",
"resources/ui_resource_request.h",
- "resources/zero_copy_raster_worker_pool.cc",
- "resources/zero_copy_raster_worker_pool.h",
+ "resources/zero_copy_tile_task_worker_pool.cc",
+ "resources/zero_copy_tile_task_worker_pool.h",
"scheduler/begin_frame_source.cc",
"scheduler/begin_frame_source.h",
"scheduler/delay_based_time_source.cc",
@@ -755,7 +755,7 @@
"resources/picture_pile_unittest.cc",
"resources/picture_unittest.cc",
"resources/prioritized_resource_unittest.cc",
- "resources/raster_worker_pool_unittest.cc",
+ "resources/tile_task_worker_pool_unittest.cc",
"resources/resource_provider_unittest.cc",
"resources/resource_update_controller_unittest.cc",
"resources/scoped_resource_unittest.cc",
@@ -835,7 +835,7 @@
"layers/picture_layer_impl_perftest.cc",
"resources/picture_layer_tiling_perftest.cc",
"resources/picture_pile_impl_perftest.cc",
- "resources/raster_worker_pool_perftest.cc",
+ "resources/tile_task_worker_pool_perftest.cc",
"resources/task_graph_runner_perftest.cc",
"resources/tile_manager_perftest.cc",
"test/cc_test_suite.cc",
diff --git a/cc/base/scoped_ptr_vector.h b/cc/base/scoped_ptr_vector.h
index 164b27c..b552d73 100644
--- a/cc/base/scoped_ptr_vector.h
+++ b/cc/base/scoped_ptr_vector.h
@@ -159,6 +159,30 @@
std::swap(*writable_a, *writable_b);
}
+ // This acts like std::remove_if but with one key difference. The values to be
+ // removed to will each appear exactly once at or after the returned iterator,
+ // so that erase(foo.remove_if(P), foo.end()) will not leak or double-free the
+ // pointers in the vector.
+ template <typename Predicate>
+ iterator remove_if(Predicate predicate) {
+ typename std::vector<T*>::iterator it =
+ std::find_if(data_.begin(), data_.end(), predicate);
+ typename std::vector<T*>::iterator end = data_.end();
+ if (it == end)
+ return it;
+ typename std::vector<T*>::iterator result = it;
+ ++it;
+ for (; it != end; ++it) {
+ if (!static_cast<bool>(predicate(*it))) {
+ // Swap here instead of just assign to |result| so that all the
+ // pointers are preserved to be deleted afterward.
+ std::swap(*result, *it);
+ ++result;
+ }
+ }
+ return result;
+ }
+
template<class Compare>
inline void sort(Compare comp) {
std::sort(data_.begin(), data_.end(), comp);
diff --git a/cc/base/scoped_ptr_vector_unittest.cc b/cc/base/scoped_ptr_vector_unittest.cc
index 391ab48..7b9a86b 100644
--- a/cc/base/scoped_ptr_vector_unittest.cc
+++ b/cc/base/scoped_ptr_vector_unittest.cc
@@ -101,5 +101,84 @@
EXPECT_EQ(2u, even_numbers.size());
}
+class DataWithDestruction {
+ public:
+ static scoped_ptr<DataWithDestruction> Create(int i, int* destroy_count) {
+ return make_scoped_ptr(new DataWithDestruction(i, destroy_count));
+ }
+ int data() const { return data_; }
+ ~DataWithDestruction() { ++(*destroy_count_); }
+
+ private:
+ explicit DataWithDestruction(int i, int* destroy_count)
+ : data_(i), destroy_count_(destroy_count) {}
+ int data_;
+ int* destroy_count_;
+};
+
+TEST(ScopedPtrVectorTest, RemoveIf) {
+ ScopedPtrVector<DataWithDestruction> v;
+ int destroyed[6] = {0};
+ v.push_back(DataWithDestruction::Create(1, &destroyed[0]));
+ v.push_back(DataWithDestruction::Create(2, &destroyed[1]));
+ v.push_back(DataWithDestruction::Create(3, &destroyed[2]));
+ v.push_back(DataWithDestruction::Create(3, &destroyed[3]));
+ v.push_back(DataWithDestruction::Create(4, &destroyed[4]));
+ v.push_back(DataWithDestruction::Create(5, &destroyed[5]));
+
+ int expect_destroyed[6] = {0};
+
+ // Removing more than one thing that matches.
+ auto is_three = [](DataWithDestruction* d) { return d->data() == 3; };
+ v.erase(v.remove_if(is_three), v.end());
+ EXPECT_EQ(4u, v.size());
+ expect_destroyed[2]++;
+ expect_destroyed[3]++;
+ for (size_t i = 0; i < arraysize(destroyed); ++i)
+ EXPECT_EQ(expect_destroyed[i], destroyed[i]) << i;
+ {
+ int expect_data[4] = {1, 2, 4, 5};
+ for (size_t i = 0; i < arraysize(expect_data); ++i)
+ EXPECT_EQ(expect_data[i], v[i]->data()) << i;
+ }
+
+ // Removing from the back of the vector.
+ auto is_five = [](DataWithDestruction* d) { return d->data() == 5; };
+ v.erase(v.remove_if(is_five), v.end());
+ EXPECT_EQ(3u, v.size());
+ expect_destroyed[5]++;
+ for (size_t i = 0; i < arraysize(destroyed); ++i)
+ EXPECT_EQ(expect_destroyed[i], destroyed[i]) << i;
+ {
+ int expect_data[3] = {1, 2, 4};
+ for (size_t i = 0; i < arraysize(expect_data); ++i)
+ EXPECT_EQ(expect_data[i], v[i]->data()) << i;
+ }
+
+ // Removing from the front of the vector.
+ auto is_one = [](DataWithDestruction* d) { return d->data() == 1; };
+ v.erase(v.remove_if(is_one), v.end());
+ EXPECT_EQ(2u, v.size());
+ expect_destroyed[0]++;
+ for (size_t i = 0; i < arraysize(destroyed); ++i)
+ EXPECT_EQ(expect_destroyed[i], destroyed[i]) << i;
+ {
+ int expect_data[2] = {2, 4};
+ for (size_t i = 0; i < arraysize(expect_data); ++i)
+ EXPECT_EQ(expect_data[i], v[i]->data()) << i;
+ }
+
+ // Removing things that aren't in the vector does nothing.
+ v.erase(v.remove_if(is_one), v.end());
+ EXPECT_EQ(2u, v.size());
+ for (size_t i = 0; i < arraysize(destroyed); ++i)
+ EXPECT_EQ(expect_destroyed[i], destroyed[i]) << i;
+ {
+ int expect_data[2] = {2, 4};
+ for (size_t i = 0; i < arraysize(expect_data); ++i)
+ EXPECT_EQ(expect_data[i], v[i]->data()) << i;
+ }
+}
+
} // namespace
} // namespace cc
diff --git a/cc/blink/web_layer_impl_fixed_bounds_unittest.cc b/cc/blink/web_layer_impl_fixed_bounds_unittest.cc
index 083b0cf..c9fd4fa 100644
--- a/cc/blink/web_layer_impl_fixed_bounds_unittest.cc
+++ b/cc/blink/web_layer_impl_fixed_bounds_unittest.cc
@@ -53,8 +53,8 @@
original_point.y() * bounds.height / fixed_bounds.height(),
original_point.z());
// Test if the bounds scale is correctly applied in transform.
- EXPECT_EQ(scaled_point,
- TransformPoint(layer->layer()->transform(), original_point));
+ EXPECT_POINT3F_EQ(scaled_point, TransformPoint(layer->layer()->transform(),
+ original_point));
}
TEST(WebLayerImplFixedBoundsTest, BoundsScaleSimple) {
diff --git a/cc/cc.gyp b/cc/cc.gyp
index 5967098..43e4b20 100644
--- a/cc/cc.gyp
+++ b/cc/cc.gyp
@@ -355,8 +355,8 @@
'quads/yuv_video_draw_quad.h',
'resources/bitmap_content_layer_updater.cc',
'resources/bitmap_content_layer_updater.h',
- 'resources/bitmap_raster_worker_pool.cc',
- 'resources/bitmap_raster_worker_pool.h',
+ 'resources/bitmap_tile_task_worker_pool.cc',
+ 'resources/bitmap_tile_task_worker_pool.h',
'resources/bitmap_skpicture_content_layer_updater.cc',
'resources/bitmap_skpicture_content_layer_updater.h',
'resources/clip_display_item.cc',
@@ -377,8 +377,8 @@
'resources/eviction_tile_priority_queue.h',
'resources/filter_display_item.cc',
'resources/filter_display_item.h',
- 'resources/gpu_raster_worker_pool.cc',
- 'resources/gpu_raster_worker_pool.h',
+ 'resources/gpu_tile_task_worker_pool.cc',
+ 'resources/gpu_tile_task_worker_pool.h',
'resources/image_layer_updater.cc',
'resources/image_layer_updater.h',
'resources/layer_painter.h',
@@ -392,8 +392,8 @@
'resources/managed_tile_state.h',
'resources/memory_history.cc',
'resources/memory_history.h',
- 'resources/one_copy_raster_worker_pool.cc',
- 'resources/one_copy_raster_worker_pool.h',
+ 'resources/one_copy_tile_task_worker_pool.cc',
+ 'resources/one_copy_tile_task_worker_pool.h',
'resources/picture.cc',
'resources/picture.h',
'resources/picture_layer_tiling.cc',
@@ -404,8 +404,8 @@
'resources/picture_pile.h',
'resources/picture_pile_impl.cc',
'resources/picture_pile_impl.h',
- 'resources/pixel_buffer_raster_worker_pool.cc',
- 'resources/pixel_buffer_raster_worker_pool.h',
+ 'resources/pixel_buffer_tile_task_worker_pool.cc',
+ 'resources/pixel_buffer_tile_task_worker_pool.h',
'resources/platform_color.h',
'resources/prioritized_resource.cc',
'resources/prioritized_resource.h',
@@ -420,10 +420,10 @@
'resources/raster_source_helper.h',
'resources/raster_tile_priority_queue.cc',
'resources/raster_tile_priority_queue.h',
- 'resources/raster_worker_pool.cc',
- 'resources/raster_worker_pool.h',
- 'resources/rasterizer.cc',
- 'resources/rasterizer.h',
+ 'resources/tile_task_worker_pool.cc',
+ 'resources/tile_task_worker_pool.h',
+ 'resources/tile_task_runner.cc',
+ 'resources/tile_task_runner.h',
'resources/recording_source.h',
'resources/release_callback.h',
'resources/resource.cc',
@@ -487,8 +487,8 @@
'resources/ui_resource_request.h',
'resources/video_resource_updater.cc',
'resources/video_resource_updater.h',
- 'resources/zero_copy_raster_worker_pool.cc',
- 'resources/zero_copy_raster_worker_pool.h',
+ 'resources/zero_copy_tile_task_worker_pool.cc',
+ 'resources/zero_copy_tile_task_worker_pool.h',
'scheduler/begin_frame_source.cc',
'scheduler/begin_frame_source.h',
'scheduler/delay_based_time_source.cc',
diff --git a/cc/cc_tests.gyp b/cc/cc_tests.gyp
index d0b1000..c32fcba 100644
--- a/cc/cc_tests.gyp
+++ b/cc/cc_tests.gyp
@@ -82,7 +82,7 @@
'resources/picture_pile_unittest.cc',
'resources/picture_unittest.cc',
'resources/prioritized_resource_unittest.cc',
- 'resources/raster_worker_pool_unittest.cc',
+ 'resources/tile_task_worker_pool_unittest.cc',
'resources/resource_provider_unittest.cc',
'resources/resource_update_controller_unittest.cc',
'resources/scoped_resource_unittest.cc',
@@ -341,7 +341,7 @@
'layers/picture_layer_impl_perftest.cc',
'resources/picture_layer_tiling_perftest.cc',
'resources/picture_pile_impl_perftest.cc',
- 'resources/raster_worker_pool_perftest.cc',
+ 'resources/tile_task_worker_pool_perftest.cc',
'resources/task_graph_runner_perftest.cc',
'resources/tile_manager_perftest.cc',
'test/cc_test_suite.cc',
diff --git a/cc/debug/rasterize_and_record_benchmark_impl.cc b/cc/debug/rasterize_and_record_benchmark_impl.cc
index c1fc809..c00d0b9 100644
--- a/cc/debug/rasterize_and_record_benchmark_impl.cc
+++ b/cc/debug/rasterize_and_record_benchmark_impl.cc
@@ -12,7 +12,7 @@
#include "cc/debug/lap_timer.h"
#include "cc/layers/layer_impl.h"
#include "cc/layers/picture_layer_impl.h"
-#include "cc/resources/raster_worker_pool.h"
+#include "cc/resources/tile_task_worker_pool.h"
#include "cc/trees/layer_tree_host_common.h"
#include "cc/trees/layer_tree_host_impl.h"
#include "ui/gfx/geometry/rect.h"
@@ -207,7 +207,7 @@
return;
}
- TaskGraphRunner* task_graph_runner = RasterWorkerPool::GetTaskGraphRunner();
+ TaskGraphRunner* task_graph_runner = TileTaskWorkerPool::GetTaskGraphRunner();
DCHECK(task_graph_runner);
if (!task_namespace_.IsValid())
@@ -240,8 +240,7 @@
graph.nodes.push_back(
TaskGraph::Node(benchmark_raster_task.get(),
- RasterWorkerPool::kBenchmarkRasterTaskPriority,
- 0u));
+ TileTaskWorkerPool::kBenchmarkTaskPriority, 0u));
task_graph_runner->ScheduleTasks(task_namespace_, &graph);
task_graph_runner->WaitForTasksToFinishRunning(task_namespace_);
diff --git a/cc/layers/picture_layer_impl.cc b/cc/layers/picture_layer_impl.cc
index 6ec1f0a..54cfac8 100644
--- a/cc/layers/picture_layer_impl.cc
+++ b/cc/layers/picture_layer_impl.cc
@@ -39,13 +39,6 @@
// tiling's scale if the desired scale is within this ratio.
const float kSnapToExistingTilingRatio = 1.2f;
-// Estimate skewport 60 frames ahead for pre-rasterization on the CPU.
-const float kCpuSkewportTargetTimeInFrames = 60.0f;
-
-// Don't pre-rasterize on the GPU (except for kBackflingGuardDistancePixels in
-// TileManager::BinFromTilePriority).
-const float kGpuSkewportTargetTimeInFrames = 0.0f;
-
// Even for really wide viewports, at some point GPU raster should use
// less than 4 tiles to fill the viewport. This is set to 256 as a
// sane minimum for now, but we might want to tune this for low-end.
@@ -630,12 +623,8 @@
int flags = 0;
- // TODO(vmpstr): Revisit this. For now, enabling analysis means that we get as
- // much savings on memory as we can. However, for some cases like ganesh or
- // small layers, the amount of time we spend analyzing might not justify
- // memory savings that we can get. Note that we don't handle solid color
- // masks, so we shouldn't bother analyzing those.
- // Bugs: crbug.com/397198, crbug.com/396908
+ // We don't handle solid color masks, so we shouldn't bother analyzing those.
+ // Otherwise, always analyze to maximize memory savings.
if (!is_mask_)
flags = Tile::USE_PICTURE_ANALYSIS;
@@ -684,13 +673,9 @@
}
float PictureLayerImpl::GetSkewportTargetTimeInSeconds() const {
- float skewport_target_time_in_frames =
- layer_tree_impl()->use_gpu_rasterization()
- ? kGpuSkewportTargetTimeInFrames
- : kCpuSkewportTargetTimeInFrames;
- return skewport_target_time_in_frames *
- layer_tree_impl()->begin_impl_frame_interval().InSecondsF() *
- layer_tree_impl()->settings().skewport_target_time_multiplier;
+ return layer_tree_impl()->use_gpu_rasterization()
+ ? 0.f
+ : layer_tree_impl()->settings().skewport_target_time_in_seconds;
}
int PictureLayerImpl::GetSkewportExtrapolationLimitInContentPixels() const {
diff --git a/cc/layers/picture_layer_impl_unittest.cc b/cc/layers/picture_layer_impl_unittest.cc
index 4d3b751..90a36f7 100644
--- a/cc/layers/picture_layer_impl_unittest.cc
+++ b/cc/layers/picture_layer_impl_unittest.cc
@@ -3824,7 +3824,7 @@
resource_limit);
host_impl_.SetMemoryPolicy(policy);
host_impl_.SetTreePriority(SAME_PRIORITY_FOR_BOTH_TREES);
- host_impl_.ManageTiles();
+ host_impl_.PrepareTiles();
scoped_ptr<RenderPass> render_pass = RenderPass::Create();
AppendQuadsData data;
diff --git a/cc/quads/draw_polygon_unittest.cc b/cc/quads/draw_polygon_unittest.cc
index 360a014..27cfed4 100644
--- a/cc/quads/draw_polygon_unittest.cc
+++ b/cc/quads/draw_polygon_unittest.cc
@@ -19,11 +19,16 @@
#define EXPECT_FLOAT_WITHIN_EPSILON_OF(a, b) \
EXPECT_TRUE(std::abs(a - b) < std::numeric_limits<float>::epsilon());
+#define EXPECT_POINT_EQ(point_a, point_b) \
+ EXPECT_FLOAT_EQ(point_a.x(), point_b.x()); \
+ EXPECT_FLOAT_EQ(point_a.y(), point_b.y()); \
+ EXPECT_FLOAT_EQ(point_a.z(), point_b.z());
+
static void ValidatePoints(const DrawPolygon& polygon,
const std::vector<gfx::Point3F>& points) {
EXPECT_EQ(polygon.points().size(), points.size());
for (size_t i = 0; i < points.size(); i++) {
- EXPECT_EQ(polygon.points()[i], points[i]);
+ EXPECT_POINT_EQ(polygon.points()[i], points[i]);
}
}
diff --git a/cc/resources/bitmap_raster_worker_pool.cc b/cc/resources/bitmap_raster_worker_pool.cc
deleted file mode 100644
index a7adf4e..0000000
--- a/cc/resources/bitmap_raster_worker_pool.cc
+++ /dev/null
@@ -1,206 +0,0 @@
-// 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.
-
-#include "cc/resources/bitmap_raster_worker_pool.h"
-
-#include <algorithm>
-
-#include "base/debug/trace_event.h"
-#include "base/debug/trace_event_argument.h"
-#include "base/strings/stringprintf.h"
-#include "cc/debug/traced_value.h"
-#include "cc/resources/raster_buffer.h"
-#include "cc/resources/raster_source.h"
-#include "cc/resources/resource.h"
-
-namespace cc {
-namespace {
-
-class RasterBufferImpl : public RasterBuffer {
- public:
- RasterBufferImpl(ResourceProvider* resource_provider,
- const Resource* resource)
- : lock_(resource_provider, resource->id()), resource_(resource) {}
-
- // Overridden from RasterBuffer:
- void Playback(const RasterSource* raster_source,
- const gfx::Rect& rect,
- float scale) override {
- RasterWorkerPool::PlaybackToMemory(lock_.sk_bitmap().getPixels(),
- resource_->format(), resource_->size(),
- 0, raster_source, rect, scale);
- }
-
- private:
- ResourceProvider::ScopedWriteLockSoftware lock_;
- const Resource* resource_;
-
- DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl);
-};
-
-} // namespace
-
-// static
-scoped_ptr<RasterWorkerPool> BitmapRasterWorkerPool::Create(
- base::SequencedTaskRunner* task_runner,
- TaskGraphRunner* task_graph_runner,
- ResourceProvider* resource_provider) {
- return make_scoped_ptr<RasterWorkerPool>(new BitmapRasterWorkerPool(
- task_runner, task_graph_runner, resource_provider));
-}
-
-BitmapRasterWorkerPool::BitmapRasterWorkerPool(
- base::SequencedTaskRunner* task_runner,
- TaskGraphRunner* task_graph_runner,
- ResourceProvider* resource_provider)
- : task_runner_(task_runner),
- task_graph_runner_(task_graph_runner),
- namespace_token_(task_graph_runner->GetNamespaceToken()),
- resource_provider_(resource_provider),
- raster_finished_weak_ptr_factory_(this) {
-}
-
-BitmapRasterWorkerPool::~BitmapRasterWorkerPool() {
-}
-
-Rasterizer* BitmapRasterWorkerPool::AsRasterizer() {
- return this;
-}
-
-void BitmapRasterWorkerPool::SetClient(RasterizerClient* client) {
- client_ = client;
-}
-
-void BitmapRasterWorkerPool::Shutdown() {
- TRACE_EVENT0("cc", "BitmapRasterWorkerPool::Shutdown");
-
- TaskGraph empty;
- task_graph_runner_->ScheduleTasks(namespace_token_, &empty);
- task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_);
-}
-
-void BitmapRasterWorkerPool::ScheduleTasks(RasterTaskQueue* queue) {
- TRACE_EVENT0("cc", "BitmapRasterWorkerPool::ScheduleTasks");
-
- if (raster_pending_.none())
- TRACE_EVENT_ASYNC_BEGIN0("cc", "ScheduledTasks", this);
-
- // Mark all task sets as pending.
- raster_pending_.set();
-
- unsigned priority = kRasterTaskPriorityBase;
-
- graph_.Reset();
-
- // Cancel existing OnRasterFinished callbacks.
- raster_finished_weak_ptr_factory_.InvalidateWeakPtrs();
-
- scoped_refptr<RasterizerTask> new_raster_finished_tasks[kNumberOfTaskSets];
-
- size_t task_count[kNumberOfTaskSets] = {0};
-
- for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) {
- new_raster_finished_tasks[task_set] = CreateRasterFinishedTask(
- task_runner_.get(),
- base::Bind(&BitmapRasterWorkerPool::OnRasterFinished,
- raster_finished_weak_ptr_factory_.GetWeakPtr(),
- task_set));
- }
-
- for (RasterTaskQueue::Item::Vector::const_iterator it = queue->items.begin();
- it != queue->items.end();
- ++it) {
- const RasterTaskQueue::Item& item = *it;
- RasterTask* task = item.task;
- DCHECK(!task->HasCompleted());
-
- for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) {
- if (!item.task_sets[task_set])
- continue;
-
- ++task_count[task_set];
-
- graph_.edges.push_back(
- TaskGraph::Edge(task, new_raster_finished_tasks[task_set].get()));
- }
-
- InsertNodesForRasterTask(&graph_, task, task->dependencies(), priority++);
- }
-
- for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) {
- InsertNodeForTask(&graph_,
- new_raster_finished_tasks[task_set].get(),
- kRasterFinishedTaskPriority,
- task_count[task_set]);
- }
-
- ScheduleTasksOnOriginThread(this, &graph_);
- task_graph_runner_->ScheduleTasks(namespace_token_, &graph_);
-
- std::copy(new_raster_finished_tasks,
- new_raster_finished_tasks + kNumberOfTaskSets,
- raster_finished_tasks_);
-
- TRACE_EVENT_ASYNC_STEP_INTO1(
- "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue());
-}
-
-void BitmapRasterWorkerPool::CheckForCompletedTasks() {
- TRACE_EVENT0("cc", "BitmapRasterWorkerPool::CheckForCompletedTasks");
-
- task_graph_runner_->CollectCompletedTasks(namespace_token_,
- &completed_tasks_);
- for (Task::Vector::const_iterator it = completed_tasks_.begin();
- it != completed_tasks_.end();
- ++it) {
- RasterizerTask* task = static_cast<RasterizerTask*>(it->get());
-
- task->WillComplete();
- task->CompleteOnOriginThread(this);
- task->DidComplete();
-
- task->RunReplyOnOriginThread();
- }
- completed_tasks_.clear();
-}
-
-scoped_ptr<RasterBuffer> BitmapRasterWorkerPool::AcquireBufferForRaster(
- const Resource* resource) {
- return make_scoped_ptr<RasterBuffer>(
- new RasterBufferImpl(resource_provider_, resource));
-}
-
-void BitmapRasterWorkerPool::ReleaseBufferForRaster(
- scoped_ptr<RasterBuffer> buffer) {
- // Nothing to do here. RasterBufferImpl destructor cleans up after itself.
-}
-
-void BitmapRasterWorkerPool::OnRasterFinished(TaskSet task_set) {
- TRACE_EVENT1(
- "cc", "BitmapRasterWorkerPool::OnRasterFinished", "task_set", task_set);
-
- DCHECK(raster_pending_[task_set]);
- raster_pending_[task_set] = false;
- if (raster_pending_.any()) {
- TRACE_EVENT_ASYNC_STEP_INTO1(
- "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue());
- } else {
- TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this);
- }
- client_->DidFinishRunningTasks(task_set);
-}
-
-scoped_refptr<base::debug::ConvertableToTraceFormat>
-BitmapRasterWorkerPool::StateAsValue() const {
- scoped_refptr<base::debug::TracedValue> state =
- new base::debug::TracedValue();
-
- state->BeginArray("tasks_pending");
- for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set)
- state->AppendBoolean(raster_pending_[task_set]);
- state->EndArray();
- return state;
-}
-
-} // namespace cc
diff --git a/cc/resources/bitmap_raster_worker_pool.h b/cc/resources/bitmap_raster_worker_pool.h
deleted file mode 100644
index 624318b..0000000
--- a/cc/resources/bitmap_raster_worker_pool.h
+++ /dev/null
@@ -1,79 +0,0 @@
-// 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.
-
-#ifndef CC_RESOURCES_BITMAP_RASTER_WORKER_POOL_H_
-#define CC_RESOURCES_BITMAP_RASTER_WORKER_POOL_H_
-
-#include "base/memory/weak_ptr.h"
-#include "base/values.h"
-#include "cc/resources/raster_worker_pool.h"
-#include "cc/resources/rasterizer.h"
-
-namespace base {
-namespace debug {
-class ConvertableToTraceFormat;
-}
-}
-
-namespace cc {
-class ResourceProvider;
-
-class CC_EXPORT BitmapRasterWorkerPool : public RasterWorkerPool,
- public Rasterizer,
- public RasterizerTaskClient {
- public:
- ~BitmapRasterWorkerPool() override;
-
- static scoped_ptr<RasterWorkerPool> Create(
- base::SequencedTaskRunner* task_runner,
- TaskGraphRunner* task_graph_runner,
- ResourceProvider* resource_provider);
-
- // Overridden from RasterWorkerPool:
- Rasterizer* AsRasterizer() override;
-
- // Overridden from Rasterizer:
- void SetClient(RasterizerClient* client) override;
- void Shutdown() override;
- void ScheduleTasks(RasterTaskQueue* queue) override;
- void CheckForCompletedTasks() override;
-
- // Overridden from RasterizerTaskClient:
- scoped_ptr<RasterBuffer> AcquireBufferForRaster(
- const Resource* resource) override;
- void ReleaseBufferForRaster(scoped_ptr<RasterBuffer> buffer) override;
-
- protected:
- BitmapRasterWorkerPool(base::SequencedTaskRunner* task_runner,
- TaskGraphRunner* task_graph_runner,
- ResourceProvider* resource_provider);
-
- private:
- void OnRasterFinished(TaskSet task_set);
- scoped_refptr<base::debug::ConvertableToTraceFormat> StateAsValue() const;
-
- scoped_refptr<base::SequencedTaskRunner> task_runner_;
- TaskGraphRunner* task_graph_runner_;
- const NamespaceToken namespace_token_;
- RasterizerClient* client_;
- ResourceProvider* resource_provider_;
-
- TaskSetCollection raster_pending_;
-
- scoped_refptr<RasterizerTask> raster_finished_tasks_[kNumberOfTaskSets];
-
- // Task graph used when scheduling tasks and vector used to gather
- // completed tasks.
- TaskGraph graph_;
- Task::Vector completed_tasks_;
-
- base::WeakPtrFactory<BitmapRasterWorkerPool>
- raster_finished_weak_ptr_factory_;
-
- DISALLOW_COPY_AND_ASSIGN(BitmapRasterWorkerPool);
-};
-
-} // namespace cc
-
-#endif // CC_RESOURCES_BITMAP_RASTER_WORKER_POOL_H_
diff --git a/cc/resources/bitmap_tile_task_worker_pool.cc b/cc/resources/bitmap_tile_task_worker_pool.cc
new file mode 100644
index 0000000..c4bd1f2
--- /dev/null
+++ b/cc/resources/bitmap_tile_task_worker_pool.cc
@@ -0,0 +1,201 @@
+// 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.
+
+#include "cc/resources/bitmap_tile_task_worker_pool.h"
+
+#include <algorithm>
+
+#include "base/debug/trace_event.h"
+#include "base/debug/trace_event_argument.h"
+#include "base/strings/stringprintf.h"
+#include "cc/debug/traced_value.h"
+#include "cc/resources/raster_buffer.h"
+#include "cc/resources/raster_source.h"
+#include "cc/resources/resource.h"
+
+namespace cc {
+namespace {
+
+class RasterBufferImpl : public RasterBuffer {
+ public:
+ RasterBufferImpl(ResourceProvider* resource_provider,
+ const Resource* resource)
+ : lock_(resource_provider, resource->id()), resource_(resource) {}
+
+ // Overridden from RasterBuffer:
+ void Playback(const RasterSource* raster_source,
+ const gfx::Rect& rect,
+ float scale) override {
+ TileTaskWorkerPool::PlaybackToMemory(lock_.sk_bitmap().getPixels(),
+ resource_->format(), resource_->size(),
+ 0, raster_source, rect, scale);
+ }
+
+ private:
+ ResourceProvider::ScopedWriteLockSoftware lock_;
+ const Resource* resource_;
+
+ DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl);
+};
+
+} // namespace
+
+// static
+scoped_ptr<TileTaskWorkerPool> BitmapTileTaskWorkerPool::Create(
+ base::SequencedTaskRunner* task_runner,
+ TaskGraphRunner* task_graph_runner,
+ ResourceProvider* resource_provider) {
+ return make_scoped_ptr<TileTaskWorkerPool>(new BitmapTileTaskWorkerPool(
+ task_runner, task_graph_runner, resource_provider));
+}
+
+BitmapTileTaskWorkerPool::BitmapTileTaskWorkerPool(
+ base::SequencedTaskRunner* task_runner,
+ TaskGraphRunner* task_graph_runner,
+ ResourceProvider* resource_provider)
+ : task_runner_(task_runner),
+ task_graph_runner_(task_graph_runner),
+ namespace_token_(task_graph_runner->GetNamespaceToken()),
+ resource_provider_(resource_provider),
+ task_set_finished_weak_ptr_factory_(this) {
+}
+
+BitmapTileTaskWorkerPool::~BitmapTileTaskWorkerPool() {
+}
+
+TileTaskRunner* BitmapTileTaskWorkerPool::AsTileTaskRunner() {
+ return this;
+}
+
+void BitmapTileTaskWorkerPool::SetClient(TileTaskRunnerClient* client) {
+ client_ = client;
+}
+
+void BitmapTileTaskWorkerPool::Shutdown() {
+ TRACE_EVENT0("cc", "BitmapTileTaskWorkerPool::Shutdown");
+
+ TaskGraph empty;
+ task_graph_runner_->ScheduleTasks(namespace_token_, &empty);
+ task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_);
+}
+
+void BitmapTileTaskWorkerPool::ScheduleTasks(TileTaskQueue* queue) {
+ TRACE_EVENT0("cc", "BitmapTileTaskWorkerPool::ScheduleTasks");
+
+ if (tasks_pending_.none())
+ TRACE_EVENT_ASYNC_BEGIN0("cc", "ScheduledTasks", this);
+
+ // Mark all task sets as pending.
+ tasks_pending_.set();
+
+ unsigned priority = kTileTaskPriorityBase;
+
+ graph_.Reset();
+
+ // Cancel existing OnTaskSetFinished callbacks.
+ task_set_finished_weak_ptr_factory_.InvalidateWeakPtrs();
+
+ scoped_refptr<TileTask> new_task_set_finished_tasks[kNumberOfTaskSets];
+
+ size_t task_count[kNumberOfTaskSets] = {0};
+
+ for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) {
+ new_task_set_finished_tasks[task_set] = CreateTaskSetFinishedTask(
+ task_runner_.get(),
+ base::Bind(&BitmapTileTaskWorkerPool::OnTaskSetFinished,
+ task_set_finished_weak_ptr_factory_.GetWeakPtr(), task_set));
+ }
+
+ for (TileTaskQueue::Item::Vector::const_iterator it = queue->items.begin();
+ it != queue->items.end(); ++it) {
+ const TileTaskQueue::Item& item = *it;
+ RasterTask* task = item.task;
+ DCHECK(!task->HasCompleted());
+
+ for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) {
+ if (!item.task_sets[task_set])
+ continue;
+
+ ++task_count[task_set];
+
+ graph_.edges.push_back(
+ TaskGraph::Edge(task, new_task_set_finished_tasks[task_set].get()));
+ }
+
+ InsertNodesForRasterTask(&graph_, task, task->dependencies(), priority++);
+ }
+
+ for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) {
+ InsertNodeForTask(&graph_, new_task_set_finished_tasks[task_set].get(),
+ kTaskSetFinishedTaskPriority, task_count[task_set]);
+ }
+
+ ScheduleTasksOnOriginThread(this, &graph_);
+ task_graph_runner_->ScheduleTasks(namespace_token_, &graph_);
+
+ std::copy(new_task_set_finished_tasks,
+ new_task_set_finished_tasks + kNumberOfTaskSets,
+ task_set_finished_tasks_);
+
+ TRACE_EVENT_ASYNC_STEP_INTO1("cc", "ScheduledTasks", this, "running", "state",
+ StateAsValue());
+}
+
+void BitmapTileTaskWorkerPool::CheckForCompletedTasks() {
+ TRACE_EVENT0("cc", "BitmapTileTaskWorkerPool::CheckForCompletedTasks");
+
+ task_graph_runner_->CollectCompletedTasks(namespace_token_,
+ &completed_tasks_);
+ for (Task::Vector::const_iterator it = completed_tasks_.begin();
+ it != completed_tasks_.end(); ++it) {
+ TileTask* task = static_cast<TileTask*>(it->get());
+
+ task->WillComplete();
+ task->CompleteOnOriginThread(this);
+ task->DidComplete();
+
+ task->RunReplyOnOriginThread();
+ }
+ completed_tasks_.clear();
+}
+
+scoped_ptr<RasterBuffer> BitmapTileTaskWorkerPool::AcquireBufferForRaster(
+ const Resource* resource) {
+ return make_scoped_ptr<RasterBuffer>(
+ new RasterBufferImpl(resource_provider_, resource));
+}
+
+void BitmapTileTaskWorkerPool::ReleaseBufferForRaster(
+ scoped_ptr<RasterBuffer> buffer) {
+ // Nothing to do here. RasterBufferImpl destructor cleans up after itself.
+}
+
+void BitmapTileTaskWorkerPool::OnTaskSetFinished(TaskSet task_set) {
+ TRACE_EVENT1("cc", "BitmapTileTaskWorkerPool::OnTaskSetFinished", "task_set",
+ task_set);
+
+ DCHECK(tasks_pending_[task_set]);
+ tasks_pending_[task_set] = false;
+ if (tasks_pending_.any()) {
+ TRACE_EVENT_ASYNC_STEP_INTO1("cc", "ScheduledTasks", this, "running",
+ "state", StateAsValue());
+ } else {
+ TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this);
+ }
+ client_->DidFinishRunningTileTasks(task_set);
+}
+
+scoped_refptr<base::debug::ConvertableToTraceFormat>
+BitmapTileTaskWorkerPool::StateAsValue() const {
+ scoped_refptr<base::debug::TracedValue> state =
+ new base::debug::TracedValue();
+
+ state->BeginArray("tasks_pending");
+ for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set)
+ state->AppendBoolean(tasks_pending_[task_set]);
+ state->EndArray();
+ return state;
+}
+
+} // namespace cc
diff --git a/cc/resources/bitmap_tile_task_worker_pool.h b/cc/resources/bitmap_tile_task_worker_pool.h
new file mode 100644
index 0000000..4f5d970
--- /dev/null
+++ b/cc/resources/bitmap_tile_task_worker_pool.h
@@ -0,0 +1,79 @@
+// 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.
+
+#ifndef CC_RESOURCES_BITMAP_TILE_TASK_WORKER_POOL_H_
+#define CC_RESOURCES_BITMAP_TILE_TASK_WORKER_POOL_H_
+
+#include "base/memory/weak_ptr.h"
+#include "base/values.h"
+#include "cc/resources/tile_task_runner.h"
+#include "cc/resources/tile_task_worker_pool.h"
+
+namespace base {
+namespace debug {
+class ConvertableToTraceFormat;
+}
+}
+
+namespace cc {
+class ResourceProvider;
+
+class CC_EXPORT BitmapTileTaskWorkerPool : public TileTaskWorkerPool,
+ public TileTaskRunner,
+ public TileTaskClient {
+ public:
+ ~BitmapTileTaskWorkerPool() override;
+
+ static scoped_ptr<TileTaskWorkerPool> Create(
+ base::SequencedTaskRunner* task_runner,
+ TaskGraphRunner* task_graph_runner,
+ ResourceProvider* resource_provider);
+
+ // Overridden from TileTaskWorkerPool:
+ TileTaskRunner* AsTileTaskRunner() override;
+
+ // Overridden from TileTaskRunner:
+ void SetClient(TileTaskRunnerClient* client) override;
+ void Shutdown() override;
+ void ScheduleTasks(TileTaskQueue* queue) override;
+ void CheckForCompletedTasks() override;
+
+ // Overridden from TileTaskClient:
+ scoped_ptr<RasterBuffer> AcquireBufferForRaster(
+ const Resource* resource) override;
+ void ReleaseBufferForRaster(scoped_ptr<RasterBuffer> buffer) override;
+
+ protected:
+ BitmapTileTaskWorkerPool(base::SequencedTaskRunner* task_runner,
+ TaskGraphRunner* task_graph_runner,
+ ResourceProvider* resource_provider);
+
+ private:
+ void OnTaskSetFinished(TaskSet task_set);
+ scoped_refptr<base::debug::ConvertableToTraceFormat> StateAsValue() const;
+
+ scoped_refptr<base::SequencedTaskRunner> task_runner_;
+ TaskGraphRunner* task_graph_runner_;
+ const NamespaceToken namespace_token_;
+ TileTaskRunnerClient* client_;
+ ResourceProvider* resource_provider_;
+
+ TaskSetCollection tasks_pending_;
+
+ scoped_refptr<TileTask> task_set_finished_tasks_[kNumberOfTaskSets];
+
+ // Task graph used when scheduling tasks and vector used to gather
+ // completed tasks.
+ TaskGraph graph_;
+ Task::Vector completed_tasks_;
+
+ base::WeakPtrFactory<BitmapTileTaskWorkerPool>
+ task_set_finished_weak_ptr_factory_;
+
+ DISALLOW_COPY_AND_ASSIGN(BitmapTileTaskWorkerPool);
+};
+
+} // namespace cc
+
+#endif // CC_RESOURCES_BITMAP_TILE_TASK_WORKER_POOL_H_
diff --git a/cc/resources/gpu_raster_worker_pool.h b/cc/resources/gpu_raster_worker_pool.h
deleted file mode 100644
index c5ff13f..0000000
--- a/cc/resources/gpu_raster_worker_pool.h
+++ /dev/null
@@ -1,83 +0,0 @@
-// 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.
-
-#ifndef CC_RESOURCES_GPU_RASTER_WORKER_POOL_H_
-#define CC_RESOURCES_GPU_RASTER_WORKER_POOL_H_
-
-#include "base/memory/weak_ptr.h"
-#include "cc/resources/raster_worker_pool.h"
-#include "cc/resources/rasterizer.h"
-#include "third_party/skia/include/core/SkMultiPictureDraw.h"
-
-namespace cc {
-class ContextProvider;
-class ResourceProvider;
-
-class CC_EXPORT GpuRasterWorkerPool : public RasterWorkerPool,
- public Rasterizer,
- public RasterizerTaskClient {
- public:
- ~GpuRasterWorkerPool() override;
-
- static scoped_ptr<RasterWorkerPool> Create(
- base::SequencedTaskRunner* task_runner,
- ContextProvider* context_provider,
- ResourceProvider* resource_provider,
- bool use_distance_field_text);
-
- // Overridden from RasterWorkerPool:
- Rasterizer* AsRasterizer() override;
-
- // Overridden from Rasterizer:
- void SetClient(RasterizerClient* client) override;
- void Shutdown() override;
- void ScheduleTasks(RasterTaskQueue* queue) override;
- void CheckForCompletedTasks() override;
-
- // Overridden from RasterizerTaskClient:
- scoped_ptr<RasterBuffer> AcquireBufferForRaster(
- const Resource* resource) override;
- void ReleaseBufferForRaster(scoped_ptr<RasterBuffer> buffer) override;
-
- private:
- GpuRasterWorkerPool(base::SequencedTaskRunner* task_runner,
- ContextProvider* context_provider,
- ResourceProvider* resource_provider,
- bool use_distance_field_text);
-
- void OnRasterFinished(TaskSet task_set);
- void ScheduleRunTasksOnOriginThread();
- void RunTasksOnOriginThread();
- void RunTaskOnOriginThread(RasterizerTask* task);
-
- scoped_refptr<base::SequencedTaskRunner> task_runner_;
- scoped_ptr<TaskGraphRunner> task_graph_runner_;
- const NamespaceToken namespace_token_;
- RasterizerClient* client_;
- ContextProvider* context_provider_;
- ResourceProvider* resource_provider_;
- SkMultiPictureDraw multi_picture_draw_;
-
- bool run_tasks_on_origin_thread_pending_;
- bool use_distance_field_text_;
-
- TaskSetCollection raster_pending_;
-
- scoped_refptr<RasterizerTask> raster_finished_tasks_[kNumberOfTaskSets];
-
- // Task graph used when scheduling tasks and vector used to gather
- // completed tasks.
- TaskGraph graph_;
- Task::Vector completed_tasks_;
-
- base::WeakPtrFactory<GpuRasterWorkerPool> raster_finished_weak_ptr_factory_;
-
- base::WeakPtrFactory<GpuRasterWorkerPool> weak_ptr_factory_;
-
- DISALLOW_COPY_AND_ASSIGN(GpuRasterWorkerPool);
-};
-
-} // namespace cc
-
-#endif // CC_RESOURCES_GPU_RASTER_WORKER_POOL_H_
diff --git a/cc/resources/gpu_raster_worker_pool.cc b/cc/resources/gpu_tile_task_worker_pool.cc
similarity index 60%
rename from cc/resources/gpu_raster_worker_pool.cc
rename to cc/resources/gpu_tile_task_worker_pool.cc
index d29855a..2cd4edd 100644
--- a/cc/resources/gpu_raster_worker_pool.cc
+++ b/cc/resources/gpu_tile_task_worker_pool.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "cc/resources/gpu_raster_worker_pool.h"
+#include "cc/resources/gpu_tile_task_worker_pool.h"
#include <algorithm>
@@ -50,10 +50,8 @@
SkPictureRecorder recorder;
gfx::Size size = resource_->size();
const int flags = SkPictureRecorder::kComputeSaveLayerInfo_RecordFlag;
- skia::RefPtr<SkCanvas> canvas =
- skia::SharePtr(recorder.beginRecording(size.width(), size.height(),
- NULL, flags));
-
+ skia::RefPtr<SkCanvas> canvas = skia::SharePtr(
+ recorder.beginRecording(size.width(), size.height(), NULL, flags));
canvas->save();
raster_source->PlaybackToCanvas(canvas.get(), rect, scale);
@@ -76,22 +74,21 @@
} // namespace
// static
-scoped_ptr<RasterWorkerPool> GpuRasterWorkerPool::Create(
+scoped_ptr<TileTaskWorkerPool> GpuTileTaskWorkerPool::Create(
base::SequencedTaskRunner* task_runner,
ContextProvider* context_provider,
ResourceProvider* resource_provider,
bool use_distance_field_text) {
- return make_scoped_ptr<RasterWorkerPool>(
- new GpuRasterWorkerPool(task_runner,
- context_provider,
- resource_provider,
- use_distance_field_text));
+ return make_scoped_ptr<TileTaskWorkerPool>(
+ new GpuTileTaskWorkerPool(task_runner, context_provider,
+ resource_provider, use_distance_field_text));
}
-GpuRasterWorkerPool::GpuRasterWorkerPool(base::SequencedTaskRunner* task_runner,
- ContextProvider* context_provider,
- ResourceProvider* resource_provider,
- bool use_distance_field_text)
+GpuTileTaskWorkerPool::GpuTileTaskWorkerPool(
+ base::SequencedTaskRunner* task_runner,
+ ContextProvider* context_provider,
+ ResourceProvider* resource_provider,
+ bool use_distance_field_text)
: task_runner_(task_runner),
task_graph_runner_(new TaskGraphRunner),
namespace_token_(task_graph_runner_->GetNamespaceToken()),
@@ -99,60 +96,58 @@
resource_provider_(resource_provider),
run_tasks_on_origin_thread_pending_(false),
use_distance_field_text_(use_distance_field_text),
- raster_finished_weak_ptr_factory_(this),
+ task_set_finished_weak_ptr_factory_(this),
weak_ptr_factory_(this) {
DCHECK(context_provider_);
}
-GpuRasterWorkerPool::~GpuRasterWorkerPool() {
+GpuTileTaskWorkerPool::~GpuTileTaskWorkerPool() {
DCHECK_EQ(0u, completed_tasks_.size());
}
-Rasterizer* GpuRasterWorkerPool::AsRasterizer() {
+TileTaskRunner* GpuTileTaskWorkerPool::AsTileTaskRunner() {
return this;
}
-void GpuRasterWorkerPool::SetClient(RasterizerClient* client) {
+void GpuTileTaskWorkerPool::SetClient(TileTaskRunnerClient* client) {
client_ = client;
}
-void GpuRasterWorkerPool::Shutdown() {
- TRACE_EVENT0("cc", "GpuRasterWorkerPool::Shutdown");
+void GpuTileTaskWorkerPool::Shutdown() {
+ TRACE_EVENT0("cc", "GpuTileTaskWorkerPool::Shutdown");
TaskGraph empty;
task_graph_runner_->ScheduleTasks(namespace_token_, &empty);
task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_);
}
-void GpuRasterWorkerPool::ScheduleTasks(RasterTaskQueue* queue) {
- TRACE_EVENT0("cc", "GpuRasterWorkerPool::ScheduleTasks");
+void GpuTileTaskWorkerPool::ScheduleTasks(TileTaskQueue* queue) {
+ TRACE_EVENT0("cc", "GpuTileTaskWorkerPool::ScheduleTasks");
// Mark all task sets as pending.
- raster_pending_.set();
+ tasks_pending_.set();
- unsigned priority = kRasterTaskPriorityBase;
+ unsigned priority = kTileTaskPriorityBase;
graph_.Reset();
- // Cancel existing OnRasterFinished callbacks.
- raster_finished_weak_ptr_factory_.InvalidateWeakPtrs();
+ // Cancel existing OnTaskSetFinished callbacks.
+ task_set_finished_weak_ptr_factory_.InvalidateWeakPtrs();
- scoped_refptr<RasterizerTask> new_raster_finished_tasks[kNumberOfTaskSets];
+ scoped_refptr<TileTask> new_task_set_finished_tasks[kNumberOfTaskSets];
size_t task_count[kNumberOfTaskSets] = {0};
for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) {
- new_raster_finished_tasks[task_set] = CreateRasterFinishedTask(
+ new_task_set_finished_tasks[task_set] = CreateTaskSetFinishedTask(
task_runner_.get(),
- base::Bind(&GpuRasterWorkerPool::OnRasterFinished,
- raster_finished_weak_ptr_factory_.GetWeakPtr(),
- task_set));
+ base::Bind(&GpuTileTaskWorkerPool::OnTaskSetFinished,
+ task_set_finished_weak_ptr_factory_.GetWeakPtr(), task_set));
}
- for (RasterTaskQueue::Item::Vector::const_iterator it = queue->items.begin();
- it != queue->items.end();
- ++it) {
- const RasterTaskQueue::Item& item = *it;
+ for (TileTaskQueue::Item::Vector::const_iterator it = queue->items.begin();
+ it != queue->items.end(); ++it) {
+ const TileTaskQueue::Item& item = *it;
RasterTask* task = item.task;
DCHECK(!task->HasCompleted());
@@ -163,17 +158,15 @@
++task_count[task_set];
graph_.edges.push_back(
- TaskGraph::Edge(task, new_raster_finished_tasks[task_set].get()));
+ TaskGraph::Edge(task, new_task_set_finished_tasks[task_set].get()));
}
InsertNodesForRasterTask(&graph_, task, task->dependencies(), priority++);
}
for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) {
- InsertNodeForTask(&graph_,
- new_raster_finished_tasks[task_set].get(),
- kRasterFinishedTaskPriority,
- task_count[task_set]);
+ InsertNodeForTask(&graph_, new_task_set_finished_tasks[task_set].get(),
+ kTaskSetFinishedTaskPriority, task_count[task_set]);
}
ScheduleTasksOnOriginThread(this, &graph_);
@@ -181,20 +174,19 @@
ScheduleRunTasksOnOriginThread();
- std::copy(new_raster_finished_tasks,
- new_raster_finished_tasks + kNumberOfTaskSets,
- raster_finished_tasks_);
+ std::copy(new_task_set_finished_tasks,
+ new_task_set_finished_tasks + kNumberOfTaskSets,
+ task_set_finished_tasks_);
}
-void GpuRasterWorkerPool::CheckForCompletedTasks() {
- TRACE_EVENT0("cc", "GpuRasterWorkerPool::CheckForCompletedTasks");
+void GpuTileTaskWorkerPool::CheckForCompletedTasks() {
+ TRACE_EVENT0("cc", "GpuTileTaskWorkerPool::CheckForCompletedTasks");
task_graph_runner_->CollectCompletedTasks(namespace_token_,
&completed_tasks_);
for (Task::Vector::const_iterator it = completed_tasks_.begin();
- it != completed_tasks_.end();
- ++it) {
- RasterizerTask* task = static_cast<RasterizerTask*>(it->get());
+ it != completed_tasks_.end(); ++it) {
+ TileTask* task = static_cast<TileTask*>(it->get());
task->WillComplete();
task->CompleteOnOriginThread(this);
@@ -205,42 +197,39 @@
completed_tasks_.clear();
}
-scoped_ptr<RasterBuffer> GpuRasterWorkerPool::AcquireBufferForRaster(
+scoped_ptr<RasterBuffer> GpuTileTaskWorkerPool::AcquireBufferForRaster(
const Resource* resource) {
return make_scoped_ptr<RasterBuffer>(
- new RasterBufferImpl(resource_provider_,
- resource,
- &multi_picture_draw_,
+ new RasterBufferImpl(resource_provider_, resource, &multi_picture_draw_,
use_distance_field_text_));
}
-void GpuRasterWorkerPool::ReleaseBufferForRaster(
+void GpuTileTaskWorkerPool::ReleaseBufferForRaster(
scoped_ptr<RasterBuffer> buffer) {
// Nothing to do here. RasterBufferImpl destructor cleans up after itself.
}
-void GpuRasterWorkerPool::OnRasterFinished(TaskSet task_set) {
- TRACE_EVENT1(
- "cc", "GpuRasterWorkerPool::OnRasterFinished", "task_set", task_set);
+void GpuTileTaskWorkerPool::OnTaskSetFinished(TaskSet task_set) {
+ TRACE_EVENT1("cc", "GpuTileTaskWorkerPool::OnTaskSetFinished", "task_set",
+ task_set);
- DCHECK(raster_pending_[task_set]);
- raster_pending_[task_set] = false;
- client_->DidFinishRunningTasks(task_set);
+ DCHECK(tasks_pending_[task_set]);
+ tasks_pending_[task_set] = false;
+ client_->DidFinishRunningTileTasks(task_set);
}
-void GpuRasterWorkerPool::ScheduleRunTasksOnOriginThread() {
+void GpuTileTaskWorkerPool::ScheduleRunTasksOnOriginThread() {
if (run_tasks_on_origin_thread_pending_)
return;
task_runner_->PostTask(
- FROM_HERE,
- base::Bind(&GpuRasterWorkerPool::RunTasksOnOriginThread,
- weak_ptr_factory_.GetWeakPtr()));
+ FROM_HERE, base::Bind(&GpuTileTaskWorkerPool::RunTasksOnOriginThread,
+ weak_ptr_factory_.GetWeakPtr()));
run_tasks_on_origin_thread_pending_ = true;
}
-void GpuRasterWorkerPool::RunTasksOnOriginThread() {
- TRACE_EVENT0("cc", "GpuRasterWorkerPool::RunTasksOnOriginThread");
+void GpuTileTaskWorkerPool::RunTasksOnOriginThread() {
+ TRACE_EVENT0("cc", "GpuTileTaskWorkerPool::RunTasksOnOriginThread");
DCHECK(run_tasks_on_origin_thread_pending_);
run_tasks_on_origin_thread_pending_ = false;
diff --git a/cc/resources/gpu_tile_task_worker_pool.h b/cc/resources/gpu_tile_task_worker_pool.h
new file mode 100644
index 0000000..363b0a6
--- /dev/null
+++ b/cc/resources/gpu_tile_task_worker_pool.h
@@ -0,0 +1,84 @@
+// 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.
+
+#ifndef CC_RESOURCES_GPU_TILE_TASK_WORKER_POOL_H_
+#define CC_RESOURCES_GPU_TILE_TASK_WORKER_POOL_H_
+
+#include "base/memory/weak_ptr.h"
+#include "cc/resources/tile_task_runner.h"
+#include "cc/resources/tile_task_worker_pool.h"
+#include "third_party/skia/include/core/SkMultiPictureDraw.h"
+
+namespace cc {
+class ContextProvider;
+class ResourceProvider;
+
+class CC_EXPORT GpuTileTaskWorkerPool : public TileTaskWorkerPool,
+ public TileTaskRunner,
+ public TileTaskClient {
+ public:
+ ~GpuTileTaskWorkerPool() override;
+
+ static scoped_ptr<TileTaskWorkerPool> Create(
+ base::SequencedTaskRunner* task_runner,
+ ContextProvider* context_provider,
+ ResourceProvider* resource_provider,
+ bool use_distance_field_text);
+
+ // Overridden from TileTaskWorkerPool:
+ TileTaskRunner* AsTileTaskRunner() override;
+
+ // Overridden from TileTaskRunner:
+ void SetClient(TileTaskRunnerClient* client) override;
+ void Shutdown() override;
+ void ScheduleTasks(TileTaskQueue* queue) override;
+ void CheckForCompletedTasks() override;
+
+ // Overridden from TileTaskClient:
+ scoped_ptr<RasterBuffer> AcquireBufferForRaster(
+ const Resource* resource) override;
+ void ReleaseBufferForRaster(scoped_ptr<RasterBuffer> buffer) override;
+
+ private:
+ GpuTileTaskWorkerPool(base::SequencedTaskRunner* task_runner,
+ ContextProvider* context_provider,
+ ResourceProvider* resource_provider,
+ bool use_distance_field_text);
+
+ void OnTaskSetFinished(TaskSet task_set);
+ void ScheduleRunTasksOnOriginThread();
+ void RunTasksOnOriginThread();
+ void RunTaskOnOriginThread(TileTask* task);
+
+ scoped_refptr<base::SequencedTaskRunner> task_runner_;
+ scoped_ptr<TaskGraphRunner> task_graph_runner_;
+ const NamespaceToken namespace_token_;
+ TileTaskRunnerClient* client_;
+ ContextProvider* context_provider_;
+ ResourceProvider* resource_provider_;
+ SkMultiPictureDraw multi_picture_draw_;
+
+ bool run_tasks_on_origin_thread_pending_;
+ bool use_distance_field_text_;
+
+ TaskSetCollection tasks_pending_;
+
+ scoped_refptr<TileTask> task_set_finished_tasks_[kNumberOfTaskSets];
+
+ // Task graph used when scheduling tasks and vector used to gather
+ // completed tasks.
+ TaskGraph graph_;
+ Task::Vector completed_tasks_;
+
+ base::WeakPtrFactory<GpuTileTaskWorkerPool>
+ task_set_finished_weak_ptr_factory_;
+
+ base::WeakPtrFactory<GpuTileTaskWorkerPool> weak_ptr_factory_;
+
+ DISALLOW_COPY_AND_ASSIGN(GpuTileTaskWorkerPool);
+};
+
+} // namespace cc
+
+#endif // CC_RESOURCES_GPU_TILE_TASK_WORKER_POOL_H_
diff --git a/cc/resources/managed_tile_state.h b/cc/resources/managed_tile_state.h
index a0905c7..faba93c 100644
--- a/cc/resources/managed_tile_state.h
+++ b/cc/resources/managed_tile_state.h
@@ -7,11 +7,11 @@
#include "base/memory/scoped_ptr.h"
#include "cc/resources/platform_color.h"
-#include "cc/resources/rasterizer.h"
#include "cc/resources/resource_pool.h"
#include "cc/resources/resource_provider.h"
#include "cc/resources/scoped_resource.h"
#include "cc/resources/tile_priority.h"
+#include "cc/resources/tile_task_runner.h"
namespace cc {
diff --git a/cc/resources/one_copy_raster_worker_pool.cc b/cc/resources/one_copy_tile_task_worker_pool.cc
similarity index 73%
rename from cc/resources/one_copy_raster_worker_pool.cc
rename to cc/resources/one_copy_tile_task_worker_pool.cc
index a8b838e..dcb8dea 100644
--- a/cc/resources/one_copy_raster_worker_pool.cc
+++ b/cc/resources/one_copy_tile_task_worker_pool.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "cc/resources/one_copy_raster_worker_pool.h"
+#include "cc/resources/one_copy_tile_task_worker_pool.h"
#include <algorithm>
#include <limits>
@@ -22,7 +22,7 @@
class RasterBufferImpl : public RasterBuffer {
public:
- RasterBufferImpl(OneCopyRasterWorkerPool* worker_pool,
+ RasterBufferImpl(OneCopyTileTaskWorkerPool* worker_pool,
ResourceProvider* resource_provider,
ResourcePool* resource_pool,
const Resource* resource)
@@ -61,7 +61,7 @@
}
private:
- OneCopyRasterWorkerPool* worker_pool_;
+ OneCopyTileTaskWorkerPool* worker_pool_;
ResourceProvider* resource_provider_;
ResourcePool* resource_pool_;
const Resource* resource_;
@@ -87,32 +87,29 @@
} // namespace
-OneCopyRasterWorkerPool::CopyOperation::CopyOperation(
+OneCopyTileTaskWorkerPool::CopyOperation::CopyOperation(
scoped_ptr<ResourceProvider::ScopedWriteLockGpuMemoryBuffer> write_lock,
scoped_ptr<ScopedResource> src,
const Resource* dst)
: write_lock(write_lock.Pass()), src(src.Pass()), dst(dst) {
}
-OneCopyRasterWorkerPool::CopyOperation::~CopyOperation() {
+OneCopyTileTaskWorkerPool::CopyOperation::~CopyOperation() {
}
// static
-scoped_ptr<RasterWorkerPool> OneCopyRasterWorkerPool::Create(
+scoped_ptr<TileTaskWorkerPool> OneCopyTileTaskWorkerPool::Create(
base::SequencedTaskRunner* task_runner,
TaskGraphRunner* task_graph_runner,
ContextProvider* context_provider,
ResourceProvider* resource_provider,
ResourcePool* resource_pool) {
- return make_scoped_ptr<RasterWorkerPool>(
- new OneCopyRasterWorkerPool(task_runner,
- task_graph_runner,
- context_provider,
- resource_provider,
- resource_pool));
+ return make_scoped_ptr<TileTaskWorkerPool>(new OneCopyTileTaskWorkerPool(
+ task_runner, task_graph_runner, context_provider, resource_provider,
+ resource_pool));
}
-OneCopyRasterWorkerPool::OneCopyRasterWorkerPool(
+OneCopyTileTaskWorkerPool::OneCopyTileTaskWorkerPool(
base::SequencedTaskRunner* task_runner,
TaskGraphRunner* task_graph_runner,
ContextProvider* context_provider,
@@ -134,24 +131,24 @@
check_for_completed_copy_operations_pending_(false),
shutdown_(false),
weak_ptr_factory_(this),
- raster_finished_weak_ptr_factory_(this) {
+ task_set_finished_weak_ptr_factory_(this) {
DCHECK(context_provider_);
}
-OneCopyRasterWorkerPool::~OneCopyRasterWorkerPool() {
+OneCopyTileTaskWorkerPool::~OneCopyTileTaskWorkerPool() {
DCHECK_EQ(scheduled_copy_operation_count_, 0u);
}
-Rasterizer* OneCopyRasterWorkerPool::AsRasterizer() {
+TileTaskRunner* OneCopyTileTaskWorkerPool::AsTileTaskRunner() {
return this;
}
-void OneCopyRasterWorkerPool::SetClient(RasterizerClient* client) {
+void OneCopyTileTaskWorkerPool::SetClient(TileTaskRunnerClient* client) {
client_ = client;
}
-void OneCopyRasterWorkerPool::Shutdown() {
- TRACE_EVENT0("cc", "OneCopyRasterWorkerPool::Shutdown");
+void OneCopyTileTaskWorkerPool::Shutdown() {
+ TRACE_EVENT0("cc", "OneCopyTileTaskWorkerPool::Shutdown");
{
base::AutoLock lock(lock_);
@@ -165,40 +162,38 @@
task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_);
}
-void OneCopyRasterWorkerPool::ScheduleTasks(RasterTaskQueue* queue) {
- TRACE_EVENT0("cc", "OneCopyRasterWorkerPool::ScheduleTasks");
+void OneCopyTileTaskWorkerPool::ScheduleTasks(TileTaskQueue* queue) {
+ TRACE_EVENT0("cc", "OneCopyTileTaskWorkerPool::ScheduleTasks");
- if (raster_pending_.none())
+ if (tasks_pending_.none())
TRACE_EVENT_ASYNC_BEGIN0("cc", "ScheduledTasks", this);
// Mark all task sets as pending.
- raster_pending_.set();
+ tasks_pending_.set();
- unsigned priority = kRasterTaskPriorityBase;
+ unsigned priority = kTileTaskPriorityBase;
graph_.Reset();
- // Cancel existing OnRasterFinished callbacks.
- raster_finished_weak_ptr_factory_.InvalidateWeakPtrs();
+ // Cancel existing OnTaskSetFinished callbacks.
+ task_set_finished_weak_ptr_factory_.InvalidateWeakPtrs();
- scoped_refptr<RasterizerTask> new_raster_finished_tasks[kNumberOfTaskSets];
+ scoped_refptr<TileTask> new_task_set_finished_tasks[kNumberOfTaskSets];
size_t task_count[kNumberOfTaskSets] = {0};
for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) {
- new_raster_finished_tasks[task_set] = CreateRasterFinishedTask(
+ new_task_set_finished_tasks[task_set] = CreateTaskSetFinishedTask(
task_runner_.get(),
- base::Bind(&OneCopyRasterWorkerPool::OnRasterFinished,
- raster_finished_weak_ptr_factory_.GetWeakPtr(),
- task_set));
+ base::Bind(&OneCopyTileTaskWorkerPool::OnTaskSetFinished,
+ task_set_finished_weak_ptr_factory_.GetWeakPtr(), task_set));
}
resource_pool_->CheckBusyResources(false);
- for (RasterTaskQueue::Item::Vector::const_iterator it = queue->items.begin();
- it != queue->items.end();
- ++it) {
- const RasterTaskQueue::Item& item = *it;
+ for (TileTaskQueue::Item::Vector::const_iterator it = queue->items.begin();
+ it != queue->items.end(); ++it) {
+ const TileTaskQueue::Item& item = *it;
RasterTask* task = item.task;
DCHECK(!task->HasCompleted());
@@ -209,42 +204,39 @@
++task_count[task_set];
graph_.edges.push_back(
- TaskGraph::Edge(task, new_raster_finished_tasks[task_set].get()));
+ TaskGraph::Edge(task, new_task_set_finished_tasks[task_set].get()));
}
InsertNodesForRasterTask(&graph_, task, task->dependencies(), priority++);
}
for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) {
- InsertNodeForTask(&graph_,
- new_raster_finished_tasks[task_set].get(),
- kRasterFinishedTaskPriority,
- task_count[task_set]);
+ InsertNodeForTask(&graph_, new_task_set_finished_tasks[task_set].get(),
+ kTaskSetFinishedTaskPriority, task_count[task_set]);
}
ScheduleTasksOnOriginThread(this, &graph_);
task_graph_runner_->ScheduleTasks(namespace_token_, &graph_);
- std::copy(new_raster_finished_tasks,
- new_raster_finished_tasks + kNumberOfTaskSets,
- raster_finished_tasks_);
+ std::copy(new_task_set_finished_tasks,
+ new_task_set_finished_tasks + kNumberOfTaskSets,
+ task_set_finished_tasks_);
resource_pool_->ReduceResourceUsage();
- TRACE_EVENT_ASYNC_STEP_INTO1(
- "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue());
+ TRACE_EVENT_ASYNC_STEP_INTO1("cc", "ScheduledTasks", this, "running", "state",
+ StateAsValue());
}
-void OneCopyRasterWorkerPool::CheckForCompletedTasks() {
- TRACE_EVENT0("cc", "OneCopyRasterWorkerPool::CheckForCompletedTasks");
+void OneCopyTileTaskWorkerPool::CheckForCompletedTasks() {
+ TRACE_EVENT0("cc", "OneCopyTileTaskWorkerPool::CheckForCompletedTasks");
task_graph_runner_->CollectCompletedTasks(namespace_token_,
&completed_tasks_);
for (Task::Vector::const_iterator it = completed_tasks_.begin();
- it != completed_tasks_.end();
- ++it) {
- RasterizerTask* task = static_cast<RasterizerTask*>(it->get());
+ it != completed_tasks_.end(); ++it) {
+ TileTask* task = static_cast<TileTask*>(it->get());
task->WillComplete();
task->CompleteOnOriginThread(this);
@@ -255,20 +247,20 @@
completed_tasks_.clear();
}
-scoped_ptr<RasterBuffer> OneCopyRasterWorkerPool::AcquireBufferForRaster(
+scoped_ptr<RasterBuffer> OneCopyTileTaskWorkerPool::AcquireBufferForRaster(
const Resource* resource) {
DCHECK_EQ(resource->format(), resource_pool_->resource_format());
return make_scoped_ptr<RasterBuffer>(
new RasterBufferImpl(this, resource_provider_, resource_pool_, resource));
}
-void OneCopyRasterWorkerPool::ReleaseBufferForRaster(
+void OneCopyTileTaskWorkerPool::ReleaseBufferForRaster(
scoped_ptr<RasterBuffer> buffer) {
// Nothing to do here. RasterBufferImpl destructor cleans up after itself.
}
CopySequenceNumber
-OneCopyRasterWorkerPool::PlaybackAndScheduleCopyOnWorkerThread(
+OneCopyTileTaskWorkerPool::PlaybackAndScheduleCopyOnWorkerThread(
scoped_ptr<ResourceProvider::ScopedWriteLockGpuMemoryBuffer> write_lock,
scoped_ptr<ScopedResource> src,
const Resource* dst,
@@ -313,13 +305,9 @@
gfx::GpuMemoryBuffer* gpu_memory_buffer = write_lock->GetGpuMemoryBuffer();
if (gpu_memory_buffer) {
- RasterWorkerPool::PlaybackToMemory(gpu_memory_buffer->Map(),
- src->format(),
- src->size(),
- gpu_memory_buffer->GetStride(),
- raster_source,
- rect,
- scale);
+ TileTaskWorkerPool::PlaybackToMemory(
+ gpu_memory_buffer->Map(), src->format(), src->size(),
+ gpu_memory_buffer->GetStride(), raster_source, rect, scale);
gpu_memory_buffer->Unmap();
}
}
@@ -335,15 +323,14 @@
if ((sequence % kCopyFlushPeriod) == 0) {
task_runner_->PostTask(
FROM_HERE,
- base::Bind(&OneCopyRasterWorkerPool::AdvanceLastFlushedCopyTo,
- weak_ptr_factory_.GetWeakPtr(),
- sequence));
+ base::Bind(&OneCopyTileTaskWorkerPool::AdvanceLastFlushedCopyTo,
+ weak_ptr_factory_.GetWeakPtr(), sequence));
}
return sequence;
}
-void OneCopyRasterWorkerPool::AdvanceLastIssuedCopyTo(
+void OneCopyTileTaskWorkerPool::AdvanceLastIssuedCopyTo(
CopySequenceNumber sequence) {
if (last_issued_copy_operation_ >= sequence)
return;
@@ -352,7 +339,7 @@
last_issued_copy_operation_ = sequence;
}
-void OneCopyRasterWorkerPool::AdvanceLastFlushedCopyTo(
+void OneCopyTileTaskWorkerPool::AdvanceLastFlushedCopyTo(
CopySequenceNumber sequence) {
if (last_flushed_copy_operation_ >= sequence)
return;
@@ -364,24 +351,24 @@
last_flushed_copy_operation_ = last_issued_copy_operation_;
}
-void OneCopyRasterWorkerPool::OnRasterFinished(TaskSet task_set) {
- TRACE_EVENT1(
- "cc", "OneCopyRasterWorkerPool::OnRasterFinished", "task_set", task_set);
+void OneCopyTileTaskWorkerPool::OnTaskSetFinished(TaskSet task_set) {
+ TRACE_EVENT1("cc", "OneCopyTileTaskWorkerPool::OnTaskSetFinished", "task_set",
+ task_set);
- DCHECK(raster_pending_[task_set]);
- raster_pending_[task_set] = false;
- if (raster_pending_.any()) {
- TRACE_EVENT_ASYNC_STEP_INTO1(
- "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue());
+ DCHECK(tasks_pending_[task_set]);
+ tasks_pending_[task_set] = false;
+ if (tasks_pending_.any()) {
+ TRACE_EVENT_ASYNC_STEP_INTO1("cc", "ScheduledTasks", this, "running",
+ "state", StateAsValue());
} else {
TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this);
}
- client_->DidFinishRunningTasks(task_set);
+ client_->DidFinishRunningTileTasks(task_set);
}
-void OneCopyRasterWorkerPool::IssueCopyOperations(int64 count) {
- TRACE_EVENT1(
- "cc", "OneCopyRasterWorkerPool::IssueCopyOperations", "count", count);
+void OneCopyTileTaskWorkerPool::IssueCopyOperations(int64 count) {
+ TRACE_EVENT1("cc", "OneCopyTileTaskWorkerPool::IssueCopyOperations", "count",
+ count);
CopyOperation::Deque copy_operations;
@@ -417,7 +404,7 @@
}
}
-void OneCopyRasterWorkerPool::
+void OneCopyTileTaskWorkerPool::
ScheduleCheckForCompletedCopyOperationsWithLockAcquired(
bool wait_if_needed) {
lock_.AssertAcquired();
@@ -438,9 +425,8 @@
task_runner_->PostDelayedTask(
FROM_HERE,
- base::Bind(&OneCopyRasterWorkerPool::CheckForCompletedCopyOperations,
- weak_ptr_factory_.GetWeakPtr(),
- wait_if_needed),
+ base::Bind(&OneCopyTileTaskWorkerPool::CheckForCompletedCopyOperations,
+ weak_ptr_factory_.GetWeakPtr(), wait_if_needed),
next_check_for_completed_copy_operations_time - now);
last_check_for_completed_copy_operations_time_ =
@@ -448,12 +434,11 @@
check_for_completed_copy_operations_pending_ = true;
}
-void OneCopyRasterWorkerPool::CheckForCompletedCopyOperations(
+void OneCopyTileTaskWorkerPool::CheckForCompletedCopyOperations(
bool wait_if_needed) {
TRACE_EVENT1("cc",
- "OneCopyRasterWorkerPool::CheckForCompletedCopyOperations",
- "wait_if_needed",
- wait_if_needed);
+ "OneCopyTileTaskWorkerPool::CheckForCompletedCopyOperations",
+ "wait_if_needed", wait_if_needed);
resource_pool_->CheckBusyResources(wait_if_needed);
@@ -474,13 +459,13 @@
}
scoped_refptr<base::debug::ConvertableToTraceFormat>
-OneCopyRasterWorkerPool::StateAsValue() const {
+OneCopyTileTaskWorkerPool::StateAsValue() const {
scoped_refptr<base::debug::TracedValue> state =
new base::debug::TracedValue();
state->BeginArray("tasks_pending");
for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set)
- state->AppendBoolean(raster_pending_[task_set]);
+ state->AppendBoolean(tasks_pending_[task_set]);
state->EndArray();
state->BeginDictionary("staging_state");
StagingStateAsValueInto(state.get());
@@ -489,7 +474,7 @@
return state;
}
-void OneCopyRasterWorkerPool::StagingStateAsValueInto(
+void OneCopyTileTaskWorkerPool::StagingStateAsValueInto(
base::debug::TracedValue* staging_state) const {
staging_state->SetInteger("staging_resource_count",
resource_pool_->total_resource_count());
diff --git a/cc/resources/one_copy_raster_worker_pool.h b/cc/resources/one_copy_tile_task_worker_pool.h
similarity index 70%
rename from cc/resources/one_copy_raster_worker_pool.h
rename to cc/resources/one_copy_tile_task_worker_pool.h
index b209da2..c5b30ba 100644
--- a/cc/resources/one_copy_raster_worker_pool.h
+++ b/cc/resources/one_copy_tile_task_worker_pool.h
@@ -2,17 +2,17 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef CC_RESOURCES_ONE_COPY_RASTER_WORKER_POOL_H_
-#define CC_RESOURCES_ONE_COPY_RASTER_WORKER_POOL_H_
+#ifndef CC_RESOURCES_ONE_COPY_TILE_TASK_WORKER_POOL_H_
+#define CC_RESOURCES_ONE_COPY_TILE_TASK_WORKER_POOL_H_
#include "base/memory/weak_ptr.h"
#include "base/synchronization/lock.h"
#include "base/values.h"
#include "cc/base/scoped_ptr_deque.h"
#include "cc/output/context_provider.h"
-#include "cc/resources/raster_worker_pool.h"
-#include "cc/resources/rasterizer.h"
#include "cc/resources/resource_provider.h"
+#include "cc/resources/tile_task_runner.h"
+#include "cc/resources/tile_task_worker_pool.h"
namespace base {
namespace debug {
@@ -27,29 +27,29 @@
typedef int64 CopySequenceNumber;
-class CC_EXPORT OneCopyRasterWorkerPool : public RasterWorkerPool,
- public Rasterizer,
- public RasterizerTaskClient {
+class CC_EXPORT OneCopyTileTaskWorkerPool : public TileTaskWorkerPool,
+ public TileTaskRunner,
+ public TileTaskClient {
public:
- ~OneCopyRasterWorkerPool() override;
+ ~OneCopyTileTaskWorkerPool() override;
- static scoped_ptr<RasterWorkerPool> Create(
+ static scoped_ptr<TileTaskWorkerPool> Create(
base::SequencedTaskRunner* task_runner,
TaskGraphRunner* task_graph_runner,
ContextProvider* context_provider,
ResourceProvider* resource_provider,
ResourcePool* resource_pool);
- // Overridden from RasterWorkerPool:
- Rasterizer* AsRasterizer() override;
+ // Overridden from TileTaskWorkerPool:
+ TileTaskRunner* AsTileTaskRunner() override;
- // Overridden from Rasterizer:
- void SetClient(RasterizerClient* client) override;
+ // Overridden from TileTaskRunner:
+ void SetClient(TileTaskRunnerClient* client) override;
void Shutdown() override;
- void ScheduleTasks(RasterTaskQueue* queue) override;
+ void ScheduleTasks(TileTaskQueue* queue) override;
void CheckForCompletedTasks() override;
- // Overridden from RasterizerTaskClient:
+ // Overridden from TileTaskClient:
scoped_ptr<RasterBuffer> AcquireBufferForRaster(
const Resource* resource) override;
void ReleaseBufferForRaster(scoped_ptr<RasterBuffer> buffer) override;
@@ -69,11 +69,11 @@
void AdvanceLastIssuedCopyTo(CopySequenceNumber sequence);
protected:
- OneCopyRasterWorkerPool(base::SequencedTaskRunner* task_runner,
- TaskGraphRunner* task_graph_runner,
- ContextProvider* context_provider,
- ResourceProvider* resource_provider,
- ResourcePool* resource_pool);
+ OneCopyTileTaskWorkerPool(base::SequencedTaskRunner* task_runner,
+ TaskGraphRunner* task_graph_runner,
+ ContextProvider* context_provider,
+ ResourceProvider* resource_provider,
+ ResourcePool* resource_pool);
private:
struct CopyOperation {
@@ -90,7 +90,7 @@
const Resource* dst;
};
- void OnRasterFinished(TaskSet task_set);
+ void OnTaskSetFinished(TaskSet task_set);
void AdvanceLastFlushedCopyTo(CopySequenceNumber sequence);
void IssueCopyOperations(int64 count);
void ScheduleCheckForCompletedCopyOperationsWithLockAcquired(
@@ -102,12 +102,12 @@
scoped_refptr<base::SequencedTaskRunner> task_runner_;
TaskGraphRunner* task_graph_runner_;
const NamespaceToken namespace_token_;
- RasterizerClient* client_;
+ TileTaskRunnerClient* client_;
ContextProvider* context_provider_;
ResourceProvider* resource_provider_;
ResourcePool* resource_pool_;
- TaskSetCollection raster_pending_;
- scoped_refptr<RasterizerTask> raster_finished_tasks_[kNumberOfTaskSets];
+ TaskSetCollection tasks_pending_;
+ scoped_refptr<TileTask> task_set_finished_tasks_[kNumberOfTaskSets];
CopySequenceNumber last_issued_copy_operation_;
CopySequenceNumber last_flushed_copy_operation_;
@@ -127,15 +127,15 @@
base::TimeTicks last_check_for_completed_copy_operations_time_;
bool shutdown_;
- base::WeakPtrFactory<OneCopyRasterWorkerPool> weak_ptr_factory_;
+ base::WeakPtrFactory<OneCopyTileTaskWorkerPool> weak_ptr_factory_;
// "raster finished" tasks need their own factory as they need to be
// canceled when ScheduleTasks() is called.
- base::WeakPtrFactory<OneCopyRasterWorkerPool>
- raster_finished_weak_ptr_factory_;
+ base::WeakPtrFactory<OneCopyTileTaskWorkerPool>
+ task_set_finished_weak_ptr_factory_;
- DISALLOW_COPY_AND_ASSIGN(OneCopyRasterWorkerPool);
+ DISALLOW_COPY_AND_ASSIGN(OneCopyTileTaskWorkerPool);
};
} // namespace cc
-#endif // CC_RESOURCES_ONE_COPY_RASTER_WORKER_POOL_H_
+#endif // CC_RESOURCES_ONE_COPY_TILE_TASK_WORKER_POOL_H_
diff --git a/cc/resources/picture_pile.cc b/cc/resources/picture_pile.cc
index c3050c3..698fe2c 100644
--- a/cc/resources/picture_pile.cc
+++ b/cc/resources/picture_pile.cc
@@ -10,7 +10,7 @@
#include "cc/base/region.h"
#include "cc/resources/picture_pile_impl.h"
-#include "cc/resources/raster_worker_pool.h"
+#include "cc/resources/tile_task_worker_pool.h"
#include "skia/ext/analysis_canvas.h"
namespace {
@@ -545,7 +545,7 @@
// raster thread doesn't provide any benefit. This might change
// in the future but we avoid it for now to reduce the cost of
// Picture::Create.
- bool gather_pixel_refs = RasterWorkerPool::GetNumRasterThreads() > 1;
+ bool gather_pixel_refs = TileTaskWorkerPool::GetNumWorkerThreads() > 1;
for (int i = 0; i < repeat_count; i++) {
picture = Picture::Create(padded_record_rect, painter, tile_grid_info_,
diff --git a/cc/resources/pixel_buffer_raster_worker_pool.cc b/cc/resources/pixel_buffer_tile_task_worker_pool.cc
similarity index 76%
rename from cc/resources/pixel_buffer_raster_worker_pool.cc
rename to cc/resources/pixel_buffer_tile_task_worker_pool.cc
index 175e7d4..7256f94 100644
--- a/cc/resources/pixel_buffer_raster_worker_pool.cc
+++ b/cc/resources/pixel_buffer_tile_task_worker_pool.cc
@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "cc/resources/pixel_buffer_raster_worker_pool.h"
+#include "cc/resources/pixel_buffer_tile_task_worker_pool.h"
#include <algorithm>
@@ -41,9 +41,9 @@
if (!memory_)
return;
- RasterWorkerPool::PlaybackToMemory(memory_, resource_->format(),
- resource_->size(), stride_,
- raster_source, rect, scale);
+ TileTaskWorkerPool::PlaybackToMemory(memory_, resource_->format(),
+ resource_->size(), stride_,
+ raster_source, rect, scale);
}
private:
@@ -89,28 +89,25 @@
} // namespace
-PixelBufferRasterWorkerPool::RasterTaskState::RasterTaskState(
+PixelBufferTileTaskWorkerPool::RasterTaskState::RasterTaskState(
RasterTask* task,
const TaskSetCollection& task_sets)
: type(UNSCHEDULED), task(task), task_sets(task_sets) {
}
// static
-scoped_ptr<RasterWorkerPool> PixelBufferRasterWorkerPool::Create(
+scoped_ptr<TileTaskWorkerPool> PixelBufferTileTaskWorkerPool::Create(
base::SequencedTaskRunner* task_runner,
TaskGraphRunner* task_graph_runner,
ContextProvider* context_provider,
ResourceProvider* resource_provider,
size_t max_transfer_buffer_usage_bytes) {
- return make_scoped_ptr<RasterWorkerPool>(
- new PixelBufferRasterWorkerPool(task_runner,
- task_graph_runner,
- context_provider,
- resource_provider,
- max_transfer_buffer_usage_bytes));
+ return make_scoped_ptr<TileTaskWorkerPool>(new PixelBufferTileTaskWorkerPool(
+ task_runner, task_graph_runner, context_provider, resource_provider,
+ max_transfer_buffer_usage_bytes));
}
-PixelBufferRasterWorkerPool::PixelBufferRasterWorkerPool(
+PixelBufferTileTaskWorkerPool::PixelBufferTileTaskWorkerPool(
base::SequencedTaskRunner* task_runner,
TaskGraphRunner* task_graph_runner,
ContextProvider* context_provider,
@@ -128,16 +125,17 @@
has_performed_uploads_since_last_flush_(false),
check_for_completed_raster_task_notifier_(
task_runner,
- base::Bind(&PixelBufferRasterWorkerPool::CheckForCompletedRasterTasks,
- base::Unretained(this)),
+ base::Bind(
+ &PixelBufferTileTaskWorkerPool::CheckForCompletedRasterTasks,
+ base::Unretained(this)),
base::TimeDelta::FromMilliseconds(
kCheckForCompletedRasterTasksDelayMs)),
- raster_finished_weak_ptr_factory_(this) {
+ task_set_finished_weak_ptr_factory_(this) {
DCHECK(context_provider_);
std::fill(task_counts_, task_counts_ + kNumberOfTaskSets, 0);
}
-PixelBufferRasterWorkerPool::~PixelBufferRasterWorkerPool() {
+PixelBufferTileTaskWorkerPool::~PixelBufferTileTaskWorkerPool() {
DCHECK_EQ(0u, raster_task_states_.size());
DCHECK_EQ(0u, raster_tasks_with_pending_upload_.size());
DCHECK_EQ(0u, completed_raster_tasks_.size());
@@ -145,14 +143,16 @@
DCHECK(NonEmptyTaskSetsFromTaskCounts(task_counts_).none());
}
-Rasterizer* PixelBufferRasterWorkerPool::AsRasterizer() { return this; }
+TileTaskRunner* PixelBufferTileTaskWorkerPool::AsTileTaskRunner() {
+ return this;
+}
-void PixelBufferRasterWorkerPool::SetClient(RasterizerClient* client) {
+void PixelBufferTileTaskWorkerPool::SetClient(TileTaskRunnerClient* client) {
client_ = client;
}
-void PixelBufferRasterWorkerPool::Shutdown() {
- TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::Shutdown");
+void PixelBufferTileTaskWorkerPool::Shutdown() {
+ TRACE_EVENT0("cc", "PixelBufferTileTaskWorkerPool::Shutdown");
shutdown_ = true;
@@ -166,8 +166,7 @@
check_for_completed_raster_task_notifier_.Shutdown();
for (RasterTaskState::Vector::iterator it = raster_task_states_.begin();
- it != raster_task_states_.end();
- ++it) {
+ it != raster_task_states_.end(); ++it) {
RasterTaskState& state = *it;
// All unscheduled tasks need to be canceled.
@@ -179,8 +178,8 @@
DCHECK_EQ(completed_raster_tasks_.size(), raster_task_states_.size());
}
-void PixelBufferRasterWorkerPool::ScheduleTasks(RasterTaskQueue* queue) {
- TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::ScheduleTasks");
+void PixelBufferTileTaskWorkerPool::ScheduleTasks(TileTaskQueue* queue) {
+ TRACE_EVENT0("cc", "PixelBufferTileTaskWorkerPool::ScheduleTasks");
if (should_notify_client_if_no_tasks_are_pending_.none())
TRACE_EVENT_ASYNC_BEGIN0("cc", "ScheduledTasks", this);
@@ -189,27 +188,24 @@
std::fill(task_counts_, task_counts_ + kNumberOfTaskSets, 0);
// Update raster task state and remove items from old queue.
- for (RasterTaskQueue::Item::Vector::const_iterator it = queue->items.begin();
- it != queue->items.end();
- ++it) {
- const RasterTaskQueue::Item& item = *it;
+ for (TileTaskQueue::Item::Vector::const_iterator it = queue->items.begin();
+ it != queue->items.end(); ++it) {
+ const TileTaskQueue::Item& item = *it;
RasterTask* task = item.task;
// Remove any old items that are associated with this task. The result is
// that the old queue is left with all items not present in this queue,
// which we use below to determine what tasks need to be canceled.
- RasterTaskQueue::Item::Vector::iterator old_it =
- std::find_if(raster_tasks_.items.begin(),
- raster_tasks_.items.end(),
- RasterTaskQueue::Item::TaskComparator(task));
+ TileTaskQueue::Item::Vector::iterator old_it =
+ std::find_if(raster_tasks_.items.begin(), raster_tasks_.items.end(),
+ TileTaskQueue::Item::TaskComparator(task));
if (old_it != raster_tasks_.items.end()) {
std::swap(*old_it, raster_tasks_.items.back());
raster_tasks_.items.pop_back();
}
RasterTaskState::Vector::iterator state_it =
- std::find_if(raster_task_states_.begin(),
- raster_task_states_.end(),
+ std::find_if(raster_task_states_.begin(), raster_task_states_.end(),
RasterTaskState::TaskComparator(task));
if (state_it != raster_task_states_.end()) {
RasterTaskState& state = *state_it;
@@ -230,16 +226,14 @@
}
// Determine what tasks in old queue need to be canceled.
- for (RasterTaskQueue::Item::Vector::const_iterator it =
+ for (TileTaskQueue::Item::Vector::const_iterator it =
raster_tasks_.items.begin();
- it != raster_tasks_.items.end();
- ++it) {
- const RasterTaskQueue::Item& item = *it;
+ it != raster_tasks_.items.end(); ++it) {
+ const TileTaskQueue::Item& item = *it;
RasterTask* task = item.task;
RasterTaskState::Vector::iterator state_it =
- std::find_if(raster_task_states_.begin(),
- raster_task_states_.end(),
+ std::find_if(raster_task_states_.begin(), raster_task_states_.end(),
RasterTaskState::TaskComparator(task));
// We've already processed completion if we can't find a RasterTaskState for
// this task.
@@ -277,33 +271,30 @@
// Reschedule check for completed raster tasks.
check_for_completed_raster_task_notifier_.Schedule();
- TRACE_EVENT_ASYNC_STEP_INTO1(
- "cc", "ScheduledTasks", this, StateName(), "state", StateAsValue());
+ TRACE_EVENT_ASYNC_STEP_INTO1("cc", "ScheduledTasks", this, StateName(),
+ "state", StateAsValue());
}
-void PixelBufferRasterWorkerPool::CheckForCompletedTasks() {
- TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::CheckForCompletedTasks");
+void PixelBufferTileTaskWorkerPool::CheckForCompletedTasks() {
+ TRACE_EVENT0("cc", "PixelBufferTileTaskWorkerPool::CheckForCompletedTasks");
CheckForCompletedRasterizerTasks();
CheckForCompletedUploads();
FlushUploads();
- for (RasterizerTask::Vector::const_iterator it =
+ for (TileTask::Vector::const_iterator it =
completed_image_decode_tasks_.begin();
- it != completed_image_decode_tasks_.end();
- ++it) {
- RasterizerTask* task = it->get();
+ it != completed_image_decode_tasks_.end(); ++it) {
+ TileTask* task = it->get();
task->RunReplyOnOriginThread();
}
completed_image_decode_tasks_.clear();
for (RasterTask::Vector::const_iterator it = completed_raster_tasks_.begin();
- it != completed_raster_tasks_.end();
- ++it) {
+ it != completed_raster_tasks_.end(); ++it) {
RasterTask* task = it->get();
RasterTaskState::Vector::iterator state_it =
- std::find_if(raster_task_states_.begin(),
- raster_task_states_.end(),
+ std::find_if(raster_task_states_.begin(), raster_task_states_.end(),
RasterTaskState::TaskComparator(task));
DCHECK(state_it != raster_task_states_.end());
DCHECK_EQ(RasterTaskState::COMPLETED, state_it->type);
@@ -316,22 +307,20 @@
completed_raster_tasks_.clear();
}
-scoped_ptr<RasterBuffer> PixelBufferRasterWorkerPool::AcquireBufferForRaster(
+scoped_ptr<RasterBuffer> PixelBufferTileTaskWorkerPool::AcquireBufferForRaster(
const Resource* resource) {
return make_scoped_ptr<RasterBuffer>(
new RasterBufferImpl(resource_provider_, resource));
}
-void PixelBufferRasterWorkerPool::ReleaseBufferForRaster(
+void PixelBufferTileTaskWorkerPool::ReleaseBufferForRaster(
scoped_ptr<RasterBuffer> buffer) {
// Nothing to do here. RasterBufferImpl destructor cleans up after itself.
}
-void PixelBufferRasterWorkerPool::OnRasterFinished(TaskSet task_set) {
- TRACE_EVENT2("cc",
- "PixelBufferRasterWorkerPool::OnRasterFinished",
- "task_set",
- task_set,
+void PixelBufferTileTaskWorkerPool::OnTaskSetFinished(TaskSet task_set) {
+ TRACE_EVENT2("cc", "PixelBufferTileTaskWorkerPool::OnTaskSetFinished",
+ "task_set", task_set,
"should_notify_client_if_no_tasks_are_pending",
should_notify_client_if_no_tasks_are_pending_[task_set]);
@@ -339,7 +328,7 @@
// already been notified.
if (!should_notify_client_if_no_tasks_are_pending_[task_set])
return;
- raster_finished_tasks_pending_[task_set] = false;
+ task_set_finished_tasks_pending_[task_set] = false;
// This reduces latency between the time when all tasks required for
// activation have finished running and the time when the client is
@@ -347,7 +336,7 @@
CheckForCompletedRasterTasks();
}
-void PixelBufferRasterWorkerPool::FlushUploads() {
+void PixelBufferTileTaskWorkerPool::FlushUploads() {
if (!has_performed_uploads_since_last_flush_)
return;
@@ -355,20 +344,19 @@
has_performed_uploads_since_last_flush_ = false;
}
-void PixelBufferRasterWorkerPool::CheckForCompletedUploads() {
+void PixelBufferTileTaskWorkerPool::CheckForCompletedUploads() {
RasterTask::Vector tasks_with_completed_uploads;
// First check if any have completed.
while (!raster_tasks_with_pending_upload_.empty()) {
RasterTask* task = raster_tasks_with_pending_upload_.front().get();
- DCHECK(std::find_if(raster_task_states_.begin(),
- raster_task_states_.end(),
+ DCHECK(std::find_if(raster_task_states_.begin(), raster_task_states_.end(),
RasterTaskState::TaskComparator(task)) !=
raster_task_states_.end());
- DCHECK_EQ(RasterTaskState::UPLOADING,
- std::find_if(raster_task_states_.begin(),
- raster_task_states_.end(),
- RasterTaskState::TaskComparator(task))->type);
+ DCHECK_EQ(
+ RasterTaskState::UPLOADING,
+ std::find_if(raster_task_states_.begin(), raster_task_states_.end(),
+ RasterTaskState::TaskComparator(task))->type);
// Uploads complete in the order they are issued.
if (!resource_provider_->DidSetPixelsComplete(task->resource()->id()))
@@ -390,8 +378,7 @@
while (it != raster_tasks_with_pending_upload_.end()) {
RasterTask* task = it->get();
RasterTaskState::Vector::const_iterator state_it =
- std::find_if(raster_task_states_.begin(),
- raster_task_states_.end(),
+ std::find_if(raster_task_states_.begin(), raster_task_states_.end(),
RasterTaskState::TaskComparator(task));
DCHECK(state_it != raster_task_states_.end());
const RasterTaskState& state = *state_it;
@@ -413,8 +400,7 @@
// all previous uploads, we would rather wait only once downstream.
for (RasterTask::Vector::reverse_iterator it =
tasks_with_uploads_to_force.rbegin();
- it != tasks_with_uploads_to_force.rend();
- ++it) {
+ it != tasks_with_uploads_to_force.rend(); ++it) {
RasterTask* task = it->get();
resource_provider_->ForceSetPixelsToComplete(task->resource()->id());
@@ -426,12 +412,10 @@
// to |completed_raster_tasks_|.
for (RasterTask::Vector::const_iterator it =
tasks_with_completed_uploads.begin();
- it != tasks_with_completed_uploads.end();
- ++it) {
+ it != tasks_with_completed_uploads.end(); ++it) {
RasterTask* task = it->get();
RasterTaskState::Vector::iterator state_it =
- std::find_if(raster_task_states_.begin(),
- raster_task_states_.end(),
+ std::find_if(raster_task_states_.begin(), raster_task_states_.end(),
RasterTaskState::TaskComparator(task));
DCHECK(state_it != raster_task_states_.end());
RasterTaskState& state = *state_it;
@@ -454,9 +438,9 @@
}
}
-void PixelBufferRasterWorkerPool::CheckForCompletedRasterTasks() {
+void PixelBufferTileTaskWorkerPool::CheckForCompletedRasterTasks() {
TRACE_EVENT0("cc",
- "PixelBufferRasterWorkerPool::CheckForCompletedRasterTasks");
+ "PixelBufferTileTaskWorkerPool::CheckForCompletedRasterTasks");
// Since this function can be called directly, cancel any pending checks.
check_for_completed_raster_task_notifier_.Cancel();
@@ -470,7 +454,7 @@
// Determine what client notifications to generate.
TaskSetCollection will_notify_client_that_no_tasks_are_pending =
should_notify_client_if_no_tasks_are_pending_ &
- ~raster_finished_tasks_pending_ & ~PendingTasks();
+ ~task_set_finished_tasks_pending_ & ~PendingTasks();
// Adjust the need to generate notifications before scheduling more tasks.
should_notify_client_if_no_tasks_are_pending_ &=
@@ -480,8 +464,8 @@
if (PendingRasterTaskCount())
ScheduleMoreTasks();
- TRACE_EVENT_ASYNC_STEP_INTO1(
- "cc", "ScheduledTasks", this, StateName(), "state", StateAsValue());
+ TRACE_EVENT_ASYNC_STEP_INTO1("cc", "ScheduledTasks", this, StateName(),
+ "state", StateAsValue());
// Schedule another check for completed raster tasks while there are
// pending raster tasks or pending uploads.
@@ -495,17 +479,17 @@
for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) {
if (will_notify_client_that_no_tasks_are_pending[task_set]) {
DCHECK(!PendingTasks()[task_set]);
- client_->DidFinishRunningTasks(task_set);
+ client_->DidFinishRunningTileTasks(task_set);
}
}
}
-void PixelBufferRasterWorkerPool::ScheduleMoreTasks() {
- TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::ScheduleMoreTasks");
+void PixelBufferTileTaskWorkerPool::ScheduleMoreTasks() {
+ TRACE_EVENT0("cc", "PixelBufferTileTaskWorkerPool::ScheduleMoreTasks");
RasterTaskVector tasks[kNumberOfTaskSets];
- unsigned priority = kRasterTaskPriorityBase;
+ unsigned priority = kTileTaskPriorityBase;
graph_.Reset();
@@ -513,19 +497,17 @@
TaskSetCollection did_throttle_raster_tasks;
size_t scheduled_raster_task_count = 0;
- for (RasterTaskQueue::Item::Vector::const_iterator it =
+ for (TileTaskQueue::Item::Vector::const_iterator it =
raster_tasks_.items.begin();
- it != raster_tasks_.items.end();
- ++it) {
- const RasterTaskQueue::Item& item = *it;
+ it != raster_tasks_.items.end(); ++it) {
+ const TileTaskQueue::Item& item = *it;
RasterTask* task = item.task;
DCHECK(item.task_sets.any());
// |raster_task_states_| contains the state of all tasks that we have not
// yet run reply callbacks for.
RasterTaskState::Vector::iterator state_it =
- std::find_if(raster_task_states_.begin(),
- raster_task_states_.end(),
+ std::find_if(raster_task_states_.begin(), raster_task_states_.end(),
RasterTaskState::TaskComparator(task));
if (state_it == raster_task_states_.end())
continue;
@@ -581,36 +563,34 @@
}
}
- // Cancel existing OnRasterFinished callbacks.
- raster_finished_weak_ptr_factory_.InvalidateWeakPtrs();
+ // Cancel existing OnTaskSetFinished callbacks.
+ task_set_finished_weak_ptr_factory_.InvalidateWeakPtrs();
- scoped_refptr<RasterizerTask> new_raster_finished_tasks[kNumberOfTaskSets];
+ scoped_refptr<TileTask> new_task_set_finished_tasks[kNumberOfTaskSets];
size_t scheduled_task_counts[kNumberOfTaskSets] = {0};
for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) {
scheduled_task_counts[task_set] = tasks[task_set].container().size();
DCHECK_LE(scheduled_task_counts[task_set], task_counts_[task_set]);
- // Schedule OnRasterFinished call for task set only when notification is
+ // Schedule OnTaskSetFinished call for task set only when notification is
// pending and throttling is not preventing all pending tasks in the set
// from being scheduled.
if (!did_throttle_raster_tasks[task_set] &&
should_notify_client_if_no_tasks_are_pending_[task_set]) {
- new_raster_finished_tasks[task_set] = CreateRasterFinishedTask(
+ new_task_set_finished_tasks[task_set] = CreateTaskSetFinishedTask(
task_runner_.get(),
- base::Bind(&PixelBufferRasterWorkerPool::OnRasterFinished,
- raster_finished_weak_ptr_factory_.GetWeakPtr(),
+ base::Bind(&PixelBufferTileTaskWorkerPool::OnTaskSetFinished,
+ task_set_finished_weak_ptr_factory_.GetWeakPtr(),
task_set));
- raster_finished_tasks_pending_[task_set] = true;
- InsertNodeForTask(&graph_,
- new_raster_finished_tasks[task_set].get(),
- kRasterFinishedTaskPriority,
+ task_set_finished_tasks_pending_[task_set] = true;
+ InsertNodeForTask(&graph_, new_task_set_finished_tasks[task_set].get(),
+ kTaskSetFinishedTaskPriority,
scheduled_task_counts[task_set]);
for (RasterTaskVector::ContainerType::const_iterator it =
tasks[task_set].container().begin();
- it != tasks[task_set].container().end();
- ++it) {
+ it != tasks[task_set].container().end(); ++it) {
graph_.edges.push_back(
- TaskGraph::Edge(*it, new_raster_finished_tasks[task_set].get()));
+ TaskGraph::Edge(*it, new_task_set_finished_tasks[task_set].get()));
}
}
}
@@ -622,23 +602,23 @@
scheduled_raster_task_count_ = scheduled_raster_task_count;
- std::copy(new_raster_finished_tasks,
- new_raster_finished_tasks + kNumberOfTaskSets,
- raster_finished_tasks_);
+ std::copy(new_task_set_finished_tasks,
+ new_task_set_finished_tasks + kNumberOfTaskSets,
+ task_set_finished_tasks_);
}
-unsigned PixelBufferRasterWorkerPool::PendingRasterTaskCount() const {
+unsigned PixelBufferTileTaskWorkerPool::PendingRasterTaskCount() const {
unsigned num_completed_raster_tasks =
raster_tasks_with_pending_upload_.size() + completed_raster_tasks_.size();
DCHECK_GE(raster_task_states_.size(), num_completed_raster_tasks);
return raster_task_states_.size() - num_completed_raster_tasks;
}
-TaskSetCollection PixelBufferRasterWorkerPool::PendingTasks() const {
+TaskSetCollection PixelBufferTileTaskWorkerPool::PendingTasks() const {
return NonEmptyTaskSetsFromTaskCounts(task_counts_);
}
-const char* PixelBufferRasterWorkerPool::StateName() const {
+const char* PixelBufferTileTaskWorkerPool::StateName() const {
if (scheduled_raster_task_count_)
return "rasterizing";
if (PendingRasterTaskCount())
@@ -649,16 +629,15 @@
return "finishing";
}
-void PixelBufferRasterWorkerPool::CheckForCompletedRasterizerTasks() {
- TRACE_EVENT0("cc",
- "PixelBufferRasterWorkerPool::CheckForCompletedRasterizerTasks");
+void PixelBufferTileTaskWorkerPool::CheckForCompletedRasterizerTasks() {
+ TRACE_EVENT0(
+ "cc", "PixelBufferTileTaskWorkerPool::CheckForCompletedRasterizerTasks");
task_graph_runner_->CollectCompletedTasks(namespace_token_,
&completed_tasks_);
for (Task::Vector::const_iterator it = completed_tasks_.begin();
- it != completed_tasks_.end();
- ++it) {
- RasterizerTask* task = static_cast<RasterizerTask*>(it->get());
+ it != completed_tasks_.end(); ++it) {
+ TileTask* task = static_cast<TileTask*>(it->get());
RasterTask* raster_task = task->AsRasterTask();
if (!raster_task) {
@@ -671,8 +650,7 @@
}
RasterTaskState::Vector::iterator state_it =
- std::find_if(raster_task_states_.begin(),
- raster_task_states_.end(),
+ std::find_if(raster_task_states_.begin(), raster_task_states_.end(),
RasterTaskState::TaskComparator(raster_task));
DCHECK(state_it != raster_task_states_.end());
@@ -689,10 +667,9 @@
raster_task->CompleteOnOriginThread(this);
raster_task->DidComplete();
- RasterTaskQueue::Item::Vector::const_iterator item_it =
- std::find_if(raster_tasks_.items.begin(),
- raster_tasks_.items.end(),
- RasterTaskQueue::Item::TaskComparator(raster_task));
+ TileTaskQueue::Item::Vector::const_iterator item_it =
+ std::find_if(raster_tasks_.items.begin(), raster_tasks_.items.end(),
+ TileTaskQueue::Item::TaskComparator(raster_task));
if (item_it != raster_tasks_.items.end()) {
state.type = RasterTaskState::UNSCHEDULED;
continue;
@@ -721,7 +698,7 @@
}
scoped_refptr<base::debug::ConvertableToTraceFormat>
-PixelBufferRasterWorkerPool::StateAsValue() const {
+PixelBufferTileTaskWorkerPool::StateAsValue() const {
scoped_refptr<base::debug::TracedValue> state =
new base::debug::TracedValue();
state->SetInteger("completed_count", completed_raster_tasks_.size());
@@ -737,7 +714,7 @@
return state;
}
-void PixelBufferRasterWorkerPool::ThrottleStateAsValueInto(
+void PixelBufferTileTaskWorkerPool::ThrottleStateAsValueInto(
base::debug::TracedValue* throttle_state) const {
throttle_state->SetInteger("bytes_available_for_upload",
max_bytes_pending_upload_ - bytes_pending_upload_);
diff --git a/cc/resources/pixel_buffer_raster_worker_pool.h b/cc/resources/pixel_buffer_tile_task_worker_pool.h
similarity index 64%
rename from cc/resources/pixel_buffer_raster_worker_pool.h
rename to cc/resources/pixel_buffer_tile_task_worker_pool.h
index 7fb45ec..1135dc9 100644
--- a/cc/resources/pixel_buffer_raster_worker_pool.h
+++ b/cc/resources/pixel_buffer_tile_task_worker_pool.h
@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef CC_RESOURCES_PIXEL_BUFFER_RASTER_WORKER_POOL_H_
-#define CC_RESOURCES_PIXEL_BUFFER_RASTER_WORKER_POOL_H_
+#ifndef CC_RESOURCES_PIXEL_BUFFER_TILE_TASK_WORKER_POOL_H_
+#define CC_RESOURCES_PIXEL_BUFFER_TILE_TASK_WORKER_POOL_H_
#include <deque>
#include <vector>
@@ -12,8 +12,8 @@
#include "base/values.h"
#include "cc/base/delayed_unique_notifier.h"
#include "cc/output/context_provider.h"
-#include "cc/resources/raster_worker_pool.h"
-#include "cc/resources/rasterizer.h"
+#include "cc/resources/tile_task_runner.h"
+#include "cc/resources/tile_task_worker_pool.h"
namespace base {
namespace debug {
@@ -25,29 +25,29 @@
namespace cc {
class ResourceProvider;
-class CC_EXPORT PixelBufferRasterWorkerPool : public RasterWorkerPool,
- public Rasterizer,
- public RasterizerTaskClient {
+class CC_EXPORT PixelBufferTileTaskWorkerPool : public TileTaskWorkerPool,
+ public TileTaskRunner,
+ public TileTaskClient {
public:
- ~PixelBufferRasterWorkerPool() override;
+ ~PixelBufferTileTaskWorkerPool() override;
- static scoped_ptr<RasterWorkerPool> Create(
+ static scoped_ptr<TileTaskWorkerPool> Create(
base::SequencedTaskRunner* task_runner,
TaskGraphRunner* task_graph_runner,
ContextProvider* context_provider,
ResourceProvider* resource_provider,
size_t max_transfer_buffer_usage_bytes);
- // Overridden from RasterWorkerPool:
- Rasterizer* AsRasterizer() override;
+ // Overridden from TileTaskWorkerPool:
+ TileTaskRunner* AsTileTaskRunner() override;
- // Overridden from Rasterizer:
- void SetClient(RasterizerClient* client) override;
+ // Overridden from TileTaskRunner:
+ void SetClient(TileTaskRunnerClient* client) override;
void Shutdown() override;
- void ScheduleTasks(RasterTaskQueue* queue) override;
+ void ScheduleTasks(TileTaskQueue* queue) override;
void CheckForCompletedTasks() override;
- // Overridden from RasterizerTaskClient:
+ // Overridden from TileTaskClient:
scoped_ptr<RasterBuffer> AcquireBufferForRaster(
const Resource* resource) override;
void ReleaseBufferForRaster(scoped_ptr<RasterBuffer> buffer) override;
@@ -77,13 +77,13 @@
typedef std::deque<scoped_refptr<RasterTask>> RasterTaskDeque;
- PixelBufferRasterWorkerPool(base::SequencedTaskRunner* task_runner,
- TaskGraphRunner* task_graph_runner,
- ContextProvider* context_provider,
- ResourceProvider* resource_provider,
- size_t max_transfer_buffer_usage_bytes);
+ PixelBufferTileTaskWorkerPool(base::SequencedTaskRunner* task_runner,
+ TaskGraphRunner* task_graph_runner,
+ ContextProvider* context_provider,
+ ResourceProvider* resource_provider,
+ size_t max_transfer_buffer_usage_bytes);
- void OnRasterFinished(TaskSet task_set);
+ void OnTaskSetFinished(TaskSet task_set);
void FlushUploads();
void CheckForCompletedUploads();
void CheckForCompletedRasterTasks();
@@ -99,17 +99,17 @@
scoped_refptr<base::SequencedTaskRunner> task_runner_;
TaskGraphRunner* task_graph_runner_;
const NamespaceToken namespace_token_;
- RasterizerClient* client_;
+ TileTaskRunnerClient* client_;
ContextProvider* context_provider_;
ResourceProvider* resource_provider_;
bool shutdown_;
- RasterTaskQueue raster_tasks_;
+ TileTaskQueue raster_tasks_;
RasterTaskState::Vector raster_task_states_;
RasterTaskDeque raster_tasks_with_pending_upload_;
RasterTask::Vector completed_raster_tasks_;
- RasterizerTask::Vector completed_image_decode_tasks_;
+ TileTask::Vector completed_image_decode_tasks_;
size_t scheduled_raster_task_count_;
size_t task_counts_[kNumberOfTaskSets];
@@ -118,23 +118,23 @@
bool has_performed_uploads_since_last_flush_;
TaskSetCollection should_notify_client_if_no_tasks_are_pending_;
- TaskSetCollection raster_finished_tasks_pending_;
+ TaskSetCollection task_set_finished_tasks_pending_;
DelayedUniqueNotifier check_for_completed_raster_task_notifier_;
- scoped_refptr<RasterizerTask> raster_finished_tasks_[kNumberOfTaskSets];
+ scoped_refptr<TileTask> task_set_finished_tasks_[kNumberOfTaskSets];
// Task graph used when scheduling tasks and vector used to gather
// completed tasks.
TaskGraph graph_;
Task::Vector completed_tasks_;
- base::WeakPtrFactory<PixelBufferRasterWorkerPool>
- raster_finished_weak_ptr_factory_;
+ base::WeakPtrFactory<PixelBufferTileTaskWorkerPool>
+ task_set_finished_weak_ptr_factory_;
- DISALLOW_COPY_AND_ASSIGN(PixelBufferRasterWorkerPool);
+ DISALLOW_COPY_AND_ASSIGN(PixelBufferTileTaskWorkerPool);
};
} // namespace cc
-#endif // CC_RESOURCES_PIXEL_BUFFER_RASTER_WORKER_POOL_H_
+#endif // CC_RESOURCES_PIXEL_BUFFER_TILE_TASK_WORKER_POOL_H_
diff --git a/cc/resources/raster_worker_pool.cc b/cc/resources/raster_worker_pool.cc
deleted file mode 100644
index ca951f6..0000000
--- a/cc/resources/raster_worker_pool.cc
+++ /dev/null
@@ -1,266 +0,0 @@
-// Copyright 2013 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 "cc/resources/raster_worker_pool.h"
-
-#include <algorithm>
-
-#include "base/debug/trace_event.h"
-#include "base/lazy_instance.h"
-#include "base/strings/stringprintf.h"
-#include "base/threading/simple_thread.h"
-#include "cc/base/scoped_ptr_deque.h"
-#include "cc/resources/raster_source.h"
-#include "skia/ext/refptr.h"
-#include "third_party/skia/include/core/SkCanvas.h"
-#include "third_party/skia/include/core/SkSurface.h"
-
-namespace cc {
-namespace {
-
-class RasterTaskGraphRunner : public TaskGraphRunner,
- public base::DelegateSimpleThread::Delegate {
- public:
- RasterTaskGraphRunner() {
- size_t num_threads = RasterWorkerPool::GetNumRasterThreads();
- while (workers_.size() < num_threads) {
- scoped_ptr<base::DelegateSimpleThread> worker =
- make_scoped_ptr(new base::DelegateSimpleThread(
- this,
- base::StringPrintf("CompositorRasterWorker%u",
- static_cast<unsigned>(workers_.size() + 1))
- .c_str()));
- worker->Start();
-#if defined(OS_ANDROID) || defined(OS_LINUX)
- worker->SetThreadPriority(base::kThreadPriority_Background);
-#endif
- workers_.push_back(worker.Pass());
- }
- }
-
- ~RasterTaskGraphRunner() override { NOTREACHED(); }
-
- private:
- // Overridden from base::DelegateSimpleThread::Delegate:
- void Run() override { TaskGraphRunner::Run(); }
-
- ScopedPtrDeque<base::DelegateSimpleThread> workers_;
-};
-
-base::LazyInstance<RasterTaskGraphRunner>::Leaky g_task_graph_runner =
- LAZY_INSTANCE_INITIALIZER;
-
-const int kDefaultNumRasterThreads = 1;
-
-int g_num_raster_threads = 0;
-
-class RasterFinishedTaskImpl : public RasterizerTask {
- public:
- explicit RasterFinishedTaskImpl(
- base::SequencedTaskRunner* task_runner,
- const base::Closure& on_raster_finished_callback)
- : task_runner_(task_runner),
- on_raster_finished_callback_(on_raster_finished_callback) {}
-
- // Overridden from Task:
- void RunOnWorkerThread() override {
- TRACE_EVENT0("cc", "RasterFinishedTaskImpl::RunOnWorkerThread");
- RasterFinished();
- }
-
- // Overridden from RasterizerTask:
- void ScheduleOnOriginThread(RasterizerTaskClient* client) override {}
- void CompleteOnOriginThread(RasterizerTaskClient* client) override {}
- void RunReplyOnOriginThread() override {}
-
- protected:
- ~RasterFinishedTaskImpl() override {}
-
- void RasterFinished() {
- task_runner_->PostTask(FROM_HERE, on_raster_finished_callback_);
- }
-
- private:
- scoped_refptr<base::SequencedTaskRunner> task_runner_;
- const base::Closure on_raster_finished_callback_;
-
- DISALLOW_COPY_AND_ASSIGN(RasterFinishedTaskImpl);
-};
-
-} // namespace
-
-// This allows a micro benchmark system to run tasks with highest priority,
-// since it should finish as quickly as possible.
-unsigned RasterWorkerPool::kBenchmarkRasterTaskPriority = 0u;
-// Task priorities that make sure raster finished tasks run before any
-// remaining raster tasks.
-unsigned RasterWorkerPool::kRasterFinishedTaskPriority = 1u;
-unsigned RasterWorkerPool::kRasterTaskPriorityBase = 2u;
-
-RasterWorkerPool::RasterWorkerPool() {}
-
-RasterWorkerPool::~RasterWorkerPool() {}
-
-// static
-void RasterWorkerPool::SetNumRasterThreads(int num_threads) {
- DCHECK_LT(0, num_threads);
- DCHECK_EQ(0, g_num_raster_threads);
-
- g_num_raster_threads = num_threads;
-}
-
-// static
-int RasterWorkerPool::GetNumRasterThreads() {
- if (!g_num_raster_threads)
- g_num_raster_threads = kDefaultNumRasterThreads;
-
- return g_num_raster_threads;
-}
-
-// static
-TaskGraphRunner* RasterWorkerPool::GetTaskGraphRunner() {
- return g_task_graph_runner.Pointer();
-}
-
-// static
-scoped_refptr<RasterizerTask> RasterWorkerPool::CreateRasterFinishedTask(
- base::SequencedTaskRunner* task_runner,
- const base::Closure& on_raster_finished_callback) {
- return make_scoped_refptr(
- new RasterFinishedTaskImpl(task_runner, on_raster_finished_callback));
-}
-
-// static
-void RasterWorkerPool::ScheduleTasksOnOriginThread(RasterizerTaskClient* client,
- TaskGraph* graph) {
- TRACE_EVENT0("cc", "Rasterizer::ScheduleTasksOnOriginThread");
-
- for (TaskGraph::Node::Vector::iterator it = graph->nodes.begin();
- it != graph->nodes.end();
- ++it) {
- TaskGraph::Node& node = *it;
- RasterizerTask* task = static_cast<RasterizerTask*>(node.task);
-
- if (!task->HasBeenScheduled()) {
- task->WillSchedule();
- task->ScheduleOnOriginThread(client);
- task->DidSchedule();
- }
- }
-}
-
-// static
-void RasterWorkerPool::InsertNodeForTask(TaskGraph* graph,
- RasterizerTask* task,
- unsigned priority,
- size_t dependencies) {
- DCHECK(std::find_if(graph->nodes.begin(),
- graph->nodes.end(),
- TaskGraph::Node::TaskComparator(task)) ==
- graph->nodes.end());
- graph->nodes.push_back(TaskGraph::Node(task, priority, dependencies));
-}
-
-// static
-void RasterWorkerPool::InsertNodesForRasterTask(
- TaskGraph* graph,
- RasterTask* raster_task,
- const ImageDecodeTask::Vector& decode_tasks,
- unsigned priority) {
- size_t dependencies = 0u;
-
- // Insert image decode tasks.
- for (ImageDecodeTask::Vector::const_iterator it = decode_tasks.begin();
- it != decode_tasks.end();
- ++it) {
- ImageDecodeTask* decode_task = it->get();
-
- // Skip if already decoded.
- if (decode_task->HasCompleted())
- continue;
-
- dependencies++;
-
- // Add decode task if it doesn't already exists in graph.
- TaskGraph::Node::Vector::iterator decode_it =
- std::find_if(graph->nodes.begin(),
- graph->nodes.end(),
- TaskGraph::Node::TaskComparator(decode_task));
- if (decode_it == graph->nodes.end())
- InsertNodeForTask(graph, decode_task, priority, 0u);
-
- graph->edges.push_back(TaskGraph::Edge(decode_task, raster_task));
- }
-
- InsertNodeForTask(graph, raster_task, priority, dependencies);
-}
-
-static bool IsSupportedPlaybackToMemoryFormat(ResourceFormat format) {
- switch (format) {
- case RGBA_4444:
- case RGBA_8888:
- case BGRA_8888:
- return true;
- case ALPHA_8:
- case LUMINANCE_8:
- case RGB_565:
- case ETC1:
- case RED_8:
- return false;
- }
- NOTREACHED();
- return false;
-}
-
-// static
-void RasterWorkerPool::PlaybackToMemory(void* memory,
- ResourceFormat format,
- const gfx::Size& size,
- int stride,
- const RasterSource* raster_source,
- const gfx::Rect& rect,
- float scale) {
- DCHECK(IsSupportedPlaybackToMemoryFormat(format)) << format;
-
- // Uses kPremul_SkAlphaType since the result is not known to be opaque.
- SkImageInfo info =
- SkImageInfo::MakeN32(size.width(), size.height(), kPremul_SkAlphaType);
- SkColorType buffer_color_type = ResourceFormatToSkColorType(format);
- bool needs_copy = buffer_color_type != info.colorType();
-
- // Use unknown pixel geometry to disable LCD text.
- SkSurfaceProps surface_props(0, kUnknown_SkPixelGeometry);
- if (raster_source->CanUseLCDText()) {
- // LegacyFontHost will get LCD text and skia figures out what type to use.
- surface_props = SkSurfaceProps(SkSurfaceProps::kLegacyFontHost_InitType);
- }
-
- if (!stride)
- stride = info.minRowBytes();
-
- if (!needs_copy) {
- skia::RefPtr<SkSurface> surface = skia::AdoptRef(
- SkSurface::NewRasterDirect(info, memory, stride, &surface_props));
- skia::RefPtr<SkCanvas> canvas = skia::SharePtr(surface->getCanvas());
- raster_source->PlaybackToCanvas(canvas.get(), rect, scale);
- return;
- }
-
- skia::RefPtr<SkSurface> surface =
- skia::AdoptRef(SkSurface::NewRaster(info, &surface_props));
- skia::RefPtr<SkCanvas> canvas = skia::SharePtr(surface->getCanvas());
- raster_source->PlaybackToCanvas(canvas.get(), rect, scale);
-
- SkImageInfo dst_info = info;
- dst_info.fColorType = buffer_color_type;
- // TODO(kaanb): The GL pipeline assumes a 4-byte alignment for the
- // bitmap data. There will be no need to call SkAlign4 once crbug.com/293728
- // is fixed.
- const size_t dst_row_bytes = SkAlign4(dst_info.minRowBytes());
- DCHECK_EQ(0u, dst_row_bytes % 4);
- bool success = canvas->readPixels(dst_info, memory, dst_row_bytes, 0, 0);
- DCHECK_EQ(true, success);
-}
-
-} // namespace cc
diff --git a/cc/resources/raster_worker_pool_perftest.cc b/cc/resources/raster_worker_pool_perftest.cc
deleted file mode 100644
index d86155a..0000000
--- a/cc/resources/raster_worker_pool_perftest.cc
+++ /dev/null
@@ -1,533 +0,0 @@
-// Copyright 2013 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 "cc/resources/raster_worker_pool.h"
-
-#include "base/test/test_simple_task_runner.h"
-#include "base/time/time.h"
-#include "cc/debug/lap_timer.h"
-#include "cc/output/context_provider.h"
-#include "cc/resources/bitmap_raster_worker_pool.h"
-#include "cc/resources/gpu_raster_worker_pool.h"
-#include "cc/resources/one_copy_raster_worker_pool.h"
-#include "cc/resources/pixel_buffer_raster_worker_pool.h"
-#include "cc/resources/raster_buffer.h"
-#include "cc/resources/rasterizer.h"
-#include "cc/resources/resource_pool.h"
-#include "cc/resources/resource_provider.h"
-#include "cc/resources/scoped_resource.h"
-#include "cc/resources/zero_copy_raster_worker_pool.h"
-#include "cc/test/fake_output_surface.h"
-#include "cc/test/fake_output_surface_client.h"
-#include "cc/test/test_context_support.h"
-#include "cc/test/test_gpu_memory_buffer_manager.h"
-#include "cc/test/test_shared_bitmap_manager.h"
-#include "cc/test/test_web_graphics_context_3d.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/perf/perf_test.h"
-#include "third_party/khronos/GLES2/gl2.h"
-
-namespace cc {
-namespace {
-
-class PerfGLES2Interface : public gpu::gles2::GLES2InterfaceStub {
- // Overridden from gpu::gles2::GLES2Interface:
- GLuint CreateImageCHROMIUM(ClientBuffer buffer,
- GLsizei width,
- GLsizei height,
- GLenum internalformat) override {
- return 1u;
- }
- void GenBuffers(GLsizei n, GLuint* buffers) override {
- for (GLsizei i = 0; i < n; ++i)
- buffers[i] = 1u;
- }
- void GenTextures(GLsizei n, GLuint* textures) override {
- for (GLsizei i = 0; i < n; ++i)
- textures[i] = 1u;
- }
- void GetIntegerv(GLenum pname, GLint* params) override {
- if (pname == GL_MAX_TEXTURE_SIZE)
- *params = INT_MAX;
- }
- void GenQueriesEXT(GLsizei n, GLuint* queries) override {
- for (GLsizei i = 0; i < n; ++i)
- queries[i] = 1u;
- }
- void GetQueryObjectuivEXT(GLuint query,
- GLenum pname,
- GLuint* params) override {
- if (pname == GL_QUERY_RESULT_AVAILABLE_EXT)
- *params = 1;
- }
-};
-
-class PerfContextProvider : public ContextProvider {
- public:
- PerfContextProvider() : context_gl_(new PerfGLES2Interface) {}
-
- bool BindToCurrentThread() override { return true; }
- Capabilities ContextCapabilities() override {
- Capabilities capabilities;
- capabilities.gpu.image = true;
- capabilities.gpu.sync_query = true;
- return capabilities;
- }
- gpu::gles2::GLES2Interface* ContextGL() override { return context_gl_.get(); }
- gpu::ContextSupport* ContextSupport() override { return &support_; }
- class GrContext* GrContext() override {
- return NULL;
- }
- bool IsContextLost() override { return false; }
- void VerifyContexts() override {}
- void DeleteCachedResources() override {}
- bool DestroyedOnMainThread() override { return false; }
- void SetLostContextCallback(const LostContextCallback& cb) override {}
- void SetMemoryPolicyChangedCallback(
- const MemoryPolicyChangedCallback& cb) override {}
-
- private:
- ~PerfContextProvider() override {}
-
- scoped_ptr<PerfGLES2Interface> context_gl_;
- TestContextSupport support_;
-};
-
-enum RasterWorkerPoolType {
- RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER,
- RASTER_WORKER_POOL_TYPE_ZERO_COPY,
- RASTER_WORKER_POOL_TYPE_ONE_COPY,
- RASTER_WORKER_POOL_TYPE_GPU,
- RASTER_WORKER_POOL_TYPE_BITMAP
-};
-
-static const int kTimeLimitMillis = 2000;
-static const int kWarmupRuns = 5;
-static const int kTimeCheckInterval = 10;
-
-class PerfImageDecodeTaskImpl : public ImageDecodeTask {
- public:
- PerfImageDecodeTaskImpl() {}
-
- // Overridden from Task:
- void RunOnWorkerThread() override {}
-
- // Overridden from RasterizerTask:
- void ScheduleOnOriginThread(RasterizerTaskClient* client) override {}
- void CompleteOnOriginThread(RasterizerTaskClient* client) override {}
- void RunReplyOnOriginThread() override { Reset(); }
-
- void Reset() {
- did_run_ = false;
- did_complete_ = false;
- }
-
- protected:
- ~PerfImageDecodeTaskImpl() override {}
-
- private:
- DISALLOW_COPY_AND_ASSIGN(PerfImageDecodeTaskImpl);
-};
-
-class PerfRasterTaskImpl : public RasterTask {
- public:
- PerfRasterTaskImpl(scoped_ptr<ScopedResource> resource,
- ImageDecodeTask::Vector* dependencies)
- : RasterTask(resource.get(), dependencies), resource_(resource.Pass()) {}
-
- // Overridden from Task:
- void RunOnWorkerThread() override {}
-
- // Overridden from RasterizerTask:
- void ScheduleOnOriginThread(RasterizerTaskClient* client) override {
- raster_buffer_ = client->AcquireBufferForRaster(resource());
- }
- void CompleteOnOriginThread(RasterizerTaskClient* client) override {
- client->ReleaseBufferForRaster(raster_buffer_.Pass());
- }
- void RunReplyOnOriginThread() override { Reset(); }
-
- void Reset() {
- did_run_ = false;
- did_complete_ = false;
- }
-
- protected:
- ~PerfRasterTaskImpl() override {}
-
- private:
- scoped_ptr<ScopedResource> resource_;
- scoped_ptr<RasterBuffer> raster_buffer_;
-
- DISALLOW_COPY_AND_ASSIGN(PerfRasterTaskImpl);
-};
-
-class RasterWorkerPoolPerfTestBase {
- public:
- typedef std::vector<scoped_refptr<RasterTask>> RasterTaskVector;
-
- enum NamedTaskSet { ALL, REQUIRED_FOR_ACTIVATION, REQUIRED_FOR_DRAW };
-
- RasterWorkerPoolPerfTestBase()
- : context_provider_(make_scoped_refptr(new PerfContextProvider)),
- task_runner_(new base::TestSimpleTaskRunner),
- task_graph_runner_(new TaskGraphRunner),
- timer_(kWarmupRuns,
- base::TimeDelta::FromMilliseconds(kTimeLimitMillis),
- kTimeCheckInterval) {}
-
- void CreateImageDecodeTasks(unsigned num_image_decode_tasks,
- ImageDecodeTask::Vector* image_decode_tasks) {
- for (unsigned i = 0; i < num_image_decode_tasks; ++i)
- image_decode_tasks->push_back(new PerfImageDecodeTaskImpl);
- }
-
- void CreateRasterTasks(unsigned num_raster_tasks,
- const ImageDecodeTask::Vector& image_decode_tasks,
- RasterTaskVector* raster_tasks) {
- const gfx::Size size(1, 1);
-
- for (unsigned i = 0; i < num_raster_tasks; ++i) {
- scoped_ptr<ScopedResource> resource(
- ScopedResource::Create(resource_provider_.get()));
- resource->Allocate(
- size, ResourceProvider::TextureHintImmutable, RGBA_8888);
-
- ImageDecodeTask::Vector dependencies = image_decode_tasks;
- raster_tasks->push_back(
- new PerfRasterTaskImpl(resource.Pass(), &dependencies));
- }
- }
-
- void BuildRasterTaskQueue(RasterTaskQueue* queue,
- const RasterTaskVector& raster_tasks) {
- for (size_t i = 0u; i < raster_tasks.size(); ++i) {
- bool required_for_activation = (i % 2) == 0;
- TaskSetCollection task_set_collection;
- task_set_collection[ALL] = true;
- task_set_collection[REQUIRED_FOR_ACTIVATION] = required_for_activation;
- queue->items.push_back(
- RasterTaskQueue::Item(raster_tasks[i].get(), task_set_collection));
- }
- }
-
- protected:
- scoped_refptr<ContextProvider> context_provider_;
- FakeOutputSurfaceClient output_surface_client_;
- scoped_ptr<FakeOutputSurface> output_surface_;
- scoped_ptr<ResourceProvider> resource_provider_;
- scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
- scoped_ptr<TaskGraphRunner> task_graph_runner_;
- LapTimer timer_;
-};
-
-class RasterWorkerPoolPerfTest
- : public RasterWorkerPoolPerfTestBase,
- public testing::TestWithParam<RasterWorkerPoolType>,
- public RasterizerClient {
- public:
- // Overridden from testing::Test:
- void SetUp() override {
- switch (GetParam()) {
- case RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER:
- Create3dOutputSurfaceAndResourceProvider();
- raster_worker_pool_ = PixelBufferRasterWorkerPool::Create(
- task_runner_.get(),
- task_graph_runner_.get(),
- context_provider_.get(),
- resource_provider_.get(),
- std::numeric_limits<size_t>::max());
- break;
- case RASTER_WORKER_POOL_TYPE_ZERO_COPY:
- Create3dOutputSurfaceAndResourceProvider();
- raster_worker_pool_ =
- ZeroCopyRasterWorkerPool::Create(task_runner_.get(),
- task_graph_runner_.get(),
- resource_provider_.get());
- break;
- case RASTER_WORKER_POOL_TYPE_ONE_COPY:
- Create3dOutputSurfaceAndResourceProvider();
- staging_resource_pool_ = ResourcePool::Create(
- resource_provider_.get(), GL_TEXTURE_2D, RGBA_8888);
- raster_worker_pool_ =
- OneCopyRasterWorkerPool::Create(task_runner_.get(),
- task_graph_runner_.get(),
- context_provider_.get(),
- resource_provider_.get(),
- staging_resource_pool_.get());
- break;
- case RASTER_WORKER_POOL_TYPE_GPU:
- Create3dOutputSurfaceAndResourceProvider();
- raster_worker_pool_ =
- GpuRasterWorkerPool::Create(task_runner_.get(),
- context_provider_.get(),
- resource_provider_.get(),
- false);
- break;
- case RASTER_WORKER_POOL_TYPE_BITMAP:
- CreateSoftwareOutputSurfaceAndResourceProvider();
- raster_worker_pool_ =
- BitmapRasterWorkerPool::Create(task_runner_.get(),
- task_graph_runner_.get(),
- resource_provider_.get());
- break;
- }
-
- DCHECK(raster_worker_pool_);
- raster_worker_pool_->AsRasterizer()->SetClient(this);
- }
- void TearDown() override {
- raster_worker_pool_->AsRasterizer()->Shutdown();
- raster_worker_pool_->AsRasterizer()->CheckForCompletedTasks();
- }
-
- // Overriden from RasterizerClient:
- void DidFinishRunningTasks(TaskSet task_set) override {
- raster_worker_pool_->AsRasterizer()->CheckForCompletedTasks();
- }
- TaskSetCollection TasksThatShouldBeForcedToComplete() const override {
- return TaskSetCollection();
- }
-
- void RunMessageLoopUntilAllTasksHaveCompleted() {
- task_graph_runner_->RunUntilIdle();
- task_runner_->RunUntilIdle();
- }
-
- void RunScheduleTasksTest(const std::string& test_name,
- unsigned num_raster_tasks,
- unsigned num_image_decode_tasks) {
- ImageDecodeTask::Vector image_decode_tasks;
- RasterTaskVector raster_tasks;
- CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks);
- CreateRasterTasks(num_raster_tasks, image_decode_tasks, &raster_tasks);
-
- // Avoid unnecessary heap allocations by reusing the same queue.
- RasterTaskQueue queue;
-
- timer_.Reset();
- do {
- queue.Reset();
- BuildRasterTaskQueue(&queue, raster_tasks);
- raster_worker_pool_->AsRasterizer()->ScheduleTasks(&queue);
- raster_worker_pool_->AsRasterizer()->CheckForCompletedTasks();
- timer_.NextLap();
- } while (!timer_.HasTimeLimitExpired());
-
- RasterTaskQueue empty;
- raster_worker_pool_->AsRasterizer()->ScheduleTasks(&empty);
- RunMessageLoopUntilAllTasksHaveCompleted();
-
- perf_test::PrintResult("schedule_tasks",
- TestModifierString(),
- test_name,
- timer_.LapsPerSecond(),
- "runs/s",
- true);
- }
-
- void RunScheduleAlternateTasksTest(const std::string& test_name,
- unsigned num_raster_tasks,
- unsigned num_image_decode_tasks) {
- const size_t kNumVersions = 2;
- ImageDecodeTask::Vector image_decode_tasks[kNumVersions];
- RasterTaskVector raster_tasks[kNumVersions];
- for (size_t i = 0; i < kNumVersions; ++i) {
- CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks[i]);
- CreateRasterTasks(
- num_raster_tasks, image_decode_tasks[i], &raster_tasks[i]);
- }
-
- // Avoid unnecessary heap allocations by reusing the same queue.
- RasterTaskQueue queue;
-
- size_t count = 0;
- timer_.Reset();
- do {
- queue.Reset();
- BuildRasterTaskQueue(&queue, raster_tasks[count % kNumVersions]);
- raster_worker_pool_->AsRasterizer()->ScheduleTasks(&queue);
- raster_worker_pool_->AsRasterizer()->CheckForCompletedTasks();
- ++count;
- timer_.NextLap();
- } while (!timer_.HasTimeLimitExpired());
-
- RasterTaskQueue empty;
- raster_worker_pool_->AsRasterizer()->ScheduleTasks(&empty);
- RunMessageLoopUntilAllTasksHaveCompleted();
-
- perf_test::PrintResult("schedule_alternate_tasks",
- TestModifierString(),
- test_name,
- timer_.LapsPerSecond(),
- "runs/s",
- true);
- }
-
- void RunScheduleAndExecuteTasksTest(const std::string& test_name,
- unsigned num_raster_tasks,
- unsigned num_image_decode_tasks) {
- ImageDecodeTask::Vector image_decode_tasks;
- RasterTaskVector raster_tasks;
- CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks);
- CreateRasterTasks(num_raster_tasks, image_decode_tasks, &raster_tasks);
-
- // Avoid unnecessary heap allocations by reusing the same queue.
- RasterTaskQueue queue;
-
- timer_.Reset();
- do {
- queue.Reset();
- BuildRasterTaskQueue(&queue, raster_tasks);
- raster_worker_pool_->AsRasterizer()->ScheduleTasks(&queue);
- RunMessageLoopUntilAllTasksHaveCompleted();
- timer_.NextLap();
- } while (!timer_.HasTimeLimitExpired());
-
- RasterTaskQueue empty;
- raster_worker_pool_->AsRasterizer()->ScheduleTasks(&empty);
- RunMessageLoopUntilAllTasksHaveCompleted();
-
- perf_test::PrintResult("schedule_and_execute_tasks",
- TestModifierString(),
- test_name,
- timer_.LapsPerSecond(),
- "runs/s",
- true);
- }
-
- private:
- void Create3dOutputSurfaceAndResourceProvider() {
- output_surface_ = FakeOutputSurface::Create3d(context_provider_).Pass();
- CHECK(output_surface_->BindToClient(&output_surface_client_));
- resource_provider_ = ResourceProvider::Create(output_surface_.get(),
- NULL,
- &gpu_memory_buffer_manager_,
- NULL,
- 0,
- false,
- 1).Pass();
- }
-
- void CreateSoftwareOutputSurfaceAndResourceProvider() {
- output_surface_ = FakeOutputSurface::CreateSoftware(
- make_scoped_ptr(new SoftwareOutputDevice));
- CHECK(output_surface_->BindToClient(&output_surface_client_));
- resource_provider_ = ResourceProvider::Create(output_surface_.get(),
- &shared_bitmap_manager_,
- NULL,
- NULL,
- 0,
- false,
- 1).Pass();
- }
-
- std::string TestModifierString() const {
- switch (GetParam()) {
- case RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER:
- return std::string("_pixel_raster_worker_pool");
- case RASTER_WORKER_POOL_TYPE_ZERO_COPY:
- return std::string("_zero_copy_raster_worker_pool");
- case RASTER_WORKER_POOL_TYPE_ONE_COPY:
- return std::string("_one_copy_raster_worker_pool");
- case RASTER_WORKER_POOL_TYPE_GPU:
- return std::string("_gpu_raster_worker_pool");
- case RASTER_WORKER_POOL_TYPE_BITMAP:
- return std::string("_bitmap_raster_worker_pool");
- }
- NOTREACHED();
- return std::string();
- }
-
- scoped_ptr<ResourcePool> staging_resource_pool_;
- scoped_ptr<RasterWorkerPool> raster_worker_pool_;
- TestGpuMemoryBufferManager gpu_memory_buffer_manager_;
- TestSharedBitmapManager shared_bitmap_manager_;
-};
-
-TEST_P(RasterWorkerPoolPerfTest, ScheduleTasks) {
- RunScheduleTasksTest("1_0", 1, 0);
- RunScheduleTasksTest("32_0", 32, 0);
- RunScheduleTasksTest("1_1", 1, 1);
- RunScheduleTasksTest("32_1", 32, 1);
- RunScheduleTasksTest("1_4", 1, 4);
- RunScheduleTasksTest("32_4", 32, 4);
-}
-
-TEST_P(RasterWorkerPoolPerfTest, ScheduleAlternateTasks) {
- RunScheduleAlternateTasksTest("1_0", 1, 0);
- RunScheduleAlternateTasksTest("32_0", 32, 0);
- RunScheduleAlternateTasksTest("1_1", 1, 1);
- RunScheduleAlternateTasksTest("32_1", 32, 1);
- RunScheduleAlternateTasksTest("1_4", 1, 4);
- RunScheduleAlternateTasksTest("32_4", 32, 4);
-}
-
-TEST_P(RasterWorkerPoolPerfTest, ScheduleAndExecuteTasks) {
- RunScheduleAndExecuteTasksTest("1_0", 1, 0);
- RunScheduleAndExecuteTasksTest("32_0", 32, 0);
- RunScheduleAndExecuteTasksTest("1_1", 1, 1);
- RunScheduleAndExecuteTasksTest("32_1", 32, 1);
- RunScheduleAndExecuteTasksTest("1_4", 1, 4);
- RunScheduleAndExecuteTasksTest("32_4", 32, 4);
-}
-
-INSTANTIATE_TEST_CASE_P(RasterWorkerPoolPerfTests,
- RasterWorkerPoolPerfTest,
- ::testing::Values(RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER,
- RASTER_WORKER_POOL_TYPE_ZERO_COPY,
- RASTER_WORKER_POOL_TYPE_ONE_COPY,
- RASTER_WORKER_POOL_TYPE_GPU,
- RASTER_WORKER_POOL_TYPE_BITMAP));
-
-class RasterWorkerPoolCommonPerfTest : public RasterWorkerPoolPerfTestBase,
- public testing::Test {
- public:
- // Overridden from testing::Test:
- void SetUp() override {
- output_surface_ = FakeOutputSurface::Create3d(context_provider_).Pass();
- CHECK(output_surface_->BindToClient(&output_surface_client_));
- resource_provider_ =
- ResourceProvider::Create(
- output_surface_.get(), NULL, NULL, NULL, 0, false, 1).Pass();
- }
-
- void RunBuildRasterTaskQueueTest(const std::string& test_name,
- unsigned num_raster_tasks,
- unsigned num_image_decode_tasks) {
- ImageDecodeTask::Vector image_decode_tasks;
- RasterTaskVector raster_tasks;
- CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks);
- CreateRasterTasks(num_raster_tasks, image_decode_tasks, &raster_tasks);
-
- // Avoid unnecessary heap allocations by reusing the same queue.
- RasterTaskQueue queue;
-
- timer_.Reset();
- do {
- queue.Reset();
- BuildRasterTaskQueue(&queue, raster_tasks);
- timer_.NextLap();
- } while (!timer_.HasTimeLimitExpired());
-
- perf_test::PrintResult("build_raster_task_queue",
- "",
- test_name,
- timer_.LapsPerSecond(),
- "runs/s",
- true);
- }
-};
-
-TEST_F(RasterWorkerPoolCommonPerfTest, BuildRasterTaskQueue) {
- RunBuildRasterTaskQueueTest("1_0", 1, 0);
- RunBuildRasterTaskQueueTest("32_0", 32, 0);
- RunBuildRasterTaskQueueTest("1_1", 1, 1);
- RunBuildRasterTaskQueueTest("32_1", 32, 1);
- RunBuildRasterTaskQueueTest("1_4", 1, 4);
- RunBuildRasterTaskQueueTest("32_4", 32, 4);
-}
-
-} // namespace
-} // namespace cc
diff --git a/cc/resources/rasterizer.cc b/cc/resources/rasterizer.cc
deleted file mode 100644
index 4ce8987..0000000
--- a/cc/resources/rasterizer.cc
+++ /dev/null
@@ -1,80 +0,0 @@
-// 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.
-
-#include "cc/resources/rasterizer.h"
-
-#include <algorithm>
-
-namespace cc {
-
-RasterizerTask::RasterizerTask() : did_schedule_(false), did_complete_(false) {}
-
-RasterizerTask::~RasterizerTask() {
- // Debugging CHECKs to help track down a use-after-free.
- CHECK(!did_schedule_);
- CHECK(!did_run_ || did_complete_);
-}
-
-ImageDecodeTask* RasterizerTask::AsImageDecodeTask() { return NULL; }
-
-RasterTask* RasterizerTask::AsRasterTask() { return NULL; }
-
-void RasterizerTask::WillSchedule() { DCHECK(!did_schedule_); }
-
-void RasterizerTask::DidSchedule() {
- did_schedule_ = true;
- did_complete_ = false;
-}
-
-bool RasterizerTask::HasBeenScheduled() const { return did_schedule_; }
-
-void RasterizerTask::WillComplete() { DCHECK(!did_complete_); }
-
-void RasterizerTask::DidComplete() {
- DCHECK(did_schedule_);
- DCHECK(!did_complete_);
- did_schedule_ = false;
- did_complete_ = true;
-}
-
-bool RasterizerTask::HasCompleted() const { return did_complete_; }
-
-ImageDecodeTask::ImageDecodeTask() {}
-
-ImageDecodeTask::~ImageDecodeTask() {}
-
-ImageDecodeTask* ImageDecodeTask::AsImageDecodeTask() { return this; }
-
-RasterTask::RasterTask(const Resource* resource,
- ImageDecodeTask::Vector* dependencies)
- : resource_(resource) {
- dependencies_.swap(*dependencies);
-}
-
-RasterTask::~RasterTask() {}
-
-RasterTask* RasterTask::AsRasterTask() { return this; }
-
-RasterTaskQueue::Item::Item(RasterTask* task,
- const TaskSetCollection& task_sets)
- : task(task), task_sets(task_sets) {
- DCHECK(task_sets.any());
-}
-
-RasterTaskQueue::Item::~Item() {}
-
-RasterTaskQueue::RasterTaskQueue() {
-}
-
-RasterTaskQueue::~RasterTaskQueue() {}
-
-void RasterTaskQueue::Swap(RasterTaskQueue* other) {
- items.swap(other->items);
-}
-
-void RasterTaskQueue::Reset() {
- items.clear();
-}
-
-} // namespace cc
diff --git a/cc/resources/tile_manager.cc b/cc/resources/tile_manager.cc
index 66f95da..7ab1fbf 100644
--- a/cc/resources/tile_manager.cc
+++ b/cc/resources/tile_manager.cc
@@ -18,8 +18,8 @@
#include "cc/debug/traced_value.h"
#include "cc/layers/picture_layer_impl.h"
#include "cc/resources/raster_buffer.h"
-#include "cc/resources/rasterizer.h"
#include "cc/resources/tile.h"
+#include "cc/resources/tile_task_runner.h"
#include "ui/gfx/geometry/rect_conversions.h"
namespace cc {
@@ -73,12 +73,12 @@
Raster(raster_source_.get());
}
- // Overridden from RasterizerTask:
- void ScheduleOnOriginThread(RasterizerTaskClient* client) override {
+ // Overridden from TileTask:
+ void ScheduleOnOriginThread(TileTaskClient* client) override {
DCHECK(!raster_buffer_);
raster_buffer_ = client->AcquireBufferForRaster(resource());
}
- void CompleteOnOriginThread(RasterizerTaskClient* client) override {
+ void CompleteOnOriginThread(TileTaskClient* client) override {
client->ReleaseBufferForRaster(raster_buffer_.Pass());
}
void RunReplyOnOriginThread() override {
@@ -158,9 +158,9 @@
pixel_ref_->unlockPixels();
}
- // Overridden from RasterizerTask:
- void ScheduleOnOriginThread(RasterizerTaskClient* client) override {}
- void CompleteOnOriginThread(RasterizerTaskClient* client) override {}
+ // Overridden from TileTask:
+ void ScheduleOnOriginThread(TileTaskClient* client) override {}
+ void CompleteOnOriginThread(TileTaskClient* client) override {}
void RunReplyOnOriginThread() override { reply_.Run(!HasFinishedRunning()); }
protected:
@@ -208,28 +208,25 @@
TileManagerClient* client,
base::SequencedTaskRunner* task_runner,
ResourcePool* resource_pool,
- Rasterizer* rasterizer,
+ TileTaskRunner* tile_task_runner,
RenderingStatsInstrumentation* rendering_stats_instrumentation,
size_t scheduled_raster_task_limit) {
- return make_scoped_ptr(new TileManager(client,
- task_runner,
- resource_pool,
- rasterizer,
- rendering_stats_instrumentation,
- scheduled_raster_task_limit));
+ return make_scoped_ptr(new TileManager(
+ client, task_runner, resource_pool, tile_task_runner,
+ rendering_stats_instrumentation, scheduled_raster_task_limit));
}
TileManager::TileManager(
TileManagerClient* client,
const scoped_refptr<base::SequencedTaskRunner>& task_runner,
ResourcePool* resource_pool,
- Rasterizer* rasterizer,
+ TileTaskRunner* tile_task_runner,
RenderingStatsInstrumentation* rendering_stats_instrumentation,
size_t scheduled_raster_task_limit)
: client_(client),
task_runner_(task_runner),
resource_pool_(resource_pool),
- rasterizer_(rasterizer),
+ tile_task_runner_(tile_task_runner),
scheduled_raster_task_limit_(scheduled_raster_task_limit),
all_tiles_that_need_to_be_rasterized_are_scheduled_(true),
rendering_stats_instrumentation_(rendering_stats_instrumentation),
@@ -244,7 +241,7 @@
base::Bind(&TileManager::CheckIfReadyToDraw, base::Unretained(this))),
did_notify_ready_to_activate_(false),
did_notify_ready_to_draw_(false) {
- rasterizer_->SetClient(this);
+ tile_task_runner_->SetClient(this);
}
TileManager::~TileManager() {
@@ -252,14 +249,14 @@
// our memory usage to drop to zero.
global_state_ = GlobalStateThatImpactsTilePriority();
- RasterTaskQueue empty;
- rasterizer_->ScheduleTasks(&empty);
+ TileTaskQueue empty;
+ tile_task_runner_->ScheduleTasks(&empty);
orphan_raster_tasks_.clear();
// This should finish all pending tasks and release any uninitialized
// resources.
- rasterizer_->Shutdown();
- rasterizer_->CheckForCompletedTasks();
+ tile_task_runner_->Shutdown();
+ tile_task_runner_->CheckForCompletedTasks();
FreeResourcesForReleasedTiles();
CleanUpReleasedTiles();
@@ -312,8 +309,8 @@
}
}
-void TileManager::DidFinishRunningTasks(TaskSet task_set) {
- TRACE_EVENT1("cc", "TileManager::DidFinishRunningTasks", "task_set",
+void TileManager::DidFinishRunningTileTasks(TaskSet task_set) {
+ TRACE_EVENT1("cc", "TileManager::DidFinishRunningTileTasks", "task_set",
TaskSetName(task_set));
switch (task_set) {
@@ -328,7 +325,7 @@
!memory_usage_above_limit)
return;
- rasterizer_->CheckForCompletedTasks();
+ tile_task_runner_->CheckForCompletedTasks();
did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
TileVector tiles_that_need_to_be_rasterized;
@@ -400,15 +397,16 @@
NOTREACHED();
}
-void TileManager::ManageTiles(const GlobalStateThatImpactsTilePriority& state) {
- TRACE_EVENT0("cc", "TileManager::ManageTiles");
+void TileManager::PrepareTiles(
+ const GlobalStateThatImpactsTilePriority& state) {
+ TRACE_EVENT0("cc", "TileManager::PrepareTiles");
global_state_ = state;
// We need to call CheckForCompletedTasks() once in-between each call
// to ScheduleTasks() to prevent canceled tasks from being scheduled.
if (!did_check_for_completed_tasks_since_last_schedule_tasks_) {
- rasterizer_->CheckForCompletedTasks();
+ tile_task_runner_->CheckForCompletedTasks();
did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
}
@@ -418,16 +416,13 @@
TileVector tiles_that_need_to_be_rasterized;
AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized);
- // Schedule rasterizer tasks.
+ // Schedule tile tasks.
ScheduleTasks(tiles_that_need_to_be_rasterized);
did_notify_ready_to_activate_ = false;
did_notify_ready_to_draw_ = false;
- TRACE_EVENT_INSTANT1("cc",
- "DidManage",
- TRACE_EVENT_SCOPE_THREAD,
- "state",
+ TRACE_EVENT_INSTANT1("cc", "DidPrepare", TRACE_EVENT_SCOPE_THREAD, "state",
BasicStateAsValue());
TRACE_COUNTER_ID1("cc",
@@ -440,7 +435,7 @@
void TileManager::UpdateVisibleTiles() {
TRACE_EVENT0("cc", "TileManager::UpdateVisibleTiles");
- rasterizer_->CheckForCompletedTasks();
+ tile_task_runner_->CheckForCompletedTasks();
did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
TRACE_EVENT_INSTANT1(
@@ -698,7 +693,7 @@
task_sets.set(REQUIRED_FOR_DRAW);
task_sets.set(ALL);
raster_queue_.items.push_back(
- RasterTaskQueue::Item(mts.raster_task.get(), task_sets));
+ TileTaskQueue::Item(mts.raster_task.get(), task_sets));
}
// We must reduce the amount of unused resoruces before calling
@@ -708,7 +703,7 @@
// Schedule running of |raster_queue_|. This replaces any previously
// scheduled tasks and effectively cancels all tasks not present
// in |raster_queue_|.
- rasterizer_->ScheduleTasks(&raster_queue_);
+ tile_task_runner_->ScheduleTasks(&raster_queue_);
// It's now safe to clean up orphan tasks as raster worker pool is not
// allowed to keep around unreferenced raster tasks after ScheduleTasks() has
@@ -853,9 +848,10 @@
return tile;
}
-void TileManager::SetRasterizerForTesting(Rasterizer* rasterizer) {
- rasterizer_ = rasterizer;
- rasterizer_->SetClient(this);
+void TileManager::SetTileTaskRunnerForTesting(
+ TileTaskRunner* tile_task_runner) {
+ tile_task_runner_ = tile_task_runner;
+ tile_task_runner_->SetClient(this);
}
bool TileManager::IsReadyToActivate() const {
@@ -884,7 +880,7 @@
void TileManager::CheckIfReadyToActivate() {
TRACE_EVENT0("cc", "TileManager::CheckIfReadyToActivate");
- rasterizer_->CheckForCompletedTasks();
+ tile_task_runner_->CheckForCompletedTasks();
did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
if (did_notify_ready_to_activate_)
@@ -899,7 +895,7 @@
void TileManager::CheckIfReadyToDraw() {
TRACE_EVENT0("cc", "TileManager::CheckIfReadyToDraw");
- rasterizer_->CheckForCompletedTasks();
+ tile_task_runner_->CheckForCompletedTasks();
did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
if (did_notify_ready_to_draw_)
diff --git a/cc/resources/tile_manager.h b/cc/resources/tile_manager.h
index 8d19520..638fecb 100644
--- a/cc/resources/tile_manager.h
+++ b/cc/resources/tile_manager.h
@@ -22,9 +22,9 @@
#include "cc/resources/memory_history.h"
#include "cc/resources/raster_source.h"
#include "cc/resources/raster_tile_priority_queue.h"
-#include "cc/resources/rasterizer.h"
#include "cc/resources/resource_pool.h"
#include "cc/resources/tile.h"
+#include "cc/resources/tile_task_runner.h"
namespace base {
namespace debug {
@@ -86,7 +86,7 @@
// should no longer have any memory assigned to them. Tile objects are "owned"
// by layers; they automatically register with the manager when they are
// created, and unregister from the manager when they are deleted.
-class CC_EXPORT TileManager : public RasterizerClient,
+class CC_EXPORT TileManager : public TileTaskRunnerClient,
public RefCountedManager<Tile> {
public:
enum NamedTaskSet {
@@ -101,12 +101,17 @@
TileManagerClient* client,
base::SequencedTaskRunner* task_runner,
ResourcePool* resource_pool,
- Rasterizer* rasterizer,
+ TileTaskRunner* tile_task_runner,
RenderingStatsInstrumentation* rendering_stats_instrumentation,
size_t scheduled_raster_task_limit);
~TileManager() override;
- void ManageTiles(const GlobalStateThatImpactsTilePriority& state);
+ // Assigns tile memory and schedules work to prepare tiles for drawing.
+ // - Runs client_->NotifyReadyToActivate() when all tiles required for
+ // activation are prepared, or failed to prepare due to OOM.
+ // - Runs client_->NotifyReadyToDraw() when all tiles required draw are
+ // prepared, or failed to prepare due to OOM.
+ void PrepareTiles(const GlobalStateThatImpactsTilePriority& state);
void UpdateVisibleTiles();
@@ -146,7 +151,7 @@
global_state_ = state;
}
- void SetRasterizerForTesting(Rasterizer* rasterizer);
+ void SetTileTaskRunnerForTesting(TileTaskRunner* tile_task_runner);
void FreeResourcesAndCleanUpReleasedTilesForTesting() {
FreeResourcesForReleasedTiles();
@@ -170,7 +175,7 @@
TileManager(TileManagerClient* client,
const scoped_refptr<base::SequencedTaskRunner>& task_runner,
ResourcePool* resource_pool,
- Rasterizer* rasterizer,
+ TileTaskRunner* tile_task_runner,
RenderingStatsInstrumentation* rendering_stats_instrumentation,
size_t scheduled_raster_task_limit);
@@ -181,8 +186,8 @@
friend class Tile;
void Release(Tile* tile) override;
- // Overriden from RasterizerClient:
- void DidFinishRunningTasks(TaskSet task_set) override;
+ // Overriden from TileTaskRunnerClient:
+ void DidFinishRunningTileTasks(TaskSet task_set) override;
TaskSetCollection TasksThatShouldBeForcedToComplete() const override;
typedef std::vector<Tile*> TileVector;
@@ -245,7 +250,7 @@
TileManagerClient* client_;
scoped_refptr<base::SequencedTaskRunner> task_runner_;
ResourcePool* resource_pool_;
- Rasterizer* rasterizer_;
+ TileTaskRunner* tile_task_runner_;
GlobalStateThatImpactsTilePriority global_state_;
size_t scheduled_raster_task_limit_;
@@ -275,7 +280,7 @@
ResourceFormat resource_format_;
// Queue used when scheduling raster tasks.
- RasterTaskQueue raster_queue_;
+ TileTaskQueue raster_queue_;
std::vector<scoped_refptr<RasterTask>> orphan_raster_tasks_;
diff --git a/cc/resources/tile_manager_perftest.cc b/cc/resources/tile_manager_perftest.cc
index 2204ab8..fe3338a 100644
--- a/cc/resources/tile_manager_perftest.cc
+++ b/cc/resources/tile_manager_perftest.cc
@@ -34,16 +34,14 @@
static const int kWarmupRuns = 5;
static const int kTimeCheckInterval = 10;
-class FakeRasterizerImpl : public Rasterizer, public RasterizerTaskClient {
+class FakeTileTaskRunnerImpl : public TileTaskRunner, public TileTaskClient {
public:
- // Overridden from Rasterizer:
- void SetClient(RasterizerClient* client) override {}
+ // Overridden from TileTaskRunner:
+ void SetClient(TileTaskRunnerClient* client) override {}
void Shutdown() override {}
- void ScheduleTasks(RasterTaskQueue* queue) override {
- for (RasterTaskQueue::Item::Vector::const_iterator it =
- queue->items.begin();
- it != queue->items.end();
- ++it) {
+ void ScheduleTasks(TileTaskQueue* queue) override {
+ for (TileTaskQueue::Item::Vector::const_iterator it = queue->items.begin();
+ it != queue->items.end(); ++it) {
RasterTask* task = it->task;
task->WillSchedule();
@@ -68,7 +66,7 @@
completed_tasks_.clear();
}
- // Overridden from RasterizerTaskClient:
+ // Overridden from TileTaskClient:
scoped_ptr<RasterBuffer> AcquireBufferForRaster(
const Resource* resource) override {
return nullptr;
@@ -78,7 +76,7 @@
private:
RasterTask::Vector completed_tasks_;
};
-base::LazyInstance<FakeRasterizerImpl> g_fake_rasterizer =
+base::LazyInstance<FakeTileTaskRunnerImpl> g_fake_tile_task_runner =
LAZY_INSTANCE_INITIALIZER;
class TileManagerPerfTest : public testing::Test {
@@ -118,7 +116,8 @@
virtual void InitializeRenderer() {
host_impl_.InitializeRenderer(FakeOutputSurface::Create3d().Pass());
- tile_manager()->SetRasterizerForTesting(g_fake_rasterizer.Pointer());
+ tile_manager()->SetTileTaskRunnerForTesting(
+ g_fake_tile_task_runner.Pointer());
}
void SetupDefaultTrees(const gfx::Size& layer_bounds) {
@@ -392,9 +391,9 @@
return state;
}
- void RunManageTilesTest(const std::string& test_name,
- int layer_count,
- int approximate_tile_count_per_layer) {
+ void RunPrepareTilesTest(const std::string& test_name,
+ int layer_count,
+ int approximate_tile_count_per_layer) {
std::vector<LayerImpl*> layers =
CreateLayers(layer_count, approximate_tile_count_per_layer);
timer_.Reset();
@@ -408,14 +407,14 @@
}
GlobalStateThatImpactsTilePriority global_state(GlobalStateForTest());
- tile_manager()->ManageTiles(global_state);
+ tile_manager()->PrepareTiles(global_state);
tile_manager()->UpdateVisibleTiles();
timer_.NextLap();
host_impl_.ResetCurrentBeginFrameArgsForNextFrame();
} while (!timer_.HasTimeLimitExpired());
- perf_test::PrintResult(
- "manage_tiles", "", test_name, timer_.LapsPerSecond(), "runs/s", true);
+ perf_test::PrintResult("prepare_tiles", "", test_name,
+ timer_.LapsPerSecond(), "runs/s", true);
}
TileManager* tile_manager() { return host_impl_.tile_manager(); }
@@ -439,16 +438,16 @@
const gfx::Size TileManagerPerfTest::kDefaultTileSize(100, 100);
-TEST_F(TileManagerPerfTest, ManageTiles) {
- RunManageTilesTest("2_100", 2, 100);
- RunManageTilesTest("2_500", 2, 500);
- RunManageTilesTest("2_1000", 2, 1000);
- RunManageTilesTest("10_100", 10, 100);
- RunManageTilesTest("10_500", 10, 500);
- RunManageTilesTest("10_1000", 10, 1000);
- RunManageTilesTest("50_100", 100, 100);
- RunManageTilesTest("50_500", 100, 500);
- RunManageTilesTest("50_1000", 100, 1000);
+TEST_F(TileManagerPerfTest, PrepareTiles) {
+ RunPrepareTilesTest("2_100", 2, 100);
+ RunPrepareTilesTest("2_500", 2, 500);
+ RunPrepareTilesTest("2_1000", 2, 1000);
+ RunPrepareTilesTest("10_100", 10, 100);
+ RunPrepareTilesTest("10_500", 10, 500);
+ RunPrepareTilesTest("10_1000", 10, 1000);
+ RunPrepareTilesTest("50_100", 100, 100);
+ RunPrepareTilesTest("50_500", 100, 500);
+ RunPrepareTilesTest("50_1000", 100, 1000);
}
TEST_F(TileManagerPerfTest, RasterTileQueueConstruct) {
diff --git a/cc/resources/tile_task_runner.cc b/cc/resources/tile_task_runner.cc
new file mode 100644
index 0000000..8775d32
--- /dev/null
+++ b/cc/resources/tile_task_runner.cc
@@ -0,0 +1,101 @@
+// 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.
+
+#include "cc/resources/tile_task_runner.h"
+
+#include <algorithm>
+
+namespace cc {
+
+TileTask::TileTask() : did_schedule_(false), did_complete_(false) {
+}
+
+TileTask::~TileTask() {
+ // Debugging CHECKs to help track down a use-after-free.
+ CHECK(!did_schedule_);
+ CHECK(!did_run_ || did_complete_);
+}
+
+ImageDecodeTask* TileTask::AsImageDecodeTask() {
+ return NULL;
+}
+
+RasterTask* TileTask::AsRasterTask() {
+ return NULL;
+}
+
+void TileTask::WillSchedule() {
+ DCHECK(!did_schedule_);
+}
+
+void TileTask::DidSchedule() {
+ did_schedule_ = true;
+ did_complete_ = false;
+}
+
+bool TileTask::HasBeenScheduled() const {
+ return did_schedule_;
+}
+
+void TileTask::WillComplete() {
+ DCHECK(!did_complete_);
+}
+
+void TileTask::DidComplete() {
+ DCHECK(did_schedule_);
+ DCHECK(!did_complete_);
+ did_schedule_ = false;
+ did_complete_ = true;
+}
+
+bool TileTask::HasCompleted() const {
+ return did_complete_;
+}
+
+ImageDecodeTask::ImageDecodeTask() {
+}
+
+ImageDecodeTask::~ImageDecodeTask() {
+}
+
+ImageDecodeTask* ImageDecodeTask::AsImageDecodeTask() {
+ return this;
+}
+
+RasterTask::RasterTask(const Resource* resource,
+ ImageDecodeTask::Vector* dependencies)
+ : resource_(resource) {
+ dependencies_.swap(*dependencies);
+}
+
+RasterTask::~RasterTask() {
+}
+
+RasterTask* RasterTask::AsRasterTask() {
+ return this;
+}
+
+TileTaskQueue::Item::Item(RasterTask* task, const TaskSetCollection& task_sets)
+ : task(task), task_sets(task_sets) {
+ DCHECK(task_sets.any());
+}
+
+TileTaskQueue::Item::~Item() {
+}
+
+TileTaskQueue::TileTaskQueue() {
+}
+
+TileTaskQueue::~TileTaskQueue() {
+}
+
+void TileTaskQueue::Swap(TileTaskQueue* other) {
+ items.swap(other->items);
+}
+
+void TileTaskQueue::Reset() {
+ items.clear();
+}
+
+} // namespace cc
diff --git a/cc/resources/rasterizer.h b/cc/resources/tile_task_runner.h
similarity index 70%
rename from cc/resources/rasterizer.h
rename to cc/resources/tile_task_runner.h
index db84c22..1de0f4f 100644
--- a/cc/resources/rasterizer.h
+++ b/cc/resources/tile_task_runner.h
@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef CC_RESOURCES_RASTERIZER_H_
-#define CC_RESOURCES_RASTERIZER_H_
+#ifndef CC_RESOURCES_TILE_TASK_RUNNER_H_
+#define CC_RESOURCES_TILE_TASK_RUNNER_H_
#include <bitset>
#include <vector>
@@ -18,22 +18,22 @@
class Resource;
class RasterBuffer;
-class CC_EXPORT RasterizerTaskClient {
+class CC_EXPORT TileTaskClient {
public:
virtual scoped_ptr<RasterBuffer> AcquireBufferForRaster(
const Resource* resource) = 0;
virtual void ReleaseBufferForRaster(scoped_ptr<RasterBuffer> buffer) = 0;
protected:
- virtual ~RasterizerTaskClient() {}
+ virtual ~TileTaskClient() {}
};
-class CC_EXPORT RasterizerTask : public Task {
+class CC_EXPORT TileTask : public Task {
public:
- typedef std::vector<scoped_refptr<RasterizerTask>> Vector;
+ typedef std::vector<scoped_refptr<TileTask>> Vector;
- virtual void ScheduleOnOriginThread(RasterizerTaskClient* client) = 0;
- virtual void CompleteOnOriginThread(RasterizerTaskClient* client) = 0;
+ virtual void ScheduleOnOriginThread(TileTaskClient* client) = 0;
+ virtual void CompleteOnOriginThread(TileTaskClient* client) = 0;
virtual void RunReplyOnOriginThread() = 0;
// Type-checking downcast routines.
@@ -49,18 +49,18 @@
bool HasCompleted() const;
protected:
- RasterizerTask();
- ~RasterizerTask() override;
+ TileTask();
+ ~TileTask() override;
bool did_schedule_;
bool did_complete_;
};
-class CC_EXPORT ImageDecodeTask : public RasterizerTask {
+class CC_EXPORT ImageDecodeTask : public TileTask {
public:
typedef std::vector<scoped_refptr<ImageDecodeTask>> Vector;
- // Overridden from RasterizerTask:
+ // Overridden from TileTask:
ImageDecodeTask* AsImageDecodeTask() override;
protected:
@@ -68,11 +68,11 @@
~ImageDecodeTask() override;
};
-class CC_EXPORT RasterTask : public RasterizerTask {
+class CC_EXPORT RasterTask : public TileTask {
public:
typedef std::vector<scoped_refptr<RasterTask>> Vector;
- // Overridden from RasterizerTask:
+ // Overridden from TileTask:
RasterTask* AsRasterTask() override;
const Resource* resource() const { return resource_; }
@@ -95,16 +95,16 @@
typedef size_t TaskSet;
typedef std::bitset<kNumberOfTaskSets> TaskSetCollection;
-class CC_EXPORT RasterizerClient {
+class CC_EXPORT TileTaskRunnerClient {
public:
- virtual void DidFinishRunningTasks(TaskSet task_set) = 0;
+ virtual void DidFinishRunningTileTasks(TaskSet task_set) = 0;
virtual TaskSetCollection TasksThatShouldBeForcedToComplete() const = 0;
protected:
- virtual ~RasterizerClient() {}
+ virtual ~TileTaskRunnerClient() {}
};
-struct CC_EXPORT RasterTaskQueue {
+struct CC_EXPORT TileTaskQueue {
struct CC_EXPORT Item {
class TaskComparator {
public:
@@ -125,44 +125,45 @@
TaskSetCollection task_sets;
};
- RasterTaskQueue();
- ~RasterTaskQueue();
+ TileTaskQueue();
+ ~TileTaskQueue();
- void Swap(RasterTaskQueue* other);
+ void Swap(TileTaskQueue* other);
void Reset();
Item::Vector items;
};
-// This interface can be used to schedule and run raster tasks. The client will
+// This interface can be used to schedule and run tile tasks. The client will
// be notified asynchronously when the set of tasks marked as "required for
-// activation" have finished running and when all scheduled tasks have finished
-// running. The client can call CheckForCompletedTasks() at any time to dispatch
+// activation" have finished running, when tasks marked "required for draw"
+// have finished running, and when all scheduled tasks have finished running.
+// The client can call CheckForCompletedTasks() at any time to dispatch
// pending completion callbacks for all tasks that have finished running.
-class CC_EXPORT Rasterizer {
+class CC_EXPORT TileTaskRunner {
public:
// Set the client instance to be notified when finished running tasks.
- virtual void SetClient(RasterizerClient* client) = 0;
+ virtual void SetClient(TileTaskRunnerClient* client) = 0;
// Tells the worker pool to shutdown after canceling all previously scheduled
// tasks. Reply callbacks are still guaranteed to run when
// CheckForCompletedTasks() is called.
virtual void Shutdown() = 0;
- // Schedule running of raster tasks in |queue| and all dependencies.
+ // Schedule running of tile tasks in |queue| and all dependencies.
// Previously scheduled tasks that are not in |queue| will be canceled unless
// already running. Once scheduled, reply callbacks are guaranteed to run for
// all tasks even if they later get canceled by another call to
// ScheduleTasks().
- virtual void ScheduleTasks(RasterTaskQueue* queue) = 0;
+ virtual void ScheduleTasks(TileTaskQueue* queue) = 0;
// Check for completed tasks and dispatch reply callbacks.
virtual void CheckForCompletedTasks() = 0;
protected:
- virtual ~Rasterizer() {}
+ virtual ~TileTaskRunner() {}
};
} // namespace cc
-#endif // CC_RESOURCES_RASTERIZER_H_
+#endif // CC_RESOURCES_TILE_TASK_RUNNER_H_
diff --git a/cc/resources/tile_task_worker_pool.cc b/cc/resources/tile_task_worker_pool.cc
new file mode 100644
index 0000000..1c0d6b9
--- /dev/null
+++ b/cc/resources/tile_task_worker_pool.cc
@@ -0,0 +1,263 @@
+// Copyright 2013 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 "cc/resources/tile_task_worker_pool.h"
+
+#include <algorithm>
+
+#include "base/debug/trace_event.h"
+#include "base/lazy_instance.h"
+#include "base/strings/stringprintf.h"
+#include "base/threading/simple_thread.h"
+#include "cc/base/scoped_ptr_deque.h"
+#include "cc/resources/raster_source.h"
+#include "skia/ext/refptr.h"
+#include "third_party/skia/include/core/SkCanvas.h"
+#include "third_party/skia/include/core/SkSurface.h"
+
+namespace cc {
+namespace {
+
+class TileTaskGraphRunner : public TaskGraphRunner,
+ public base::DelegateSimpleThread::Delegate {
+ public:
+ TileTaskGraphRunner() {
+ size_t num_threads = TileTaskWorkerPool::GetNumWorkerThreads();
+ while (workers_.size() < num_threads) {
+ scoped_ptr<base::DelegateSimpleThread> worker =
+ make_scoped_ptr(new base::DelegateSimpleThread(
+ this, base::StringPrintf(
+ "CompositorTileWorker%u",
+ static_cast<unsigned>(workers_.size() + 1)).c_str()));
+ worker->Start();
+#if defined(OS_ANDROID) || defined(OS_LINUX)
+ worker->SetThreadPriority(base::kThreadPriority_Background);
+#endif
+ workers_.push_back(worker.Pass());
+ }
+ }
+
+ ~TileTaskGraphRunner() override { NOTREACHED(); }
+
+ private:
+ // Overridden from base::DelegateSimpleThread::Delegate:
+ void Run() override { TaskGraphRunner::Run(); }
+
+ ScopedPtrDeque<base::DelegateSimpleThread> workers_;
+};
+
+base::LazyInstance<TileTaskGraphRunner>::Leaky g_task_graph_runner =
+ LAZY_INSTANCE_INITIALIZER;
+
+const int kDefaultNumWorkerThreads = 1;
+
+int g_num_worker_threads = 0;
+
+class TaskSetFinishedTaskImpl : public TileTask {
+ public:
+ explicit TaskSetFinishedTaskImpl(
+ base::SequencedTaskRunner* task_runner,
+ const base::Closure& on_task_set_finished_callback)
+ : task_runner_(task_runner),
+ on_task_set_finished_callback_(on_task_set_finished_callback) {}
+
+ // Overridden from Task:
+ void RunOnWorkerThread() override {
+ TRACE_EVENT0("cc", "TaskSetFinishedTaskImpl::RunOnWorkerThread");
+ TaskSetFinished();
+ }
+
+ // Overridden from TileTask:
+ void ScheduleOnOriginThread(TileTaskClient* client) override {}
+ void CompleteOnOriginThread(TileTaskClient* client) override {}
+ void RunReplyOnOriginThread() override {}
+
+ protected:
+ ~TaskSetFinishedTaskImpl() override {}
+
+ void TaskSetFinished() {
+ task_runner_->PostTask(FROM_HERE, on_task_set_finished_callback_);
+ }
+
+ private:
+ scoped_refptr<base::SequencedTaskRunner> task_runner_;
+ const base::Closure on_task_set_finished_callback_;
+
+ DISALLOW_COPY_AND_ASSIGN(TaskSetFinishedTaskImpl);
+};
+
+} // namespace
+
+// This allows a micro benchmark system to run tasks with highest priority,
+// since it should finish as quickly as possible.
+unsigned TileTaskWorkerPool::kBenchmarkTaskPriority = 0u;
+// Task priorities that make sure task set finished tasks run before any
+// other remaining tasks.
+unsigned TileTaskWorkerPool::kTaskSetFinishedTaskPriority = 1u;
+unsigned TileTaskWorkerPool::kTileTaskPriorityBase = 2u;
+
+TileTaskWorkerPool::TileTaskWorkerPool() {
+}
+
+TileTaskWorkerPool::~TileTaskWorkerPool() {
+}
+
+// static
+void TileTaskWorkerPool::SetNumWorkerThreads(int num_threads) {
+ DCHECK_LT(0, num_threads);
+ DCHECK_EQ(0, g_num_worker_threads);
+
+ g_num_worker_threads = num_threads;
+}
+
+// static
+int TileTaskWorkerPool::GetNumWorkerThreads() {
+ if (!g_num_worker_threads)
+ g_num_worker_threads = kDefaultNumWorkerThreads;
+
+ return g_num_worker_threads;
+}
+
+// static
+TaskGraphRunner* TileTaskWorkerPool::GetTaskGraphRunner() {
+ return g_task_graph_runner.Pointer();
+}
+
+// static
+scoped_refptr<TileTask> TileTaskWorkerPool::CreateTaskSetFinishedTask(
+ base::SequencedTaskRunner* task_runner,
+ const base::Closure& on_task_set_finished_callback) {
+ return make_scoped_refptr(
+ new TaskSetFinishedTaskImpl(task_runner, on_task_set_finished_callback));
+}
+
+// static
+void TileTaskWorkerPool::ScheduleTasksOnOriginThread(TileTaskClient* client,
+ TaskGraph* graph) {
+ TRACE_EVENT0("cc", "TileTaskWorkerPool::ScheduleTasksOnOriginThread");
+
+ for (TaskGraph::Node::Vector::iterator it = graph->nodes.begin();
+ it != graph->nodes.end(); ++it) {
+ TaskGraph::Node& node = *it;
+ TileTask* task = static_cast<TileTask*>(node.task);
+
+ if (!task->HasBeenScheduled()) {
+ task->WillSchedule();
+ task->ScheduleOnOriginThread(client);
+ task->DidSchedule();
+ }
+ }
+}
+
+// static
+void TileTaskWorkerPool::InsertNodeForTask(TaskGraph* graph,
+ TileTask* task,
+ unsigned priority,
+ size_t dependencies) {
+ DCHECK(std::find_if(graph->nodes.begin(), graph->nodes.end(),
+ TaskGraph::Node::TaskComparator(task)) ==
+ graph->nodes.end());
+ graph->nodes.push_back(TaskGraph::Node(task, priority, dependencies));
+}
+
+// static
+void TileTaskWorkerPool::InsertNodesForRasterTask(
+ TaskGraph* graph,
+ RasterTask* raster_task,
+ const ImageDecodeTask::Vector& decode_tasks,
+ unsigned priority) {
+ size_t dependencies = 0u;
+
+ // Insert image decode tasks.
+ for (ImageDecodeTask::Vector::const_iterator it = decode_tasks.begin();
+ it != decode_tasks.end(); ++it) {
+ ImageDecodeTask* decode_task = it->get();
+
+ // Skip if already decoded.
+ if (decode_task->HasCompleted())
+ continue;
+
+ dependencies++;
+
+ // Add decode task if it doesn't already exists in graph.
+ TaskGraph::Node::Vector::iterator decode_it =
+ std::find_if(graph->nodes.begin(), graph->nodes.end(),
+ TaskGraph::Node::TaskComparator(decode_task));
+ if (decode_it == graph->nodes.end())
+ InsertNodeForTask(graph, decode_task, priority, 0u);
+
+ graph->edges.push_back(TaskGraph::Edge(decode_task, raster_task));
+ }
+
+ InsertNodeForTask(graph, raster_task, priority, dependencies);
+}
+
+static bool IsSupportedPlaybackToMemoryFormat(ResourceFormat format) {
+ switch (format) {
+ case RGBA_4444:
+ case RGBA_8888:
+ case BGRA_8888:
+ return true;
+ case ALPHA_8:
+ case LUMINANCE_8:
+ case RGB_565:
+ case ETC1:
+ case RED_8:
+ return false;
+ }
+ NOTREACHED();
+ return false;
+}
+
+// static
+void TileTaskWorkerPool::PlaybackToMemory(void* memory,
+ ResourceFormat format,
+ const gfx::Size& size,
+ int stride,
+ const RasterSource* raster_source,
+ const gfx::Rect& rect,
+ float scale) {
+ DCHECK(IsSupportedPlaybackToMemoryFormat(format)) << format;
+
+ // Uses kPremul_SkAlphaType since the result is not known to be opaque.
+ SkImageInfo info =
+ SkImageInfo::MakeN32(size.width(), size.height(), kPremul_SkAlphaType);
+ SkColorType buffer_color_type = ResourceFormatToSkColorType(format);
+ bool needs_copy = buffer_color_type != info.colorType();
+
+ // Use unknown pixel geometry to disable LCD text.
+ SkSurfaceProps surface_props(0, kUnknown_SkPixelGeometry);
+ if (raster_source->CanUseLCDText()) {
+ // LegacyFontHost will get LCD text and skia figures out what type to use.
+ surface_props = SkSurfaceProps(SkSurfaceProps::kLegacyFontHost_InitType);
+ }
+
+ if (!stride)
+ stride = info.minRowBytes();
+
+ if (!needs_copy) {
+ skia::RefPtr<SkSurface> surface = skia::AdoptRef(
+ SkSurface::NewRasterDirect(info, memory, stride, &surface_props));
+ skia::RefPtr<SkCanvas> canvas = skia::SharePtr(surface->getCanvas());
+ raster_source->PlaybackToCanvas(canvas.get(), rect, scale);
+ return;
+ }
+
+ skia::RefPtr<SkSurface> surface =
+ skia::AdoptRef(SkSurface::NewRaster(info, &surface_props));
+ skia::RefPtr<SkCanvas> canvas = skia::SharePtr(surface->getCanvas());
+ raster_source->PlaybackToCanvas(canvas.get(), rect, scale);
+
+ SkImageInfo dst_info = info;
+ dst_info.fColorType = buffer_color_type;
+ // TODO(kaanb): The GL pipeline assumes a 4-byte alignment for the
+ // bitmap data. There will be no need to call SkAlign4 once crbug.com/293728
+ // is fixed.
+ const size_t dst_row_bytes = SkAlign4(dst_info.minRowBytes());
+ DCHECK_EQ(0u, dst_row_bytes % 4);
+ bool success = canvas->readPixels(dst_info, memory, dst_row_bytes, 0, 0);
+ DCHECK_EQ(true, success);
+}
+
+} // namespace cc
diff --git a/cc/resources/raster_worker_pool.h b/cc/resources/tile_task_worker_pool.h
similarity index 72%
rename from cc/resources/raster_worker_pool.h
rename to cc/resources/tile_task_worker_pool.h
index 5259f83..0440655 100644
--- a/cc/resources/raster_worker_pool.h
+++ b/cc/resources/tile_task_worker_pool.h
@@ -2,10 +2,10 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef CC_RESOURCES_RASTER_WORKER_POOL_H_
-#define CC_RESOURCES_RASTER_WORKER_POOL_H_
+#ifndef CC_RESOURCES_TILE_TASK_WORKER_POOL_H_
+#define CC_RESOURCES_TILE_TASK_WORKER_POOL_H_
-#include "cc/resources/rasterizer.h"
+#include "cc/resources/tile_task_runner.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/size.h"
@@ -17,42 +17,42 @@
class RasterSource;
class RenderingStatsInstrumentation;
-class CC_EXPORT RasterWorkerPool {
+class CC_EXPORT TileTaskWorkerPool {
public:
- static unsigned kBenchmarkRasterTaskPriority;
- static unsigned kRasterFinishedTaskPriority;
- static unsigned kRasterTaskPriorityBase;
+ static unsigned kBenchmarkTaskPriority;
+ static unsigned kTaskSetFinishedTaskPriority;
+ static unsigned kTileTaskPriorityBase;
- RasterWorkerPool();
- virtual ~RasterWorkerPool();
+ TileTaskWorkerPool();
+ virtual ~TileTaskWorkerPool();
// Set the number of threads to use for the global TaskGraphRunner instance.
// This can only be called once and must be called prior to
- // GetNumRasterThreads().
- static void SetNumRasterThreads(int num_threads);
+ // GetNumWorkerThreads().
+ static void SetNumWorkerThreads(int num_threads);
// Returns the number of threads used for the global TaskGraphRunner instance.
- static int GetNumRasterThreads();
+ static int GetNumWorkerThreads();
// Returns a pointer to the global TaskGraphRunner instance.
static TaskGraphRunner* GetTaskGraphRunner();
- // Utility function that can be used to create a "raster finished" task that
+ // Utility function that can be used to create a "Task set finished" task that
// posts |callback| to |task_runner| when run.
- static scoped_refptr<RasterizerTask> CreateRasterFinishedTask(
+ static scoped_refptr<TileTask> CreateTaskSetFinishedTask(
base::SequencedTaskRunner* task_runner,
const base::Closure& callback);
// Utility function that can be used to call ::ScheduleOnOriginThread() for
// each task in |graph|.
- static void ScheduleTasksOnOriginThread(RasterizerTaskClient* client,
+ static void ScheduleTasksOnOriginThread(TileTaskClient* client,
TaskGraph* graph);
// Utility function that can be used to build a task graph. Inserts a node
// that represents |task| in |graph|. See TaskGraph definition for valid
// |priority| values.
static void InsertNodeForTask(TaskGraph* graph,
- RasterizerTask* task,
+ TileTask* task,
unsigned priority,
size_t dependencies);
@@ -75,9 +75,9 @@
float scale);
// Type-checking downcast routine.
- virtual Rasterizer* AsRasterizer() = 0;
+ virtual TileTaskRunner* AsTileTaskRunner() = 0;
};
} // namespace cc
-#endif // CC_RESOURCES_RASTER_WORKER_POOL_H_
+#endif // CC_RESOURCES_TILE_TASK_WORKER_POOL_H_
diff --git a/cc/resources/tile_task_worker_pool_perftest.cc b/cc/resources/tile_task_worker_pool_perftest.cc
new file mode 100644
index 0000000..2c64029
--- /dev/null
+++ b/cc/resources/tile_task_worker_pool_perftest.cc
@@ -0,0 +1,502 @@
+// Copyright 2013 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 "cc/resources/tile_task_worker_pool.h"
+
+#include "base/test/test_simple_task_runner.h"
+#include "base/time/time.h"
+#include "cc/debug/lap_timer.h"
+#include "cc/output/context_provider.h"
+#include "cc/resources/bitmap_tile_task_worker_pool.h"
+#include "cc/resources/gpu_tile_task_worker_pool.h"
+#include "cc/resources/one_copy_tile_task_worker_pool.h"
+#include "cc/resources/pixel_buffer_tile_task_worker_pool.h"
+#include "cc/resources/raster_buffer.h"
+#include "cc/resources/resource_pool.h"
+#include "cc/resources/resource_provider.h"
+#include "cc/resources/scoped_resource.h"
+#include "cc/resources/tile_task_runner.h"
+#include "cc/resources/zero_copy_tile_task_worker_pool.h"
+#include "cc/test/fake_output_surface.h"
+#include "cc/test/fake_output_surface_client.h"
+#include "cc/test/test_context_support.h"
+#include "cc/test/test_gpu_memory_buffer_manager.h"
+#include "cc/test/test_shared_bitmap_manager.h"
+#include "cc/test/test_web_graphics_context_3d.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "testing/perf/perf_test.h"
+#include "third_party/khronos/GLES2/gl2.h"
+
+namespace cc {
+namespace {
+
+class PerfGLES2Interface : public gpu::gles2::GLES2InterfaceStub {
+ // Overridden from gpu::gles2::GLES2Interface:
+ GLuint CreateImageCHROMIUM(ClientBuffer buffer,
+ GLsizei width,
+ GLsizei height,
+ GLenum internalformat) override {
+ return 1u;
+ }
+ void GenBuffers(GLsizei n, GLuint* buffers) override {
+ for (GLsizei i = 0; i < n; ++i)
+ buffers[i] = 1u;
+ }
+ void GenTextures(GLsizei n, GLuint* textures) override {
+ for (GLsizei i = 0; i < n; ++i)
+ textures[i] = 1u;
+ }
+ void GetIntegerv(GLenum pname, GLint* params) override {
+ if (pname == GL_MAX_TEXTURE_SIZE)
+ *params = INT_MAX;
+ }
+ void GenQueriesEXT(GLsizei n, GLuint* queries) override {
+ for (GLsizei i = 0; i < n; ++i)
+ queries[i] = 1u;
+ }
+ void GetQueryObjectuivEXT(GLuint query,
+ GLenum pname,
+ GLuint* params) override {
+ if (pname == GL_QUERY_RESULT_AVAILABLE_EXT)
+ *params = 1;
+ }
+};
+
+class PerfContextProvider : public ContextProvider {
+ public:
+ PerfContextProvider() : context_gl_(new PerfGLES2Interface) {}
+
+ bool BindToCurrentThread() override { return true; }
+ Capabilities ContextCapabilities() override {
+ Capabilities capabilities;
+ capabilities.gpu.image = true;
+ capabilities.gpu.sync_query = true;
+ return capabilities;
+ }
+ gpu::gles2::GLES2Interface* ContextGL() override { return context_gl_.get(); }
+ gpu::ContextSupport* ContextSupport() override { return &support_; }
+ class GrContext* GrContext() override {
+ return NULL;
+ }
+ bool IsContextLost() override { return false; }
+ void VerifyContexts() override {}
+ void DeleteCachedResources() override {}
+ bool DestroyedOnMainThread() override { return false; }
+ void SetLostContextCallback(const LostContextCallback& cb) override {}
+ void SetMemoryPolicyChangedCallback(
+ const MemoryPolicyChangedCallback& cb) override {}
+
+ private:
+ ~PerfContextProvider() override {}
+
+ scoped_ptr<PerfGLES2Interface> context_gl_;
+ TestContextSupport support_;
+};
+
+enum TileTaskWorkerPoolType {
+ TILE_TASK_WORKER_POOL_TYPE_PIXEL_BUFFER,
+ TILE_TASK_WORKER_POOL_TYPE_ZERO_COPY,
+ TILE_TASK_WORKER_POOL_TYPE_ONE_COPY,
+ TILE_TASK_WORKER_POOL_TYPE_GPU,
+ TILE_TASK_WORKER_POOL_TYPE_BITMAP
+};
+
+static const int kTimeLimitMillis = 2000;
+static const int kWarmupRuns = 5;
+static const int kTimeCheckInterval = 10;
+
+class PerfImageDecodeTaskImpl : public ImageDecodeTask {
+ public:
+ PerfImageDecodeTaskImpl() {}
+
+ // Overridden from Task:
+ void RunOnWorkerThread() override {}
+
+ // Overridden from TileTask:
+ void ScheduleOnOriginThread(TileTaskClient* client) override {}
+ void CompleteOnOriginThread(TileTaskClient* client) override {}
+ void RunReplyOnOriginThread() override { Reset(); }
+
+ void Reset() {
+ did_run_ = false;
+ did_complete_ = false;
+ }
+
+ protected:
+ ~PerfImageDecodeTaskImpl() override {}
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(PerfImageDecodeTaskImpl);
+};
+
+class PerfRasterTaskImpl : public RasterTask {
+ public:
+ PerfRasterTaskImpl(scoped_ptr<ScopedResource> resource,
+ ImageDecodeTask::Vector* dependencies)
+ : RasterTask(resource.get(), dependencies), resource_(resource.Pass()) {}
+
+ // Overridden from Task:
+ void RunOnWorkerThread() override {}
+
+ // Overridden from TileTask:
+ void ScheduleOnOriginThread(TileTaskClient* client) override {
+ raster_buffer_ = client->AcquireBufferForRaster(resource());
+ }
+ void CompleteOnOriginThread(TileTaskClient* client) override {
+ client->ReleaseBufferForRaster(raster_buffer_.Pass());
+ }
+ void RunReplyOnOriginThread() override { Reset(); }
+
+ void Reset() {
+ did_run_ = false;
+ did_complete_ = false;
+ }
+
+ protected:
+ ~PerfRasterTaskImpl() override {}
+
+ private:
+ scoped_ptr<ScopedResource> resource_;
+ scoped_ptr<RasterBuffer> raster_buffer_;
+
+ DISALLOW_COPY_AND_ASSIGN(PerfRasterTaskImpl);
+};
+
+class TileTaskWorkerPoolPerfTestBase {
+ public:
+ typedef std::vector<scoped_refptr<RasterTask>> RasterTaskVector;
+
+ enum NamedTaskSet { ALL, REQUIRED_FOR_ACTIVATION, REQUIRED_FOR_DRAW };
+
+ TileTaskWorkerPoolPerfTestBase()
+ : context_provider_(make_scoped_refptr(new PerfContextProvider)),
+ task_runner_(new base::TestSimpleTaskRunner),
+ task_graph_runner_(new TaskGraphRunner),
+ timer_(kWarmupRuns,
+ base::TimeDelta::FromMilliseconds(kTimeLimitMillis),
+ kTimeCheckInterval) {}
+
+ void CreateImageDecodeTasks(unsigned num_image_decode_tasks,
+ ImageDecodeTask::Vector* image_decode_tasks) {
+ for (unsigned i = 0; i < num_image_decode_tasks; ++i)
+ image_decode_tasks->push_back(new PerfImageDecodeTaskImpl);
+ }
+
+ void CreateRasterTasks(unsigned num_raster_tasks,
+ const ImageDecodeTask::Vector& image_decode_tasks,
+ RasterTaskVector* raster_tasks) {
+ const gfx::Size size(1, 1);
+
+ for (unsigned i = 0; i < num_raster_tasks; ++i) {
+ scoped_ptr<ScopedResource> resource(
+ ScopedResource::Create(resource_provider_.get()));
+ resource->Allocate(size, ResourceProvider::TextureHintImmutable,
+ RGBA_8888);
+
+ ImageDecodeTask::Vector dependencies = image_decode_tasks;
+ raster_tasks->push_back(
+ new PerfRasterTaskImpl(resource.Pass(), &dependencies));
+ }
+ }
+
+ void BuildTileTaskQueue(TileTaskQueue* queue,
+ const RasterTaskVector& raster_tasks) {
+ for (size_t i = 0u; i < raster_tasks.size(); ++i) {
+ bool required_for_activation = (i % 2) == 0;
+ TaskSetCollection task_set_collection;
+ task_set_collection[ALL] = true;
+ task_set_collection[REQUIRED_FOR_ACTIVATION] = required_for_activation;
+ queue->items.push_back(
+ TileTaskQueue::Item(raster_tasks[i].get(), task_set_collection));
+ }
+ }
+
+ protected:
+ scoped_refptr<ContextProvider> context_provider_;
+ FakeOutputSurfaceClient output_surface_client_;
+ scoped_ptr<FakeOutputSurface> output_surface_;
+ scoped_ptr<ResourceProvider> resource_provider_;
+ scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
+ scoped_ptr<TaskGraphRunner> task_graph_runner_;
+ LapTimer timer_;
+};
+
+class TileTaskWorkerPoolPerfTest
+ : public TileTaskWorkerPoolPerfTestBase,
+ public testing::TestWithParam<TileTaskWorkerPoolType>,
+ public TileTaskRunnerClient {
+ public:
+ // Overridden from testing::Test:
+ void SetUp() override {
+ switch (GetParam()) {
+ case TILE_TASK_WORKER_POOL_TYPE_PIXEL_BUFFER:
+ Create3dOutputSurfaceAndResourceProvider();
+ tile_task_worker_pool_ = PixelBufferTileTaskWorkerPool::Create(
+ task_runner_.get(), task_graph_runner_.get(),
+ context_provider_.get(), resource_provider_.get(),
+ std::numeric_limits<size_t>::max());
+ break;
+ case TILE_TASK_WORKER_POOL_TYPE_ZERO_COPY:
+ Create3dOutputSurfaceAndResourceProvider();
+ tile_task_worker_pool_ = ZeroCopyTileTaskWorkerPool::Create(
+ task_runner_.get(), task_graph_runner_.get(),
+ resource_provider_.get());
+ break;
+ case TILE_TASK_WORKER_POOL_TYPE_ONE_COPY:
+ Create3dOutputSurfaceAndResourceProvider();
+ staging_resource_pool_ = ResourcePool::Create(resource_provider_.get(),
+ GL_TEXTURE_2D, RGBA_8888);
+ tile_task_worker_pool_ = OneCopyTileTaskWorkerPool::Create(
+ task_runner_.get(), task_graph_runner_.get(),
+ context_provider_.get(), resource_provider_.get(),
+ staging_resource_pool_.get());
+ break;
+ case TILE_TASK_WORKER_POOL_TYPE_GPU:
+ Create3dOutputSurfaceAndResourceProvider();
+ tile_task_worker_pool_ = GpuTileTaskWorkerPool::Create(
+ task_runner_.get(), context_provider_.get(),
+ resource_provider_.get(), false);
+ break;
+ case TILE_TASK_WORKER_POOL_TYPE_BITMAP:
+ CreateSoftwareOutputSurfaceAndResourceProvider();
+ tile_task_worker_pool_ = BitmapTileTaskWorkerPool::Create(
+ task_runner_.get(), task_graph_runner_.get(),
+ resource_provider_.get());
+ break;
+ }
+
+ DCHECK(tile_task_worker_pool_);
+ tile_task_worker_pool_->AsTileTaskRunner()->SetClient(this);
+ }
+ void TearDown() override {
+ tile_task_worker_pool_->AsTileTaskRunner()->Shutdown();
+ tile_task_worker_pool_->AsTileTaskRunner()->CheckForCompletedTasks();
+ }
+
+ // Overriden from TileTaskRunnerClient:
+ void DidFinishRunningTileTasks(TaskSet task_set) override {
+ tile_task_worker_pool_->AsTileTaskRunner()->CheckForCompletedTasks();
+ }
+ TaskSetCollection TasksThatShouldBeForcedToComplete() const override {
+ return TaskSetCollection();
+ }
+
+ void RunMessageLoopUntilAllTasksHaveCompleted() {
+ task_graph_runner_->RunUntilIdle();
+ task_runner_->RunUntilIdle();
+ }
+
+ void RunScheduleTasksTest(const std::string& test_name,
+ unsigned num_raster_tasks,
+ unsigned num_image_decode_tasks) {
+ ImageDecodeTask::Vector image_decode_tasks;
+ RasterTaskVector raster_tasks;
+ CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks);
+ CreateRasterTasks(num_raster_tasks, image_decode_tasks, &raster_tasks);
+
+ // Avoid unnecessary heap allocations by reusing the same queue.
+ TileTaskQueue queue;
+
+ timer_.Reset();
+ do {
+ queue.Reset();
+ BuildTileTaskQueue(&queue, raster_tasks);
+ tile_task_worker_pool_->AsTileTaskRunner()->ScheduleTasks(&queue);
+ tile_task_worker_pool_->AsTileTaskRunner()->CheckForCompletedTasks();
+ timer_.NextLap();
+ } while (!timer_.HasTimeLimitExpired());
+
+ TileTaskQueue empty;
+ tile_task_worker_pool_->AsTileTaskRunner()->ScheduleTasks(&empty);
+ RunMessageLoopUntilAllTasksHaveCompleted();
+
+ perf_test::PrintResult("schedule_tasks", TestModifierString(), test_name,
+ timer_.LapsPerSecond(), "runs/s", true);
+ }
+
+ void RunScheduleAlternateTasksTest(const std::string& test_name,
+ unsigned num_raster_tasks,
+ unsigned num_image_decode_tasks) {
+ const size_t kNumVersions = 2;
+ ImageDecodeTask::Vector image_decode_tasks[kNumVersions];
+ RasterTaskVector raster_tasks[kNumVersions];
+ for (size_t i = 0; i < kNumVersions; ++i) {
+ CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks[i]);
+ CreateRasterTasks(num_raster_tasks, image_decode_tasks[i],
+ &raster_tasks[i]);
+ }
+
+ // Avoid unnecessary heap allocations by reusing the same queue.
+ TileTaskQueue queue;
+
+ size_t count = 0;
+ timer_.Reset();
+ do {
+ queue.Reset();
+ BuildTileTaskQueue(&queue, raster_tasks[count % kNumVersions]);
+ tile_task_worker_pool_->AsTileTaskRunner()->ScheduleTasks(&queue);
+ tile_task_worker_pool_->AsTileTaskRunner()->CheckForCompletedTasks();
+ ++count;
+ timer_.NextLap();
+ } while (!timer_.HasTimeLimitExpired());
+
+ TileTaskQueue empty;
+ tile_task_worker_pool_->AsTileTaskRunner()->ScheduleTasks(&empty);
+ RunMessageLoopUntilAllTasksHaveCompleted();
+
+ perf_test::PrintResult("schedule_alternate_tasks", TestModifierString(),
+ test_name, timer_.LapsPerSecond(), "runs/s", true);
+ }
+
+ void RunScheduleAndExecuteTasksTest(const std::string& test_name,
+ unsigned num_raster_tasks,
+ unsigned num_image_decode_tasks) {
+ ImageDecodeTask::Vector image_decode_tasks;
+ RasterTaskVector raster_tasks;
+ CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks);
+ CreateRasterTasks(num_raster_tasks, image_decode_tasks, &raster_tasks);
+
+ // Avoid unnecessary heap allocations by reusing the same queue.
+ TileTaskQueue queue;
+
+ timer_.Reset();
+ do {
+ queue.Reset();
+ BuildTileTaskQueue(&queue, raster_tasks);
+ tile_task_worker_pool_->AsTileTaskRunner()->ScheduleTasks(&queue);
+ RunMessageLoopUntilAllTasksHaveCompleted();
+ timer_.NextLap();
+ } while (!timer_.HasTimeLimitExpired());
+
+ TileTaskQueue empty;
+ tile_task_worker_pool_->AsTileTaskRunner()->ScheduleTasks(&empty);
+ RunMessageLoopUntilAllTasksHaveCompleted();
+
+ perf_test::PrintResult("schedule_and_execute_tasks", TestModifierString(),
+ test_name, timer_.LapsPerSecond(), "runs/s", true);
+ }
+
+ private:
+ void Create3dOutputSurfaceAndResourceProvider() {
+ output_surface_ = FakeOutputSurface::Create3d(context_provider_).Pass();
+ CHECK(output_surface_->BindToClient(&output_surface_client_));
+ resource_provider_ = ResourceProvider::Create(output_surface_.get(), NULL,
+ &gpu_memory_buffer_manager_,
+ NULL, 0, false, 1).Pass();
+ }
+
+ void CreateSoftwareOutputSurfaceAndResourceProvider() {
+ output_surface_ = FakeOutputSurface::CreateSoftware(
+ make_scoped_ptr(new SoftwareOutputDevice));
+ CHECK(output_surface_->BindToClient(&output_surface_client_));
+ resource_provider_ =
+ ResourceProvider::Create(output_surface_.get(), &shared_bitmap_manager_,
+ NULL, NULL, 0, false, 1).Pass();
+ }
+
+ std::string TestModifierString() const {
+ switch (GetParam()) {
+ case TILE_TASK_WORKER_POOL_TYPE_PIXEL_BUFFER:
+ return std::string("_pixel_tile_task_worker_pool");
+ case TILE_TASK_WORKER_POOL_TYPE_ZERO_COPY:
+ return std::string("_zero_copy_tile_task_worker_pool");
+ case TILE_TASK_WORKER_POOL_TYPE_ONE_COPY:
+ return std::string("_one_copy_tile_task_worker_pool");
+ case TILE_TASK_WORKER_POOL_TYPE_GPU:
+ return std::string("_gpu_tile_task_worker_pool");
+ case TILE_TASK_WORKER_POOL_TYPE_BITMAP:
+ return std::string("_bitmap_tile_task_worker_pool");
+ }
+ NOTREACHED();
+ return std::string();
+ }
+
+ scoped_ptr<ResourcePool> staging_resource_pool_;
+ scoped_ptr<TileTaskWorkerPool> tile_task_worker_pool_;
+ TestGpuMemoryBufferManager gpu_memory_buffer_manager_;
+ TestSharedBitmapManager shared_bitmap_manager_;
+};
+
+TEST_P(TileTaskWorkerPoolPerfTest, ScheduleTasks) {
+ RunScheduleTasksTest("1_0", 1, 0);
+ RunScheduleTasksTest("32_0", 32, 0);
+ RunScheduleTasksTest("1_1", 1, 1);
+ RunScheduleTasksTest("32_1", 32, 1);
+ RunScheduleTasksTest("1_4", 1, 4);
+ RunScheduleTasksTest("32_4", 32, 4);
+}
+
+TEST_P(TileTaskWorkerPoolPerfTest, ScheduleAlternateTasks) {
+ RunScheduleAlternateTasksTest("1_0", 1, 0);
+ RunScheduleAlternateTasksTest("32_0", 32, 0);
+ RunScheduleAlternateTasksTest("1_1", 1, 1);
+ RunScheduleAlternateTasksTest("32_1", 32, 1);
+ RunScheduleAlternateTasksTest("1_4", 1, 4);
+ RunScheduleAlternateTasksTest("32_4", 32, 4);
+}
+
+TEST_P(TileTaskWorkerPoolPerfTest, ScheduleAndExecuteTasks) {
+ RunScheduleAndExecuteTasksTest("1_0", 1, 0);
+ RunScheduleAndExecuteTasksTest("32_0", 32, 0);
+ RunScheduleAndExecuteTasksTest("1_1", 1, 1);
+ RunScheduleAndExecuteTasksTest("32_1", 32, 1);
+ RunScheduleAndExecuteTasksTest("1_4", 1, 4);
+ RunScheduleAndExecuteTasksTest("32_4", 32, 4);
+}
+
+INSTANTIATE_TEST_CASE_P(
+ TileTaskWorkerPoolPerfTests,
+ TileTaskWorkerPoolPerfTest,
+ ::testing::Values(TILE_TASK_WORKER_POOL_TYPE_PIXEL_BUFFER,
+ TILE_TASK_WORKER_POOL_TYPE_ZERO_COPY,
+ TILE_TASK_WORKER_POOL_TYPE_ONE_COPY,
+ TILE_TASK_WORKER_POOL_TYPE_GPU,
+ TILE_TASK_WORKER_POOL_TYPE_BITMAP));
+
+class TileTaskWorkerPoolCommonPerfTest : public TileTaskWorkerPoolPerfTestBase,
+ public testing::Test {
+ public:
+ // Overridden from testing::Test:
+ void SetUp() override {
+ output_surface_ = FakeOutputSurface::Create3d(context_provider_).Pass();
+ CHECK(output_surface_->BindToClient(&output_surface_client_));
+ resource_provider_ =
+ ResourceProvider::Create(output_surface_.get(), NULL, NULL, NULL, 0,
+ false, 1).Pass();
+ }
+
+ void RunBuildTileTaskQueueTest(const std::string& test_name,
+ unsigned num_raster_tasks,
+ unsigned num_image_decode_tasks) {
+ ImageDecodeTask::Vector image_decode_tasks;
+ RasterTaskVector raster_tasks;
+ CreateImageDecodeTasks(num_image_decode_tasks, &image_decode_tasks);
+ CreateRasterTasks(num_raster_tasks, image_decode_tasks, &raster_tasks);
+
+ // Avoid unnecessary heap allocations by reusing the same queue.
+ TileTaskQueue queue;
+
+ timer_.Reset();
+ do {
+ queue.Reset();
+ BuildTileTaskQueue(&queue, raster_tasks);
+ timer_.NextLap();
+ } while (!timer_.HasTimeLimitExpired());
+
+ perf_test::PrintResult("build_raster_task_queue", "", test_name,
+ timer_.LapsPerSecond(), "runs/s", true);
+ }
+};
+
+TEST_F(TileTaskWorkerPoolCommonPerfTest, BuildTileTaskQueue) {
+ RunBuildTileTaskQueueTest("1_0", 1, 0);
+ RunBuildTileTaskQueueTest("32_0", 32, 0);
+ RunBuildTileTaskQueueTest("1_1", 1, 1);
+ RunBuildTileTaskQueueTest("32_1", 32, 1);
+ RunBuildTileTaskQueueTest("1_4", 1, 4);
+ RunBuildTileTaskQueueTest("32_4", 32, 4);
+}
+
+} // namespace
+} // namespace cc
diff --git a/cc/resources/raster_worker_pool_unittest.cc b/cc/resources/tile_task_worker_pool_unittest.cc
similarity index 64%
rename from cc/resources/raster_worker_pool_unittest.cc
rename to cc/resources/tile_task_worker_pool_unittest.cc
index 0518f64..02ca225 100644
--- a/cc/resources/raster_worker_pool_unittest.cc
+++ b/cc/resources/tile_task_worker_pool_unittest.cc
@@ -2,24 +2,24 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "cc/resources/raster_worker_pool.h"
+#include "cc/resources/tile_task_worker_pool.h"
#include <limits>
#include <vector>
#include "base/cancelable_callback.h"
-#include "cc/resources/bitmap_raster_worker_pool.h"
-#include "cc/resources/gpu_raster_worker_pool.h"
-#include "cc/resources/one_copy_raster_worker_pool.h"
+#include "cc/resources/bitmap_tile_task_worker_pool.h"
+#include "cc/resources/gpu_tile_task_worker_pool.h"
+#include "cc/resources/one_copy_tile_task_worker_pool.h"
#include "cc/resources/picture_pile.h"
#include "cc/resources/picture_pile_impl.h"
-#include "cc/resources/pixel_buffer_raster_worker_pool.h"
+#include "cc/resources/pixel_buffer_tile_task_worker_pool.h"
#include "cc/resources/raster_buffer.h"
-#include "cc/resources/rasterizer.h"
#include "cc/resources/resource_pool.h"
#include "cc/resources/resource_provider.h"
#include "cc/resources/scoped_resource.h"
-#include "cc/resources/zero_copy_raster_worker_pool.h"
+#include "cc/resources/tile_task_runner.h"
+#include "cc/resources/zero_copy_tile_task_worker_pool.h"
#include "cc/test/fake_output_surface.h"
#include "cc/test/fake_output_surface_client.h"
#include "cc/test/fake_picture_pile_impl.h"
@@ -36,12 +36,12 @@
// buffer constant.
const size_t kLargeResourceDimension = 1000U;
-enum RasterWorkerPoolType {
- RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER,
- RASTER_WORKER_POOL_TYPE_ZERO_COPY,
- RASTER_WORKER_POOL_TYPE_ONE_COPY,
- RASTER_WORKER_POOL_TYPE_GPU,
- RASTER_WORKER_POOL_TYPE_BITMAP
+enum TileTaskWorkerPoolType {
+ TILE_TASK_WORKER_POOL_TYPE_PIXEL_BUFFER,
+ TILE_TASK_WORKER_POOL_TYPE_ZERO_COPY,
+ TILE_TASK_WORKER_POOL_TYPE_ONE_COPY,
+ TILE_TASK_WORKER_POOL_TYPE_GPU,
+ TILE_TASK_WORKER_POOL_TYPE_BITMAP
};
class TestRasterTaskImpl : public RasterTask {
@@ -62,11 +62,11 @@
raster_buffer_->Playback(picture_pile_.get(), gfx::Rect(0, 0, 1, 1), 1.0);
}
- // Overridden from RasterizerTask:
- void ScheduleOnOriginThread(RasterizerTaskClient* client) override {
+ // Overridden from TileTask:
+ void ScheduleOnOriginThread(TileTaskClient* client) override {
raster_buffer_ = client->AcquireBufferForRaster(resource());
}
- void CompleteOnOriginThread(RasterizerTaskClient* client) override {
+ void CompleteOnOriginThread(TileTaskClient* client) override {
client->ReleaseBufferForRaster(raster_buffer_.Pass());
}
void RunReplyOnOriginThread() override {
@@ -98,7 +98,7 @@
TestRasterTaskImpl::RunOnWorkerThread();
}
- // Overridden from RasterizerTask:
+ // Overridden from TileTask:
void RunReplyOnOriginThread() override {}
protected:
@@ -110,9 +110,9 @@
DISALLOW_COPY_AND_ASSIGN(BlockingTestRasterTaskImpl);
};
-class RasterWorkerPoolTest
- : public testing::TestWithParam<RasterWorkerPoolType>,
- public RasterizerClient {
+class TileTaskWorkerPoolTest
+ : public testing::TestWithParam<TileTaskWorkerPoolType>,
+ public TileTaskRunnerClient {
public:
struct RasterTaskResult {
unsigned id;
@@ -123,7 +123,7 @@
enum NamedTaskSet { ALL, REQUIRED_FOR_ACTIVATION, REQUIRED_FOR_DRAW };
- RasterWorkerPoolTest()
+ TileTaskWorkerPoolTest()
: context_provider_(TestContextProvider::Create()),
timeout_seconds_(5),
timed_out_(false) {}
@@ -131,63 +131,55 @@
// Overridden from testing::Test:
void SetUp() override {
switch (GetParam()) {
- case RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER:
+ case TILE_TASK_WORKER_POOL_TYPE_PIXEL_BUFFER:
Create3dOutputSurfaceAndResourceProvider();
- raster_worker_pool_ = PixelBufferRasterWorkerPool::Create(
+ tile_task_worker_pool_ = PixelBufferTileTaskWorkerPool::Create(
base::MessageLoopProxy::current().get(),
- RasterWorkerPool::GetTaskGraphRunner(),
- context_provider_.get(),
- resource_provider_.get(),
- kMaxTransferBufferUsageBytes);
+ TileTaskWorkerPool::GetTaskGraphRunner(), context_provider_.get(),
+ resource_provider_.get(), kMaxTransferBufferUsageBytes);
break;
- case RASTER_WORKER_POOL_TYPE_ZERO_COPY:
+ case TILE_TASK_WORKER_POOL_TYPE_ZERO_COPY:
Create3dOutputSurfaceAndResourceProvider();
- raster_worker_pool_ = ZeroCopyRasterWorkerPool::Create(
+ tile_task_worker_pool_ = ZeroCopyTileTaskWorkerPool::Create(
base::MessageLoopProxy::current().get(),
- RasterWorkerPool::GetTaskGraphRunner(),
- resource_provider_.get());
+ TileTaskWorkerPool::GetTaskGraphRunner(), resource_provider_.get());
break;
- case RASTER_WORKER_POOL_TYPE_ONE_COPY:
+ case TILE_TASK_WORKER_POOL_TYPE_ONE_COPY:
Create3dOutputSurfaceAndResourceProvider();
- staging_resource_pool_ = ResourcePool::Create(
- resource_provider_.get(), GL_TEXTURE_2D, RGBA_8888);
- raster_worker_pool_ = OneCopyRasterWorkerPool::Create(
+ staging_resource_pool_ = ResourcePool::Create(resource_provider_.get(),
+ GL_TEXTURE_2D, RGBA_8888);
+ tile_task_worker_pool_ = OneCopyTileTaskWorkerPool::Create(
base::MessageLoopProxy::current().get(),
- RasterWorkerPool::GetTaskGraphRunner(),
- context_provider_.get(),
- resource_provider_.get(),
- staging_resource_pool_.get());
+ TileTaskWorkerPool::GetTaskGraphRunner(), context_provider_.get(),
+ resource_provider_.get(), staging_resource_pool_.get());
break;
- case RASTER_WORKER_POOL_TYPE_GPU:
+ case TILE_TASK_WORKER_POOL_TYPE_GPU:
Create3dOutputSurfaceAndResourceProvider();
- raster_worker_pool_ =
- GpuRasterWorkerPool::Create(base::MessageLoopProxy::current().get(),
- context_provider_.get(),
- resource_provider_.get(),
- false);
+ tile_task_worker_pool_ = GpuTileTaskWorkerPool::Create(
+ base::MessageLoopProxy::current().get(), context_provider_.get(),
+ resource_provider_.get(), false);
break;
- case RASTER_WORKER_POOL_TYPE_BITMAP:
+ case TILE_TASK_WORKER_POOL_TYPE_BITMAP:
CreateSoftwareOutputSurfaceAndResourceProvider();
- raster_worker_pool_ = BitmapRasterWorkerPool::Create(
+ tile_task_worker_pool_ = BitmapTileTaskWorkerPool::Create(
base::MessageLoopProxy::current().get(),
- RasterWorkerPool::GetTaskGraphRunner(),
- resource_provider_.get());
+ TileTaskWorkerPool::GetTaskGraphRunner(), resource_provider_.get());
break;
}
- DCHECK(raster_worker_pool_);
- raster_worker_pool_->AsRasterizer()->SetClient(this);
+ DCHECK(tile_task_worker_pool_);
+ tile_task_worker_pool_->AsTileTaskRunner()->SetClient(this);
}
void TearDown() override {
- raster_worker_pool_->AsRasterizer()->Shutdown();
- raster_worker_pool_->AsRasterizer()->CheckForCompletedTasks();
+ tile_task_worker_pool_->AsTileTaskRunner()->Shutdown();
+ tile_task_worker_pool_->AsTileTaskRunner()->CheckForCompletedTasks();
}
- // Overriden from RasterWorkerPoolClient:
- void DidFinishRunningTasks(TaskSet task_set) override {
+ // Overriden from TileTaskWorkerPoolClient:
+ void DidFinishRunningTileTasks(TaskSet task_set) override {
if (task_set == ALL) {
- raster_worker_pool_->AsRasterizer()->CheckForCompletedTasks();
+ tile_task_worker_pool_->AsTileTaskRunner()->CheckForCompletedTasks();
base::MessageLoop::current()->Quit();
}
}
@@ -197,11 +189,10 @@
void RunMessageLoopUntilAllTasksHaveCompleted() {
if (timeout_seconds_) {
- timeout_.Reset(
- base::Bind(&RasterWorkerPoolTest::OnTimeout, base::Unretained(this)));
+ timeout_.Reset(base::Bind(&TileTaskWorkerPoolTest::OnTimeout,
+ base::Unretained(this)));
base::MessageLoopProxy::current()->PostDelayedTask(
- FROM_HERE,
- timeout_.callback(),
+ FROM_HERE, timeout_.callback(),
base::TimeDelta::FromSeconds(timeout_seconds_));
}
@@ -213,17 +204,16 @@
}
void ScheduleTasks() {
- RasterTaskQueue queue;
+ TileTaskQueue queue;
for (RasterTaskVector::const_iterator it = tasks_.begin();
- it != tasks_.end();
- ++it) {
+ it != tasks_.end(); ++it) {
TaskSetCollection task_sets;
task_sets[ALL] = true;
- queue.items.push_back(RasterTaskQueue::Item(it->get(), task_sets));
+ queue.items.push_back(TileTaskQueue::Item(it->get(), task_sets));
}
- raster_worker_pool_->AsRasterizer()->ScheduleTasks(&queue);
+ tile_task_worker_pool_->AsTileTaskRunner()->ScheduleTasks(&queue);
}
void AppendTask(unsigned id, const gfx::Size& size) {
@@ -235,10 +225,8 @@
ImageDecodeTask::Vector empty;
tasks_.push_back(new TestRasterTaskImpl(
const_resource,
- base::Bind(&RasterWorkerPoolTest::OnTaskCompleted,
- base::Unretained(this),
- base::Passed(&resource),
- id),
+ base::Bind(&TileTaskWorkerPoolTest::OnTaskCompleted,
+ base::Unretained(this), base::Passed(&resource), id),
&empty));
}
@@ -255,12 +243,9 @@
ImageDecodeTask::Vector empty;
tasks_.push_back(new BlockingTestRasterTaskImpl(
const_resource,
- base::Bind(&RasterWorkerPoolTest::OnTaskCompleted,
- base::Unretained(this),
- base::Passed(&resource),
- id),
- lock,
- &empty));
+ base::Bind(&TileTaskWorkerPoolTest::OnTaskCompleted,
+ base::Unretained(this), base::Passed(&resource), id),
+ lock, &empty));
}
const std::vector<RasterTaskResult>& completed_tasks() const {
@@ -273,26 +258,18 @@
CHECK(output_surface_->BindToClient(&output_surface_client_));
TestWebGraphicsContext3D* context3d = context_provider_->TestContext3d();
context3d->set_support_sync_query(true);
- resource_provider_ = ResourceProvider::Create(output_surface_.get(),
- NULL,
+ resource_provider_ = ResourceProvider::Create(output_surface_.get(), NULL,
&gpu_memory_buffer_manager_,
- NULL,
- 0,
- false,
- 1).Pass();
+ NULL, 0, false, 1).Pass();
}
void CreateSoftwareOutputSurfaceAndResourceProvider() {
output_surface_ = FakeOutputSurface::CreateSoftware(
make_scoped_ptr(new SoftwareOutputDevice));
CHECK(output_surface_->BindToClient(&output_surface_client_));
- resource_provider_ = ResourceProvider::Create(output_surface_.get(),
- &shared_bitmap_manager_,
- NULL,
- NULL,
- 0,
- false,
- 1).Pass();
+ resource_provider_ =
+ ResourceProvider::Create(output_surface_.get(), &shared_bitmap_manager_,
+ NULL, NULL, 0, false, 1).Pass();
}
void OnTaskCompleted(scoped_ptr<ScopedResource> resource,
@@ -316,7 +293,7 @@
scoped_ptr<FakeOutputSurface> output_surface_;
scoped_ptr<ResourceProvider> resource_provider_;
scoped_ptr<ResourcePool> staging_resource_pool_;
- scoped_ptr<RasterWorkerPool> raster_worker_pool_;
+ scoped_ptr<TileTaskWorkerPool> tile_task_worker_pool_;
TestGpuMemoryBufferManager gpu_memory_buffer_manager_;
TestSharedBitmapManager shared_bitmap_manager_;
base::CancelableClosure timeout_;
@@ -326,7 +303,7 @@
std::vector<RasterTaskResult> completed_tasks_;
};
-TEST_P(RasterWorkerPoolTest, Basic) {
+TEST_P(TileTaskWorkerPoolTest, Basic) {
AppendTask(0u);
AppendTask(1u);
ScheduleTasks();
@@ -338,8 +315,8 @@
EXPECT_FALSE(completed_tasks()[1].canceled);
}
-TEST_P(RasterWorkerPoolTest, FailedMapResource) {
- if (GetParam() == RASTER_WORKER_POOL_TYPE_BITMAP)
+TEST_P(TileTaskWorkerPoolTest, FailedMapResource) {
+ if (GetParam() == TILE_TASK_WORKER_POOL_TYPE_BITMAP)
return;
TestWebGraphicsContext3D* context3d = context_provider_->TestContext3d();
@@ -354,8 +331,8 @@
}
// This test checks that replacing a pending raster task with another does
-// not prevent the DidFinishRunningTasks notification from being sent.
-TEST_P(RasterWorkerPoolTest, FalseThrottling) {
+// not prevent the DidFinishRunningTileTasks notification from being sent.
+TEST_P(TileTaskWorkerPoolTest, FalseThrottling) {
base::Lock lock;
// Schedule a task that is prevented from completing with a lock.
@@ -365,7 +342,7 @@
// Schedule another task to replace the still-pending task. Because the old
// task is not a throttled task in the new task set, it should not prevent
- // DidFinishRunningTasks from getting signaled.
+ // DidFinishRunningTileTasks from getting signaled.
RasterTaskVector tasks;
tasks.swap(tasks_);
AppendTask(1u);
@@ -377,7 +354,7 @@
RunMessageLoopUntilAllTasksHaveCompleted();
}
-TEST_P(RasterWorkerPoolTest, LargeResources) {
+TEST_P(TileTaskWorkerPoolTest, LargeResources) {
gfx::Size size(kLargeResourceDimension, kLargeResourceDimension);
{
@@ -398,13 +375,14 @@
RunMessageLoopUntilAllTasksHaveCompleted();
}
-INSTANTIATE_TEST_CASE_P(RasterWorkerPoolTests,
- RasterWorkerPoolTest,
- ::testing::Values(RASTER_WORKER_POOL_TYPE_PIXEL_BUFFER,
- RASTER_WORKER_POOL_TYPE_ZERO_COPY,
- RASTER_WORKER_POOL_TYPE_ONE_COPY,
- RASTER_WORKER_POOL_TYPE_GPU,
- RASTER_WORKER_POOL_TYPE_BITMAP));
+INSTANTIATE_TEST_CASE_P(
+ TileTaskWorkerPoolTests,
+ TileTaskWorkerPoolTest,
+ ::testing::Values(TILE_TASK_WORKER_POOL_TYPE_PIXEL_BUFFER,
+ TILE_TASK_WORKER_POOL_TYPE_ZERO_COPY,
+ TILE_TASK_WORKER_POOL_TYPE_ONE_COPY,
+ TILE_TASK_WORKER_POOL_TYPE_GPU,
+ TILE_TASK_WORKER_POOL_TYPE_BITMAP));
} // namespace
} // namespace cc
diff --git a/cc/resources/zero_copy_raster_worker_pool.cc b/cc/resources/zero_copy_raster_worker_pool.cc
deleted file mode 100644
index ca2bc9b..0000000
--- a/cc/resources/zero_copy_raster_worker_pool.cc
+++ /dev/null
@@ -1,211 +0,0 @@
-// Copyright 2013 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 "cc/resources/zero_copy_raster_worker_pool.h"
-
-#include <algorithm>
-
-#include "base/debug/trace_event.h"
-#include "base/debug/trace_event_argument.h"
-#include "base/strings/stringprintf.h"
-#include "cc/debug/traced_value.h"
-#include "cc/resources/raster_buffer.h"
-#include "cc/resources/resource.h"
-#include "ui/gfx/gpu_memory_buffer.h"
-
-namespace cc {
-namespace {
-
-class RasterBufferImpl : public RasterBuffer {
- public:
- RasterBufferImpl(ResourceProvider* resource_provider,
- const Resource* resource)
- : lock_(resource_provider, resource->id()), resource_(resource) {}
-
- // Overridden from RasterBuffer:
- void Playback(const RasterSource* raster_source,
- const gfx::Rect& rect,
- float scale) override {
- gfx::GpuMemoryBuffer* gpu_memory_buffer = lock_.GetGpuMemoryBuffer();
- if (!gpu_memory_buffer)
- return;
-
- RasterWorkerPool::PlaybackToMemory(
- gpu_memory_buffer->Map(), resource_->format(), resource_->size(),
- gpu_memory_buffer->GetStride(), raster_source, rect, scale);
- gpu_memory_buffer->Unmap();
- }
-
- private:
- ResourceProvider::ScopedWriteLockGpuMemoryBuffer lock_;
- const Resource* resource_;
-
- DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl);
-};
-
-} // namespace
-
-// static
-scoped_ptr<RasterWorkerPool> ZeroCopyRasterWorkerPool::Create(
- base::SequencedTaskRunner* task_runner,
- TaskGraphRunner* task_graph_runner,
- ResourceProvider* resource_provider) {
- return make_scoped_ptr<RasterWorkerPool>(new ZeroCopyRasterWorkerPool(
- task_runner, task_graph_runner, resource_provider));
-}
-
-ZeroCopyRasterWorkerPool::ZeroCopyRasterWorkerPool(
- base::SequencedTaskRunner* task_runner,
- TaskGraphRunner* task_graph_runner,
- ResourceProvider* resource_provider)
- : task_runner_(task_runner),
- task_graph_runner_(task_graph_runner),
- namespace_token_(task_graph_runner->GetNamespaceToken()),
- resource_provider_(resource_provider),
- raster_finished_weak_ptr_factory_(this) {
-}
-
-ZeroCopyRasterWorkerPool::~ZeroCopyRasterWorkerPool() {
-}
-
-Rasterizer* ZeroCopyRasterWorkerPool::AsRasterizer() {
- return this;
-}
-
-void ZeroCopyRasterWorkerPool::SetClient(RasterizerClient* client) {
- client_ = client;
-}
-
-void ZeroCopyRasterWorkerPool::Shutdown() {
- TRACE_EVENT0("cc", "ZeroCopyRasterWorkerPool::Shutdown");
-
- TaskGraph empty;
- task_graph_runner_->ScheduleTasks(namespace_token_, &empty);
- task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_);
-}
-
-void ZeroCopyRasterWorkerPool::ScheduleTasks(RasterTaskQueue* queue) {
- TRACE_EVENT0("cc", "ZeroCopyRasterWorkerPool::ScheduleTasks");
-
- if (raster_pending_.none())
- TRACE_EVENT_ASYNC_BEGIN0("cc", "ScheduledTasks", this);
-
- // Mark all task sets as pending.
- raster_pending_.set();
-
- unsigned priority = kRasterTaskPriorityBase;
-
- graph_.Reset();
-
- // Cancel existing OnRasterFinished callbacks.
- raster_finished_weak_ptr_factory_.InvalidateWeakPtrs();
-
- scoped_refptr<RasterizerTask> new_raster_finished_tasks[kNumberOfTaskSets];
-
- size_t task_count[kNumberOfTaskSets] = {0};
-
- for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) {
- new_raster_finished_tasks[task_set] = CreateRasterFinishedTask(
- task_runner_.get(),
- base::Bind(&ZeroCopyRasterWorkerPool::OnRasterFinished,
- raster_finished_weak_ptr_factory_.GetWeakPtr(),
- task_set));
- }
-
- for (RasterTaskQueue::Item::Vector::const_iterator it = queue->items.begin();
- it != queue->items.end();
- ++it) {
- const RasterTaskQueue::Item& item = *it;
- RasterTask* task = item.task;
- DCHECK(!task->HasCompleted());
-
- for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) {
- if (!item.task_sets[task_set])
- continue;
-
- ++task_count[task_set];
-
- graph_.edges.push_back(
- TaskGraph::Edge(task, new_raster_finished_tasks[task_set].get()));
- }
-
- InsertNodesForRasterTask(&graph_, task, task->dependencies(), priority++);
- }
-
- for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) {
- InsertNodeForTask(&graph_,
- new_raster_finished_tasks[task_set].get(),
- kRasterFinishedTaskPriority,
- task_count[task_set]);
- }
-
- ScheduleTasksOnOriginThread(this, &graph_);
- task_graph_runner_->ScheduleTasks(namespace_token_, &graph_);
-
- std::copy(new_raster_finished_tasks,
- new_raster_finished_tasks + kNumberOfTaskSets,
- raster_finished_tasks_);
-
- TRACE_EVENT_ASYNC_STEP_INTO1(
- "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue());
-}
-
-void ZeroCopyRasterWorkerPool::CheckForCompletedTasks() {
- TRACE_EVENT0("cc", "ZeroCopyRasterWorkerPool::CheckForCompletedTasks");
-
- task_graph_runner_->CollectCompletedTasks(namespace_token_,
- &completed_tasks_);
- for (Task::Vector::const_iterator it = completed_tasks_.begin();
- it != completed_tasks_.end();
- ++it) {
- RasterizerTask* task = static_cast<RasterizerTask*>(it->get());
-
- task->WillComplete();
- task->CompleteOnOriginThread(this);
- task->DidComplete();
-
- task->RunReplyOnOriginThread();
- }
- completed_tasks_.clear();
-}
-
-scoped_ptr<RasterBuffer> ZeroCopyRasterWorkerPool::AcquireBufferForRaster(
- const Resource* resource) {
- return make_scoped_ptr<RasterBuffer>(
- new RasterBufferImpl(resource_provider_, resource));
-}
-
-void ZeroCopyRasterWorkerPool::ReleaseBufferForRaster(
- scoped_ptr<RasterBuffer> buffer) {
- // Nothing to do here. RasterBufferImpl destructor cleans up after itself.
-}
-
-void ZeroCopyRasterWorkerPool::OnRasterFinished(TaskSet task_set) {
- TRACE_EVENT1(
- "cc", "ZeroCopyRasterWorkerPool::OnRasterFinished", "task_set", task_set);
-
- DCHECK(raster_pending_[task_set]);
- raster_pending_[task_set] = false;
- if (raster_pending_.any()) {
- TRACE_EVENT_ASYNC_STEP_INTO1(
- "cc", "ScheduledTasks", this, "rasterizing", "state", StateAsValue());
- } else {
- TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this);
- }
- client_->DidFinishRunningTasks(task_set);
-}
-
-scoped_refptr<base::debug::ConvertableToTraceFormat>
-ZeroCopyRasterWorkerPool::StateAsValue() const {
- scoped_refptr<base::debug::TracedValue> state =
- new base::debug::TracedValue();
-
- state->BeginArray("tasks_pending");
- for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set)
- state->AppendBoolean(raster_pending_[task_set]);
- state->EndArray();
- return state;
-}
-
-} // namespace cc
diff --git a/cc/resources/zero_copy_raster_worker_pool.h b/cc/resources/zero_copy_raster_worker_pool.h
deleted file mode 100644
index d1f583e..0000000
--- a/cc/resources/zero_copy_raster_worker_pool.h
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright 2013 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 CC_RESOURCES_ZERO_COPY_RASTER_WORKER_POOL_H_
-#define CC_RESOURCES_ZERO_COPY_RASTER_WORKER_POOL_H_
-
-#include "base/memory/weak_ptr.h"
-#include "base/values.h"
-#include "cc/resources/raster_worker_pool.h"
-#include "cc/resources/rasterizer.h"
-
-namespace base {
-namespace debug {
-class ConvertableToTraceFormat;
-}
-}
-
-namespace cc {
-class ResourceProvider;
-
-class CC_EXPORT ZeroCopyRasterWorkerPool : public RasterWorkerPool,
- public Rasterizer,
- public RasterizerTaskClient {
- public:
- ~ZeroCopyRasterWorkerPool() override;
-
- static scoped_ptr<RasterWorkerPool> Create(
- base::SequencedTaskRunner* task_runner,
- TaskGraphRunner* task_graph_runner,
- ResourceProvider* resource_provider);
-
- // Overridden from RasterWorkerPool:
- Rasterizer* AsRasterizer() override;
-
- // Overridden from Rasterizer:
- void SetClient(RasterizerClient* client) override;
- void Shutdown() override;
- void ScheduleTasks(RasterTaskQueue* queue) override;
- void CheckForCompletedTasks() override;
-
- // Overridden from RasterizerTaskClient:
- scoped_ptr<RasterBuffer> AcquireBufferForRaster(
- const Resource* resource) override;
- void ReleaseBufferForRaster(scoped_ptr<RasterBuffer> buffer) override;
-
- protected:
- ZeroCopyRasterWorkerPool(base::SequencedTaskRunner* task_runner,
- TaskGraphRunner* task_graph_runner,
- ResourceProvider* resource_provider);
-
- private:
- void OnRasterFinished(TaskSet task_set);
- scoped_refptr<base::debug::ConvertableToTraceFormat> StateAsValue() const;
-
- scoped_refptr<base::SequencedTaskRunner> task_runner_;
- TaskGraphRunner* task_graph_runner_;
- const NamespaceToken namespace_token_;
- RasterizerClient* client_;
- ResourceProvider* resource_provider_;
-
- TaskSetCollection raster_pending_;
-
- scoped_refptr<RasterizerTask> raster_finished_tasks_[kNumberOfTaskSets];
-
- // Task graph used when scheduling tasks and vector used to gather
- // completed tasks.
- TaskGraph graph_;
- Task::Vector completed_tasks_;
-
- base::WeakPtrFactory<ZeroCopyRasterWorkerPool>
- raster_finished_weak_ptr_factory_;
-
- DISALLOW_COPY_AND_ASSIGN(ZeroCopyRasterWorkerPool);
-};
-
-} // namespace cc
-
-#endif // CC_RESOURCES_ZERO_COPY_RASTER_WORKER_POOL_H_
diff --git a/cc/resources/zero_copy_tile_task_worker_pool.cc b/cc/resources/zero_copy_tile_task_worker_pool.cc
new file mode 100644
index 0000000..6ef78f4
--- /dev/null
+++ b/cc/resources/zero_copy_tile_task_worker_pool.cc
@@ -0,0 +1,206 @@
+// Copyright 2013 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 "cc/resources/zero_copy_tile_task_worker_pool.h"
+
+#include <algorithm>
+
+#include "base/debug/trace_event.h"
+#include "base/debug/trace_event_argument.h"
+#include "base/strings/stringprintf.h"
+#include "cc/debug/traced_value.h"
+#include "cc/resources/raster_buffer.h"
+#include "cc/resources/resource.h"
+#include "ui/gfx/gpu_memory_buffer.h"
+
+namespace cc {
+namespace {
+
+class RasterBufferImpl : public RasterBuffer {
+ public:
+ RasterBufferImpl(ResourceProvider* resource_provider,
+ const Resource* resource)
+ : lock_(resource_provider, resource->id()), resource_(resource) {}
+
+ // Overridden from RasterBuffer:
+ void Playback(const RasterSource* raster_source,
+ const gfx::Rect& rect,
+ float scale) override {
+ gfx::GpuMemoryBuffer* gpu_memory_buffer = lock_.GetGpuMemoryBuffer();
+ if (!gpu_memory_buffer)
+ return;
+
+ TileTaskWorkerPool::PlaybackToMemory(
+ gpu_memory_buffer->Map(), resource_->format(), resource_->size(),
+ gpu_memory_buffer->GetStride(), raster_source, rect, scale);
+ gpu_memory_buffer->Unmap();
+ }
+
+ private:
+ ResourceProvider::ScopedWriteLockGpuMemoryBuffer lock_;
+ const Resource* resource_;
+
+ DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl);
+};
+
+} // namespace
+
+// static
+scoped_ptr<TileTaskWorkerPool> ZeroCopyTileTaskWorkerPool::Create(
+ base::SequencedTaskRunner* task_runner,
+ TaskGraphRunner* task_graph_runner,
+ ResourceProvider* resource_provider) {
+ return make_scoped_ptr<TileTaskWorkerPool>(new ZeroCopyTileTaskWorkerPool(
+ task_runner, task_graph_runner, resource_provider));
+}
+
+ZeroCopyTileTaskWorkerPool::ZeroCopyTileTaskWorkerPool(
+ base::SequencedTaskRunner* task_runner,
+ TaskGraphRunner* task_graph_runner,
+ ResourceProvider* resource_provider)
+ : task_runner_(task_runner),
+ task_graph_runner_(task_graph_runner),
+ namespace_token_(task_graph_runner->GetNamespaceToken()),
+ resource_provider_(resource_provider),
+ task_set_finished_weak_ptr_factory_(this) {
+}
+
+ZeroCopyTileTaskWorkerPool::~ZeroCopyTileTaskWorkerPool() {
+}
+
+TileTaskRunner* ZeroCopyTileTaskWorkerPool::AsTileTaskRunner() {
+ return this;
+}
+
+void ZeroCopyTileTaskWorkerPool::SetClient(TileTaskRunnerClient* client) {
+ client_ = client;
+}
+
+void ZeroCopyTileTaskWorkerPool::Shutdown() {
+ TRACE_EVENT0("cc", "ZeroCopyTileTaskWorkerPool::Shutdown");
+
+ TaskGraph empty;
+ task_graph_runner_->ScheduleTasks(namespace_token_, &empty);
+ task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_);
+}
+
+void ZeroCopyTileTaskWorkerPool::ScheduleTasks(TileTaskQueue* queue) {
+ TRACE_EVENT0("cc", "ZeroCopyTileTaskWorkerPool::ScheduleTasks");
+
+ if (tasks_pending_.none())
+ TRACE_EVENT_ASYNC_BEGIN0("cc", "ScheduledTasks", this);
+
+ // Mark all task sets as pending.
+ tasks_pending_.set();
+
+ unsigned priority = kTileTaskPriorityBase;
+
+ graph_.Reset();
+
+ // Cancel existing OnTaskSetFinished callbacks.
+ task_set_finished_weak_ptr_factory_.InvalidateWeakPtrs();
+
+ scoped_refptr<TileTask> new_task_set_finished_tasks[kNumberOfTaskSets];
+
+ size_t task_count[kNumberOfTaskSets] = {0};
+
+ for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) {
+ new_task_set_finished_tasks[task_set] = CreateTaskSetFinishedTask(
+ task_runner_.get(),
+ base::Bind(&ZeroCopyTileTaskWorkerPool::OnTaskSetFinished,
+ task_set_finished_weak_ptr_factory_.GetWeakPtr(), task_set));
+ }
+
+ for (TileTaskQueue::Item::Vector::const_iterator it = queue->items.begin();
+ it != queue->items.end(); ++it) {
+ const TileTaskQueue::Item& item = *it;
+ RasterTask* task = item.task;
+ DCHECK(!task->HasCompleted());
+
+ for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) {
+ if (!item.task_sets[task_set])
+ continue;
+
+ ++task_count[task_set];
+
+ graph_.edges.push_back(
+ TaskGraph::Edge(task, new_task_set_finished_tasks[task_set].get()));
+ }
+
+ InsertNodesForRasterTask(&graph_, task, task->dependencies(), priority++);
+ }
+
+ for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) {
+ InsertNodeForTask(&graph_, new_task_set_finished_tasks[task_set].get(),
+ kTaskSetFinishedTaskPriority, task_count[task_set]);
+ }
+
+ ScheduleTasksOnOriginThread(this, &graph_);
+ task_graph_runner_->ScheduleTasks(namespace_token_, &graph_);
+
+ std::copy(new_task_set_finished_tasks,
+ new_task_set_finished_tasks + kNumberOfTaskSets,
+ task_set_finished_tasks_);
+
+ TRACE_EVENT_ASYNC_STEP_INTO1("cc", "ScheduledTasks", this, "running", "state",
+ StateAsValue());
+}
+
+void ZeroCopyTileTaskWorkerPool::CheckForCompletedTasks() {
+ TRACE_EVENT0("cc", "ZeroCopyTileTaskWorkerPool::CheckForCompletedTasks");
+
+ task_graph_runner_->CollectCompletedTasks(namespace_token_,
+ &completed_tasks_);
+ for (Task::Vector::const_iterator it = completed_tasks_.begin();
+ it != completed_tasks_.end(); ++it) {
+ TileTask* task = static_cast<TileTask*>(it->get());
+
+ task->WillComplete();
+ task->CompleteOnOriginThread(this);
+ task->DidComplete();
+
+ task->RunReplyOnOriginThread();
+ }
+ completed_tasks_.clear();
+}
+
+scoped_ptr<RasterBuffer> ZeroCopyTileTaskWorkerPool::AcquireBufferForRaster(
+ const Resource* resource) {
+ return make_scoped_ptr<RasterBuffer>(
+ new RasterBufferImpl(resource_provider_, resource));
+}
+
+void ZeroCopyTileTaskWorkerPool::ReleaseBufferForRaster(
+ scoped_ptr<RasterBuffer> buffer) {
+ // Nothing to do here. RasterBufferImpl destructor cleans up after itself.
+}
+
+void ZeroCopyTileTaskWorkerPool::OnTaskSetFinished(TaskSet task_set) {
+ TRACE_EVENT1("cc", "ZeroCopyTileTaskWorkerPool::OnTaskSetFinished",
+ "task_set", task_set);
+
+ DCHECK(tasks_pending_[task_set]);
+ tasks_pending_[task_set] = false;
+ if (tasks_pending_.any()) {
+ TRACE_EVENT_ASYNC_STEP_INTO1("cc", "ScheduledTasks", this, "running",
+ "state", StateAsValue());
+ } else {
+ TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this);
+ }
+ client_->DidFinishRunningTileTasks(task_set);
+}
+
+scoped_refptr<base::debug::ConvertableToTraceFormat>
+ZeroCopyTileTaskWorkerPool::StateAsValue() const {
+ scoped_refptr<base::debug::TracedValue> state =
+ new base::debug::TracedValue();
+
+ state->BeginArray("tasks_pending");
+ for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set)
+ state->AppendBoolean(tasks_pending_[task_set]);
+ state->EndArray();
+ return state;
+}
+
+} // namespace cc
diff --git a/cc/resources/zero_copy_tile_task_worker_pool.h b/cc/resources/zero_copy_tile_task_worker_pool.h
new file mode 100644
index 0000000..9cc5ee9
--- /dev/null
+++ b/cc/resources/zero_copy_tile_task_worker_pool.h
@@ -0,0 +1,79 @@
+// Copyright 2013 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 CC_RESOURCES_ZERO_COPY_TILE_TASK_WORKER_POOL_H_
+#define CC_RESOURCES_ZERO_COPY_TILE_TASK_WORKER_POOL_H_
+
+#include "base/memory/weak_ptr.h"
+#include "base/values.h"
+#include "cc/resources/tile_task_runner.h"
+#include "cc/resources/tile_task_worker_pool.h"
+
+namespace base {
+namespace debug {
+class ConvertableToTraceFormat;
+}
+}
+
+namespace cc {
+class ResourceProvider;
+
+class CC_EXPORT ZeroCopyTileTaskWorkerPool : public TileTaskWorkerPool,
+ public TileTaskRunner,
+ public TileTaskClient {
+ public:
+ ~ZeroCopyTileTaskWorkerPool() override;
+
+ static scoped_ptr<TileTaskWorkerPool> Create(
+ base::SequencedTaskRunner* task_runner,
+ TaskGraphRunner* task_graph_runner,
+ ResourceProvider* resource_provider);
+
+ // Overridden from TileTaskWorkerPool:
+ TileTaskRunner* AsTileTaskRunner() override;
+
+ // Overridden from TileTaskRunner:
+ void SetClient(TileTaskRunnerClient* client) override;
+ void Shutdown() override;
+ void ScheduleTasks(TileTaskQueue* queue) override;
+ void CheckForCompletedTasks() override;
+
+ // Overridden from TileTaskClient:
+ scoped_ptr<RasterBuffer> AcquireBufferForRaster(
+ const Resource* resource) override;
+ void ReleaseBufferForRaster(scoped_ptr<RasterBuffer> buffer) override;
+
+ protected:
+ ZeroCopyTileTaskWorkerPool(base::SequencedTaskRunner* task_runner,
+ TaskGraphRunner* task_graph_runner,
+ ResourceProvider* resource_provider);
+
+ private:
+ void OnTaskSetFinished(TaskSet task_set);
+ scoped_refptr<base::debug::ConvertableToTraceFormat> StateAsValue() const;
+
+ scoped_refptr<base::SequencedTaskRunner> task_runner_;
+ TaskGraphRunner* task_graph_runner_;
+ const NamespaceToken namespace_token_;
+ TileTaskRunnerClient* client_;
+ ResourceProvider* resource_provider_;
+
+ TaskSetCollection tasks_pending_;
+
+ scoped_refptr<TileTask> task_set_finished_tasks_[kNumberOfTaskSets];
+
+ // Task graph used when scheduling tasks and vector used to gather
+ // completed tasks.
+ TaskGraph graph_;
+ Task::Vector completed_tasks_;
+
+ base::WeakPtrFactory<ZeroCopyTileTaskWorkerPool>
+ task_set_finished_weak_ptr_factory_;
+
+ DISALLOW_COPY_AND_ASSIGN(ZeroCopyTileTaskWorkerPool);
+};
+
+} // namespace cc
+
+#endif // CC_RESOURCES_ZERO_COPY_TILE_TASK_WORKER_POOL_H_
diff --git a/cc/scheduler/begin_frame_source.cc b/cc/scheduler/begin_frame_source.cc
index 89b794e..8ef3b67 100644
--- a/cc/scheduler/begin_frame_source.cc
+++ b/cc/scheduler/begin_frame_source.cc
@@ -146,9 +146,9 @@
BackToBackBeginFrameSource::BackToBackBeginFrameSource(
base::SingleThreadTaskRunner* task_runner)
: BeginFrameSourceMixIn(),
- weak_factory_(this),
task_runner_(task_runner),
- send_begin_frame_posted_(false) {
+ send_begin_frame_posted_(false),
+ weak_factory_(this) {
DCHECK(task_runner);
DCHECK_EQ(needs_begin_frames_, false);
DCHECK_EQ(send_begin_frame_posted_, false);
diff --git a/cc/scheduler/begin_frame_source.h b/cc/scheduler/begin_frame_source.h
index 28359d3..d3dd9de 100644
--- a/cc/scheduler/begin_frame_source.h
+++ b/cc/scheduler/begin_frame_source.h
@@ -185,7 +185,6 @@
base::SingleThreadTaskRunner* task_runner);
virtual base::TimeTicks Now(); // Now overridable for testing
- base::WeakPtrFactory<BackToBackBeginFrameSource> weak_factory_;
base::SingleThreadTaskRunner* task_runner_;
bool send_begin_frame_posted_;
@@ -194,6 +193,9 @@
void OnNeedsBeginFramesChange(bool needs_begin_frames) override;
void BeginFrame();
+
+ private:
+ base::WeakPtrFactory<BackToBackBeginFrameSource> weak_factory_;
};
// A frame source which is locked to an external parameters provides from a
diff --git a/cc/scheduler/scheduler.cc b/cc/scheduler/scheduler.cc
index 5a70ec6..3e7653f 100644
--- a/cc/scheduler/scheduler.cc
+++ b/cc/scheduler/scheduler.cc
@@ -224,9 +224,9 @@
ProcessScheduledActions();
}
-void Scheduler::SetNeedsManageTiles() {
- DCHECK(!IsInsideAction(SchedulerStateMachine::ACTION_MANAGE_TILES));
- state_machine_.SetNeedsManageTiles();
+void Scheduler::SetNeedsPrepareTiles() {
+ DCHECK(!IsInsideAction(SchedulerStateMachine::ACTION_PREPARE_TILES));
+ state_machine_.SetNeedsPrepareTiles();
ProcessScheduledActions();
}
@@ -266,8 +266,8 @@
ProcessScheduledActions();
}
-void Scheduler::DidManageTiles() {
- state_machine_.DidManageTiles();
+void Scheduler::DidPrepareTiles() {
+ state_machine_.DidPrepareTiles();
}
void Scheduler::DidLoseOutputSurface() {
@@ -711,8 +711,8 @@
case SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION:
client_->ScheduledActionBeginOutputSurfaceCreation();
break;
- case SchedulerStateMachine::ACTION_MANAGE_TILES:
- client_->ScheduledActionManageTiles();
+ case SchedulerStateMachine::ACTION_PREPARE_TILES:
+ client_->ScheduledActionPrepareTiles();
break;
}
} while (action != SchedulerStateMachine::ACTION_NONE);
diff --git a/cc/scheduler/scheduler.h b/cc/scheduler/scheduler.h
index 1175d73..27dbee3 100644
--- a/cc/scheduler/scheduler.h
+++ b/cc/scheduler/scheduler.h
@@ -42,7 +42,7 @@
virtual void ScheduledActionCommit() = 0;
virtual void ScheduledActionActivateSyncTree() = 0;
virtual void ScheduledActionBeginOutputSurfaceCreation() = 0;
- virtual void ScheduledActionManageTiles() = 0;
+ virtual void ScheduledActionPrepareTiles() = 0;
virtual void DidAnticipatedDrawTimeChange(base::TimeTicks time) = 0;
virtual base::TimeDelta DrawDurationEstimate() = 0;
virtual base::TimeDelta BeginMainFrameToCommitDurationEstimate() = 0;
@@ -119,7 +119,7 @@
void SetNeedsAnimate();
- void SetNeedsManageTiles();
+ void SetNeedsPrepareTiles();
void SetMaxSwapsPending(int max);
void DidSwapBuffers();
@@ -130,7 +130,7 @@
void NotifyReadyToCommit();
void BeginMainFrameAborted(bool did_handle);
- void DidManageTiles();
+ void DidPrepareTiles();
void DidLoseOutputSurface();
void DidCreateAndInitializeOutputSurface();
@@ -143,8 +143,8 @@
bool CommitPending() const { return state_machine_.CommitPending(); }
bool RedrawPending() const { return state_machine_.RedrawPending(); }
- bool ManageTilesPending() const {
- return state_machine_.ManageTilesPending();
+ bool PrepareTilesPending() const {
+ return state_machine_.PrepareTilesPending();
}
bool MainThreadIsInHighLatencyMode() const {
return state_machine_.MainThreadIsInHighLatencyMode();
diff --git a/cc/scheduler/scheduler_state_machine.cc b/cc/scheduler/scheduler_state_machine.cc
index 8e87c0f..dc3fa36 100644
--- a/cc/scheduler/scheduler_state_machine.cc
+++ b/cc/scheduler/scheduler_state_machine.cc
@@ -26,13 +26,13 @@
last_frame_number_swap_performed_(-1),
last_frame_number_swap_requested_(-1),
last_frame_number_begin_main_frame_sent_(-1),
- manage_tiles_funnel_(0),
+ prepare_tiles_funnel_(0),
consecutive_checkerboard_animations_(0),
max_pending_swaps_(1),
pending_swaps_(0),
needs_redraw_(false),
needs_animate_(false),
- needs_manage_tiles_(false),
+ needs_prepare_tiles_(false),
needs_commit_(false),
inside_poll_for_anticipated_draw_triggers_(false),
visible_(false),
@@ -140,8 +140,8 @@
return "ACTION_DRAW_AND_SWAP_ABORT";
case ACTION_BEGIN_OUTPUT_SURFACE_CREATION:
return "ACTION_BEGIN_OUTPUT_SURFACE_CREATION";
- case ACTION_MANAGE_TILES:
- return "ACTION_MANAGE_TILES";
+ case ACTION_PREPARE_TILES:
+ return "ACTION_PREPARE_TILES";
}
NOTREACHED();
return "???";
@@ -206,14 +206,14 @@
state->SetInteger("last_frame_number_begin_main_frame_sent",
last_frame_number_begin_main_frame_sent_);
- state->SetInteger("manage_tiles_funnel", manage_tiles_funnel_);
+ state->SetInteger("prepare_tiles_funnel", prepare_tiles_funnel_);
state->SetInteger("consecutive_checkerboard_animations",
consecutive_checkerboard_animations_);
state->SetInteger("max_pending_swaps_", max_pending_swaps_);
state->SetInteger("pending_swaps_", pending_swaps_);
state->SetBoolean("needs_redraw", needs_redraw_);
state->SetBoolean("needs_animate_", needs_animate_);
- state->SetBoolean("needs_manage_tiles", needs_manage_tiles_);
+ state->SetBoolean("needs_prepare_tiles", needs_prepare_tiles_);
state->SetBoolean("needs_commit", needs_commit_);
state->SetBoolean("visible", visible_);
state->SetBoolean("can_start", can_start_);
@@ -244,9 +244,9 @@
void SchedulerStateMachine::AdvanceCurrentFrameNumber() {
current_frame_number_++;
- // "Drain" the ManageTiles funnel.
- if (manage_tiles_funnel_ > 0)
- manage_tiles_funnel_--;
+ // "Drain" the PrepareTiles funnel.
+ if (prepare_tiles_funnel_ > 0)
+ prepare_tiles_funnel_--;
skip_begin_main_frame_to_reduce_latency_ =
skip_next_begin_main_frame_to_reduce_latency_;
@@ -481,20 +481,20 @@
return true;
}
-bool SchedulerStateMachine::ShouldManageTiles() const {
- // ManageTiles only really needs to be called immediately after commit
+bool SchedulerStateMachine::ShouldPrepareTiles() const {
+ // PrepareTiles only really needs to be called immediately after commit
// and then periodically after that. Use a funnel to make sure we average
- // one ManageTiles per BeginImplFrame in the long run.
- if (manage_tiles_funnel_ > 0)
+ // one PrepareTiles per BeginImplFrame in the long run.
+ if (prepare_tiles_funnel_ > 0)
return false;
// Limiting to once per-frame is not enough, since we only want to
- // manage tiles _after_ draws. Polling for draw triggers and
+ // prepare tiles _after_ draws. Polling for draw triggers and
// begin-frame are mutually exclusive, so we limit to these two cases.
if (begin_impl_frame_state_ != BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE &&
!inside_poll_for_anticipated_draw_triggers_)
return false;
- return needs_manage_tiles_;
+ return needs_prepare_tiles_;
}
SchedulerStateMachine::Action SchedulerStateMachine::NextAction() const {
@@ -512,8 +512,8 @@
else
return ACTION_DRAW_AND_SWAP_IF_POSSIBLE;
}
- if (ShouldManageTiles())
- return ACTION_MANAGE_TILES;
+ if (ShouldPrepareTiles())
+ return ACTION_PREPARE_TILES;
if (ShouldSendBeginMainFrame())
return ACTION_SEND_BEGIN_MAIN_FRAME;
if (ShouldBeginOutputSurfaceCreation())
@@ -580,8 +580,8 @@
DCHECK(!active_tree_needs_first_draw_);
return;
- case ACTION_MANAGE_TILES:
- UpdateStateOnManageTiles();
+ case ACTION_PREPARE_TILES:
+ UpdateStateOnPrepareTiles();
return;
}
}
@@ -673,8 +673,8 @@
last_frame_number_swap_requested_ = current_frame_number_;
}
-void SchedulerStateMachine::UpdateStateOnManageTiles() {
- needs_manage_tiles_ = false;
+void SchedulerStateMachine::UpdateStateOnPrepareTiles() {
+ needs_prepare_tiles_ = false;
}
void SchedulerStateMachine::SetSkipNextBeginMainFrameToReduceLatency() {
@@ -779,7 +779,7 @@
// Changing priorities may allow us to activate (given the new priorities),
// which may result in a new frame.
- if (needs_manage_tiles_)
+ if (needs_prepare_tiles_)
return true;
// If we just sent a swap request, it's likely that we are going to produce
@@ -939,11 +939,10 @@
needs_animate_ = true;
}
-void SchedulerStateMachine::SetNeedsManageTiles() {
- if (!needs_manage_tiles_) {
- TRACE_EVENT0("cc",
- "SchedulerStateMachine::SetNeedsManageTiles");
- needs_manage_tiles_ = true;
+void SchedulerStateMachine::SetNeedsPrepareTiles() {
+ if (!needs_prepare_tiles_) {
+ TRACE_EVENT0("cc", "SchedulerStateMachine::SetNeedsPrepareTiles");
+ needs_prepare_tiles_ = true;
}
}
@@ -1037,10 +1036,10 @@
}
}
-void SchedulerStateMachine::DidManageTiles() {
- needs_manage_tiles_ = false;
- // "Fill" the ManageTiles funnel.
- manage_tiles_funnel_++;
+void SchedulerStateMachine::DidPrepareTiles() {
+ needs_prepare_tiles_ = false;
+ // "Fill" the PrepareTiles funnel.
+ prepare_tiles_funnel_++;
}
void SchedulerStateMachine::DidLoseOutputSurface() {
diff --git a/cc/scheduler/scheduler_state_machine.h b/cc/scheduler/scheduler_state_machine.h
index 6e30694..7ee039a 100644
--- a/cc/scheduler/scheduler_state_machine.h
+++ b/cc/scheduler/scheduler_state_machine.h
@@ -97,7 +97,7 @@
CommitState commit_state() const { return commit_state_; }
bool RedrawPending() const { return needs_redraw_; }
- bool ManageTilesPending() const { return needs_manage_tiles_; }
+ bool PrepareTilesPending() const { return needs_prepare_tiles_; }
enum Action {
ACTION_NONE,
@@ -109,7 +109,7 @@
ACTION_DRAW_AND_SWAP_FORCED,
ACTION_DRAW_AND_SWAP_ABORT,
ACTION_BEGIN_OUTPUT_SURFACE_CREATION,
- ACTION_MANAGE_TILES,
+ ACTION_PREPARE_TILES,
};
static const char* ActionToString(Action action);
@@ -165,9 +165,9 @@
void SetNeedsAnimate();
bool needs_animate() const { return needs_animate_; }
- // Indicates that manage-tiles is required. This guarantees another
- // ManageTiles will occur shortly (even if no redraw is required).
- void SetNeedsManageTiles();
+ // Indicates that prepare-tiles is required. This guarantees another
+ // PrepareTiles will occur shortly (even if no redraw is required).
+ void SetNeedsPrepareTiles();
// Sets how many swaps can be pending to the OutputSurface.
void SetMaxSwapsPending(int max);
@@ -230,7 +230,7 @@
return active_tree_needs_first_draw_;
}
- void DidManageTiles();
+ void DidPrepareTiles();
void DidLoseOutputSurface();
void DidCreateAndInitializeOutputSurface();
bool HasInitializedOutputSurface() const;
@@ -278,7 +278,7 @@
bool ShouldActivatePendingTree() const;
bool ShouldSendBeginMainFrame() const;
bool ShouldCommit() const;
- bool ShouldManageTiles() const;
+ bool ShouldPrepareTiles() const;
void AdvanceCurrentFrameNumber();
bool HasAnimatedThisFrame() const;
@@ -289,7 +289,7 @@
void UpdateStateOnCommit(bool commit_was_aborted);
void UpdateStateOnActivation();
void UpdateStateOnDraw(bool did_request_swap);
- void UpdateStateOnManageTiles();
+ void UpdateStateOnPrepareTiles();
const SchedulerSettings settings_;
@@ -307,17 +307,17 @@
int last_frame_number_swap_requested_;
int last_frame_number_begin_main_frame_sent_;
- // manage_tiles_funnel_ is "filled" each time ManageTiles is called
+ // prepare_tiles_funnel_ is "filled" each time PrepareTiles is called
// and "drained" on each BeginImplFrame. If the funnel gets too full,
- // we start throttling ACTION_MANAGE_TILES such that we average one
- // ManageTile per BeginImplFrame.
- int manage_tiles_funnel_;
+ // we start throttling ACTION_PREPARE_TILES such that we average one
+ // PrepareTiles per BeginImplFrame.
+ int prepare_tiles_funnel_;
int consecutive_checkerboard_animations_;
int max_pending_swaps_;
int pending_swaps_;
bool needs_redraw_;
bool needs_animate_;
- bool needs_manage_tiles_;
+ bool needs_prepare_tiles_;
bool needs_commit_;
bool inside_poll_for_anticipated_draw_triggers_;
bool visible_;
diff --git a/cc/scheduler/scheduler_unittest.cc b/cc/scheduler/scheduler_unittest.cc
index 0997049..46242e3 100644
--- a/cc/scheduler/scheduler_unittest.cc
+++ b/cc/scheduler/scheduler_unittest.cc
@@ -263,8 +263,8 @@
actions_.push_back("ScheduledActionBeginOutputSurfaceCreation");
states_.push_back(scheduler_->AsValue());
}
- void ScheduledActionManageTiles() override {
- actions_.push_back("ScheduledActionManageTiles");
+ void ScheduledActionPrepareTiles() override {
+ actions_.push_back("ScheduledActionPrepareTiles");
states_.push_back(scheduler_->AsValue());
}
void DidAnticipatedDrawTimeChange(base::TimeTicks) override {
@@ -808,17 +808,17 @@
EXPECT_EQ(2, client.num_draws());
}
-class SchedulerClientNeedsManageTilesInDraw : public FakeSchedulerClient {
+class SchedulerClientNeedsPrepareTilesInDraw : public FakeSchedulerClient {
public:
DrawResult ScheduledActionDrawAndSwapIfPossible() override {
- scheduler_->SetNeedsManageTiles();
+ scheduler_->SetNeedsPrepareTiles();
return FakeSchedulerClient::ScheduledActionDrawAndSwapIfPossible();
}
};
-// Test manage tiles is independant of draws.
-TEST(SchedulerTest, ManageTiles) {
- SchedulerClientNeedsManageTilesInDraw client;
+// Test prepare tiles is independant of draws.
+TEST(SchedulerTest, PrepareTiles) {
+ SchedulerClientNeedsPrepareTilesInDraw client;
SchedulerSettings scheduler_settings;
scheduler_settings.use_external_begin_frame_source = true;
TestScheduler* scheduler = client.CreateScheduler(scheduler_settings);
@@ -827,16 +827,16 @@
scheduler->SetCanDraw(true);
InitializeOutputSurfaceAndFirstCommit(scheduler, &client);
- // Request both draw and manage tiles. ManageTiles shouldn't
+ // Request both draw and prepare tiles. PrepareTiles shouldn't
// be trigged until BeginImplFrame.
client.Reset();
- scheduler->SetNeedsManageTiles();
+ scheduler->SetNeedsPrepareTiles();
scheduler->SetNeedsRedraw();
EXPECT_TRUE(scheduler->RedrawPending());
- EXPECT_TRUE(scheduler->ManageTilesPending());
+ EXPECT_TRUE(scheduler->PrepareTilesPending());
EXPECT_TRUE(client.needs_begin_frames());
EXPECT_EQ(0, client.num_draws());
- EXPECT_FALSE(client.HasAction("ScheduledActionManageTiles"));
+ EXPECT_FALSE(client.HasAction("ScheduledActionPrepareTiles"));
EXPECT_FALSE(client.HasAction("ScheduledActionDrawAndSwapIfPossible"));
// We have no immediate actions to perform, so the BeginImplFrame should post
@@ -852,18 +852,18 @@
client.task_runner().RunPendingTasks(); // Run posted deadline.
EXPECT_EQ(1, client.num_draws());
EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible"));
- EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles"));
+ EXPECT_TRUE(client.HasAction("ScheduledActionPrepareTiles"));
EXPECT_LT(client.ActionIndex("ScheduledActionDrawAndSwapIfPossible"),
- client.ActionIndex("ScheduledActionManageTiles"));
+ client.ActionIndex("ScheduledActionPrepareTiles"));
EXPECT_FALSE(scheduler->RedrawPending());
- EXPECT_FALSE(scheduler->ManageTilesPending());
+ EXPECT_FALSE(scheduler->PrepareTilesPending());
EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
- // Request a draw. We don't need a ManageTiles yet.
+ // Request a draw. We don't need a PrepareTiles yet.
client.Reset();
scheduler->SetNeedsRedraw();
EXPECT_TRUE(scheduler->RedrawPending());
- EXPECT_FALSE(scheduler->ManageTilesPending());
+ EXPECT_FALSE(scheduler->PrepareTilesPending());
EXPECT_TRUE(client.needs_begin_frames());
EXPECT_EQ(0, client.num_draws());
@@ -875,18 +875,18 @@
EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2);
EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
- // Draw. The draw will trigger SetNeedsManageTiles, and
- // then the ManageTiles action will be triggered after the Draw.
- // Afterwards, neither a draw nor ManageTiles are pending.
+ // Draw. The draw will trigger SetNeedsPrepareTiles, and
+ // then the PrepareTiles action will be triggered after the Draw.
+ // Afterwards, neither a draw nor PrepareTiles are pending.
client.Reset();
client.task_runner().RunPendingTasks(); // Run posted deadline.
EXPECT_EQ(1, client.num_draws());
EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible"));
- EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles"));
+ EXPECT_TRUE(client.HasAction("ScheduledActionPrepareTiles"));
EXPECT_LT(client.ActionIndex("ScheduledActionDrawAndSwapIfPossible"),
- client.ActionIndex("ScheduledActionManageTiles"));
+ client.ActionIndex("ScheduledActionPrepareTiles"));
EXPECT_FALSE(scheduler->RedrawPending());
- EXPECT_FALSE(scheduler->ManageTilesPending());
+ EXPECT_FALSE(scheduler->PrepareTilesPending());
EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
// We need a BeginImplFrame where we don't swap to go idle.
@@ -900,16 +900,16 @@
EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
EXPECT_EQ(0, client.num_draws());
- // Now trigger a ManageTiles outside of a draw. We will then need
- // a begin-frame for the ManageTiles, but we don't need a draw.
+ // Now trigger a PrepareTiles outside of a draw. We will then need
+ // a begin-frame for the PrepareTiles, but we don't need a draw.
client.Reset();
EXPECT_FALSE(client.needs_begin_frames());
- scheduler->SetNeedsManageTiles();
+ scheduler->SetNeedsPrepareTiles();
EXPECT_TRUE(client.needs_begin_frames());
- EXPECT_TRUE(scheduler->ManageTilesPending());
+ EXPECT_TRUE(scheduler->PrepareTilesPending());
EXPECT_FALSE(scheduler->RedrawPending());
- // BeginImplFrame. There will be no draw, only ManageTiles.
+ // BeginImplFrame. There will be no draw, only PrepareTiles.
client.Reset();
client.AdvanceFrame();
EXPECT_SINGLE_ACTION("WillBeginImplFrame", client);
@@ -918,13 +918,13 @@
client.task_runner().RunPendingTasks(); // Run posted deadline.
EXPECT_EQ(0, client.num_draws());
EXPECT_FALSE(client.HasAction("ScheduledActionDrawAndSwapIfPossible"));
- EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles"));
+ EXPECT_TRUE(client.HasAction("ScheduledActionPrepareTiles"));
EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
}
-// Test that ManageTiles only happens once per frame. If an external caller
-// initiates it, then the state machine should not ManageTiles on that frame.
-TEST(SchedulerTest, ManageTilesOncePerFrame) {
+// Test that PrepareTiles only happens once per frame. If an external caller
+// initiates it, then the state machine should not PrepareTiles on that frame.
+TEST(SchedulerTest, PrepareTilesOncePerFrame) {
FakeSchedulerClient client;
SchedulerSettings scheduler_settings;
scheduler_settings.use_external_begin_frame_source = true;
@@ -934,8 +934,9 @@
scheduler->SetCanDraw(true);
InitializeOutputSurfaceAndFirstCommit(scheduler, &client);
- // If DidManageTiles during a frame, then ManageTiles should not occur again.
- scheduler->SetNeedsManageTiles();
+ // If DidPrepareTiles during a frame, then PrepareTiles should not occur
+ // again.
+ scheduler->SetNeedsPrepareTiles();
scheduler->SetNeedsRedraw();
client.Reset();
client.AdvanceFrame();
@@ -943,21 +944,21 @@
EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2);
EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
- EXPECT_TRUE(scheduler->ManageTilesPending());
- scheduler->DidManageTiles(); // An explicit ManageTiles.
- EXPECT_FALSE(scheduler->ManageTilesPending());
+ EXPECT_TRUE(scheduler->PrepareTilesPending());
+ scheduler->DidPrepareTiles(); // An explicit PrepareTiles.
+ EXPECT_FALSE(scheduler->PrepareTilesPending());
client.Reset();
client.task_runner().RunPendingTasks(); // Run posted deadline.
EXPECT_EQ(1, client.num_draws());
EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible"));
- EXPECT_FALSE(client.HasAction("ScheduledActionManageTiles"));
+ EXPECT_FALSE(client.HasAction("ScheduledActionPrepareTiles"));
EXPECT_FALSE(scheduler->RedrawPending());
- EXPECT_FALSE(scheduler->ManageTilesPending());
+ EXPECT_FALSE(scheduler->PrepareTilesPending());
EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
- // Next frame without DidManageTiles should ManageTiles with draw.
- scheduler->SetNeedsManageTiles();
+ // Next frame without DidPrepareTiles should PrepareTiles with draw.
+ scheduler->SetNeedsPrepareTiles();
scheduler->SetNeedsRedraw();
client.Reset();
client.AdvanceFrame();
@@ -969,18 +970,18 @@
client.task_runner().RunPendingTasks(); // Run posted deadline.
EXPECT_EQ(1, client.num_draws());
EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible"));
- EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles"));
+ EXPECT_TRUE(client.HasAction("ScheduledActionPrepareTiles"));
EXPECT_LT(client.ActionIndex("ScheduledActionDrawAndSwapIfPossible"),
- client.ActionIndex("ScheduledActionManageTiles"));
+ client.ActionIndex("ScheduledActionPrepareTiles"));
EXPECT_FALSE(scheduler->RedrawPending());
- EXPECT_FALSE(scheduler->ManageTilesPending());
+ EXPECT_FALSE(scheduler->PrepareTilesPending());
EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
- scheduler->DidManageTiles(); // Corresponds to ScheduledActionManageTiles
+ scheduler->DidPrepareTiles(); // Corresponds to ScheduledActionPrepareTiles
- // If we get another DidManageTiles within the same frame, we should
- // not ManageTiles on the next frame.
- scheduler->DidManageTiles(); // An explicit ManageTiles.
- scheduler->SetNeedsManageTiles();
+ // If we get another DidPrepareTiles within the same frame, we should
+ // not PrepareTiles on the next frame.
+ scheduler->DidPrepareTiles(); // An explicit PrepareTiles.
+ scheduler->SetNeedsPrepareTiles();
scheduler->SetNeedsRedraw();
client.Reset();
client.AdvanceFrame();
@@ -988,22 +989,23 @@
EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2);
EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
- EXPECT_TRUE(scheduler->ManageTilesPending());
+ EXPECT_TRUE(scheduler->PrepareTilesPending());
client.Reset();
client.task_runner().RunPendingTasks(); // Run posted deadline.
EXPECT_EQ(1, client.num_draws());
EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible"));
- EXPECT_FALSE(client.HasAction("ScheduledActionManageTiles"));
+ EXPECT_FALSE(client.HasAction("ScheduledActionPrepareTiles"));
EXPECT_FALSE(scheduler->RedrawPending());
EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
- // If we get another DidManageTiles, we should not ManageTiles on the next
- // frame. This verifies we don't alternate calling ManageTiles once and twice.
- EXPECT_TRUE(scheduler->ManageTilesPending());
- scheduler->DidManageTiles(); // An explicit ManageTiles.
- EXPECT_FALSE(scheduler->ManageTilesPending());
- scheduler->SetNeedsManageTiles();
+ // If we get another DidPrepareTiles, we should not PrepareTiles on the next
+ // frame. This verifies we don't alternate calling PrepareTiles once and
+ // twice.
+ EXPECT_TRUE(scheduler->PrepareTilesPending());
+ scheduler->DidPrepareTiles(); // An explicit PrepareTiles.
+ EXPECT_FALSE(scheduler->PrepareTilesPending());
+ scheduler->SetNeedsPrepareTiles();
scheduler->SetNeedsRedraw();
client.Reset();
client.AdvanceFrame();
@@ -1011,18 +1013,18 @@
EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2);
EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
- EXPECT_TRUE(scheduler->ManageTilesPending());
+ EXPECT_TRUE(scheduler->PrepareTilesPending());
client.Reset();
client.task_runner().RunPendingTasks(); // Run posted deadline.
EXPECT_EQ(1, client.num_draws());
EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible"));
- EXPECT_FALSE(client.HasAction("ScheduledActionManageTiles"));
+ EXPECT_FALSE(client.HasAction("ScheduledActionPrepareTiles"));
EXPECT_FALSE(scheduler->RedrawPending());
EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
- // Next frame without DidManageTiles should ManageTiles with draw.
- scheduler->SetNeedsManageTiles();
+ // Next frame without DidPrepareTiles should PrepareTiles with draw.
+ scheduler->SetNeedsPrepareTiles();
scheduler->SetNeedsRedraw();
client.Reset();
client.AdvanceFrame();
@@ -1034,17 +1036,17 @@
client.task_runner().RunPendingTasks(); // Run posted deadline.
EXPECT_EQ(1, client.num_draws());
EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible"));
- EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles"));
+ EXPECT_TRUE(client.HasAction("ScheduledActionPrepareTiles"));
EXPECT_LT(client.ActionIndex("ScheduledActionDrawAndSwapIfPossible"),
- client.ActionIndex("ScheduledActionManageTiles"));
+ client.ActionIndex("ScheduledActionPrepareTiles"));
EXPECT_FALSE(scheduler->RedrawPending());
- EXPECT_FALSE(scheduler->ManageTilesPending());
+ EXPECT_FALSE(scheduler->PrepareTilesPending());
EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
- scheduler->DidManageTiles(); // Corresponds to ScheduledActionManageTiles
+ scheduler->DidPrepareTiles(); // Corresponds to ScheduledActionPrepareTiles
}
TEST(SchedulerTest, TriggerBeginFrameDeadlineEarly) {
- SchedulerClientNeedsManageTilesInDraw client;
+ SchedulerClientNeedsPrepareTilesInDraw client;
SchedulerSettings scheduler_settings;
scheduler_settings.use_external_begin_frame_source = true;
TestScheduler* scheduler = client.CreateScheduler(scheduler_settings);
@@ -1891,7 +1893,7 @@
DidLoseOutputSurfaceAfterReadyToCommit(true);
}
-TEST(SchedulerTest, DidLoseOutputSurfaceAfterSetNeedsManageTiles) {
+TEST(SchedulerTest, DidLoseOutputSurfaceAfterSetNeedsPrepareTiles) {
FakeSchedulerClient client;
SchedulerSettings scheduler_settings;
scheduler_settings.use_external_begin_frame_source = true;
@@ -1902,7 +1904,7 @@
InitializeOutputSurfaceAndFirstCommit(scheduler, &client);
client.Reset();
- scheduler->SetNeedsManageTiles();
+ scheduler->SetNeedsPrepareTiles();
scheduler->SetNeedsRedraw();
EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client);
@@ -1918,7 +1920,7 @@
client.Reset();
client.task_runner().RunPendingTasks(); // Run posted deadline.
- EXPECT_ACTION("ScheduledActionManageTiles", client, 0, 2);
+ EXPECT_ACTION("ScheduledActionPrepareTiles", client, 0, 2);
EXPECT_ACTION("ScheduledActionBeginOutputSurfaceCreation", client, 1, 2);
}
diff --git a/cc/test/fake_layer_tree_host_client.h b/cc/test/fake_layer_tree_host_client.h
index d64a5b2..6f24116 100644
--- a/cc/test/fake_layer_tree_host_client.h
+++ b/cc/test/fake_layer_tree_host_client.h
@@ -36,6 +36,7 @@
void Layout() override {}
void ApplyViewportDeltas(const gfx::Vector2d& inner_delta,
const gfx::Vector2d& outer_delta,
+ const gfx::Vector2dF& elastic_overscroll_delta,
float page_scale,
float top_controls_delta) override {}
void ApplyViewportDeltas(const gfx::Vector2d& scroll_delta,
diff --git a/cc/test/fake_layer_tree_host_impl.h b/cc/test/fake_layer_tree_host_impl.h
index 7403c07..fe9bc4f 100644
--- a/cc/test/fake_layer_tree_host_impl.h
+++ b/cc/test/fake_layer_tree_host_impl.h
@@ -35,7 +35,7 @@
static int RecursiveUpdateNumChildren(LayerImpl* layer);
using LayerTreeHostImpl::ActivateSyncTree;
- using LayerTreeHostImpl::manage_tiles_needed;
+ using LayerTreeHostImpl::prepare_tiles_needed;
private:
BeginFrameArgs current_begin_frame_args_;
diff --git a/cc/test/fake_layer_tree_host_impl_client.h b/cc/test/fake_layer_tree_host_impl_client.h
index ced02a6..98aafa0 100644
--- a/cc/test/fake_layer_tree_host_impl_client.h
+++ b/cc/test/fake_layer_tree_host_impl_client.h
@@ -28,7 +28,7 @@
void SetNeedsRedrawRectOnImplThread(const gfx::Rect& damage_rect) override {}
void SetNeedsAnimateOnImplThread() override {}
void SetNeedsCommitOnImplThread() override {}
- void SetNeedsManageTilesOnImplThread() override {}
+ void SetNeedsPrepareTilesOnImplThread() override {}
void PostAnimationEventsToMainThreadOnImplThread(
scoped_ptr<AnimationEventsVector> events) override {}
bool ReduceContentsTextureMemoryOnImplThread(size_t limit_bytes,
@@ -38,7 +38,7 @@
void PostDelayedScrollbarFadeOnImplThread(const base::Closure& start_fade,
base::TimeDelta delay) override {}
void DidActivateSyncTree() override {}
- void DidManageTiles() override {}
+ void DidPrepareTiles() override {}
};
} // namespace cc
diff --git a/cc/test/fake_tile_manager.cc b/cc/test/fake_tile_manager.cc
index 8aa343b..f85946a 100644
--- a/cc/test/fake_tile_manager.cc
+++ b/cc/test/fake_tile_manager.cc
@@ -9,22 +9,20 @@
#include "base/lazy_instance.h"
#include "cc/resources/raster_buffer.h"
-#include "cc/resources/rasterizer.h"
+#include "cc/resources/tile_task_runner.h"
namespace cc {
namespace {
-class FakeRasterizerImpl : public Rasterizer, public RasterizerTaskClient {
+class FakeTileTaskRunnerImpl : public TileTaskRunner, public TileTaskClient {
public:
- // Overridden from Rasterizer:
- void SetClient(RasterizerClient* client) override {}
+ // Overridden from TileTaskRunner:
+ void SetClient(TileTaskRunnerClient* client) override {}
void Shutdown() override {}
- void ScheduleTasks(RasterTaskQueue* queue) override {
- for (RasterTaskQueue::Item::Vector::const_iterator it =
- queue->items.begin();
- it != queue->items.end();
- ++it) {
+ void ScheduleTasks(TileTaskQueue* queue) override {
+ for (TileTaskQueue::Item::Vector::const_iterator it = queue->items.begin();
+ it != queue->items.end(); ++it) {
RasterTask* task = it->task;
task->WillSchedule();
@@ -49,7 +47,7 @@
completed_tasks_.clear();
}
- // Overridden from RasterizerTaskClient:
+ // Overridden from TileTaskClient:
scoped_ptr<RasterBuffer> AcquireBufferForRaster(
const Resource* resource) override {
return nullptr;
@@ -59,7 +57,7 @@
private:
RasterTask::Vector completed_tasks_;
};
-base::LazyInstance<FakeRasterizerImpl> g_fake_rasterizer =
+base::LazyInstance<FakeTileTaskRunnerImpl> g_fake_tile_task_runner =
LAZY_INSTANCE_INITIALIZER;
} // namespace
@@ -68,7 +66,7 @@
: TileManager(client,
base::MessageLoopProxy::current(),
NULL,
- g_fake_rasterizer.Pointer(),
+ g_fake_tile_task_runner.Pointer(),
NULL,
std::numeric_limits<size_t>::max()) {
}
@@ -78,7 +76,7 @@
: TileManager(client,
base::MessageLoopProxy::current(),
resource_pool,
- g_fake_rasterizer.Pointer(),
+ g_fake_tile_task_runner.Pointer(),
NULL,
std::numeric_limits<size_t>::max()) {
}
diff --git a/cc/test/geometry_test_utils.h b/cc/test/geometry_test_utils.h
index 38112a8..3f3197c 100644
--- a/cc/test/geometry_test_utils.h
+++ b/cc/test/geometry_test_utils.h
@@ -29,6 +29,13 @@
EXPECT_NEAR((expected).height(), (actual).height(), (abs_error)); \
} while (false)
+#define EXPECT_POINT3F_EQ(expected, actual) \
+do { \
+ EXPECT_FLOAT_EQ((expected).x(), (actual).x()); \
+ EXPECT_FLOAT_EQ((expected).y(), (actual).y()); \
+ EXPECT_FLOAT_EQ((expected).z(), (actual).z()); \
+} while (false)
+
#define EXPECT_VECTOR_EQ(expected, actual) \
do { \
EXPECT_EQ((expected).x(), (actual).x()); \
diff --git a/cc/test/layer_tree_pixel_resource_test.cc b/cc/test/layer_tree_pixel_resource_test.cc
index 1839643..d5b5127 100644
--- a/cc/test/layer_tree_pixel_resource_test.cc
+++ b/cc/test/layer_tree_pixel_resource_test.cc
@@ -5,13 +5,13 @@
#include "cc/test/layer_tree_pixel_resource_test.h"
#include "cc/layers/layer.h"
-#include "cc/resources/bitmap_raster_worker_pool.h"
-#include "cc/resources/gpu_raster_worker_pool.h"
-#include "cc/resources/one_copy_raster_worker_pool.h"
-#include "cc/resources/pixel_buffer_raster_worker_pool.h"
-#include "cc/resources/raster_worker_pool.h"
+#include "cc/resources/bitmap_tile_task_worker_pool.h"
+#include "cc/resources/gpu_tile_task_worker_pool.h"
+#include "cc/resources/one_copy_tile_task_worker_pool.h"
+#include "cc/resources/pixel_buffer_tile_task_worker_pool.h"
#include "cc/resources/resource_pool.h"
-#include "cc/resources/zero_copy_raster_worker_pool.h"
+#include "cc/resources/tile_task_worker_pool.h"
+#include "cc/resources/zero_copy_tile_task_worker_pool.h"
#include "cc/test/fake_output_surface.h"
#include "gpu/GLES2/gl2extchromium.h"
@@ -46,7 +46,7 @@
PixelResourceTestCase test_case)
: staging_texture_target_(GL_INVALID_VALUE),
draw_texture_target_(GL_INVALID_VALUE),
- resource_pool_option_(BITMAP_RASTER_WORKER_POOL),
+ resource_pool_option_(BITMAP_TILE_TASK_WORKER_POOL),
test_case_(test_case) {
InitializeFromTestCase(test_case);
}
@@ -58,63 +58,63 @@
test_type_ = PIXEL_TEST_SOFTWARE;
staging_texture_target_ = GL_INVALID_VALUE;
draw_texture_target_ = GL_INVALID_VALUE;
- resource_pool_option_ = BITMAP_RASTER_WORKER_POOL;
+ resource_pool_option_ = BITMAP_TILE_TASK_WORKER_POOL;
return;
case GL_GPU_RASTER_2D_DRAW:
test_type_ = PIXEL_TEST_GL;
staging_texture_target_ = GL_INVALID_VALUE;
draw_texture_target_ = GL_TEXTURE_2D;
- resource_pool_option_ = GPU_RASTER_WORKER_POOL;
+ resource_pool_option_ = GPU_TILE_TASK_WORKER_POOL;
return;
case GL_ONE_COPY_2D_STAGING_2D_DRAW:
test_type_ = PIXEL_TEST_GL;
staging_texture_target_ = GL_TEXTURE_2D;
draw_texture_target_ = GL_TEXTURE_2D;
- resource_pool_option_ = ONE_COPY_RASTER_WORKER_POOL;
+ resource_pool_option_ = ONE_COPY_TILE_TASK_WORKER_POOL;
return;
case GL_ONE_COPY_RECT_STAGING_2D_DRAW:
test_type_ = PIXEL_TEST_GL;
staging_texture_target_ = GL_TEXTURE_RECTANGLE_ARB;
draw_texture_target_ = GL_TEXTURE_2D;
- resource_pool_option_ = ONE_COPY_RASTER_WORKER_POOL;
+ resource_pool_option_ = ONE_COPY_TILE_TASK_WORKER_POOL;
return;
case GL_ONE_COPY_EXTERNAL_STAGING_2D_DRAW:
test_type_ = PIXEL_TEST_GL;
staging_texture_target_ = GL_TEXTURE_EXTERNAL_OES;
draw_texture_target_ = GL_TEXTURE_2D;
- resource_pool_option_ = ONE_COPY_RASTER_WORKER_POOL;
+ resource_pool_option_ = ONE_COPY_TILE_TASK_WORKER_POOL;
return;
case GL_ZERO_COPY_2D_DRAW:
test_type_ = PIXEL_TEST_GL;
staging_texture_target_ = GL_INVALID_VALUE;
draw_texture_target_ = GL_TEXTURE_2D;
- resource_pool_option_ = ZERO_COPY_RASTER_WORKER_POOL;
+ resource_pool_option_ = ZERO_COPY_TILE_TASK_WORKER_POOL;
return;
case GL_ZERO_COPY_RECT_DRAW:
test_type_ = PIXEL_TEST_GL;
staging_texture_target_ = GL_INVALID_VALUE;
draw_texture_target_ = GL_TEXTURE_RECTANGLE_ARB;
- resource_pool_option_ = ZERO_COPY_RASTER_WORKER_POOL;
+ resource_pool_option_ = ZERO_COPY_TILE_TASK_WORKER_POOL;
return;
case GL_ZERO_COPY_EXTERNAL_DRAW:
test_type_ = PIXEL_TEST_GL;
staging_texture_target_ = GL_INVALID_VALUE;
draw_texture_target_ = GL_TEXTURE_EXTERNAL_OES;
- resource_pool_option_ = ZERO_COPY_RASTER_WORKER_POOL;
+ resource_pool_option_ = ZERO_COPY_TILE_TASK_WORKER_POOL;
return;
case GL_ASYNC_UPLOAD_2D_DRAW:
test_type_ = PIXEL_TEST_GL;
staging_texture_target_ = GL_INVALID_VALUE;
draw_texture_target_ = GL_TEXTURE_2D;
- resource_pool_option_ = PIXEL_BUFFER_RASTER_WORKER_POOL;
+ resource_pool_option_ = PIXEL_BUFFER_TILE_TASK_WORKER_POOL;
return;
}
NOTREACHED();
}
-void LayerTreeHostPixelResourceTest::CreateResourceAndRasterWorkerPool(
+void LayerTreeHostPixelResourceTest::CreateResourceAndTileTaskWorkerPool(
LayerTreeHostImpl* host_impl,
- scoped_ptr<RasterWorkerPool>* raster_worker_pool,
+ scoped_ptr<TileTaskWorkerPool>* tile_task_worker_pool,
scoped_ptr<ResourcePool>* resource_pool,
scoped_ptr<ResourcePool>* staging_resource_pool) {
base::SingleThreadTaskRunner* task_runner =
@@ -129,7 +129,7 @@
size_t max_transfer_buffer_usage_bytes = 1024u * 1024u * 60u;
switch (resource_pool_option_) {
- case BITMAP_RASTER_WORKER_POOL:
+ case BITMAP_TILE_TASK_WORKER_POOL:
EXPECT_FALSE(context_provider);
EXPECT_EQ(PIXEL_TEST_SOFTWARE, test_type_);
*resource_pool =
@@ -137,12 +137,11 @@
draw_texture_target_,
resource_provider->best_texture_format());
- *raster_worker_pool =
- BitmapRasterWorkerPool::Create(task_runner,
- RasterWorkerPool::GetTaskGraphRunner(),
- resource_provider);
+ *tile_task_worker_pool = BitmapTileTaskWorkerPool::Create(
+ task_runner, TileTaskWorkerPool::GetTaskGraphRunner(),
+ resource_provider);
break;
- case GPU_RASTER_WORKER_POOL:
+ case GPU_TILE_TASK_WORKER_POOL:
EXPECT_TRUE(context_provider);
EXPECT_EQ(PIXEL_TEST_GL, test_type_);
*resource_pool =
@@ -150,13 +149,11 @@
draw_texture_target_,
resource_provider->best_texture_format());
- *raster_worker_pool =
- GpuRasterWorkerPool::Create(task_runner,
- context_provider,
- resource_provider,
- use_distance_field_text);
+ *tile_task_worker_pool = GpuTileTaskWorkerPool::Create(
+ task_runner, context_provider, resource_provider,
+ use_distance_field_text);
break;
- case ZERO_COPY_RASTER_WORKER_POOL:
+ case ZERO_COPY_TILE_TASK_WORKER_POOL:
EXPECT_TRUE(context_provider);
EXPECT_EQ(PIXEL_TEST_GL, test_type_);
EXPECT_TRUE(host_impl->GetRendererCapabilities().using_image);
@@ -165,12 +162,11 @@
draw_texture_target_,
resource_provider->best_texture_format());
- *raster_worker_pool = ZeroCopyRasterWorkerPool::Create(
- task_runner,
- RasterWorkerPool::GetTaskGraphRunner(),
+ *tile_task_worker_pool = ZeroCopyTileTaskWorkerPool::Create(
+ task_runner, TileTaskWorkerPool::GetTaskGraphRunner(),
resource_provider);
break;
- case ONE_COPY_RASTER_WORKER_POOL:
+ case ONE_COPY_TILE_TASK_WORKER_POOL:
EXPECT_TRUE(context_provider);
EXPECT_EQ(PIXEL_TEST_GL, test_type_);
EXPECT_TRUE(host_impl->GetRendererCapabilities().using_image);
@@ -184,14 +180,11 @@
draw_texture_target_,
resource_provider->best_texture_format());
- *raster_worker_pool = OneCopyRasterWorkerPool::Create(
- task_runner,
- RasterWorkerPool::GetTaskGraphRunner(),
- context_provider,
- resource_provider,
- staging_resource_pool->get());
+ *tile_task_worker_pool = OneCopyTileTaskWorkerPool::Create(
+ task_runner, TileTaskWorkerPool::GetTaskGraphRunner(),
+ context_provider, resource_provider, staging_resource_pool->get());
break;
- case PIXEL_BUFFER_RASTER_WORKER_POOL:
+ case PIXEL_BUFFER_TILE_TASK_WORKER_POOL:
EXPECT_TRUE(context_provider);
EXPECT_EQ(PIXEL_TEST_GL, test_type_);
*resource_pool = ResourcePool::Create(
@@ -199,12 +192,9 @@
draw_texture_target_,
resource_provider->memory_efficient_texture_format());
- *raster_worker_pool = PixelBufferRasterWorkerPool::Create(
- task_runner,
- RasterWorkerPool::GetTaskGraphRunner(),
- context_provider,
- resource_provider,
- max_transfer_buffer_usage_bytes);
+ *tile_task_worker_pool = PixelBufferTileTaskWorkerPool::Create(
+ task_runner, TileTaskWorkerPool::GetTaskGraphRunner(),
+ context_provider, resource_provider, max_transfer_buffer_usage_bytes);
break;
}
}
diff --git a/cc/test/layer_tree_pixel_resource_test.h b/cc/test/layer_tree_pixel_resource_test.h
index da3da25..08900a2 100644
--- a/cc/test/layer_tree_pixel_resource_test.h
+++ b/cc/test/layer_tree_pixel_resource_test.h
@@ -11,7 +11,7 @@
namespace cc {
class LayerTreeHostImpl;
-class RasterWorkerPool;
+class TileTaskWorkerPool;
class ResourcePool;
// Enumerate the various combinations of renderer, resource pool, staging
@@ -34,27 +34,27 @@
public:
explicit LayerTreeHostPixelResourceTest(PixelResourceTestCase test_case);
- void CreateResourceAndRasterWorkerPool(
+ void CreateResourceAndTileTaskWorkerPool(
LayerTreeHostImpl* host_impl,
- scoped_ptr<RasterWorkerPool>* raster_worker_pool,
+ scoped_ptr<TileTaskWorkerPool>* tile_task_worker_pool,
scoped_ptr<ResourcePool>* resource_pool,
scoped_ptr<ResourcePool>* staging_resource_pool) override;
void RunPixelResourceTest(scoped_refptr<Layer> content_root,
base::FilePath file_name);
- enum RasterWorkerPoolOption {
- BITMAP_RASTER_WORKER_POOL,
- GPU_RASTER_WORKER_POOL,
- ZERO_COPY_RASTER_WORKER_POOL,
- ONE_COPY_RASTER_WORKER_POOL,
- PIXEL_BUFFER_RASTER_WORKER_POOL,
+ enum TileTaskWorkerPoolOption {
+ BITMAP_TILE_TASK_WORKER_POOL,
+ GPU_TILE_TASK_WORKER_POOL,
+ ZERO_COPY_TILE_TASK_WORKER_POOL,
+ ONE_COPY_TILE_TASK_WORKER_POOL,
+ PIXEL_BUFFER_TILE_TASK_WORKER_POOL,
};
protected:
unsigned staging_texture_target_;
unsigned draw_texture_target_;
- RasterWorkerPoolOption resource_pool_option_;
+ TileTaskWorkerPoolOption resource_pool_option_;
private:
void InitializeFromTestCase(PixelResourceTestCase test_case);
diff --git a/cc/test/layer_tree_test.cc b/cc/test/layer_tree_test.cc
index 5be1240..d6411ec 100644
--- a/cc/test/layer_tree_test.cc
+++ b/cc/test/layer_tree_test.cc
@@ -45,13 +45,13 @@
return draw_result;
}
-void TestHooks::CreateResourceAndRasterWorkerPool(
+void TestHooks::CreateResourceAndTileTaskWorkerPool(
LayerTreeHostImpl* host_impl,
- scoped_ptr<RasterWorkerPool>* raster_worker_pool,
+ scoped_ptr<TileTaskWorkerPool>* tile_task_worker_pool,
scoped_ptr<ResourcePool>* resource_pool,
scoped_ptr<ResourcePool>* staging_resource_pool) {
- host_impl->LayerTreeHostImpl::CreateResourceAndRasterWorkerPool(
- raster_worker_pool, resource_pool, staging_resource_pool);
+ host_impl->LayerTreeHostImpl::CreateResourceAndTileTaskWorkerPool(
+ tile_task_worker_pool, resource_pool, staging_resource_pool);
}
class ExternalBeginFrameSourceForTest
@@ -153,9 +153,9 @@
test_hooks_->ScheduledActionBeginOutputSurfaceCreation();
}
- void ScheduledActionManageTiles() override {
- ThreadProxy::ScheduledActionManageTiles();
- test_hooks_->ScheduledActionManageTiles();
+ void ScheduledActionPrepareTiles() override {
+ ThreadProxy::ScheduledActionPrepareTiles();
+ test_hooks_->ScheduledActionPrepareTiles();
}
ThreadProxyForTest(
@@ -211,12 +211,12 @@
block_notify_ready_to_activate_for_testing_(false),
notify_ready_to_activate_was_blocked_(false) {}
- void CreateResourceAndRasterWorkerPool(
- scoped_ptr<RasterWorkerPool>* raster_worker_pool,
+ void CreateResourceAndTileTaskWorkerPool(
+ scoped_ptr<TileTaskWorkerPool>* tile_task_worker_pool,
scoped_ptr<ResourcePool>* resource_pool,
scoped_ptr<ResourcePool>* staging_resource_pool) override {
- test_hooks_->CreateResourceAndRasterWorkerPool(
- this, raster_worker_pool, resource_pool, staging_resource_pool);
+ test_hooks_->CreateResourceAndTileTaskWorkerPool(
+ this, tile_task_worker_pool, resource_pool, staging_resource_pool);
}
void WillBeginImplFrame(const BeginFrameArgs& args) override {
@@ -362,11 +362,11 @@
void ApplyViewportDeltas(const gfx::Vector2d& inner_delta,
const gfx::Vector2d& outer_delta,
+ const gfx::Vector2dF& elastic_overscroll_delta,
float page_scale,
float top_controls_delta) override {
- test_hooks_->ApplyViewportDeltas(inner_delta,
- outer_delta,
- page_scale,
+ test_hooks_->ApplyViewportDeltas(inner_delta, outer_delta,
+ elastic_overscroll_delta, page_scale,
top_controls_delta);
}
void ApplyViewportDeltas(const gfx::Vector2d& scroll_delta,
diff --git a/cc/test/layer_tree_test.h b/cc/test/layer_tree_test.h
index 863100b..4176265 100644
--- a/cc/test/layer_tree_test.h
+++ b/cc/test/layer_tree_test.h
@@ -35,9 +35,9 @@
void ReadSettings(const LayerTreeSettings& settings);
- virtual void CreateResourceAndRasterWorkerPool(
+ virtual void CreateResourceAndTileTaskWorkerPool(
LayerTreeHostImpl* host_impl,
- scoped_ptr<RasterWorkerPool>* raster_worker_pool,
+ scoped_ptr<TileTaskWorkerPool>* tile_task_worker_pool,
scoped_ptr<ResourcePool>* resource_pool,
scoped_ptr<ResourcePool>* staging_resource_pool);
virtual void WillBeginImplFrameOnThread(LayerTreeHostImpl* host_impl,
@@ -67,10 +67,12 @@
bool has_unfinished_animation) {}
virtual void WillAnimateLayers(LayerTreeHostImpl* host_impl,
base::TimeTicks monotonic_time) {}
- virtual void ApplyViewportDeltas(const gfx::Vector2d& inner_delta,
- const gfx::Vector2d& outer_delta,
- float scale,
- float top_controls_delta) {}
+ virtual void ApplyViewportDeltas(
+ const gfx::Vector2d& inner_delta,
+ const gfx::Vector2d& outer_delta,
+ const gfx::Vector2dF& elastic_overscroll_delta,
+ float scale,
+ float top_controls_delta) {}
virtual void ApplyViewportDeltas(const gfx::Vector2d& scroll_delta,
float scale,
float top_controls_delta) {}
@@ -98,7 +100,7 @@
virtual void ScheduledActionAnimate() {}
virtual void ScheduledActionCommit() {}
virtual void ScheduledActionBeginOutputSurfaceCreation() {}
- virtual void ScheduledActionManageTiles() {}
+ virtual void ScheduledActionPrepareTiles() {}
// Implementation of AnimationDelegate:
void NotifyAnimationStarted(base::TimeTicks monotonic_time,
diff --git a/cc/test/pixel_test.cc b/cc/test/pixel_test.cc
index 76966e9..aecd657 100644
--- a/cc/test/pixel_test.cc
+++ b/cc/test/pixel_test.cc
@@ -15,9 +15,9 @@
#include "cc/output/gl_renderer.h"
#include "cc/output/output_surface_client.h"
#include "cc/output/software_renderer.h"
-#include "cc/resources/raster_worker_pool.h"
#include "cc/resources/resource_provider.h"
#include "cc/resources/texture_mailbox_deleter.h"
+#include "cc/resources/tile_task_worker_pool.h"
#include "cc/test/fake_output_surface_client.h"
#include "cc/test/paths.h"
#include "cc/test/pixel_test_output_surface.h"
diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc
index 22b1196..4d03449 100644
--- a/cc/trees/layer_tree_host.cc
+++ b/cc/trees/layer_tree_host.cc
@@ -1160,9 +1160,8 @@
// TODO(ccameron): pass the elastic overscroll here so that input events
// may be translated appropriately.
client_->ApplyViewportDeltas(
- inner_viewport_scroll_delta,
- outer_viewport_scroll_delta,
- info->page_scale_delta,
+ inner_viewport_scroll_delta, outer_viewport_scroll_delta,
+ info->elastic_overscroll_delta, info->page_scale_delta,
info->top_controls_delta);
}
}
diff --git a/cc/trees/layer_tree_host_client.h b/cc/trees/layer_tree_host_client.h
index 5b02964..5846343 100644
--- a/cc/trees/layer_tree_host_client.h
+++ b/cc/trees/layer_tree_host_client.h
@@ -11,6 +11,7 @@
namespace gfx {
class Vector2d;
+class Vector2dF;
}
namespace cc {
@@ -27,10 +28,12 @@
virtual void BeginMainFrame(const BeginFrameArgs& args) = 0;
virtual void DidBeginMainFrame() = 0;
virtual void Layout() = 0;
- virtual void ApplyViewportDeltas(const gfx::Vector2d& inner_delta,
- const gfx::Vector2d& outer_delta,
- float page_scale,
- float top_controls_delta) = 0;
+ virtual void ApplyViewportDeltas(
+ const gfx::Vector2d& inner_delta,
+ const gfx::Vector2d& outer_delta,
+ const gfx::Vector2dF& elastic_overscroll_delta,
+ float page_scale,
+ float top_controls_delta) = 0;
virtual void ApplyViewportDeltas(const gfx::Vector2d& scroll_delta,
float page_scale,
float top_controls_delta) = 0;
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
index e19c9a2..dd485ba 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -47,20 +47,20 @@
#include "cc/quads/shared_quad_state.h"
#include "cc/quads/solid_color_draw_quad.h"
#include "cc/quads/texture_draw_quad.h"
-#include "cc/resources/bitmap_raster_worker_pool.h"
+#include "cc/resources/bitmap_tile_task_worker_pool.h"
#include "cc/resources/eviction_tile_priority_queue.h"
-#include "cc/resources/gpu_raster_worker_pool.h"
+#include "cc/resources/gpu_tile_task_worker_pool.h"
#include "cc/resources/memory_history.h"
-#include "cc/resources/one_copy_raster_worker_pool.h"
+#include "cc/resources/one_copy_tile_task_worker_pool.h"
#include "cc/resources/picture_layer_tiling.h"
-#include "cc/resources/pixel_buffer_raster_worker_pool.h"
+#include "cc/resources/pixel_buffer_tile_task_worker_pool.h"
#include "cc/resources/prioritized_resource_manager.h"
#include "cc/resources/raster_tile_priority_queue.h"
-#include "cc/resources/raster_worker_pool.h"
#include "cc/resources/resource_pool.h"
#include "cc/resources/texture_mailbox_deleter.h"
+#include "cc/resources/tile_task_worker_pool.h"
#include "cc/resources/ui_resource_bitmap.h"
-#include "cc/resources/zero_copy_raster_worker_pool.h"
+#include "cc/resources/zero_copy_tile_task_worker_pool.h"
#include "cc/scheduler/delay_based_time_source.h"
#include "cc/trees/damage_tracker.h"
#include "cc/trees/layer_tree_host.h"
@@ -309,7 +309,7 @@
sync_tree()->UpdateDrawProperties();
// Start working on newly created tiles immediately if needed.
if (tile_manager_ && tile_priorities_dirty_)
- ManageTiles();
+ PrepareTiles();
else
NotifyReadyToActivate();
} else {
@@ -382,16 +382,16 @@
AnimateTopControls(monotonic_time);
}
-void LayerTreeHostImpl::ManageTiles() {
+void LayerTreeHostImpl::PrepareTiles() {
if (!tile_manager_)
return;
if (!tile_priorities_dirty_)
return;
tile_priorities_dirty_ = false;
- tile_manager_->ManageTiles(global_tile_state_);
+ tile_manager_->PrepareTiles(global_tile_state_);
- client_->DidManageTiles();
+ client_->DidPrepareTiles();
}
void LayerTreeHostImpl::StartPageScaleAnimation(
@@ -1186,9 +1186,9 @@
void LayerTreeHostImpl::DidModifyTilePriorities() {
DCHECK(settings_.impl_side_painting);
- // Mark priorities as dirty and schedule a ManageTiles().
+ // Mark priorities as dirty and schedule a PrepareTiles().
tile_priorities_dirty_ = true;
- client_->SetNeedsManageTilesOnImplThread();
+ client_->SetNeedsPrepareTilesOnImplThread();
}
void LayerTreeHostImpl::GetPictureLayerImplPairs(
@@ -1857,7 +1857,7 @@
// Evict tiles immediately if invisible since this tab may never get another
// draw or timer tick.
if (!visible_)
- ManageTiles();
+ PrepareTiles();
if (!renderer_)
return;
@@ -1950,9 +1950,9 @@
DCHECK(output_surface_);
DCHECK(resource_provider_);
- CreateResourceAndRasterWorkerPool(
- &raster_worker_pool_, &resource_pool_, &staging_resource_pool_);
- DCHECK(raster_worker_pool_);
+ CreateResourceAndTileTaskWorkerPool(&tile_task_worker_pool_, &resource_pool_,
+ &staging_resource_pool_);
+ DCHECK(tile_task_worker_pool_);
DCHECK(resource_pool_);
base::SingleThreadTaskRunner* task_runner =
@@ -1962,18 +1962,16 @@
size_t scheduled_raster_task_limit =
IsSynchronousSingleThreaded() ? std::numeric_limits<size_t>::max()
: settings_.scheduled_raster_task_limit;
- tile_manager_ = TileManager::Create(this,
- task_runner,
- resource_pool_.get(),
- raster_worker_pool_->AsRasterizer(),
- rendering_stats_instrumentation_,
- scheduled_raster_task_limit);
+ tile_manager_ = TileManager::Create(
+ this, task_runner, resource_pool_.get(),
+ tile_task_worker_pool_->AsTileTaskRunner(),
+ rendering_stats_instrumentation_, scheduled_raster_task_limit);
UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy());
}
-void LayerTreeHostImpl::CreateResourceAndRasterWorkerPool(
- scoped_ptr<RasterWorkerPool>* raster_worker_pool,
+void LayerTreeHostImpl::CreateResourceAndTileTaskWorkerPool(
+ scoped_ptr<TileTaskWorkerPool>* tile_task_worker_pool,
scoped_ptr<ResourcePool>* resource_pool,
scoped_ptr<ResourcePool>* staging_resource_pool) {
base::SingleThreadTaskRunner* task_runner =
@@ -1988,10 +1986,9 @@
GL_TEXTURE_2D,
resource_provider_->best_texture_format());
- *raster_worker_pool =
- BitmapRasterWorkerPool::Create(task_runner,
- RasterWorkerPool::GetTaskGraphRunner(),
- resource_provider_.get());
+ *tile_task_worker_pool = BitmapTileTaskWorkerPool::Create(
+ task_runner, TileTaskWorkerPool::GetTaskGraphRunner(),
+ resource_provider_.get());
return;
}
@@ -2001,11 +1998,9 @@
GL_TEXTURE_2D,
resource_provider_->best_texture_format());
- *raster_worker_pool =
- GpuRasterWorkerPool::Create(task_runner,
- context_provider,
- resource_provider_.get(),
- settings_.use_distance_field_text);
+ *tile_task_worker_pool = GpuTileTaskWorkerPool::Create(
+ task_runner, context_provider, resource_provider_.get(),
+ settings_.use_distance_field_text);
return;
}
@@ -2029,10 +2024,10 @@
single_thread_synchronous_task_graph_runner_.reset(new TaskGraphRunner);
task_graph_runner = single_thread_synchronous_task_graph_runner_.get();
} else {
- task_graph_runner = RasterWorkerPool::GetTaskGraphRunner();
+ task_graph_runner = TileTaskWorkerPool::GetTaskGraphRunner();
}
- *raster_worker_pool = ZeroCopyRasterWorkerPool::Create(
+ *tile_task_worker_pool = ZeroCopyTileTaskWorkerPool::Create(
task_runner, task_graph_runner, resource_provider_.get());
return;
}
@@ -2046,9 +2041,10 @@
ResourcePool::Create(resource_provider_.get(), GL_TEXTURE_2D,
resource_provider_->best_texture_format());
- *raster_worker_pool = OneCopyRasterWorkerPool::Create(
- task_runner, RasterWorkerPool::GetTaskGraphRunner(), context_provider,
- resource_provider_.get(), staging_resource_pool_.get());
+ *tile_task_worker_pool = OneCopyTileTaskWorkerPool::Create(
+ task_runner, TileTaskWorkerPool::GetTaskGraphRunner(),
+ context_provider, resource_provider_.get(),
+ staging_resource_pool_.get());
return;
}
}
@@ -2057,8 +2053,8 @@
resource_provider_.get(), GL_TEXTURE_2D,
resource_provider_->memory_efficient_texture_format());
- *raster_worker_pool = PixelBufferRasterWorkerPool::Create(
- task_runner, RasterWorkerPool::GetTaskGraphRunner(), context_provider,
+ *tile_task_worker_pool = PixelBufferTileTaskWorkerPool::Create(
+ task_runner, TileTaskWorkerPool::GetTaskGraphRunner(), context_provider,
resource_provider_.get(),
GetMaxTransferBufferUsageBytes(context_provider->ContextCapabilities(),
settings_.renderer_settings.refresh_rate));
@@ -2068,7 +2064,7 @@
tile_manager_ = nullptr;
resource_pool_ = nullptr;
staging_resource_pool_ = nullptr;
- raster_worker_pool_ = nullptr;
+ tile_task_worker_pool_ = nullptr;
single_thread_synchronous_task_graph_runner_ = nullptr;
}
diff --git a/cc/trees/layer_tree_host_impl.h b/cc/trees/layer_tree_host_impl.h
index 1702e09..54a16aa 100644
--- a/cc/trees/layer_tree_host_impl.h
+++ b/cc/trees/layer_tree_host_impl.h
@@ -51,7 +51,7 @@
class PaintTimeCounter;
class PictureLayerImpl;
class RasterTilePriorityQueue;
-class RasterWorkerPool;
+class TileTaskWorkerPool;
class RenderPassDrawQuad;
class RenderingStatsInstrumentation;
class ResourcePool;
@@ -92,7 +92,7 @@
virtual void SetNeedsRedrawRectOnImplThread(const gfx::Rect& damage_rect) = 0;
virtual void SetNeedsAnimateOnImplThread() = 0;
virtual void SetNeedsCommitOnImplThread() = 0;
- virtual void SetNeedsManageTilesOnImplThread() = 0;
+ virtual void SetNeedsPrepareTilesOnImplThread() = 0;
virtual void PostAnimationEventsToMainThreadOnImplThread(
scoped_ptr<AnimationEventsVector> events) = 0;
// Returns true if resources were deleted by this call.
@@ -105,7 +105,7 @@
const base::Closure& start_fade,
base::TimeDelta delay) = 0;
virtual void DidActivateSyncTree() = 0;
- virtual void DidManageTiles() = 0;
+ virtual void DidPrepareTiles() = 0;
protected:
virtual ~LayerTreeHostImplClient() {}
@@ -200,7 +200,7 @@
void DidAnimateScrollOffset();
void SetViewportDamage(const gfx::Rect& damage_rect);
- virtual void ManageTiles();
+ virtual void PrepareTiles();
// Returns DRAW_SUCCESS unless problems occured preparing the frame, and we
// should try to avoid displaying the frame. If PrepareToDraw is called,
@@ -499,8 +499,8 @@
// Only valid for synchronous (non-scheduled) single-threaded case.
void SynchronouslyInitializeAllTiles();
- virtual void CreateResourceAndRasterWorkerPool(
- scoped_ptr<RasterWorkerPool>* raster_worker_pool,
+ virtual void CreateResourceAndTileTaskWorkerPool(
+ scoped_ptr<TileTaskWorkerPool>* tile_task_worker_pool,
scoped_ptr<ResourcePool>* resource_pool,
scoped_ptr<ResourcePool>* staging_resource_pool);
@@ -523,7 +523,7 @@
return animation_registrar_->active_animation_controllers();
}
- bool manage_tiles_needed() const { return tile_priorities_dirty_; }
+ bool prepare_tiles_needed() const { return tile_priorities_dirty_; }
LayerTreeHostImplClient* client_;
Proxy* proxy_;
@@ -610,7 +610,7 @@
scoped_ptr<TileManager> tile_manager_;
bool use_gpu_rasterization_;
GpuRasterizationStatus gpu_rasterization_status_;
- scoped_ptr<RasterWorkerPool> raster_worker_pool_;
+ scoped_ptr<TileTaskWorkerPool> tile_task_worker_pool_;
scoped_ptr<ResourcePool> resource_pool_;
scoped_ptr<ResourcePool> staging_resource_pool_;
scoped_ptr<Renderer> renderer_;
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc
index 3ef9445..9049a84 100644
--- a/cc/trees/layer_tree_host_impl_unittest.cc
+++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -86,7 +86,7 @@
did_request_commit_(false),
did_request_redraw_(false),
did_request_animate_(false),
- did_request_manage_tiles_(false),
+ did_request_prepare_tiles_(false),
reduce_memory_result_(true),
current_limit_bytes_(0),
current_priority_cutoff_value_(0) {
@@ -129,8 +129,8 @@
did_request_redraw_ = true;
}
void SetNeedsAnimateOnImplThread() override { did_request_animate_ = true; }
- void SetNeedsManageTilesOnImplThread() override {
- did_request_manage_tiles_ = true;
+ void SetNeedsPrepareTilesOnImplThread() override {
+ did_request_prepare_tiles_ = true;
}
void SetNeedsCommitOnImplThread() override { did_request_commit_ = true; }
void PostAnimationEventsToMainThreadOnImplThread(
@@ -149,7 +149,7 @@
requested_scrollbar_animation_delay_ = delay;
}
void DidActivateSyncTree() override {}
- void DidManageTiles() override {}
+ void DidPrepareTiles() override {}
void set_reduce_memory_result(bool reduce_memory_result) {
reduce_memory_result_ = reduce_memory_result;
@@ -390,7 +390,7 @@
bool did_request_commit_;
bool did_request_redraw_;
bool did_request_animate_;
- bool did_request_manage_tiles_;
+ bool did_request_prepare_tiles_;
bool reduce_memory_result_;
base::Closure scrollbar_fade_start_;
base::TimeDelta requested_scrollbar_animation_delay_;
@@ -6502,7 +6502,7 @@
EXPECT_TRUE(host_impl_->RequiresHighResToDraw());
}
-class LayerTreeHostImplTestManageTiles : public LayerTreeHostImplTest {
+class LayerTreeHostImplTestPrepareTiles : public LayerTreeHostImplTest {
public:
void SetUp() override {
LayerTreeSettings settings;
@@ -6518,11 +6518,11 @@
FakeLayerTreeHostImpl* fake_host_impl_;
};
-TEST_F(LayerTreeHostImplTestManageTiles, ManageTilesWhenInvisible) {
+TEST_F(LayerTreeHostImplTestPrepareTiles, PrepareTilesWhenInvisible) {
fake_host_impl_->DidModifyTilePriorities();
- EXPECT_TRUE(fake_host_impl_->manage_tiles_needed());
+ EXPECT_TRUE(fake_host_impl_->prepare_tiles_needed());
fake_host_impl_->SetVisible(false);
- EXPECT_FALSE(fake_host_impl_->manage_tiles_needed());
+ EXPECT_FALSE(fake_host_impl_->prepare_tiles_needed());
}
TEST_F(LayerTreeHostImplTest, UIResourceManagement) {
diff --git a/cc/trees/layer_tree_host_unittest.cc b/cc/trees/layer_tree_host_unittest.cc
index d70d832..06c522a 100644
--- a/cc/trees/layer_tree_host_unittest.cc
+++ b/cc/trees/layer_tree_host_unittest.cc
@@ -5496,11 +5496,11 @@
EndTest();
}
- void ApplyViewportDeltas(
- const gfx::Vector2d& inner,
- const gfx::Vector2d& outer,
- float scale_delta,
- float top_controls_delta) override {
+ void ApplyViewportDeltas(const gfx::Vector2d& inner,
+ const gfx::Vector2d& outer,
+ const gfx::Vector2dF& elastic_overscroll_delta,
+ float scale_delta,
+ float top_controls_delta) override {
EXPECT_EQ(info_.page_scale_delta, scale_delta);
EXPECT_EQ(info_.top_controls_delta, top_controls_delta);
deltas_sent_to_client_ = true;
@@ -5910,10 +5910,11 @@
MULTI_THREAD_TEST_F(LayerTreeHostTestContinuousDrawWhenCreatingVisibleTiles);
-class LayerTreeHostTestOneActivatePerManageTiles : public LayerTreeHostTest {
+class LayerTreeHostTestOneActivatePerPrepareTiles : public LayerTreeHostTest {
public:
- LayerTreeHostTestOneActivatePerManageTiles()
- : notify_ready_to_activate_count_(0u), scheduled_manage_tiles_count_(0) {}
+ LayerTreeHostTestOneActivatePerPrepareTiles()
+ : notify_ready_to_activate_count_(0u),
+ scheduled_prepare_tiles_count_(0) {}
void SetupTree() override {
client_.set_fill_with_nonsolid_color(true);
@@ -5942,27 +5943,27 @@
EndTestAfterDelayMs(100);
}
- void ScheduledActionManageTiles() override {
- ++scheduled_manage_tiles_count_;
+ void ScheduledActionPrepareTiles() override {
+ ++scheduled_prepare_tiles_count_;
}
void AfterTest() override {
- // Expect at most a notification for each scheduled manage tiles, plus one
+ // Expect at most a notification for each scheduled prepare tiles, plus one
// for the initial commit (which doesn't go through scheduled actions).
// The reason this is not an equality is because depending on timing, we
- // might get a manage tiles but not yet get a notification that we're
+ // might get a prepare tiles but not yet get a notification that we're
// ready to activate. The intent of a test is to ensure that we don't
- // get more than one notification per manage tiles, so this is OK.
+ // get more than one notification per prepare tiles, so this is OK.
EXPECT_LE(notify_ready_to_activate_count_,
- 1u + scheduled_manage_tiles_count_);
+ 1u + scheduled_prepare_tiles_count_);
}
protected:
FakeContentLayerClient client_;
size_t notify_ready_to_activate_count_;
- size_t scheduled_manage_tiles_count_;
+ size_t scheduled_prepare_tiles_count_;
};
-MULTI_THREAD_IMPL_TEST_F(LayerTreeHostTestOneActivatePerManageTiles);
+MULTI_THREAD_IMPL_TEST_F(LayerTreeHostTestOneActivatePerPrepareTiles);
} // namespace cc
diff --git a/cc/trees/layer_tree_host_unittest_no_message_loop.cc b/cc/trees/layer_tree_host_unittest_no_message_loop.cc
index a0b2bdf..1e04ad9 100644
--- a/cc/trees/layer_tree_host_unittest_no_message_loop.cc
+++ b/cc/trees/layer_tree_host_unittest_no_message_loop.cc
@@ -60,6 +60,7 @@
void Layout() override {}
void ApplyViewportDeltas(const gfx::Vector2d& inner_delta,
const gfx::Vector2d& outer_delta,
+ const gfx::Vector2dF& elastic_overscroll_delta,
float page_scale,
float top_controls_delta) override {}
void ApplyViewportDeltas(const gfx::Vector2d& scroll_delta,
diff --git a/cc/trees/layer_tree_settings.cc b/cc/trees/layer_tree_settings.cc
index 508e7ea..d8d8728 100644
--- a/cc/trees/layer_tree_settings.cc
+++ b/cc/trees/layer_tree_settings.cc
@@ -54,7 +54,7 @@
use_pinch_virtual_viewport(false),
// At 256x256 tiles, 128 tiles cover an area of 2048x4096 pixels.
max_tiles_for_interest_area(128),
- skewport_target_time_multiplier(1.0f),
+ skewport_target_time_in_seconds(1.0f),
skewport_extrapolation_limit_in_content_pixels(2000),
max_unused_resource_memory_percentage(100),
max_memory_for_prepaint_percentage(100),
diff --git a/cc/trees/layer_tree_settings.h b/cc/trees/layer_tree_settings.h
index 1892b39..b847d1f 100644
--- a/cc/trees/layer_tree_settings.h
+++ b/cc/trees/layer_tree_settings.h
@@ -65,7 +65,7 @@
bool use_pinch_zoom_scrollbars;
bool use_pinch_virtual_viewport;
size_t max_tiles_for_interest_area;
- float skewport_target_time_multiplier;
+ float skewport_target_time_in_seconds;
int skewport_extrapolation_limit_in_content_pixels;
size_t max_unused_resource_memory_percentage;
size_t max_memory_for_prepaint_percentage;
diff --git a/cc/trees/single_thread_proxy.cc b/cc/trees/single_thread_proxy.cc
index dfce808..b1248e0 100644
--- a/cc/trees/single_thread_proxy.cc
+++ b/cc/trees/single_thread_proxy.cc
@@ -372,10 +372,10 @@
scheduler_on_impl_thread_->SetNeedsAnimate();
}
-void SingleThreadProxy::SetNeedsManageTilesOnImplThread() {
- TRACE_EVENT0("cc", "SingleThreadProxy::SetNeedsManageTilesOnImplThread");
+void SingleThreadProxy::SetNeedsPrepareTilesOnImplThread() {
+ TRACE_EVENT0("cc", "SingleThreadProxy::SetNeedsPrepareTilesOnImplThread");
if (scheduler_on_impl_thread_)
- scheduler_on_impl_thread_->SetNeedsManageTiles();
+ scheduler_on_impl_thread_->SetNeedsPrepareTiles();
}
void SingleThreadProxy::SetNeedsRedrawRectOnImplThread(
@@ -438,11 +438,11 @@
timing_history_.DidActivateSyncTree();
}
-void SingleThreadProxy::DidManageTiles() {
+void SingleThreadProxy::DidPrepareTiles() {
DCHECK(layer_tree_host_impl_->settings().impl_side_painting);
DCHECK(Proxy::IsImplThread());
if (scheduler_on_impl_thread_)
- scheduler_on_impl_thread_->DidManageTiles();
+ scheduler_on_impl_thread_->DidPrepareTiles();
}
void SingleThreadProxy::UpdateRendererCapabilitiesOnImplThread() {
@@ -507,7 +507,7 @@
if (layer_tree_host_impl_->settings().impl_side_painting) {
layer_tree_host_impl_->ActivateSyncTree();
layer_tree_host_impl_->active_tree()->UpdateDrawProperties();
- layer_tree_host_impl_->ManageTiles();
+ layer_tree_host_impl_->PrepareTiles();
layer_tree_host_impl_->SynchronouslyInitializeAllTiles();
}
@@ -771,11 +771,11 @@
}
}
-void SingleThreadProxy::ScheduledActionManageTiles() {
- TRACE_EVENT0("cc", "SingleThreadProxy::ScheduledActionManageTiles");
+void SingleThreadProxy::ScheduledActionPrepareTiles() {
+ TRACE_EVENT0("cc", "SingleThreadProxy::ScheduledActionPrepareTiles");
DCHECK(layer_tree_host_impl_->settings().impl_side_painting);
DebugScopedSetImplThread impl(this);
- layer_tree_host_impl_->ManageTiles();
+ layer_tree_host_impl_->PrepareTiles();
}
void SingleThreadProxy::DidAnticipatedDrawTimeChange(base::TimeTicks time) {
diff --git a/cc/trees/single_thread_proxy.h b/cc/trees/single_thread_proxy.h
index 3eba6bb..d3f41a5 100644
--- a/cc/trees/single_thread_proxy.h
+++ b/cc/trees/single_thread_proxy.h
@@ -70,7 +70,7 @@
void ScheduledActionAnimate() override;
void ScheduledActionActivateSyncTree() override;
void ScheduledActionBeginOutputSurfaceCreation() override;
- void ScheduledActionManageTiles() override;
+ void ScheduledActionPrepareTiles() override;
void DidAnticipatedDrawTimeChange(base::TimeTicks time) override;
base::TimeDelta DrawDurationEstimate() override;
base::TimeDelta BeginMainFrameToCommitDurationEstimate() override;
@@ -93,7 +93,7 @@
void SetNeedsRedrawOnImplThread() override;
void SetNeedsRedrawRectOnImplThread(const gfx::Rect& dirty_rect) override;
void SetNeedsAnimateOnImplThread() override;
- void SetNeedsManageTilesOnImplThread() override;
+ void SetNeedsPrepareTilesOnImplThread() override;
void SetNeedsCommitOnImplThread() override;
void PostAnimationEventsToMainThreadOnImplThread(
scoped_ptr<AnimationEventsVector> events) override;
@@ -104,7 +104,7 @@
void PostDelayedScrollbarFadeOnImplThread(const base::Closure& start_fade,
base::TimeDelta delay) override {}
void DidActivateSyncTree() override;
- void DidManageTiles() override;
+ void DidPrepareTiles() override;
void SetDebugState(const LayerTreeDebugState& debug_state) override {}
void RequestNewOutputSurface();
diff --git a/cc/trees/thread_proxy.cc b/cc/trees/thread_proxy.cc
index 4793cc5..e6ab017 100644
--- a/cc/trees/thread_proxy.cc
+++ b/cc/trees/thread_proxy.cc
@@ -81,10 +81,11 @@
commit_requested(false),
commit_request_sent_to_impl_thread(false),
started(false),
- manage_tiles_pending(false),
+ prepare_tiles_pending(false),
can_cancel_commit(true),
defer_commits(false),
- weak_factory(proxy) {}
+ weak_factory(proxy) {
+}
ThreadProxy::MainThreadOnly::~MainThreadOnly() {}
@@ -468,9 +469,9 @@
impl().scheduler->SetNeedsAnimate();
}
-void ThreadProxy::SetNeedsManageTilesOnImplThread() {
+void ThreadProxy::SetNeedsPrepareTilesOnImplThread() {
DCHECK(IsImplThread());
- impl().scheduler->SetNeedsManageTiles();
+ impl().scheduler->SetNeedsPrepareTiles();
}
void ThreadProxy::SetNeedsRedrawRectOnImplThread(const gfx::Rect& damage_rect) {
@@ -1050,10 +1051,10 @@
return result;
}
-void ThreadProxy::ScheduledActionManageTiles() {
- TRACE_EVENT0("cc", "ThreadProxy::ScheduledActionManageTiles");
+void ThreadProxy::ScheduledActionPrepareTiles() {
+ TRACE_EVENT0("cc", "ThreadProxy::ScheduledActionPrepareTiles");
DCHECK(impl().layer_tree_host_impl->settings().impl_side_painting);
- impl().layer_tree_host_impl->ManageTiles();
+ impl().layer_tree_host_impl->PrepareTiles();
}
DrawResult ThreadProxy::ScheduledActionDrawAndSwapIfPossible() {
@@ -1342,9 +1343,9 @@
impl().timing_history.DidActivateSyncTree();
}
-void ThreadProxy::DidManageTiles() {
+void ThreadProxy::DidPrepareTiles() {
DCHECK(IsImplThread());
- impl().scheduler->DidManageTiles();
+ impl().scheduler->DidPrepareTiles();
}
} // namespace cc
diff --git a/cc/trees/thread_proxy.h b/cc/trees/thread_proxy.h
index d6d53a8..14733f7 100644
--- a/cc/trees/thread_proxy.h
+++ b/cc/trees/thread_proxy.h
@@ -72,7 +72,7 @@
bool commit_request_sent_to_impl_thread;
bool started;
- bool manage_tiles_pending;
+ bool prepare_tiles_pending;
bool can_cancel_commit;
bool defer_commits;
@@ -195,7 +195,7 @@
void SetNeedsRedrawOnImplThread() override;
void SetNeedsRedrawRectOnImplThread(const gfx::Rect& dirty_rect) override;
void SetNeedsAnimateOnImplThread() override;
- void SetNeedsManageTilesOnImplThread() override;
+ void SetNeedsPrepareTilesOnImplThread() override;
void SetNeedsCommitOnImplThread() override;
void PostAnimationEventsToMainThreadOnImplThread(
scoped_ptr<AnimationEventsVector> queue) override;
@@ -206,7 +206,7 @@
void PostDelayedScrollbarFadeOnImplThread(const base::Closure& start_fade,
base::TimeDelta delay) override;
void DidActivateSyncTree() override;
- void DidManageTiles() override;
+ void DidPrepareTiles() override;
// SchedulerClient implementation
void WillBeginImplFrame(const BeginFrameArgs& args) override;
@@ -217,7 +217,7 @@
void ScheduledActionCommit() override;
void ScheduledActionActivateSyncTree() override;
void ScheduledActionBeginOutputSurfaceCreation() override;
- void ScheduledActionManageTiles() override;
+ void ScheduledActionPrepareTiles() override;
void DidAnticipatedDrawTimeChange(base::TimeTicks time) override;
base::TimeDelta DrawDurationEstimate() override;
base::TimeDelta BeginMainFrameToCommitDurationEstimate() override;
diff --git a/crypto/p224_spake.cc b/crypto/p224_spake.cc
index f20b10c..05fe68c 100644
--- a/crypto/p224_spake.cc
+++ b/crypto/p224_spake.cc
@@ -7,6 +7,8 @@
#include <crypto/p224_spake.h>
+#include <algorithm>
+
#include <base/logging.h>
#include <crypto/p224.h>
#include <crypto/random.h>
@@ -105,14 +107,18 @@
// x_ is a random scalar.
RandBytes(x_, sizeof(x_));
- // X = g**x_
- p224::Point X;
- p224::ScalarBaseMult(x_, &X);
-
// Calculate |password| hash to get SPAKE password value.
SHA256HashString(std::string(password.data(), password.length()),
pw_, sizeof(pw_));
+ Init();
+}
+
+void P224EncryptedKeyExchange::Init() {
+ // X = g**x_
+ p224::Point X;
+ p224::ScalarBaseMult(x_, &X);
+
// The client masks the Diffie-Hellman value, X, by adding M**pw and the
// server uses N**pw.
p224::Point MNpw;
@@ -253,4 +259,10 @@
return key_;
}
+void P224EncryptedKeyExchange::SetXForTesting(const std::string& x) {
+ memset(&x_, 0, sizeof(x_));
+ memcpy(&x_, x.data(), std::min(x.size(), sizeof(x_)));
+ Init();
+}
+
} // namespace crypto
diff --git a/crypto/p224_spake.h b/crypto/p224_spake.h
index 61451a3..08769b7 100644
--- a/crypto/p224_spake.h
+++ b/crypto/p224_spake.h
@@ -5,6 +5,7 @@
#ifndef CRYPTO_P224_SPAKE_H_
#define CRYPTO_P224_SPAKE_H_
+#include <base/gtest_prod_util.h>
#include <base/strings/string_piece.h>
#include <crypto/p224.h>
#include <crypto/sha2.h>
@@ -14,7 +15,7 @@
// P224EncryptedKeyExchange implements SPAKE2, a variant of Encrypted
// Key Exchange. It allows two parties that have a secret common
// password to establish a common secure key by exchanging messages
-// over unsecure channel without disclosing the password.
+// over an insecure channel without disclosing the password.
//
// The password can be low entropy as authenticating with an attacker only
// gives the attacker a one-shot password oracle. No other information about
@@ -85,6 +86,13 @@
kStateDone,
};
+ FRIEND_TEST_ALL_PREFIXES(MutualAuth, ExpectedValues);
+
+ void Init();
+
+ // Sets internal random scalar. Should be used by tests only.
+ void SetXForTesting(const std::string& x);
+
State state_;
const bool is_server_;
// next_message_ contains a value for GetMessage() to return.
@@ -104,7 +112,7 @@
// file).
uint8 x_[p224::kScalarBytes];
// pw_ is SHA256(P(password), P(session))[:28] where P() prepends a uint32,
- // big-endian length prefix (see paper refereneced in .cc file).
+ // big-endian length prefix (see paper referenced in .cc file).
uint8 pw_[p224::kScalarBytes];
// expected_authenticator_ is used to store the hash value expected from the
// other party.
diff --git a/crypto/p224_spake_unittest.cc b/crypto/p224_spake_unittest.cc
index 6651c8d..6dd8e88 100644
--- a/crypto/p224_spake_unittest.cc
+++ b/crypto/p224_spake_unittest.cc
@@ -2,16 +2,22 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include "crypto/p224_spake.h"
+
#include <string>
-#include <crypto/p224_spake.h>
#include "base/logging.h"
+#include "base/strings/string_number_conversions.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace crypto {
namespace {
+std::string HexEncodeString(const std::string& binary_data) {
+ return base::HexEncode(binary_data.c_str(), binary_data.size());
+}
+
bool RunExchange(P224EncryptedKeyExchange* client,
P224EncryptedKeyExchange* server,
bool is_password_same) {
@@ -71,6 +77,42 @@
EXPECT_FALSE(RunExchange(&client, &server, false));
}
+TEST(MutualAuth, ExpectedValues) {
+ P224EncryptedKeyExchange client(P224EncryptedKeyExchange::kPeerTypeClient,
+ kPassword);
+ client.SetXForTesting("Client x");
+ P224EncryptedKeyExchange server(P224EncryptedKeyExchange::kPeerTypeServer,
+ kPassword);
+ server.SetXForTesting("Server x");
+
+ std::string client_message = client.GetMessage();
+ EXPECT_EQ(
+ "3508EF7DECC8AB9F9C439FBB0154288BBECC0A82E8448F4CF29554EB"
+ "BE9D486686226255EAD1D077C635B1A41F46AC91D7F7F32CED9EC3E0",
+ HexEncodeString(client_message));
+
+ std::string server_message = server.GetMessage();
+ EXPECT_EQ(
+ "A3088C18B75D2C2B107105661AEC85424777475EB29F1DDFB8C14AFB"
+ "F1603D0DF38413A00F420ACF2059E7997C935F5A957A193D09A2B584",
+ HexEncodeString(server_message));
+
+ EXPECT_EQ(P224EncryptedKeyExchange::kResultPending,
+ client.ProcessMessage(server_message));
+ EXPECT_EQ(P224EncryptedKeyExchange::kResultPending,
+ server.ProcessMessage(client_message));
+
+ EXPECT_EQ(client.GetUnverifiedKey(), server.GetUnverifiedKey());
+ // Must stay the same. External implementations should be able to pair with.
+ EXPECT_EQ(
+ "CE7CCFC435CDA4F01EC8826788B1F8B82EF7D550A34696B371096E64"
+ "C487D4FE193F7D1A6FF6820BC7F807796BA3889E8F999BBDEFC32FFA",
+ HexEncodeString(server.GetUnverifiedKey()));
+
+ EXPECT_TRUE(RunExchange(&client, &server, true));
+ EXPECT_EQ(client.GetKey(), server.GetKey());
+}
+
TEST(MutualAuth, Fuzz) {
static const unsigned kIterations = 40;
diff --git a/gpu/GLES2/gl2chromium_autogen.h b/gpu/GLES2/gl2chromium_autogen.h
index 454c67b..d35de42 100644
--- a/gpu/GLES2/gl2chromium_autogen.h
+++ b/gpu/GLES2/gl2chromium_autogen.h
@@ -268,6 +268,7 @@
#define glDiscardBackbufferCHROMIUM GLES2_GET_FUN(DiscardBackbufferCHROMIUM)
#define glScheduleOverlayPlaneCHROMIUM \
GLES2_GET_FUN(ScheduleOverlayPlaneCHROMIUM)
+#define glSwapInterval GLES2_GET_FUN(SwapInterval)
#define glMatrixLoadfCHROMIUM GLES2_GET_FUN(MatrixLoadfCHROMIUM)
#define glMatrixLoadIdentityCHROMIUM GLES2_GET_FUN(MatrixLoadIdentityCHROMIUM)
#define glBlendBarrierKHR GLES2_GET_FUN(BlendBarrierKHR)
diff --git a/gpu/command_buffer/build_gles2_cmd_buffer.py b/gpu/command_buffer/build_gles2_cmd_buffer.py
index b057477..0b86db6 100755
--- a/gpu/command_buffer/build_gles2_cmd_buffer.py
+++ b/gpu/command_buffer/build_gles2_cmd_buffer.py
@@ -2206,6 +2206,14 @@
'extension': True,
'trace_level': 1,
},
+ 'SwapInterval': {
+ 'impl_func': False,
+ 'decoder_func': 'DoSwapInterval',
+ 'unit_test': False,
+ 'client_test': False,
+ 'extension': True,
+ 'trace_level': 1,
+ },
'TexImage2D': {
'type': 'Manual',
'data_transfer_methods': ['shm'],
@@ -2703,7 +2711,7 @@
'type': 'Custom',
'impl_func': False,
'client_test': False,
- 'cmd_args': 'GLuint bucket_id',
+ 'cmd_args': 'GLuint category_bucket_id, GLuint name_bucket_id',
'extension': True,
'chromium': True,
},
diff --git a/gpu/command_buffer/client/gles2_c_lib_autogen.h b/gpu/command_buffer/client/gles2_c_lib_autogen.h
index c1a1114..766ce56 100644
--- a/gpu/command_buffer/client/gles2_c_lib_autogen.h
+++ b/gpu/command_buffer/client/gles2_c_lib_autogen.h
@@ -1010,8 +1010,9 @@
void GLES2ReleaseTexImage2DCHROMIUM(GLenum target, GLint imageId) {
gles2::GetGLContext()->ReleaseTexImage2DCHROMIUM(target, imageId);
}
-void GLES2TraceBeginCHROMIUM(const char* name) {
- gles2::GetGLContext()->TraceBeginCHROMIUM(name);
+void GLES2TraceBeginCHROMIUM(const char* category_name,
+ const char* trace_name) {
+ gles2::GetGLContext()->TraceBeginCHROMIUM(category_name, trace_name);
}
void GLES2TraceEndCHROMIUM() {
gles2::GetGLContext()->TraceEndCHROMIUM();
@@ -1082,6 +1083,9 @@
plane_z_order, plane_transform, overlay_texture_id, bounds_x, bounds_y,
bounds_width, bounds_height, uv_x, uv_y, uv_width, uv_height);
}
+void GLES2SwapInterval(GLint interval) {
+ gles2::GetGLContext()->SwapInterval(interval);
+}
void GLES2MatrixLoadfCHROMIUM(GLenum matrixMode, const GLfloat* m) {
gles2::GetGLContext()->MatrixLoadfCHROMIUM(matrixMode, m);
}
@@ -2070,6 +2074,10 @@
reinterpret_cast<GLES2FunctionPointer>(glScheduleOverlayPlaneCHROMIUM),
},
{
+ "glSwapInterval",
+ reinterpret_cast<GLES2FunctionPointer>(glSwapInterval),
+ },
+ {
"glMatrixLoadfCHROMIUM",
reinterpret_cast<GLES2FunctionPointer>(glMatrixLoadfCHROMIUM),
},
diff --git a/gpu/command_buffer/client/gles2_cmd_helper_autogen.h b/gpu/command_buffer/client/gles2_cmd_helper_autogen.h
index dc43a41..7b2faae 100644
--- a/gpu/command_buffer/client/gles2_cmd_helper_autogen.h
+++ b/gpu/command_buffer/client/gles2_cmd_helper_autogen.h
@@ -2021,11 +2021,11 @@
}
}
-void TraceBeginCHROMIUM(GLuint bucket_id) {
+void TraceBeginCHROMIUM(GLuint category_bucket_id, GLuint name_bucket_id) {
gles2::cmds::TraceBeginCHROMIUM* c =
GetCmdSpace<gles2::cmds::TraceBeginCHROMIUM>();
if (c) {
- c->Init(bucket_id);
+ c->Init(category_bucket_id, name_bucket_id);
}
}
@@ -2163,6 +2163,13 @@
}
}
+void SwapInterval(GLint interval) {
+ gles2::cmds::SwapInterval* c = GetCmdSpace<gles2::cmds::SwapInterval>();
+ if (c) {
+ c->Init(interval);
+ }
+}
+
void MatrixLoadfCHROMIUMImmediate(GLenum matrixMode, const GLfloat* m) {
const uint32_t size =
gles2::cmds::MatrixLoadfCHROMIUMImmediate::ComputeSize();
diff --git a/gpu/command_buffer/client/gles2_implementation.cc b/gpu/command_buffer/client/gles2_implementation.cc
index 4c148e9..19a005f 100644
--- a/gpu/command_buffer/client/gles2_implementation.cc
+++ b/gpu/command_buffer/client/gles2_implementation.cc
@@ -873,6 +873,13 @@
}
}
+void GLES2Implementation::SwapInterval(int interval) {
+ GPU_CLIENT_SINGLE_THREAD_CHECK();
+ GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glSwapInterval("
+ << interval << ")");
+ helper_->SwapInterval(interval);
+}
+
void GLES2Implementation::BindAttribLocation(
GLuint program, GLuint index, const char* name) {
GPU_CLIENT_SINGLE_THREAD_CHECK();
@@ -3477,32 +3484,38 @@
debug_marker_manager_.PopGroup();
}
-void GLES2Implementation::TraceBeginCHROMIUM(const char* name) {
+void GLES2Implementation::TraceBeginCHROMIUM(
+ const char* category_name, const char* trace_name) {
GPU_CLIENT_SINGLE_THREAD_CHECK();
GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glTraceBeginCHROMIUM("
- << name << ")");
- if (current_trace_name_.get()) {
+ << category_name << ", " << trace_name << ")");
+ if (current_trace_category_.get() || current_trace_name_.get()) {
SetGLError(GL_INVALID_OPERATION, "glTraceBeginCHROMIUM",
"trace already running");
return;
}
- TRACE_EVENT_COPY_ASYNC_BEGIN0("gpu", name, this);
- SetBucketAsCString(kResultBucketId, name);
- helper_->TraceBeginCHROMIUM(kResultBucketId);
+ TRACE_EVENT_COPY_ASYNC_BEGIN0(category_name, trace_name, this);
+ SetBucketAsCString(kResultBucketId, category_name);
+ SetBucketAsCString(kResultBucketId + 1, category_name);
+ helper_->TraceBeginCHROMIUM(kResultBucketId, kResultBucketId + 1);
helper_->SetBucketSize(kResultBucketId, 0);
- current_trace_name_.reset(new std::string(name));
+ helper_->SetBucketSize(kResultBucketId + 1, 0);
+ current_trace_category_.reset(new std::string(category_name));
+ current_trace_name_.reset(new std::string(trace_name));
}
void GLES2Implementation::TraceEndCHROMIUM() {
GPU_CLIENT_SINGLE_THREAD_CHECK();
GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glTraceEndCHROMIUM(" << ")");
- if (!current_trace_name_.get()) {
+ if (!current_trace_category_.get() || !current_trace_name_.get()) {
SetGLError(GL_INVALID_OPERATION, "glTraceEndCHROMIUM",
"missing begin trace");
return;
}
helper_->TraceEndCHROMIUM();
- TRACE_EVENT_COPY_ASYNC_END0("gpu", current_trace_name_->c_str(), this);
+ TRACE_EVENT_COPY_ASYNC_END0(current_trace_category_->c_str(),
+ current_trace_name_->c_str(), this);
+ current_trace_category_.reset();
current_trace_name_.reset();
}
diff --git a/gpu/command_buffer/client/gles2_implementation.h b/gpu/command_buffer/client/gles2_implementation.h
index df6e014..e473006 100644
--- a/gpu/command_buffer/client/gles2_implementation.h
+++ b/gpu/command_buffer/client/gles2_implementation.h
@@ -717,6 +717,7 @@
GLES2ImplementationErrorMessageCallback* error_message_callback_;
+ scoped_ptr<std::string> current_trace_category_;
scoped_ptr<std::string> current_trace_name_;
GpuControl* gpu_control_;
diff --git a/gpu/command_buffer/client/gles2_implementation_autogen.h b/gpu/command_buffer/client/gles2_implementation_autogen.h
index 48bccd5..7d03d88 100644
--- a/gpu/command_buffer/client/gles2_implementation_autogen.h
+++ b/gpu/command_buffer/client/gles2_implementation_autogen.h
@@ -751,7 +751,8 @@
void ReleaseTexImage2DCHROMIUM(GLenum target, GLint imageId) override;
-void TraceBeginCHROMIUM(const char* name) override;
+void TraceBeginCHROMIUM(const char* category_name,
+ const char* trace_name) override;
void TraceEndCHROMIUM() override;
@@ -805,6 +806,8 @@
GLfloat uv_width,
GLfloat uv_height) override;
+void SwapInterval(GLint interval) override;
+
void MatrixLoadfCHROMIUM(GLenum matrixMode, const GLfloat* m) override;
void MatrixLoadIdentityCHROMIUM(GLenum matrixMode) override;
diff --git a/gpu/command_buffer/client/gles2_interface_autogen.h b/gpu/command_buffer/client/gles2_interface_autogen.h
index 5970747..f6317bb 100644
--- a/gpu/command_buffer/client/gles2_interface_autogen.h
+++ b/gpu/command_buffer/client/gles2_interface_autogen.h
@@ -543,7 +543,8 @@
GLenum subscription) = 0;
virtual void BindTexImage2DCHROMIUM(GLenum target, GLint imageId) = 0;
virtual void ReleaseTexImage2DCHROMIUM(GLenum target, GLint imageId) = 0;
-virtual void TraceBeginCHROMIUM(const char* name) = 0;
+virtual void TraceBeginCHROMIUM(const char* category_name,
+ const char* trace_name) = 0;
virtual void TraceEndCHROMIUM() = 0;
virtual void AsyncTexSubImage2DCHROMIUM(GLenum target,
GLint level,
@@ -584,6 +585,7 @@
GLfloat uv_y,
GLfloat uv_width,
GLfloat uv_height) = 0;
+virtual void SwapInterval(GLint interval) = 0;
virtual void MatrixLoadfCHROMIUM(GLenum matrixMode, const GLfloat* m) = 0;
virtual void MatrixLoadIdentityCHROMIUM(GLenum matrixMode) = 0;
virtual void BlendBarrierKHR() = 0;
diff --git a/gpu/command_buffer/client/gles2_interface_stub_autogen.h b/gpu/command_buffer/client/gles2_interface_stub_autogen.h
index 01a7e07..cbab14f 100644
--- a/gpu/command_buffer/client/gles2_interface_stub_autogen.h
+++ b/gpu/command_buffer/client/gles2_interface_stub_autogen.h
@@ -529,7 +529,8 @@
GLenum subscription) override;
void BindTexImage2DCHROMIUM(GLenum target, GLint imageId) override;
void ReleaseTexImage2DCHROMIUM(GLenum target, GLint imageId) override;
-void TraceBeginCHROMIUM(const char* name) override;
+void TraceBeginCHROMIUM(const char* category_name,
+ const char* trace_name) override;
void TraceEndCHROMIUM() override;
void AsyncTexSubImage2DCHROMIUM(GLenum target,
GLint level,
@@ -570,6 +571,7 @@
GLfloat uv_y,
GLfloat uv_width,
GLfloat uv_height) override;
+void SwapInterval(GLint interval) override;
void MatrixLoadfCHROMIUM(GLenum matrixMode, const GLfloat* m) override;
void MatrixLoadIdentityCHROMIUM(GLenum matrixMode) override;
void BlendBarrierKHR() override;
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 a5797f0..c3d2803 100644
--- a/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h
+++ b/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h
@@ -932,7 +932,8 @@
void GLES2InterfaceStub::ReleaseTexImage2DCHROMIUM(GLenum /* target */,
GLint /* imageId */) {
}
-void GLES2InterfaceStub::TraceBeginCHROMIUM(const char* /* name */) {
+void GLES2InterfaceStub::TraceBeginCHROMIUM(const char* /* category_name */,
+ const char* /* trace_name */) {
}
void GLES2InterfaceStub::TraceEndCHROMIUM() {
}
@@ -991,6 +992,8 @@
GLfloat /* uv_width */,
GLfloat /* uv_height */) {
}
+void GLES2InterfaceStub::SwapInterval(GLint /* interval */) {
+}
void GLES2InterfaceStub::MatrixLoadfCHROMIUM(GLenum /* matrixMode */,
const GLfloat* /* m */) {
}
diff --git a/gpu/command_buffer/client/gles2_trace_implementation_autogen.h b/gpu/command_buffer/client/gles2_trace_implementation_autogen.h
index b88ec6a..f952d58 100644
--- a/gpu/command_buffer/client/gles2_trace_implementation_autogen.h
+++ b/gpu/command_buffer/client/gles2_trace_implementation_autogen.h
@@ -529,7 +529,8 @@
GLenum subscription) override;
void BindTexImage2DCHROMIUM(GLenum target, GLint imageId) override;
void ReleaseTexImage2DCHROMIUM(GLenum target, GLint imageId) override;
-void TraceBeginCHROMIUM(const char* name) override;
+void TraceBeginCHROMIUM(const char* category_name,
+ const char* trace_name) override;
void TraceEndCHROMIUM() override;
void AsyncTexSubImage2DCHROMIUM(GLenum target,
GLint level,
@@ -570,6 +571,7 @@
GLfloat uv_y,
GLfloat uv_width,
GLfloat uv_height) override;
+void SwapInterval(GLint interval) override;
void MatrixLoadfCHROMIUM(GLenum matrixMode, const GLfloat* m) override;
void MatrixLoadIdentityCHROMIUM(GLenum matrixMode) override;
void BlendBarrierKHR() override;
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 70729c3..c9f8b93 100644
--- a/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h
+++ b/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h
@@ -1612,9 +1612,10 @@
gl_->ReleaseTexImage2DCHROMIUM(target, imageId);
}
-void GLES2TraceImplementation::TraceBeginCHROMIUM(const char* name) {
+void GLES2TraceImplementation::TraceBeginCHROMIUM(const char* category_name,
+ const char* trace_name) {
TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::TraceBeginCHROMIUM");
- gl_->TraceBeginCHROMIUM(name);
+ gl_->TraceBeginCHROMIUM(category_name, trace_name);
}
void GLES2TraceImplementation::TraceEndCHROMIUM() {
@@ -1717,6 +1718,11 @@
bounds_width, bounds_height, uv_x, uv_y, uv_width, uv_height);
}
+void GLES2TraceImplementation::SwapInterval(GLint interval) {
+ TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::SwapInterval");
+ gl_->SwapInterval(interval);
+}
+
void GLES2TraceImplementation::MatrixLoadfCHROMIUM(GLenum matrixMode,
const GLfloat* m) {
TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::MatrixLoadfCHROMIUM");
diff --git a/gpu/command_buffer/cmd_buffer_functions.txt b/gpu/command_buffer/cmd_buffer_functions.txt
index 03b851f..f0b1627 100644
--- a/gpu/command_buffer/cmd_buffer_functions.txt
+++ b/gpu/command_buffer/cmd_buffer_functions.txt
@@ -236,7 +236,7 @@
GL_APICALL void GL_APIENTRY glUniformValuebufferCHROMIUM (GLintUniformLocation location, GLenumValueBufferTarget target, GLenumSubscriptionTarget subscription);
GL_APICALL void GL_APIENTRY glBindTexImage2DCHROMIUM (GLenumTextureBindTarget target, GLint imageId);
GL_APICALL void GL_APIENTRY glReleaseTexImage2DCHROMIUM (GLenumTextureBindTarget target, GLint imageId);
-GL_APICALL void GL_APIENTRY glTraceBeginCHROMIUM (const char* name);
+GL_APICALL void GL_APIENTRY glTraceBeginCHROMIUM (const char* category_name, const char* trace_name);
GL_APICALL void GL_APIENTRY glTraceEndCHROMIUM (void);
GL_APICALL void GL_APIENTRY glAsyncTexSubImage2DCHROMIUM (GLenumTextureTarget target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenumTextureFormat format, GLenumPixelType type, const void* data);
GL_APICALL void GL_APIENTRY glAsyncTexImage2DCHROMIUM (GLenumTextureTarget target, GLint level, GLenumTextureInternalFormat internalformat, GLsizei width, GLsizei height, GLintTextureBorder border, GLenumTextureFormat format, GLenumPixelType type, const void* pixels);
@@ -249,6 +249,7 @@
GL_APICALL void GL_APIENTRY glDrawBuffersEXT (GLsizei count, const GLenum* bufs);
GL_APICALL void GL_APIENTRY glDiscardBackbufferCHROMIUM (void);
GL_APICALL void GL_APIENTRY glScheduleOverlayPlaneCHROMIUM (GLint plane_z_order, GLenum plane_transform, GLuint overlay_texture_id, GLint bounds_x, GLint bounds_y, GLint bounds_width, GLint bounds_height, GLfloat uv_x, GLfloat uv_y, GLfloat uv_width, GLfloat uv_height);
+GL_APICALL void GL_APIENTRY glSwapInterval (GLint interval);
// Extension CHROMIUM_path_rendering.
GL_APICALL void GL_APIENTRY glMatrixLoadfCHROMIUM (GLenumMatrixMode matrixMode, const GLfloat* m);
diff --git a/gpu/command_buffer/common/gles2_cmd_format_autogen.h b/gpu/command_buffer/common/gles2_cmd_format_autogen.h
index 923d5a1..bdee4e6 100644
--- a/gpu/command_buffer/common/gles2_cmd_format_autogen.h
+++ b/gpu/command_buffer/common/gles2_cmd_format_autogen.h
@@ -9746,26 +9746,30 @@
void SetHeader() { header.SetCmd<ValueType>(); }
- void Init(GLuint _bucket_id) {
+ void Init(GLuint _category_bucket_id, GLuint _name_bucket_id) {
SetHeader();
- bucket_id = _bucket_id;
+ category_bucket_id = _category_bucket_id;
+ name_bucket_id = _name_bucket_id;
}
- void* Set(void* cmd, GLuint _bucket_id) {
- static_cast<ValueType*>(cmd)->Init(_bucket_id);
+ void* Set(void* cmd, GLuint _category_bucket_id, GLuint _name_bucket_id) {
+ static_cast<ValueType*>(cmd)->Init(_category_bucket_id, _name_bucket_id);
return NextCmdAddress<ValueType>(cmd);
}
gpu::CommandHeader header;
- uint32_t bucket_id;
+ uint32_t category_bucket_id;
+ uint32_t name_bucket_id;
};
-COMPILE_ASSERT(sizeof(TraceBeginCHROMIUM) == 8,
- Sizeof_TraceBeginCHROMIUM_is_not_8);
+COMPILE_ASSERT(sizeof(TraceBeginCHROMIUM) == 12,
+ Sizeof_TraceBeginCHROMIUM_is_not_12);
COMPILE_ASSERT(offsetof(TraceBeginCHROMIUM, header) == 0,
OffsetOf_TraceBeginCHROMIUM_header_not_0);
-COMPILE_ASSERT(offsetof(TraceBeginCHROMIUM, bucket_id) == 4,
- OffsetOf_TraceBeginCHROMIUM_bucket_id_not_4);
+COMPILE_ASSERT(offsetof(TraceBeginCHROMIUM, category_bucket_id) == 4,
+ OffsetOf_TraceBeginCHROMIUM_category_bucket_id_not_4);
+COMPILE_ASSERT(offsetof(TraceBeginCHROMIUM, name_bucket_id) == 8,
+ OffsetOf_TraceBeginCHROMIUM_name_bucket_id_not_8);
struct TraceEndCHROMIUM {
typedef TraceEndCHROMIUM ValueType;
@@ -10351,6 +10355,38 @@
COMPILE_ASSERT(offsetof(ScheduleOverlayPlaneCHROMIUM, uv_height) == 44,
OffsetOf_ScheduleOverlayPlaneCHROMIUM_uv_height_not_44);
+struct SwapInterval {
+ typedef SwapInterval ValueType;
+ static const CommandId kCmdId = kSwapInterval;
+ static const cmd::ArgFlags kArgFlags = cmd::kFixed;
+ static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(1);
+
+ static uint32_t ComputeSize() {
+ return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT
+ }
+
+ void SetHeader() { header.SetCmd<ValueType>(); }
+
+ void Init(GLint _interval) {
+ SetHeader();
+ interval = _interval;
+ }
+
+ void* Set(void* cmd, GLint _interval) {
+ static_cast<ValueType*>(cmd)->Init(_interval);
+ return NextCmdAddress<ValueType>(cmd);
+ }
+
+ gpu::CommandHeader header;
+ int32_t interval;
+};
+
+COMPILE_ASSERT(sizeof(SwapInterval) == 8, Sizeof_SwapInterval_is_not_8);
+COMPILE_ASSERT(offsetof(SwapInterval, header) == 0,
+ OffsetOf_SwapInterval_header_not_0);
+COMPILE_ASSERT(offsetof(SwapInterval, interval) == 4,
+ OffsetOf_SwapInterval_interval_not_4);
+
struct MatrixLoadfCHROMIUMImmediate {
typedef MatrixLoadfCHROMIUMImmediate ValueType;
static const CommandId kCmdId = kMatrixLoadfCHROMIUMImmediate;
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 7473650..49c108c 100644
--- a/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h
+++ b/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h
@@ -3662,11 +3662,13 @@
TEST_F(GLES2FormatTest, TraceBeginCHROMIUM) {
cmds::TraceBeginCHROMIUM& cmd = *GetBufferAs<cmds::TraceBeginCHROMIUM>();
- void* next_cmd = cmd.Set(&cmd, static_cast<GLuint>(11));
+ void* next_cmd =
+ cmd.Set(&cmd, static_cast<GLuint>(11), static_cast<GLuint>(12));
EXPECT_EQ(static_cast<uint32_t>(cmds::TraceBeginCHROMIUM::kCmdId),
cmd.header.command);
EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u);
- EXPECT_EQ(static_cast<GLuint>(11), cmd.bucket_id);
+ EXPECT_EQ(static_cast<GLuint>(11), cmd.category_bucket_id);
+ EXPECT_EQ(static_cast<GLuint>(12), cmd.name_bucket_id);
CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd));
}
@@ -3860,6 +3862,16 @@
CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd));
}
+TEST_F(GLES2FormatTest, SwapInterval) {
+ cmds::SwapInterval& cmd = *GetBufferAs<cmds::SwapInterval>();
+ void* next_cmd = cmd.Set(&cmd, static_cast<GLint>(11));
+ EXPECT_EQ(static_cast<uint32_t>(cmds::SwapInterval::kCmdId),
+ cmd.header.command);
+ EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u);
+ EXPECT_EQ(static_cast<GLint>(11), cmd.interval);
+ CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd));
+}
+
TEST_F(GLES2FormatTest, MatrixLoadfCHROMIUMImmediate) {
const int kSomeBaseValueToTestWith = 51;
static GLfloat data[] = {
diff --git a/gpu/command_buffer/common/gles2_cmd_ids_autogen.h b/gpu/command_buffer/common/gles2_cmd_ids_autogen.h
index 94aa86c..4fe80f8 100644
--- a/gpu/command_buffer/common/gles2_cmd_ids_autogen.h
+++ b/gpu/command_buffer/common/gles2_cmd_ids_autogen.h
@@ -240,9 +240,10 @@
OP(DrawBuffersEXTImmediate) /* 481 */ \
OP(DiscardBackbufferCHROMIUM) /* 482 */ \
OP(ScheduleOverlayPlaneCHROMIUM) /* 483 */ \
- OP(MatrixLoadfCHROMIUMImmediate) /* 484 */ \
- OP(MatrixLoadIdentityCHROMIUM) /* 485 */ \
- OP(BlendBarrierKHR) /* 486 */
+ OP(SwapInterval) /* 484 */ \
+ OP(MatrixLoadfCHROMIUMImmediate) /* 485 */ \
+ OP(MatrixLoadIdentityCHROMIUM) /* 486 */ \
+ OP(BlendBarrierKHR) /* 487 */
enum CommandId {
kStartPoint = cmd::kLastCommonId, // All GLES2 commands start after this.
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index 919d8d8..f97710e 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -880,6 +880,9 @@
// Wrapper for SwapBuffers.
void DoSwapBuffers();
+ // Wrapper for SwapInterval.
+ void DoSwapInterval(int interval);
+
// Wrapper for CopyTexSubImage2D.
void DoCopyTexSubImage2D(
GLenum target,
@@ -1869,6 +1872,8 @@
scoped_ptr<GPUTracer> gpu_tracer_;
scoped_ptr<GPUStateTracer> gpu_state_tracer_;
const unsigned char* cb_command_trace_category_;
+ const unsigned char* gpu_decoder_category_;
+ const unsigned char* gpu_group_marker_category_;
int gpu_trace_level_;
bool gpu_trace_commands_;
bool gpu_debug_commands_;
@@ -2384,6 +2389,10 @@
.texsubimage2d_faster_than_teximage2d),
cb_command_trace_category_(TRACE_EVENT_API_GET_CATEGORY_GROUP_ENABLED(
TRACE_DISABLED_BY_DEFAULT("cb_command"))),
+ gpu_decoder_category_(TRACE_EVENT_API_GET_CATEGORY_GROUP_ENABLED(
+ TRACE_DISABLED_BY_DEFAULT("gpu_decoder"))),
+ gpu_group_marker_category_(TRACE_EVENT_API_GET_CATEGORY_GROUP_ENABLED(
+ TRACE_DISABLED_BY_DEFAULT("gpu_group_marker"))),
gpu_trace_level_(2),
gpu_trace_commands_(false),
gpu_debug_commands_(false),
@@ -3481,7 +3490,7 @@
void GLES2DecoderImpl::BeginDecoding() {
gpu_tracer_->BeginDecoding();
- gpu_trace_commands_ = gpu_tracer_->IsTracing();
+ gpu_trace_commands_ = gpu_tracer_->IsTracing() && *gpu_decoder_category_;
gpu_debug_commands_ = log_commands() || debug() || gpu_trace_commands_ ||
(*cb_command_trace_category_ != 0);
}
@@ -3958,7 +3967,9 @@
if (DebugImpl && gpu_trace_commands_) {
if (CMD_FLAG_GET_TRACE_LEVEL(info.cmd_flags) <= gpu_trace_level_) {
doing_gpu_trace = true;
- gpu_tracer_->Begin(GetCommandName(command), kTraceDecoder);
+ gpu_tracer_->Begin(TRACE_DISABLED_BY_DEFAULT("gpu_decoder"),
+ GetCommandName(command),
+ kTraceDecoder);
}
}
@@ -9724,6 +9735,11 @@
ExitCommandProcessingEarly();
}
+void GLES2DecoderImpl::DoSwapInterval(int interval)
+{
+ context_->SetSwapInterval(interval);
+}
+
error::Error GLES2DecoderImpl::HandleEnableFeatureCHROMIUM(
uint32 immediate_data_size,
const void* cmd_data) {
@@ -10960,12 +10976,17 @@
}
std::string name = length ? std::string(marker, length) : std::string(marker);
debug_marker_manager_.PushGroup(name);
- gpu_tracer_->Begin(name, kTraceGroupMarker);
+ if (*gpu_group_marker_category_) {
+ gpu_tracer_->Begin(TRACE_DISABLED_BY_DEFAULT("gpu_group_marker"), name,
+ kTraceGroupMarker);
+ }
}
void GLES2DecoderImpl::DoPopGroupMarkerEXT(void) {
debug_marker_manager_.PopGroup();
- gpu_tracer_->End(kTraceGroupMarker);
+ if (*gpu_group_marker_category_) {
+ gpu_tracer_->End(kTraceGroupMarker);
+ }
}
void GLES2DecoderImpl::DoBindTexImage2DCHROMIUM(
@@ -11059,16 +11080,23 @@
const void* cmd_data) {
const gles2::cmds::TraceBeginCHROMIUM& c =
*static_cast<const gles2::cmds::TraceBeginCHROMIUM*>(cmd_data);
- Bucket* bucket = GetBucket(c.bucket_id);
- if (!bucket || bucket->size() == 0) {
+ Bucket* category_bucket = GetBucket(c.category_bucket_id);
+ Bucket* name_bucket = GetBucket(c.name_bucket_id);
+ if (!category_bucket || category_bucket->size() == 0 ||
+ !name_bucket || name_bucket->size() == 0) {
return error::kInvalidArguments;
}
- std::string command_name;
- if (!bucket->GetAsString(&command_name)) {
+
+ std::string category_name;
+ std::string trace_name;
+ if (!category_bucket->GetAsString(&category_name) ||
+ !name_bucket->GetAsString(&trace_name)) {
return error::kInvalidArguments;
}
- TRACE_EVENT_COPY_ASYNC_BEGIN0("gpu", command_name.c_str(), this);
- if (!gpu_tracer_->Begin(command_name, kTraceCHROMIUM)) {
+
+ TRACE_EVENT_COPY_ASYNC_BEGIN0(category_name.c_str(), trace_name.c_str(),
+ this);
+ if (!gpu_tracer_->Begin(category_name, trace_name, kTraceCHROMIUM)) {
LOCAL_SET_GL_ERROR(
GL_INVALID_OPERATION,
"glTraceBeginCHROMIUM", "unable to create begin trace");
@@ -11078,13 +11106,15 @@
}
void GLES2DecoderImpl::DoTraceEndCHROMIUM() {
- if (gpu_tracer_->CurrentName().empty()) {
+ if (gpu_tracer_->CurrentCategory().empty() ||
+ gpu_tracer_->CurrentName().empty()) {
LOCAL_SET_GL_ERROR(
GL_INVALID_OPERATION,
"glTraceEndCHROMIUM", "no trace begin found");
return;
}
- TRACE_EVENT_COPY_ASYNC_END0("gpu", gpu_tracer_->CurrentName().c_str(), this);
+ TRACE_EVENT_COPY_ASYNC_END0(gpu_tracer_->CurrentCategory().c_str(),
+ gpu_tracer_->CurrentName().c_str(), this);
gpu_tracer_->End(kTraceCHROMIUM);
}
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h b/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
index b84fc2a..f81b56a 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
@@ -3989,6 +3989,16 @@
return error::kNoError;
}
+error::Error GLES2DecoderImpl::HandleSwapInterval(uint32_t immediate_data_size,
+ const void* cmd_data) {
+ const gles2::cmds::SwapInterval& c =
+ *static_cast<const gles2::cmds::SwapInterval*>(cmd_data);
+ (void)c;
+ GLint interval = static_cast<GLint>(c.interval);
+ DoSwapInterval(interval);
+ return error::kNoError;
+}
+
error::Error GLES2DecoderImpl::HandleMatrixLoadfCHROMIUMImmediate(
uint32_t immediate_data_size,
const void* cmd_data) {
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_3.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_3.cc
index 3fadaf0..86b61ac 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_3.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_3.cc
@@ -37,12 +37,16 @@
INSTANTIATE_TEST_CASE_P(Service, GLES2DecoderTest3, ::testing::Bool());
TEST_P(GLES2DecoderTest3, TraceBeginCHROMIUM) {
- const uint32 kBucketId = 123;
+ const uint32 kCategoryBucketId = 123;
+ const uint32 kNameBucketId = 234;
+
+ const char kCategory[] = "test_category";
const char kName[] = "test_command";
- SetBucketAsCString(kBucketId, kName);
+ SetBucketAsCString(kCategoryBucketId, kCategory);
+ SetBucketAsCString(kNameBucketId, kName);
TraceBeginCHROMIUM begin_cmd;
- begin_cmd.Init(kBucketId);
+ begin_cmd.Init(kCategoryBucketId, kNameBucketId);
EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd));
}
@@ -53,12 +57,16 @@
EXPECT_EQ(error::kNoError, ExecuteCmd(end_cmd));
EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
- const uint32 kBucketId = 123;
+ const uint32 kCategoryBucketId = 123;
+ const uint32 kNameBucketId = 234;
+
+ const char kCategory[] = "test_category";
const char kName[] = "test_command";
- SetBucketAsCString(kBucketId, kName);
+ SetBucketAsCString(kCategoryBucketId, kCategory);
+ SetBucketAsCString(kNameBucketId, kName);
TraceBeginCHROMIUM begin_cmd;
- begin_cmd.Init(kBucketId);
+ begin_cmd.Init(kCategoryBucketId, kNameBucketId);
EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd));
end_cmd.Init();
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 4509676..6de18e0 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
@@ -70,4 +70,5 @@
// TODO(gman): DiscardBackbufferCHROMIUM
// TODO(gman): ScheduleOverlayPlaneCHROMIUM
+// TODO(gman): SwapInterval
#endif // GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_UNITTEST_3_AUTOGEN_H_
diff --git a/gpu/command_buffer/service/gpu_tracer.cc b/gpu/command_buffer/service/gpu_tracer.cc
index 024e4b6..d7cd1b8 100644
--- a/gpu/command_buffer/service/gpu_tracer.cc
+++ b/gpu/command_buffer/service/gpu_tracer.cc
@@ -18,8 +18,9 @@
static const unsigned int kProcessInterval = 16;
static TraceOutputter* g_outputter_thread = NULL;
-TraceMarker::TraceMarker(const std::string& name)
- : name_(name),
+TraceMarker::TraceMarker(const std::string& category, const std::string& name)
+ : category_(category),
+ name_(name),
trace_(NULL) {
}
@@ -41,29 +42,30 @@
TraceOutputter::~TraceOutputter() { g_outputter_thread = NULL; }
-void TraceOutputter::Trace(const std::string& name,
+void TraceOutputter::Trace(const std::string& category,
+ const std::string& name,
int64 start_time,
int64 end_time) {
- TRACE_EVENT_COPY_BEGIN_WITH_ID_TID_AND_TIMESTAMP0(
- TRACE_DISABLED_BY_DEFAULT("gpu.device"),
- name.c_str(),
- local_trace_id_,
- named_thread_.thread_id(),
- start_time);
- TRACE_EVENT_COPY_END_WITH_ID_TID_AND_TIMESTAMP0(
- TRACE_DISABLED_BY_DEFAULT("gpu.device"),
- name.c_str(),
- local_trace_id_,
- named_thread_.thread_id(),
- end_time);
+ TRACE_EVENT_COPY_BEGIN_WITH_ID_TID_AND_TIMESTAMP0(category.c_str(),
+ name.c_str(),
+ local_trace_id_,
+ named_thread_.thread_id(),
+ start_time);
+ TRACE_EVENT_COPY_END_WITH_ID_TID_AND_TIMESTAMP0(category.c_str(),
+ name.c_str(),
+ local_trace_id_,
+ named_thread_.thread_id(),
+ end_time);
++local_trace_id_;
}
GPUTrace::GPUTrace(scoped_refptr<Outputter> outputter,
+ const std::string& category,
const std::string& name,
int64 offset,
GpuTracerType tracer_type)
- : name_(name),
+ : category_(category),
+ name_(name),
outputter_(outputter),
offset_(offset),
start_time_(0),
@@ -94,9 +96,10 @@
}
}
-void GPUTrace::Start() {
- TRACE_EVENT_COPY_ASYNC_BEGIN0(
- TRACE_DISABLED_BY_DEFAULT("gpu.service"), name().c_str(), this);
+void GPUTrace::Start(bool trace_service) {
+ if (trace_service) {
+ TRACE_EVENT_COPY_ASYNC_BEGIN0(category().c_str(), name().c_str(), this);
+ }
switch (tracer_type_) {
case kTracerTypeInvalid:
@@ -123,7 +126,7 @@
}
}
-void GPUTrace::End() {
+void GPUTrace::End(bool tracing_service) {
end_requested_ = true;
switch (tracer_type_) {
case kTracerTypeInvalid:
@@ -136,8 +139,9 @@
break;
}
- TRACE_EVENT_COPY_ASYNC_END0(
- TRACE_DISABLED_BY_DEFAULT("gpu.service"), name().c_str(), this);
+ if (tracing_service) {
+ TRACE_EVENT_COPY_ASYNC_END0(category().c_str(), name().c_str(), this);
+ }
}
bool GPUTrace::IsAvailable() {
@@ -171,7 +175,7 @@
start_time_ = (begin_stamp / base::Time::kNanosecondsPerMicrosecond) +
offset_;
end_time_ = (end_stamp / base::Time::kNanosecondsPerMicrosecond) + offset_;
- outputter_->Trace(name(), start_time_, end_time_);
+ outputter_->Trace(category(), name(), start_time_, end_time_);
}
GPUTracer::GPUTracer(gles2::GLES2Decoder* decoder)
@@ -215,8 +219,10 @@
// Begin a Trace for all active markers
for (int n = 0; n < NUM_TRACER_SOURCES; n++) {
for (size_t i = 0; i < markers_[n].size(); i++) {
- markers_[n][i].trace_ = CreateTrace(markers_[n][i].name_);
- markers_[n][i].trace_->Start();
+ TraceMarker& trace_marker = markers_[n][i];
+ trace_marker.trace_ = CreateTrace(trace_marker.category_,
+ trace_marker.name_);
+ trace_marker.trace_->Start(*gpu_trace_srv_category != 0);
}
}
}
@@ -232,7 +238,7 @@
for (int n = 0; n < NUM_TRACER_SOURCES; n++) {
for (size_t i = 0; i < markers_[n].size(); i++) {
if (markers_[n][i].trace_.get()) {
- markers_[n][i].trace_->End();
+ markers_[n][i].trace_->End(*gpu_trace_srv_category != 0);
if (markers_[n][i].trace_->IsEnabled())
traces_.push_back(markers_[n][i].trace_);
markers_[n][i].trace_ = 0;
@@ -249,7 +255,8 @@
return true;
}
-bool GPUTracer::Begin(const std::string& name, GpuTracerSource source) {
+bool GPUTracer::Begin(const std::string& category, const std::string& name,
+ GpuTracerSource source) {
if (!gpu_executing_)
return false;
@@ -257,12 +264,12 @@
// Push new marker from given 'source'
last_tracer_source_ = source;
- markers_[source].push_back(TraceMarker(name));
+ markers_[source].push_back(TraceMarker(category, name));
// Create trace
if (IsTracing()) {
- scoped_refptr<GPUTrace> trace = CreateTrace(name);
- trace->Start();
+ scoped_refptr<GPUTrace> trace = CreateTrace(category, name);
+ trace->Start(*gpu_trace_srv_category != 0);
markers_[source].back().trace_ = trace;
}
@@ -280,7 +287,7 @@
if (IsTracing()) {
scoped_refptr<GPUTrace> trace = markers_[source].back().trace_;
if (trace.get()) {
- trace->End();
+ trace->End(*gpu_trace_srv_category != 0);
if (trace->IsEnabled())
traces_.push_back(trace);
IssueProcessTask();
@@ -297,6 +304,15 @@
return (*gpu_trace_srv_category != 0) || (*gpu_trace_dev_category != 0);
}
+const std::string& GPUTracer::CurrentCategory() const {
+ if (last_tracer_source_ >= 0 &&
+ last_tracer_source_ < NUM_TRACER_SOURCES &&
+ !markers_[last_tracer_source_].empty()) {
+ return markers_[last_tracer_source_].back().category_;
+ }
+ return base::EmptyString();
+}
+
const std::string& GPUTracer::CurrentName() const {
if (last_tracer_source_ >= 0 &&
last_tracer_source_ < NUM_TRACER_SOURCES &&
@@ -306,11 +322,12 @@
return base::EmptyString();
}
-scoped_refptr<GPUTrace> GPUTracer::CreateTrace(const std::string& name) {
+scoped_refptr<GPUTrace> GPUTracer::CreateTrace(const std::string& category,
+ const std::string& name) {
GpuTracerType tracer_type = *gpu_trace_dev_category ? tracer_type_ :
kTracerTypeInvalid;
- return new GPUTrace(outputter_, name, timer_offset_, tracer_type);
+ return new GPUTrace(outputter_, category, name, timer_offset_, tracer_type);
}
void GPUTracer::Process() {
diff --git a/gpu/command_buffer/service/gpu_tracer.h b/gpu/command_buffer/service/gpu_tracer.h
index 2e81b4e..6033220 100644
--- a/gpu/command_buffer/service/gpu_tracer.h
+++ b/gpu/command_buffer/service/gpu_tracer.h
@@ -42,9 +42,10 @@
// Marker structure for a Trace.
struct TraceMarker {
- TraceMarker(const std::string& name);
+ TraceMarker(const std::string& category, const std::string& name);
~TraceMarker();
+ std::string category_;
std::string name_;
scoped_refptr<GPUTrace> trace_;
};
@@ -62,7 +63,8 @@
bool EndDecoding();
// Begin a trace marker.
- bool Begin(const std::string& name, GpuTracerSource source);
+ bool Begin(const std::string& category, const std::string& name,
+ GpuTracerSource source);
// End the last started trace marker.
bool End(GpuTracerSource source);
@@ -71,11 +73,13 @@
// Retrieve the name of the current open trace.
// Returns empty string if no current open trace.
+ const std::string& CurrentCategory() const;
const std::string& CurrentName() const;
private:
// Trace Processing.
- scoped_refptr<GPUTrace> CreateTrace(const std::string& name);
+ scoped_refptr<GPUTrace> CreateTrace(const std::string& category,
+ const std::string& name);
void Process();
void ProcessTraces();
@@ -103,7 +107,8 @@
class Outputter : public base::RefCounted<Outputter> {
public:
- virtual void Trace(const std::string& name,
+ virtual void Trace(const std::string& category,
+ const std::string& name,
int64 start_time,
int64 end_time) = 0;
@@ -115,7 +120,8 @@
class TraceOutputter : public Outputter {
public:
static scoped_refptr<TraceOutputter> Create(const std::string& name);
- void Trace(const std::string& name,
+ void Trace(const std::string& category,
+ const std::string& name,
int64 start_time,
int64 end_time) override;
@@ -134,15 +140,18 @@
: public base::RefCounted<GPUTrace> {
public:
GPUTrace(scoped_refptr<Outputter> outputter,
+ const std::string& category,
const std::string& name,
int64 offset,
GpuTracerType tracer_type);
bool IsEnabled() { return tracer_type_ != kTracerTypeInvalid; }
+
+ const std::string& category() { return category_; }
const std::string& name() { return name_; }
- void Start();
- void End();
+ void Start(bool trace_service);
+ void End(bool tracing_service);
bool IsAvailable();
void Process();
@@ -153,6 +162,7 @@
friend class base::RefCounted<GPUTrace>;
+ std::string category_;
std::string name_;
scoped_refptr<Outputter> outputter_;
diff --git a/gpu/command_buffer/service/gpu_tracer_unittest.cc b/gpu/command_buffer/service/gpu_tracer_unittest.cc
index 2a7a94c..ccf4d6d 100644
--- a/gpu/command_buffer/service/gpu_tracer_unittest.cc
+++ b/gpu/command_buffer/service/gpu_tracer_unittest.cc
@@ -22,8 +22,9 @@
class MockOutputter : public Outputter {
public:
MockOutputter() {}
- MOCK_METHOD3(Trace,
- void(const std::string& name, int64 start_time, int64 end_time));
+ MOCK_METHOD4(Trace,
+ void(const std::string& category, const std::string& name,
+ int64 start_time, int64 end_time));
protected:
~MockOutputter() {}
@@ -113,6 +114,7 @@
SetupTimerQueryMocks();
// Expected results
+ const std::string category_name("trace_category");
const std::string trace_name("trace_test");
const int64 offset_time = 3231;
const GLint64 start_timestamp = 7 * base::Time::kNanosecondsPerMicrosecond;
@@ -125,20 +127,21 @@
// Expected Outputter::Trace call
EXPECT_CALL(*outputter,
- Trace(trace_name, expect_start_time, expect_end_time));
+ Trace(category_name, trace_name,
+ expect_start_time, expect_end_time));
scoped_refptr<GPUTrace> trace =
- new GPUTrace(outputter_ref, trace_name, offset_time,
- GetTracerType());
+ new GPUTrace(outputter_ref, category_name, trace_name,
+ offset_time, GetTracerType());
gl_fake_queries_.SetCurrentGLTime(start_timestamp);
- trace->Start();
+ trace->Start(true);
// Shouldn't be available before End() call
gl_fake_queries_.SetCurrentGLTime(end_timestamp);
EXPECT_FALSE(trace->IsAvailable());
- trace->End();
+ trace->End(true);
// Shouldn't be available until the queries complete
gl_fake_queries_.SetCurrentGLTime(end_timestamp -
diff --git a/gpu/config/software_rendering_list_json.cc b/gpu/config/software_rendering_list_json.cc
index b9f5e3a..e97c41a 100644
--- a/gpu/config/software_rendering_list_json.cc
+++ b/gpu/config/software_rendering_list_json.cc
@@ -18,7 +18,7 @@
{
"name": "software rendering list",
// Please update the version number whenever you change this file.
- "version": "9.13",
+ "version": "9.14",
"entries": [
{
"id": 1,
@@ -1050,23 +1050,35 @@
},
{
"id": 96,
- "description": "GPU rasterization is whitelisted on select devices on Android",
- "cr_bugs": [362779],
+ "description": "GPU rasterization whitelist",
+ "cr_bugs": [362779,424970],
"os": {
"type": "android"
},
"exceptions": [
{
- "machine_model_name": ["Nexus 4", "Nexus 5", "Nexus 7",
- "XT1049", "XT1050", "XT1052", "XT1053",
- "XT1055", "XT1056", "XT1058", "XT1060",
- "HTC One",
- "C5303", "C6603", "C6903",
- "GT-I9195",
- "GT-I9505",
- "SAMSUNG-SCH-I337", "SCH-I545", "SGH-M919",
- "SM-N900", "SM-N9005", "SPH-L720",
- "XT907", "XT1032", "XT1033", "XT1080"]
+ "os": {
+ "type": "android"
+ },
+ "gl_renderer": "Adreno (TM) 3.*"
+ },
+ {
+ "os": {
+ "type": "android"
+ },
+ "gl_renderer": "NVIDIA.*"
+ },
+ {
+ "os": {
+ "type": "android"
+ },
+ "gl_renderer": "VideoCore IV.*"
+ },
+ {
+ "os": {
+ "type": "android"
+ },
+ "gl_renderer": "Immersion.*"
},
{
"os": {
diff --git a/gpu/skia_bindings/gl_bindings_skia_cmd_buffer.cc b/gpu/skia_bindings/gl_bindings_skia_cmd_buffer.cc
index 3b5460e..1e997ba 100644
--- a/gpu/skia_bindings/gl_bindings_skia_cmd_buffer.cc
+++ b/gpu/skia_bindings/gl_bindings_skia_cmd_buffer.cc
@@ -69,6 +69,7 @@
functions->fGetProgramiv = glGetProgramiv;
functions->fGetShaderInfoLog = glGetShaderInfoLog;
functions->fGetShaderiv = glGetShaderiv;
+ functions->fGetShaderPrecisionFormat = glGetShaderPrecisionFormat;
functions->fGetString = glGetString;
functions->fGetUniformLocation = glGetUniformLocation;
functions->fInsertEventMarker = glInsertEventMarkerEXT;
diff --git a/mojo/tools/roll/cc_strip_video.patch b/mojo/tools/roll/cc_strip_video.patch
index 4bbaf1c..df14109 100644
--- a/mojo/tools/roll/cc_strip_video.patch
+++ b/mojo/tools/roll/cc_strip_video.patch
@@ -22,8 +22,8 @@
"resources/ui_resource_request.h",
- "resources/video_resource_updater.cc",
- "resources/video_resource_updater.h",
- "resources/zero_copy_raster_worker_pool.cc",
- "resources/zero_copy_raster_worker_pool.h",
+ "resources/zero_copy_tile_task_worker_pool.cc",
+ "resources/zero_copy_tile_task_worker_pool.h",
"scheduler/begin_frame_source.cc",
@@ -588,8 +579,6 @@ source_set("test_support") {
"test/fake_tile_manager_client.h",
diff --git a/net/base/layered_network_delegate.cc b/net/base/layered_network_delegate.cc
new file mode 100644
index 0000000..95e4236
--- /dev/null
+++ b/net/base/layered_network_delegate.cc
@@ -0,0 +1,274 @@
+// 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.
+
+#include "net/base/layered_network_delegate.h"
+
+namespace net {
+
+LayeredNetworkDelegate::LayeredNetworkDelegate(
+ scoped_ptr<NetworkDelegate> nested_network_delegate)
+ : nested_network_delegate_(nested_network_delegate.Pass()) {
+}
+
+LayeredNetworkDelegate::~LayeredNetworkDelegate() {
+}
+
+int LayeredNetworkDelegate::OnBeforeURLRequest(
+ URLRequest* request,
+ const CompletionCallback& callback,
+ GURL* new_url) {
+ OnBeforeURLRequestInternal(request, callback, new_url);
+ return nested_network_delegate_->NotifyBeforeURLRequest(request, callback,
+ new_url);
+}
+
+void LayeredNetworkDelegate::OnBeforeURLRequestInternal(
+ URLRequest* request,
+ const CompletionCallback& callback,
+ GURL* new_url) {
+}
+
+void LayeredNetworkDelegate::OnResolveProxy(const GURL& url,
+ int load_flags,
+ const ProxyService& proxy_service,
+ ProxyInfo* result) {
+ OnResolveProxyInternal(url, load_flags, proxy_service, result);
+ nested_network_delegate_->NotifyResolveProxy(url, load_flags, proxy_service,
+ result);
+}
+
+void LayeredNetworkDelegate::OnResolveProxyInternal(
+ const GURL& url,
+ int load_flags,
+ const ProxyService& proxy_service,
+ ProxyInfo* result) {
+}
+
+void LayeredNetworkDelegate::OnProxyFallback(const ProxyServer& bad_proxy,
+ int net_error) {
+ OnProxyFallbackInternal(bad_proxy, net_error);
+ nested_network_delegate_->NotifyProxyFallback(bad_proxy, net_error);
+}
+
+void LayeredNetworkDelegate::OnProxyFallbackInternal(
+ const ProxyServer& bad_proxy,
+ int net_error) {
+}
+
+int LayeredNetworkDelegate::OnBeforeSendHeaders(
+ URLRequest* request,
+ const CompletionCallback& callback,
+ HttpRequestHeaders* headers) {
+ OnBeforeSendHeadersInternal(request, callback, headers);
+ return nested_network_delegate_->NotifyBeforeSendHeaders(request, callback,
+ headers);
+}
+
+void LayeredNetworkDelegate::OnBeforeSendHeadersInternal(
+ URLRequest* request,
+ const CompletionCallback& callback,
+ HttpRequestHeaders* headers) {
+}
+
+void LayeredNetworkDelegate::OnBeforeSendProxyHeaders(
+ URLRequest* request,
+ const ProxyInfo& proxy_info,
+ HttpRequestHeaders* headers) {
+ OnBeforeSendProxyHeadersInternal(request, proxy_info, headers);
+ nested_network_delegate_->NotifyBeforeSendProxyHeaders(request, proxy_info,
+ headers);
+}
+
+void LayeredNetworkDelegate::OnBeforeSendProxyHeadersInternal(
+ URLRequest* request,
+ const ProxyInfo& proxy_info,
+ HttpRequestHeaders* headers) {
+}
+
+void LayeredNetworkDelegate::OnSendHeaders(URLRequest* request,
+ const HttpRequestHeaders& headers) {
+ OnSendHeadersInternal(request, headers);
+ nested_network_delegate_->NotifySendHeaders(request, headers);
+}
+
+void LayeredNetworkDelegate::OnSendHeadersInternal(
+ URLRequest* request,
+ const HttpRequestHeaders& headers) {
+}
+
+int LayeredNetworkDelegate::OnHeadersReceived(
+ URLRequest* request,
+ const CompletionCallback& callback,
+ const HttpResponseHeaders* original_response_headers,
+ scoped_refptr<HttpResponseHeaders>* override_response_headers,
+ GURL* allowed_unsafe_redirect_url) {
+ OnHeadersReceivedInternal(request, callback, original_response_headers,
+ override_response_headers,
+ allowed_unsafe_redirect_url);
+ return nested_network_delegate_->NotifyHeadersReceived(
+ request, callback, original_response_headers, override_response_headers,
+ allowed_unsafe_redirect_url);
+}
+
+void LayeredNetworkDelegate::OnHeadersReceivedInternal(
+ URLRequest* request,
+ const CompletionCallback& callback,
+ const HttpResponseHeaders* original_response_headers,
+ scoped_refptr<HttpResponseHeaders>* override_response_headers,
+ GURL* allowed_unsafe_redirect_url) {
+}
+
+void LayeredNetworkDelegate::OnBeforeRedirect(URLRequest* request,
+ const GURL& new_location) {
+ OnBeforeRedirectInternal(request, new_location);
+ nested_network_delegate_->NotifyBeforeRedirect(request, new_location);
+}
+
+void LayeredNetworkDelegate::OnBeforeRedirectInternal(
+ URLRequest* request,
+ const GURL& new_location) {
+}
+
+void LayeredNetworkDelegate::OnResponseStarted(URLRequest* request) {
+ OnResponseStartedInternal(request);
+ nested_network_delegate_->NotifyResponseStarted(request);
+}
+
+void LayeredNetworkDelegate::OnResponseStartedInternal(URLRequest* request) {
+}
+
+void LayeredNetworkDelegate::OnRawBytesRead(const URLRequest& request,
+ int bytes_read) {
+ OnRawBytesReadInternal(request, bytes_read);
+ nested_network_delegate_->NotifyRawBytesRead(request, bytes_read);
+}
+
+void LayeredNetworkDelegate::OnRawBytesReadInternal(const URLRequest& request,
+ int bytes_read) {
+}
+
+void LayeredNetworkDelegate::OnCompleted(URLRequest* request, bool started) {
+ OnCompletedInternal(request, started);
+ nested_network_delegate_->NotifyCompleted(request, started);
+}
+
+void LayeredNetworkDelegate::OnCompletedInternal(URLRequest* request,
+ bool started) {
+}
+
+void LayeredNetworkDelegate::OnURLRequestDestroyed(URLRequest* request) {
+ OnURLRequestDestroyedInternal(request);
+ nested_network_delegate_->NotifyURLRequestDestroyed(request);
+}
+
+void LayeredNetworkDelegate::OnURLRequestDestroyedInternal(
+ URLRequest* request) {
+}
+
+void LayeredNetworkDelegate::OnPACScriptError(int line_number,
+ const base::string16& error) {
+ OnPACScriptErrorInternal(line_number, error);
+ nested_network_delegate_->NotifyPACScriptError(line_number, error);
+}
+
+void LayeredNetworkDelegate::OnPACScriptErrorInternal(
+ int line_number,
+ const base::string16& error) {
+}
+
+NetworkDelegate::AuthRequiredResponse LayeredNetworkDelegate::OnAuthRequired(
+ URLRequest* request,
+ const AuthChallengeInfo& auth_info,
+ const AuthCallback& callback,
+ AuthCredentials* credentials) {
+ OnAuthRequiredInternal(request, auth_info, callback, credentials);
+ return nested_network_delegate_->NotifyAuthRequired(request, auth_info,
+ callback, credentials);
+}
+
+void LayeredNetworkDelegate::OnAuthRequiredInternal(
+ URLRequest* request,
+ const AuthChallengeInfo& auth_info,
+ const AuthCallback& callback,
+ AuthCredentials* credentials) {
+}
+
+bool LayeredNetworkDelegate::OnCanGetCookies(const URLRequest& request,
+ const CookieList& cookie_list) {
+ OnCanGetCookiesInternal(request, cookie_list);
+ return nested_network_delegate_->CanGetCookies(request, cookie_list);
+}
+
+void LayeredNetworkDelegate::OnCanGetCookiesInternal(
+ const URLRequest& request,
+ const CookieList& cookie_list) {
+}
+
+bool LayeredNetworkDelegate::OnCanSetCookie(const URLRequest& request,
+ const std::string& cookie_line,
+ CookieOptions* options) {
+ OnCanSetCookieInternal(request, cookie_line, options);
+ return nested_network_delegate_->CanSetCookie(request, cookie_line, options);
+}
+
+void LayeredNetworkDelegate::OnCanSetCookieInternal(
+ const URLRequest& request,
+ const std::string& cookie_line,
+ CookieOptions* options) {
+}
+
+bool LayeredNetworkDelegate::OnCanAccessFile(const URLRequest& request,
+ const base::FilePath& path) const {
+ OnCanAccessFileInternal(request, path);
+ return nested_network_delegate_->CanAccessFile(request, path);
+}
+
+void LayeredNetworkDelegate::OnCanAccessFileInternal(
+ const URLRequest& request,
+ const base::FilePath& path) const {
+}
+
+bool LayeredNetworkDelegate::OnCanThrottleRequest(
+ const URLRequest& request) const {
+ OnCanThrottleRequestInternal(request);
+ return nested_network_delegate_->CanThrottleRequest(request);
+}
+
+void LayeredNetworkDelegate::OnCanThrottleRequestInternal(
+ const URLRequest& request) const {
+}
+
+bool LayeredNetworkDelegate::OnCanEnablePrivacyMode(
+ const GURL& url,
+ const GURL& first_party_for_cookies) const {
+ OnCanEnablePrivacyModeInternal(url, first_party_for_cookies);
+ return nested_network_delegate_->CanEnablePrivacyMode(
+ url, first_party_for_cookies);
+}
+
+void LayeredNetworkDelegate::OnCanEnablePrivacyModeInternal(
+ const GURL& url,
+ const GURL& first_party_for_cookies) const {
+}
+
+bool LayeredNetworkDelegate::
+ OnCancelURLRequestWithPolicyViolatingReferrerHeader(
+ const URLRequest& request,
+ const GURL& target_url,
+ const GURL& referrer_url) const {
+ OnCancelURLRequestWithPolicyViolatingReferrerHeaderInternal(
+ request, target_url, referrer_url);
+ return nested_network_delegate_
+ ->CancelURLRequestWithPolicyViolatingReferrerHeader(request, target_url,
+ referrer_url);
+}
+
+void LayeredNetworkDelegate::
+ OnCancelURLRequestWithPolicyViolatingReferrerHeaderInternal(
+ const URLRequest& request,
+ const GURL& target_url,
+ const GURL& referrer_url) const {
+}
+
+} // namespace net
diff --git a/net/base/layered_network_delegate.h b/net/base/layered_network_delegate.h
new file mode 100644
index 0000000..93c9d11
--- /dev/null
+++ b/net/base/layered_network_delegate.h
@@ -0,0 +1,171 @@
+// 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.
+
+#ifndef NET_BASE_LAYERED_NETWORK_DELEGATE_H_
+#define NET_BASE_LAYERED_NETWORK_DELEGATE_H_
+
+#include "base/memory/scoped_ptr.h"
+#include "base/strings/string16.h"
+#include "net/base/completion_callback.h"
+#include "net/base/network_delegate.h"
+#include "net/cookies/canonical_cookie.h"
+
+class GURL;
+
+namespace base {
+class FilePath;
+}
+
+namespace net {
+
+class CookieOptions;
+class HttpRequestHeaders;
+class HttpResponseHeaders;
+class ProxyInfo;
+class ProxyServer;
+class ProxyService;
+class URLRequest;
+
+// WrappingNetworkDelegate takes a |network_delegate| and extends it. When
+// On*() is called, the On*Internal() method of this is first called and then
+// the On*() of |network_delegate| is called. On*Internal() methods have no
+// return values, and cannot prevent calling into the nested network delegate.
+class NET_EXPORT LayeredNetworkDelegate : public NetworkDelegate {
+ public:
+ explicit LayeredNetworkDelegate(
+ scoped_ptr<NetworkDelegate> nested_network_delegate);
+ ~LayeredNetworkDelegate() override;
+
+ // NetworkDelegate implementation:
+ int OnBeforeURLRequest(URLRequest* request,
+ const CompletionCallback& callback,
+ GURL* new_url) final override;
+ void OnResolveProxy(const GURL& url,
+ int load_flags,
+ const ProxyService& proxy_service,
+ ProxyInfo* result) final override;
+ void OnProxyFallback(const ProxyServer& bad_proxy,
+ int net_error) final override;
+ int OnBeforeSendHeaders(URLRequest* request,
+ const CompletionCallback& callback,
+ HttpRequestHeaders* headers) final override;
+ void OnBeforeSendProxyHeaders(URLRequest* request,
+ const ProxyInfo& proxy_info,
+ HttpRequestHeaders* headers) final override;
+ void OnSendHeaders(URLRequest* request,
+ const HttpRequestHeaders& headers) final override;
+ int OnHeadersReceived(
+ URLRequest* request,
+ const CompletionCallback& callback,
+ const HttpResponseHeaders* original_response_headers,
+ scoped_refptr<HttpResponseHeaders>* override_response_headers,
+ GURL* allowed_unsafe_redirect_url) final override;
+ void OnBeforeRedirect(URLRequest* request,
+ const GURL& new_location) final override;
+ void OnResponseStarted(URLRequest* request) final override;
+ void OnRawBytesRead(const URLRequest& request, int bytes_read) final override;
+ void OnCompleted(URLRequest* request, bool started) final override;
+ void OnURLRequestDestroyed(URLRequest* request) final override;
+ void OnPACScriptError(int line_number,
+ const base::string16& error) final override;
+ AuthRequiredResponse OnAuthRequired(
+ URLRequest* request,
+ const AuthChallengeInfo& auth_info,
+ const AuthCallback& callback,
+ AuthCredentials* credentials) final override;
+ bool OnCanGetCookies(const URLRequest& request,
+ const CookieList& cookie_list) final override;
+ bool OnCanSetCookie(const URLRequest& request,
+ const std::string& cookie_line,
+ CookieOptions* options) final override;
+ bool OnCanAccessFile(const URLRequest& request,
+ const base::FilePath& path) const final override;
+ bool OnCanThrottleRequest(const URLRequest& request) const final override;
+ bool OnCanEnablePrivacyMode(
+ const GURL& url,
+ const GURL& first_party_for_cookies) const final override;
+ bool OnCancelURLRequestWithPolicyViolatingReferrerHeader(
+ const URLRequest& request,
+ const GURL& target_url,
+ const GURL& referrer_url) const final override;
+
+ protected:
+ virtual void OnBeforeURLRequestInternal(URLRequest* request,
+ const CompletionCallback& callback,
+ GURL* new_url);
+
+ virtual void OnResolveProxyInternal(const GURL& url,
+ int load_flags,
+ const ProxyService& proxy_service,
+ ProxyInfo* result);
+
+ virtual void OnProxyFallbackInternal(const ProxyServer& bad_proxy,
+ int net_error);
+
+ virtual void OnBeforeSendHeadersInternal(URLRequest* request,
+ const CompletionCallback& callback,
+ HttpRequestHeaders* headers);
+
+ virtual void OnBeforeSendProxyHeadersInternal(URLRequest* request,
+ const ProxyInfo& proxy_info,
+ HttpRequestHeaders* headers);
+
+ virtual void OnSendHeadersInternal(URLRequest* request,
+ const HttpRequestHeaders& headers);
+
+ virtual void OnHeadersReceivedInternal(
+ URLRequest* request,
+ const CompletionCallback& callback,
+ const HttpResponseHeaders* original_response_headers,
+ scoped_refptr<HttpResponseHeaders>* override_response_headers,
+ GURL* allowed_unsafe_redirect_url);
+
+ virtual void OnBeforeRedirectInternal(URLRequest* request,
+ const GURL& new_location);
+
+ virtual void OnResponseStartedInternal(URLRequest* request);
+
+ virtual void OnRawBytesReadInternal(const URLRequest& request,
+ int bytes_read);
+
+ virtual void OnCompletedInternal(URLRequest* request, bool started);
+
+ virtual void OnURLRequestDestroyedInternal(URLRequest* request);
+
+ virtual void OnPACScriptErrorInternal(int line_number,
+ const base::string16& error);
+
+ virtual void OnCanGetCookiesInternal(const URLRequest& request,
+ const CookieList& cookie_list);
+
+ virtual void OnCanSetCookieInternal(const URLRequest& request,
+ const std::string& cookie_line,
+ CookieOptions* options);
+
+ virtual void OnAuthRequiredInternal(URLRequest* request,
+ const AuthChallengeInfo& auth_info,
+ const AuthCallback& callback,
+ AuthCredentials* credentials);
+
+ virtual void OnCanAccessFileInternal(const URLRequest& request,
+ const base::FilePath& path) const;
+
+ virtual void OnCanThrottleRequestInternal(const URLRequest& request) const;
+
+ virtual void OnCanEnablePrivacyModeInternal(
+ const GURL& url,
+ const GURL& first_party_for_cookies) const;
+
+ virtual void OnCancelURLRequestWithPolicyViolatingReferrerHeaderInternal(
+ const URLRequest& request,
+ const GURL& target_url,
+ const GURL& referrer_url) const;
+
+ private:
+ scoped_ptr<NetworkDelegate> nested_network_delegate_;
+};
+
+} // namespace net
+
+#endif // NET_BASE_LAYERED_NETWORK_DELEGATE_H_
diff --git a/net/base/layered_network_delegate_unittest.cc b/net/base/layered_network_delegate_unittest.cc
new file mode 100644
index 0000000..d68568e
--- /dev/null
+++ b/net/base/layered_network_delegate_unittest.cc
@@ -0,0 +1,389 @@
+// 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.
+
+#include "net/base/layered_network_delegate.h"
+
+#include <map>
+
+#include "base/bind.h"
+#include "base/files/file_path.h"
+#include "base/macros.h"
+#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_ptr.h"
+#include "net/base/auth.h"
+#include "net/base/net_errors.h"
+#include "net/base/network_delegate_impl.h"
+#include "net/base/request_priority.h"
+#include "net/base/test_completion_callback.h"
+#include "net/http/http_response_headers.h"
+#include "net/proxy/proxy_config_service.h"
+#include "net/proxy/proxy_info.h"
+#include "net/proxy/proxy_service.h"
+#include "net/url_request/url_request.h"
+#include "net/url_request/url_request_test_util.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "url/gurl.h"
+
+namespace net {
+namespace {
+
+typedef std::map<const char*, int> CountersMap;
+
+class TestNetworkDelegateImpl : public NetworkDelegateImpl {
+ public:
+ TestNetworkDelegateImpl(CountersMap* layered_network_delegate_counters)
+ : layered_network_delegate_counters_(layered_network_delegate_counters) {}
+
+ ~TestNetworkDelegateImpl() override {}
+
+ // NetworkDelegateImpl implementation:
+ int OnBeforeURLRequest(URLRequest* request,
+ const CompletionCallback& callback,
+ GURL* new_url) override {
+ IncrementAndCompareCounter("on_before_url_request_count");
+ return OK;
+ }
+
+ void OnResolveProxy(const GURL& url,
+ int load_flags,
+ const ProxyService& proxy_service,
+ ProxyInfo* result) override {
+ IncrementAndCompareCounter("on_resolve_proxy_count");
+ }
+
+ void OnProxyFallback(const ProxyServer& bad_proxy, int net_error) override {
+ IncrementAndCompareCounter("on_proxy_fallback_count");
+ }
+
+ int OnBeforeSendHeaders(URLRequest* request,
+ const CompletionCallback& callback,
+ HttpRequestHeaders* headers) override {
+ IncrementAndCompareCounter("on_before_send_headers_count");
+ return OK;
+ }
+
+ void OnBeforeSendProxyHeaders(URLRequest* request,
+ const ProxyInfo& proxy_info,
+ HttpRequestHeaders* headers) override {
+ IncrementAndCompareCounter("on_before_send_proxy_headers_count");
+ }
+
+ void OnSendHeaders(URLRequest* request,
+ const HttpRequestHeaders& headers) override {
+ IncrementAndCompareCounter("on_send_headers_count");
+ }
+
+ int OnHeadersReceived(
+ URLRequest* request,
+ const CompletionCallback& callback,
+ const HttpResponseHeaders* original_response_headers,
+ scoped_refptr<HttpResponseHeaders>* override_response_headers,
+ GURL* allowed_unsafe_redirect_url) override {
+ IncrementAndCompareCounter("on_headers_received_count");
+ return OK;
+ }
+
+ void OnBeforeRedirect(URLRequest* request,
+ const GURL& new_location) override {
+ IncrementAndCompareCounter("on_before_redirect_count");
+ }
+
+ void OnResponseStarted(URLRequest* request) override {
+ IncrementAndCompareCounter("on_response_started_count");
+ }
+
+ void OnRawBytesRead(const URLRequest& request, int bytes_read) override {
+ IncrementAndCompareCounter("on_raw_bytes_read_count");
+ }
+
+ void OnCompleted(URLRequest* request, bool started) override {
+ IncrementAndCompareCounter("on_completed_count");
+ }
+
+ void OnURLRequestDestroyed(URLRequest* request) override {
+ IncrementAndCompareCounter("on_url_request_destroyed_count");
+ }
+
+ void OnPACScriptError(int line_number, const base::string16& error) override {
+ IncrementAndCompareCounter("on_pac_script_error_count");
+ }
+
+ AuthRequiredResponse OnAuthRequired(URLRequest* request,
+ const AuthChallengeInfo& auth_info,
+ const AuthCallback& callback,
+ AuthCredentials* credentials) override {
+ IncrementAndCompareCounter("on_auth_required_count");
+ return NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION;
+ }
+
+ bool OnCanGetCookies(const URLRequest& request,
+ const CookieList& cookie_list) override {
+ IncrementAndCompareCounter("on_can_get_cookies_count");
+ return false;
+ }
+
+ bool OnCanSetCookie(const URLRequest& request,
+ const std::string& cookie_line,
+ CookieOptions* options) override {
+ IncrementAndCompareCounter("on_can_set_cookie_count");
+ return false;
+ }
+
+ bool OnCanAccessFile(const URLRequest& request,
+ const base::FilePath& path) const override {
+ IncrementAndCompareCounter("on_can_access_file_count");
+ return false;
+ }
+
+ bool OnCanThrottleRequest(const URLRequest& request) const override {
+ IncrementAndCompareCounter("on_can_throttle_request_count");
+ return false;
+ }
+
+ bool OnCanEnablePrivacyMode(
+ const GURL& url,
+ const GURL& first_party_for_cookies) const override {
+ IncrementAndCompareCounter("on_can_enable_privacy_mode_count");
+ return false;
+ }
+
+ bool OnCancelURLRequestWithPolicyViolatingReferrerHeader(
+ const URLRequest& request,
+ const GURL& target_url,
+ const GURL& referrer_url) const override {
+ IncrementAndCompareCounter(
+ "on_cancel_url_request_with_policy_violating_referrer_header_count");
+ return false;
+ }
+
+ private:
+ void IncrementAndCompareCounter(const char* counter_name) const {
+ ++counters_[counter_name];
+ EXPECT_EQ((*layered_network_delegate_counters_)[counter_name],
+ counters_[counter_name]);
+ }
+
+ mutable CountersMap counters_;
+ mutable CountersMap* layered_network_delegate_counters_;
+
+ DISALLOW_COPY_AND_ASSIGN(TestNetworkDelegateImpl);
+};
+
+class TestLayeredNetworkDelegate : public LayeredNetworkDelegate {
+ public:
+ TestLayeredNetworkDelegate(scoped_ptr<NetworkDelegate> network_delegate,
+ CountersMap* counters)
+ : LayeredNetworkDelegate(network_delegate.Pass()),
+ context_(true),
+ counters_(counters) {
+ context_.Init();
+ }
+
+ ~TestLayeredNetworkDelegate() override {}
+
+ void CallAndVerify() {
+ scoped_refptr<AuthChallengeInfo> auth_challenge(new AuthChallengeInfo());
+ scoped_ptr<URLRequest> request =
+ context_.CreateRequest(GURL(), IDLE, &delegate_, NULL);
+ scoped_ptr<HttpRequestHeaders> request_headers(new HttpRequestHeaders());
+ scoped_refptr<HttpResponseHeaders> response_headers(
+ new HttpResponseHeaders(""));
+ TestCompletionCallback completion_callback;
+ scoped_ptr<ProxyService> proxy_service(ProxyService::CreateDirect());
+ scoped_ptr<ProxyInfo> proxy_info(new ProxyInfo());
+
+ EXPECT_EQ(OK, OnBeforeURLRequest(request.get(),
+ completion_callback.callback(), NULL));
+ OnResolveProxy(GURL(), 0, *proxy_service, proxy_info.get());
+ OnProxyFallback(ProxyServer(), 0);
+ EXPECT_EQ(OK, OnBeforeSendHeaders(NULL, completion_callback.callback(),
+ request_headers.get()));
+ OnBeforeSendProxyHeaders(NULL, ProxyInfo(), request_headers.get());
+ OnSendHeaders(NULL, *request_headers);
+ EXPECT_EQ(OK, OnHeadersReceived(NULL, completion_callback.callback(),
+ response_headers.get(), NULL, NULL));
+ OnResponseStarted(request.get());
+ OnRawBytesRead(*request, 0);
+ OnCompleted(request.get(), false);
+ OnURLRequestDestroyed(request.get());
+ OnPACScriptError(0, base::string16());
+ EXPECT_EQ(
+ NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION,
+ OnAuthRequired(request.get(), *auth_challenge, AuthCallback(), NULL));
+ EXPECT_FALSE(OnCanGetCookies(*request, CookieList()));
+ EXPECT_FALSE(OnCanSetCookie(*request, std::string(), NULL));
+ EXPECT_FALSE(OnCanAccessFile(*request, base::FilePath()));
+ EXPECT_FALSE(OnCanThrottleRequest(*request));
+ EXPECT_FALSE(OnCanEnablePrivacyMode(GURL(), GURL()));
+ EXPECT_FALSE(OnCancelURLRequestWithPolicyViolatingReferrerHeader(
+ *request, GURL(), GURL()));
+ }
+
+ protected:
+ void OnBeforeURLRequestInternal(URLRequest* request,
+ const CompletionCallback& callback,
+ GURL* new_url) override {
+ ++(*counters_)["on_before_url_request_count"];
+ EXPECT_EQ(1, (*counters_)["on_before_url_request_count"]);
+ }
+
+ void OnResolveProxyInternal(const GURL& url,
+ int load_flags,
+ const ProxyService& proxy_service,
+ ProxyInfo* result) override {
+ ++(*counters_)["on_resolve_proxy_count"];
+ EXPECT_EQ(1, (*counters_)["on_resolve_proxy_count"]);
+ }
+
+ void OnProxyFallbackInternal(const ProxyServer& bad_proxy,
+ int net_error) override {
+ ++(*counters_)["on_proxy_fallback_count"];
+ EXPECT_EQ(1, (*counters_)["on_proxy_fallback_count"]);
+ }
+
+ void OnBeforeSendHeadersInternal(URLRequest* request,
+ const CompletionCallback& callback,
+ HttpRequestHeaders* headers) override {
+ ++(*counters_)["on_before_send_headers_count"];
+ EXPECT_EQ(1, (*counters_)["on_before_send_headers_count"]);
+ }
+
+ void OnBeforeSendProxyHeadersInternal(URLRequest* request,
+ const ProxyInfo& proxy_info,
+ HttpRequestHeaders* headers) override {
+ ++(*counters_)["on_before_send_proxy_headers_count"];
+ EXPECT_EQ(1, (*counters_)["on_before_send_proxy_headers_count"]);
+ }
+
+ void OnSendHeadersInternal(URLRequest* request,
+ const HttpRequestHeaders& headers) override {
+ ++(*counters_)["on_send_headers_count"];
+ EXPECT_EQ(1, (*counters_)["on_send_headers_count"]);
+ }
+
+ void OnHeadersReceivedInternal(
+ URLRequest* request,
+ const CompletionCallback& callback,
+ const HttpResponseHeaders* original_response_headers,
+ scoped_refptr<HttpResponseHeaders>* override_response_headers,
+ GURL* allowed_unsafe_redirect_url) override {
+ ++(*counters_)["on_headers_received_count"];
+ EXPECT_EQ(1, (*counters_)["on_headers_received_count"]);
+ }
+
+ void OnBeforeRedirectInternal(URLRequest* request,
+ const GURL& new_location) override {
+ ++(*counters_)["on_before_redirect_count"];
+ EXPECT_EQ(1, (*counters_)["on_before_redirect_count"]);
+ }
+
+ void OnResponseStartedInternal(URLRequest* request) override {
+ ++(*counters_)["on_response_started_count"];
+ EXPECT_EQ(1, (*counters_)["on_response_started_count"]);
+ }
+
+ void OnRawBytesReadInternal(const URLRequest& request,
+ int bytes_read) override {
+ ++(*counters_)["on_raw_bytes_read_count"];
+ EXPECT_EQ(1, (*counters_)["on_raw_bytes_read_count"]);
+ }
+
+ void OnCompletedInternal(URLRequest* request, bool started) override {
+ ++(*counters_)["on_completed_count"];
+ EXPECT_EQ(1, (*counters_)["on_completed_count"]);
+ }
+
+ void OnURLRequestDestroyedInternal(URLRequest* request) override {
+ ++(*counters_)["on_url_request_destroyed_count"];
+ EXPECT_EQ(1, (*counters_)["on_url_request_destroyed_count"]);
+ }
+
+ void OnPACScriptErrorInternal(int line_number,
+ const base::string16& error) override {
+ ++(*counters_)["on_pac_script_error_count"];
+ EXPECT_EQ(1, (*counters_)["on_pac_script_error_count"]);
+ }
+
+ void OnAuthRequiredInternal(URLRequest* request,
+ const AuthChallengeInfo& auth_info,
+ const AuthCallback& callback,
+ AuthCredentials* credentials) override {
+ ++(*counters_)["on_auth_required_count"];
+ EXPECT_EQ(1, (*counters_)["on_auth_required_count"]);
+ }
+
+ void OnCanGetCookiesInternal(const URLRequest& request,
+ const CookieList& cookie_list) override {
+ ++(*counters_)["on_can_get_cookies_count"];
+ EXPECT_EQ(1, (*counters_)["on_can_get_cookies_count"]);
+ }
+
+ void OnCanSetCookieInternal(const URLRequest& request,
+ const std::string& cookie_line,
+ CookieOptions* options) override {
+ ++(*counters_)["on_can_set_cookie_count"];
+ EXPECT_EQ(1, (*counters_)["on_can_set_cookie_count"]);
+ }
+
+ void OnCanAccessFileInternal(const URLRequest& request,
+ const base::FilePath& path) const override {
+ ++(*counters_)["on_can_access_file_count"];
+ EXPECT_EQ(1, (*counters_)["on_can_access_file_count"]);
+ }
+
+ void OnCanThrottleRequestInternal(const URLRequest& request) const override {
+ ++(*counters_)["on_can_throttle_request_count"];
+ EXPECT_EQ(1, (*counters_)["on_can_throttle_request_count"]);
+ }
+
+ void OnCanEnablePrivacyModeInternal(
+ const GURL& url,
+ const GURL& first_party_for_cookies) const override {
+ ++(*counters_)["on_can_enable_privacy_mode_count"];
+ EXPECT_EQ(1, (*counters_)["on_can_enable_privacy_mode_count"]);
+ }
+
+ void OnCancelURLRequestWithPolicyViolatingReferrerHeaderInternal(
+ const URLRequest& request,
+ const GURL& target_url,
+ const GURL& referrer_url) const override {
+ ++(*counters_)
+ ["on_cancel_url_request_with_policy_"
+ "violating_referrer_header_count"];
+ EXPECT_EQ(1, (*counters_)
+ ["on_cancel_url_request_with_policy_"
+ "violating_referrer_header_count"]);
+ }
+
+ private:
+ TestURLRequestContext context_;
+ TestDelegate delegate_;
+ mutable CountersMap* counters_;
+
+ DISALLOW_COPY_AND_ASSIGN(TestLayeredNetworkDelegate);
+};
+
+} // namespace
+
+class LayeredNetworkDelegateTest : public testing::Test {
+ public:
+ LayeredNetworkDelegateTest() {
+ scoped_ptr<TestNetworkDelegateImpl> test_network_delegate(
+ new TestNetworkDelegateImpl(&layered_network_delegate_counters));
+ test_network_delegate_ = test_network_delegate.get();
+ layered_network_delegate_ =
+ scoped_ptr<TestLayeredNetworkDelegate>(new TestLayeredNetworkDelegate(
+ test_network_delegate.Pass(), &layered_network_delegate_counters));
+ }
+
+ CountersMap layered_network_delegate_counters;
+ TestNetworkDelegateImpl* test_network_delegate_;
+ scoped_ptr<TestLayeredNetworkDelegate> layered_network_delegate_;
+};
+
+TEST_F(LayeredNetworkDelegateTest, VerifyLayeredNetworkDelegateInternal) {
+ layered_network_delegate_->CallAndVerify();
+}
+
+} // namespace net
diff --git a/net/base/net_util.cc b/net/base/net_util.cc
index 6f28068..3b49dff 100644
--- a/net/base/net_util.cc
+++ b/net/base/net_util.cc
@@ -107,7 +107,6 @@
143, // imap2
179, // BGP
389, // ldap
- 443, // https / wss (see https://crbug.com/436451)
465, // smtp+ssl
512, // print / exec
513, // login
@@ -145,11 +144,6 @@
22, // ssh
};
-// HTTPS and WSS override the following restricted port.
-static const int kAllowedHttpsOrWssPorts[] = {
- 443, // https / wss
-};
-
bool IPNumberPrefixCheck(const IPAddressNumber& ip_number,
const unsigned char* ip_prefix,
size_t prefix_length_in_bits) {
@@ -326,29 +320,6 @@
return IsPortAllowedByDefault(port);
}
-bool IsPortAllowedByHttpsOrWss(int port) {
- int array_size = arraysize(kAllowedHttpsOrWssPorts);
- for (int i = 0; i < array_size; i++) {
- if (kAllowedHttpsOrWssPorts[i] == port) {
- return true;
- }
- }
- // Port not explicitly allowed by HTTPS or WSS, so return the default
- // restrictions.
- return IsPortAllowedByDefault(port);
-}
-
-bool IsEffectivePortAllowedByScheme(const GURL& url) {
- int port = url.EffectiveIntPort();
- if (url.SchemeIs("ftp")) {
- return IsPortAllowedByFtp(port);
- } else if (url.SchemeIs("https") || url.SchemeIs("wss")) {
- return IsPortAllowedByHttpsOrWss(port);
- } else {
- return IsPortAllowedByDefault(port);
- }
-}
-
bool IsPortAllowedByOverride(int port) {
if (g_explicitly_allowed_ports.Get().empty())
return false;
diff --git a/net/base/net_util.h b/net/base/net_util.h
index 9802097..9e9dbad 100644
--- a/net/base/net_util.h
+++ b/net/base/net_util.h
@@ -260,15 +260,6 @@
// protocol. Returns true if |port| is allowed, false if it is restricted.
NET_EXPORT_PRIVATE bool IsPortAllowedByFtp(int port);
-// Checks |port| against a list of ports which are restricted by the HTTPS/WSS
-// protocols. Returns true if |port| is allowed, false if it is restricted.
-NET_EXPORT_PRIVATE bool IsPortAllowedByHttpsOrWss(int port);
-
-// Checks the effective port of the |url| against a list of ports which are
-// restricted by the scheme of the |url|. Returns true if the port is allowed,
-// false if it is restricted.
-NET_EXPORT_PRIVATE bool IsEffectivePortAllowedByScheme(const GURL& url);
-
// Check if banned |port| has been overriden by an entry in
// |explicitly_allowed_ports_|.
NET_EXPORT_PRIVATE bool IsPortAllowedByOverride(int port);
diff --git a/net/base/network_delegate.cc b/net/base/network_delegate.cc
index d4aa19e..b6858da 100644
--- a/net/base/network_delegate.cc
+++ b/net/base/network_delegate.cc
@@ -242,108 +242,4 @@
request, target_url, referrer_url);
}
-int NetworkDelegate::OnBeforeURLRequest(URLRequest* request,
- const CompletionCallback& callback,
- GURL* new_url) {
- return OK;
-}
-
-void NetworkDelegate::OnResolveProxy(
- const GURL& url,
- int load_flags,
- const ProxyService& proxy_service,
- ProxyInfo* result) {
-}
-
-void NetworkDelegate::OnProxyFallback(const ProxyServer& bad_proxy,
- int net_error) {
-}
-
-int NetworkDelegate::OnBeforeSendHeaders(URLRequest* request,
- const CompletionCallback& callback,
- HttpRequestHeaders* headers) {
- return OK;
-}
-
-void NetworkDelegate::OnBeforeSendProxyHeaders(
- URLRequest* request,
- const ProxyInfo& proxy_info,
- HttpRequestHeaders* headers) {
-}
-
-void NetworkDelegate::OnSendHeaders(URLRequest* request,
- const HttpRequestHeaders& headers) {
-}
-
-int NetworkDelegate::OnHeadersReceived(
- URLRequest* request,
- const CompletionCallback& callback,
- const HttpResponseHeaders* original_response_headers,
- scoped_refptr<HttpResponseHeaders>* override_response_headers,
- GURL* allowed_unsafe_redirect_url) {
- return OK;
-}
-
-void NetworkDelegate::OnBeforeRedirect(URLRequest* request,
- const GURL& new_location) {
-}
-
-void NetworkDelegate::OnResponseStarted(URLRequest* request) {
-}
-
-void NetworkDelegate::OnRawBytesRead(const URLRequest& request,
- int bytes_read) {
-}
-
-void NetworkDelegate::OnCompleted(URLRequest* request, bool started) {
-}
-
-void NetworkDelegate::OnURLRequestDestroyed(URLRequest* request) {
-}
-
-void NetworkDelegate::OnPACScriptError(int line_number,
- const base::string16& error) {
-}
-
-NetworkDelegate::AuthRequiredResponse NetworkDelegate::OnAuthRequired(
- URLRequest* request,
- const AuthChallengeInfo& auth_info,
- const AuthCallback& callback,
- AuthCredentials* credentials) {
- return AUTH_REQUIRED_RESPONSE_NO_ACTION;
-}
-
-bool NetworkDelegate::OnCanGetCookies(const URLRequest& request,
- const CookieList& cookie_list) {
- return true;
-}
-
-bool NetworkDelegate::OnCanSetCookie(const URLRequest& request,
- const std::string& cookie_line,
- CookieOptions* options) {
- return true;
-}
-
-bool NetworkDelegate::OnCanAccessFile(const URLRequest& request,
- const base::FilePath& path) const {
- return false;
-}
-
-bool NetworkDelegate::OnCanThrottleRequest(const URLRequest& request) const {
- return false;
-}
-
-bool NetworkDelegate::OnCanEnablePrivacyMode(
- const GURL& url,
- const GURL& first_party_for_cookies) const {
- return false;
-}
-
-bool NetworkDelegate::OnCancelURLRequestWithPolicyViolatingReferrerHeader(
- const URLRequest& request,
- const GURL& target_url,
- const GURL& referrer_url) const {
- return false;
-}
-
} // namespace net
diff --git a/net/base/network_delegate.h b/net/base/network_delegate.h
index a169fc6..5af2ac1 100644
--- a/net/base/network_delegate.h
+++ b/net/base/network_delegate.h
@@ -128,7 +128,7 @@
// The default implementation returns OK (continue with request).
virtual int OnBeforeURLRequest(URLRequest* request,
const CompletionCallback& callback,
- GURL* new_url);
+ GURL* new_url) = 0;
// Called as the proxy is being resolved for |url|. Allows the delegate to
// override the proxy resolution decision made by ProxyService. The delegate
@@ -136,14 +136,13 @@
virtual void OnResolveProxy(const GURL& url,
int load_flags,
const ProxyService& proxy_service,
- ProxyInfo* result);
+ ProxyInfo* result) = 0;
// Called when use of |bad_proxy| fails due to |net_error|. |net_error| is
// the network error encountered, if any, and OK if the fallback was
// for a reason other than a network error (e.g. the proxy service was
// explicitly directed to skip a proxy).
- virtual void OnProxyFallback(const ProxyServer& bad_proxy,
- int net_error);
+ virtual void OnProxyFallback(const ProxyServer& bad_proxy, int net_error) = 0;
// Called right before the HTTP headers are sent. Allows the delegate to
// read/write |headers| before they get sent out. |callback| and |headers| are
@@ -152,20 +151,20 @@
// See OnBeforeURLRequest for return value description. Returns OK by default.
virtual int OnBeforeSendHeaders(URLRequest* request,
const CompletionCallback& callback,
- HttpRequestHeaders* headers);
+ HttpRequestHeaders* headers) = 0;
// Called after a proxy connection. Allows the delegate to read/write
// |headers| before they get sent out. |headers| is valid only until
// OnCompleted or OnURLRequestDestroyed is called for this request.
virtual void OnBeforeSendProxyHeaders(URLRequest* request,
const ProxyInfo& proxy_info,
- HttpRequestHeaders* headers);
+ HttpRequestHeaders* headers) = 0;
// Called right before the HTTP request(s) are being sent to the network.
// |headers| is only valid until OnCompleted or OnURLRequestDestroyed is
// called for this request.
virtual void OnSendHeaders(URLRequest* request,
- const HttpRequestHeaders& headers);
+ const HttpRequestHeaders& headers) = 0;
// Called for HTTP requests when the headers have been received.
// |original_response_headers| contains the headers as received over the
@@ -185,33 +184,33 @@
const CompletionCallback& callback,
const HttpResponseHeaders* original_response_headers,
scoped_refptr<HttpResponseHeaders>* override_response_headers,
- GURL* allowed_unsafe_redirect_url);
+ GURL* allowed_unsafe_redirect_url) = 0;
// Called right after a redirect response code was received.
// |new_location| is only valid until OnURLRequestDestroyed is called for this
// request.
virtual void OnBeforeRedirect(URLRequest* request,
- const GURL& new_location);
+ const GURL& new_location) = 0;
// This corresponds to URLRequestDelegate::OnResponseStarted.
- virtual void OnResponseStarted(URLRequest* request);
+ virtual void OnResponseStarted(URLRequest* request) = 0;
// Called every time we read raw bytes.
- virtual void OnRawBytesRead(const URLRequest& request, int bytes_read);
+ virtual void OnRawBytesRead(const URLRequest& request, int bytes_read) = 0;
// Indicates that the URL request has been completed or failed.
// |started| indicates whether the request has been started. If false,
// some information like the socket address is not available.
- virtual void OnCompleted(URLRequest* request, bool started);
+ virtual void OnCompleted(URLRequest* request, bool started) = 0;
// Called when an URLRequest is being destroyed. Note that the request is
// being deleted, so it's not safe to call any methods that may result in
// a virtual method call.
- virtual void OnURLRequestDestroyed(URLRequest* request);
+ virtual void OnURLRequestDestroyed(URLRequest* request) = 0;
// Corresponds to ProxyResolverJSBindings::OnError.
virtual void OnPACScriptError(int line_number,
- const base::string16& error);
+ const base::string16& error) = 0;
// Called when a request receives an authentication challenge
// specified by |auth_info|, and is unable to respond using cached
@@ -234,38 +233,38 @@
URLRequest* request,
const AuthChallengeInfo& auth_info,
const AuthCallback& callback,
- AuthCredentials* credentials);
+ AuthCredentials* credentials) = 0;
// Called when reading cookies to allow the network delegate to block access
// to the cookie. This method will never be invoked when
// LOAD_DO_NOT_SEND_COOKIES is specified.
virtual bool OnCanGetCookies(const URLRequest& request,
- const CookieList& cookie_list);
+ const CookieList& cookie_list) = 0;
// Called when a cookie is set to allow the network delegate to block access
// to the cookie. This method will never be invoked when
// LOAD_DO_NOT_SAVE_COOKIES is specified.
virtual bool OnCanSetCookie(const URLRequest& request,
const std::string& cookie_line,
- CookieOptions* options);
+ CookieOptions* options) = 0;
// Called when a file access is attempted to allow the network delegate to
// allow or block access to the given file path. Returns true if access is
// allowed.
virtual bool OnCanAccessFile(const URLRequest& request,
- const base::FilePath& path) const;
+ const base::FilePath& path) const = 0;
// Returns true if the given request may be rejected when the
// URLRequestThrottlerManager believes the server servicing the
// request is overloaded or down.
- virtual bool OnCanThrottleRequest(const URLRequest& request) const;
+ virtual bool OnCanThrottleRequest(const URLRequest& request) const = 0;
// Returns true if the given |url| has to be requested over connection that
// is not tracked by the server. Usually is false, unless user privacy
// settings block cookies from being get or set.
virtual bool OnCanEnablePrivacyMode(
const GURL& url,
- const GURL& first_party_for_cookies) const;
+ const GURL& first_party_for_cookies) const = 0;
// Called when the |referrer_url| for requesting |target_url| during handling
// of the |request| is does not comply with the referrer policy (e.g. a
@@ -275,7 +274,7 @@
virtual bool OnCancelURLRequestWithPolicyViolatingReferrerHeader(
const URLRequest& request,
const GURL& target_url,
- const GURL& referrer_url) const;
+ const GURL& referrer_url) const = 0;
};
} // namespace net
diff --git a/net/base/network_delegate_impl.cc b/net/base/network_delegate_impl.cc
new file mode 100644
index 0000000..f10bee3
--- /dev/null
+++ b/net/base/network_delegate_impl.cc
@@ -0,0 +1,115 @@
+// 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.
+
+#include "net/base/network_delegate_impl.h"
+
+#include "net/base/net_errors.h"
+
+namespace net {
+
+int NetworkDelegateImpl::OnBeforeURLRequest(URLRequest* request,
+ const CompletionCallback& callback,
+ GURL* new_url) {
+ return OK;
+}
+
+void NetworkDelegateImpl::OnResolveProxy(const GURL& url,
+ int load_flags,
+ const ProxyService& proxy_service,
+ ProxyInfo* result) {
+}
+
+void NetworkDelegateImpl::OnProxyFallback(const ProxyServer& bad_proxy,
+ int net_error) {
+}
+
+int NetworkDelegateImpl::OnBeforeSendHeaders(URLRequest* request,
+ const CompletionCallback& callback,
+ HttpRequestHeaders* headers) {
+ return OK;
+}
+
+void NetworkDelegateImpl::OnBeforeSendProxyHeaders(
+ URLRequest* request,
+ const ProxyInfo& proxy_info,
+ HttpRequestHeaders* headers) {
+}
+
+void NetworkDelegateImpl::OnSendHeaders(URLRequest* request,
+ const HttpRequestHeaders& headers) {
+}
+
+int NetworkDelegateImpl::OnHeadersReceived(
+ URLRequest* request,
+ const CompletionCallback& callback,
+ const HttpResponseHeaders* original_response_headers,
+ scoped_refptr<HttpResponseHeaders>* override_response_headers,
+ GURL* allowed_unsafe_redirect_url) {
+ return OK;
+}
+
+void NetworkDelegateImpl::OnBeforeRedirect(URLRequest* request,
+ const GURL& new_location) {
+}
+
+void NetworkDelegateImpl::OnResponseStarted(URLRequest* request) {
+}
+
+void NetworkDelegateImpl::OnRawBytesRead(const URLRequest& request,
+ int bytes_read) {
+}
+
+void NetworkDelegateImpl::OnCompleted(URLRequest* request, bool started) {
+}
+
+void NetworkDelegateImpl::OnURLRequestDestroyed(URLRequest* request) {
+}
+
+void NetworkDelegateImpl::OnPACScriptError(int line_number,
+ const base::string16& error) {
+}
+
+NetworkDelegate::AuthRequiredResponse NetworkDelegateImpl::OnAuthRequired(
+ URLRequest* request,
+ const AuthChallengeInfo& auth_info,
+ const AuthCallback& callback,
+ AuthCredentials* credentials) {
+ return AUTH_REQUIRED_RESPONSE_NO_ACTION;
+}
+
+bool NetworkDelegateImpl::OnCanGetCookies(const URLRequest& request,
+ const CookieList& cookie_list) {
+ return true;
+}
+
+bool NetworkDelegateImpl::OnCanSetCookie(const URLRequest& request,
+ const std::string& cookie_line,
+ CookieOptions* options) {
+ return true;
+}
+
+bool NetworkDelegateImpl::OnCanAccessFile(const URLRequest& request,
+ const base::FilePath& path) const {
+ return false;
+}
+
+bool NetworkDelegateImpl::OnCanThrottleRequest(
+ const URLRequest& request) const {
+ return false;
+}
+
+bool NetworkDelegateImpl::OnCanEnablePrivacyMode(
+ const GURL& url,
+ const GURL& first_party_for_cookies) const {
+ return false;
+}
+
+bool NetworkDelegateImpl::OnCancelURLRequestWithPolicyViolatingReferrerHeader(
+ const URLRequest& request,
+ const GURL& target_url,
+ const GURL& referrer_url) const {
+ return false;
+}
+
+} // namespace net
diff --git a/net/base/network_delegate_impl.h b/net/base/network_delegate_impl.h
new file mode 100644
index 0000000..f5e9def
--- /dev/null
+++ b/net/base/network_delegate_impl.h
@@ -0,0 +1,200 @@
+// 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.
+
+#ifndef NET_BASE_NETWORK_DELEGATE_IMPL_H_
+#define NET_BASE_NETWORK_DELEGATE_IMPL_H_
+
+#include "base/strings/string16.h"
+#include "net/base/completion_callback.h"
+#include "net/base/network_delegate.h"
+#include "net/cookies/canonical_cookie.h"
+
+class GURL;
+
+namespace base {
+class FilePath;
+}
+
+namespace net {
+
+class CookieOptions;
+class HttpRequestHeaders;
+class HttpResponseHeaders;
+class ProxyInfo;
+class ProxyServer;
+class ProxyService;
+class URLRequest;
+
+class NET_EXPORT NetworkDelegateImpl : public NetworkDelegate {
+ public:
+ virtual ~NetworkDelegateImpl() {}
+
+ private:
+ // This is the interface for subclasses of NetworkDelegate to implement. These
+ // member functions will be called by the respective public notification
+ // member function, which will perform basic sanity checking.
+
+ // Called before a request is sent. Allows the delegate to rewrite the URL
+ // being fetched by modifying |new_url|. If set, the URL must be valid. The
+ // reference fragment from the original URL is not automatically appended to
+ // |new_url|; callers are responsible for copying the reference fragment if
+ // desired.
+ // |callback| and |new_url| are valid only until OnURLRequestDestroyed is
+ // called for this request. Returns a net status code, generally either OK to
+ // continue with the request or ERR_IO_PENDING if the result is not ready yet.
+ // A status code other than OK and ERR_IO_PENDING will cancel the request and
+ // report the status code as the reason.
+ //
+ // The default implementation returns OK (continue with request).
+ int OnBeforeURLRequest(URLRequest* request,
+ const CompletionCallback& callback,
+ GURL* new_url) override;
+
+ // Called as the proxy is being resolved for |url|. Allows the delegate to
+ // override the proxy resolution decision made by ProxyService. The delegate
+ // may override the decision by modifying the ProxyInfo |result|.
+ void OnResolveProxy(const GURL& url,
+ int load_flags,
+ const ProxyService& proxy_service,
+ ProxyInfo* result) override;
+
+ // Called when use of |bad_proxy| fails due to |net_error|. |net_error| is
+ // the network error encountered, if any, and OK if the fallback was
+ // for a reason other than a network error (e.g. the proxy service was
+ // explicitly directed to skip a proxy).
+ void OnProxyFallback(const ProxyServer& bad_proxy, int net_error) override;
+
+ // Called right before the HTTP headers are sent. Allows the delegate to
+ // read/write |headers| before they get sent out. |callback| and |headers| are
+ // valid only until OnCompleted or OnURLRequestDestroyed is called for this
+ // request.
+ // See OnBeforeURLRequest for return value description. Returns OK by default.
+ int OnBeforeSendHeaders(URLRequest* request,
+ const CompletionCallback& callback,
+ HttpRequestHeaders* headers) override;
+
+ // Called after a proxy connection. Allows the delegate to read/write
+ // |headers| before they get sent out. |headers| is valid only until
+ // OnCompleted or OnURLRequestDestroyed is called for this request.
+ void OnBeforeSendProxyHeaders(URLRequest* request,
+ const ProxyInfo& proxy_info,
+ HttpRequestHeaders* headers) override;
+
+ // Called right before the HTTP request(s) are being sent to the network.
+ // |headers| is only valid until OnCompleted or OnURLRequestDestroyed is
+ // called for this request.
+ void OnSendHeaders(URLRequest* request,
+ const HttpRequestHeaders& headers) override;
+
+ // Called for HTTP requests when the headers have been received.
+ // |original_response_headers| contains the headers as received over the
+ // network, these must not be modified. |override_response_headers| can be set
+ // to new values, that should be considered as overriding
+ // |original_response_headers|.
+ // If the response is a redirect, and the Location response header value is
+ // identical to |allowed_unsafe_redirect_url|, then the redirect is never
+ // blocked and the reference fragment is not copied from the original URL
+ // to the redirection target.
+ //
+ // |callback|, |original_response_headers|, and |override_response_headers|
+ // are only valid until OnURLRequestDestroyed is called for this request.
+ // See OnBeforeURLRequest for return value description. Returns OK by default.
+ int OnHeadersReceived(
+ URLRequest* request,
+ const CompletionCallback& callback,
+ const HttpResponseHeaders* original_response_headers,
+ scoped_refptr<HttpResponseHeaders>* override_response_headers,
+ GURL* allowed_unsafe_redirect_url) override;
+
+ // Called right after a redirect response code was received.
+ // |new_location| is only valid until OnURLRequestDestroyed is called for this
+ // request.
+ void OnBeforeRedirect(URLRequest* request, const GURL& new_location) override;
+
+ // This corresponds to URLRequestDelegate::OnResponseStarted.
+ void OnResponseStarted(URLRequest* request) override;
+
+ // Called every time we read raw bytes.
+ void OnRawBytesRead(const URLRequest& request, int bytes_read) override;
+
+ // Indicates that the URL request has been completed or failed.
+ // |started| indicates whether the request has been started. If false,
+ // some information like the socket address is not available.
+ void OnCompleted(URLRequest* request, bool started) override;
+
+ // Called when an URLRequest is being destroyed. Note that the request is
+ // being deleted, so it's not safe to call any methods that may result in
+ // a virtual method call.
+ void OnURLRequestDestroyed(URLRequest* request) override;
+
+ // Corresponds to ProxyResolverJSBindings::OnError.
+ void OnPACScriptError(int line_number, const base::string16& error) override;
+
+ // Called when a request receives an authentication challenge
+ // specified by |auth_info|, and is unable to respond using cached
+ // credentials. |callback| and |credentials| must be non-NULL, and must
+ // be valid until OnURLRequestDestroyed is called for |request|.
+ //
+ // The following return values are allowed:
+ // - AUTH_REQUIRED_RESPONSE_NO_ACTION: |auth_info| is observed, but
+ // no action is being taken on it.
+ // - AUTH_REQUIRED_RESPONSE_SET_AUTH: |credentials| is filled in with
+ // a username and password, which should be used in a response to
+ // |auth_info|.
+ // - AUTH_REQUIRED_RESPONSE_CANCEL_AUTH: The authentication challenge
+ // should not be attempted.
+ // - AUTH_REQUIRED_RESPONSE_IO_PENDING: The action will be decided
+ // asynchronously. |callback| will be invoked when the decision is made,
+ // and one of the other AuthRequiredResponse values will be passed in with
+ // the same semantics as described above.
+ AuthRequiredResponse OnAuthRequired(URLRequest* request,
+ const AuthChallengeInfo& auth_info,
+ const AuthCallback& callback,
+ AuthCredentials* credentials) override;
+
+ // Called when reading cookies to allow the network delegate to block access
+ // to the cookie. This method will never be invoked when
+ // LOAD_DO_NOT_SEND_COOKIES is specified.
+ bool OnCanGetCookies(const URLRequest& request,
+ const CookieList& cookie_list) override;
+
+ // Called when a cookie is set to allow the network delegate to block access
+ // to the cookie. This method will never be invoked when
+ // LOAD_DO_NOT_SAVE_COOKIES is specified.
+ bool OnCanSetCookie(const URLRequest& request,
+ const std::string& cookie_line,
+ CookieOptions* options) override;
+
+ // Called when a file access is attempted to allow the network delegate to
+ // allow or block access to the given file path. Returns true if access is
+ // allowed.
+ bool OnCanAccessFile(const URLRequest& request,
+ const base::FilePath& path) const override;
+
+ // Returns true if the given request may be rejected when the
+ // URLRequestThrottlerManager believes the server servicing the
+ // request is overloaded or down.
+ bool OnCanThrottleRequest(const URLRequest& request) const override;
+
+ // Returns true if the given |url| has to be requested over connection that
+ // is not tracked by the server. Usually is false, unless user privacy
+ // settings block cookies from being get or set.
+ bool OnCanEnablePrivacyMode(
+ const GURL& url,
+ const GURL& first_party_for_cookies) const override;
+
+ // Called when the |referrer_url| for requesting |target_url| during handling
+ // of the |request| is does not comply with the referrer policy (e.g. a
+ // secure referrer for an insecure initial target).
+ // Returns true if the request should be cancelled. Otherwise, the referrer
+ // header is stripped from the request.
+ bool OnCancelURLRequestWithPolicyViolatingReferrerHeader(
+ const URLRequest& request,
+ const GURL& target_url,
+ const GURL& referrer_url) const override;
+};
+
+} // namespace net
+
+#endif // NET_BASE_NETWORK_DELEGATE_IMPL_H_
diff --git a/net/base/test_completion_callback.h b/net/base/test_completion_callback.h
index c1f715c..11ebb05 100644
--- a/net/base/test_completion_callback.h
+++ b/net/base/test_completion_callback.h
@@ -7,7 +7,6 @@
#include "base/callback.h"
#include "base/compiler_specific.h"
-#include "base/tuple.h"
#include "net/base/completion_callback.h"
#include "net/base/net_errors.h"
diff --git a/net/disk_cache/disk_cache_test_util.h b/net/disk_cache/disk_cache_test_util.h
index ad6b6ac..0f40f5e 100644
--- a/net/disk_cache/disk_cache_test_util.h
+++ b/net/disk_cache/disk_cache_test_util.h
@@ -10,7 +10,6 @@
#include "base/files/file_path.h"
#include "base/message_loop/message_loop.h"
#include "base/timer/timer.h"
-#include "base/tuple.h"
#include "build/build_config.h"
// Re-creates a given test file inside the cache test folder.
diff --git a/net/http/http_stream_factory_impl_job.cc b/net/http/http_stream_factory_impl_job.cc
index 5887d2a..8369443 100644
--- a/net/http/http_stream_factory_impl_job.cc
+++ b/net/http/http_stream_factory_impl_job.cc
@@ -623,15 +623,15 @@
&request_info_.url, &origin_url_,
priority_));
+ // Don't connect to restricted ports.
+ bool is_port_allowed = IsPortAllowedByDefault(origin_.port());
if (request_info_.url.SchemeIs("ftp")) {
// Never share connection with other jobs for FTP requests.
DCHECK(!waiting_job_);
- }
- // Don't connect to restricted ports.
- // Note: origin_.port() == request_info_.url.EffectiveIntPort()
- if (!IsEffectivePortAllowedByScheme(request_info_.url) &&
- !IsPortAllowedByOverride(origin_.port())) {
+ is_port_allowed = IsPortAllowedByFtp(origin_.port());
+ }
+ if (!is_port_allowed && !IsPortAllowedByOverride(origin_.port())) {
if (waiting_job_) {
waiting_job_->Resume(this);
waiting_job_ = NULL;
diff --git a/net/net.gypi b/net/net.gypi
index f9f6d23..7d7d2f0 100644
--- a/net/net.gypi
+++ b/net/net.gypi
@@ -266,6 +266,8 @@
'base/network_config_watcher_mac.h',
'base/network_delegate.cc',
'base/network_delegate.h',
+ 'base/network_delegate_impl.cc',
+ 'base/network_delegate_impl.h',
'base/nss_memio.c',
'base/nss_memio.h',
'base/platform_mime_util.h',
@@ -308,6 +310,8 @@
'base/winsock_init.h',
'base/winsock_util.cc',
'base/winsock_util.h',
+ 'base/layered_network_delegate.cc',
+ 'base/layered_network_delegate.h',
'cert/cert_database_android.cc',
'cert/cert_database_ios.cc',
'cert/cert_database_mac.cc',
@@ -1299,6 +1303,7 @@
'base/upload_bytes_element_reader_unittest.cc',
'base/upload_file_element_reader_unittest.cc',
'base/url_util_unittest.cc',
+ 'base/layered_network_delegate_unittest.cc',
'cert/cert_policy_enforcer_unittest.cc',
'cert/cert_verify_proc_unittest.cc',
'cert/crl_set_unittest.cc',
diff --git a/net/proxy/network_delegate_error_observer_unittest.cc b/net/proxy/network_delegate_error_observer_unittest.cc
index da87f8d..0a2e01a 100644
--- a/net/proxy/network_delegate_error_observer_unittest.cc
+++ b/net/proxy/network_delegate_error_observer_unittest.cc
@@ -9,14 +9,14 @@
#include "base/message_loop/message_loop_proxy.h"
#include "base/threading/thread.h"
#include "net/base/net_errors.h"
-#include "net/base/network_delegate.h"
+#include "net/base/network_delegate_impl.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace net {
namespace {
-class TestNetworkDelegate : public net::NetworkDelegate {
+class TestNetworkDelegate : public net::NetworkDelegateImpl {
public:
TestNetworkDelegate() : got_pac_error_(false) {}
~TestNetworkDelegate() override {}
diff --git a/net/proxy/proxy_script_fetcher_impl_unittest.cc b/net/proxy/proxy_script_fetcher_impl_unittest.cc
index 4c5bd4c..52c248f 100644
--- a/net/proxy/proxy_script_fetcher_impl_unittest.cc
+++ b/net/proxy/proxy_script_fetcher_impl_unittest.cc
@@ -12,6 +12,7 @@
#include "base/strings/utf_string_conversions.h"
#include "net/base/filename_util.h"
#include "net/base/load_flags.h"
+#include "net/base/network_delegate_impl.h"
#include "net/base/test_completion_callback.h"
#include "net/cert/mock_cert_verifier.h"
#include "net/disk_cache/disk_cache.h"
@@ -107,7 +108,7 @@
// without introducing layering violations. Also causes a test failure if a
// request is seen that doesn't set a load flag to bypass revocation checking.
-class BasicNetworkDelegate : public NetworkDelegate {
+class BasicNetworkDelegate : public NetworkDelegateImpl {
public:
BasicNetworkDelegate() {}
~BasicNetworkDelegate() override {}
diff --git a/net/proxy/proxy_service_unittest.cc b/net/proxy/proxy_service_unittest.cc
index cfaaccf..84ce101 100644
--- a/net/proxy/proxy_service_unittest.cc
+++ b/net/proxy/proxy_service_unittest.cc
@@ -14,7 +14,7 @@
#include "net/base/net_errors.h"
#include "net/base/net_log.h"
#include "net/base/net_log_unittest.h"
-#include "net/base/network_delegate.h"
+#include "net/base/network_delegate_impl.h"
#include "net/base/test_completion_callback.h"
#include "net/proxy/dhcp_proxy_script_fetcher.h"
#include "net/proxy/mock_proxy_resolver.h"
@@ -158,7 +158,7 @@
};
// A test network delegate that exercises the OnResolveProxy callback.
-class TestResolveProxyNetworkDelegate : public NetworkDelegate {
+class TestResolveProxyNetworkDelegate : public NetworkDelegateImpl {
public:
TestResolveProxyNetworkDelegate()
: on_resolve_proxy_called_(false),
@@ -205,7 +205,7 @@
};
// A test network delegate that exercises the OnProxyFallback callback.
-class TestProxyFallbackNetworkDelegate : public NetworkDelegate {
+class TestProxyFallbackNetworkDelegate : public NetworkDelegateImpl {
public:
TestProxyFallbackNetworkDelegate()
: on_proxy_fallback_called_(false),
@@ -507,7 +507,7 @@
// Now, imagine that connecting to foopy:8080 fails: there is nothing
// left to fallback to, since our proxy list was NOT terminated by
// DIRECT.
- NetworkDelegate network_delegate;
+ NetworkDelegateImpl network_delegate;
TestCompletionCallback callback2;
ProxyServer expected_proxy_server = info.proxy_server();
rv = service.ReconsiderProxyAfterError(
@@ -618,7 +618,7 @@
EXPECT_EQ("foobar:10", info.proxy_server().ToURI());
// Fallback 2.
- NetworkDelegate network_delegate;
+ NetworkDelegateImpl network_delegate;
ProxyServer expected_proxy_server3 = info.proxy_server();
TestCompletionCallback callback3;
rv = service.ReconsiderProxyAfterError(url, net::LOAD_NORMAL,
diff --git a/net/socket/client_socket_pool_manager.cc b/net/socket/client_socket_pool_manager.cc
index bc7d111..8b6c17c 100644
--- a/net/socket/client_socket_pool_manager.cc
+++ b/net/socket/client_socket_pool_manager.cc
@@ -129,7 +129,8 @@
// should be the same for all connections, whereas version_max may
// change for version fallbacks.
std::string prefix = "ssl/";
- if (ssl_config_for_origin.version_max != kDefaultSSLVersionMax) {
+ if (ssl_config_for_origin.version_max !=
+ SSLClientSocket::GetMaxSupportedSSLVersion()) {
switch (ssl_config_for_origin.version_max) {
case SSL_PROTOCOL_VERSION_TLS1_2:
prefix = "ssl(max:3.3)/";
diff --git a/net/ssl/ssl_config.cc b/net/ssl/ssl_config.cc
index 8efdd58..56cb75c 100644
--- a/net/ssl/ssl_config.cc
+++ b/net/ssl/ssl_config.cc
@@ -4,12 +4,12 @@
#include "net/ssl/ssl_config.h"
+#include "net/socket/ssl_client_socket.h"
+
namespace net {
const uint16 kDefaultSSLVersionMin = SSL_PROTOCOL_VERSION_TLS1;
-const uint16 kDefaultSSLVersionMax = SSL_PROTOCOL_VERSION_TLS1_2;
-
const uint16 kDefaultSSLVersionFallbackMin = SSL_PROTOCOL_VERSION_TLS1;
SSLConfig::CertAndStatus::CertAndStatus() : cert_status(0) {}
@@ -20,7 +20,7 @@
: rev_checking_enabled(false),
rev_checking_required_local_anchors(false),
version_min(kDefaultSSLVersionMin),
- version_max(kDefaultSSLVersionMax),
+ version_max(SSLClientSocket::GetMaxSupportedSSLVersion()),
version_fallback_min(kDefaultSSLVersionFallbackMin),
channel_id_enabled(true),
false_start_enabled(true),
diff --git a/net/ssl/ssl_config.h b/net/ssl/ssl_config.h
index 1deaf6e..5a0c0fa 100644
--- a/net/ssl/ssl_config.h
+++ b/net/ssl/ssl_config.h
@@ -29,8 +29,8 @@
// Default minimum protocol version.
NET_EXPORT extern const uint16 kDefaultSSLVersionMin;
-// Default maximum protocol version.
-NET_EXPORT extern const uint16 kDefaultSSLVersionMax;
+// For maximum supported protocol version, use
+// SSLClientSocket::GetMaxSupportedSSLVersion().
// Default minimum protocol version that it's acceptable to fallback to.
NET_EXPORT extern const uint16 kDefaultSSLVersionFallbackMin;
diff --git a/net/test/android/javatests/src/org/chromium/net/test/util/TestWebServer.java b/net/test/android/javatests/src/org/chromium/net/test/util/TestWebServer.java
index 6121a2a..dd40220 100644
--- a/net/test/android/javatests/src/org/chromium/net/test/util/TestWebServer.java
+++ b/net/test/android/javatests/src/org/chromium/net/test/util/TestWebServer.java
@@ -612,8 +612,9 @@
HttpParams params = new BasicHttpParams();
params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_0);
while (!mIsCancelled) {
+ Socket socket = null;
try {
- Socket socket = mSocket.accept();
+ socket = mSocket.accept();
DefaultHttpServerConnection conn = new DefaultHttpServerConnection();
conn.bind(socket, params);
@@ -628,8 +629,9 @@
HttpResponse response = mServer.getResponse(request);
conn.sendResponseHeader(response);
conn.sendResponseEntity(response);
- conn.close();
+ conn.close();
+ socket = null;
} catch (IOException e) {
// normal during shutdown, ignore
Log.w(TAG, e);
@@ -641,6 +643,18 @@
// DefaultHttpServerConnection's close() throws an
// UnsupportedOperationException.
Log.w(TAG, e);
+ } finally {
+ // Since DefaultHttpServerConnection can raise an exception
+ // during conn.close() (in the case of SSL), we always force
+ // the socket to close, since it may be left open. This will
+ // be a no-op if the connection managed to close the socket.
+ if (socket != null) {
+ try {
+ socket.close();
+ } catch (IOException ignored) {
+ // safe to ignore
+ }
+ }
}
}
try {
diff --git a/net/url_request/url_request_context_builder.cc b/net/url_request/url_request_context_builder.cc
index 838aa7b..c2e1135 100644
--- a/net/url_request/url_request_context_builder.cc
+++ b/net/url_request/url_request_context_builder.cc
@@ -14,7 +14,7 @@
#include "base/threading/thread.h"
#include "net/base/cache_type.h"
#include "net/base/net_errors.h"
-#include "net/base/network_delegate.h"
+#include "net/base/network_delegate_impl.h"
#include "net/cert/cert_verifier.h"
#include "net/cookies/cookie_monster.h"
#include "net/dns/host_resolver.h"
@@ -48,7 +48,7 @@
namespace {
-class BasicNetworkDelegate : public NetworkDelegate {
+class BasicNetworkDelegate : public NetworkDelegateImpl {
public:
BasicNetworkDelegate() {}
~BasicNetworkDelegate() override {}
diff --git a/net/url_request/url_request_test_util.h b/net/url_request/url_request_test_util.h
index 1c385b2..9ad66a1 100644
--- a/net/url_request/url_request_test_util.h
+++ b/net/url_request/url_request_test_util.h
@@ -23,7 +23,7 @@
#include "net/base/io_buffer.h"
#include "net/base/load_timing_info.h"
#include "net/base/net_errors.h"
-#include "net/base/network_delegate.h"
+#include "net/base/network_delegate_impl.h"
#include "net/base/request_priority.h"
#include "net/base/sdch_manager.h"
#include "net/cert/cert_verifier.h"
@@ -220,7 +220,7 @@
//-----------------------------------------------------------------------------
-class TestNetworkDelegate : public NetworkDelegate {
+class TestNetworkDelegate : public NetworkDelegateImpl {
public:
enum Options {
NO_GET_COOKIES = 1 << 0,
diff --git a/net/url_request/url_request_unittest.cc b/net/url_request/url_request_unittest.cc
index 099a319..3835aef 100644
--- a/net/url_request/url_request_unittest.cc
+++ b/net/url_request/url_request_unittest.cc
@@ -5437,25 +5437,6 @@
}
}
-// Make sure an HTTP request using the "unsafe" port 443 fails.
-// See: https://crbug.com/436451
-TEST_F(URLRequestTestHTTP, UnsafePort) {
- TestDelegate d;
- {
- scoped_ptr<URLRequest> r(default_context_.CreateRequest(
- GURL("http://www.google.com:443/"), DEFAULT_PRIORITY, &d, NULL));
-
- r->Start();
- EXPECT_TRUE(r->is_pending());
-
- base::RunLoop().Run();
-
- EXPECT_FALSE(r->is_pending());
- EXPECT_EQ(URLRequestStatus::FAILED, r->status().status());
- EXPECT_EQ(ERR_UNSAFE_PORT, r->status().error());
- }
-}
-
// Tests that redirection to an unsafe URL is allowed when it has been marked as
// safe.
TEST_F(URLRequestTestHTTP, UnsafeRedirectToWhitelistedUnsafeURL) {
diff --git a/sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions_unittests.cc b/sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions_unittests.cc
index 264ee4d..01ad1f2 100644
--- a/sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions_unittests.cc
+++ b/sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions_unittests.cc
@@ -227,8 +227,8 @@
};
BPF_TEST_C(ParameterRestrictions, prlimit64_allowed, RestrictPrlimit64Policy) {
- BPF_ASSERT_EQ(0, syscall(__NR_prlimit64, 0, RLIMIT_AS, NULL, NULL));
- BPF_ASSERT_EQ(0, syscall(__NR_prlimit64, getpid(), RLIMIT_AS, NULL, NULL));
+ BPF_ASSERT_EQ(0, sys_prlimit64(0, RLIMIT_AS, NULL, NULL));
+ BPF_ASSERT_EQ(0, sys_prlimit64(getpid(), RLIMIT_AS, NULL, NULL));
}
BPF_DEATH_TEST_C(ParameterRestrictions,
@@ -237,7 +237,7 @@
RestrictPrlimit64Policy) {
const pid_t kInitPID = 1;
BPF_ASSERT_NE(kInitPID, getpid());
- syscall(__NR_prlimit64, kInitPID, RLIMIT_AS, NULL, NULL);
+ sys_prlimit64(kInitPID, RLIMIT_AS, NULL, NULL);
}
} // namespace
diff --git a/sandbox/linux/services/syscall_wrappers.cc b/sandbox/linux/services/syscall_wrappers.cc
index ede4964..c368519 100644
--- a/sandbox/linux/services/syscall_wrappers.cc
+++ b/sandbox/linux/services/syscall_wrappers.cc
@@ -4,7 +4,9 @@
#include "sandbox/linux/services/syscall_wrappers.h"
+#include <sys/resource.h>
#include <sys/syscall.h>
+#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
@@ -62,4 +64,11 @@
return syscall(__NR_seccomp, operation, flags, args);
}
+int sys_prlimit64(pid_t pid,
+ int resource,
+ const struct rlimit64* new_limit,
+ struct rlimit64* old_limit) {
+ return syscall(__NR_prlimit64, pid, resource, new_limit, old_limit);
+}
+
} // namespace sandbox
diff --git a/sandbox/linux/services/syscall_wrappers.h b/sandbox/linux/services/syscall_wrappers.h
index 15ec81b..64028f7 100644
--- a/sandbox/linux/services/syscall_wrappers.h
+++ b/sandbox/linux/services/syscall_wrappers.h
@@ -10,6 +10,7 @@
#include "sandbox/sandbox_export.h"
struct sock_fprog;
+struct rlimit64;
namespace sandbox {
@@ -38,6 +39,12 @@
unsigned int flags,
const struct sock_fprog* args);
+// Some libcs do not expose a prlimit64 wrapper.
+SANDBOX_EXPORT int sys_prlimit64(pid_t pid,
+ int resource,
+ const struct rlimit64* new_limit,
+ struct rlimit64* old_limit);
+
} // namespace sandbox
#endif // SANDBOX_LINUX_SERVICES_SYSCALL_WRAPPERS_H_
diff --git a/services/surfaces/surfaces_scheduler.cc b/services/surfaces/surfaces_scheduler.cc
index cc3df42..6e099f4 100644
--- a/services/surfaces/surfaces_scheduler.cc
+++ b/services/surfaces/surfaces_scheduler.cc
@@ -64,7 +64,7 @@
scheduler_->DidCreateAndInitializeOutputSurface();
}
-void SurfacesScheduler::ScheduledActionManageTiles() {
+void SurfacesScheduler::ScheduledActionPrepareTiles() {
}
void SurfacesScheduler::DidAnticipatedDrawTimeChange(base::TimeTicks time) {
diff --git a/services/surfaces/surfaces_scheduler.h b/services/surfaces/surfaces_scheduler.h
index 01a5da9..e985973 100644
--- a/services/surfaces/surfaces_scheduler.h
+++ b/services/surfaces/surfaces_scheduler.h
@@ -36,7 +36,7 @@
void ScheduledActionCommit() override;
void ScheduledActionActivateSyncTree() override;
void ScheduledActionBeginOutputSurfaceCreation() override;
- void ScheduledActionManageTiles() override;
+ void ScheduledActionPrepareTiles() override;
void DidAnticipatedDrawTimeChange(base::TimeTicks time) override;
base::TimeDelta DrawDurationEstimate() override;
base::TimeDelta BeginMainFrameToCommitDurationEstimate() override;
diff --git a/skia/ext/analysis_canvas.cc b/skia/ext/analysis_canvas.cc
index 17e8390..e5e702e 100644
--- a/skia/ext/analysis_canvas.cc
+++ b/skia/ext/analysis_canvas.cc
@@ -203,14 +203,6 @@
++draw_op_count_;
}
-void AnalysisCanvas::drawBitmapMatrix(const SkBitmap& bitmap,
- const SkMatrix& matrix,
- const SkPaint* paint) {
- is_solid_color_ = false;
- is_transparent_ = false;
- ++draw_op_count_;
-}
-
void AnalysisCanvas::drawBitmapNine(const SkBitmap& bitmap,
const SkIRect& center,
const SkRect& dst,
diff --git a/skia/ext/analysis_canvas.h b/skia/ext/analysis_canvas.h
index 105ff2c..53a91d3 100644
--- a/skia/ext/analysis_canvas.h
+++ b/skia/ext/analysis_canvas.h
@@ -48,9 +48,6 @@
const SkRect& dst,
const SkPaint* paint,
DrawBitmapRectFlags flags) override;
- void drawBitmapMatrix(const SkBitmap&,
- const SkMatrix&,
- const SkPaint* paint = NULL) override;
void drawBitmapNine(const SkBitmap& bitmap,
const SkIRect& center,
const SkRect& dst,
diff --git a/skia/ext/benchmarking_canvas.cc b/skia/ext/benchmarking_canvas.cc
index 64d3f6c..72541cd 100644
--- a/skia/ext/benchmarking_canvas.cc
+++ b/skia/ext/benchmarking_canvas.cc
@@ -6,6 +6,7 @@
#include "base/logging.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/SkProxyCanvas.h"
namespace skia {
@@ -24,9 +25,9 @@
public:
TimingCanvas(int width, int height, const BenchmarkingCanvas* track_canvas)
: tracking_canvas_(track_canvas) {
- canvas_ = skia::AdoptRef(SkCanvas::NewRasterN32(width, height));
+ surface_ = skia::AdoptRef(SkSurface::NewRasterPMColor(width, height));
- setProxy(canvas_.get());
+ setProxy(surface_->getCanvas());
}
~TimingCanvas() override {}
@@ -106,13 +107,6 @@
SkProxyCanvas::drawBitmapRectToRect(bitmap, src, dst, paint, flags);
}
- void drawBitmapMatrix(const SkBitmap& bitmap,
- const SkMatrix& m,
- const SkPaint* paint = NULL) override {
- AutoStamper stamper(this);
- SkProxyCanvas::drawBitmapMatrix(bitmap, m, paint);
- }
-
void drawSprite(const SkBitmap& bitmap,
int left,
int top,
@@ -213,7 +207,7 @@
typedef base::hash_map<size_t, base::TimeDelta> TimingsMap;
TimingsMap timings_map_;
- skia::RefPtr<SkCanvas> canvas_;
+ skia::RefPtr<SkSurface> surface_;
friend class AutoStamper;
const BenchmarkingCanvas* tracking_canvas_;
diff --git a/skia/ext/bitmap_platform_device_cairo.cc b/skia/ext/bitmap_platform_device_cairo.cc
index e9dcf3b..a331bed 100644
--- a/skia/ext/bitmap_platform_device_cairo.cc
+++ b/skia/ext/bitmap_platform_device_cairo.cc
@@ -185,12 +185,6 @@
return cairo_;
}
-void BitmapPlatformDevice::DrawToNativeContext(
- PlatformSurface surface, int x, int y, const PlatformRect* src_rect) {
- // Should never be called on Linux.
- SkASSERT(false);
-}
-
void BitmapPlatformDevice::setMatrixClip(const SkMatrix& transform,
const SkRegion& region,
const SkClipStack&) {
diff --git a/skia/ext/bitmap_platform_device_cairo.h b/skia/ext/bitmap_platform_device_cairo.h
index 67a2f19..938dd15 100644
--- a/skia/ext/bitmap_platform_device_cairo.h
+++ b/skia/ext/bitmap_platform_device_cairo.h
@@ -89,8 +89,6 @@
// Overridden from PlatformDevice:
virtual cairo_t* BeginPlatformPaint() override;
- virtual void DrawToNativeContext(PlatformSurface surface, int x, int y,
- const PlatformRect* src_rect) override;
protected:
virtual SkBaseDevice* onCreateCompatibleDevice(const CreateInfo& info)
diff --git a/skia/ext/bitmap_platform_device_mac.cc b/skia/ext/bitmap_platform_device_mac.cc
index 53569c8..ff7c2ad 100644
--- a/skia/ext/bitmap_platform_device_mac.cc
+++ b/skia/ext/bitmap_platform_device_mac.cc
@@ -200,37 +200,6 @@
SetMatrixClip(transform, region);
}
-void BitmapPlatformDevice::DrawToNativeContext(CGContextRef context, int x,
- int y, const CGRect* src_rect) {
- bool created_dc = false;
- if (!bitmap_context_) {
- created_dc = true;
- GetBitmapContext();
- }
-
- // this should not make a copy of the bits, since we're not doing
- // anything to trigger copy on write
- CGImageRef image = CGBitmapContextCreateImage(bitmap_context_);
- CGRect bounds;
- bounds.origin.x = x;
- bounds.origin.y = y;
- if (src_rect) {
- bounds.size.width = src_rect->size.width;
- bounds.size.height = src_rect->size.height;
- CGImageRef sub_image = CGImageCreateWithImageInRect(image, *src_rect);
- CGContextDrawImage(context, bounds, sub_image);
- CGImageRelease(sub_image);
- } else {
- bounds.size.width = width();
- bounds.size.height = height();
- CGContextDrawImage(context, bounds, image);
- }
- CGImageRelease(image);
-
- if (created_dc)
- ReleaseBitmapContext();
-}
-
SkBaseDevice* BitmapPlatformDevice::onCreateCompatibleDevice(
const CreateInfo& cinfo) {
const SkImageInfo& info = cinfo.fInfo;
diff --git a/skia/ext/bitmap_platform_device_mac.h b/skia/ext/bitmap_platform_device_mac.h
index 33ce214..6c8dc84 100644
--- a/skia/ext/bitmap_platform_device_mac.h
+++ b/skia/ext/bitmap_platform_device_mac.h
@@ -47,10 +47,6 @@
// PlatformDevice overrides
CGContextRef GetBitmapContext() override;
- void DrawToNativeContext(CGContextRef context,
- int x,
- int y,
- const CGRect* src_rect) override;
// SkBaseDevice overrides
void setMatrixClip(const SkMatrix& transform,
diff --git a/skia/ext/bitmap_platform_device_skia.cc b/skia/ext/bitmap_platform_device_skia.cc
index d057913..136706d 100644
--- a/skia/ext/bitmap_platform_device_skia.cc
+++ b/skia/ext/bitmap_platform_device_skia.cc
@@ -55,12 +55,6 @@
return accessBitmap(true).getPixels();
}
-void BitmapPlatformDevice::DrawToNativeContext(
- PlatformSurface surface, int x, int y, const PlatformRect* src_rect) {
- // Should never be called on Android.
- SkASSERT(false);
-}
-
// PlatformCanvas impl
SkCanvas* CreatePlatformCanvas(int width, int height, bool is_opaque,
diff --git a/skia/ext/bitmap_platform_device_skia.h b/skia/ext/bitmap_platform_device_skia.h
index dfbee56..90a2a9a 100644
--- a/skia/ext/bitmap_platform_device_skia.h
+++ b/skia/ext/bitmap_platform_device_skia.h
@@ -38,8 +38,6 @@
virtual ~BitmapPlatformDevice();
virtual PlatformSurface BeginPlatformPaint() override;
- virtual void DrawToNativeContext(PlatformSurface surface, int x, int y,
- const PlatformRect* src_rect) override;
protected:
virtual SkBaseDevice* onCreateCompatibleDevice(const CreateInfo& info)
diff --git a/skia/ext/bitmap_platform_device_win.cc b/skia/ext/bitmap_platform_device_win.cc
index 71bb800..0f16694 100644
--- a/skia/ext/bitmap_platform_device_win.cc
+++ b/skia/ext/bitmap_platform_device_win.cc
@@ -55,6 +55,15 @@
namespace skia {
+void DrawToNativeContext(SkCanvas* canvas, HDC hdc, int x, int y,
+ const RECT* src_rect) {
+ PlatformDevice* platform_device = GetPlatformDevice(GetTopDevice(*canvas));
+ if (platform_device)
+ platform_device->DrawToHDC(hdc, x, y, src_rect);
+}
+
+void PlatformDevice::DrawToHDC(HDC, int x, int y, const RECT* src_rect) {}
+
HDC BitmapPlatformDevice::GetBitmapDC() {
if (!hdc_) {
hdc_ = CreateCompatibleDC(NULL);
@@ -202,8 +211,8 @@
SetMatrixClip(transform, region);
}
-void BitmapPlatformDevice::DrawToNativeContext(HDC dc, int x, int y,
- const RECT* src_rect) {
+void BitmapPlatformDevice::DrawToHDC(HDC dc, int x, int y,
+ const RECT* src_rect) {
bool created_dc = !IsBitmapDCCreated();
HDC source_dc = BeginPlatformPaint();
diff --git a/skia/ext/bitmap_platform_device_win.h b/skia/ext/bitmap_platform_device_win.h
index 9e32de9..1b60018 100644
--- a/skia/ext/bitmap_platform_device_win.h
+++ b/skia/ext/bitmap_platform_device_win.h
@@ -50,14 +50,13 @@
virtual PlatformSurface BeginPlatformPaint() override;
virtual void EndPlatformPaint() override;
- virtual void DrawToNativeContext(HDC dc, int x, int y,
- const RECT* src_rect) override;
-
// Loads the given transform and clipping region into the HDC. This is
// overridden from SkBaseDevice.
virtual void setMatrixClip(const SkMatrix& transform, const SkRegion& region,
const SkClipStack&) override;
+ void DrawToHDC(HDC dc, int x, int y, const RECT* src_rect) override;
+
protected:
// Flushes the Windows device context so that the pixel data can be accessed
// directly by Skia. Overridden from SkBaseDevice, this is called when Skia
diff --git a/skia/ext/platform_canvas.cc b/skia/ext/platform_canvas.cc
index 6699b8b..9235967 100644
--- a/skia/ext/platform_canvas.cc
+++ b/skia/ext/platform_canvas.cc
@@ -32,13 +32,6 @@
platform_device->EndPlatformPaint();
}
-void DrawToNativeContext(SkCanvas* canvas, PlatformSurface context, int x,
- int y, const PlatformRect* src_rect) {
- PlatformDevice* platform_device = GetPlatformDevice(GetTopDevice(*canvas));
- if (platform_device)
- platform_device->DrawToNativeContext(context, x, y, src_rect);
-}
-
void MakeOpaque(SkCanvas* canvas, int x, int y, int width, int height) {
if (width <= 0 || height <= 0)
return;
diff --git a/skia/ext/platform_canvas.h b/skia/ext/platform_canvas.h
index 85ad85e..75458b5 100644
--- a/skia/ext/platform_canvas.h
+++ b/skia/ext/platform_canvas.h
@@ -43,6 +43,14 @@
bool is_opaque,
HANDLE shared_section,
OnFailureType failure_type);
+
+ // Draws the top layer of the canvas into the specified HDC. Only works
+ // with a PlatformCanvas with a BitmapPlatformDevice.
+ SK_API void DrawToNativeContext(SkCanvas* canvas,
+ HDC hdc,
+ int x,
+ int y,
+ const RECT* src_rect);
#elif defined(__APPLE__)
SK_API SkCanvas* CreatePlatformCanvas(CGContextRef context,
int width,
@@ -113,15 +121,6 @@
// return NULL PlatformSurface.
SK_API bool SupportsPlatformPaint(const SkCanvas* canvas);
-// Draws into the a native platform surface, |context|. Forwards to
-// DrawToNativeContext on a PlatformDevice instance bound to the top device.
-// If no PlatformDevice instance is bound, is a no-operation.
-SK_API void DrawToNativeContext(SkCanvas* canvas,
- PlatformSurface context,
- int x,
- int y,
- const PlatformRect* src_rect);
-
// Sets the opacity of each pixel in the specified region to be opaque.
SK_API void MakeOpaque(SkCanvas* canvas, int x, int y, int width, int height);
diff --git a/skia/ext/platform_device.h b/skia/ext/platform_device.h
index 7e77ff1..8486102 100644
--- a/skia/ext/platform_device.h
+++ b/skia/ext/platform_device.h
@@ -113,14 +113,6 @@
// Finish a previous call to beginPlatformPaint.
virtual void EndPlatformPaint();
- // Draws to the given screen DC, if the bitmap DC doesn't exist, this will
- // temporarily create it. However, if you have created the bitmap DC, it will
- // be more efficient if you don't free it until after this call so it doesn't
- // have to be created twice. If src_rect is null, then the entirety of the
- // source device will be copied.
- virtual void DrawToNativeContext(PlatformSurface surface, int x, int y,
- const PlatformRect* src_rect) = 0;
-
// Returns true if GDI operations can be used for drawing into the bitmap.
virtual bool SupportsPlatformPaint();
@@ -132,6 +124,14 @@
// Loads a SkRegion into the GDI context.
static void LoadClippingRegionToDC(HDC context, const SkRegion& region,
const SkMatrix& transformation);
+
+ // Draws to the given screen DC, if the bitmap DC doesn't exist, this will
+ // temporarily create it. However, if you have created the bitmap DC, it will
+ // be more efficient if you don't free it until after this call so it doesn't
+ // have to be created twice. If src_rect is null, then the entirety of the
+ // source device will be copied.
+ virtual void DrawToHDC(HDC, int x, int y, const RECT* src_rect);
+
#elif defined(OS_MACOSX)
// Loads a SkPath into the CG context. The path can there after be used for
// clipping or as a stroke.
diff --git a/skia/ext/platform_device_win.cc b/skia/ext/platform_device_win.cc
index f44e66e..ef48fbd 100644
--- a/skia/ext/platform_device_win.cc
+++ b/skia/ext/platform_device_win.cc
@@ -60,10 +60,6 @@
// Flushing will be done in onAccessBitmap.
}
-void PlatformDevice::DrawToNativeContext(PlatformSurface surface, int x, int y,
- const PlatformRect* src_rect) {
-}
-
// static
bool PlatformDevice::LoadPathToDC(HDC context, const SkPath& path) {
switch (path.getFillType()) {
diff --git a/skia/ext/vector_platform_device_emf_win.cc b/skia/ext/vector_platform_device_emf_win.cc
index 1271b16..85795b6 100644
--- a/skia/ext/vector_platform_device_emf_win.cc
+++ b/skia/ext/vector_platform_device_emf_win.cc
@@ -684,11 +684,6 @@
LoadClipRegion();
}
-void VectorPlatformDeviceEmf::DrawToNativeContext(HDC dc, int x, int y,
- const RECT* src_rect) {
- SkASSERT(false);
-}
-
void VectorPlatformDeviceEmf::LoadClipRegion() {
SkMatrix t;
t.reset();
diff --git a/skia/ext/vector_platform_device_emf_win.h b/skia/ext/vector_platform_device_emf_win.h
index 8d5b393..81b92af 100644
--- a/skia/ext/vector_platform_device_emf_win.h
+++ b/skia/ext/vector_platform_device_emf_win.h
@@ -32,8 +32,7 @@
// PlatformDevice methods
virtual PlatformSurface BeginPlatformPaint() override;
- virtual void DrawToNativeContext(HDC dc, int x, int y,
- const RECT* src_rect) override;
+
// SkBaseDevice methods.
virtual void drawPaint(const SkDraw& draw, const SkPaint& paint) override;
virtual void drawPoints(const SkDraw& draw, SkCanvas::PointMode mode,
diff --git a/third_party/boringssl/boringssl.gypi b/third_party/boringssl/boringssl.gypi
index 35dfff5..af009d7 100644
--- a/third_party/boringssl/boringssl.gypi
+++ b/third_party/boringssl/boringssl.gypi
@@ -281,7 +281,6 @@
'src/crypto/x509v3/x509v3_error.c',
'src/ssl/d1_both.c',
'src/ssl/d1_clnt.c',
- 'src/ssl/d1_enc.c',
'src/ssl/d1_lib.c',
'src/ssl/d1_meth.c',
'src/ssl/d1_pkt.c',
diff --git a/third_party/cython/rules.gni b/third_party/cython/rules.gni
index 3938110..53125fe 100644
--- a/third_party/cython/rules.gni
+++ b/third_party/cython/rules.gni
@@ -63,6 +63,9 @@
if (defined(invoker.additional_sources)) {
sources += invoker.additional_sources
}
+ if (defined(invoker.configs)) {
+ configs += invoker.configs
+ }
all_dependent_configs = [ ":$config_name" ]
}
}
@@ -91,6 +94,9 @@
python_binary_module_sources(sources_target_name) {
visibility = target_visibility
sources = invoker.sources
+ if (defined(invoker.configs)) {
+ configs = invoker.configs
+ }
}
shared_library(shared_library_name) {
diff --git a/third_party/mesa/BUILD.gn b/third_party/mesa/BUILD.gn
index 4989a37..0b1f828 100644
--- a/third_party/mesa/BUILD.gn
+++ b/third_party/mesa/BUILD.gn
@@ -619,12 +619,13 @@
configs = []
configs = [ ":mesa_internal_config" ] + previous_configs
- cflags = []
-
if (is_clang) {
- cflags += [ "-Wno-absolute-value" ]
+ # Mesa triggers some of these Clang warnings.
+ configs -= [ "//build/config/clang:extra_warnings" ]
}
+ cflags = []
+
if (is_android && !is_clang) {
# Disable sincos() optimization to avoid a linker error
# since Android's math library doesn't have sincos().
diff --git a/third_party/mesa/mesa.gyp b/third_party/mesa/mesa.gyp
index 3db0d4c..056eb40 100644
--- a/third_party/mesa/mesa.gyp
+++ b/third_party/mesa/mesa.gyp
@@ -132,7 +132,6 @@
'variables': {
'clang_warning_flags': [
'-Wno-tautological-constant-out-of-range-compare',
- '-Wno-mismatched-tags', # Fixed upstream.
],
'clang_warning_flags_unset': [
# Don't warn about string->bool used in asserts.
@@ -270,8 +269,6 @@
'variables': {
'clang_warning_flags': [
'-Wno-tautological-constant-out-of-range-compare',
- '-Wno-absolute-value', # Fires on st_atom_array.c, might be a bug
- '-Wno-mismatched-tags', # Fixed upstream.
],
'clang_warning_flags_unset': [
# Don't warn about string->bool used in asserts.
diff --git a/third_party/protobuf/README.chromium b/third_party/protobuf/README.chromium
index 92391f6..8e51806 100644
--- a/third_party/protobuf/README.chromium
+++ b/third_party/protobuf/README.chromium
@@ -34,4 +34,7 @@
Revision 573 was cherry-picked from upstream.
The `&file->options() != NULL &&` was removed from descriptor.cc
References to `vector` were changed to `std::vector` in extension_set.h
-and unknown_field_set.h
\ No newline at end of file
+and unknown_field_set.h
+
+GetEmptyString() and GoogleOnceInit() have been uninlined, for a large savings
+in binary size.
diff --git a/third_party/protobuf/src/google/protobuf/generated_message_util.cc b/third_party/protobuf/src/google/protobuf/generated_message_util.cc
index 794be35..92882d7 100644
--- a/third_party/protobuf/src/google/protobuf/generated_message_util.cc
+++ b/third_party/protobuf/src/google/protobuf/generated_message_util.cc
@@ -54,6 +54,11 @@
empty_string_ = new std::string();
}
+const ::std::string& GetEmptyString() {
+ GoogleOnceInit(&empty_string_once_init_, &InitEmptyString);
+ return *empty_string_;
+}
+
} // namespace internal
} // namespace protobuf
} // namespace google
diff --git a/third_party/protobuf/src/google/protobuf/generated_message_util.h b/third_party/protobuf/src/google/protobuf/generated_message_util.h
index 098f321..6e4669c 100644
--- a/third_party/protobuf/src/google/protobuf/generated_message_util.h
+++ b/third_party/protobuf/src/google/protobuf/generated_message_util.h
@@ -67,10 +67,7 @@
LIBPROTOBUF_EXPORT void InitEmptyString();
-LIBPROTOBUF_EXPORT inline const ::std::string& GetEmptyString() {
- GoogleOnceInit(&empty_string_once_init_, &InitEmptyString);
- return *empty_string_;
-}
+LIBPROTOBUF_EXPORT const ::std::string& GetEmptyString();
// Defined in generated_message_reflection.cc -- not actually part of the lite
// library.
diff --git a/third_party/protobuf/src/google/protobuf/stubs/once.cc b/third_party/protobuf/src/google/protobuf/stubs/once.cc
index 1e24b85..2363622 100644
--- a/third_party/protobuf/src/google/protobuf/stubs/once.cc
+++ b/third_party/protobuf/src/google/protobuf/stubs/once.cc
@@ -93,6 +93,13 @@
}
}
+void GoogleOnceInit(ProtobufOnceType* once, void (*init_func)()) {
+ if (internal::Acquire_Load(once) != ONCE_STATE_DONE) {
+ internal::FunctionClosure0 func(init_func, false);
+ GoogleOnceInitImpl(once, &func);
+ }
+}
+
} // namespace protobuf
} // namespace google
diff --git a/third_party/protobuf/src/google/protobuf/stubs/once.h b/third_party/protobuf/src/google/protobuf/stubs/once.h
index 7fbc117..9f1c5fc 100644
--- a/third_party/protobuf/src/google/protobuf/stubs/once.h
+++ b/third_party/protobuf/src/google/protobuf/stubs/once.h
@@ -121,12 +121,8 @@
LIBPROTOBUF_EXPORT
void GoogleOnceInitImpl(ProtobufOnceType* once, Closure* closure);
-inline void GoogleOnceInit(ProtobufOnceType* once, void (*init_func)()) {
- if (internal::Acquire_Load(once) != ONCE_STATE_DONE) {
- internal::FunctionClosure0 func(init_func, false);
- GoogleOnceInitImpl(once, &func);
- }
-}
+LIBPROTOBUF_EXPORT
+void GoogleOnceInit(ProtobufOnceType* once, void (*init_func)());
template <typename Arg>
inline void GoogleOnceInit(ProtobufOnceType* once, void (*init_func)(Arg*),
diff --git a/ui/compositor/compositor.h b/ui/compositor/compositor.h
index bbed8ec..a937886 100644
--- a/ui/compositor/compositor.h
+++ b/ui/compositor/compositor.h
@@ -243,6 +243,7 @@
void Layout() override;
void ApplyViewportDeltas(const gfx::Vector2d& inner_delta,
const gfx::Vector2d& outer_delta,
+ const gfx::Vector2dF& elastic_overscroll_delta,
float page_scale,
float top_controls_delta) override {}
void ApplyViewportDeltas(const gfx::Vector2d& scroll_delta,
diff --git a/ui/gl/gl_bindings_skia_in_process.cc b/ui/gl/gl_bindings_skia_in_process.cc
index cfcb7a3..5ce7821 100644
--- a/ui/gl/gl_bindings_skia_in_process.cc
+++ b/ui/gl/gl_bindings_skia_in_process.cc
@@ -318,6 +318,11 @@
glGetShaderiv(shader, pname, params);
}
+GLvoid StubGLGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype,
+ GLint *range, GLint *precision) {
+ glGetShaderPrecisionFormat(shadertype, precisiontype, range, precision);
+}
+
const GLubyte* StubGLGetString(GLenum name) {
return glGetString(name);
}
@@ -675,6 +680,7 @@
functions->fGetProgramiv = StubGLGetProgramiv;
functions->fGetShaderInfoLog = StubGLGetShaderInfoLog;
functions->fGetShaderiv = StubGLGetShaderiv;
+ functions->fGetShaderPrecisionFormat = StubGLGetShaderPrecisionFormat;
functions->fGetString = StubGLGetString;
functions->fGetTexLevelParameteriv = StubGLGetTexLevelParameteriv;
functions->fGetUniformLocation = StubGLGetUniformLocation;
diff --git a/ui/gl/gl_surface_egl.cc b/ui/gl/gl_surface_egl.cc
index 3a453b6..4018834 100644
--- a/ui/gl/gl_surface_egl.cc
+++ b/ui/gl/gl_surface_egl.cc
@@ -395,12 +395,12 @@
return false;
}
- EGLint surfaceVal;
- EGLBoolean retVal = eglQuerySurface(GetDisplay(),
- surface_,
- EGL_POST_SUB_BUFFER_SUPPORTED_NV,
- &surfaceVal);
- supports_post_sub_buffer_ = (surfaceVal && retVal) == EGL_TRUE;
+ if (gfx::g_driver_egl.ext.b_EGL_NV_post_sub_buffer) {
+ EGLint surfaceVal;
+ EGLBoolean retVal = eglQuerySurface(
+ GetDisplay(), surface_, EGL_POST_SUB_BUFFER_SUPPORTED_NV, &surfaceVal);
+ supports_post_sub_buffer_ = (surfaceVal && retVal) == EGL_TRUE;
+ }
if (sync_provider)
vsync_provider_.reset(sync_provider.release());