Skip to content

wrongfully fails on loop in my kernel #172

@liufeicc

Description

@liufeicc

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

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