blob: d39696a3a9b9472bd03e72187da428db8490ef82 [file] [edit]
struct main_inputs {
uint3 LocalInvocationID : SV_GroupThreadID;
uint tint_local_index : SV_GroupIndex;
uint3 WorkGroupID : SV_GroupID;
};
SamplerState samp : register(s0);
cbuffer cbuffer_params : register(b1) {
uint4 params[1];
};
Texture2D<float4> inputTex : register(t1, space1);
RWTexture2D<float4> outputTex : register(u2, space1);
cbuffer cbuffer_flip : register(b3, space1) {
uint4 flip[1];
};
groupshared float3 tile[4][256];
uint tint_div_u32(uint lhs, uint rhs) {
return (lhs / (((rhs == 0u)) ? (1u) : (rhs)));
}
void main_inner(uint3 WorkGroupID, uint3 LocalInvocationID, uint tint_local_index) {
{
uint v = 0u;
v = tint_local_index;
while(true) {
uint v_1 = v;
if ((v_1 >= 1024u)) {
break;
}
tile[(v_1 / 256u)][(v_1 % 256u)] = (0.0f).xxx;
{
v = (v_1 + 64u);
}
continue;
}
}
GroupMemoryBarrierWithGroupSync();
uint filterOffset = tint_div_u32((params[0u].x - 1u), 2u);
uint3 v_2 = (0u).xxx;
inputTex.GetDimensions(uint(int(0)), v_2[0u], v_2[1u], v_2[2u]);
uint2 dims = v_2.xy;
uint2 v_3 = ((WorkGroupID.xy * uint2(params[0u].y, 4u)) + (LocalInvocationID.xy * uint2(4u, 1u)));
uint2 baseIndex = (v_3 - uint2(filterOffset, 0u));
{
uint r = 0u;
while(true) {
if ((r < 4u)) {
} else {
break;
}
{
uint c = 0u;
while(true) {
if ((c < 4u)) {
} else {
break;
}
uint2 loadIndex = (baseIndex + uint2(c, r));
if ((flip[0u].x != 0u)) {
loadIndex = loadIndex.yx;
}
uint v_4 = r;
uint v_5 = ((4u * LocalInvocationID[0u]) + c);
float2 v_6 = (float2(loadIndex) + (0.25f).xx);
float2 v_7 = (v_6 / float2(dims));
tile[v_4][v_5] = inputTex.SampleLevel(samp, v_7, float(0.0f)).xyz;
{
c = (c + 1u);
}
continue;
}
}
{
r = (r + 1u);
}
continue;
}
}
GroupMemoryBarrierWithGroupSync();
{
uint r = 0u;
while(true) {
if ((r < 4u)) {
} else {
break;
}
{
uint c = 0u;
while(true) {
if ((c < 4u)) {
} else {
break;
}
uint2 writeIndex = (baseIndex + uint2(c, r));
if ((flip[0u].x != 0u)) {
writeIndex = writeIndex.yx;
}
uint center = ((4u * LocalInvocationID[0u]) + c);
bool v_8 = false;
if ((center >= filterOffset)) {
v_8 = (center < (256u - filterOffset));
} else {
v_8 = false;
}
bool v_9 = false;
if (v_8) {
v_9 = all((writeIndex < dims));
} else {
v_9 = false;
}
if (v_9) {
float3 acc = (0.0f).xxx;
{
uint f = 0u;
while(true) {
if ((f < params[0u].x)) {
} else {
break;
}
uint i = ((center + f) - filterOffset);
float3 v_10 = acc;
float v_11 = (1.0f / float(params[0u].x));
uint v_12 = r;
uint v_13 = i;
acc = (v_10 + (v_11 * tile[v_12][v_13]));
{
f = (f + 1u);
}
continue;
}
}
uint2 v_14 = writeIndex;
outputTex[v_14] = float4(acc, 1.0f);
}
{
c = (c + 1u);
}
continue;
}
}
{
r = (r + 1u);
}
continue;
}
}
}
[numthreads(64, 1, 1)]
void main(main_inputs inputs) {
main_inner(inputs.WorkGroupID, inputs.LocalInvocationID, inputs.tint_local_index);
}