1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2024-11-30 13:24:10 +01:00

[dxvk] Added meta shaders for image/buffer clear operations

The D3D11 ClearUnorderedAccessView* and ClearView functions
will have to be emulated using compute shaders rather than
clear operations, since Vulkan clear operations do not take
image views and their format into account.
This commit is contained in:
Philip Rebohle 2018-04-11 13:07:04 +02:00
parent 4797645bd2
commit 6a0ab19049
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
8 changed files with 184 additions and 0 deletions

View File

@ -0,0 +1,23 @@
#version 450
layout(
local_size_x = 64,
local_size_y = 1,
local_size_z = 1) in;
layout(binding = 0)
writeonly uniform imageBuffer dst;
layout(push_constant)
uniform u_info_t {
vec4 clear_value;
ivec4 dst_offset;
ivec4 dst_size;
} u_info;
void main() {
ivec3 thread_id = ivec3(gl_GlobalInvocationID.x);
if (thread_id.x < u_info.dst_size.x)
imageStore(dst, thread_id.x + u_info.dst_offset.x, u_info.clear_value);
}

View File

@ -0,0 +1,23 @@
#version 450
layout(
local_size_x = 64,
local_size_y = 1,
local_size_z = 1) in;
layout(binding = 0)
writeonly uniform uimageBuffer dst;
layout(push_constant)
uniform u_info_t {
uvec4 clear_value;
ivec4 dst_offset;
ivec4 dst_size;
} u_info;
void main() {
ivec3 thread_id = ivec3(gl_GlobalInvocationID.x);
if (thread_id.x < u_info.dst_size.x)
imageStore(dst, thread_id.x + u_info.dst_offset.x, u_info.clear_value);
}

View File

@ -0,0 +1,23 @@
#version 450
layout(
local_size_x = 64,
local_size_y = 1,
local_size_z = 1) in;
layout(binding = 0)
writeonly uniform image1DArray dst;
layout(push_constant)
uniform u_info_t {
vec4 clear_value;
ivec4 dst_offset;
ivec4 dst_size;
} u_info;
void main() {
ivec3 thread_id = ivec3(gl_GlobalInvocationID.x);
if (all(lessThan(thread_id.xy, u_info.dst_size.xy)))
imageStore(dst, thread_id.xy + u_info.dst_offset.xy, u_info.clear_value);
}

View File

@ -0,0 +1,23 @@
#version 450
layout(
local_size_x = 64,
local_size_y = 1,
local_size_z = 1) in;
layout(binding = 0)
writeonly uniform uimage1DArray dst;
layout(push_constant)
uniform u_info_t {
uvec4 clear_value;
ivec4 dst_offset;
ivec4 dst_size;
} u_info;
void main() {
ivec3 thread_id = ivec3(gl_GlobalInvocationID.x);
if (all(lessThan(thread_id.xy, u_info.dst_size.xy)))
imageStore(dst, thread_id.xy + u_info.dst_offset.xy, u_info.clear_value);
}

View File

@ -0,0 +1,23 @@
#version 450
layout(
local_size_x = 64,
local_size_y = 1,
local_size_z = 1) in;
layout(binding = 0)
writeonly uniform image2DArray dst;
layout(push_constant)
uniform u_info_t {
vec4 clear_value;
ivec4 dst_offset;
ivec4 dst_size;
} u_info;
void main() {
ivec3 thread_id = ivec3(gl_GlobalInvocationID.x);
if (all(lessThan(thread_id.xyz, u_info.dst_size.xyz)))
imageStore(dst, thread_id.xyz + u_info.dst_offset.xyz, u_info.clear_value);
}

View File

@ -0,0 +1,23 @@
#version 450
layout(
local_size_x = 64,
local_size_y = 1,
local_size_z = 1) in;
layout(binding = 0)
writeonly uniform uimage2DArray dst;
layout(push_constant)
uniform u_info_t {
uvec4 clear_value;
ivec4 dst_offset;
ivec4 dst_size;
} u_info;
void main() {
ivec3 thread_id = ivec3(gl_GlobalInvocationID.x);
if (all(lessThan(thread_id.xyz, u_info.dst_size.xyz)))
imageStore(dst, thread_id.xyz + u_info.dst_offset.xyz, u_info.clear_value);
}

View File

@ -0,0 +1,23 @@
#version 450
layout(
local_size_x = 64,
local_size_y = 1,
local_size_z = 1) in;
layout(binding = 0)
writeonly uniform image3D dst;
layout(push_constant)
uniform u_info_t {
vec4 clear_value;
ivec4 dst_offset;
ivec4 dst_size;
} u_info;
void main() {
ivec3 thread_id = ivec3(gl_GlobalInvocationID.x);
if (all(lessThan(thread_id.xyz, u_info.dst_size.xyz)))
imageStore(dst, thread_id.xyz + u_info.dst_offset.xyz, u_info.clear_value);
}

View File

@ -0,0 +1,23 @@
#version 450
layout(
local_size_x = 64,
local_size_y = 1,
local_size_z = 1) in;
layout(binding = 0)
writeonly uniform uimage3D dst;
layout(push_constant)
uniform u_info_t {
uvec4 clear_value;
ivec4 dst_offset;
ivec4 dst_size;
} u_info;
void main() {
ivec3 thread_id = ivec3(gl_GlobalInvocationID.x);
if (all(lessThan(thread_id.xyz, u_info.dst_size.xyz)))
imageStore(dst, thread_id.xyz + u_info.dst_offset.xyz, u_info.clear_value);
}