I'm trying to make a unordered list with consume and append buffers but getting all zeros.
MY shader code
struct InputData
{
float4 data;
};
struct OutputData
{
float data;
};
ConsumeStructuredBuffer<InputData> gInput : register(u0);
AppendStructuredBuffer<OutputData> gOutput : register(u1);
[numthreads(32, 1, 1)]
void CS(int3 dtid : SV_DispatchThreadID)
{
OutputData output;
InputData input = gInput.Consume();
float len = length(input.data);
output.data = len;
gOutput.Append(output);
}
And my buffers being built
void VecAddApp::BuildBuffersAndViews()
{
std::vector<Data> dataA(mNumElements);
for(int i = 0; i < 32; i++)
{
dataA[i].v1 = XMFLOAT4(i, i, i,0);
}
// Create a buffer to be bound as a shader input (D3D11_BIND_SHADER_RESOURCE).
D3D11_BUFFER_DESC inputDesc;
inputDesc.Usage = D3D11_USAGE_DEFAULT;
inputDesc.ByteWidth = sizeof(Data) * mNumElements;
inputDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_UNORDERED_ACCESS;
inputDesc.CPUAccessFlags = 0;
inputDesc.StructureByteStride = sizeof(Data);
inputDesc.MiscFlags =0 ;
D3D11_SUBRESOURCE_DATA vinitDataA;
vinitDataA.pSysMem = &dataA[0];
ID3D11Buffer* bufferA = 0;
HR(md3dDevice->CreateBuffer(&inputDesc, &vinitDataA, &bufferA));
// Create a read-write buffer the compute shader can write to (D3D11_BIND_UNORDERED_ACCESS).
D3D11_BUFFER_DESC outputDesc;
outputDesc.Usage = D3D11_USAGE_DEFAULT;
outputDesc.ByteWidth = sizeof(Data) * mNumElements;
outputDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_UNORDERED_ACCESS;
outputDesc.CPUAccessFlags = 0;
outputDesc.StructureByteStride = 0;
outputDesc.MiscFlags = 0;
HR(md3dDevice->CreateBuffer(&outputDesc, 0, &mOutputBuffer));
// Create a system memory version of the buffer to read the results back from.
outputDesc.Usage = D3D11_USAGE_STAGING;
outputDesc.BindFlags = 0;
outputDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
HR(md3dDevice->CreateBuffer(&outputDesc, 0, &mOutputDebugBuffer));
D3D11_UNORDERED_ACCESS_VIEW_DESC uavDesc2;
uavDesc2.Format =DXGI_FORMAT_R32G32B32A32_FLOAT;
uavDesc2.ViewDimension = D3D11_UAV_DIMENSION_BUFFER;
uavDesc2.Buffer.FirstElement = 0;
uavDesc2.Buffer.Flags = 0;
uavDesc2.Buffer.NumElements = mNumElements;
md3dDevice->CreateUnorderedAccessView(bufferA, &uavDesc2, &mInputASRV);
D3D11_UNORDERED_ACCESS_VIEW_DESC uavDesc;
uavDesc.Format =DXGI_FORMAT_R32G32B32A32_FLOAT;
uavDesc.ViewDimension = D3D11_UAV_DIMENSION_BUFFER;
uavDesc.Buffer.FirstElement = 0;
uavDesc.Buffer.Flags = 0;
uavDesc.Buffer.NumElements = mNumElements;
md3dDevice->CreateUnorderedAccessView(mOutputBuffer, &uavDesc, &mOutputUAV);
// Views hold references to buffers, so we can release these.
ReleaseCOM(bufferA);
}
Does anyone see any problems here?