Texture2D::Texture2D( Device& _Device, int _Width, int _Height, const IDepthStencilFormatDescriptor& _Format, int _ArraySize ) : Component( _Device ) , m_Format( _Format ) , m_bIsDepthStencil( true ) , m_bIsCubeMap( false ) , m_pCachedDepthStencilView( NULL ) { ASSERT( _Width <= MAX_TEXTURE_SIZE, "Texture size out of range!" ); ASSERT( _Height <= MAX_TEXTURE_SIZE, "Texture size out of range!" ); for ( int ShaderStageIndex=0; ShaderStageIndex < 6; ShaderStageIndex++ ) m_LastAssignedSlots[ShaderStageIndex] = -1; m_LastAssignedSlotsUAV = -1; m_Width = _Width; m_Height = _Height; m_ArraySize = _ArraySize; m_MipLevelsCount = 1; D3D11_TEXTURE2D_DESC Desc; Desc.Width = m_Width; Desc.Height = m_Height; Desc.ArraySize = m_ArraySize; Desc.MipLevels = 1; Desc.Format = _Format.DirectXFormat(); Desc.SampleDesc.Count = 1; Desc.SampleDesc.Quality = 0; Desc.Usage = D3D11_USAGE_DEFAULT; Desc.BindFlags = D3D11_BIND_DEPTH_STENCIL | D3D11_BIND_SHADER_RESOURCE; Desc.CPUAccessFlags = D3D11_CPU_ACCESS_FLAG( 0 ); Desc.MiscFlags = D3D11_RESOURCE_MISC_FLAG( 0 ); Check( m_Device.DXDevice().CreateTexture2D( &Desc, NULL, &m_pTexture ) ); }
void Texture3D::Init( const void* const* _ppContent, bool _bStaging, bool _bUnOrderedAccess, TextureFilePOM::MipDescriptor* _pMipDescriptors ) { ASSERT( m_Width <= MAX_TEXTURE_SIZE, "Texture size out of range !" ); ASSERT( m_Height <= MAX_TEXTURE_SIZE, "Texture size out of range !" ); ASSERT( m_Depth <= MAX_TEXTURE_SIZE, "Texture size out of range !" ); for ( int ShaderStageIndex=0; ShaderStageIndex < 6; ShaderStageIndex++ ) m_LastAssignedSlots[ShaderStageIndex] = -1; m_LastAssignedSlotsUAV = -1; m_MipLevelsCount = ComputeMipLevelsCount( m_Width, m_Height, m_Depth, m_MipLevelsCount ); D3D11_TEXTURE3D_DESC Desc; Desc.Width = m_Width; Desc.Height = m_Height; Desc.Depth = m_Depth; Desc.MipLevels = m_MipLevelsCount; Desc.Format = m_Format.DirectXFormat(); Desc.MiscFlags = D3D11_RESOURCE_MISC_FLAG( 0 ); if ( _bStaging ) { Desc.Usage = D3D11_USAGE_STAGING; Desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE; Desc.BindFlags = 0; } else { Desc.Usage = _ppContent != NULL ? D3D11_USAGE_IMMUTABLE : D3D11_USAGE_DEFAULT; Desc.CPUAccessFlags = D3D11_CPU_ACCESS_FLAG( 0 ); Desc.BindFlags = _ppContent != NULL ? D3D11_BIND_SHADER_RESOURCE : (D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE | (_bUnOrderedAccess ? D3D11_BIND_UNORDERED_ACCESS: 0)); } if ( _ppContent != NULL ) { D3D11_SUBRESOURCE_DATA pInitialData[MAX_TEXTURE_POT]; U32 Width = m_Width; U32 Height = m_Height; U32 Depth = m_Depth; for ( U32 MipLevelIndex=0; MipLevelIndex < m_MipLevelsCount; MipLevelIndex++ ) { U32 RowPitch = _pMipDescriptors != NULL ? _pMipDescriptors[MipLevelIndex].RowPitch : Width * m_Format.Size(); U32 DepthPitch = _pMipDescriptors != NULL ? _pMipDescriptors[MipLevelIndex].DepthPitch : Height * RowPitch; pInitialData[MipLevelIndex].pSysMem = _ppContent[MipLevelIndex]; pInitialData[MipLevelIndex].SysMemPitch = RowPitch; pInitialData[MipLevelIndex].SysMemSlicePitch = DepthPitch; NextMipSize( Width, Height, Depth ); } Check( m_Device.DXDevice().CreateTexture3D( &Desc, pInitialData, &m_pTexture ) ); } else Check( m_Device.DXDevice().CreateTexture3D( &Desc, NULL, &m_pTexture ) ); }
void Texture2D::Init( const void* const* _ppContent, bool _bStaging, bool _bUnOrderedAccess, TextureFilePOM::MipDescriptor* _pMipDescriptors ) { ASSERT( m_Width <= MAX_TEXTURE_SIZE, "Texture size out of range!" ); ASSERT( m_Height <= MAX_TEXTURE_SIZE, "Texture size out of range!" ); for ( int ShaderStageIndex=0; ShaderStageIndex < 6; ShaderStageIndex++ ) m_LastAssignedSlots[ShaderStageIndex] = -1; m_LastAssignedSlotsUAV = -1; m_MipLevelsCount = ComputeMipLevelsCount( m_Width, m_Height, m_MipLevelsCount ); D3D11_TEXTURE2D_DESC Desc; Desc.Width = m_Width; Desc.Height = m_Height; Desc.ArraySize = m_ArraySize; Desc.MipLevels = m_MipLevelsCount; Desc.Format = m_Format.DirectXFormat(); Desc.SampleDesc.Count = 1; Desc.SampleDesc.Quality = 0; if ( _bStaging ) { Desc.Usage = D3D11_USAGE_STAGING; // Desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ | (_bWriteable ? D3D11_CPU_ACCESS_WRITE : 0); Desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE; Desc.BindFlags = 0; Desc.MiscFlags = 0; } else { Desc.Usage = _ppContent != NULL ? D3D11_USAGE_IMMUTABLE : D3D11_USAGE_DEFAULT; Desc.CPUAccessFlags = D3D11_CPU_ACCESS_FLAG( 0 ); Desc.BindFlags = _ppContent != NULL ? D3D11_BIND_SHADER_RESOURCE : (D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE | (_bUnOrderedAccess ? D3D11_BIND_UNORDERED_ACCESS: 0)); Desc.MiscFlags = m_bIsCubeMap ? D3D11_RESOURCE_MISC_TEXTURECUBE : 0; } if ( _ppContent != NULL ) { D3D11_SUBRESOURCE_DATA* pInitialData = new D3D11_SUBRESOURCE_DATA[m_MipLevelsCount*m_ArraySize]; for ( int ArrayIndex=0; ArrayIndex < m_ArraySize; ArrayIndex++ ) { int Width = m_Width; int Height = m_Height; for ( int MipLevelIndex=0; MipLevelIndex < m_MipLevelsCount; MipLevelIndex++ ) { int RowPitch = _pMipDescriptors != NULL ? _pMipDescriptors[MipLevelIndex].RowPitch : Width * m_Format.Size(); int DepthPitch = _pMipDescriptors != NULL ? _pMipDescriptors[MipLevelIndex].DepthPitch : Height * RowPitch; pInitialData[ArrayIndex*m_MipLevelsCount+MipLevelIndex].pSysMem = _ppContent[ArrayIndex*m_MipLevelsCount+MipLevelIndex]; pInitialData[ArrayIndex*m_MipLevelsCount+MipLevelIndex].SysMemPitch = RowPitch; pInitialData[ArrayIndex*m_MipLevelsCount+MipLevelIndex].SysMemSlicePitch = DepthPitch; NextMipSize( Width, Height ); } } Check( m_Device.DXDevice().CreateTexture2D( &Desc, pInitialData, &m_pTexture ) ); delete[] pInitialData; } else Check( m_Device.DXDevice().CreateTexture2D( &Desc, NULL, &m_pTexture ) ); }