Jump to content

  • Log In with Google      Sign In   
  • Create Account

We're offering banner ads on our site from just $5!

1. Details HERE. 2. GDNet+ Subscriptions HERE. 3. Ad upload HERE.


Structured Buffer - Not being written to


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
5 replies to this topic

#1 Migi0027   Crossbones+   -  Reputation: 2111

Like
0Likes
Like

Posted 16 March 2014 - 09:31 AM

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


Hi! Cuboid Zone
The Rule: Be polite, be professional, but have a plan to steal all their shaders!

Sponsor:

#2 unbird   Crossbones+   -  Reputation: 5992

Like
0Likes
Like

Posted 16 March 2014 - 10:20 AM

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

#3 Migi0027   Crossbones+   -  Reputation: 2111

Like
0Likes
Like

Posted 16 March 2014 - 11:03 AM

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.


Hi! Cuboid Zone
The Rule: Be polite, be professional, but have a plan to steal all their shaders!

#4 Migi0027   Crossbones+   -  Reputation: 2111

Like
0Likes
Like

Posted 16 March 2014 - 12:23 PM

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.


Hi! Cuboid Zone
The Rule: Be polite, be professional, but have a plan to steal all their shaders!

#5 unbird   Crossbones+   -  Reputation: 5992

Like
0Likes
Like

Posted 16 March 2014 - 01:00 PM

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.



#6 Migi0027   Crossbones+   -  Reputation: 2111

Like
0Likes
Like

Posted 16 March 2014 - 01:22 PM

Finally, the red screen came to me, thank you for your help. smile.png


Hi! Cuboid Zone
The Rule: Be polite, be professional, but have a plan to steal all their shaders!




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS