首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法在AOSP中禁用HWC,并在GLES中执行所有操作?

有没有办法在AOSP中禁用HWC,并在GLES中执行所有操作?
EN

Stack Overflow用户
提问于 2019-06-08 23:47:44
回答 1查看 1.3K关注 0票数 0

在Android 8和更高版本中,有两个处理图形的功能。SurfaceFlinger使用GLES对一些层进行渲染,并将其他层传递给硬件编写器处理。我的问题是,有没有一种方法可以让系统只使用GLES来渲染所有内容,这样我就可以使用着色器(GLSL)代码来正确地操作帧缓冲区。

项目文件中到处都是HWC文件。我正在试图找到一种方法来改变每一帧。

EN

回答 1

Stack Overflow用户

发布于 2019-06-12 17:18:07

Settings->Developer options->HARDWARE ACCELERATED RENDERING中,有一个名为Disable HW overlays的交换机。如果打开它,系统将关闭HWC并使用OpenGLES渲染层。如果你想总是关闭它,你可以深入到代码中,找到它设置的标志,然后你可以将它设置为禁用HWC的值。

更新1:

DevelopmentSettings.java中,下面的代码是向SurfaceFlinger发送标志

代码语言:javascript
复制
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强制渲染:

代码语言:javascript
复制
// 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来重置状态。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56507867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档