Cobalt UI дисплей синего цвета с egl

После включения egl в Cobalt он может отображать страницу Youtube, но пользовательский интерфейс отображается синим цветом, может ли кто-нибудь указать, что вызвало это?

Дисплей красного цвета

Отображение YouTube в синем цвете

Должен быть белым, но отображаться синим

gclear образец

неправильная яркость


person bitchainer    schedule 02.03.2017    source источник
comment
Привет! Просто чтобы исключить возможность, так как No Signal! белый, а все остальное блекло-голубое, возможно ли, что на телевизоре нет сигнала! оверлей также создает слабый синий слой перед приложением?   -  person Andrew Top    schedule 02.03.2017
comment
@ Эндрю, «Нет сигнала» не имеет значения, когда я отключил слой «Нет сигнала», проблема все еще существует.   -  person bitchainer    schedule 03.03.2017
comment
Хм, тогда ладно. Так что похоже, что ни один пиксель на экране не является чисто белым (даже белый селектор, который отображается как белый прямоугольник, а не текстура), все они окрашены в синий цвет, поэтому похоже, что это не проблема формата цвета текстуры. . У нас нет какой-либо накладываемой поверхности, которую мы рисуем поверх всего, так что я не думаю, что это так. Вы вообще видите что-то красное? Может просто красного не хватает? Значит, это может быть настройка цели рендеринга?   -  person Andrew Top    schedule 05.03.2017
comment
Вы можете попробовать поиграть с параметрами конфигурации цели рендеринга в файле cobalt/renderer/backend/egl/graphics_system.cc:65 и посмотреть, повлияет ли это. Вы также можете попробовать настроить параметр SB_PREFERRED_RGBA_BYTE_ORDER в файле configuration_public.h вашей платформы, чтобы увидеть, повлияет ли это. Это должно быть SB_PREFERRED_RGBA_BYTE_ORDER_RGBA для платформ EGL/GLES2, но вы также можете попробовать SB_PREFERRED_RGBA_BYTE_ORDER_BGRA и SB_PREFERRED_RGBA_BYTE_ORDER_ARGB.   -  person Andrew Top    schedule 05.03.2017
comment
@Andrew Эндрю, после изменения SB_PREFERRED_RGBA_BYTE_ORDER на SB_PREFERRED_RGBA_BYTE_ORDER_BGRA или SB_PREFERRED_RGBA_BYTE_ORDER_ARGB никаких изменений не произошло, и казалось, что SB_PREFERRED_RGBA_BYTE_ORDER поддерживает только BGRA или RGBA из кода, где он использовался в cobalt.googlesource.com/cobalt/+/. И я также добавил логотип запуска при загрузке Cobalt, и он показал, что поддерживает красный цвет, но цвет не чисто красный (255,0,0).   -  person bitchainer    schedule 06.03.2017
comment
@ Эндрю, со стороны дисплея платформы (используйте EGL/GLES2) требовался цветовой формат ARGB, но из настройки в cobalt.googlesource.com/cobalt/+/, он использовал EGL_BIND_TO_TEXTURE_RGBA, возможно, это не несовместимо, но когда я изменил конфиг в graphics_system.cc:65 или configuration_public.h ничего не может работать, так есть ли способ сделать его совместимым, чтобы попробовать?   -  person bitchainer    schedule 06.03.2017
comment
@Andrew, из исходного кода в cobalt.googlesource.com/cobalt/+/ вы также обнаружите, что значения SK_*32_SHFIT должны соответствовать порядку байтов BGRA или RGBA, он не поддерживает порядок байтов ARGB.   -  person bitchainer    schedule 06.03.2017
comment
хм, хорошо, я вижу. Не могли бы вы рассказать мне, что происходит, когда в файле cobalt/renderer/rasterizer/skia/hardware_rasterizer.cc вы добавляете строки: GL_CALL(glClearColor(1, 1, 1, 1)); GL_CALL(glClear(GL_COLOR_BUFFER_BIT)); GL_CALL(glFlush()); Graphics_context_-›SwapBuffers(render_target_egl); возвращаться; В HardwareRasterizer::Impl::Submit(), в самом начале, после строки backend::GraphicsContextEGL::ScopedMakeCurrent(graphics_context_, render_target_egl);? Это должно привести к чисто белому отпечатку, но я предполагаю, что он будет окрашен в синий цвет.   -  person Andrew Top    schedule 07.03.2017
comment
Возможно ли, что в сопоставимой версии файла starboard/shared/x11/application_x11.cc для вашей платформы есть код отладки, который устанавливает дополнительный уровень перед уровнем пользовательского интерфейса приложения? Ваш видеоплеер сейчас работает? Проблема сохраняется при воспроизведении видео? Может ли быть так, что glColorMask() ранее было установлено забавное значение? Что, если вы будете вызывать его где-то для каждого кадра в HardwareRasterizer::Impl::Submit() с параметрами glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE)?   -  person Andrew Top    schedule 07.03.2017
comment
А что касается EGL_BIND_TO_TEXTURE_RGBA, то он действительно нужен только для тестов, поэтому для самого Cobalt вы можете попробовать просто удалить его из списка атрибутов и посмотреть, будет ли это иметь значение.   -  person Andrew Top    schedule 07.03.2017
comment
@Andrew, после добавления строк: GL_CALL(glClearColor(1, 1, 1, 1)); GL_CALL(glClear(GL_COLOR_BUFFER_BIT)); GL_CALL(glFlush()); Graphics_context_-›SwapBuffers(render_target_egl); возвращаться; Для HardwareRasterizer::Impl::Submit() он отображается синим цветом, как вы сказали, см. 3-е изображение выше. И я попытался удалить параметр EGL_BIND_TO_TEXTURE_RGBA, но проблема все еще существует, никаких изменений.   -  person bitchainer    schedule 07.03.2017
comment
@Andrew, я также вызываю glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE) в начале или в HardwareRasterizer::Impl::Submit(), изменений нет. PS. Видео пока нельзя воспроизвести, поэтому разницы не видно.   -  person bitchainer    schedule 07.03.2017
comment
Хм, это немного странно. Чтобы сузить круг источников этого синего цвета, возможно, вы можете попробовать создать небольшой пример программы GL, входящий в состав правого борта. Все, что он делает, это использует EGL для создания контекста GLES2, в котором он использует glScissor() и glClear() для рендеринга движущегося прямоугольника на экране. Он находится в правом борту/примеры/glclear. Вы можете создать его, набрав ninja glclear -C out/my-platform_debug. Если на вашей платформе легко запустить исполняемые файлы, отличные от cobalt, сообщите мне, если появится синий цвет. Может быть полезно настроить параметры glClearColor() так, чтобы они были только белыми.   -  person Andrew Top    schedule 07.03.2017
comment
Если на вашей платформе сложно создавать цели, отличные от Cobalt (например, пример с glclear), вы можете попробовать добавить некоторый тестовый код в GraphicsSystemEGL::GraphicsSystemEGL(). Эта функция будет вызываться для инициализации дисплея EGL в Cobalt. Можете ли вы попробовать добавить в конец этой функции цикл, который очищает экран до белого цвета, а затем меняет местами буфер? Я хотел бы знать, вызвано ли это Cobalt, атрибутами EGL, переданными в glChooseConfig(), или кодом вне Cobalt (например, код платформы Starboard, который настраивает уровень пользовательского интерфейса Cobalt для отображения синим цветом).   -  person Andrew Top    schedule 07.03.2017
comment
Если хотите, напишите мне по электронной почте на адрес [email protected], и мы сможем продолжить общение там, где будет проще поделиться кодом.   -  person Andrew Top    schedule 07.03.2017
comment
@ Эндрю, я могу построить и запустить пример glclear, маленький квадрат будет продолжать двигаться и менять цвет. Но я не знаю, правильно ли он отображается или нет.   -  person bitchainer    schedule 07.03.2017
comment
@Эндрю, похоже, что образец glclear также имеет ту же проблему, цвет фона синий, как вы можете видеть на картинке выше.   -  person bitchainer    schedule 07.03.2017
comment
@ Эндрю, после некоторых тестов я обнаружил, что на образец кобальта или glclear будет влиять цвет фона по умолчанию (чистый синий) телевизионной системы, если я изменю цвет фона телевизионной системы на черный, тогда кобальт не будет отображаться синим , но яркость низкая.   -  person bitchainer    schedule 07.03.2017
comment
@ Андрей, я прикрепил пользовательский интерфейс выше, вы можете видеть, что цвет очень темный, он не яркий.   -  person bitchainer    schedule 07.03.2017
comment
@ Андрей, я нашел основную причину, значение alpa окна egl неверно, большое спасибо за вашу помощь!   -  person bitchainer    schedule 07.03.2017


Ответы (1)


Установите альфа-значение окна egl (EGLNativeWindowType) на 0xff при его создании.

person bitchainer    schedule 07.03.2017
comment
Аааа отлично, рад слышать, что это выяснилось! Похоже, что решение связано с изменением реализации Starboard (например, SbWindowGetPlatformHandle(), я думаю?), но если вам нужно изменить какой-либо общий код Cobalt, я хотел бы знать, чтобы мы могли улучшить ситуацию в целом. - person Andrew Top; 08.03.2017
comment
@Andrew, да, я добавил член для SbWindowPrivate, создал окно egl типа fdev_window с выделенной памятью, установил его ширину/высоту и значение alpa в функции построения и освободил окно egl в функции descontruct в window_internal.cc, затем использовал его в SbWindowGetPlatformHandle. Этот код, связанный с egl, контролируется определением макроса egl, поскольку он предназначен только для egl, а не для directfb. Я установил определение макроса egl в файле cobalt/build/config/base.gypi. - person bitchainer; 08.03.2017