From c5f45d91537233fd0f3f262a006a56d1852522aa Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Sat, 23 Jun 2018 09:48:03 +0200 Subject: [PATCH] [dxvk] Add shaders for new meta-resolve operation --- src/dxvk/meson.build | 6 ++++++ src/dxvk/shaders/dxvk_resolve_frag_f.frag | 15 +++++++++++++++ src/dxvk/shaders/dxvk_resolve_frag_i.frag | 14 ++++++++++++++ src/dxvk/shaders/dxvk_resolve_frag_u.frag | 14 ++++++++++++++ src/dxvk/shaders/dxvk_resolve_geom.geom | 23 +++++++++++++++++++++++ src/dxvk/shaders/dxvk_resolve_vert.vert | 8 ++++++++ 6 files changed, 80 insertions(+) create mode 100644 src/dxvk/shaders/dxvk_resolve_frag_f.frag create mode 100644 src/dxvk/shaders/dxvk_resolve_frag_i.frag create mode 100644 src/dxvk/shaders/dxvk_resolve_frag_u.frag create mode 100644 src/dxvk/shaders/dxvk_resolve_geom.geom create mode 100644 src/dxvk/shaders/dxvk_resolve_vert.vert diff --git a/src/dxvk/meson.build b/src/dxvk/meson.build index e7bc8cc8..0c435327 100644 --- a/src/dxvk/meson.build +++ b/src/dxvk/meson.build @@ -18,6 +18,12 @@ dxvk_shaders = files([ 'shaders/dxvk_mipgen_frag_2d.frag', 'shaders/dxvk_mipgen_frag_3d.frag', + 'shaders/dxvk_resolve_vert.vert', + 'shaders/dxvk_resolve_geom.geom', + 'shaders/dxvk_resolve_frag_f.frag', + 'shaders/dxvk_resolve_frag_i.frag', + 'shaders/dxvk_resolve_frag_u.frag', + 'hud/shaders/hud_line.frag', 'hud/shaders/hud_text.frag', 'hud/shaders/hud_vert.vert', diff --git a/src/dxvk/shaders/dxvk_resolve_frag_f.frag b/src/dxvk/shaders/dxvk_resolve_frag_f.frag new file mode 100644 index 00000000..6cb7f653 --- /dev/null +++ b/src/dxvk/shaders/dxvk_resolve_frag_f.frag @@ -0,0 +1,15 @@ +#version 450 + +layout(set = 0, binding = 0) +uniform sampler2DMSArray s_image; + +layout(location = 0) out vec4 o_color; + +void main() { + int sampleCount = textureSamples(s_image); + + o_color = vec4(0.0f); + for (int i = 0; i < sampleCount; i++) + o_color += texelFetch(s_image, ivec3(gl_FragCoord.xy, gl_Layer), i); + o_color /= float(sampleCount); +} \ No newline at end of file diff --git a/src/dxvk/shaders/dxvk_resolve_frag_i.frag b/src/dxvk/shaders/dxvk_resolve_frag_i.frag new file mode 100644 index 00000000..01416fe5 --- /dev/null +++ b/src/dxvk/shaders/dxvk_resolve_frag_i.frag @@ -0,0 +1,14 @@ +#version 450 + +layout(set = 0, binding = 0) +uniform isampler2DMSArray s_image; + +layout(location = 0) out ivec4 o_color; + +void main() { + int sampleCount = textureSamples(s_image); + + o_color = ivec4(0); + for (int i = 0; i < sampleCount; i++) + o_color += texelFetch(s_image, ivec3(gl_FragCoord.xy, gl_Layer), i) / sampleCount; +} \ No newline at end of file diff --git a/src/dxvk/shaders/dxvk_resolve_frag_u.frag b/src/dxvk/shaders/dxvk_resolve_frag_u.frag new file mode 100644 index 00000000..d3706d48 --- /dev/null +++ b/src/dxvk/shaders/dxvk_resolve_frag_u.frag @@ -0,0 +1,14 @@ +#version 450 + +layout(set = 0, binding = 0) +uniform usampler2DMSArray s_image; + +layout(location = 0) out uvec4 o_color; + +void main() { + int sampleCount = textureSamples(s_image); + + o_color = uvec4(0u); + for (int i = 0; i < sampleCount; i++) + o_color += texelFetch(s_image, ivec3(gl_FragCoord.xy, gl_Layer), i) / uint(sampleCount); +} \ No newline at end of file diff --git a/src/dxvk/shaders/dxvk_resolve_geom.geom b/src/dxvk/shaders/dxvk_resolve_geom.geom new file mode 100644 index 00000000..33a266c5 --- /dev/null +++ b/src/dxvk/shaders/dxvk_resolve_geom.geom @@ -0,0 +1,23 @@ +#version 450 + +layout(points) in; +layout(triangle_strip, max_vertices = 4) out; + +layout(location = 0) in int i_instance[1]; + +const vec4 g_vpos[4] = { + vec4(-1.0f, -1.0f, 0.0f, 1.0f), + vec4(-1.0f, 1.0f, 0.0f, 1.0f), + vec4( 1.0f, -1.0f, 0.0f, 1.0f), + vec4( 1.0f, 1.0f, 0.0f, 1.0f), +}; + +void main() { + for (int i = 0; i < 4; i++) { + gl_Position = g_vpos[i]; + gl_Layer = i_instance[0]; + EmitVertex(); + } + + EndPrimitive(); +} \ No newline at end of file diff --git a/src/dxvk/shaders/dxvk_resolve_vert.vert b/src/dxvk/shaders/dxvk_resolve_vert.vert new file mode 100644 index 00000000..3009b809 --- /dev/null +++ b/src/dxvk/shaders/dxvk_resolve_vert.vert @@ -0,0 +1,8 @@ +#version 450 + +layout(location = 0) out int o_instance; + +void main() { + o_instance = gl_InstanceIndex; + gl_Position = vec4(0.0f, 0.0f, 0.0f, 1.0f); +} \ No newline at end of file