Syncleus / aparapi

The New Official Aparapi: a framework for executing native Java and Scala code on the GPU.
http://aparapi.com
Apache License 2.0
465 stars 59 forks source link

wrongfully fails on loop in my kernel #172

Open liufeicc opened 11 months ago

liufeicc commented 11 months ago

ERROR IN Function isHidden

com.aparapi.internal.instruction.ExpressionList LINE 526:might be mistaken for a do while!

Here are some of my code: @Override public void run() { int triangleIdx = getGlobalId();

    int firstVertex = indexBuffer[triangleIdx * 3 + 2];
    int secondVertex = indexBuffer[triangleIdx * 3 + 1];
    int thirdVertex = indexBuffer[triangleIdx * 3];

    setVertex(VIdxN3(triangleIdx, 0), updatedVertices, firstVertex, updatedVertexBuffer);
    setVertex(VIdxN3(triangleIdx, 1), updatedVertices, secondVertex, updatedVertexBuffer);
    setVertex(VIdxN3(triangleIdx, 2), updatedVertices, thirdVertex, updatedVertexBuffer);

    vertexLightLevel[N4(triangleIdx, 0)] = vertexLightLevelBuffer[firstVertex];
    vertexLightLevel[N4(triangleIdx, 1)] = vertexLightLevelBuffer[secondVertex];
    vertexLightLevel[N4(triangleIdx, 2)] = vertexLightLevelBuffer[thirdVertex];

    if(isHidden(triangleIdx))
        return;

    if(clipZNearPlane(triangleIdx))
        return;

    if(colorRenderType == 2) 
        transformTexture(triangleIdx, firstVertex);
    else if(colorRenderType == 3)
        transformBarycentricTextured(triangleIdx);

    scanTriangle(triangleIdx);
}

private boolean isHidden(int triangleIdx)
{       
    boolean allBehindClippingPlane = true;
    for (int i = 0; i < 3; i++)
    {
        if (ZN33(triangleIdx, i) >= nearClipDistance)
        {
            allBehindClippingPlane = false;
            break;
        }
    }
    if (allBehindClippingPlane)
        return true;

    setVertex(triangleIdx, edge1, VIdxN3(triangleIdx, 1), updatedVertices);
    sub(triangleIdx, edge1, VIdxN3(triangleIdx, 0), updatedVertices);
    setVertex(triangleIdx, edge2, VIdxN3(triangleIdx, 2), updatedVertices);
    sub(triangleIdx, edge2, VIdxN3(triangleIdx, 0), updatedVertices);
    cross(triangleIdx, surfaceNormal, triangleIdx, edge1, triangleIdx, edge2);
    float dotProduct = dot(triangleIdx, surfaceNormal, VIdxN3(triangleIdx, 0), updatedVertices);
    if (dotProduct >= 0)
        return true;

    testBoundary(triangleIdx);

    if (leftMostPosition[triangleIdx] == SCREEN_W 
            || rightMostPosition[triangleIdx] == -1 
            || upperMostPosition[triangleIdx] == SCREEN_H
            || lowerMostPosition[triangleIdx] == -1)
        return true;

    isClippingRightOrLeft[triangleIdx] = false;
    if (leftMostPosition[triangleIdx] < 0 || rightMostPosition[triangleIdx] >= SCREEN_W)
        isClippingRightOrLeft[triangleIdx] = true;

    return false;
}