Jump to content
  • Advertisement
Sign in to follow this  
Xeile

DX11 [DX11+HLSL] SetRenderTargets

This topic is 2180 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

Hello everyone,

I ran into a minor issue with my littl' hobby project. Shader Model 5 seems to support a new render state command SetRenderTargets.

As you might know these render state sets just call the according ID3D11DeviceContext method. It was there where I ran into an issue. I could succesfully set a single render target (and depth stencil) within HLSL, however, whenever I tried multiple render targets it failed.

There seems to be some confusion which of the two methods, ID3D11DeviceContext::OMSetRenderTargets or ID3D11DeviceContext::OMSetRenderTargetsAndUnorderedAccessViews, should be called. According to PIX (failing to record a specific D3D call) it turns out that the latter of the two method is called, even though I don't use any unordered access views.

Has anyone run into this issue aswell, I find it exceedingly difficult to find any documentation about this.

Kind regards,

Xeile

Share this post


Link to post
Share on other sites
Advertisement
So this little used functionality was available in DX10 effects, though it was found to be undocumented before about a year ago.

Do you have any further error spew from the debug layer? Calling OMSetRenderTargetsAndUnorderdAccessViews() should be safe with the UAV count of zero and null as the UAV pointer. What is Effects11 doing if you step through the source code? What does the effects shader asm produce? I'm just wondering if it's a compiler bug, and Effects bug, or a bug in your app. Which SDK release are you using?

PIX seems to still be missing various functionality, including support of UAV's.

Share this post


Link to post
Share on other sites
In what may or may not be a related topic - I have never been able to get the OMSetRenderTargetsAndUnorderedAccessViews method to work at all, even with an array of null pointers for the inputs. Has anyone seen a functioning usage of this method in one of the samples? It seems quite rare that a sample utilizes a pixel shader with an unordered access view...

I'm just wondering if it is me, or if these two issues could be related (i.e. the effects11 framework using this method and having the same issues...).

Share this post


Link to post
Share on other sites

I have never been able to get the OMSetRenderTargetsAndUnorderedAccessViews method to work at all


I have the same problem. I am just trying to test if I can input one color into a buffer uav and then output that color into my scene.

Here is where I set up the buffer with uav and srv:

D3D11_BUFFER_DESC voxBufDesc;
ZeroMemory( &voxBufDesc, sizeof(voxBufDesc) );
voxBufDesc.ByteWidth = sizeof(float)*4*10;
voxBufDesc.Usage = D3D11_USAGE_DEFAULT;
voxBufDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_UNORDERED_ACCESS;
voxBufDesc.CPUAccessFlags = 0;
voxBufDesc.MiscFlags = D3D11_RESOURCE_MISC_BUFFER_STRUCTURED;
voxBufDesc.StructureByteStride = sizeof(float)*4;

d3dResult = d3dDevice_->CreateBuffer(&voxBufDesc, NULL, &voxBuf);

if( FAILED( d3dResult ) )
{
DXTRACE_MSG( "Failed to create the voxBuf!" );
MessageBox(0, "Error creating voxBuf!", "Compiler Error", MB_OK);
return false;
}

D3D11_UNORDERED_ACCESS_VIEW_DESC voxUavDesc;
voxUavDesc.Format = DXGI_FORMAT_UNKNOWN;
voxUavDesc.ViewDimension = D3D11_UAV_DIMENSION_BUFFER;
voxUavDesc.Buffer.FirstElement = 0;
voxUavDesc.Buffer.NumElements = voxBufDesc.ByteWidth/voxBufDesc.StructureByteStride;
voxUavDesc.Buffer.Flags = D3D11_BUFFER_UAV_FLAG_COUNTER;

d3dResult = d3dDevice_->CreateUnorderedAccessView(voxBuf, &voxUavDesc, &voxUAV);

if( FAILED( d3dResult ) )
{
DXTRACE_MSG( "Failed to create the UAV!" );
MessageBox(0, "Error creating UAV!", "Compiler Error", MB_OK);
return false;
}

D3D11_SHADER_RESOURCE_VIEW_DESC voxSrvDesc;
voxSrvDesc.Format = DXGI_FORMAT_UNKNOWN;
voxSrvDesc.ViewDimension = D3D11_SRV_DIMENSION_BUFFER;
voxSrvDesc.Buffer.FirstElement = 0;
voxSrvDesc.Buffer.NumElements = voxBufDesc.ByteWidth/voxBufDesc.StructureByteStride;

d3dResult = d3dDevice_->CreateShaderResourceView(voxBuf, &voxSrvDesc, &voxSRV);

if( FAILED( d3dResult) )
{
DXTRACE_MSG( "Failed to create the SRV!" );
MessageBox(0, "Error creating SRV!", "Compiler Error", MB_OK);
return false;
}

D3D11_TEXTURE2D_DESC texVoxDesc;
texVoxDesc.Width = 128;
texVoxDesc.Height = 128;
texVoxDesc.MipLevels = 1;
texVoxDesc.ArraySize = 1;
texVoxDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
texVoxDesc.SampleDesc.Count = 1;
texVoxDesc.SampleDesc.Quality = 0;
texVoxDesc.Usage = D3D11_USAGE_DEFAULT;
texVoxDesc.BindFlags = D3D11_BIND_RENDER_TARGET;
texVoxDesc.CPUAccessFlags = 0;
texVoxDesc.MiscFlags = 0;

d3dResult = d3dDevice_->CreateTexture2D(&texVoxDesc, 0, &texVoxDummy);

if( FAILED( d3dResult ) )
{
DXTRACE_MSG( "Failed to create the tex2D!" );
MessageBox(0, "Error creating tex2D!", "Compiler Error", MB_OK);
return false;
}

D3D11_RENDER_TARGET_VIEW_DESC rtvVoxDesc;
rtvVoxDesc.Format = texVoxDesc.Format;
rtvVoxDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
rtvVoxDesc.Texture2D.MipSlice = 0;

d3dResult = d3dDevice_->CreateRenderTargetView(texVoxDummy, &rtvVoxDesc, &rtvVoxDummy);

if( FAILED( d3dResult ) )
{
DXTRACE_MSG( "Failed to create the rtv!" );
MessageBox(0, "Error creating rtv!", "Compiler Error", MB_OK);
return false;
}



After that I do this:

const UINT clearValue[4] = { 0u, 0u, 0u, 0u };
d3dContext_->ClearUnorderedAccessViewUint(voxUAV, clearValue);
d3dContext_->OMSetRenderTargetsAndUnorderedAccessViews(1, &rtvVoxDummy, NULL, 1, 1, &voxUAV, NULL);
d3dContext_->VSSetShader(testVS, NULL, 0);
d3dContext_->PSSetShader(testPS, NULL, 0);
d3dContext_->OMSetRenderTargetsAndUnorderedAccessViews(0, NULL, NULL, 0, 0, NULL, NULL);


Here's my test.hlsl:

RWStructuredBuffer<float4> voxIn : register(u1);

struct VS_IN
{
float4 pos : POSITION;
};

struct PS_IN
{
float4 pos : SV_POSITION;
};

PS_IN VS_Test(VS_IN input)
{
PS_IN output = ( PS_IN )0;

output.pos = input.pos;
return output;
}

float4 PS_Test(PS_IN input) : SV_TARGET
{
float4 color = float4(0,0,0,0);
voxIn[0] = float4(1,1,0,1);
return color;
}



Everything works when I use a compute shader to write to the buffer UAV and then render the SRV to a quad.
But when I try this method to use a pixel shader to write to the buffer UAV and then render the SRV to a quad, it comes out black. Edited by gboxentertainment

Share this post


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

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!