Structured Buffer - Not being written to

Started by
4 comments, last by Migi0027 10 years, 1 month ago

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

FastCall22: "I want to make the distinction that my laptop is a whore-box that connects to different network"

Blog about... stuff (GDNet, WordPress): www.gamedev.net/blog/1882-the-cuboid-zone/, cuboidzone.wordpress.com/

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

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.

FastCall22: "I want to make the distinction that my laptop is a whore-box that connects to different network"

Blog about... stuff (GDNet, WordPress): www.gamedev.net/blog/1882-the-cuboid-zone/, cuboidzone.wordpress.com/

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.

FastCall22: "I want to make the distinction that my laptop is a whore-box that connects to different network"

Blog about... stuff (GDNet, WordPress): www.gamedev.net/blog/1882-the-cuboid-zone/, cuboidzone.wordpress.com/

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.

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

FastCall22: "I want to make the distinction that my laptop is a whore-box that connects to different network"

Blog about... stuff (GDNet, WordPress): www.gamedev.net/blog/1882-the-cuboid-zone/, cuboidzone.wordpress.com/

This topic is closed to new replies.

Advertisement