android_hardware_qcom_display/libhwcomposer/ihwc.cpp
Ramkumar Radhakrishnan 060e7797ed display: Add binder interface between hwcservice and its clients.
Add hwc_service.cpp and ihwc.cpp file to enable direct communication
to hwcomposer by the clients to set hwc system wide properties.

Create hwcomposer service singleton object in hwc_context_t structure.

Change-Id: I0d0879475951a618a453a23ee254ea651e8c6b88
2012-09-12 22:55:04 -05:00

172 lines
5.8 KiB
C++

/*
* Copyright (C) 2011 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 <utils/Errors.h>
#include <binder/Parcel.h>
#include <binder/IBinder.h>
#include <binder/IInterface.h>
#include <ihwc.h>
using namespace android;
// ---------------------------------------------------------------------------
namespace hwcService {
class BpHWComposer : public BpInterface<IHWComposer>
{
public:
BpHWComposer(const sp<IBinder>& impl)
: BpInterface<IHWComposer>(impl)
{
}
virtual status_t setHPDStatus(int hpdStatus) {
Parcel data, reply;
data.writeInterfaceToken(IHWComposer::getInterfaceDescriptor());
data.writeInt32(hpdStatus);
status_t result = remote()->transact(SET_EXT_HPD_ENABLE,
data, &reply);
result = reply.readInt32();
return result;
}
virtual status_t setResolutionMode(int resMode) {
Parcel data, reply;
data.writeInterfaceToken(IHWComposer::getInterfaceDescriptor());
data.writeInt32(resMode);
status_t result = remote()->transact(SET_EXT_DISPLAY_RESOLUTION_MODE,
data, &reply);
result = reply.readInt32();
return result;
}
virtual status_t setActionSafeDimension(int w, int h) {
Parcel data, reply;
data.writeInterfaceToken(IHWComposer::getInterfaceDescriptor());
data.writeInt32(w);
data.writeInt32(h);
status_t result =
remote()->transact(SET_EXT_DISPLAY_ACTIONSAFE_DIMENSIONS,
data, &reply);
result = reply.readInt32();
return result;
}
virtual status_t getExternalDisplay(int *extDispType) {
Parcel data, reply;
data.writeInterfaceToken(IHWComposer::getInterfaceDescriptor());
status_t result = remote()->transact(GET_EXT_DISPLAY_TYPE,
data, &reply);
*extDispType = reply.readInt32();
result = reply.readInt32();
return result;
}
virtual status_t getResolutionModes(int *resModes, int count) {
Parcel data, reply;
data.writeInterfaceToken(IHWComposer::getInterfaceDescriptor());
data.writeInt32(count);
status_t result = remote()->transact(GET_EXT_DISPLAY_RESOLUTION_MODES,
data, &reply);
for(int i = 0;i < count;i++) {
resModes[i] = reply.readInt32();
}
result = reply.readInt32();
return result;
}
virtual status_t getResolutionModeCount(int *resModeCount) {
Parcel data, reply;
data.writeInterfaceToken(IHWComposer::getInterfaceDescriptor());
status_t result = remote()->transact(
GET_EXT_DISPLAY_RESOLUTION_MODE_COUNT, data, &reply);
*resModeCount = reply.readInt32();
result = reply.readInt32();
return result;
}
};
IMPLEMENT_META_INTERFACE(HWComposer, "android.display.IHWComposer");
// ----------------------------------------------------------------------
status_t BnHWComposer::onTransact(
uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
{
// codes that don't require permission check
switch(code) {
case SET_EXT_HPD_ENABLE: {
CHECK_INTERFACE(IHWComposer, data, reply);
int hpdStatus = data.readInt32();
status_t res = setHPDStatus(hpdStatus);
reply->writeInt32(res);
return NO_ERROR;
} break;
case SET_EXT_DISPLAY_RESOLUTION_MODE: {
CHECK_INTERFACE(IHWComposer, data, reply);
int resMode = data.readInt32();
status_t res = setResolutionMode(resMode);
reply->writeInt32(res);
return NO_ERROR;
} break;
case SET_EXT_DISPLAY_ACTIONSAFE_DIMENSIONS: {
CHECK_INTERFACE(IHWComposer, data, reply);
int w = data.readInt32();
int h = data.readInt32();
status_t res = setActionSafeDimension(w, h);
reply->writeInt32(res);
return NO_ERROR;
} break;
case GET_EXT_DISPLAY_TYPE: {
CHECK_INTERFACE(IHWComposer, data, reply);
int extDispType;
status_t res = getExternalDisplay(&extDispType);
reply->writeInt32(extDispType);
reply->writeInt32(res);
return NO_ERROR;
} break;
case GET_EXT_DISPLAY_RESOLUTION_MODES: {
CHECK_INTERFACE(IHWComposer, data, reply);
int count = data.readInt32();
int resModes[64];
status_t res = getResolutionModes(&resModes[0]);
for(int i = 0;i < count;i++) {
reply->writeInt32(resModes[i]);
}
reply->writeInt32(res);
return NO_ERROR;
} break;
case GET_EXT_DISPLAY_RESOLUTION_MODE_COUNT: {
CHECK_INTERFACE(IHWComposer, data, reply);
int resModeCount;
status_t res = getResolutionModeCount(&resModeCount);
reply->writeInt32(resModeCount);
reply->writeInt32(res);
return NO_ERROR;
} break;
default:
return BBinder::onTransact(code, data, reply, flags);
}
}
}; // namespace hwcService