You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
		
		
		
		
		
			
		
			
				
					
					
						
							251 lines
						
					
					
						
							5.8 KiB
						
					
					
				
			
		
		
	
	
							251 lines
						
					
					
						
							5.8 KiB
						
					
					
				namespace gli{ | 
						|
namespace detail | 
						|
{ | 
						|
	inline size_t texel_linear_aAdressing | 
						|
	( | 
						|
		extent1d const& Extent, | 
						|
		extent1d const& TexelCoord | 
						|
	) | 
						|
	{ | 
						|
		GLI_ASSERT(glm::all(glm::lessThan(TexelCoord, Extent))); | 
						|
 | 
						|
		return static_cast<size_t>(TexelCoord.x); | 
						|
	} | 
						|
 | 
						|
	inline size_t texel_linear_adressing | 
						|
	( | 
						|
		extent2d const& Extent, | 
						|
		extent2d const& TexelCoord | 
						|
	) | 
						|
	{ | 
						|
		GLI_ASSERT(TexelCoord.x < Extent.x); | 
						|
		GLI_ASSERT(TexelCoord.y < Extent.y); | 
						|
 | 
						|
		return static_cast<size_t>(TexelCoord.x + Extent.x * TexelCoord.y); | 
						|
	} | 
						|
 | 
						|
	inline size_t texel_linear_adressing | 
						|
	( | 
						|
		extent3d const& Extent, | 
						|
		extent3d const& TexelCoord | 
						|
	) | 
						|
	{ | 
						|
		GLI_ASSERT(TexelCoord.x < Extent.x); | 
						|
		GLI_ASSERT(TexelCoord.y < Extent.y); | 
						|
		GLI_ASSERT(TexelCoord.z < Extent.z); | 
						|
 | 
						|
		return static_cast<size_t>(TexelCoord.x + Extent.x * (TexelCoord.y + Extent.y * TexelCoord.z)); | 
						|
	} | 
						|
 | 
						|
	inline size_t texel_morton_adressing | 
						|
	( | 
						|
		extent1d const& Extent, | 
						|
		extent1d const& TexelCoord | 
						|
	) | 
						|
	{ | 
						|
		GLI_ASSERT(TexelCoord.x < Extent.x); | 
						|
 | 
						|
		return TexelCoord.x; | 
						|
	} | 
						|
 | 
						|
	inline size_t texel_morton_adressing | 
						|
	( | 
						|
		extent2d const& Extent, | 
						|
		extent2d const& TexelCoord | 
						|
	) | 
						|
	{ | 
						|
		GLI_ASSERT(TexelCoord.x < Extent.x && TexelCoord.x >= 0 && TexelCoord.x < std::numeric_limits<extent2d::value_type>::max()); | 
						|
		GLI_ASSERT(TexelCoord.y < Extent.y && TexelCoord.y >= 0 && TexelCoord.y < std::numeric_limits<extent2d::value_type>::max()); | 
						|
 | 
						|
		glm::u32vec2 const Input(TexelCoord); | 
						|
 | 
						|
		return static_cast<size_t>(glm::bitfieldInterleave(Input.x, Input.y)); | 
						|
	} | 
						|
 | 
						|
	inline size_t texel_morton_adressing | 
						|
	( | 
						|
		extent3d const& Extent, | 
						|
		extent3d const& TexelCoord | 
						|
	) | 
						|
	{ | 
						|
		GLI_ASSERT(TexelCoord.x < Extent.x); | 
						|
		GLI_ASSERT(TexelCoord.y < Extent.y); | 
						|
		GLI_ASSERT(TexelCoord.z < Extent.z); | 
						|
 | 
						|
		glm::u32vec3 const Input(TexelCoord); | 
						|
 | 
						|
		return static_cast<size_t>(glm::bitfieldInterleave(Input.x, Input.y, Input.z)); | 
						|
	} | 
						|
}//namespace detail | 
						|
 | 
						|
	inline image::image() | 
						|
		: Format(static_cast<gli::format>(FORMAT_INVALID)) | 
						|
		, BaseLevel(0) | 
						|
		, Data(nullptr) | 
						|
		, Size(0) | 
						|
	{} | 
						|
 | 
						|
	inline image::image | 
						|
	( | 
						|
		format_type Format, | 
						|
		extent_type const& Extent | 
						|
	) | 
						|
		: Storage(std::make_shared<storage_linear>(Format, Extent, 1, 1, 1)) | 
						|
		, Format(Format) | 
						|
		, BaseLevel(0) | 
						|
		, Data(Storage->data()) | 
						|
		, Size(compute_size(0)) | 
						|
	{} | 
						|
 | 
						|
	inline image::image | 
						|
	( | 
						|
		std::shared_ptr<storage_linear> Storage, | 
						|
		format_type Format, | 
						|
		size_type BaseLayer, | 
						|
		size_type BaseFace, | 
						|
		size_type BaseLevel | 
						|
	) | 
						|
		: Storage(Storage) | 
						|
		, Format(Format) | 
						|
		, BaseLevel(BaseLevel) | 
						|
		, Data(compute_data(BaseLayer, BaseFace, BaseLevel)) | 
						|
		, Size(compute_size(BaseLevel)) | 
						|
	{} | 
						|
 | 
						|
	inline image::image | 
						|
	( | 
						|
		image const & Image, | 
						|
		format_type Format | 
						|
	) | 
						|
		: Storage(Image.Storage) | 
						|
		, Format(Format) | 
						|
		, BaseLevel(Image.BaseLevel) | 
						|
		, Data(Image.Data) | 
						|
		, Size(Image.Size) | 
						|
	{ | 
						|
		GLI_ASSERT(block_size(Format) == block_size(Image.format())); | 
						|
	} | 
						|
 | 
						|
	inline bool image::empty() const | 
						|
	{ | 
						|
		if(this->Storage.get() == nullptr) | 
						|
			return true; | 
						|
 | 
						|
		return this->Storage->empty(); | 
						|
	} | 
						|
 | 
						|
	inline image::size_type image::size() const | 
						|
	{ | 
						|
		GLI_ASSERT(!this->empty()); | 
						|
 | 
						|
		return this->Size; | 
						|
	} | 
						|
 | 
						|
	template <typename genType> | 
						|
	inline image::size_type image::size() const | 
						|
	{ | 
						|
		GLI_ASSERT(sizeof(genType) <= this->Storage->block_size()); | 
						|
 | 
						|
		return this->size() / sizeof(genType); | 
						|
	} | 
						|
 | 
						|
	inline image::format_type image::format() const | 
						|
	{ | 
						|
		return this->Format; | 
						|
	} | 
						|
 | 
						|
	inline image::extent_type image::extent() const | 
						|
	{ | 
						|
		GLI_ASSERT(!this->empty()); | 
						|
 | 
						|
		storage_linear::extent_type const& SrcExtent = this->Storage->extent(this->BaseLevel); | 
						|
		storage_linear::extent_type const& DstExtent = SrcExtent * block_extent(this->format()) / this->Storage->block_extent(); | 
						|
 | 
						|
		return glm::max(DstExtent, storage_linear::extent_type(1)); | 
						|
	} | 
						|
 | 
						|
	inline void* image::data() | 
						|
	{ | 
						|
		GLI_ASSERT(!this->empty()); | 
						|
 | 
						|
		return this->Data; | 
						|
	} | 
						|
 | 
						|
	inline void const* image::data() const | 
						|
	{ | 
						|
		GLI_ASSERT(!this->empty()); | 
						|
		 | 
						|
		return this->Data; | 
						|
	} | 
						|
 | 
						|
	template <typename genType> | 
						|
	inline genType* image::data() | 
						|
	{ | 
						|
		GLI_ASSERT(!this->empty()); | 
						|
		GLI_ASSERT(this->Storage->block_size() >= sizeof(genType)); | 
						|
 | 
						|
		return reinterpret_cast<genType *>(this->data()); | 
						|
	} | 
						|
 | 
						|
	template <typename genType> | 
						|
	inline genType const* image::data() const | 
						|
	{ | 
						|
		GLI_ASSERT(!this->empty()); | 
						|
		GLI_ASSERT(this->Storage->block_size() >= sizeof(genType)); | 
						|
 | 
						|
		return reinterpret_cast<genType const *>(this->data()); | 
						|
	} | 
						|
 | 
						|
	inline void image::clear() | 
						|
	{ | 
						|
		GLI_ASSERT(!this->empty()); | 
						|
 | 
						|
		memset(this->data<glm::byte>(), 0, this->size<glm::byte>()); | 
						|
	} | 
						|
 | 
						|
	template <typename genType> | 
						|
	inline void image::clear(genType const& Texel) | 
						|
	{ | 
						|
		GLI_ASSERT(!this->empty()); | 
						|
		GLI_ASSERT(this->Storage->block_size() == sizeof(genType)); | 
						|
 | 
						|
		for(size_type TexelIndex = 0; TexelIndex < this->size<genType>(); ++TexelIndex) | 
						|
			*(this->data<genType>() + TexelIndex) = Texel; | 
						|
	} | 
						|
 | 
						|
	inline image::data_type* image::compute_data(size_type BaseLayer, size_type BaseFace, size_type BaseLevel) | 
						|
	{ | 
						|
		size_type const BaseOffset = this->Storage->base_offset(BaseLayer, BaseFace, BaseLevel); | 
						|
 | 
						|
		return this->Storage->data() + BaseOffset; | 
						|
	} | 
						|
 | 
						|
	inline image::size_type image::compute_size(size_type Level) const | 
						|
	{ | 
						|
		GLI_ASSERT(!this->empty()); | 
						|
 | 
						|
		return this->Storage->level_size(Level); | 
						|
	} | 
						|
 | 
						|
	template <typename genType> | 
						|
	genType image::load(extent_type const& TexelCoord) | 
						|
	{ | 
						|
		GLI_ASSERT(!this->empty()); | 
						|
		GLI_ASSERT(!is_compressed(this->format())); | 
						|
		GLI_ASSERT(this->Storage->block_size() == sizeof(genType)); | 
						|
		GLI_ASSERT(glm::all(glm::lessThan(TexelCoord, this->extent()))); | 
						|
 | 
						|
		return *(this->data<genType>() + detail::texel_linear_adressing(this->extent(), TexelCoord)); | 
						|
	} | 
						|
 | 
						|
	template <typename genType> | 
						|
	void image::store(extent_type const& TexelCoord, genType const& Data) | 
						|
	{ | 
						|
		GLI_ASSERT(!this->empty()); | 
						|
		GLI_ASSERT(!is_compressed(this->format())); | 
						|
		GLI_ASSERT(this->Storage->block_size() == sizeof(genType)); | 
						|
		GLI_ASSERT(glm::all(glm::lessThan(TexelCoord, this->extent()))); | 
						|
 | 
						|
		*(this->data<genType>() + detail::texel_linear_adressing(this->extent(), TexelCoord)) = Data; | 
						|
	} | 
						|
}//namespace gli
 | 
						|
 |