Sorry for my misinterpreting answer?.
In D3D12 creating a texture has more steps than D3D11, you basically need:
1. Reserve a heap memory for the resource. It could be your main memory or your dedicated video card memory, depends on the target platform memory architecture (UDMA?/DMA?) and the creation info you specified; Different heap type has different CPU/GPU accessibility;
2. Create a resource handle. You will get an ID3D12Resource* as similar as ID3D11Texture2D* for further binding or other operations;
3. Upload the texture data to the reserved heap;
4. Transit the resource barrier of your texture resource handle to the final usage stage;
5. Create the SRV or UAV by your usage case.
You have 2 or more choices to implement the 1st and 2nd steps:
A. Using ID3D12Device::CreateHeap for the 1st step, and using ID3D12Device::CreatePlacedResource for the 2nd step;
B. Using ID3D12Device::CreateCommittedResource for a combined result of 1st and 2nd steps.
When implementing the 3rd step:
As @pcmaster mentioned, you could map-write-unmap, but your resources must stay in a heap that CPU is writable (the D3D12_CPU_PAGE_PROPERTY is not D3D12_CPU_PAGE_PROPERTY_NOT_AVAILABLE), so it should be an Upload heap or a Readback heap.
Then the better solution is, create an Upload heap, upload your resource to it and then issue an ID3D12GraphicsCommandList::CopyResource command to copy it to the Default heap in order to get the best GPU accessibility. You would need another temporary ID3D12Resource* for the resource inside the upload heap, it would be created by the same processes in the 1st and 2nd steps.
You have 2 or more choices to create and upload the texture data to the Upload heap resource:
A. Create the Upload heap and the Upload heap resource handle by your own, and then map-write-unmap;
B. Create the Upload heap by your own, then use UpdateSubresources method provided by d3dx12.h to upload.
The 4th step is easy: ID3D12GraphicsCommandList::ResourceBarrier.
The 5th step requires you to create SRV or UAV in a Descriptor Heap, this is another topic but generally speaking, if you could survive from the texture creation process above, then that won't be a problem.
Also, all command execution need you to take explicit care about synchronization.
I suggest you take a look at the DirectX 12 Graphics samples, there should be some real code examples.
If anyone found any mistakes please point out, thanks! (MESSY D3D12?)