有人可以告诉我 DirectX 11 是否可以使用以下计算着色器?
我希望 Dispatch 中的第一个线程访问缓冲区(g_positionsGrid)中的元素,以使用临时值设置(比较交换)该元素,以表示它正在采取一些行动。
在这种情况下,临时值为 0xffffffff,第一个线程将继续并从结构化附加缓冲区(g_positions)分配一个值并将其分配给该元素。
所以到目前为止一切都很好,但是调度中的其他线程可以进入比较交换和第一个线程的分配之间,因此需要等到分配索引可用。我这样做是忙着等待,即while循环。
然而遗憾的是,这只是锁定了 GPU,因为我假设第一个线程写入的值不会传播到卡在 while 循环中的其他线程。
有没有办法让这些线程看到那个值?
谢谢你的帮助!
RWStructuredBuffer<float3> g_positions : register(u1);
RWBuffer<uint> g_positionsGrid : register(u2);
void AddPosition( uint address, float3 pos )
{
uint token = 0;
// Assign a temp value to signify first thread has accessed this particular element
InterlockedCompareExchange(g_positionsGrid[address], 0, 0xffffffff, token);
if(token == 0)
{
//If first thread in here allocate index and assign value which
//hopefully the other threads will pick up
uint index = g_positions.IncrementCounter();
g_positionsGrid[address] = index;
g_positions[index].m_position = pos;
}
else
{
if(token == 0xffffffff)
{
uint index = g_positionsGrid[address];
//This never meets its condition
[allow_uav_condition]
while(index == 0xffffffff)
{
//For some reason this thread never gets the assignment
//from the first thread assigned above
index = g_positionsGrid[address];
}
g_positions[index].m_position = pos;
}
else
{
//Just assign value as the first thread has already allocated a valid slot
g_positions[token].m_position = pos;
}
}
}