diff options
author | Tomaž Vajngerl <tomaz.vajngerl@collabora.co.uk> | 2016-05-20 14:59:24 +0900 |
---|---|---|
committer | Tomaž Vajngerl <quikee@gmail.com> | 2016-05-23 23:34:31 +0000 |
commit | 3cac38b2311538a0aecca765eb62c30c5098a85c (patch) | |
tree | 81a3119dedeadada66dcade0ac0a2b42981b7a38 /vcl/opengl/combinedVertexShader.glsl | |
parent | ac06e4ef9d56677e1469e94b99045b3e02c7511f (diff) |
opengl: combined shaders to reduce shader switching
Combine most common shaders for non-texture drawing and texture
drawing into two combined shaders. Inside the shader we switch
between the code paths with if statements.
Using if statements (or any other branching statements) is
discouraged inside shaders but on the other hand we reduce program
state changes if we have less shader changes - which is more
important for us as we want to push more work to the GPU.
Change-Id: I6701b93faa9b0f55dd0af6d983ce4c2de4539c70
Reviewed-on: https://gerrit.libreoffice.org/25357
Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
Tested-by: Tomaž Vajngerl <quikee@gmail.com>
Diffstat (limited to 'vcl/opengl/combinedVertexShader.glsl')
-rw-r--r-- | vcl/opengl/combinedVertexShader.glsl | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/vcl/opengl/combinedVertexShader.glsl b/vcl/opengl/combinedVertexShader.glsl new file mode 100644 index 000000000000..9272544c33ef --- /dev/null +++ b/vcl/opengl/combinedVertexShader.glsl @@ -0,0 +1,47 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +attribute vec2 position; +attribute vec4 extrusion_vectors; + +varying float fade_factor; // fade factor for anti-aliasing + +uniform float line_width; +uniform float feather; // width where we fade the line + +uniform mat4 mvp; + +#define TYPE_NORMAL 0 +#define TYPE_LINE 1 + +uniform int type; + +void main() +{ + vec4 final_position = vec4(position, 0.0, 1.0); + + if (type == TYPE_LINE) + { + vec2 extrusion_vector = extrusion_vectors.xy; + // miter factor to additionaly lenghten the distance of vertex (needed for miter) + // if 1.0 - miter_factor has no effect + float miter_factor = 1.0f / abs(extrusion_vectors.z); + // fade factor is always -1.0 or 1.0 -> we transport that info together with length + fade_factor = sign(extrusion_vectors.z); + + float rendered_thickness = (line_width + feather * 2.0) * miter_factor; + + // lengthen the vertex in directon of the extrusion vector by line width. + final_position = vec4(position + (extrusion_vector * (rendered_thickness / 2.0) ), 0.0, 1.0); + } + + gl_Position = mvp * final_position; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |