示例#1
0
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 ) );
}
示例#2
0
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 ) );
}
示例#3
0
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 ) );
}