DirectX Structured Buffer problem

Started by
9 comments, last by MJP 10 years, 8 months ago

Hi, I'm trying to make a game using directx but I'm finding some problems when trying to bind a structured buffer resource to my Geometry Shader. It simply won't even bother to bind the resource to a shader resource slot, despite it being created succefuly.

I'm creating the buffer like this:


D3D11_BUFFER_DESC descGPUBuffer;
 
ZeroMemory(&descGPUBuffer, sizeof(descGPUBuffer));
descGPUBuffer.BindFlags = D3D11_BIND_SHADER_RESOURCE;
descGPUBuffer.ByteWidth = vertexNum *
 
sizeof(UINT);
descGPUBuffer.MiscFlags = D3D11_RESOURCE_MISC_BUFFER_STRUCTURED;
descGPUBuffer.StructureByteStride = sizeof(UINT);
 
 
UINT* colorIndices = new UINT[vertexNum];
 
 
ZeroMemory(colorIndices, vertexNum * sizeof(UINT));
 
 
for(int x = 0;x < vertexNum;x++)
{
    colorIndices[x] = 1;
}
 
 
D3D11_SUBRESOURCE_DATA colorData;
 
 
ZeroMemory(&colorData, sizeof(colorData));
colorData.pSysMem = colorIndices;
dev->CreateBuffer(&descGPUBuffer, &colorData, &colorBuffer);
 
 
D3D11_BUFFER_DESC descBuf;
 
 
ZeroMemory( &descBuf, sizeof(descBuf) );
colorBuffer->GetDesc( &descBuf );
 
 
D3D11_SHADER_RESOURCE_VIEW_DESC descSRV;
 
 
ZeroMemory( &descSRV, sizeof(descSRV) );
descSRV.ViewDimension =
 
D3D11_SRV_DIMENSION_BUFFEREX;
descSRV.BufferEx.FirstElement = 0;
descSRV.Format =
 
DXGI_FORMAT_UNKNOWN;
descSRV.BufferEx.NumElements = descBuf.ByteWidth / descBuf.StructureByteStride;
dev->CreateShaderResourceView(colorBuffer.Get(), &descSRV, &colorSRV);
 
 
devcon->GSSetShaderResources(0, 1, &colorSRV);

and my shader where the structured buffer is declared is like this:


StructuredBuffer<uint> BufferColors: register(t0);
 
GSOutput calcVertex(float4 position, float3 normal)
{
    GSOutput vertex;
 
 
    float4 worldPosition;
    vertex.position = mul(final, position);
    vertex.normal = normal;
    worldPosition = mul(position, world);
    vertex.viewDirection = cameraPosition.xyz - worldPosition.xyz;
    vertex.viewDirection = normalize(vertex.viewDirection);
    return vertex;
}
 
 
[maxvertexcount(24)]
void main(point float4 input_point[1] : SV_POSITION, uint primID : SV_PrimitiveID,
inout TriangleStream< GSOutput > output)

etc...

Can you guys please help me? I'm desperate I can't really find the error

Advertisement

How have you determined that it's not binding the resource? What's the actual behavior that you're experiencing?

Have you enabled the debug layer for your device (by passing D3D11_CREATE_DEVICE_DEBUG to D3D11CreateDevice) and checked the output window for warnings or errors?

Also, in the future please use the "code" tags when posting source code. It makes it much easier to read posts with embedded code in them. I added them to your post for you, so you can edit your post to see how to do it for future reference.

How have you determined that it's not binding the resource? What's the actual behavior that you're experiencing?

Have you enabled the debug layer for your device (by passing D3D11_CREATE_DEVICE_DEBUG to D3D11CreateDevice) and checked the output window for warnings or errors?

Also, in the future please use the "code" tags when posting source code. It makes it much easier to read posts with embedded code in them. I added them to your post for you, so you can edit your post to see how to do it for future reference.

I have used the visual studio graphical debugger and checked the geometry shader pipeline stage that is the one I'm trying to bind the buffer to, and in the resource slot list all slots were empty. Thanks for the code tag, it's my first time in this forum. The behavior that I'm experiencing is that for any index that I try to retrieve data from the buffer it gives me 0, wich is the defined behavior for trying to access HLSL non-initialized data.

And yeah, I have the debug layer on. All the function calls about the buffer CPU side returns OK values.

Also, I set the whole buffer to the value '1' for testing purposes. Still, trying to access the buffer aways return zeroes.

No one?

There are cases where the runtime will silently refuse to bind SRV or it will unbind it (usually to avoiding having the same resource bound as both an input and an output), but in those cases the debug layer will output an error telling you that this is happening. Otherwise the only time a resource will become unbound will be if you bind NULL for that slot, or if you call ClearState on the device context.

From looking at your code it looks like you're binding the resource once during initialization, so I couldn't say if you're doing something during the actual render loop that would cause the resource to become unbound. I would try binding it ever frame right before you issue the Draw call, so that you can ensure that it's bound. If it still doesn't seem to be working correctly, you can check the graphics debugger to see if there's actually the correct SRV pointer being passed to GSSetShaderResources.

There are cases where the runtime will silently refuse to bind SRV or it will unbind it (usually to avoiding having the same resource bound as both an input and an output), but in those cases the debug layer will output an error telling you that this is happening. Otherwise the only time a resource will become unbound will be if you bind NULL for that slot, or if you call ClearState on the device context.

From looking at your code it looks like you're binding the resource once during initialization, so I couldn't say if you're doing something during the actual render loop that would cause the resource to become unbound. I would try binding it ever frame right before you issue the Draw call, so that you can ensure that it's bound. If it still doesn't seem to be working correctly, you can check the graphics debugger to see if there's actually the correct SRV pointer being passed to GSSetShaderResources.

Sorry now I see that I missunderstood about the debug layer... I'm trying to use it now but I can't find the output anywhere. Where can I find the debug layer output?

In Visual Studio it's the debug output window.

In Visual Studio it's the debug output window.

The same place where it says that threads have stop running and compile successfull ad stuff like that? Because there I see no debug output.

That's the build output.

Menu Debug->Windows->Output (VS 2010, at least)

Oh my god I solved it. I can't believe it. I was using a com smart pointer for the srv. I noticed that when I called setShaderResource on the object, the pointer would be set to 0. Then I just made it a common native pointer and the problem was solved. Don't know what caused the COM pointer to be reset, maybe some crazy bug but, it doesn't matter.

Damn you Microsoft. It lay traps everywhere.

Edit:

Wow, I was actually quite stupid. I just read the comPtr class docs and if you use the operator & on the object to get the pointer, it releases the object. Gotta be careful.

This topic is closed to new replies.

Advertisement