diff options
-rw-r--r-- | cmds/dumpstate/utils.cpp | 4 | ||||
-rw-r--r-- | cmds/installd/commands.cpp | 1 | ||||
-rw-r--r-- | cmds/installd/installd.cpp | 4 | ||||
-rw-r--r-- | include/binder/Parcel.h | 18 | ||||
-rw-r--r-- | include/binder/PersistableBundle.h | 14 | ||||
-rw-r--r-- | libs/binder/AppOpsManager.cpp | 39 | ||||
-rw-r--r-- | libs/binder/IPCThreadState.cpp | 1 | ||||
-rw-r--r-- | libs/binder/Parcel.cpp | 16 | ||||
-rw-r--r-- | libs/binder/PersistableBundle.cpp | 79 | ||||
-rw-r--r-- | libs/binder/ProcessState.cpp | 7 | ||||
-rw-r--r-- | libs/gui/Android.mk | 4 | ||||
-rw-r--r-- | libs/gui/BufferQueueCore.cpp | 23 | ||||
-rw-r--r-- | libs/gui/tests/Android.mk | 1 | ||||
-rw-r--r-- | libs/ui/Region.cpp | 3 | ||||
-rw-r--r-- | opengl/libs/Android.mk | 3 | ||||
-rw-r--r-- | opengl/libs/GLES2/gl2.cpp | 263 | ||||
-rw-r--r-- | opengl/libs/GLES_CM/gl.cpp | 262 | ||||
-rw-r--r-- | services/surfaceflinger/Layer.cpp | 4 |
18 files changed, 531 insertions, 215 deletions
diff --git a/cmds/dumpstate/utils.cpp b/cmds/dumpstate/utils.cpp index d9738bbdb0..49fff616c8 100644 --- a/cmds/dumpstate/utils.cpp +++ b/cmds/dumpstate/utils.cpp @@ -28,7 +28,6 @@ #include <sys/capability.h> #include <sys/inotify.h> #include <sys/stat.h> -#include <sys/sysconf.h> #include <sys/time.h> #include <sys/wait.h> #include <sys/klog.h> @@ -175,7 +174,7 @@ static void for_each_pid_helper(int pid, const char *cmdline, void *arg) { void for_each_pid(for_each_pid_func func, const char *header) { ON_DRY_RUN_RETURN(); - __for_each_pid(for_each_pid_helper, header, (void *)func); + __for_each_pid(for_each_pid_helper, header, (void *) func); } static void for_each_tid_helper(int pid, const char *cmdline, void *arg) { @@ -572,6 +571,7 @@ int dump_files(const char *title, const char *dir, * stuck. */ int dump_file_from_fd(const char *title, const char *path, int fd) { + ON_DRY_RUN_RETURN(0); int flags = fcntl(fd, F_GETFL); if (flags == -1) { printf("*** %s: failed to get flags on fd %d: %s\n", path, fd, strerror(errno)); diff --git a/cmds/installd/commands.cpp b/cmds/installd/commands.cpp index 20ad5f9529..3eb3428f2c 100644 --- a/cmds/installd/commands.cpp +++ b/cmds/installd/commands.cpp @@ -1857,7 +1857,6 @@ static bool unlink_and_rename(const char* from, const char* to) { PLOG(ERROR) << "Could not rename " << from << " to " << to; return false; } - return true; } diff --git a/cmds/installd/installd.cpp b/cmds/installd/installd.cpp index c7f4ffcdaa..9b2d143602 100644 --- a/cmds/installd/installd.cpp +++ b/cmds/installd/installd.cpp @@ -65,8 +65,8 @@ bool calculate_oat_file_path(char path[PKG_PATH_MAX], const char *oat_dir, const char *apk_path, const char *instruction_set) { - char *file_name_start; - char *file_name_end; + const char *file_name_start; + const char *file_name_end; file_name_start = strrchr(apk_path, '/'); if (file_name_start == NULL) { diff --git a/include/binder/Parcel.h b/include/binder/Parcel.h index 2685bcc807..a836ce4cbe 100644 --- a/include/binder/Parcel.h +++ b/include/binder/Parcel.h @@ -252,6 +252,7 @@ public: const char16_t* readString16Inplace(size_t* outLen) const; sp<IBinder> readStrongBinder() const; status_t readStrongBinder(sp<IBinder>* val) const; + status_t readNullableStrongBinder(sp<IBinder>* val) const; wp<IBinder> readWeakBinder() const; template<typename T> @@ -268,6 +269,9 @@ public: template<typename T> status_t readStrongBinder(sp<T>* val) const; + template<typename T> + status_t readNullableStrongBinder(sp<T>* val) const; + status_t readStrongBinderVector(std::unique_ptr<std::vector<sp<IBinder>>>* val) const; status_t readStrongBinderVector(std::vector<sp<IBinder>>* val) const; @@ -574,6 +578,20 @@ status_t Parcel::readStrongBinder(sp<T>* val) const { return ret; } +template<typename T> +status_t Parcel::readNullableStrongBinder(sp<T>* val) const { + sp<IBinder> tmp; + status_t ret = readNullableStrongBinder(&tmp); + + if (ret == OK) { + *val = interface_cast<T>(tmp); + + if (val->get() == nullptr) { + return UNKNOWN_ERROR; + } + } +} + template<typename T, typename U> status_t Parcel::unsafeReadTypedVector( std::vector<T>* val, diff --git a/include/binder/PersistableBundle.h b/include/binder/PersistableBundle.h index fe5619fc52..322fef9e4f 100644 --- a/include/binder/PersistableBundle.h +++ b/include/binder/PersistableBundle.h @@ -18,6 +18,7 @@ #define ANDROID_PERSISTABLE_BUNDLE_H #include <map> +#include <set> #include <vector> #include <binder/Parcelable.h> @@ -79,6 +80,19 @@ public: bool getStringVector(const String16& key, std::vector<String16>* out) const; bool getPersistableBundle(const String16& key, PersistableBundle* out) const; + /* Getters for all keys for each value type */ + std::set<String16> getBooleanKeys() const; + std::set<String16> getIntKeys() const; + std::set<String16> getLongKeys() const; + std::set<String16> getDoubleKeys() const; + std::set<String16> getStringKeys() const; + std::set<String16> getBooleanVectorKeys() const; + std::set<String16> getIntVectorKeys() const; + std::set<String16> getLongVectorKeys() const; + std::set<String16> getDoubleVectorKeys() const; + std::set<String16> getStringVectorKeys() const; + std::set<String16> getPersistableBundleKeys() const; + friend bool operator==(const PersistableBundle& lhs, const PersistableBundle& rhs) { return (lhs.mBoolMap == rhs.mBoolMap && lhs.mIntMap == rhs.mIntMap && lhs.mLongMap == rhs.mLongMap && lhs.mDoubleMap == rhs.mDoubleMap && diff --git a/libs/binder/AppOpsManager.cpp b/libs/binder/AppOpsManager.cpp index 9a061a0ceb..f3b86ae311 100644 --- a/libs/binder/AppOpsManager.cpp +++ b/libs/binder/AppOpsManager.cpp @@ -14,6 +14,7 @@ * limitations under the License. */ +#include <mutex> #include <binder/AppOpsManager.h> #include <binder/Binder.h> #include <binder/IServiceManager.h> @@ -22,6 +23,19 @@ namespace android { +namespace { + +#if defined(__BRILLO__) +// Because Brillo has no application model, security policy is managed +// statically (at build time) with SELinux controls. +// As a consequence, it also never runs the AppOpsManager service. +const int APP_OPS_MANAGER_UNAVAILABLE_MODE = AppOpsManager::MODE_ALLOWED; +#else +const int APP_OPS_MANAGER_UNAVAILABLE_MODE = AppOpsManager::MODE_IGNORED; +#endif // defined(__BRILLO__) + +} // namespace + static String16 _appops("appops"); static pthread_mutex_t gTokenMutex = PTHREAD_MUTEX_INITIALIZER; static sp<IBinder> gToken; @@ -39,10 +53,15 @@ AppOpsManager::AppOpsManager() { } +#if defined(__BRILLO__) +// There is no AppOpsService on Brillo +sp<IAppOpsService> AppOpsManager::getService() { return NULL; } +#else sp<IAppOpsService> AppOpsManager::getService() { + + std::lock_guard<Mutex> scoped_lock(mLock); int64_t startTime = 0; - mLock.lock(); sp<IAppOpsService> service = mService; while (service == NULL || !IInterface::asBinder(service)->isBinderAlive()) { sp<IBinder> binder = defaultServiceManager()->checkService(_appops); @@ -53,7 +72,8 @@ sp<IAppOpsService> AppOpsManager::getService() ALOGI("Waiting for app ops service"); } else if ((uptimeMillis()-startTime) > 10000) { ALOGW("Waiting too long for app ops service, giving up"); - return NULL; + service = NULL; + break; } sleep(1); } else { @@ -61,25 +81,30 @@ sp<IAppOpsService> AppOpsManager::getService() mService = service; } } - mLock.unlock(); return service; } +#endif // defined(__BRILLO__) int32_t AppOpsManager::checkOp(int32_t op, int32_t uid, const String16& callingPackage) { sp<IAppOpsService> service = getService(); - return service != NULL ? service->checkOperation(op, uid, callingPackage) : MODE_IGNORED; + return service != NULL + ? service->checkOperation(op, uid, callingPackage) + : APP_OPS_MANAGER_UNAVAILABLE_MODE; } int32_t AppOpsManager::noteOp(int32_t op, int32_t uid, const String16& callingPackage) { sp<IAppOpsService> service = getService(); - return service != NULL ? service->noteOperation(op, uid, callingPackage) : MODE_IGNORED; + return service != NULL + ? service->noteOperation(op, uid, callingPackage) + : APP_OPS_MANAGER_UNAVAILABLE_MODE; } int32_t AppOpsManager::startOp(int32_t op, int32_t uid, const String16& callingPackage) { sp<IAppOpsService> service = getService(); - return service != NULL ? service->startOperation(getToken(service), op, uid, callingPackage) - : MODE_IGNORED; + return service != NULL + ? service->startOperation(getToken(service), op, uid, callingPackage) + : APP_OPS_MANAGER_UNAVAILABLE_MODE; } void AppOpsManager::finishOp(int32_t op, int32_t uid, const String16& callingPackage) { diff --git a/libs/binder/IPCThreadState.cpp b/libs/binder/IPCThreadState.cpp index 1cbcfe4de5..7634d9cba7 100644 --- a/libs/binder/IPCThreadState.cpp +++ b/libs/binder/IPCThreadState.cpp @@ -328,6 +328,7 @@ void IPCThreadState::shutdown() delete st; pthread_setspecific(gTLS, NULL); } + pthread_key_delete(gTLS); gHaveTLS = false; } } diff --git a/libs/binder/Parcel.cpp b/libs/binder/Parcel.cpp index a0161b399a..8898bcc5b2 100644 --- a/libs/binder/Parcel.cpp +++ b/libs/binder/Parcel.cpp @@ -1112,7 +1112,7 @@ status_t Parcel::writeStrongBinderVector(const std::unique_ptr<std::vector<sp<IB } status_t Parcel::readStrongBinderVector(std::unique_ptr<std::vector<sp<IBinder>>>* val) const { - return readNullableTypedVector(val, &Parcel::readStrongBinder); + return readNullableTypedVector(val, &Parcel::readNullableStrongBinder); } status_t Parcel::readStrongBinderVector(std::vector<sp<IBinder>>* val) const { @@ -1912,13 +1912,25 @@ const char16_t* Parcel::readString16Inplace(size_t* outLen) const status_t Parcel::readStrongBinder(sp<IBinder>* val) const { + status_t status = readNullableStrongBinder(val); + if (status == OK && !val->get()) { + status = UNEXPECTED_NULL; + } + return status; +} + +status_t Parcel::readNullableStrongBinder(sp<IBinder>* val) const +{ return unflatten_binder(ProcessState::self(), *this, val); } sp<IBinder> Parcel::readStrongBinder() const { sp<IBinder> val; - readStrongBinder(&val); + // Note that a lot of code in Android reads binders by hand with this + // method, and that code has historically been ok with getting nullptr + // back (while ignoring error codes). + readNullableStrongBinder(&val); return val; } diff --git a/libs/binder/PersistableBundle.cpp b/libs/binder/PersistableBundle.cpp index aef791c37b..a20359f243 100644 --- a/libs/binder/PersistableBundle.cpp +++ b/libs/binder/PersistableBundle.cpp @@ -32,6 +32,9 @@ using android::Parcel; using android::sp; using android::status_t; using android::UNEXPECTED_NULL; +using std::map; +using std::set; +using std::vector; enum { // Keep in sync with BUNDLE_MAGIC in frameworks/base/core/java/android/os/BaseBundle.java. @@ -55,12 +58,22 @@ enum { namespace { template <typename T> -bool getValue(const android::String16& key, T* out, const std::map<android::String16, T>& map) { +bool getValue(const android::String16& key, T* out, const map<android::String16, T>& map) { const auto& it = map.find(key); if (it == map.end()) return false; *out = it->second; return true; } + +template <typename T> +set<android::String16> getKeys(const map<android::String16, T>& map) { + if (map.empty()) return set<android::String16>(); + set<android::String16> keys; + for (const auto& key_value_pair : map) { + keys.emplace(key_value_pair.first); + } + return keys; +} } // namespace namespace android { @@ -188,27 +201,27 @@ void PersistableBundle::putString(const String16& key, const String16& value) { mStringMap[key] = value; } -void PersistableBundle::putBooleanVector(const String16& key, const std::vector<bool>& value) { +void PersistableBundle::putBooleanVector(const String16& key, const vector<bool>& value) { erase(key); mBoolVectorMap[key] = value; } -void PersistableBundle::putIntVector(const String16& key, const std::vector<int32_t>& value) { +void PersistableBundle::putIntVector(const String16& key, const vector<int32_t>& value) { erase(key); mIntVectorMap[key] = value; } -void PersistableBundle::putLongVector(const String16& key, const std::vector<int64_t>& value) { +void PersistableBundle::putLongVector(const String16& key, const vector<int64_t>& value) { erase(key); mLongVectorMap[key] = value; } -void PersistableBundle::putDoubleVector(const String16& key, const std::vector<double>& value) { +void PersistableBundle::putDoubleVector(const String16& key, const vector<double>& value) { erase(key); mDoubleVectorMap[key] = value; } -void PersistableBundle::putStringVector(const String16& key, const std::vector<String16>& value) { +void PersistableBundle::putStringVector(const String16& key, const vector<String16>& value) { erase(key); mStringVectorMap[key] = value; } @@ -238,23 +251,23 @@ bool PersistableBundle::getString(const String16& key, String16* out) const { return getValue(key, out, mStringMap); } -bool PersistableBundle::getBooleanVector(const String16& key, std::vector<bool>* out) const { +bool PersistableBundle::getBooleanVector(const String16& key, vector<bool>* out) const { return getValue(key, out, mBoolVectorMap); } -bool PersistableBundle::getIntVector(const String16& key, std::vector<int32_t>* out) const { +bool PersistableBundle::getIntVector(const String16& key, vector<int32_t>* out) const { return getValue(key, out, mIntVectorMap); } -bool PersistableBundle::getLongVector(const String16& key, std::vector<int64_t>* out) const { +bool PersistableBundle::getLongVector(const String16& key, vector<int64_t>* out) const { return getValue(key, out, mLongVectorMap); } -bool PersistableBundle::getDoubleVector(const String16& key, std::vector<double>* out) const { +bool PersistableBundle::getDoubleVector(const String16& key, vector<double>* out) const { return getValue(key, out, mDoubleVectorMap); } -bool PersistableBundle::getStringVector(const String16& key, std::vector<String16>* out) const { +bool PersistableBundle::getStringVector(const String16& key, vector<String16>* out) const { return getValue(key, out, mStringVectorMap); } @@ -262,6 +275,50 @@ bool PersistableBundle::getPersistableBundle(const String16& key, PersistableBun return getValue(key, out, mPersistableBundleMap); } +set<String16> PersistableBundle::getBooleanKeys() const { + return getKeys(mBoolMap); +} + +set<String16> PersistableBundle::getIntKeys() const { + return getKeys(mIntMap); +} + +set<String16> PersistableBundle::getLongKeys() const { + return getKeys(mLongMap); +} + +set<String16> PersistableBundle::getDoubleKeys() const { + return getKeys(mDoubleMap); +} + +set<String16> PersistableBundle::getStringKeys() const { + return getKeys(mStringMap); +} + +set<String16> PersistableBundle::getBooleanVectorKeys() const { + return getKeys(mBoolVectorMap); +} + +set<String16> PersistableBundle::getIntVectorKeys() const { + return getKeys(mIntVectorMap); +} + +set<String16> PersistableBundle::getLongVectorKeys() const { + return getKeys(mLongVectorMap); +} + +set<String16> PersistableBundle::getDoubleVectorKeys() const { + return getKeys(mDoubleVectorMap); +} + +set<String16> PersistableBundle::getStringVectorKeys() const { + return getKeys(mStringVectorMap); +} + +set<String16> PersistableBundle::getPersistableBundleKeys() const { + return getKeys(mPersistableBundleMap); +} + status_t PersistableBundle::writeToParcelInner(Parcel* parcel) const { /* * To keep this implementation in sync with writeArrayMapInternal() in diff --git a/libs/binder/ProcessState.cpp b/libs/binder/ProcessState.cpp index 33fe26cfa9..5114ac17a2 100644 --- a/libs/binder/ProcessState.cpp +++ b/libs/binder/ProcessState.cpp @@ -364,6 +364,13 @@ ProcessState::ProcessState() ProcessState::~ProcessState() { + if (mDriverFD >= 0) { + if (mVMStart != MAP_FAILED) { + munmap(mVMStart, BINDER_VM_SIZE); + } + close(mDriverFD); + } + mDriverFD = -1; } }; // namespace android diff --git a/libs/gui/Android.mk b/libs/gui/Android.mk index 635020e718..03c303af74 100644 --- a/libs/gui/Android.mk +++ b/libs/gui/Android.mk @@ -93,6 +93,10 @@ ifeq ($(TARGET_BOARD_PLATFORM), tegra3) LOCAL_CFLAGS += -DDONT_USE_FENCE_SYNC endif +ifeq ($(TARGET_BOARD_HAS_NO_SURFACE_FLINGER), true) + LOCAL_CFLAGS += -DHAVE_NO_SURFACE_FLINGER +endif + include $(BUILD_SHARED_LIBRARY) ifeq (,$(ONE_SHOT_MAKEFILE)) diff --git a/libs/gui/BufferQueueCore.cpp b/libs/gui/BufferQueueCore.cpp index cdece738db..5dd1ee7e00 100644 --- a/libs/gui/BufferQueueCore.cpp +++ b/libs/gui/BufferQueueCore.cpp @@ -28,8 +28,11 @@ #include <inttypes.h> +#include <cutils/properties.h> + #include <gui/BufferItem.h> #include <gui/BufferQueueCore.h> +#include <gui/GraphicBufferAlloc.h> #include <gui/IConsumerListener.h> #include <gui/IGraphicBufferAlloc.h> #include <gui/IProducerListener.h> @@ -85,8 +88,24 @@ BufferQueueCore::BufferQueueCore(const sp<IGraphicBufferAlloc>& allocator) : HAL_DATASPACE_UNKNOWN) { if (allocator == NULL) { - sp<ISurfaceComposer> composer(ComposerService::getComposerService()); - mAllocator = composer->createGraphicBufferAlloc(); + +#ifdef HAVE_NO_SURFACE_FLINGER + // Without a SurfaceFlinger, allocate in-process. This only makes + // sense in systems with static SELinux configurations and no + // applications (since applications need dynamic SELinux policy). + mAllocator = new GraphicBufferAlloc(); +#else + // Run time check for headless, where we also allocate in-process. + char value[PROPERTY_VALUE_MAX]; + property_get("config.headless", value, "0"); + if (atoi(value) == 1) { + mAllocator = new GraphicBufferAlloc(); + } else { + sp<ISurfaceComposer> composer(ComposerService::getComposerService()); + mAllocator = composer->createGraphicBufferAlloc(); + } +#endif // HAVE_NO_SURFACE_FLINGER + if (mAllocator == NULL) { BQ_LOGE("createGraphicBufferAlloc failed"); } diff --git a/libs/gui/tests/Android.mk b/libs/gui/tests/Android.mk index 6ad9986220..7d984a454d 100644 --- a/libs/gui/tests/Android.mk +++ b/libs/gui/tests/Android.mk @@ -28,6 +28,7 @@ LOCAL_SRC_FILES := \ TextureRenderer.cpp \ LOCAL_SHARED_LIBRARIES := \ + liblog \ libEGL \ libGLESv1_CM \ libGLESv2 \ diff --git a/libs/ui/Region.cpp b/libs/ui/Region.cpp index ac379901c8..0a86ead11d 100644 --- a/libs/ui/Region.cpp +++ b/libs/ui/Region.cpp @@ -489,7 +489,8 @@ void Region::rasterizer::flushSpan() merge = false; break; } - p++, q++; + p++; + q++; } } } diff --git a/opengl/libs/Android.mk b/opengl/libs/Android.mk index eb868609a2..5074fd085c 100644 --- a/opengl/libs/Android.mk +++ b/opengl/libs/Android.mk @@ -77,7 +77,6 @@ LOCAL_SRC_FILES:= \ GLES_CM/gl.cpp.arm \ # -LOCAL_CLANG := false LOCAL_SHARED_LIBRARIES += libcutils liblog libEGL LOCAL_MODULE:= libGLESv1_CM @@ -105,7 +104,6 @@ LOCAL_SRC_FILES:= \ GLES2/gl2.cpp \ # -LOCAL_CLANG := false LOCAL_ARM_MODE := arm LOCAL_SHARED_LIBRARIES += libcutils libutils liblog libEGL LOCAL_MODULE:= libGLESv2 @@ -133,7 +131,6 @@ LOCAL_SRC_FILES:= \ GLES2/gl2.cpp \ # -LOCAL_CLANG := false LOCAL_ARM_MODE := arm LOCAL_SHARED_LIBRARIES += libcutils libutils liblog libEGL LOCAL_MODULE:= libGLESv3 diff --git a/opengl/libs/GLES2/gl2.cpp b/opengl/libs/GLES2/gl2.cpp index 6034a8edc0..6dd87c28e4 100644 --- a/opengl/libs/GLES2/gl2.cpp +++ b/opengl/libs/GLES2/gl2.cpp @@ -34,39 +34,65 @@ using namespace android; #undef API_ENTRY #undef CALL_GL_API +#undef CALL_GL_API_INTERNAL_CALL +#undef CALL_GL_API_INTERNAL_SET_RETURN_VALUE +#undef CALL_GL_API_INTERNAL_DO_RETURN #undef CALL_GL_API_RETURN #if USE_SLOW_BINDING #define API_ENTRY(_api) _api - #define CALL_GL_API(_api, ...) \ + #define CALL_GL_API_INTERNAL_CALL(_api, ...) \ gl_hooks_t::gl_t const * const _c = &getGlThreadSpecific()->gl; \ if (_c) return _c->_api(__VA_ARGS__); + #define CALL_GL_API_INTERNAL_SET_RETURN_VALUE return 0; + + // This stays blank, since void functions will implicitly return, and + // all of the other functions will return 0 based on the previous macro. + #define CALL_GL_API_INTERNAL_DO_RETURN + #elif defined(__arm__) #define GET_TLS(reg) "mrc p15, 0, " #reg ", c13, c0, 3 \n" - #define API_ENTRY(_api) __attribute__((noinline)) _api - - #define CALL_GL_API(_api, ...) \ - asm volatile( \ - GET_TLS(r12) \ - "ldr r12, [r12, %[tls]] \n" \ - "cmp r12, #0 \n" \ - "ldrne pc, [r12, %[api]] \n" \ - : \ - : [tls] "J"(TLS_SLOT_OPENGL_API*4), \ - [api] "J"(__builtin_offsetof(gl_hooks_t, gl._api)) \ - : "r12" \ - ); + #define API_ENTRY(_api) __attribute__((naked,noinline)) _api + + #define CALL_GL_API_INTERNAL_CALL(_api, ...) \ + asm volatile( \ + GET_TLS(r12) \ + "ldr r12, [r12, %[tls]] \n" \ + "cmp r12, #0 \n" \ + "ldrne pc, [r12, %[api]] \n" \ + : \ + : [tls] "J"(TLS_SLOT_OPENGL_API*4), \ + [api] "J"(__builtin_offsetof(gl_hooks_t, gl._api)) \ + : "r0", "r1", "r2", "r3", "r12" \ + ); + + #define CALL_GL_API_INTERNAL_SET_RETURN_VALUE \ + asm volatile( \ + "mov r0, #0 \n" \ + : \ + : \ + : "r0" \ + ); + + + #define CALL_GL_API_INTERNAL_DO_RETURN \ + asm volatile( \ + "bx lr \n" \ + : \ + : \ + : "r0" \ + ); #elif defined(__aarch64__) - #define API_ENTRY(_api) __attribute__((noinline)) _api + #define API_ENTRY(_api) __attribute__((naked,noinline)) _api - #define CALL_GL_API(_api, ...) \ + #define CALL_GL_API_INTERNAL_CALL(_api, ...) \ asm volatile( \ "mrs x16, tpidr_el0\n" \ "ldr x16, [x16, %[tls]]\n" \ @@ -77,121 +103,173 @@ using namespace android; : \ : [tls] "i" (TLS_SLOT_OPENGL_API * sizeof(void*)), \ [api] "i" (__builtin_offsetof(gl_hooks_t, gl._api)) \ - : "x16" \ + : "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x16" \ + ); + + #define CALL_GL_API_INTERNAL_SET_RETURN_VALUE \ + asm volatile( \ + "mov w0, wzr \n" \ + : \ + : \ + : "w0" \ + ); + + #define CALL_GL_API_INTERNAL_DO_RETURN \ + asm volatile( \ + "ret \n" \ + : \ + : \ + : \ ); #elif defined(__i386__) - #define API_ENTRY(_api) __attribute__((noinline,optimize("omit-frame-pointer"))) _api + #define API_ENTRY(_api) __attribute__((naked,noinline)) _api - #define CALL_GL_API(_api, ...) \ - register void** fn; \ + #define CALL_GL_API_INTERNAL_CALL(_api, ...) \ __asm__ volatile( \ - "mov %%gs:0, %[fn]\n" \ - "mov %P[tls](%[fn]), %[fn]\n" \ - "test %[fn], %[fn]\n" \ + "mov %%gs:0, %%eax\n" \ + "mov %P[tls](%%eax), %%eax\n" \ + "test %%eax, %%eax\n" \ "je 1f\n" \ - "jmp *%P[api](%[fn])\n" \ + "jmp *%P[api](%%eax)\n" \ "1:\n" \ - : [fn] "=r" (fn) \ + : \ : [tls] "i" (TLS_SLOT_OPENGL_API*sizeof(void*)), \ [api] "i" (__builtin_offsetof(gl_hooks_t, gl._api)) \ - : "cc" \ + : "cc", "%eax" \ ); + #define CALL_GL_API_INTERNAL_SET_RETURN_VALUE \ + __asm__ volatile( \ + "xor %%eax, %%eax\n" \ + : \ + : \ + : "%eax" \ + ); + + #define CALL_GL_API_INTERNAL_DO_RETURN \ + __asm__ volatile( \ + "ret\n" \ + : \ + : \ + : \ + ); + #elif defined(__x86_64__) - #define API_ENTRY(_api) __attribute__((noinline,optimize("omit-frame-pointer"))) _api + #define API_ENTRY(_api) __attribute__((naked,noinline)) _api - #define CALL_GL_API(_api, ...) \ - register void** fn; \ - __asm__ volatile( \ - "mov %%fs:0, %[fn]\n" \ - "mov %P[tls](%[fn]), %[fn]\n" \ - "test %[fn], %[fn]\n" \ + #define CALL_GL_API_INTERNAL_CALL(_api, ...) \ + __asm__ volatile( \ + "mov %%fs:0, %%rax\n" \ + "mov %P[tls](%%rax), %%rax\n" \ + "test %%rax, %%rax\n" \ "je 1f\n" \ - "jmp *%P[api](%[fn])\n" \ + "jmp *%P[api](%%rax)\n" \ "1:\n" \ - : [fn] "=r" (fn) \ + : \ : [tls] "i" (TLS_SLOT_OPENGL_API*sizeof(void*)), \ [api] "i" (__builtin_offsetof(gl_hooks_t, gl._api)) \ - : "cc" \ - ); + : "cc", "%rdi", "%rsi", "%rdx", "%rcx", "%r8", "%r9", \ + "%xmm0", "%xmm1", "%xmm2", "%xmm3", "%xmm4", "%xmm5", \ + "%xmm6", "%xmm7" \ + ); + + #define CALL_GL_API_INTERNAL_SET_RETURN_VALUE \ + __asm__ volatile( \ + "xor %%eax, %%eax\n" \ + : \ + : \ + : "%eax" \ + ); + + #define CALL_GL_API_INTERNAL_DO_RETURN \ + __asm__ volatile( \ + "retq\n" \ + : \ + : \ + : \ + ); #elif defined(__mips64) - #define API_ENTRY(_api) __attribute__((noinline)) _api - - #define CALL_GL_API(_api, ...) \ - register unsigned long _t0 asm("$12"); \ - register unsigned long _fn asm("$25"); \ - register unsigned long _tls asm("$3"); \ - register unsigned long _v0 asm("$2"); \ - asm volatile( \ - ".set push\n\t" \ - ".set noreorder\n\t" \ - "rdhwr %[tls], $29\n\t" \ - "ld %[t0], %[OPENGL_API](%[tls])\n\t" \ - "beqz %[t0], 1f\n\t" \ - " move %[fn], $ra\n\t" \ - "ld %[t0], %[API](%[t0])\n\t" \ - "beqz %[t0], 1f\n\t" \ - " nop\n\t" \ - "move %[fn], %[t0]\n\t" \ - "1:\n\t" \ - "jalr $0, %[fn]\n\t" \ - " move %[v0], $0\n\t" \ - ".set pop\n\t" \ - : [fn] "=c"(_fn), \ - [tls] "=&r"(_tls), \ - [t0] "=&r"(_t0), \ - [v0] "=&r"(_v0) \ - : [OPENGL_API] "I"(TLS_SLOT_OPENGL_API*sizeof(void*)),\ - [API] "I"(__builtin_offsetof(gl_hooks_t, gl._api)) \ - : \ + #define API_ENTRY(_api) __attribute__((naked,noinline)) _api + + // t0: $12 + // fn: $25 + // tls: $3 + // v0: $2 + #define CALL_GL_API_INTERNAL_CALL(_api, ...) \ + asm volatile( \ + ".set push\n\t" \ + ".set noreorder\n\t" \ + "rdhwr $3, $29\n\t" \ + "ld $12, %[OPENGL_API]($3)\n\t" \ + "beqz $12, 1f\n\t" \ + " move $25, $ra\n\t" \ + "ld $12, %[API]($12)\n\t" \ + "beqz $12, 1f\n\t" \ + " nop\n\t" \ + "move $25, $12\n\t" \ + "1:\n\t" \ + "jalr $0, $25\n\t" \ + " move $2, $0\n\t" \ + ".set pop\n\t" \ + : \ + : [OPENGL_API] "I"(TLS_SLOT_OPENGL_API*sizeof(void*)),\ + [API] "I"(__builtin_offsetof(gl_hooks_t, gl._api)) \ + : "$2", "$3", "$4", "$5", "$6", "$7", "$8", "$9", \ + "$10", "$11", "$12", "$25" \ ); + #define CALL_GL_API_INTERNAL_SET_RETURN_VALUE + #define CALL_GL_API_INTERNAL_DO_RETURN + #elif defined(__mips__) - #define API_ENTRY(_api) __attribute__((noinline)) _api + #define API_ENTRY(_api) __attribute__((naked,noinline)) _api - #define CALL_GL_API(_api, ...) \ - register unsigned int _t0 asm("$8"); \ - register unsigned int _fn asm("$25"); \ - register unsigned int _tls asm("$3"); \ - register unsigned int _v0 asm("$2"); \ + // t0: $8 + // fn: $25 + // tls: $3 + // v0: $2 + #define CALL_GL_API_INTERNAL_CALL(_api, ...) \ asm volatile( \ ".set push\n\t" \ ".set noreorder\n\t" \ ".set mips32r2\n\t" \ - "rdhwr %[tls], $29\n\t" \ - "lw %[t0], %[OPENGL_API](%[tls])\n\t" \ - "beqz %[t0], 1f\n\t" \ - " move %[fn],$ra\n\t" \ - "lw %[t0], %[API](%[t0])\n\t" \ - "beqz %[t0], 1f\n\t" \ + "rdhwr $3, $29\n\t" \ + "lw $3, %[OPENGL_API]($3)\n\t" \ + "beqz $3, 1f\n\t" \ + " move $25,$ra\n\t" \ + "lw $3, %[API]($3)\n\t" \ + "beqz $3, 1f\n\t" \ " nop\n\t" \ - "move %[fn], %[t0]\n\t" \ + "move $25, $3\n\t" \ "1:\n\t" \ - "jalr $0, %[fn]\n\t" \ - " move %[v0], $0\n\t" \ + "jalr $0, $25\n\t" \ + " move $2, $0\n\t" \ ".set pop\n\t" \ - : [fn] "=c"(_fn), \ - [tls] "=&r"(_tls), \ - [t0] "=&r"(_t0), \ - [v0] "=&r"(_v0) \ + : \ : [OPENGL_API] "I"(TLS_SLOT_OPENGL_API*4), \ [API] "I"(__builtin_offsetof(gl_hooks_t, gl._api)) \ - : \ - ); + : "$2", "$3", "$4", "$5", "$6", "$7", "$8", "$25" \ + ); -#endif + #define CALL_GL_API_INTERNAL_SET_RETURN_VALUE + #define CALL_GL_API_INTERNAL_DO_RETURN -#define CALL_GL_API_RETURN(_api, ...) \ - CALL_GL_API(_api, __VA_ARGS__) \ - return 0; +#endif +#define CALL_GL_API(_api, ...) \ + CALL_GL_API_INTERNAL_CALL(_api, __VA_ARGS__) \ + CALL_GL_API_INTERNAL_DO_RETURN +#define CALL_GL_API_RETURN(_api, ...) \ + CALL_GL_API_INTERNAL_CALL(_api, __VA_ARGS__) \ + CALL_GL_API_INTERNAL_SET_RETURN_VALUE \ + CALL_GL_API_INTERNAL_DO_RETURN extern "C" { #pragma GCC diagnostic ignored "-Wunused-parameter" @@ -202,6 +280,9 @@ extern "C" { #undef API_ENTRY #undef CALL_GL_API +#undef CALL_GL_API_INTERNAL_CALL +#undef CALL_GL_API_INTERNAL_SET_RETURN_VALUE +#undef CALL_GL_API_INTERNAL_DO_RETURN #undef CALL_GL_API_RETURN /* diff --git a/opengl/libs/GLES_CM/gl.cpp b/opengl/libs/GLES_CM/gl.cpp index b1b31f8294..8bde4e5f04 100644 --- a/opengl/libs/GLES_CM/gl.cpp +++ b/opengl/libs/GLES_CM/gl.cpp @@ -90,39 +90,65 @@ GL_API void GL_APIENTRY glWeightPointerOESBounds(GLint size, GLenum type, #undef API_ENTRY #undef CALL_GL_API +#undef CALL_GL_API_INTERNAL_CALL +#undef CALL_GL_API_INTERNAL_SET_RETURN_VALUE +#undef CALL_GL_API_INTERNAL_DO_RETURN #undef CALL_GL_API_RETURN #if USE_SLOW_BINDING #define API_ENTRY(_api) _api - #define CALL_GL_API(_api, ...) \ + #define CALL_GL_API_INTERNAL_CALL(_api, ...) \ gl_hooks_t::gl_t const * const _c = &getGlThreadSpecific()->gl; \ if (_c) return _c->_api(__VA_ARGS__); + #define CALL_GL_API_INTERNAL_SET_RETURN_VALUE return 0; + + // This stays blank, since void functions will implicitly return, and + // all of the other functions will return 0 based on the previous macro. + #define CALL_GL_API_INTERNAL_DO_RETURN + #elif defined(__arm__) #define GET_TLS(reg) "mrc p15, 0, " #reg ", c13, c0, 3 \n" - #define API_ENTRY(_api) __attribute__((noinline)) _api + #define API_ENTRY(_api) __attribute__((naked,noinline)) _api - #define CALL_GL_API(_api, ...) \ - asm volatile( \ - GET_TLS(r12) \ - "ldr r12, [r12, %[tls]] \n" \ - "cmp r12, #0 \n" \ - "ldrne pc, [r12, %[api]] \n" \ - : \ - : [tls] "J"(TLS_SLOT_OPENGL_API*4), \ - [api] "J"(__builtin_offsetof(gl_hooks_t, gl._api)) \ - : "r12" \ - ); + #define CALL_GL_API_INTERNAL_CALL(_api, ...) \ + asm volatile( \ + GET_TLS(r12) \ + "ldr r12, [r12, %[tls]] \n" \ + "cmp r12, #0 \n" \ + "ldrne pc, [r12, %[api]] \n" \ + : \ + : [tls] "J"(TLS_SLOT_OPENGL_API*4), \ + [api] "J"(__builtin_offsetof(gl_hooks_t, gl._api)) \ + : "r0", "r1", "r2", "r3", "r12" \ + ); + + #define CALL_GL_API_INTERNAL_SET_RETURN_VALUE \ + asm volatile( \ + "mov r0, #0 \n" \ + : \ + : \ + : "r0" \ + ); + + + #define CALL_GL_API_INTERNAL_DO_RETURN \ + asm volatile( \ + "bx lr \n" \ + : \ + : \ + : "r0" \ + ); #elif defined(__aarch64__) - #define API_ENTRY(_api) __attribute__((noinline)) _api + #define API_ENTRY(_api) __attribute__((naked,noinline)) _api - #define CALL_GL_API(_api, ...) \ + #define CALL_GL_API_INTERNAL_CALL(_api, ...) \ asm volatile( \ "mrs x16, tpidr_el0\n" \ "ldr x16, [x16, %[tls]]\n" \ @@ -133,120 +159,173 @@ GL_API void GL_APIENTRY glWeightPointerOESBounds(GLint size, GLenum type, : \ : [tls] "i" (TLS_SLOT_OPENGL_API * sizeof(void*)), \ [api] "i" (__builtin_offsetof(gl_hooks_t, gl._api)) \ - : "x16" \ + : "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x16" \ + ); + + #define CALL_GL_API_INTERNAL_SET_RETURN_VALUE \ + asm volatile( \ + "mov w0, wzr \n" \ + : \ + : \ + : "w0" \ + ); + + #define CALL_GL_API_INTERNAL_DO_RETURN \ + asm volatile( \ + "ret \n" \ + : \ + : \ + : \ ); #elif defined(__i386__) - #define API_ENTRY(_api) __attribute__((noinline,optimize("omit-frame-pointer"))) _api + #define API_ENTRY(_api) __attribute__((naked,noinline)) _api - #define CALL_GL_API(_api, ...) \ - register void* fn; \ + #define CALL_GL_API_INTERNAL_CALL(_api, ...) \ __asm__ volatile( \ - "mov %%gs:0, %[fn]\n" \ - "mov %P[tls](%[fn]), %[fn]\n" \ - "test %[fn], %[fn]\n" \ + "mov %%gs:0, %%eax\n" \ + "mov %P[tls](%%eax), %%eax\n" \ + "test %%eax, %%eax\n" \ "je 1f\n" \ - "jmp *%P[api](%[fn])\n" \ + "jmp *%P[api](%%eax)\n" \ "1:\n" \ - : [fn] "=r" (fn) \ + : \ : [tls] "i" (TLS_SLOT_OPENGL_API*sizeof(void*)), \ [api] "i" (__builtin_offsetof(gl_hooks_t, gl._api)) \ - : "cc" \ - ); + : "cc", "%eax" \ + ); + + #define CALL_GL_API_INTERNAL_SET_RETURN_VALUE \ + __asm__ volatile( \ + "xor %%eax, %%eax\n" \ + : \ + : \ + : "%eax" \ + ); + + #define CALL_GL_API_INTERNAL_DO_RETURN \ + __asm__ volatile( \ + "ret\n" \ + : \ + : \ + : \ + ); #elif defined(__x86_64__) - #define API_ENTRY(_api) __attribute__((noinline,optimize("omit-frame-pointer"))) _api + #define API_ENTRY(_api) __attribute__((naked,noinline)) _api - #define CALL_GL_API(_api, ...) \ - register void** fn; \ - __asm__ volatile( \ - "mov %%fs:0, %[fn]\n" \ - "mov %P[tls](%[fn]), %[fn]\n" \ - "test %[fn], %[fn]\n" \ + #define CALL_GL_API_INTERNAL_CALL(_api, ...) \ + __asm__ volatile( \ + "mov %%fs:0, %%rax\n" \ + "mov %P[tls](%%rax), %%rax\n" \ + "test %%rax, %%rax\n" \ "je 1f\n" \ - "jmp *%P[api](%[fn])\n" \ + "jmp *%P[api](%%rax)\n" \ "1:\n" \ - : [fn] "=r" (fn) \ + : \ : [tls] "i" (TLS_SLOT_OPENGL_API*sizeof(void*)), \ [api] "i" (__builtin_offsetof(gl_hooks_t, gl._api)) \ - : "cc" \ - ); + : "cc", "%rdi", "%rsi", "%rdx", "%rcx", "%r8", "%r9", \ + "%xmm0", "%xmm1", "%xmm2", "%xmm3", "%xmm4", "%xmm5", \ + "%xmm6", "%xmm7" \ + ); + + #define CALL_GL_API_INTERNAL_SET_RETURN_VALUE \ + __asm__ volatile( \ + "xor %%eax, %%eax\n" \ + : \ + : \ + : "%eax" \ + ); + + #define CALL_GL_API_INTERNAL_DO_RETURN \ + __asm__ volatile( \ + "retq\n" \ + : \ + : \ + : \ + ); #elif defined(__mips64) - #define API_ENTRY(_api) __attribute__((noinline)) _api - - #define CALL_GL_API(_api, ...) \ - register unsigned long _t0 asm("$12"); \ - register unsigned long _fn asm("$25"); \ - register unsigned long _tls asm("$3"); \ - register unsigned long _v0 asm("$2"); \ - asm volatile( \ - ".set push\n\t" \ - ".set noreorder\n\t" \ - "rdhwr %[tls], $29\n\t" \ - "ld %[t0], %[OPENGL_API](%[tls])\n\t" \ - "beqz %[t0], 1f\n\t" \ - " move %[fn], $ra\n\t" \ - "ld %[t0], %[API](%[t0])\n\t" \ - "beqz %[t0], 1f\n\t" \ - " nop\n\t" \ - "move %[fn], %[t0]\n\t" \ - "1:\n\t" \ - "jalr $0, %[fn]\n\t" \ - " move %[v0], $0\n\t" \ - ".set pop\n\t" \ - : [fn] "=c"(_fn), \ - [tls] "=&r"(_tls), \ - [t0] "=&r"(_t0), \ - [v0] "=&r"(_v0) \ - : [OPENGL_API] "I"(TLS_SLOT_OPENGL_API*sizeof(void*)),\ - [API] "I"(__builtin_offsetof(gl_hooks_t, gl._api)) \ - : \ + #define API_ENTRY(_api) __attribute__((naked,noinline)) _api + + // t0: $12 + // fn: $25 + // tls: $3 + // v0: $2 + #define CALL_GL_API_INTERNAL_CALL(_api, ...) \ + asm volatile( \ + ".set push\n\t" \ + ".set noreorder\n\t" \ + "rdhwr $3, $29\n\t" \ + "ld $12, %[OPENGL_API]($3)\n\t" \ + "beqz $12, 1f\n\t" \ + " move $25, $ra\n\t" \ + "ld $12, %[API]($12)\n\t" \ + "beqz $12, 1f\n\t" \ + " nop\n\t" \ + "move $25, $12\n\t" \ + "1:\n\t" \ + "jalr $0, $25\n\t" \ + " move $2, $0\n\t" \ + ".set pop\n\t" \ + : \ + : [OPENGL_API] "I"(TLS_SLOT_OPENGL_API*sizeof(void*)),\ + [API] "I"(__builtin_offsetof(gl_hooks_t, gl._api)) \ + : "$2", "$3", "$4", "$5", "$6", "$7", "$8", "$9", \ + "$10", "$11", "$12", "$25" \ ); + #define CALL_GL_API_INTERNAL_SET_RETURN_VALUE + #define CALL_GL_API_INTERNAL_DO_RETURN + #elif defined(__mips__) - #define API_ENTRY(_api) __attribute__((noinline)) _api + #define API_ENTRY(_api) __attribute__((naked,noinline)) _api - #define CALL_GL_API(_api, ...) \ - register unsigned int _t0 asm("$8"); \ - register unsigned int _fn asm("$25"); \ - register unsigned int _tls asm("$3"); \ - register unsigned int _v0 asm("$2"); \ + // t0: $8 + // fn: $25 + // tls: $3 + // v0: $2 + #define CALL_GL_API_INTERNAL_CALL(_api, ...) \ asm volatile( \ ".set push\n\t" \ ".set noreorder\n\t" \ ".set mips32r2\n\t" \ - "rdhwr %[tls], $29\n\t" \ - "lw %[t0], %[OPENGL_API](%[tls])\n\t" \ - "beqz %[t0], 1f\n\t" \ - " move %[fn], $ra\n\t" \ - "lw %[t0], %[API](%[t0])\n\t" \ - "beqz %[t0], 1f\n\t" \ + "rdhwr $3, $29\n\t" \ + "lw $3, %[OPENGL_API]($3)\n\t" \ + "beqz $3, 1f\n\t" \ + " move $25,$ra\n\t" \ + "lw $3, %[API]($3)\n\t" \ + "beqz $3, 1f\n\t" \ " nop\n\t" \ - "move %[fn], %[t0]\n\t" \ + "move $25, $3\n\t" \ "1:\n\t" \ - "jalr $0, %[fn]\n\t" \ - " move %[v0], $0\n\t" \ + "jalr $0, $25\n\t" \ + " move $2, $0\n\t" \ ".set pop\n\t" \ - : [fn] "=c"(_fn), \ - [tls] "=&r"(_tls), \ - [t0] "=&r"(_t0), \ - [v0] "=&r"(_v0) \ + : \ : [OPENGL_API] "I"(TLS_SLOT_OPENGL_API*4), \ [API] "I"(__builtin_offsetof(gl_hooks_t, gl._api)) \ - : \ - ); + : "$2", "$3", "$4", "$5", "$6", "$7", "$8", "$25" \ + ); + + #define CALL_GL_API_INTERNAL_SET_RETURN_VALUE + #define CALL_GL_API_INTERNAL_DO_RETURN #endif -#define CALL_GL_API_RETURN(_api, ...) \ - CALL_GL_API(_api, __VA_ARGS__) \ - return 0; +#define CALL_GL_API(_api, ...) \ + CALL_GL_API_INTERNAL_CALL(_api, __VA_ARGS__) \ + CALL_GL_API_INTERNAL_DO_RETURN +#define CALL_GL_API_RETURN(_api, ...) \ + CALL_GL_API_INTERNAL_CALL(_api, __VA_ARGS__) \ + CALL_GL_API_INTERNAL_SET_RETURN_VALUE \ + CALL_GL_API_INTERNAL_DO_RETURN extern "C" { #pragma GCC diagnostic ignored "-Wunused-parameter" @@ -257,6 +336,9 @@ extern "C" { #undef API_ENTRY #undef CALL_GL_API +#undef CALL_GL_API_INTERNAL_CALL +#undef CALL_GL_API_INTERNAL_SET_RETURN_VALUE +#undef CALL_GL_API_INTERNAL_DO_RETURN #undef CALL_GL_API_RETURN /* diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index a2c0462327..b9e1161699 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -158,9 +158,7 @@ void Layer::onFirstRef() { mSurfaceFlingerConsumer->setContentsChangedListener(this); mSurfaceFlingerConsumer->setName(mName); -#ifdef TARGET_DISABLE_TRIPLE_BUFFERING -#warning "disabling triple buffering" -#else +#ifndef TARGET_DISABLE_TRIPLE_BUFFERING mProducer->setMaxDequeuedBufferCount(2); #endif |