[vulkan] Create a water warp output pipeline

Although it works as intended (tested via hacking), it's not hooked up
as the current frame buffer handling in r_screen is not readily
compatible with how vulkan output is handled. This will need some
thought to get working.
This commit is contained in:
Bill Currie 2022-11-27 12:48:51 +09:00
parent 22615f25ab
commit efc3443c61
5 changed files with 91 additions and 2 deletions

View file

@ -359,8 +359,12 @@ passthrough_src = $(vkshaderpath)/passthrough.vert
passthrough_c = $(vkshaderpath)/passthrough.vert.spvc passthrough_c = $(vkshaderpath)/passthrough.vert.spvc
fstriangle_src = $(vkshaderpath)/fstriangle.vert fstriangle_src = $(vkshaderpath)/fstriangle.vert
fstriangle_c = $(vkshaderpath)/fstriangle.vert.spvc fstriangle_c = $(vkshaderpath)/fstriangle.vert.spvc
fstrianglest_src = $(vkshaderpath)/fstrianglest.vert
fstrianglest_c = $(vkshaderpath)/fstrianglest.vert.spvc
pushcolor_src = $(vkshaderpath)/pushcolor.frag pushcolor_src = $(vkshaderpath)/pushcolor.frag
pushcolor_c = $(vkshaderpath)/pushcolor.frag.spvc pushcolor_c = $(vkshaderpath)/pushcolor.frag.spvc
waterwarp_src = $(vkshaderpath)/waterwarp.frag
waterwarp_c = $(vkshaderpath)/waterwarp.frag.spvc
$(slice_vert_c): $(slice_vert_src) $(slice_vert_c): $(slice_vert_src)
@ -432,8 +436,12 @@ $(passthrough_c): $(passthrough_src)
$(fstriangle_c): $(fstriangle_src) $(fstriangle_c): $(fstriangle_src)
$(fstrianglest_c): $(fstrianglest_src)
$(pushcolor_c): $(pushcolor_src) $(pushcolor_c): $(pushcolor_src)
$(waterwarp_c): $(waterwarp_src)
vkshader_c = \ vkshader_c = \
$(slice_c) \ $(slice_c) \
$(glyphv_c) \ $(glyphv_c) \
@ -473,8 +481,10 @@ vkshader_c = \
$(output_c) \ $(output_c) \
$(passthrough_c) \ $(passthrough_c) \
$(fstriangle_c) \ $(fstriangle_c) \
$(fstrianglest_c) \
$(pushcolor_c) \ $(pushcolor_c) \
$(shadow_c) $(shadow_c) \
$(waterwarp_c)
V_VKGEN = $(V_VKGEN_@AM_V@) V_VKGEN = $(V_VKGEN_@AM_V@)
V_VKGEN_ = $(V_VKGEN_@AM_DEFAULT_V@) V_VKGEN_ = $(V_VKGEN_@AM_DEFAULT_V@)
@ -532,6 +542,7 @@ EXTRA_DIST += \
libs/video/renderer/vulkan/shader/lighting.frag \ libs/video/renderer/vulkan/shader/lighting.frag \
libs/video/renderer/vulkan/shader/passthrough.vert \ libs/video/renderer/vulkan/shader/passthrough.vert \
libs/video/renderer/vulkan/shader/fstriangle.vert \ libs/video/renderer/vulkan/shader/fstriangle.vert \
libs/video/renderer/vulkan/shader/fstrianglest.vert \
libs/video/renderer/vulkan/shader/partphysics.comp \ libs/video/renderer/vulkan/shader/partphysics.comp \
libs/video/renderer/vulkan/shader/partupdate.comp \ libs/video/renderer/vulkan/shader/partupdate.comp \
libs/video/renderer/vulkan/shader/particle.vert \ libs/video/renderer/vulkan/shader/particle.vert \
@ -547,4 +558,5 @@ EXTRA_DIST += \
libs/video/renderer/vulkan/shader/sprite_gbuf.frag \ libs/video/renderer/vulkan/shader/sprite_gbuf.frag \
libs/video/renderer/vulkan/shader/twod_depth.frag \ libs/video/renderer/vulkan/shader/twod_depth.frag \
libs/video/renderer/vulkan/shader/twod.frag \ libs/video/renderer/vulkan/shader/twod.frag \
libs/video/renderer/vulkan/shader/twod.vert libs/video/renderer/vulkan/shader/twod.vert \
libs/video/renderer/vulkan/shader/waterwarp.frag

View file

@ -56,6 +56,16 @@
output_layout = { output_layout = {
setLayouts = (matrix_set, output_set); setLayouts = (matrix_set, output_set);
}; };
waterwarp_layout = {
@inherit = $properties.pipelineLayouts.output_layout;
pushConstantRanges = (
{
stageFlags = fragment;
offset = 0;
size = "4";
}
);
};
}; };
depthStencil = { depthStencil = {
@ -152,6 +162,11 @@
name = main; name = main;
module = $builtin/fstriangle.vert; module = $builtin/fstriangle.vert;
}; };
vertexStageST = {
stage = vertex;
name = main;
module = $builtin/fstrianglest.vert;
};
vertexInput = { vertexInput = {
bindings = (); bindings = ();
attributes = (); attributes = ();
@ -205,5 +220,18 @@
); );
layout = output_layout; layout = output_layout;
}; };
waterwarp = {
@inherit = $properties.pipelines.output_base;
subpass = 0;
stages = (
$properties.fstriangle.vertexStageST,
{
stage = fragment;
name = main;
module = $builtin/waterwarp.frag;
},
);
layout = waterwarp_layout;
};
}; };
} }

View file

@ -115,7 +115,11 @@ static
static static
#include "libs/video/renderer/vulkan/shader/fstriangle.vert.spvc" #include "libs/video/renderer/vulkan/shader/fstriangle.vert.spvc"
static static
#include "libs/video/renderer/vulkan/shader/fstrianglest.vert.spvc"
static
#include "libs/video/renderer/vulkan/shader/pushcolor.frag.spvc" #include "libs/video/renderer/vulkan/shader/pushcolor.frag.spvc"
static
#include "libs/video/renderer/vulkan/shader/waterwarp.frag.spvc"
typedef struct shaderdata_s { typedef struct shaderdata_s {
const char *name; const char *name;
@ -162,7 +166,9 @@ static shaderdata_t builtin_shaders[] = {
{ "output.frag", output_frag, sizeof (output_frag) }, { "output.frag", output_frag, sizeof (output_frag) },
{ "passthrough.vert", passthrough_vert, sizeof (passthrough_vert) }, { "passthrough.vert", passthrough_vert, sizeof (passthrough_vert) },
{ "fstriangle.vert", fstriangle_vert, sizeof (fstriangle_vert) }, { "fstriangle.vert", fstriangle_vert, sizeof (fstriangle_vert) },
{ "fstrianglest.vert", fstrianglest_vert, sizeof (fstrianglest_vert) },
{ "pushcolor.frag", pushcolor_frag, sizeof (pushcolor_frag) }, { "pushcolor.frag", pushcolor_frag, sizeof (pushcolor_frag) },
{ "waterwarp.frag", waterwarp_frag, sizeof (waterwarp_frag) },
{} {}
}; };

View file

@ -0,0 +1,12 @@
#version 450
layout (location = 0) out vec2 st;
void
main ()
{
float x = (gl_VertexIndex & 2);
float y = (gl_VertexIndex & 1);
gl_Position = vec4 (2, 4, 0, 1) * vec4 (x, y, 0, 1) - vec4 (1, 1, 0, 0);
st = vec2(1, 2) * vec2(x, y);
}

View file

@ -0,0 +1,31 @@
#version 450
#extension GL_GOOGLE_include_directive : enable
layout (set = 0, binding = 0) uniform
#include "matrices.h"
;
layout (set = 1, binding = 0) uniform sampler2D Input;
layout (push_constant) uniform PushConstants {
float time;
};
layout (location = 0) in vec2 uv;
layout (location = 0) out vec4 frag_color;
const float S = 0.15625;
const float F = 2.5;
const float A = 0.01;
const vec2 B = vec2 (1, 1);
const float PI = 3.14159265;
void
main (void)
{
vec2 st;
st = uv * (1.0 - 2.0*A) + A * (B + sin ((time * S + F * uv.yx) * 2.0*PI));
vec4 c = texture (Input, st);
frag_color = c;//vec4(uv, c.x, 1);
}