{"id":13726785,"url":"https://github.com/servo/surfman","last_synced_at":"2025-12-12T11:58:23.448Z","repository":{"id":29850159,"uuid":"33395009","full_name":"servo/surfman","owner":"servo","description":"Accelerated offscreen graphics for WebGL","archived":false,"fork":false,"pushed_at":"2025-11-12T23:21:25.000Z","size":2036,"stargazers_count":180,"open_issues_count":28,"forks_count":91,"subscribers_count":22,"default_branch":"main","last_synced_at":"2025-11-13T00:20:27.549Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/servo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE-APACHE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2015-04-04T05:09:44.000Z","updated_at":"2025-11-12T23:10:56.000Z","dependencies_parsed_at":"2023-12-05T15:31:35.134Z","dependency_job_id":"c62ccc03-681e-4053-9d01-e7216f04f202","html_url":"https://github.com/servo/surfman","commit_stats":{"total_commits":714,"total_committers":60,"mean_commits":11.9,"dds":0.530812324929972,"last_synced_commit":"d7ad0ac39ecd6a3c6ccc2fe98264d8c6bda1c933"},"previous_names":["servo/rust-offscreen-rendering-context"],"tags_count":31,"template":false,"template_full_name":null,"purl":"pkg:github/servo/surfman","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/servo%2Fsurfman","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/servo%2Fsurfman/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/servo%2Fsurfman/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/servo%2Fsurfman/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/servo","download_url":"https://codeload.github.com/servo/surfman/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/servo%2Fsurfman/sbom","scorecard":{"id":813110,"data":{"date":"2025-08-11","repo":{"name":"github.com/servo/surfman","commit":"4236949c96b4453adbe36a21a316449e413a6a21"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":5,"checks":[{"name":"Code-Review","score":10,"reason":"all changesets reviewed","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":3,"reason":"4 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 3","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/main.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Binary-Artifacts","score":9,"reason":"binaries present in source code","details":["Warn: binary detected: android-example/gradle/wrapper/gradle-wrapper.jar:1"],"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:52: update your workflow using https://app.stepsecurity.io/secureworkflow/servo/surfman/main.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/main.yml:60: update your workflow using https://app.stepsecurity.io/secureworkflow/servo/surfman/main.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/main.yml:65: update your workflow using https://app.stepsecurity.io/secureworkflow/servo/surfman/main.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:94: update your workflow using https://app.stepsecurity.io/secureworkflow/servo/surfman/main.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/main.yml:97: update your workflow using https://app.stepsecurity.io/secureworkflow/servo/surfman/main.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/main.yml:101: update your workflow using https://app.stepsecurity.io/secureworkflow/servo/surfman/main.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/main.yml:112: update your workflow using https://app.stepsecurity.io/secureworkflow/servo/surfman/main.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:129: update your workflow using https://app.stepsecurity.io/secureworkflow/servo/surfman/main.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/main.yml:130: update your workflow using https://app.stepsecurity.io/secureworkflow/servo/surfman/main.yml/main?enable=pin","Info:   0 out of   3 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   6 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE-APACHE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE-APACHE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-23T13:36:58.109Z","repository_id":29850159,"created_at":"2025-08-23T13:36:58.109Z","updated_at":"2025-08-23T13:36:58.109Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":27682394,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-12-12T02:00:06.775Z","response_time":129,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-03T01:03:21.976Z","updated_at":"2025-12-12T11:58:23.442Z","avatar_url":"https://github.com/servo.png","language":"Rust","funding_links":[],"categories":["Rust"],"sub_categories":[],"readme":"# surfman [![Build Status](https://github.com/servo/surfman/actions/workflows/main.yml/badge.svg)](https://github.com/servo/surfman/actions)\n\n![surfman logo](https://i.imgur.com/t0xcJ6D.png)\n\n`surfman` is a low-level, cross-platform Rust library for managing *surfaces*, blocks of image data\nin GPU memory. Using this library, you can:\n\n* Draw to a window (perhaps created with `winit`) on the CPU.\n\n* Render to a window (created via `winit` or otherwise) with OpenGL.\n\n* Render to an off-screen surface with OpenGL.\n\n* Use a surface created on one thread as an OpenGL texture on another thread.\n\n* Draw to a surface with a platform-specific GPU API like Metal.\n\n`surfman` forms the low-level graphics infrastructure of the [Servo](https://github.com/servo/servo)\nproject, where it allows for easy porting of the browser's WebGL and WebXR code to a variety of\nplatforms.\n\n## What `surfman` is not\n\n`surfman` is not a full-featured GPU rendering API. It doesn't attempt to abstract over rendering\nlibraries like OpenGL, Metal, and Direct3D. For that, try [gfx-rs](https://github.com/gfx-rs/gfx).\n\n`surfman` is also not a windowing solution. It can only render to a window that is already open and\nneeds to be paired with a crate like [winit](https://github.com/rust-windowing/winit) to actually\nopen the window. \n\nLikewise, `surfman` is not a UI toolkit. For that, see GTK+ and many other libraries. It's possible\nto use `surfman` alongside any of these UI toolkits to efficiently integrate GPU rendering into an\napplication, however.\n\n## Why `surfman`?\n\nMost of this functionality can be achieved with other libraries, such as `glutin` and SDL. However,\nfor several use cases you can achieve better performance and/or correctness with `surfman`. For\nexample:\n\n* On multi-GPU systems, games typically want to use the discrete GPU instead of the integrated GPU\n  for better performance, while UI applications want the reverse for better energy consumption.\n  However, most game-oriented OpenGL windowing libraries end up using the discrete GPU on Linux and\n  macOS and the integrated GPU on Windows. On such systems, `surfman` explicitly allows you to\n  choose which GPU you would like to render with.\n\n* OpenGL's *share context* or *share lists* feature allows you to share textures across contexts.\n  However, this often exposes driver bugs, and, even if it works, it causes most operations to take\n  mutex locks. Efficient texture sharing requires the use of platform-specific APIs, which `surfman`\n  abstracts over.\n\n* The ANGLE implementation of OpenGL on Windows is not generally thread-safe, so attempts to render\n  on background threads will generally segfault. `surfman` carefully works around all the safety\n  issues so that the library is safe to use from any thread.\n\n* Applications such as emulators and video players that draw to the CPU want to avoid copying pixels\n  as much as possible. Classic APIs for transferring image data like `glTexImage2D()` and\n  `XPutImage()` often cause the data to be copied several times. In contrast, `surfman` allows you\n  to render to the screen with as few copies as feasible—sometimes even zero, depending on the\n  platform.\n\n## Platform support\n\nThe library supports the following platforms:\n\n* Windows, with OpenGL via the native WGL framework.\n\n* Windows, with OpenGL via Google's ANGLE library.\n\n* macOS, with OpenGL via the native CGL framework.\n\n* macOS, with Metal.\n\n* Linux/other Unix, with OpenGL on Wayland.\n\n* Linux/other Unix, with OpenGL on X11 via GLX.\n\n* Android P and up, with OpenGL.\n\n* Generic CPU rendering of OpenGL via the OSMesa framework.\n\n## Future work\n\nThe following features may be added later:\n\n* Support for Android Marshmallow, Nougat, and Oreo.\n\n* Partial presentation, to allow the OS to composite only the region of the window that has changed.\n\n* CPU rendering support on more platforms. (Right now, the CPU rendering features only work on\n  macOS.)\n\n* Vulkan support.\n\n* Direct3D 11 support on Windows.\n\n* YUV surfaces, for software video codecs.\n\n* Support for running in a browser with WebAssembly.\n\n## License\n\n`surfman` is licensed under the same terms as Rust itself.\n\n`surfman` abides by the same code of conduct as Rust itself.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fservo%2Fsurfman","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fservo%2Fsurfman","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fservo%2Fsurfman/lists"}