在Android 8和更高版本中,有两个处理图形的功能。SurfaceFlinger使用GLES对一些层进行渲染,并将其他层传递给硬件编写器处理。我的问题是,有没有一种方法可以让系统只使用GLES来渲染所有内容,这样我就可以使用着色器(GLSL)代码来正确地操作帧缓冲区。
项目文件中到处都是HWC文件。我正在试图找到一种方法来改变每一帧。
发布于 2019-06-12 17:18:07
在Settings->Developer options->HARDWARE ACCELERATED RENDERING中,有一个名为Disable HW overlays的交换机。如果打开它,系统将关闭HWC并使用OpenGLES渲染层。如果你想总是关闭它,你可以深入到代码中,找到它设置的标志,然后你可以将它设置为禁用HWC的值。
更新1:
在DevelopmentSettings.java中,下面的代码是向SurfaceFlinger发送标志
private void writeDisableOverlaysOption() {
try {
IBinder flinger = ServiceManager.getService("SurfaceFlinger");
if (flinger != null) {
Parcel data = Parcel.obtain();
data.writeInterfaceToken("android.ui.ISurfaceComposer");
final int disableOverlays = mDisableOverlays.isChecked() ? 1 : 0;
data.writeInt(disableOverlays);
flinger.transact(1008, data, null, 0);
data.recycle();
updateFlingerOptions();
}
} catch (RemoteException ex) {}
}在SurfaceFlinger.cpp中,它会将此标志保存到mDebugDisableHWC中,并使用以下代码通知Layer使用OpenGLES强制渲染:
// build the h/w work list
if (CC_UNLIKELY(mGeometryInvalid)) {
mGeometryInvalid = false;
for (size_t dpy = 0; dpy < mDisplays.size(); dpy++) {
sp<const DisplayDevice> displayDevice(mDisplays[dpy]);
const auto hwcId = displayDevice->getHwcDisplayId();
if (hwcId >= 0) {
const Vector<sp<Layer> >& currentLayers(
displayDevice->getVisibleLayersSortedByZ());
for (size_t i = 0; i < currentLayers.size(); i++) {
const auto& layer = currentLayers[i];
if (!layer->hasHwcLayer(hwcId)) {
if (!layer->createHwcLayer(mHwc.get(), hwcId)) {
layer->forceClientComposition(hwcId);
continue;
}
}
layer->setGeometry(displayDevice, i);
if (mDebugDisableHWC || mDebugRegion) {
layer->forceClientComposition(hwcId);
}
}
}
}
}好的,如果你想通过代码禁用它,你可以写一个像writeDisableOverlaysOption这样的方法,并在Settings中禁用switch,以避免用户使用switch来重置状态。
https://stackoverflow.com/questions/56507867
复制相似问题