wrongfully fails on loop in my kernel
liufeicc opened this issue · comments
liufeicc commented
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;
}