소스 검색

GL: Added texture array format test.

Branimir Karadžić 8 년 전
부모
커밋
f27526d7e2
1개의 변경된 파일325개의 추가작업 그리고 288개의 파일을 삭제
  1. 325 288
      src/renderer_gl.cpp

+ 325 - 288
src/renderer_gl.cpp

@@ -1152,7 +1152,252 @@ namespace bgfx { namespace gl
 		for (GLenum err = glGetError(); err != 0; err = glGetError() );
 	}
 
-	GLenum initTestTexture(TextureFormat::Enum _format, bool _srgb, bool _mipmaps)
+	static void texSubImage(
+		  GLenum _target
+		, GLint _level
+		, GLint _xoffset
+		, GLint _yoffset
+		, GLint _zoffset
+		, GLsizei _width
+		, GLsizei _height
+		, GLsizei _depth
+		, GLenum _format
+		, GLenum _type
+		, const GLvoid* _data
+	)
+	{
+		if (NULL == _data)
+		{
+			return;
+		}
+
+		if (_target == GL_TEXTURE_3D
+		||  _target == GL_TEXTURE_2D_ARRAY
+		||  _target == GL_TEXTURE_CUBE_MAP_ARRAY)
+		{
+			glTexSubImage3D(
+				  _target
+				, _level
+				, _xoffset
+				, _yoffset
+				, _zoffset
+				, _width
+				, _height
+				, _depth
+				, _format
+				, _type
+				, _data
+				);
+		}
+		else if (_target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY)
+		{
+		}
+		else
+		{
+			BX_UNUSED(_zoffset, _depth);
+			glTexSubImage2D(
+				  _target
+				, _level
+				, _xoffset
+				, _yoffset
+				, _width
+				, _height
+				, _format
+				, _type
+				, _data
+				);
+		}
+	}
+
+	static void texImage(
+		  GLenum _target
+		, uint32_t _msaaQuality
+		, GLint _level
+		, GLint _internalFormat
+		, GLsizei _width
+		, GLsizei _height
+		, GLsizei _depth
+		, GLint _border
+		, GLenum _format
+		, GLenum _type
+		, const GLvoid* _data
+	)
+	{
+		if (_target == GL_TEXTURE_3D)
+		{
+			glTexImage3D(
+				  _target
+				, _level
+				, _internalFormat
+				, _width
+				, _height
+				, _depth
+				, _border
+				, _format
+				, _type
+				, _data
+				);
+		}
+		else if (_target == GL_TEXTURE_2D_ARRAY
+			 ||  _target == GL_TEXTURE_CUBE_MAP_ARRAY)
+		{
+			texSubImage(
+				  _target
+				, _level
+				, 0
+				, 0
+				, _depth
+				, _width
+				, _height
+				, 1
+				, _format
+				, _type
+				, _data
+				);
+		}
+		else if (_target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY)
+		{
+		}
+		else if (_target == GL_TEXTURE_2D_MULTISAMPLE)
+		{
+			glTexImage2DMultisample(
+				  _target
+				, _msaaQuality
+				, _internalFormat
+				, _width
+				, _height
+				, false
+				);
+		}
+		else
+		{
+			glTexImage2D(
+				  _target
+				, _level
+				, _internalFormat
+				, _width
+				, _height
+				, _border
+				, _format
+				, _type
+				, _data
+				);
+		}
+
+		BX_UNUSED(_msaaQuality, _depth, _border, _data);
+	}
+
+	static void compressedTexSubImage(
+		  GLenum _target
+		, GLint _level
+		, GLint _xoffset
+		, GLint _yoffset
+		, GLint _zoffset
+		, GLsizei _width
+		, GLsizei _height
+		, GLsizei _depth
+		, GLenum _format
+		, GLsizei _imageSize
+		, const GLvoid* _data
+	)
+	{
+		if (_target == GL_TEXTURE_3D
+		||  _target == GL_TEXTURE_2D_ARRAY)
+		{
+			glCompressedTexSubImage3D(
+				  _target
+				, _level
+				, _xoffset
+				, _yoffset
+				, _zoffset
+				, _width
+				, _height
+				, _depth
+				, _format
+				, _imageSize
+				, _data
+				);
+		}
+		else
+		{
+			BX_UNUSED(_zoffset, _depth);
+			glCompressedTexSubImage2D(
+				  _target
+				, _level
+				, _xoffset
+				, _yoffset
+				, _width
+				, _height
+				, _format
+				, _imageSize
+				, _data
+				);
+		}
+	}
+
+	static void compressedTexImage(
+		  GLenum _target
+		, GLint _level
+		, GLenum _internalformat
+		, GLsizei _width
+		, GLsizei _height
+		, GLsizei _depth
+		, GLint _border
+		, GLsizei _imageSize
+		, const GLvoid* _data
+	)
+	{
+		if (_target == GL_TEXTURE_3D)
+		{
+			glCompressedTexImage3D(
+				  _target
+				, _level
+				, _internalformat
+				, _width
+				, _height
+				, _depth
+				, _border
+				, _imageSize
+				, _data
+				);
+		}
+		else if (_target == GL_TEXTURE_2D_ARRAY
+			 ||  _target == GL_TEXTURE_CUBE_MAP_ARRAY)
+		{
+			compressedTexSubImage(
+				  _target
+				, _level
+				, 0
+				, 0
+				, _depth
+				, _width
+				, _height
+				, 1
+				, _internalformat
+				, _imageSize
+				, _data
+				);
+		}
+		else if (_target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY)
+		{
+		}
+		else
+		{
+			BX_UNUSED(_depth);
+			glCompressedTexImage2D(
+				  _target
+				, _level
+				, _internalformat
+				, _width
+				, _height
+				, _border
+				, _imageSize
+				, _data
+				);
+		}
+	}
+
+	GLenum initTestTexture(TextureFormat::Enum _format, bool _srgb, bool _mipmaps, bool _array, GLsizei _dim)
 	{
 		const TextureFormatInfo& tfi = s_textureFormat[_format];
 		GLenum internalFmt = _srgb
@@ -1160,13 +1405,15 @@ namespace bgfx { namespace gl
 			: tfi.m_internalFmt
 			;
 
-		GLsizei size = (16*16*bimg::getBitsPerPixel(bimg::TextureFormat::Enum(_format) ) )/8;
+		GLsizei bpp  = bimg::getBitsPerPixel(bimg::TextureFormat::Enum(_format) );
+		GLsizei size = (_dim*_dim*bpp)/8;
 		void* data = NULL;
 
 		if (bimg::isDepth(bimg::TextureFormat::Enum(_format) ) )
 		{
 			_srgb    = false;
 			_mipmaps = false;
+			_array   = false;
 		}
 		else
 		{
@@ -1176,35 +1423,29 @@ namespace bgfx { namespace gl
 		flushGlError();
 		GLenum err = 0;
 
+		const GLenum target = _array
+			? GL_TEXTURE_2D_ARRAY
+			: GL_TEXTURE_2D
+			;
+
 		if (bimg::isCompressed(bimg::TextureFormat::Enum(_format) ) )
 		{
-			glCompressedTexImage2D(GL_TEXTURE_2D, 0, internalFmt, 16, 16, 0, size, data);
-			err |= glGetError();
-			if (_mipmaps)
+			for (uint32_t ii = 0, dim = _dim; ii < (_mipmaps ? 5u : 1u) && 0 == err; ++ii, dim >>= 1)
 			{
-				glCompressedTexImage2D(GL_TEXTURE_2D, 1, internalFmt,  8,  8, 0, size, data);
-				err |= glGetError();
-				glCompressedTexImage2D(GL_TEXTURE_2D, 2, internalFmt,  4,  4, 0, size, data);
-				err |= glGetError();
-				glCompressedTexImage2D(GL_TEXTURE_2D, 3, internalFmt,  2,  2, 0, size, data);
-				err |= glGetError();
-				glCompressedTexImage2D(GL_TEXTURE_2D, 4, internalFmt,  1,  1, 0, size, data);
+				dim = bx::uint32_max(1, dim);
+				uint32_t block = bx::uint32_max(4, dim);
+				size = (block*block*bpp)/8;
+				compressedTexImage(target, ii, internalFmt, dim, dim, 0, 0, size, data);
 				err |= glGetError();
 			}
 		}
 		else
 		{
-			glTexImage2D(GL_TEXTURE_2D, 0, internalFmt, 16, 16, 0, tfi.m_fmt, tfi.m_type, data);
-			err |= glGetError();
-			if (_mipmaps)
+			for (uint32_t ii = 0, dim = _dim; ii < (_mipmaps ? 5u : 1u) && 0 == err; ++ii, dim >>= 1)
 			{
-				glTexImage2D(GL_TEXTURE_2D, 1, internalFmt,  8,  8, 0, tfi.m_fmt, tfi.m_type, data);
-				err |= glGetError();
-				glTexImage2D(GL_TEXTURE_2D, 2, internalFmt,  4,  4, 0, tfi.m_fmt, tfi.m_type, data);
-				err |= glGetError();
-				glTexImage2D(GL_TEXTURE_2D, 3, internalFmt,  2,  2, 0, tfi.m_fmt, tfi.m_type, data);
-				err |= glGetError();
-				glTexImage2D(GL_TEXTURE_2D, 4, internalFmt,  1,  1, 0, tfi.m_fmt, tfi.m_type, data);
+				dim = bx::uint32_max(1, dim);
+				size = (dim*dim*bpp)/8;
+				texImage(target, 0, ii, internalFmt, dim, dim, 0, 0, tfi.m_fmt, tfi.m_type, data);
 				err |= glGetError();
 			}
 		}
@@ -1212,7 +1453,7 @@ namespace bgfx { namespace gl
 		return err;
 	}
 
-	static bool isTextureFormatValid(TextureFormat::Enum _format, bool _srgb = false, bool _mipAutogen = false)
+	static bool isTextureFormatValid(TextureFormat::Enum _format, bool _srgb = false, bool _mipAutogen = false, bool _array = false, GLsizei _dim = 16)
 	{
 		const TextureFormatInfo& tfi = s_textureFormat[_format];
 		GLenum internalFmt = _srgb
@@ -1224,18 +1465,46 @@ namespace bgfx { namespace gl
 			return false;
 		}
 
+		const GLenum target = _array
+			? GL_TEXTURE_2D_ARRAY
+			: GL_TEXTURE_2D
+			;
+
 		GLuint id;
 		GL_CHECK(glGenTextures(1, &id) );
-		GL_CHECK(glBindTexture(GL_TEXTURE_2D, id) );
+		GL_CHECK(glBindTexture(target, id) );
 
-		GLenum err = initTestTexture(_format, _srgb, _mipAutogen);
-		BX_WARN(0 == err, "TextureFormat::%s is not supported (%x: %s).", getName(_format), err, glEnumName(err) );
+		GLenum err = 0;
+		if (_array)
+		{
+			glTexStorage3D(target
+				, 1 + GLsizei(bx::flog2(float(_dim) ) )
+				, internalFmt
+				, _dim
+				, _dim
+				, _dim
+				);
+			err = glGetError();
+		}
 
-		if (0 == err
-		&&  _mipAutogen)
+		if (0 == err)
 		{
-			glGenerateMipmap(GL_TEXTURE_2D);
-			err = glGetError();
+			err = initTestTexture(_format, _srgb, _mipAutogen, _array, _dim);
+			BX_WARN(0 == err, "TextureFormat::%s %s%s%sis not supported (%x: %s)."
+				, getName(_format)
+				, _srgb       ? "+sRGB "       : ""
+				, _mipAutogen ? "+mipAutoGen " : ""
+				, _array      ? "+array "      : ""
+				, err
+				, glEnumName(err)
+				);
+
+			if (0 == err
+			&&  _mipAutogen)
+			{
+				glGenerateMipmap(target);
+				err = glGetError();
+			}
 		}
 
 		GL_CHECK(glDeleteTextures(1, &id) );
@@ -1243,7 +1512,7 @@ namespace bgfx { namespace gl
 		return 0 == err;
 	}
 
-	static bool isImageFormatValid(TextureFormat::Enum _format)
+	static bool isImageFormatValid(TextureFormat::Enum _format, GLsizei _dim = 16)
 	{
 		if (GL_ZERO == s_imageFormat[_format])
 		{
@@ -1257,7 +1526,7 @@ namespace bgfx { namespace gl
 		flushGlError();
 		GLenum err = 0;
 
-		glTexStorage2D(GL_TEXTURE_2D, 1, s_imageFormat[_format], 16, 16);
+		glTexStorage2D(GL_TEXTURE_2D, 1, s_imageFormat[_format], _dim, _dim);
 		err |= glGetError();
 		if (0 == err)
 		{
@@ -1277,7 +1546,7 @@ namespace bgfx { namespace gl
 		return 0 == err;
 	}
 
-	static bool isFramebufferFormatValid(TextureFormat::Enum _format, bool _srgb = false)
+	static bool isFramebufferFormatValid(TextureFormat::Enum _format, bool _srgb = false, GLsizei _dim = 16)
 	{
 		const TextureFormatInfo& tfi = s_textureFormat[_format];
 		GLenum internalFmt = _srgb
@@ -1298,7 +1567,7 @@ namespace bgfx { namespace gl
 		GL_CHECK(glGenTextures(1, &id) );
 		GL_CHECK(glBindTexture(GL_TEXTURE_2D, id) );
 
-		GLenum err = initTestTexture(_format, _srgb, false);
+		GLenum err = initTestTexture(_format, _srgb, false, false, _dim);
 
 		GLenum attachment;
 		if (bimg::isDepth(bimg::TextureFormat::Enum(_format) ) )
@@ -4463,239 +4732,6 @@ namespace bgfx { namespace gl
 		m_vcref.invalidate(s_renderGL->m_vaoStateCache);
 	}
 
-	static void texSubImage(
-		  GLenum _target
-		, GLint _level
-		, GLint _xoffset
-		, GLint _yoffset
-		, GLint _zoffset
-		, GLsizei _width
-		, GLsizei _height
-		, GLsizei _depth
-		, GLenum _format
-		, GLenum _type
-		, const GLvoid* _data
-	)
-	{
-		if (NULL == _data)
-		{
-			return;
-		}
-
-		if (_target == GL_TEXTURE_3D
-		||  _target == GL_TEXTURE_2D_ARRAY
-		||  _target == GL_TEXTURE_CUBE_MAP_ARRAY)
-		{
-			GL_CHECK(glTexSubImage3D(
-				  _target
-				, _level
-				, _xoffset
-				, _yoffset
-				, _zoffset
-				, _width
-				, _height
-				, _depth
-				, _format
-				, _type
-				, _data
-				) );
-		}
-		else if (_target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY)
-		{
-		}
-		else
-		{
-			BX_UNUSED(_zoffset, _depth);
-			GL_CHECK(glTexSubImage2D(
-				  _target
-				, _level
-				, _xoffset
-				, _yoffset
-				, _width
-				, _height
-				, _format
-				, _type
-				, _data
-				) );
-		}
-	}
-
-	static void texImage(
-		  GLenum _target
-		, uint32_t _msaaQuality
-		, GLint _level
-		, GLint _internalFormat
-		, GLsizei _width
-		, GLsizei _height
-		, GLsizei _depth
-		, GLint _border
-		, GLenum _format
-		, GLenum _type
-		, const GLvoid* _data
-	)
-	{
-		if (_target == GL_TEXTURE_3D)
-		{
-			GL_CHECK(glTexImage3D(
-				  _target
-				, _level
-				, _internalFormat
-				, _width
-				, _height
-				, _depth
-				, _border
-				, _format
-				, _type
-				, _data
-				) );
-		}
-		else if (_target == GL_TEXTURE_2D_ARRAY
-			 ||  _target == GL_TEXTURE_CUBE_MAP_ARRAY)
-		{
-			texSubImage(
-				  _target
-				, _level
-				, 0
-				, 0
-				, _depth
-				, _width
-				, _height
-				, 1
-				, _format
-				, _type
-				, _data
-				);
-		}
-		else if (_target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY)
-		{
-		}
-		else if (_target == GL_TEXTURE_2D_MULTISAMPLE)
-		{
-			GL_CHECK(glTexImage2DMultisample(
-				  _target
-				, _msaaQuality
-				, _internalFormat
-				, _width
-				, _height
-				, false
-				) );
-		}
-		else
-		{
-			GL_CHECK(glTexImage2D(
-				  _target
-				, _level
-				, _internalFormat
-				, _width
-				, _height
-				, _border
-				, _format
-				, _type
-				, _data
-				) );
-		}
-
-		BX_UNUSED(_msaaQuality, _depth, _border, _data);
-	}
-
-	static void compressedTexSubImage(
-		  GLenum _target
-		, GLint _level
-		, GLint _xoffset
-		, GLint _yoffset
-		, GLint _zoffset
-		, GLsizei _width
-		, GLsizei _height
-		, GLsizei _depth
-		, GLenum _format
-		, GLsizei _imageSize
-		, const GLvoid* _data
-	)
-	{
-		if (_target == GL_TEXTURE_3D
-		||  _target == GL_TEXTURE_2D_ARRAY)
-		{
-			GL_CHECK(glCompressedTexSubImage3D(
-				  _target
-				, _level
-				, _xoffset
-				, _yoffset
-				, _zoffset
-				, _width
-				, _height
-				, _depth
-				, _format
-				, _imageSize
-				, _data
-				) );
-		}
-		else
-		{
-			BX_UNUSED(_zoffset, _depth);
-			GL_CHECK(glCompressedTexSubImage2D(
-				  _target
-				, _level
-				, _xoffset
-				, _yoffset
-				, _width
-				, _height
-				, _format
-				, _imageSize
-				, _data
-				) );
-		}
-	}
-
-	static void compressedTexImage(
-		  GLenum _target
-		, GLint _level
-		, GLenum _internalformat
-		, GLsizei _width
-		, GLsizei _height
-		, GLsizei _depth
-		, GLint _border
-		, GLsizei _imageSize
-		, const GLvoid* _data
-	)
-	{
-		if (_target == GL_TEXTURE_3D)
-		{
-			GL_CHECK(glCompressedTexImage3D(
-				  _target
-				, _level
-				, _internalformat
-				, _width
-				, _height
-				, _depth
-				, _border
-				, _imageSize
-				, _data
-				) );
-		}
-		else if (_target == GL_TEXTURE_2D_ARRAY
-			 ||  _target == GL_TEXTURE_CUBE_MAP_ARRAY)
-		{
-			compressedTexSubImage(_target, _level, 0, 0, _depth, _width, _height, 1, _internalformat, _imageSize, _data);
-		}
-		else if (_target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY)
-		{
-		}
-		else
-		{
-			BX_UNUSED(_depth);
-			GL_CHECK(glCompressedTexImage2D(
-				  _target
-				, _level
-				, _internalformat
-				, _width
-				, _height
-				, _border
-				, _imageSize
-				, _data
-				) );
-		}
-	}
-
 	bool TextureGL::init(GLenum _target, uint32_t _width, uint32_t _height, uint32_t _depth, uint8_t _numMips, uint32_t _flags)
 	{
 		m_target  = _target;
@@ -4922,10 +4958,11 @@ namespace bgfx { namespace gl
 				|| swizzle
 				;
 
-			BX_TRACE("Texture%-4s %3d: %s (requested: %s), layers %d, %dx%dx%d%s."
+			BX_TRACE("Texture%-4s %3d: %s %s(requested: %s), layers %d, %dx%dx%d%s."
 				, imageContainer.m_cubeMap ? "Cube" : (1 < imageContainer.m_depth ? "3D" : "2D")
 				, this - s_renderGL->m_textures
 				, getName( (TextureFormat::Enum)m_textureFormat)
+				, srgb ? "+sRGB " : ""
 				, getName( (TextureFormat::Enum)m_requestedFormat)
 				, numLayers
 				, textureWidth
@@ -4935,12 +4972,12 @@ namespace bgfx { namespace gl
 				);
 
 			BX_WARN(!convert, "Texture %s%s%s from %s to %s."
-					, swizzle ? "swizzle" : ""
-					, swizzle&&convert ? " and " : ""
-					, convert ? "convert" : ""
-					, getName( (TextureFormat::Enum)m_requestedFormat)
-					, getName( (TextureFormat::Enum)m_textureFormat)
-					);
+				, swizzle ? "swizzle" : ""
+				, swizzle&&convert ? " and " : ""
+				, convert ? "convert" : ""
+				, getName( (TextureFormat::Enum)m_requestedFormat)
+				, getName( (TextureFormat::Enum)m_textureFormat)
+				);
 
 			uint8_t* temp = NULL;
 			if (convert)
@@ -4975,7 +5012,7 @@ namespace bgfx { namespace gl
 						if (compressed
 						&& !convert)
 						{
-							compressedTexImage(imageTarget
+							GL_CHECK(compressedTexImage(imageTarget
 								, lod
 								, internalFmt
 								, width
@@ -4984,7 +5021,7 @@ namespace bgfx { namespace gl
 								, 0
 								, mip.m_size
 								, mip.m_data
-								);
+								) );
 						}
 						else
 						{
@@ -4993,16 +5030,16 @@ namespace bgfx { namespace gl
 							if (convert)
 							{
 								imageDecodeToRgba8(temp
-										, mip.m_data
-										, mip.m_width
-										, mip.m_height
-										, mip.m_width*4
-										, mip.m_format
-										);
+									, mip.m_data
+									, mip.m_width
+									, mip.m_height
+									, mip.m_width*4
+									, mip.m_format
+									);
 								data = temp;
 							}
 
-							texImage(imageTarget
+							GL_CHECK(texImage(imageTarget
 								, msaaQuality
 								, lod
 								, internalFmt
@@ -5013,7 +5050,7 @@ namespace bgfx { namespace gl
 								, m_fmt
 								, m_type
 								, data
-								);
+								) );
 						}
 					}
 					else if (!computeWrite)
@@ -5025,7 +5062,7 @@ namespace bgfx { namespace gl
 										  * 4*4* bimg::getBitsPerPixel(bimg::TextureFormat::Enum(m_textureFormat) )/8
 										  ;
 
-							compressedTexImage(imageTarget
+							GL_CHECK(compressedTexImage(imageTarget
 								, lod
 								, internalFmt
 								, width
@@ -5034,11 +5071,11 @@ namespace bgfx { namespace gl
 								, 0
 								, size
 								, NULL
-								);
+								) );
 						}
 						else
 						{
-							texImage(imageTarget
+							GL_CHECK(texImage(imageTarget
 								, msaaQuality
 								, lod
 								, internalFmt
@@ -5049,7 +5086,7 @@ namespace bgfx { namespace gl
 								, m_fmt
 								, m_type
 								, NULL
-								);
+								) );
 						}
 					}