From 7ec93debf10cca759067a6a137f9730f0ca5adad Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Fri, 25 May 2018 17:44:34 +0200 Subject: [PATCH] [dxvk] Add shaders for mip map generation --- src/dxvk/shaders/dxvk_mipgen_frag_1d.frag | 11 ++++++++++ src/dxvk/shaders/dxvk_mipgen_frag_2d.frag | 11 ++++++++++ src/dxvk/shaders/dxvk_mipgen_frag_3d.frag | 17 +++++++++++++++ src/dxvk/shaders/dxvk_mipgen_geom.geom | 25 +++++++++++++++++++++++ src/dxvk/shaders/dxvk_mipgen_vert.vert | 8 ++++++++ 5 files changed, 72 insertions(+) create mode 100644 src/dxvk/shaders/dxvk_mipgen_frag_1d.frag create mode 100644 src/dxvk/shaders/dxvk_mipgen_frag_2d.frag create mode 100644 src/dxvk/shaders/dxvk_mipgen_frag_3d.frag create mode 100644 src/dxvk/shaders/dxvk_mipgen_geom.geom create mode 100644 src/dxvk/shaders/dxvk_mipgen_vert.vert diff --git a/src/dxvk/shaders/dxvk_mipgen_frag_1d.frag b/src/dxvk/shaders/dxvk_mipgen_frag_1d.frag new file mode 100644 index 000000000..0e1819510 --- /dev/null +++ b/src/dxvk/shaders/dxvk_mipgen_frag_1d.frag @@ -0,0 +1,11 @@ +#version 450 + +layout(set = 0, binding = 0) +uniform sampler1DArray s_texture; + +layout(location = 0) in vec3 i_pos; +layout(location = 0) out vec4 o_color; + +void main() { + o_color = texture(s_texture, i_pos.xz); +} \ No newline at end of file diff --git a/src/dxvk/shaders/dxvk_mipgen_frag_2d.frag b/src/dxvk/shaders/dxvk_mipgen_frag_2d.frag new file mode 100644 index 000000000..e7a0b0820 --- /dev/null +++ b/src/dxvk/shaders/dxvk_mipgen_frag_2d.frag @@ -0,0 +1,11 @@ +#version 450 + +layout(set = 0, binding = 0) +uniform sampler2DArray s_texture; + +layout(location = 0) in vec3 i_pos; +layout(location = 0) out vec4 o_color; + +void main() { + o_color = texture(s_texture, i_pos); +} \ No newline at end of file diff --git a/src/dxvk/shaders/dxvk_mipgen_frag_3d.frag b/src/dxvk/shaders/dxvk_mipgen_frag_3d.frag new file mode 100644 index 000000000..42429cd91 --- /dev/null +++ b/src/dxvk/shaders/dxvk_mipgen_frag_3d.frag @@ -0,0 +1,17 @@ +#version 450 + +layout(set = 0, binding = 0) +uniform sampler3D s_texture; + +layout(location = 0) in vec3 i_pos; +layout(location = 0) out vec4 o_color; + +layout(push_constant) +uniform push_block { + uint p_layer_count; +}; + +void main() { + o_color = texture(s_texture, vec3(i_pos.xy, + (i_pos.z + 0.5f) / float(p_layer_count))); +} \ No newline at end of file diff --git a/src/dxvk/shaders/dxvk_mipgen_geom.geom b/src/dxvk/shaders/dxvk_mipgen_geom.geom new file mode 100644 index 000000000..c7413a434 --- /dev/null +++ b/src/dxvk/shaders/dxvk_mipgen_geom.geom @@ -0,0 +1,25 @@ +#version 450 + +layout(points) in; +layout(triangle_strip, max_vertices = 4) out; + +layout(location = 0) in int i_instance[1]; +layout(location = 0) out vec3 o_pos; + +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++) { + o_pos = vec3(0.5f + 0.5f * g_vpos[i].xy, float(i_instance[0])); + 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_mipgen_vert.vert b/src/dxvk/shaders/dxvk_mipgen_vert.vert new file mode 100644 index 000000000..3009b809b --- /dev/null +++ b/src/dxvk/shaders/dxvk_mipgen_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