diff options
author | Joe Wilm <joe@jwilm.com> | 2016-06-04 15:30:17 -0700 |
---|---|---|
committer | Joe Wilm <joe@jwilm.com> | 2016-06-04 15:30:17 -0700 |
commit | 2f058bd053f52307bdbf3709209418ac26871678 (patch) | |
tree | 0609a8a3c1976d0e0bdaeede352a55d9c14cb13f /res | |
parent | f944b517fa8bea6eae62eb25fbabe1308d16ed55 (diff) | |
download | alacritty-2f058bd053f52307bdbf3709209418ac26871678.tar.gz alacritty-2f058bd053f52307bdbf3709209418ac26871678.zip |
Optimize rendering
This moves some logic that was previously being done per-character into
the vertex shader. At this time, we've traded CPU computation for
additional gl::Uniform2f calls. This is only a marginal improvement.
However, this patch positions the renderer well for instanced drawing,
and that will be a huge performance win.
Diffstat (limited to 'res')
-rw-r--r-- | res/text.v.glsl | 35 |
1 files changed, 32 insertions, 3 deletions
diff --git a/res/text.v.glsl b/res/text.v.glsl index 07a50376..c6543352 100644 --- a/res/text.v.glsl +++ b/res/text.v.glsl @@ -1,12 +1,41 @@ #version 330 core layout (location = 0) in vec2 position; -layout (location = 1) in vec2 uvMask; + out vec2 TexCoords; +// Terminal properties +uniform vec2 termDim; +uniform vec2 cellDim; +uniform vec2 cellSep; + +// Cell properties +uniform vec2 gridCoords; + +// glyph properties +uniform vec2 glyphScale; +uniform vec2 glyphOffset; + +// uv mapping +uniform vec2 uvScale; +uniform vec2 uvOffset; + +// Orthographic projection uniform mat4 projection; void main() { - gl_Position = projection * vec4(position.xy, 0.0, 1.0); - TexCoords = uvMask.xy; + // Position of cell from top-left + vec2 cellPosition = (cellDim + cellSep) * gridCoords; + + // Invert Y since framebuffer origin is bottom-left + cellPosition.y = termDim.y - cellPosition.y - cellDim.y; + + // Glyphs are offset within their cell; account for y-flip + vec2 cellOffset = vec2(glyphOffset.x, glyphOffset.y - glyphScale.y); + + // position coordinates are normalized on [0, 1] + vec2 finalPosition = glyphScale * position + cellPosition + cellOffset; + + gl_Position = projection * vec4(finalPosition.xy, 0.0, 1.0); + TexCoords = vec2(position.x, 1 - position.y) * uvScale + uvOffset; } |