Syncleus / aparapi

The New Official Aparapi: a framework for executing native Java and Scala code on the GPU.

Home Page:http://aparapi.com

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

wrongfully fails on loop in my kernel

liufeicc opened this issue · comments

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;
}