graphics: add support for swiftshader based software rendering
This commit is contained in:
parent
1e9bba269e
commit
161f5674de
5 changed files with 48 additions and 2 deletions
|
|
@ -128,6 +128,23 @@ parts:
|
||||||
- bin/lxc-ls
|
- bin/lxc-ls
|
||||||
- bin/lxc-top
|
- bin/lxc-top
|
||||||
|
|
||||||
|
swiftshader:
|
||||||
|
plugin: cmake
|
||||||
|
source: https://github.com/google/swiftshader.git
|
||||||
|
source-type: git
|
||||||
|
source-commit: cbb80f5f0078a9941f3ec43e83e52c3d15a43bea
|
||||||
|
override-build: |
|
||||||
|
git submodule update --init
|
||||||
|
snapcraftctl build
|
||||||
|
artifacts:
|
||||||
|
- libEGL.so
|
||||||
|
- libGLES_CM.so
|
||||||
|
- libGLESv2.so
|
||||||
|
organize:
|
||||||
|
libEGL.so: lib/anbox/swiftshader/libEGL.so
|
||||||
|
libGLES_CM.so: lib/anbox/swiftshader/libGLES_CM.so
|
||||||
|
libGLESv2.so: lib/anbox/swiftshader/libGLESv2.so
|
||||||
|
|
||||||
anbox-scripts:
|
anbox-scripts:
|
||||||
plugin: dump
|
plugin: dump
|
||||||
source: scripts
|
source: scripts
|
||||||
|
|
|
||||||
|
|
@ -109,6 +109,9 @@ anbox::cmds::SessionManager::SessionManager()
|
||||||
flag(cli::make_flag(cli::Name{"use-system-dbus"},
|
flag(cli::make_flag(cli::Name{"use-system-dbus"},
|
||||||
cli::Description{"Use system instead of session DBus"},
|
cli::Description{"Use system instead of session DBus"},
|
||||||
use_system_dbus_));
|
use_system_dbus_));
|
||||||
|
flag(cli::make_flag(cli::Name{"software-rendering"},
|
||||||
|
cli::Description{"Use software rendering instead of hardware accelerated GL rendering"},
|
||||||
|
use_software_rendering_));
|
||||||
|
|
||||||
action([this](const cli::Command::Context &) {
|
action([this](const cli::Command::Context &) {
|
||||||
auto trap = core::posix::trap_signals_for_process(
|
auto trap = core::posix::trap_signals_for_process(
|
||||||
|
|
@ -169,8 +172,12 @@ anbox::cmds::SessionManager::SessionManager()
|
||||||
using_single_window = true;
|
using_single_window = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto gl_driver = graphics::GLRendererServer::Config::Driver::Host;
|
||||||
|
if (use_software_rendering_)
|
||||||
|
gl_driver = graphics::GLRendererServer::Config::Driver::Software;
|
||||||
|
|
||||||
graphics::GLRendererServer::Config renderer_config {
|
graphics::GLRendererServer::Config renderer_config {
|
||||||
graphics::GLRendererServer::Config::Driver::Host,
|
gl_driver,
|
||||||
single_window_
|
single_window_
|
||||||
};
|
};
|
||||||
auto gl_server = std::make_shared<graphics::GLRendererServer>(renderer_config, window_manager);
|
auto gl_server = std::make_shared<graphics::GLRendererServer>(renderer_config, window_manager);
|
||||||
|
|
|
||||||
|
|
@ -49,6 +49,7 @@ class SessionManager : public cli::CommandWithFlagsAndAction {
|
||||||
bool standalone_ = false;
|
bool standalone_ = false;
|
||||||
bool experimental_ = false;
|
bool experimental_ = false;
|
||||||
bool use_system_dbus_ = false;
|
bool use_system_dbus_ = false;
|
||||||
|
bool use_software_rendering_ = false;
|
||||||
};
|
};
|
||||||
} // namespace cmds
|
} // namespace cmds
|
||||||
} // namespace anbox
|
} // namespace anbox
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,8 @@
|
||||||
#include <cstdarg>
|
#include <cstdarg>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
|
|
||||||
|
namespace fs = boost::filesystem;
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
void logger_write(const emugl::LogLevel &level, const char *format, ...) {
|
void logger_write(const emugl::LogLevel &level, const char *format, ...) {
|
||||||
(void)level;
|
(void)level;
|
||||||
|
|
@ -77,6 +79,18 @@ GLRendererServer::GLRendererServer(const Config &config, const std::shared_ptr<w
|
||||||
composer_ = std::make_shared<LayerComposer>(renderer_, composer_strategy);
|
composer_ = std::make_shared<LayerComposer>(renderer_, composer_strategy);
|
||||||
|
|
||||||
auto gl_libs = emugl::default_gl_libraries();
|
auto gl_libs = emugl::default_gl_libraries();
|
||||||
|
if (config.driver == Config::Driver::Software) {
|
||||||
|
const auto snap_path = utils::get_env_value("SNAP");
|
||||||
|
if (snap_path.empty())
|
||||||
|
throw std::runtime_error("Software rendering is not available outside of a snap build");
|
||||||
|
|
||||||
|
auto swiftshader_path = fs::path(snap_path) / "lib" / "anbox" / "swiftshader";
|
||||||
|
gl_libs = std::vector<emugl::GLLibrary>{
|
||||||
|
{emugl::GLLibrary::Type::EGL, (swiftshader_path / "libEGL.so").string()},
|
||||||
|
{emugl::GLLibrary::Type::GLESv1, (swiftshader_path / "libGLES_CM.so").string()},
|
||||||
|
{emugl::GLLibrary::Type::GLESv2, (swiftshader_path / "libGLESv2.so").string()},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
emugl_logger_struct log_funcs;
|
emugl_logger_struct log_funcs;
|
||||||
log_funcs.coarse = logger_write;
|
log_funcs.coarse = logger_write;
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,14 @@ class LayerComposer;
|
||||||
class GLRendererServer {
|
class GLRendererServer {
|
||||||
public:
|
public:
|
||||||
struct Config {
|
struct Config {
|
||||||
enum class Driver { Host };
|
enum class Driver {
|
||||||
|
// Use the GL driver provided by the host operating system
|
||||||
|
Host,
|
||||||
|
|
||||||
|
// Use a builtin software based GL driver implementation without any support
|
||||||
|
// for hardware acceleration.
|
||||||
|
Software,
|
||||||
|
};
|
||||||
Driver driver;
|
Driver driver;
|
||||||
bool single_window;
|
bool single_window;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue