Skip to content

Incorrect GLSL logic about the reuse variables and countbits function #50

@xlincuts

Description

@xlincuts

Hi,

I found 2 issues in the generated GLSL logic

The HLSL source:

cbuffer csInput_CB : register(b0)
{
    uint g_MaskDefault;
    uint g_MaskX;
    uint g_MaskY;
};

RWBuffer<uint> csOutput : register(u0);
// ------------------------------------------------------------------------------

void CalculateMask(inout uint mask, in uint index, in uint maskComponent)
{
    uint curBit = 1;
    mask = g_MaskDefault;

    [loop]
    for (uint i = 0; i < index; ++i)
    {
        [flatten]
        if ((index & 1) && (maskComponent & 1))
        {
            mask = curBit;
            break;
        }
        curBit <<= 1;
    }
}

// ------------------------------------------------------------------------------
[numthreads(1, 1, 1)]
void main(uint3 threadID : SV_DispatchThreadID)
{
    uint2 masks = 0;
    uint outputOffset = (threadID.x << 1);
    uint checkIndex = threadID.x + 1;

    CalculateMask(masks.x, checkIndex, g_MaskX);
    CalculateMask(masks.y, checkIndex, g_MaskY);

    uint count = countbits(masks.x) + countbits(masks.y);

    if (count > 0)
    {
        csOutput[outputOffset + 0] = masks.x;
        csOutput[outputOffset + 1] = masks.y;
    }
}

The generated GLSL source:

#version 430
#extension GL_ARB_shading_language_420pack : require

layout(location = 0) uniform 	uint g_MaskDefault;
uniform 	uint g_MaskX;
uniform 	uint g_MaskY;
writeonly layout(binding=0) uniform uimageBuffer csOutput;
ivec3 u_xlati0;
uint u_xlatu0;
uint u_xlatu1;
ivec3 u_xlati2;
uvec3 u_xlatu2;
bvec3 u_xlatb2;
uint u_xlatu3;
int u_xlati4;
int u_xlati5;
uint u_xlatu5;
bool u_xlatb5;
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
void main()
{
    u_xlatu0 = gl_GlobalInvocationID.x + 1u;
    u_xlati2.x = int(u_xlatu0 & 1u);
    u_xlati2.yz = ivec2(csInput_CBCS.uvec2(g_MaskX, g_MaskY) & uvec2(1u, 1u));
    u_xlatb2.xyz = notEqual(u_xlati2.xyzz, ivec4(0, 0, 0, 0)).xyz;
    u_xlatb2.x = u_xlatb2.y && u_xlatb2.x; 
    u_xlatb2.y = u_xlatb2.z && u_xlatb2.x;Incorrect
    u_xlatu2.z = csInput_CBCS.g_MaskDefault;
    u_xlatu1 = uint(1u);
    for(uint u_xlatu_loop_1 = uint(0u) ; u_xlatu_loop_1<u_xlatu0 ; u_xlatu_loop_1++)
    {
        u_xlatu5 = (u_xlatb2.x) ? u_xlatu1 : u_xlatu2.z;
        u_xlatu2.z = u_xlatu5;
        u_xlati5 = int(u_xlatb2.x);
        if(u_xlati5 != 0) {break;}
        u_xlatu1 = u_xlatu1 << 1u;
    }
    u_xlatu2.x = csInput_CBCS.g_MaskDefault;
    u_xlatu1 = uint(1u);
    for(uint u_xlatu_loop_2 = uint(0u) ; u_xlatu_loop_2<u_xlatu0 ; u_xlatu_loop_2++)
    {
        u_xlatu5 = (u_xlatb2.y) ? u_xlatu1 : u_xlatu2.x;
        u_xlatu2.x = u_xlatu5;
        u_xlati5 = int(u_xlatb2.y);
        if(u_xlati5 != 0) {break;}
        u_xlatu1 = u_xlatu1 << 1u;
    }
    u_xlati0.xz = bitCount(ivec4(u_xlatu2.zzxz));
    u_xlati0.x = u_xlati0.z + u_xlati0.x;
    if(u_xlati0.x != 0) {
        u_xlati0.x = int(gl_GlobalInvocationID.x) << 1;
        imageStore(csOutput, u_xlati0.x, u_xlatu2.zzzz);
        u_xlati4 = int(gl_GlobalInvocationID.x) * 2 + 1;
        imageStore(csOutput, int(u_xlati4), u_xlatu2.xxxx);
    //ENDIF
    }
    return;
}

Issue1: Incorrect reuse variables

'u_xlatb2.y' will get an incorrect result, as 'u_xlatb2.x' in the previous step has been changed.
So the next logics which're using 'x_xlatb2.y', will get the error results

u_xlatu0 = gl_GlobalInvocationID.x + 1u; // u_xlatu0 --> checkIndex (in HLSL)
u_xlatb2.xyz = notEqual(u_xlati2.xyzz, ivec4(0, 0, 0, 0)).xyz; //  x --> (checkIndex&1), y --> (g_MaskX&1), z --> (g_MaskY&1)
u_xlatb2.x = u_xlatb2.y && u_xlatb2.x;  // u_xlatb2.x --> (checkIndex&1) && (g_MaskX&1)
u_xlatb2.y = u_xlatb2.z && u_xlatb2.x; // Error: u_xlatb2.y --> (checkIndex&1) && (g_MaskX&1) && (g_MaskY&1),
                                       // it should be (checkIndex&1) && (g_MaskY&1)

Issue2: countbits function convert

The bitCount argument is incorrect, when 'z' is 0 and 'x' greater 0, the 'u_xlati0' will get an incorrect result.

u_xlati0.xz = bitCount(ivec4(u_xlatu2.zzxz));

For the detail compilation information, please check Here

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions