void ColorBuffer::CreateDerivedViews( ID3D12Device* Device, DXGI_FORMAT Format, uint32_t ArraySize, uint32_t NumMips /* = 1 */ ) { ASSERT( ArraySize == 1 || NumMips == 1 ); m_NumMipMaps = NumMips - 1; D3D12_RENDER_TARGET_VIEW_DESC RTVDesc = {}; D3D12_UNORDERED_ACCESS_VIEW_DESC UAVDesc = {}; D3D12_SHADER_RESOURCE_VIEW_DESC SRVDesc = {}; RTVDesc.Format = Format; UAVDesc.Format = GetUAVFormat( Format ); SRVDesc.Format = Format; SRVDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; if (ArraySize > 1) { RTVDesc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2DARRAY; RTVDesc.Texture2DArray.MipSlice = 0; RTVDesc.Texture2DArray.FirstArraySlice = 0; RTVDesc.Texture2DArray.ArraySize = (UINT)ArraySize; UAVDesc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE2DARRAY; UAVDesc.Texture2DArray.MipSlice = 0; UAVDesc.Texture2DArray.FirstArraySlice = 0; UAVDesc.Texture2DArray.ArraySize = (UINT)ArraySize; SRVDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2DARRAY; SRVDesc.Texture2DArray.MipLevels = NumMips; SRVDesc.Texture2DArray.MostDetailedMip = 0; SRVDesc.Texture2DArray.FirstArraySlice = 0; SRVDesc.Texture2DArray.ArraySize = (UINT)ArraySize; } else { RTVDesc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2D; RTVDesc.Texture2D.MipSlice = 0; UAVDesc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE2D; UAVDesc.Texture2D.MipSlice = 0; SRVDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D; SRVDesc.Texture2D.MipLevels = NumMips; SRVDesc.Texture2D.MostDetailedMip = 0; } if (m_SRVHandle.ptr == ~0ull) { m_RTVHandle = Graphics::g_pRTVDescriptorHeap->Append().GetCPUHandle(); m_SRVHandle = Graphics::g_pCSUDescriptorHeap->Append().GetCPUHandle(); } ID3D12Resource* Resource = m_pResource.Get(); Device->CreateRenderTargetView( Resource, &RTVDesc, m_RTVHandle ); Device->CreateShaderResourceView( Resource, &SRVDesc, m_SRVHandle ); for (uint32_t i = 0; i < NumMips; ++i) { if (m_UAVHandle[i].ptr == ~0ull) m_UAVHandle[i] = Graphics::g_pCSUDescriptorHeap->Append().GetCPUHandle(); Device->CreateUnorderedAccessView( Resource, nullptr, &UAVDesc, m_UAVHandle[i] ); UAVDesc.Texture2D.MipSlice++; } }
void ColorBuffer::CreateDerivedViews(ID3D12Device* Device, DXGI_FORMAT Format, uint32_t ArraySize, uint32_t NumMips) { ASSERT(ArraySize == 1 || NumMips == 1, "We don't support auto-mips on texture arrays"); m_NumMipMaps = NumMips - 1; D3D12_RENDER_TARGET_VIEW_DESC RTVDesc = {}; D3D12_UNORDERED_ACCESS_VIEW_DESC UAVDesc = {}; D3D12_SHADER_RESOURCE_VIEW_DESC SRVDesc = {}; RTVDesc.Format = Format; UAVDesc.Format = GetUAVFormat(Format); SRVDesc.Format = Format; SRVDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; if (ArraySize > 1) { RTVDesc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2DARRAY; RTVDesc.Texture2DArray.MipSlice = 0; RTVDesc.Texture2DArray.FirstArraySlice = 0; RTVDesc.Texture2DArray.ArraySize = (UINT)ArraySize; UAVDesc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE2DARRAY; UAVDesc.Texture2DArray.MipSlice = 0; UAVDesc.Texture2DArray.FirstArraySlice = 0; UAVDesc.Texture2DArray.ArraySize = (UINT)ArraySize; SRVDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2DARRAY; SRVDesc.Texture2DArray.MipLevels = NumMips; SRVDesc.Texture2DArray.MostDetailedMip = 0; SRVDesc.Texture2DArray.FirstArraySlice = 0; SRVDesc.Texture2DArray.ArraySize = (UINT)ArraySize; } else { RTVDesc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2D; RTVDesc.Texture2D.MipSlice = 0; UAVDesc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE2D; UAVDesc.Texture2D.MipSlice = 0; SRVDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D; SRVDesc.Texture2D.MipLevels = NumMips; SRVDesc.Texture2D.MostDetailedMip = 0; } if (m_SRVHandle.ptr == ~0ull) { m_RTVHandle = Graphics::AllocateDescriptor(D3D12_DESCRIPTOR_HEAP_TYPE_RTV); m_SRVHandle = Graphics::AllocateDescriptor(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV); } ID3D12Resource* Resource = m_pResource.Get(); // Create the render target view Device->CreateRenderTargetView(Resource, &RTVDesc, m_RTVHandle); // Create the shader resource view Device->CreateShaderResourceView(Resource, &SRVDesc, m_SRVHandle); // Create the UAVs for each mip level (RWTexture2D) for (uint32_t i = 0; i < NumMips; ++i) { if (m_UAVHandle[i].ptr == ~0ull) m_UAVHandle[i] = Graphics::AllocateDescriptor(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV); Device->CreateUnorderedAccessView(Resource, nullptr, &UAVDesc, m_UAVHandle[i]); UAVDesc.Texture2D.MipSlice++; } }