pathfinder/resources/shaders/metal/d3d11/bound.cs.metal

78 lines
2.2 KiB
Metal

// Automatically generated from files in pathfinder/shaders/. Do not edit!
#include <metal_stdlib>
#include <simd/simd.h>
using namespace metal;
struct bTilePathInfo
{
uint4 iTilePathInfo[1];
};
struct bTiles
{
uint iTiles[1];
};
constant uint3 gl_WorkGroupSize [[maybe_unused]] = uint3(64u, 1u, 1u);
kernel void main0(constant int& uTileCount [[buffer(0)]], constant int& uPathCount [[buffer(1)]], const device bTilePathInfo& _64 [[buffer(2)]], device bTiles& _148 [[buffer(3)]], uint3 gl_GlobalInvocationID [[thread_position_in_grid]])
{
uint tileIndex = gl_GlobalInvocationID.x;
if (tileIndex >= uint(uTileCount))
{
return;
}
uint lowPathIndex = 0u;
uint highPathIndex = uint(uPathCount);
int iteration = 0;
for (;;)
{
bool _42 = iteration < 1024;
bool _50;
if (_42)
{
_50 = (lowPathIndex + 1u) < highPathIndex;
}
else
{
_50 = _42;
}
if (_50)
{
uint midPathIndex = lowPathIndex + ((highPathIndex - lowPathIndex) / 2u);
uint midTileIndex = _64.iTilePathInfo[midPathIndex].z;
if (tileIndex < midTileIndex)
{
highPathIndex = midPathIndex;
}
else
{
lowPathIndex = midPathIndex;
if (tileIndex == midTileIndex)
{
break;
}
}
iteration++;
continue;
}
else
{
break;
}
}
uint pathIndex = lowPathIndex;
uint4 pathInfo = _64.iTilePathInfo[pathIndex];
int2 packedTileRect = int2(pathInfo.xy);
int4 tileRect = int4((packedTileRect.x << 16) >> 16, packedTileRect.x >> 16, (packedTileRect.y << 16) >> 16, packedTileRect.y >> 16);
uint tileOffset = tileIndex - pathInfo.z;
uint tileWidth = uint(tileRect.z - tileRect.x);
int2 tileCoords = tileRect.xy + int2(int(tileOffset % tileWidth), int(tileOffset / tileWidth));
_148.iTiles[(tileIndex * 4u) + 0u] = 4294967295u;
_148.iTiles[(tileIndex * 4u) + 1u] = 4294967295u;
_148.iTiles[(tileIndex * 4u) + 2u] = 16777215u;
_148.iTiles[(tileIndex * 4u) + 3u] = pathInfo.w;
}