Skip to content

Instantly share code, notes, and snippets.

@JoeJGit
Last active August 17, 2017 20:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save JoeJGit/965136069803a26a7c24b04639d54341 to your computer and use it in GitHub Desktop.
Save JoeJGit/965136069803a26a7c24b04639d54341 to your computer and use it in GitHub Desktop.
#define SHIFT_KEY 5
#define MASK_KEY 0x7FF
#define BARRIER_LOCAL memoryBarrierShared(); barrier();
#if (WG_WIDTH == 64000) // buggy now with Vulkan
_sortBins[(((lID >> 0) << 1) | (lID & 0) | 1)] += (_sortBins[(((lID >> 0) << 1) | 0)]) & (MASK_KEY << SHIFT_KEY); BARRIER_LOCAL
_sortBins[(((lID >> 1) << 2) | (lID & 1) | 2)] += (_sortBins[(((lID >> 1) << 2) | 1)]) & (MASK_KEY << SHIFT_KEY); BARRIER_LOCAL
_sortBins[(((lID >> 2) << 3) | (lID & 3) | 4)] += (_sortBins[(((lID >> 2) << 3) | 3)]) & (MASK_KEY << SHIFT_KEY); BARRIER_LOCAL
_sortBins[(((lID >> 3) << 4) | (lID & 7) | 8)] += (_sortBins[(((lID >> 3) << 4) | 7)]) & (MASK_KEY << SHIFT_KEY); BARRIER_LOCAL
_sortBins[(((lID >> 4) << 5) | (lID & 15) | 16)] += (_sortBins[(((lID >> 4) << 5) | 15)]) & (MASK_KEY << SHIFT_KEY); BARRIER_LOCAL
_sortBins[(((lID >> 5) << 6) | (lID & 31) | 32)] += (_sortBins[(((lID >> 5) << 6) | 31)]) & (MASK_KEY << SHIFT_KEY); BARRIER_LOCAL
_sortBins[(((lID >> 6) << 7) | (lID & 63) | 64)] += (_sortBins[(((lID >> 6) << 7) | 63)]) & (MASK_KEY << SHIFT_KEY); BARRIER_LOCAL
if (lID > 0) if ( (((_sortBins[lID] >> SHIFT_KEY) & MASK_KEY) >= targetCount)
&& (((_sortBins[lID-1] >> SHIFT_KEY) & MASK_KEY) < targetCount) ) _targetBin = lID;
if ( (((_sortBins[lID+WG_WIDTH] >> SHIFT_KEY) & MASK_KEY) >= targetCount)
&& (((_sortBins[lID+WG_WIDTH-1] >> SHIFT_KEY) & MASK_KEY) < targetCount) ) _targetBin = lID+WG_WIDTH;
#elif (WG_WIDTH == 128000) // was buggy on OCL AMD driver (bug fixed for some months)
_sortBins[(((lID >> 0) << 1) | (lID & 0) | 1)] += (_sortBins[(((lID >> 0) << 1) | 0)]) & (MASK_KEY << SHIFT_KEY); BARRIER_LOCAL
_sortBins[(((lID >> 1) << 2) | (lID & 1) | 2)] += (_sortBins[(((lID >> 1) << 2) | 1)]) & (MASK_KEY << SHIFT_KEY); BARRIER_LOCAL
_sortBins[(((lID >> 2) << 3) | (lID & 3) | 4)] += (_sortBins[(((lID >> 2) << 3) | 3)]) & (MASK_KEY << SHIFT_KEY); BARRIER_LOCAL
_sortBins[(((lID >> 3) << 4) | (lID & 7) | 8)] += (_sortBins[(((lID >> 3) << 4) | 7)]) & (MASK_KEY << SHIFT_KEY); BARRIER_LOCAL
_sortBins[(((lID >> 4) << 5) | (lID & 15) | 16)] += (_sortBins[(((lID >> 4) << 5) | 15)]) & (MASK_KEY << SHIFT_KEY); BARRIER_LOCAL
_sortBins[(((lID >> 5) << 6) | (lID & 31) | 32)] += (_sortBins[(((lID >> 5) << 6) | 31)]) & (MASK_KEY << SHIFT_KEY); BARRIER_LOCAL
_sortBins[(((lID >> 6) << 7) | (lID & 63) | 64)] += (_sortBins[(((lID >> 6) << 7) | 63)]) & (MASK_KEY << SHIFT_KEY); BARRIER_LOCAL
_sortBins[(((lID >> 7) << 8) | (lID &127) |128)] += (_sortBins[(((lID >> 7) << 8) |127)]) & (MASK_KEY << SHIFT_KEY); BARRIER_LOCAL
if (lID > 0) if ( (((_sortBins[lID] >> SHIFT_KEY) & MASK_KEY) >= targetCount)
&& (((_sortBins[lID-1] >> SHIFT_KEY) & MASK_KEY) < targetCount) ) _targetBin = lID;
if ( (((_sortBins[lID+WG_WIDTH] >> SHIFT_KEY) & MASK_KEY) >= targetCount)
&& (((_sortBins[lID+WG_WIDTH-1] >> SHIFT_KEY) & MASK_KEY) < targetCount) ) _targetBin = lID+WG_WIDTH;
#elif (WG_WIDTH == 256000) // buggy now with Vulkan
if (lID<128) _sortBins[(((lID >> 0) << 1) | (lID & 0) | 1)] += (_sortBins[(((lID >> 0) << 1) | 0)]) & (MASK_KEY << SHIFT_KEY); BARRIER_LOCAL
if (lID<128) _sortBins[(((lID >> 1) << 2) | (lID & 1) | 2)] += (_sortBins[(((lID >> 1) << 2) | 1)]) & (MASK_KEY << SHIFT_KEY); BARRIER_LOCAL
if (lID<128) _sortBins[(((lID >> 2) << 3) | (lID & 3) | 4)] += (_sortBins[(((lID >> 2) << 3) | 3)]) & (MASK_KEY << SHIFT_KEY); BARRIER_LOCAL
if (lID<128) _sortBins[(((lID >> 3) << 4) | (lID & 7) | 8)] += (_sortBins[(((lID >> 3) << 4) | 7)]) & (MASK_KEY << SHIFT_KEY); BARRIER_LOCAL
if (lID<128) _sortBins[(((lID >> 4) << 5) | (lID & 15) | 16)] += (_sortBins[(((lID >> 4) << 5) | 15)]) & (MASK_KEY << SHIFT_KEY); BARRIER_LOCAL
if (lID<128) _sortBins[(((lID >> 5) << 6) | (lID & 31) | 32)] += (_sortBins[(((lID >> 5) << 6) | 31)]) & (MASK_KEY << SHIFT_KEY); BARRIER_LOCAL
if (lID<128) _sortBins[(((lID >> 6) << 7) | (lID & 63) | 64)] += (_sortBins[(((lID >> 6) << 7) | 63)]) & (MASK_KEY << SHIFT_KEY); BARRIER_LOCAL
if (lID<128) _sortBins[(((lID >> 7) << 8) | (lID &127) |128)] += (_sortBins[(((lID >> 7) << 8) |127)]) & (MASK_KEY << SHIFT_KEY); BARRIER_LOCAL
if (lID > 0) if ( (((_sortBins[lID] >> SHIFT_KEY) & MASK_KEY) >= targetCount)
&& (((_sortBins[lID-1] >> SHIFT_KEY) & MASK_KEY) < targetCount) ) _targetBin = lID;
#else // ok with Vulkan
if (lID==0)
{
if ( ((_sortBins[0] >> SHIFT_KEY) & MASK_KEY) < targetCount)
{
for (uint i=1; i<binRes; i++)
{
_sortBins[i] += (_sortBins[i-1]) & (MASK_KEY << SHIFT_KEY);
if ( ((_sortBins[i] >> SHIFT_KEY) & MASK_KEY) >= targetCount)
{
_targetBin = i;
break;
}
}
}
}
#endif
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment