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.
This commit is contained in:
parent
3870ba670f
commit
31b125ef57
5 changed files with 16 additions and 47 deletions
|
@ -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;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue