Есть ли способ отключить HWC в AOSP и выполнить все в GLES? - PullRequest
0 голосов
/ 08 июня 2019

В Android 8 и выше есть две функции для работы с графикой. SurfaceFlinger использует GLES для некоторых слоев, чтобы визуализировать и передать другие для обработки аппаратным композитором. Мой вопрос: есть ли способ заставить систему использовать только GLES для рендеринга всего, так что я могу использовать код шейдера (GLSL) для правильной манипуляции с буферами кадров.

Файлы проекта имеют файлы HWC везде. Я пытаюсь найти способ изменить каждый кадр.

1 Ответ

0 голосов
/ 12 июня 2019

В 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, чтобы пользователь не использовал переключатель для сброса состояния.

...