# Gavle


Gavle is an OpenGL wrapper crate modeled after wgpu.

This crate aims to bring many of the benefits of stateless graphics APIs such
as WebGPU directly to OpenGL, so that projects that, for whatever reason, do 
not have the choice of a more modern API may still enjoy many of the workflow 
benefits that come with using them.

## Goals


The primary goal of this crate is to facilitate development workflow by removing
all direct interaction between user code and the global state in OpenGL, as well
as by tracking ownership and mutability of objects in device memory. This allows
gavle to also catch many would-be bugs by raising hard errors in instances where
they would happen.

This crate also takes the road of being more oppinionated about which features 
it provides and how it provides them, electing to support only a small but - 
hopefully - robust set of them. The reason is two-fold: Firstly, because 
supporting the whole kitchen sink in a consistent and safe way is impractical
for any project of this size, as demonstrated by Glium, and, secondly, because
it would jeopardize the next goal: that of interoperability.

This crate is designed so as to allow users to transparently run the same 
graphics code in every major platform Rust supports that also supports some form 
of OpenGL. It can run on top of WebGL, OpenGL ES, as well as standard OpenGL
and necessitates no more than a recompile and some glue code providing it with a 
valid context.

## Non-goals


Unfortunately, though expectedly, this crate has to leave out many of the 
features that make modern OpenGL viable for high-level projects - chief among
which being SSBOs and compute shaders - as they are simply not available in 
WebGL. If you need these features, I would heavily discourage the use of this 
crate.

## Features

This create supports the following features:
- [X] Ownership and mutability tracking for all GPU objects.
- [X] Garbage collected GPU objects.
- [X] Memory-mapped GPU buffer editing.
- [X] Full support for WebGL and OpenGL ES.

## Acknowledgements

Many of the structures in this crate were lifted off WebGPU and I feel it's
important to state that without the efforts that were put into that project this
crate would certainly have much different ergonomics than the ones it does 
currently. 

## On Versioning

This crate was first written as part of a larger project which is still ongoing
and has not yet been published, and, thus, the stage of developemnt this crate
is in should probably not be gauged from its version number alone.