| 374 | #endif // TRESSFX_DEBUG_UAV |
| 375 | |
| 376 | std::unique_ptr<EI_Resource> EI_Device::CreateRenderTargetResource(const int width, const int height, const size_t channels, const size_t channelSize, const char* name, AMD::float4* ClearValues /*= nullptr*/) |
| 377 | { |
| 378 | EI_Resource* res = new EI_Resource; |
| 379 | |
| 380 | res->m_ResourceType = EI_ResourceType::Texture; |
| 381 | res->m_pTexture = new CAULDRON_DX12::Texture(); |
| 382 | |
| 383 | CD3DX12_RESOURCE_DESC resourceDesc = {}; |
| 384 | resourceDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D; |
| 385 | resourceDesc.Alignment = 0; |
| 386 | resourceDesc.Width = width; |
| 387 | resourceDesc.Height = height; |
| 388 | resourceDesc.DepthOrArraySize = 1; |
| 389 | resourceDesc.MipLevels = 1; |
| 390 | resourceDesc.SampleDesc.Count = 1; |
| 391 | resourceDesc.SampleDesc.Quality = 0; |
| 392 | resourceDesc.Flags = D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET; |
| 393 | resourceDesc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN; |
| 394 | |
| 395 | if (channels == 1) |
| 396 | { |
| 397 | resourceDesc.Format = DXGI_FORMAT_R16_FLOAT; |
| 398 | } |
| 399 | else if (channels == 2) |
| 400 | { |
| 401 | resourceDesc.Format = DXGI_FORMAT_R16G16_FLOAT; |
| 402 | } |
| 403 | else if (channels == 4) |
| 404 | { |
| 405 | if (channelSize == 1) |
| 406 | resourceDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; |
| 407 | else |
| 408 | resourceDesc.Format = DXGI_FORMAT_R16G16B16A16_FLOAT; |
| 409 | } |
| 410 | |
| 411 | if (ClearValues) |
| 412 | { |
| 413 | D3D12_CLEAR_VALUE ClearParams; |
| 414 | ClearParams.Format = resourceDesc.Format; |
| 415 | ClearParams.Color[0] = ClearValues->x; |
| 416 | ClearParams.Color[1] = ClearValues->y; |
| 417 | ClearParams.Color[2] = ClearValues->z; |
| 418 | ClearParams.Color[3] = ClearValues->w; |
| 419 | |
| 420 | // Makes initial barriers easier to deal with |
| 421 | res->m_pTexture->Init(&m_device, name, &resourceDesc, D3D12_RESOURCE_STATE_COMMON, &ClearParams); |
| 422 | } |
| 423 | else |
| 424 | res->m_pTexture->InitRenderTarget(&m_device, name, &resourceDesc, D3D12_RESOURCE_STATE_RENDER_TARGET); |
| 425 | |
| 426 | res->RTView = new CAULDRON_DX12::RTV(); |
| 427 | m_resourceViewHeaps.AllocRTVDescriptor(1, res->RTView); |
| 428 | res->m_pTexture->CreateRTV(0, res->RTView); |
| 429 | |
| 430 | res->SRView = new CAULDRON_DX12::CBV_SRV_UAV(); |
| 431 | D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {}; |
| 432 | srvDesc.Format = resourceDesc.Format; |
| 433 | srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D; |