diff options
Diffstat (limited to 'services')
-rw-r--r-- | services/batteryservice/Android.mk | 1 | ||||
-rw-r--r-- | services/batteryservice/BatteryProperty.cpp | 40 | ||||
-rw-r--r-- | services/batteryservice/IBatteryPropertiesRegistrar.cpp | 24 | ||||
-rw-r--r-- | services/inputflinger/Android.mk | 50 | ||||
-rw-r--r-- | services/inputflinger/InputFlinger.cpp | 89 | ||||
-rw-r--r-- | services/inputflinger/InputFlinger.h | 54 | ||||
-rw-r--r-- | services/inputflinger/main.cpp | 26 | ||||
-rw-r--r-- | services/sensorservice/BatteryService.cpp | 32 | ||||
-rw-r--r-- | services/sensorservice/BatteryService.h | 8 | ||||
-rw-r--r-- | services/surfaceflinger/DisplayHardware/HWComposer.cpp | 1 | ||||
-rw-r--r-- | services/surfaceflinger/RenderEngine/ProgramCache.cpp | 3 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 38 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.h | 4 |
13 files changed, 328 insertions, 42 deletions
diff --git a/services/batteryservice/Android.mk b/services/batteryservice/Android.mk index 0a29c36..9354b99 100644 --- a/services/batteryservice/Android.mk +++ b/services/batteryservice/Android.mk @@ -3,6 +3,7 @@ include $(CLEAR_VARS) LOCAL_SRC_FILES:= \ BatteryProperties.cpp \ + BatteryProperty.cpp \ IBatteryPropertiesListener.cpp \ IBatteryPropertiesRegistrar.cpp diff --git a/services/batteryservice/BatteryProperty.cpp b/services/batteryservice/BatteryProperty.cpp new file mode 100644 index 0000000..6cbc896 --- /dev/null +++ b/services/batteryservice/BatteryProperty.cpp @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <stdint.h> +#include <sys/types.h> +#include <batteryservice/BatteryService.h> +#include <binder/Parcel.h> +#include <utils/Errors.h> + +namespace android { + +/* + * Parcel read/write code must be kept in sync with + * frameworks/base/core/java/android/os/BatteryProperty.java + */ + +status_t BatteryProperty::readFromParcel(Parcel* p) { + valueInt = p->readInt32(); + return OK; +} + +status_t BatteryProperty::writeToParcel(Parcel* p) const { + p->writeInt32(valueInt); + return OK; +} + +}; // namespace android diff --git a/services/batteryservice/IBatteryPropertiesRegistrar.cpp b/services/batteryservice/IBatteryPropertiesRegistrar.cpp index 6c2d2a5..6647122 100644 --- a/services/batteryservice/IBatteryPropertiesRegistrar.cpp +++ b/services/batteryservice/IBatteryPropertiesRegistrar.cpp @@ -44,6 +44,18 @@ public: data.writeStrongBinder(listener->asBinder()); remote()->transact(UNREGISTER_LISTENER, data, NULL); } + + status_t getProperty(int id, struct BatteryProperty *val) { + Parcel data, reply; + data.writeInterfaceToken(IBatteryPropertiesRegistrar::getInterfaceDescriptor()); + data.writeInt32(id); + remote()->transact(GET_PROPERTY, data, &reply); + status_t ret = reply.readInt32(); + int parcelpresent = reply.readInt32(); + if (parcelpresent) + val->readFromParcel(&reply); + return ret; + } }; IMPLEMENT_META_INTERFACE(BatteryPropertiesRegistrar, "android.os.IBatteryPropertiesRegistrar"); @@ -69,6 +81,18 @@ status_t BnBatteryPropertiesRegistrar::onTransact(uint32_t code, unregisterListener(listener); return OK; } + + case GET_PROPERTY: { + CHECK_INTERFACE(IBatteryPropertiesRegistrar, data, reply); + int id = data.readInt32(); + struct BatteryProperty val; + status_t result = getProperty(id, &val); + reply->writeNoException(); + reply->writeInt32(result); + reply->writeInt32(1); + val.writeToParcel(reply); + return OK; + } } return BBinder::onTransact(code, data, reply, flags); }; diff --git a/services/inputflinger/Android.mk b/services/inputflinger/Android.mk new file mode 100644 index 0000000..e32d38a --- /dev/null +++ b/services/inputflinger/Android.mk @@ -0,0 +1,50 @@ +# Copyright (C) 2013 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +LOCAL_PATH:= $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_SRC_FILES:= \ + InputFlinger.cpp + +LOCAL_SHARED_LIBRARIES := \ + libbinder \ + libcutils \ + libinput \ + liblog \ + libutils + +LOCAL_CFLAGS += -fvisibility=hidden + +LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH) + +LOCAL_MODULE := libinputflinger + +include $(BUILD_SHARED_LIBRARY) + +######################################################################## +# build input flinger executable +include $(CLEAR_VARS) + +LOCAL_SRC_FILES:= \ + main.cpp + +LOCAL_SHARED_LIBRARIES := \ + libbinder \ + libinputflinger \ + libutils + +LOCAL_MODULE := inputflinger + +include $(BUILD_EXECUTABLE) diff --git a/services/inputflinger/InputFlinger.cpp b/services/inputflinger/InputFlinger.cpp new file mode 100644 index 0000000..9ea6ce5 --- /dev/null +++ b/services/inputflinger/InputFlinger.cpp @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define LOG_TAG "InputFlinger" + +#include "InputFlinger.h" + +#include <stdint.h> +#include <unistd.h> + +#include <sys/types.h> + +#include <binder/IPCThreadState.h> +#include <binder/PermissionCache.h> +#include <cutils/log.h> +#include <private/android_filesystem_config.h> + +namespace android { + +const String16 sAccessInputFlingerPermission("android.permission.ACCESS_INPUT_FLINGER"); +const String16 sDumpPermission("android.permission.DUMP"); + + +InputFlinger::InputFlinger() : + BnInputFlinger() { + ALOGI("InputFlinger is starting"); +} + +InputFlinger::~InputFlinger() { +} + +status_t InputFlinger::onTransact( + uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) { + switch (code) { + case DO_SOMETHING_TRANSACTION: + const IPCThreadState* ipc = IPCThreadState::self(); + const int pid = ipc->getCallingPid(); + const int uid = ipc->getCallingUid(); + if (!PermissionCache::checkPermission(sAccessInputFlingerPermission, pid, uid)) { + ALOGE("Permission Denial: " + "can't access InputFlinger from pid=%d, uid=%d", pid, uid); + return PERMISSION_DENIED; + } + break; + } + + return BnInputFlinger::onTransact(code, data, reply, flags); +} + +status_t InputFlinger::dump(int fd, const Vector<String16>& args) { + String8 result; + const IPCThreadState* ipc = IPCThreadState::self(); + const int pid = ipc->getCallingPid(); + const int uid = ipc->getCallingUid(); + if ((uid != AID_SHELL) + && !PermissionCache::checkPermission(sDumpPermission, pid, uid)) { + result.appendFormat("Permission Denial: " + "can't dump SurfaceFlinger from pid=%d, uid=%d\n", pid, uid); + } else { + dumpInternal(result); + } + write(fd, result.string(), result.size()); + return OK; +} + +void InputFlinger::dumpInternal(String8& result) { + result.append("INPUT FLINGER (dumpsys inputflinger)\n"); + result.append("... nothing here yet...\n"); +} + +status_t InputFlinger::doSomething() { + ALOGI("Did something..."); + return OK; +} + +}; // namespace android diff --git a/services/inputflinger/InputFlinger.h b/services/inputflinger/InputFlinger.h new file mode 100644 index 0000000..731ab17 --- /dev/null +++ b/services/inputflinger/InputFlinger.h @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ANDROID_INPUT_FLINGER_H +#define ANDROID_INPUT_FLINGER_H + +#include <stdint.h> +#include <sys/types.h> + +#include <cutils/compiler.h> +#include <input/IInputFlinger.h> +#include <utils/String8.h> +#include <utils/String16.h> + +namespace android { + +class InputFlinger : public BnInputFlinger { +public: + static char const* getServiceName() ANDROID_API { + return "inputflinger"; + } + + InputFlinger() ANDROID_API; + + // IBinder interface + virtual status_t onTransact(uint32_t code, + const Parcel& data, Parcel* reply, uint32_t flags); + virtual status_t dump(int fd, const Vector<String16>& args); + + // IInputFlinger interface + virtual status_t doSomething(); + +private: + virtual ~InputFlinger(); + + void dumpInternal(String8& result); +}; + +} // namespace android + +#endif // ANDROID_INPUT_FLINGER_H diff --git a/services/inputflinger/main.cpp b/services/inputflinger/main.cpp new file mode 100644 index 0000000..3209a62 --- /dev/null +++ b/services/inputflinger/main.cpp @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <binder/BinderService.h> +#include "InputFlinger.h" + +using namespace android; + +int main(int argc, char** argv) { + ProcessState::self()->setThreadPoolMaxThreadCount(4); + BinderService<InputFlinger>::publishAndJoinThreadPool(true); + return 0; +} diff --git a/services/sensorservice/BatteryService.cpp b/services/sensorservice/BatteryService.cpp index 38dc749..cb962a6 100644 --- a/services/sensorservice/BatteryService.cpp +++ b/services/sensorservice/BatteryService.cpp @@ -34,32 +34,10 @@ BatteryService::BatteryService() { const sp<IServiceManager> sm(defaultServiceManager()); if (sm != NULL) { const String16 name("batterystats"); - mBatteryStatService = sm->getService(name); + mBatteryStatService = interface_cast<IBatteryStats>(sm->getService(name)); } } -status_t BatteryService::noteStartSensor(int uid, int handle) { - Parcel data, reply; - data.writeInterfaceToken(DESCRIPTOR); - data.writeInt32(uid); - data.writeInt32(handle); - status_t err = mBatteryStatService->transact( - TRANSACTION_noteStartSensor, data, &reply, 0); - err = reply.readExceptionCode(); - return err; -} - -status_t BatteryService::noteStopSensor(int uid, int handle) { - Parcel data, reply; - data.writeInterfaceToken(DESCRIPTOR); - data.writeInt32(uid); - data.writeInt32(handle); - status_t err = mBatteryStatService->transact( - TRANSACTION_noteStopSensor, data, &reply, 0); - err = reply.readExceptionCode(); - return err; -} - bool BatteryService::addSensor(uid_t uid, int handle) { Mutex::Autolock _l(mActivationsLock); Info key(uid, handle); @@ -86,7 +64,7 @@ void BatteryService::enableSensorImpl(uid_t uid, int handle) { if (mBatteryStatService != 0) { if (addSensor(uid, handle)) { int64_t identity = IPCThreadState::self()->clearCallingIdentity(); - noteStartSensor(uid, handle); + mBatteryStatService->noteStartSensor(uid, handle); IPCThreadState::self()->restoreCallingIdentity(identity); } } @@ -95,7 +73,7 @@ void BatteryService::disableSensorImpl(uid_t uid, int handle) { if (mBatteryStatService != 0) { if (removeSensor(uid, handle)) { int64_t identity = IPCThreadState::self()->clearCallingIdentity(); - noteStopSensor(uid, handle); + mBatteryStatService->noteStopSensor(uid, handle); IPCThreadState::self()->restoreCallingIdentity(identity); } } @@ -108,7 +86,7 @@ void BatteryService::cleanupImpl(uid_t uid) { for (ssize_t i=0 ; i<mActivations.size() ; i++) { const Info& info(mActivations[i]); if (info.uid == uid) { - noteStopSensor(info.uid, info.handle); + mBatteryStatService->noteStopSensor(info.uid, info.handle); mActivations.removeAt(i); i--; } @@ -117,8 +95,6 @@ void BatteryService::cleanupImpl(uid_t uid) { } } -const String16 BatteryService::DESCRIPTOR("com.android.internal.app.IBatteryStats"); - ANDROID_SINGLETON_STATIC_INSTANCE(BatteryService) // --------------------------------------------------------------------------- diff --git a/services/sensorservice/BatteryService.h b/services/sensorservice/BatteryService.h index 86cc884..08ba857 100644 --- a/services/sensorservice/BatteryService.h +++ b/services/sensorservice/BatteryService.h @@ -17,22 +17,18 @@ #include <stdint.h> #include <sys/types.h> +#include <binder/IBatteryStats.h> #include <utils/Singleton.h> namespace android { // --------------------------------------------------------------------------- class BatteryService : public Singleton<BatteryService> { - static const int TRANSACTION_noteStartSensor = IBinder::FIRST_CALL_TRANSACTION + 3; - static const int TRANSACTION_noteStopSensor = IBinder::FIRST_CALL_TRANSACTION + 4; - static const String16 DESCRIPTOR; friend class Singleton<BatteryService>; - sp<IBinder> mBatteryStatService; + sp<IBatteryStats> mBatteryStatService; BatteryService(); - status_t noteStartSensor(int uid, int handle); - status_t noteStopSensor(int uid, int handle); void enableSensorImpl(uid_t uid, int handle); void disableSensorImpl(uid_t uid, int handle); diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.cpp b/services/surfaceflinger/DisplayHardware/HWComposer.cpp index 7132b2f..8a80488 100644 --- a/services/surfaceflinger/DisplayHardware/HWComposer.cpp +++ b/services/surfaceflinger/DisplayHardware/HWComposer.cpp @@ -23,7 +23,6 @@ #include <sys/types.h> #include <math.h> -#include <utils/CallStack.h> #include <utils/Errors.h> #include <utils/misc.h> #include <utils/String8.h> diff --git a/services/surfaceflinger/RenderEngine/ProgramCache.cpp b/services/surfaceflinger/RenderEngine/ProgramCache.cpp index 09b0ddc..d130506 100644 --- a/services/surfaceflinger/RenderEngine/ProgramCache.cpp +++ b/services/surfaceflinger/RenderEngine/ProgramCache.cpp @@ -169,7 +169,8 @@ String8 ProgramCache::generateFragmentShader(const Key& needs) { fs << "gl_FragColor.rgb = gl_FragColor.rgb/gl_FragColor.a;"; } fs << "gl_FragColor.rgb = pow(gl_FragColor.rgb, vec3(2.2));"; - fs << "gl_FragColor = colorMatrix*gl_FragColor;"; + fs << "vec4 transformed = colorMatrix * vec4(gl_FragColor.rgb, 1);"; + fs << "gl_FragColor.rgb = transformed.rgb/transformed.a;"; fs << "gl_FragColor.rgb = pow(gl_FragColor.rgb, vec3(1.0 / 2.2));"; if (!needs.isOpaque() && needs.isPremultiplied()) { // and re-premultiply if needed after gamma correction diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index e374548..3ae335f 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -114,7 +114,8 @@ SurfaceFlinger::SurfaceFlinger() mDebugInTransaction(0), mLastTransactionTime(0), mBootFinished(false), - mDaltonize(false) + mDaltonize(false), + mHasColorMatrix(false) { ALOGI("SurfaceFlinger is starting"); @@ -880,7 +881,7 @@ void SurfaceFlinger::setUpHWComposer() { for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) { const sp<Layer>& layer(currentLayers[i]); layer->setGeometry(hw, *cur); - if (mDebugDisableHWC || mDebugRegion || mDaltonize) { + if (mDebugDisableHWC || mDebugRegion || mDaltonize || mHasColorMatrix) { cur->setSkip(true); } } @@ -1500,11 +1501,15 @@ void SurfaceFlinger::doDisplayComposition(const sp<const DisplayDevice>& hw, } } - if (CC_LIKELY(!mDaltonize)) { + if (CC_LIKELY(!mDaltonize && !mHasColorMatrix)) { doComposeSurfaces(hw, dirtyRegion); } else { RenderEngine& engine(getRenderEngine()); - engine.beginGroup(mDaltonizer()); + mat4 colorMatrix = mColorMatrix; + if (mDaltonize) { + colorMatrix = colorMatrix * mDaltonizer(); + } + engine.beginGroup(colorMatrix); doComposeSurfaces(hw, dirtyRegion); engine.endGroup(); } @@ -2389,7 +2394,8 @@ void SurfaceFlinger::dumpAllLocked(const Vector<String16>& args, size_t& index, colorizer.reset(result); result.appendFormat(" h/w composer %s and %s\n", hwc.initCheck()==NO_ERROR ? "present" : "not present", - (mDebugDisableHWC || mDebugRegion || mDaltonize) ? "disabled" : "enabled"); + (mDebugDisableHWC || mDebugRegion || mDaltonize + || mHasColorMatrix) ? "disabled" : "enabled"); hwc.dump(result); /* @@ -2552,8 +2558,28 @@ status_t SurfaceFlinger::onTransact( mDaltonize = n > 0; invalidateHwcGeometry(); repaintEverything(); + return NO_ERROR; + } + case 1015: { + // apply a color matrix + n = data.readInt32(); + mHasColorMatrix = n ? 1 : 0; + if (n) { + // color matrix is sent as mat3 matrix followed by vec3 + // offset, then packed into a mat4 where the last row is + // the offset and extra values are 0 + for (size_t i = 0 ; i < 4; i++) { + for (size_t j = 0; j < 4; j++) { + mColorMatrix[i][j] = data.readFloat(); + } + } + } else { + mColorMatrix = mat4(); + } + invalidateHwcGeometry(); + repaintEverything(); + return NO_ERROR; } - return NO_ERROR; } } return err; diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index 0e9955c..3a79c06 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -38,6 +38,7 @@ #include <binder/IMemory.h> #include <ui/PixelFormat.h> +#include <ui/mat4.h> #include <gui/ISurfaceComposer.h> #include <gui/ISurfaceComposerClient.h> @@ -462,6 +463,9 @@ private: Daltonizer mDaltonizer; bool mDaltonize; + + mat4 mColorMatrix; + bool mHasColorMatrix; }; // --------------------------------------------------------------------------- |