mirror of
https://gitlab.freedesktop.org/wlroots/wlroots.git
synced 2025-12-21 08:56:31 -05:00
render/vulkan: add Vulkan renderer
This new renderer is implemented with the existing wlr_renderer API (which is known to be sub-optimal for some operations). It's not used by default, but users can opt-in by setting WLR_RENDERER=vulkan. The renderer depends on VK_EXT_image_drm_format_modifier and VK_EXT_physical_device_drm. Co-authored-by: Simon Ser <contact@emersion.fr> Co-authored-by: Jan Beich <jbeich@FreeBSD.org>
This commit is contained in:
parent
2edf468aeb
commit
8e34692250
21 changed files with 3704 additions and 2 deletions
25
render/vulkan/shaders/common.vert
Normal file
25
render/vulkan/shaders/common.vert
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
#version 450
|
||||
|
||||
// we use a mat4 since it uses the same size as mat3 due to
|
||||
// alignment. Easier to deal with (tighly-packed) mat4 though.
|
||||
layout(push_constant, row_major) uniform UBO {
|
||||
mat4 proj;
|
||||
vec2 uv_offset;
|
||||
vec2 uv_size;
|
||||
} data;
|
||||
|
||||
layout(location = 0) out vec2 uv;
|
||||
|
||||
// 4 outlining points and uv coords
|
||||
const vec2[] values = {
|
||||
{0, 0},
|
||||
{1, 0},
|
||||
{1, 1},
|
||||
{0, 1},
|
||||
};
|
||||
|
||||
void main() {
|
||||
vec2 pos = values[gl_VertexIndex % 4];
|
||||
uv = data.uv_offset + pos * data.uv_size;
|
||||
gl_Position = data.proj * vec4(pos, 0.0, 1.0);
|
||||
}
|
||||
20
render/vulkan/shaders/meson.build
Normal file
20
render/vulkan/shaders/meson.build
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
vulkan_shaders_src = [
|
||||
'common.vert',
|
||||
'texture.frag',
|
||||
'quad.frag',
|
||||
]
|
||||
|
||||
vulkan_shaders = []
|
||||
foreach shader : vulkan_shaders_src
|
||||
name = shader.underscorify() + '_data'
|
||||
args = [glslang, '-V', '@INPUT@', '-o', '@OUTPUT@', '--vn', name]
|
||||
header = custom_target(
|
||||
shader + '_spv',
|
||||
output: shader + '.h',
|
||||
input: shader,
|
||||
command: args)
|
||||
|
||||
vulkan_shaders += [header]
|
||||
endforeach
|
||||
|
||||
wlr_files += vulkan_shaders
|
||||
10
render/vulkan/shaders/quad.frag
Normal file
10
render/vulkan/shaders/quad.frag
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
#version 450
|
||||
|
||||
layout(location = 0) out vec4 out_color;
|
||||
layout(push_constant) uniform UBO {
|
||||
layout(offset = 80) vec4 color;
|
||||
} data;
|
||||
|
||||
void main() {
|
||||
out_color = data.color;
|
||||
}
|
||||
25
render/vulkan/shaders/texture.frag
Normal file
25
render/vulkan/shaders/texture.frag
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
#version 450
|
||||
|
||||
layout(set = 0, binding = 0) uniform sampler2D tex;
|
||||
|
||||
layout(location = 0) in vec2 uv;
|
||||
layout(location = 0) out vec4 out_color;
|
||||
|
||||
layout(push_constant) uniform UBO {
|
||||
layout(offset = 80) float alpha;
|
||||
} data;
|
||||
|
||||
void main() {
|
||||
out_color = textureLod(tex, uv, 0);
|
||||
|
||||
// We expect this shader to output pre-alpha-multiplied color values.
|
||||
// alpha < 0.0 means that this shader should ignore the texture's alpha
|
||||
// value.
|
||||
if (data.alpha < 0.0) {
|
||||
out_color.a = -data.alpha;
|
||||
out_color.rgb *= -data.alpha;
|
||||
} else {
|
||||
out_color *= data.alpha;
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue