Use software rendering when running servo in headless mode

This commit is contained in:
KimSnj 2016-11-27 18:15:51 +01:00
parent c4f87f451f
commit b5b76e8053
3 changed files with 45 additions and 26 deletions

View file

@ -209,6 +209,26 @@ def is_macosx():
return sys.platform == 'darwin'
def is_linux():
return sys.platform.startswith('linux')
def set_osmesa_env(bin_path, env):
"""Set proper LD_LIBRARY_PATH and DRIVE for software rendering on Linux and OSX"""
if is_linux():
osmesa_path = path.join(find_dep_path_newest('osmesa-src', bin_path), "out", "lib", "gallium")
env["LD_LIBRARY_PATH"] = osmesa_path
env["GALLIUM_DRIVER"] = "softpipe"
elif is_macosx():
osmesa_path = path.join(find_dep_path_newest('osmesa-src', bin_path),
"out", "src", "gallium", "targets", "osmesa", ".libs")
glapi_path = path.join(find_dep_path_newest('osmesa-src', bin_path),
"out", "src", "mapi", "shared-glapi", ".libs")
env["DYLD_LIBRARY_PATH"] = osmesa_path + ":" + glapi_path
env["GALLIUM_DRIVER"] = "softpipe"
return env
class BuildNotFound(Exception):
def __init__(self, message):
self.message = message

View file

@ -22,7 +22,11 @@ from mach.decorators import (
Command,
)
from servo.command_base import CommandBase, call, check_call, find_dep_path_newest, is_windows, is_macosx
from servo.command_base import (
CommandBase,
call, check_call, find_dep_path_newest,
is_windows, is_macosx, set_osmesa_env,
)
def read_file(filename, if_exists=False):
@ -52,10 +56,13 @@ class PostBuildCommands(CommandBase):
help='Name of debugger to use.')
@CommandArgument('--browserhtml', '-b', action='store_true',
help='Launch with Browser.html')
@CommandArgument('--headless', '-z', action='store_true',
help='Launch in headless mode')
@CommandArgument(
'params', nargs='...',
help="Command-line arguments to be passed through to Servo")
def run(self, params, release=False, dev=False, android=None, debug=False, debugger=None, browserhtml=False):
def run(self, params, release=False, dev=False, android=None, debug=False, debugger=None, browserhtml=False,
headless=False):
env = self.build_env()
env["RUST_BACKTRACE"] = "1"
@ -107,6 +114,10 @@ class PostBuildCommands(CommandBase):
'--pref', 'shell.builtin-key-shortcuts.enabled=false',
path.join(browserhtml_path, 'out', 'index.html')]
if headless:
set_osmesa_env(args[0], env)
args.append('-z')
# Borrowed and modified from:
# http://hg.mozilla.org/mozilla-central/file/c9cfa9b91dea/python/mozbuild/mozbuild/mach_commands.py#l883
if debug:

View file

@ -25,7 +25,11 @@ from mach.decorators import (
Command,
)
from servo.command_base import BuildNotFound, CommandBase, call, cd, check_call, find_dep_path_newest, host_triple
from servo.command_base import (
BuildNotFound, CommandBase,
call, cd, check_call, host_triple, set_osmesa_env,
)
from wptrunner import wptcommandline
from update import updatecommandline
from servo_tidy import tidy
@ -637,29 +641,13 @@ class MachCommands(CommandBase):
def set_software_rendering_env(self, use_release):
# On Linux and mac, find the OSMesa software rendering library and
# add it to the dynamic linker search path.
if sys.platform.startswith('linux'):
try:
args = [self.get_binary_path(use_release, not use_release)]
osmesa_path = path.join(find_dep_path_newest('osmesa-src', args[0]), "out", "lib", "gallium")
os.environ["LD_LIBRARY_PATH"] = osmesa_path
os.environ["GALLIUM_DRIVER"] = "softpipe"
except BuildNotFound:
# This can occur when cross compiling (e.g. arm64), in which case
# we won't run the tests anyway so can safely ignore this step.
pass
elif sys.platform.startswith('darwin'):
try:
args = [self.get_binary_path(use_release, not use_release)]
osmesa_path = path.join(find_dep_path_newest('osmesa-src', args[0]),
"out", "src", "gallium", "targets", "osmesa", ".libs")
glapi_path = path.join(find_dep_path_newest('osmesa-src', args[0]),
"out", "src", "mapi", "shared-glapi", ".libs")
os.environ["DYLD_LIBRARY_PATH"] = osmesa_path + ":" + glapi_path
os.environ["GALLIUM_DRIVER"] = "softpipe"
except BuildNotFound:
# This can occur when cross compiling (e.g. arm64), in which case
# we won't run the tests anyway so can safely ignore this step.
pass
try:
args = [self.get_binary_path(use_release, not use_release)]
set_osmesa_env(args[0], os.environ)
except BuildNotFound:
# This can occur when cross compiling (e.g. arm64), in which case
# we won't run the tests anyway so can safely ignore this step.
pass
def create_parser_create():