← Back to team overview

touch-packages team mailing list archive

[Bug 1458694] Re: [vivid-overlay] unity8 fails to start on the emulator

 

So this was 2 bugs conflated it seems.
There was a warning/err for the input-stub in mir, that is actually covered and has a fix committed under this bug 1458689 (branch now attached here as well)

The second issue it seems is that the uitk via qt is asking for a shader
extension to be used that is likely not supported by the emulator
graphics platform. This will most likely need to have an error check
added in order to accomodate the failure and use an alternate shader
program (e.g. one without needing the extension)

** Changed in: mir
   Importance: Undecided => Critical

** Changed in: mir
       Status: New => Confirmed

** Changed in: mir
     Assignee: (unassigned) => Andreas Pokorny (andreas-pokorny)

** Branch linked: lp:~andreas-pokorny/mir/fix-1458689

-- 
You received this bug notification because you are a member of Ubuntu
Touch seeded packages, which is subscribed to mir in Ubuntu.
https://bugs.launchpad.net/bugs/1458694

Title:
  [vivid-overlay] unity8 fails to start on the emulator

Status in Canonical System Image:
  Confirmed
Status in Mir:
  Confirmed
Status in mir package in Ubuntu:
  Confirmed
Status in ubuntu-ui-toolkit package in Ubuntu:
  Triaged

Bug description:
  phablet@ubuntu-phablet:~$ system-image-cli -i
  current build number: 140
  device name: generic_x86
  channel: ubuntu-touch/rc-proposed/ubuntu
  last update: 2015-05-25 12:02:10
  version version: 140
  version ubuntu: 20150525
  version device: 20150210
  version custom: 20150525

  When starting unity8 (this started at image 136, probably when mir
  0.13 landed):

  phablet@ubuntu-phablet:~$ cat ./.cache/upstart/unity8.log
  ()
  [1432595001.896139] mirplatform: Found graphics driver: dummy
  [1432595001.898447] mirplatform: Found graphics driver: android
  qtmir.mir: MirServer created
  [1432595003.675225] Server: Starting
  [1432595003.679331] Loader: Loading modules from: /usr/lib/i386-linux-gnu/mir/server-platform
  [1432595003.679501] Loader: Loading module: /usr/lib/i386-linux-gnu/mir/server-platform/graphics-dummy.so
  [1432595003.680673] Loader: Loading module: /usr/lib/i386-linux-gnu/mir/server-platform/input-stub.so
  [1432595003.681107] <WARNING> Loader: Failed to load module: /usr/lib/i386-linux-gnu/mir/server-platform/input-stub.so (error was:/usr/lib/i386-linux-gnu/mir/server-platform/input-stub.so: undefined symbol: _ZN3mir6events10make_eventExx17MirKeyboardActionjij)
  [1432595003.684868] Loader: Loading module: /usr/lib/i386-linux-gnu/mir/server-platform/graphics-android.so.2
  [1432595003.685014] mirplatform: Found graphics driver: dummy
  [1432595003.685211] mirplatform: Found graphics driver: android
  [1432595003.685416] Platform Loader: Selected driver: android (version 0.13.0)
  qtmir.mir: PromptSessionListener::PromptSessionListener - this= PromptSessionListener(0x9679764)
  qtmir.mir: SessionListener::SessionListener - this= SessionListener(0x9676d24)
  qtmir.mir: MirShell::MirShell
  [1432595003.883766] DisplayServer: Mir version 0.13.0
  QtCompositor::setAllWindowsExposed true
  qtmir.clipboard: D-Bus registration successful.
  Mode argument was not provided or was set to an illegal value. Using default value of --mode= "full-greeter"
  Cannot create window: no screens available

  With version 135 it starts fine, but not fully functional, giving this
  error:

  QOpenGLShader::compile(Fragment): 0:2(12): warning: extension `GL_OES_standard_derivatives' unsupported in fragment shader
  0:2(1): error: #extension directive is not allowed in the middle of a shader

  *** Problematic Fragment shader source code ***
  #extension GL_OES_standard_derivatives : enable  // Enable dFdy() on OpenGL ES 2.
  #define lowp
  #define mediump
  #define highp

  // Copyright © 2015 Canonical Ltd.
  //
  // This program is free software; you can redistribute it and/or modify
  // it under the terms of the GNU Lesser General Public License as published by
  // the Free Software Foundation; version 3.
  //
  // This program is distributed in the hope that it will be useful,
  // but WITHOUT ANY WARRANTY; without even the implied warranty of
  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  // GNU Lesser General Public License for more details.
  //
  // You should have received a copy of the GNU Lesser General Public License
  // along with this program.  If not, see <http://www.gnu.org/licenses/>.
  //
  // Author: Loïc Molinari <loic.molinari@xxxxxxxxxxxxx>

  // Static flow control (branching on a uniform value) is fast on most GPUs (including ultra-low
  // power ones) because it allows to use the same shader execution path for an entire draw call. We
  // rely on that technique here (also known as "uber-shader" solution) to avoid the complexity of
  // dealing with a multiple shaders solution.
  // FIXME(loicm) Validate GPU behavior with regards to static flow control.

  uniform sampler2D shapeTexture;
  uniform sampler2D sourceTexture;
  uniform lowp vec2 dfdtFactors;
  uniform lowp vec2 opacityFactors;
  uniform lowp float sourceOpacity;
  uniform lowp float distanceAA;
  uniform bool textured;
  uniform mediump int aspect;

  varying mediump vec2 shapeCoord;
  varying mediump vec4 sourceCoord;
  varying lowp vec4 backgroundColor;

  const mediump int FLAT  = 0x08;  // 1 << 3
  const mediump int INSET = 0x10;  // 1 << 4

  void main(void)
  {
      lowp vec4 shapeData = texture2D(shapeTexture, shapeCoord);
      lowp vec4 color = backgroundColor;

      // FIXME(loicm) Would be better to use a bitfield but bitwise ops have only been integrated in
      //     GLSL 1.3 (OpenGL 3) and GLSL ES 3 (OpenGL ES 3).
      if (textured) {
          // Blend the source over the current color.
          // FIXME(loicm) sign() is far from optimal. Call texture2D() at beginning of scope.
          lowp vec2 axisMask = -sign((sourceCoord.zw * sourceCoord.zw) - vec2(1.0));
          lowp float mask = clamp(axisMask.x + axisMask.y, 0.0, 1.0);
          lowp vec4 source = texture2D(sourceTexture, sourceCoord.st) * vec4(sourceOpacity * mask);
          color = vec4(1.0 - source.a) * color + source;
      }

      // Get screen-space derivative of texture coordinate t representing the normalized distance
      // between 2 pixels. dFd*() unfortunately have to be called outside of branches in order to work
      // correctly with VMware's "Gallium 0.4 on SVGA3D".
      lowp vec2 derivatives = vec2(dFdx(shapeCoord.t), dFdy(shapeCoord.t));
      lowp float dfdt = dfdtFactors.x != 0.0 ? derivatives.x : derivatives.y;

      if (aspect == FLAT) {
          // Mask the current color with an anti-aliased and resolution independent shape mask built
          // from distance fields.
          lowp float distanceMin = abs(dfdt) * -distanceAA + 0.5;
          lowp float distanceMax = abs(dfdt) * distanceAA + 0.5;
          color *= smoothstep(distanceMin, distanceMax, shapeData.b);

      } else if (aspect == INSET) {
          // The vertex layout of the shape is made so that the derivative is negative from top to
          // middle and positive from middle to bottom.
          lowp float shapeSide = dfdt * dfdtFactors.y <= 0.0 ? 0.0 : 1.0;
          // Blend the shape inner shadow over the current color. The shadow color is black, its
          // translucency is stored in the texture.
          lowp float shadow = shapeData[int(shapeSide)];
          color = vec4(1.0 - shadow) * color + vec4(0.0, 0.0, 0.0, shadow);
          // Get the anti-aliased and resolution independent shape mask using distance fields.
          lowp float distanceMin = abs(dfdt) * -distanceAA + 0.5;
          lowp float distanceMax = abs(dfdt) * distanceAA + 0.5;
          lowp vec2 mask = smoothstep(distanceMin, distanceMax, shapeData.ba);
          // Get the bevel color. The bevel is made of the top mask masked with the bottom mask. A
          // gradient from the bottom (1) to the middle (0) of the shape is used to factor out values
          // resulting from the mask anti-aliasing. The bevel color is white with 60% opacity.
          lowp float bevel = (mask.x * -mask.y) + mask.x;  // -ab + a = a(1 - b)
          lowp float gradient = clamp((shapeSide * -shapeCoord.t) + shapeSide, 0.0, 1.0);
          bevel *= gradient * 0.6;
          // Mask the current color then blend the bevel over the resulting color. We simply use
          // additive blending since the bevel has already been masked.
          color = (color * vec4(mask[int(shapeSide)])) + vec4(bevel);
      }

      gl_FragColor = color * opacityFactors.xxxy;
  }

  ***
  shader compilation failed: 
  ""

  Adb is broken because of bug 1458043, so use the following workaround
  to get it to work again:

  $ sudo ubuntu-emulator create --channel=ubuntu-touch/rc-proposed/ubuntu test_x86 --use-raw-disk
  $ mkdir -p /tmp/mount1 /tmp/mount2
  $ sudo mount ~/.local/share/ubuntu-emulator/test_x86/sdcard.img /tmp/mount1
  $ sudo mount /tmp/mount1/system.img /tmp/mount2
  $ sudo vi /tmp/mount2/var/lib/lxc/android/pre-start.d/20-no-default-prop-adb
  #! /bin/sh

  # Avoid changing the the property when running on the emulator
  if ! grep -q "qemu=1" /proc/cmdline; then
      sed -i '/^persist.sys.usb.config=.*/d' $LXC_ROOTFS_PATH/default.prop || true
  fi
  $ sudo umount /tmp/mount2
  $ sudo umount /tmp/mount1

To manage notifications about this bug go to:
https://bugs.launchpad.net/canonical-devices-system-image/+bug/1458694/+subscriptions


References