mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2026-10-24 02:09:03 +03:00
vulkan: declare maximal reconvergence in shaders doing subgroup reductions
These shaders reduce across the subgroup after divergent control flow and implicitly rely on invocations reconverging as written, the MaximallyReconvergesKHR execution mode turns that assumption into a guarantee.
This commit is contained in:
@@ -24,6 +24,7 @@
|
||||
#extension GL_KHR_shader_subgroup_basic : require
|
||||
#extension GL_KHR_shader_subgroup_arithmetic : require
|
||||
#extension GL_KHR_shader_subgroup_rotate : require
|
||||
#extension GL_EXT_maximal_reconvergence : require
|
||||
|
||||
#define PB_UNALIGNED
|
||||
#include "common.glsl"
|
||||
@@ -278,7 +279,7 @@ void dc_context(uint coeff_base, uint idx, out int prev_dc, out int prev_k_dc)
|
||||
prev_k_dc = min(abs(dc_m1 - dc_m2) >> 1, 5);
|
||||
}
|
||||
|
||||
void main(void)
|
||||
void main(void) [[maximally_reconverges]]
|
||||
{
|
||||
const uint b = gl_LocalInvocationID.x;
|
||||
const uint comp = comp_base + gl_WorkGroupID.z;
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
#pragma shader_stage(compute)
|
||||
#extension GL_GOOGLE_include_directive : require
|
||||
#extension GL_KHR_shader_subgroup_arithmetic : require
|
||||
#extension GL_EXT_maximal_reconvergence : require
|
||||
|
||||
#define ENCODE
|
||||
#define SB_QUALI
|
||||
@@ -165,7 +166,7 @@ void coeff_search(uint slice_idx)
|
||||
}
|
||||
}
|
||||
|
||||
void main(void)
|
||||
void main(void) [[maximally_reconverges]]
|
||||
{
|
||||
if (force_pcm)
|
||||
return;
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
#extension GL_EXT_shader_explicit_arithmetic_types : require
|
||||
#extension GL_KHR_shader_subgroup_clustered : require
|
||||
#extension GL_KHR_shader_subgroup_shuffle : require
|
||||
#extension GL_EXT_maximal_reconvergence : require
|
||||
#extension GL_GOOGLE_include_directive : require
|
||||
|
||||
#include "common.glsl"
|
||||
@@ -233,7 +234,7 @@ int sum_of_planes(int value)
|
||||
return subgroupClusteredAdd(value, 4);
|
||||
}
|
||||
|
||||
void main()
|
||||
void main() [[maximally_reconverges]]
|
||||
{
|
||||
uint slice = gl_GlobalInvocationID.x / num_planes;
|
||||
uint plane = gl_LocalInvocationID.x % num_planes;
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
#extension GL_EXT_scalar_block_layout : require
|
||||
#extension GL_EXT_shader_explicit_arithmetic_types : require
|
||||
#extension GL_KHR_shader_subgroup_arithmetic : require
|
||||
#extension GL_EXT_maximal_reconvergence : require
|
||||
|
||||
layout (local_size_x_id = 253, local_size_y_id = 254, local_size_z_id = 255) in;
|
||||
|
||||
@@ -162,7 +163,7 @@ int force_slice_row_quants()
|
||||
return slice_row_size;
|
||||
}
|
||||
|
||||
void main()
|
||||
void main() [[maximally_reconverges]]
|
||||
{
|
||||
int slice_row_size;
|
||||
if (force_quant == 0)
|
||||
|
||||
Reference in New Issue
Block a user