• Stars
    star
    171
  • Rank 222,266 (Top 5 %)
  • Language
    Rust
  • License
    Apache License 2.0
  • Created over 9 years ago
  • Updated 3 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Accelerated offscreen graphics for WebGL

surfman Build Status

surfman logo

surfman is a low-level, cross-platform Rust library for managing surfaces, blocks of image data in GPU memory. Using this library, you can:

  • Draw to a window (perhaps created with winit) on the CPU.

  • Render to a window (created via winit or otherwise) with OpenGL.

  • Render to an off-screen surface with OpenGL.

  • Use a surface created on one thread as an OpenGL texture on another thread.

  • Draw to a surface with a platform-specific GPU API like Metal.

surfman forms the low-level graphics infrastructure of the Servo project, where it allows for easy porting of the browser's WebGL and WebXR code to a variety of platforms.

What surfman is not

surfman is not a full-featured GPU rendering API. It doesn't attempt to abstract over rendering libraries like OpenGL, Metal, and Direct3D. For that, try gfx-rs.

surfman is also not a windowing solution. It can only render to a window that is already open and needs to be paired with a crate like winit to actually open the window.

Likewise, surfman is not a UI toolkit. For that, see GTK+ and many other libraries. It's possible to use surfman alongside any of these UI toolkits to efficiently integrate GPU rendering into an application, however.

Why surfman?

Most of this functionality can be achieved with other libraries, such as glutin and SDL. However, for several use cases you can achieve better performance and/or correctness with surfman. For example:

  • On multi-GPU systems, games typically want to use the discrete GPU instead of the integrated GPU for better performance, while UI applications want the reverse for better energy consumption. However, most game-oriented OpenGL windowing libraries end up using the discrete GPU on Linux and macOS and the integrated GPU on Windows. On such systems, surfman explicitly allows you to choose which GPU you would like to render with.

  • OpenGL's share context or share lists feature allows you to share textures across contexts. However, this often exposes driver bugs, and, even if it works, it causes most operations to take mutex locks. Efficient texture sharing requires the use of platform-specific APIs, which surfman abstracts over.

  • The ANGLE implementation of OpenGL on Windows is not generally thread-safe, so attempts to render on background threads will generally segfault. surfman carefully works around all the safety issues so that the library is safe to use from any thread.

  • Applications such as emulators and video players that draw to the CPU want to avoid copying pixels as much as possible. Classic APIs for transferring image data like glTexImage2D() and XPutImage() often cause the data to be copied several times. In contrast, surfman allows you to render to the screen with as few copies as feasible—sometimes even zero, depending on the platform.

Platform support

The library supports the following platforms:

  • Windows, with OpenGL via the native WGL framework.

  • Windows, with OpenGL via Google's ANGLE library.

  • macOS, with OpenGL via the native CGL framework.

  • macOS, with Metal.

  • Linux/other Unix, with OpenGL on Wayland.

  • Linux/other Unix, with OpenGL on X11 via GLX.

  • Android P and up, with OpenGL.

  • Generic CPU rendering of OpenGL via the OSMesa framework.

Future work

The following features may be added later:

  • Support for Android Marshmallow, Nougat, and Oreo.

  • Partial presentation, to allow the OS to composite only the region of the window that has changed.

  • CPU rendering support on more platforms. (Right now, the CPU rendering features only work on macOS.)

  • Vulkan support.

  • Direct3D 11 support on Windows.

  • YUV surfaces, for software video codecs.

  • Support for running in a browser with WebAssembly.

License

surfman is licensed under the same terms as Rust itself.

surfman abides by the same code of conduct as Rust itself.

More Repositories

1

servo

The Servo Browser Engine
23,804
star
2

pathfinder

A fast, practical GPU rasterizer for fonts and vector graphics
Rust
3,587
star
3

webrender

A GPU-based renderer for the web
Rust
3,097
star
4

html5ever

High-performance browser-grade HTML5 parser
Rust
2,089
star
5

rust-smallvec

"Small vector" optimization for Rust: store up to a small number of items on the stack
Rust
1,320
star
6

rust-url

URL parser for Rust
Rust
1,290
star
7

core-foundation-rs

Rust bindings to Core Foundation and other low level libraries on Mac OS X and iOS
Rust
992
star
8

ipc-channel

A multiprocess drop-in replacement for Rust channels
Rust
838
star
9

rust-cssparser

Rust implementation of CSS Syntax Level 3
Rust
732
star
10

font-kit

A cross-platform font loading library written in Rust
Rust
676
star
11

euclid

Geometry primitives (basic linear algebra) for Rust
Rust
409
star
12

gaol

Cross-platform application sandboxing for Rust
Rust
342
star
13

rust-fnv

Fowler–Noll–Vo hash function
Rust
332
star
14

rust-mozjs

DEPRECATED - moved to servo/mozjs instead.
Rust
293
star
15

cocoa-rs

DEPRECATED - Cocoa/Objective-C bindings for the Rust programming language
Rust
284
star
16

highfive

Github hooks to provide an encouraging atmosphere for new contributors
Python
255
star
17

tendril

Compact string type for zero-copy parsing
Rust
248
star
18

project

A repo for the Servo Project
236
star
19

string-cache

String interning for Rust
Rust
193
star
20

uluru

A simple, fast, LRU cache implementation.
Rust
191
star
21

mozjs

Servo's SpiderMonkey fork
Rust
156
star
22

rust-webvr

UNMAINTAINED - WebVR API implementation for servo.
Rust
106
star
23

skia

Skia
C++
105
star
24

heapsize

In support of measuring heap allocations in Rust programs.
Rust
99
star
25

gleam

Generated OpenGL bindings and wrapper for Servo.
Rust
83
star
26

media

Rust
82
star
27

webxr

Bindings for WebXR
Rust
81
star
28

unicode-bidi

Implementation of the Unicode Bidirection Algorithm in Rust
Rust
75
star
29

rust-harfbuzz

Rust bindings to HarfBuzz
Rust
70
star
30

rust-stb-image

Rust bindings to the awesome stb_image library
C
65
star
31

stylo

Rust
59
star
32

rust-layers

A GPU-accelerated 2D animation library for Rust
Rust
58
star
33

servo-starters

Servo Starters is a list of easy tasks that are good for beginners to rust or servo.
JavaScript
58
star
34

saltfs

Salt Stack Filesystem
SaltStack
56
star
35

rust-azure

Rust bindings to mozilla-central's graphics abstraction layer
C++
56
star
36

rust-opengles

[UNMAINTAINED] OpenGL ES 2.0 bindings for Rust (see servo/gleam)
Rust
42
star
37

mozangle

Mozilla’s fork of Google ANGLE, repackaged as a Rust crate
C++
40
star
38

rust-selectors

CSS Selectors matching for Rust
38
star
39

smallbitvec

A growable bit-vector for Rust, optimized for size
Rust
37
star
40

pixman

C
30
star
41

rust-png

Rust bindings for libpng - UNMAINTAINED - DO NOT USE
C
27
star
42

rust-freetype

Rust bindings for FreeType.
Rust
25
star
43

rust-http-client

[UNMAINTAINED] old HTTP client library for Rust
C
24
star
44

rust-xlib

Rust bindings for xlib. UNMAINTAINED
Rust
22
star
45

core-graphics-rs

DEPRECATED - CoreGraphics bindings for Rust
Rust
21
star
46

rust-glut

[UNMAINTAINED] GLUT bindings for Rust
Rust
20
star
47

devices

Servo-specific APIs to access various devices
Rust
19
star
48

core-text-rs

DEPRECATED - Rust bindings for CoreText.
Rust
18
star
49

rustc-test

A fork of Rust’s `test` crate that doesn’t require unstable language features.
Rust
17
star
50

rust-quicksort

A Rust quicksort implementation for in-place sorting.
Rust
17
star
51

hyper_serde

Serde support for Hyper types
Rust
16
star
52

doc.servo.org

Documentation generated from Servo’s source code in its master branch
HTML
15
star
53

rust-fontconfig

Rust bindings for fontconfig.
Rust
15
star
54

book

The Servo Book
JavaScript
14
star
55

libfreetype2

C
13
star
56

servo.org_2014-2020

Main website for Servo.
JavaScript
13
star
57

osmesa-src

OSMesa source code and cargo build scripts to compile on Linux and Mac
C
12
star
58

homebrew-servo

Servo formulae repo for Homebrew
Ruby
11
star
59

nss

Network Security Services - UNMAINTAINED - DO NOT USE
C
11
star
60

plane-split

Plane splitting with euclid
Rust
11
star
61

rust-icu

Rust bindings to ICU (International Components for Unicode)
C++
11
star
62

libcss

[UNMAINTAINED] Servo fork of libcss from the NetSurf project
C
11
star
63

servo-warc-tests

Test Servo on Web Archive snapshots of real web sites
Shell
11
star
64

libfontconfig

Cargoified libfontconfig for Rust packages
C
10
star
65

libhubbub

[UNMAINTAINED] HTML parser library from the NetSurf project
C
10
star
66

cairo

C
10
star
67

libexpat

Not actively updating to new versions of expat. Pull requests to do so accepted.
C
10
star
68

blog.servo.org

The Servo blog
CSS
9
star
69

libgstreamer_android_gen

Scripts to generate Servo Media GStreamer dependencies on Android
Shell
9
star
70

io-surface-rs

Rust bindings to IOSurface.framework on Mac OS X and iOS
Rust
9
star
71

servo.org

Servo project website
HTML
8
star
72

futf

Handling fragments of UTF-8 in Rust
Rust
8
star
73

fontsan

Sanitiser for untrusted font files
C
8
star
74

sparkle

GL bindings for Servo's WebGL implementation (alternative to the `gleam` crate)
Rust
7
star
75

rust-glx

GLX 1.4 bindings for Linux
Rust
7
star
76

rust-hubbub

[UNMAINTAINED] Rust bindings to the hubbub HTML parser library from the NetSurf project
Rust
6
star
77

unicode-script

Rust
6
star
78

gecko-media

Firefox's media playback stack in a stand alone Rust crate
C
6
star
79

internal-wpt-dashboard

A simple wpt.fyi like dashboard to track progress of WPT scores for Servo's focus areas.
JavaScript
5
star
80

libparserutils

[UNMAINTAINED] libparserutils from the NetSurf project
C
5
star
81

rust-css

[UNMAINTAINED] obsolete CSS glue code for Servo
Rust
5
star
82

cgl-rs

Rust bindings for CGL on Mac
Rust
5
star
83

nspr

Netscape Portable Runtime
C
5
star
84

rust-egl

wrapper of EGL (maintenance changes only)
Rust
5
star
85

surfman-chains

An implementation of double-buffered swap chains for surfman
Rust
5
star
86

webrender_traits

DEPRECATED - now contained in https://github.com/servo/webrender/
Rust
4
star
87

download.servo.org

download.servo.org landing page
HTML
4
star
88

app_units

Rust
3
star
89

libpng

C
3
star
90

layout-zoo

A collection of spectacular and exotic CSS layout edge cases
3
star
91

servoexperiments.com

Experiments with Servo.
JavaScript
3
star
92

intermittent-tracker

A live database of intermittent test failures based on github's webhook notifications.
Python
3
star
93

servo-nightly-builds

Repository to host Servo nightly builds using Github Releases.
Shell
2
star
94

content-blocker

A library for parsing Safari-style content blocking lists and dynamically evaluating the rules against against requests.
Rust
2
star
95

servo-viewer

Simple GLUT-based viewer app for Servo
Rust
2
star
96

rust-netsurfcss

[UNMAINTAINED] Rust bindings to libcss
Rust
2
star
97

rust-cairo

Rust bindings for Cairo.
Rust
2
star
98

servo-with-rust-nightly

Detecting breakage early
2
star
99

sharegl

[UNMAINTAINED] A Rust library for cross-process OpenGL texture sharing
Rust
2
star
100

nelson

Newbors for Servo
Python
1
star