Jump to content
  • Advertisement
Sign in to follow this  
ngub05

DX12 [D3D12] CreateCommittedResource fails!

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

CreateCommittedResource returns E_INVALIDARG One or more arguments are invalid.

I double checked my code and couldn't find where I'm giving invalid argument.

const FLOAT clearCol[] = { 0.0f, 0.2f, 0.4f, 1.0f };
const CD3DX12_CLEAR_VALUE clearValue(DXGI_FORMAT_R8G8B8A8_UNORM, clearCol);

hr = g_pDevice->CreateCommittedResource( &CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_UPLOAD),
		D3D12_HEAP_FLAG_NONE, // ?  D3D12_HEAP_FLAG_ALLOW_ONLY_RT_DS_TEXTURES
		&CD3DX12_RESOURCE_DESC::Tex2D(DXGI_FORMAT_R8G8B8A8_UNORM, width, height, 1, 0, 1, 0, D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET, D3D12_TEXTURE_LAYOUT_UNKNOWN, 0), //Arraysize was 1
		D3D12_RESOURCE_STATE_RENDER_TARGET,
		&clearValue, 
		IID_PPV_ARGS(&g_pUpHeapBuffer) );

if (FAILED(hr)) { // fails
	return false;
}

Image width = height = 225px

And here's the heap def: ID3D12Resource* g_pUpHeapBuffer;

 

Share this post


Link to post
Share on other sites
Advertisement

From MSDN:

"When a resource is created together with a D3D12_HEAP_TYPE_UPLOAD heap, InitialResourceState must be D3D12_RESOURCE_STATE_GENERIC_READ."

 

It's really odd that the debug layer doesn't say anything about that.

Share this post


Link to post
Share on other sites

What's strange is that I can create a buffer with the same flags.

CD3DX12_RESOURCE_DESC::Buffer(8 * 1024 * 1024);

Share this post


Link to post
Share on other sites

Got my error.

 

D3D12 ERROR: ID3D12Device::CreateCommittedResource: A texture resource cannot be created on a D3D12_HEAP_TYPE_UPLOAD or D3D12_HEAP_TYPE_READBACK heap. Investigate CopyTextureRegion to copy texture data in CPU accessible buffers, or investigate D3D12_HEAP_TYPE_CUSTOM and WriteToSubresource for UMA adapter optimizations. [ STATE_CREATION ERROR #638: CREATERESOURCEANDHEAP_INVALIDHEAPPROPERTIES]

 

?I'm surprised that it's not allowed to create a texture resource on upload heap!

What will I do next? I was planning to map and copy my texture from upload to default heap.

Edited by ngub05

Share this post


Link to post
Share on other sites

That's correct, no textures in Upload or Readback heaps.

 

As per the error, data you want to upload to the texture in the DEFAULT heap should reside in a Buffer in the Upload heap. You then need to use CopyTextureRegion to copy from the buffer into the Texture using either the graphics or copy command queue.

 

When you fill out the D3D12_COPY_TEXTURE_LOCATION corresponding to pSrc you'll want to fill out the D3D12_PLACED_SUBRESOURCE_FOOTPRINT so that D3D knows how the data in your buffer is laid out (eg, Pitch). This is an example from my own code:

D3D12_PLACED_SUBRESOURCE_FOOTPRINT footprint = {};
footprint.Footprint.Width = textureWidth;
footprint.Footprint.Height = textureHeight;
footprint.Footprint.Depth = 1;
footprint.Footprint.RowPitch = uploadBufferRowPitchInBytes;
footprint.Footprint.Format = textureFormat;

copyCommandList->Reset();

CD3DX12_TEXTURE_COPY_LOCATION src(textureUploadBuffer, footprint);
CD3DX12_TEXTURE_COPY_LOCATION dest(defaultHeapTexture, 0);

copyCommandList->CopyTextureRegion(&dest, 0, 0, 0, &src, nullptr);
Edited by Adam Miles

Share this post


Link to post
Share on other sites

Thanks. Why are we using copyCommandList here? Can I use my CommandList created in the initialization part. Sorry if my doubt is silly, I'm new to D3D..

Share this post


Link to post
Share on other sites

I use a CommandList on the Copy queue in order that it can be uploaded to the GPU in parallel with 3D/Graphics work executing on the Graphics (Direct) command queue. As I said in my previous answer, you're free to use a Direct command list if you wish. If you're just uploading a handful of textures are startup then there's no problem doing that.

 

It's worth saying that if you're new to D3D as a whole then starting with 12 may not be the best choice. I'm not one to put someone off trying D3D12 if they're interested, but D3D11 isn't going anywhere and is perfectly fine for the vast majority of 3D graphics applications if you're looking for something a little easier to work with.

Edited by Adam Miles

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.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!