• Advertisement
Sign in to follow this  

Structured Buffer - Not being written to

This topic is 1409 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hi guys.

 

So I'm having a small problem here, I've got a structured buffer, in which I want to fill some data, the structure looks like this: ( The whole point is converting the individual textures ( deferred rendering ), into a readable buffer ) 

struct GBElement
{
	// World Space Positions
	D3DXVECTOR4 positionWS;

	// World Space normals
	D3DXVECTOR4 normalWS;

	// Roughness
	float roughness;

	// Special Post Processing Flag
	float post_flag;
};

AFAIK, the elements do not have to be 16 aligned.

 

Now this is how I create my structured buffer: ( For the stride I've simply used sizeof(GBElement), where count is the number of elements )

D3D11_BUFFER_DESC bufferDesc;
int stride = size;
bufferDesc.ByteWidth = stride*count;
bufferDesc.Usage = D3D11_USAGE_DEFAULT;
bufferDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_UNORDERED_ACCESS;
bufferDesc.CPUAccessFlags = 0;
bufferDesc.MiscFlags = D3D11_RESOURCE_MISC_BUFFER_STRUCTURED;
bufferDesc.StructureByteStride = stride;
if(pDev->CreateBuffer(&bufferDesc,NULL,&pp->pData)!=S_OK)
	return NULL;

D3D11_UNORDERED_ACCESS_VIEW_DESC uavDesc;
uavDesc.Format = DXGI_FORMAT_UNKNOWN;
uavDesc.ViewDimension = D3D11_UAV_DIMENSION_BUFFER;
uavDesc.Buffer.FirstElement = 0;
uavDesc.Buffer.Flags = 0;
uavDesc.Buffer.NumElements = count; 
if(pDev->CreateUnorderedAccessView(pp->pData,&uavDesc,&pp->pUAV)!=S_OK)
	return NULL;

D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
srvDesc.Format = DXGI_FORMAT_UNKNOWN;
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_BUFFER;
srvDesc.Buffer.ElementOffset = 0;
srvDesc.Buffer.ElementWidth = count;
if(pDev->CreateShaderResourceView(pp->pData,&srvDesc,&pp->pSRV)!=S_OK) 
	return NULL;

The actual writing is done in the compute shader, so the buffer needs to be sent as a UAV:

pDevcon->OMSetRenderTargetsAndUnorderedAccessViews(
			0, 0, 0,
			start, 1, &p->pUAV, 0
			);

And the actual writing: ( Just testing, so some areas might not even give any sense, but for now all that matters is that it's being properly written to )

// Needed resources for decoding
cbuffer CBuffer : register(b0)
{
	matrix ViewMatrix;
	matrix ProjectionMatrix;
	matrix ViewInvMatrix;
	matrix ProjectionInvMatrix;

	float2 Screen;
	float2 pad;
};

// Input resources
// TODO: Single Channel Depth, reconstruct later ( R32_FLOAT )
Texture2D tPosXYZ : register(t0);
Texture2D tNormXYRoughZPostA : register(t1);
Texture2D tDiffXYZ : register(t2);

// Structure
struct GB
{
	// World Space Positions
	float4 positionWS;

	// World Space normals
	float4 normalWS;

	// Roughness
	float roughness;

	// Special Post Processing Flag
	float post_flag;
};

// Output Buffer
RWStructuredBuffer<GB> bOutput : register(u0);

[numthreads(32, 32, 1)] // Optimum
void main( uint3 DTid : SV_DispatchThreadID )
{
	// New GB Instance
	GB gb = (GB)0;
	gb.positionWS = float4(1,0,0,1);
	gb.normalWS = float4(1,0,0,1);
	gb.roughness = 1;
	gb.post_flag = 1;

	bOutput[DTid.y*Screen.x + DTid.x] = gb;
	bOutput[0] = gb;
}

Now what on earth have I done wrong this time?

 

Thank you for your time wink.png .

-MIGI0027

Share this post


Link to post
Share on other sites
Advertisement
Setting UAVs with OMSetRenderTargetsAndUnorderedAccessViews is meant for pixel shaders. For compute shaders you need to use CSSetUnorderedAccessViews.

Share this post


Link to post
Share on other sites

Setting UAVs with OMSetRenderTargetsAndUnorderedAccessViews is meant for pixel shaders. For compute shaders you need to use CSSetUnorderedAccessViews.

 

This is the 2nd time I've done that, thank you, I'll test it right away.

Share this post


Link to post
Share on other sites

Works fine, now, another problem happy.png .

 

I'm unable to read from it, so basically this is what I'm doing:

 

Pixel Shader where it's being read from:

// Structure
struct GB
{
	// World Space Positions
	float4 positionWS;

	// World Space normals
	float4 normalWS;

	// Roughness
	float roughness;

	// Special Post Processing Flag
	float post_flag;
};

// Output Buffer
StructuredBuffer<GB> bGBuffer : register(t3);

float4 PS...
    return bGBuffer[0].positionWS;

But it returns black, and as seen above, I filled positionWS with (1,0,0,1).

 

How I bind the buffer:

...
pDevcon->PSSetShaderResources(3, 1, &p->pSRV);

Again, thank you for your time.

Share this post


Link to post
Share on other sites

Lucky guess: Potential read-write hazard. The API nullifies attempts to bind a resource for both in- and output. First set your compute shader UAV slot to NULL, only then set set the pixel shader SRV. The debug layer should complain such things, though.

 

Don't hesitate to inspect bindings and even buffer content with your graphics debugger / PIX.

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement