Jump to content

  • Log In with Google      Sign In   
  • Create Account


DirectX Structured Buffer problem


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
10 replies to this topic

#1 bruno087   Members   -  Reputation: 121

Like
0Likes
Like

Posted 01 September 2013 - 09:56 PM

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



Sponsor:

#2 MJP   Moderators   -  Reputation: 10632

Like
0Likes
Like

Posted 01 September 2013 - 11:20 PM

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.


Edited by MJP, 01 September 2013 - 11:22 PM.


#3 bruno087   Members   -  Reputation: 121

Like
1Likes
Like

Posted 02 September 2013 - 04:51 AM

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.


Edited by bruno087, 02 September 2013 - 04:56 AM.


#4 bruno087   Members   -  Reputation: 121

Like
0Likes
Like

Posted 02 September 2013 - 07:41 PM

No one?



#5 MJP   Moderators   -  Reputation: 10632

Like
0Likes
Like

Posted 03 September 2013 - 12:45 AM

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.



#6 bruno087   Members   -  Reputation: 121

Like
0Likes
Like

Posted 03 September 2013 - 09:32 AM

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?



#7 unbird   Crossbones+   -  Reputation: 4973

Like
0Likes
Like

Posted 03 September 2013 - 09:44 AM

In Visual Studio it's the debug output window.



#8 bruno087   Members   -  Reputation: 121

Like
0Likes
Like

Posted 03 September 2013 - 10:38 AM

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.



#9 unbird   Crossbones+   -  Reputation: 4973

Like
0Likes
Like

Posted 03 September 2013 - 10:50 AM

That's the build output.

 

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


Edited by unbird, 03 September 2013 - 10:51 AM.


#10 bruno087   Members   -  Reputation: 121

Like
3Likes
Like

Posted 03 September 2013 - 11:02 AM

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.


Edited by bruno087, 03 September 2013 - 02:10 PM.


#11 MJP   Moderators   -  Reputation: 10632

Like
0Likes
Like

Posted 03 September 2013 - 03:15 PM

Yeah I'm guessing it does that to prevent leaks in the case where you pass the address of the pointer to a factory function that puts its output into that pointer (like CreateTexture2D, for instance). If it didn't Release the pointer, then you would leak the resource when the factory function overwrites the value of the pointer.






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