diff options
| author | ameerj <52414509+ameerj@users.noreply.github.com> | 2021-06-19 00:55:13 -0400 |
|---|---|---|
| committer | ameerj <52414509+ameerj@users.noreply.github.com> | 2021-06-19 09:00:33 -0400 |
| commit | 31b125ef578dd5df4e289d1057154dd34f73cb19 (patch) | |
| tree | c44e0bfe5d201587da1de1351692617f24769b98 /src/video_core/host_shaders/astc_decoder.comp | |
| parent | 3870ba670f6787de976c785ba95d76ee518823b9 (diff) | |
astc: Various robustness enhancements for the gpu decoder
These changes should help in reducing crashes/drivers panics that may
occur due to synchronization issues between the shader completion and
later access of the decoded texture.
Diffstat (limited to 'src/video_core/host_shaders/astc_decoder.comp')
| -rw-r--r-- | src/video_core/host_shaders/astc_decoder.comp | 15 |
1 files changed, 6 insertions, 9 deletions
diff --git a/src/video_core/host_shaders/astc_decoder.comp b/src/video_core/host_shaders/astc_decoder.comp index eaba1b103..71327e233 100644 --- a/src/video_core/host_shaders/astc_decoder.comp +++ b/src/video_core/host_shaders/astc_decoder.comp @@ -14,9 +14,8 @@ #define BINDING_6_TO_8_BUFFER 2 #define BINDING_7_TO_8_BUFFER 3 #define BINDING_8_TO_8_BUFFER 4 -#define BINDING_BYTE_TO_16_BUFFER 5 -#define BINDING_SWIZZLE_BUFFER 6 -#define BINDING_OUTPUT_IMAGE 7 +#define BINDING_SWIZZLE_BUFFER 5 +#define BINDING_OUTPUT_IMAGE 6 #else // ^^^ Vulkan ^^^ // vvv OpenGL vvv @@ -29,7 +28,6 @@ #define BINDING_6_TO_8_BUFFER 3 #define BINDING_7_TO_8_BUFFER 4 #define BINDING_8_TO_8_BUFFER 5 -#define BINDING_BYTE_TO_16_BUFFER 6 #define BINDING_OUTPUT_IMAGE 0 #endif @@ -86,9 +84,6 @@ layout(binding = BINDING_7_TO_8_BUFFER, std430) readonly buffer REPLICATE_7_BIT_ layout(binding = BINDING_8_TO_8_BUFFER, std430) readonly buffer REPLICATE_8_BIT_TO_8 { uint REPLICATE_8_BIT_TO_8_TABLE[]; }; -layout(binding = BINDING_BYTE_TO_16_BUFFER, std430) readonly buffer REPLICATE_BYTE_TO_16 { - uint REPLICATE_BYTE_TO_16_TABLE[]; -}; layout(binding = BINDING_OUTPUT_IMAGE, rgba8) uniform writeonly image2DArray dest_image; @@ -207,8 +202,7 @@ uint Replicate(uint val, uint num_bits, uint to_bit) { } uvec4 ReplicateByteTo16(uvec4 value) { - return uvec4(REPLICATE_BYTE_TO_16_TABLE[value.x], REPLICATE_BYTE_TO_16_TABLE[value.y], - REPLICATE_BYTE_TO_16_TABLE[value.z], REPLICATE_BYTE_TO_16_TABLE[value.w]); + return value * 0x101; } uint ReplicateBitTo7(uint value) { @@ -1327,6 +1321,9 @@ void main() { offset += swizzle; const ivec3 coord = ivec3(gl_GlobalInvocationID * uvec3(block_dims, 1)); + if (any(greaterThanEqual(coord, imageSize(dest_image)))) { + return; + } uint block_index = pos.z * gl_WorkGroupSize.x * gl_WorkGroupSize.y + pos.y * gl_WorkGroupSize.x + pos.x; |
