Use 1px detect method for checking whether GPU support astc [ci build]

This commit is contained in:
halx99 2021-06-10 12:44:34 +08:00
parent 0439bb54c3
commit 0d492c5f76
1 changed files with 50 additions and 3 deletions

View File

@ -38,6 +38,53 @@
CC_BACKEND_BEGIN
/// <summary>
/// 1px method to detect whether GPU support astc compressed texture really
/// </summary>
/// <returns>true: support, false: not support</returns>
static bool checkReallySupportsASTC() {
const GLsizei TEXTURE_DIM = 1;
// 1px/2px astc 4x4 compressed texels srgb
uint8_t astctexels[] = {
0xfc, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x80, 0x00, 0x00, 0xff, 0xff};
GLuint texID = 0;
glGenTextures(1, &texID);
glBindTexture(GL_TEXTURE_2D, texID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glCompressedTexImage2D(GL_TEXTURE_2D,
0, // level
GL_COMPRESSED_RGBA_ASTC_4x4_KHR, // format
TEXTURE_DIM, TEXTURE_DIM,
0, // border
sizeof(astctexels), // dataLen,
astctexels);
auto error = glGetError();
if (!error) {
// read pixel RGB: should be: 255, 128, 0
uint8_t pixels[TEXTURE_DIM * TEXTURE_DIM * 4] = {0};
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
error = glGetError();
if (error || pixels[0] != 255 || pixels[1] != 128) {
error = GL_INVALID_VALUE;
}
}
glBindTexture(GL_TEXTURE_2D, 0); // ubind texture
glDeleteTextures(1, &texID);
CHECK_GL_ERROR_DEBUG();
return !error;
}
bool DeviceInfoGL::init()
{
glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &_maxAttributes);
@ -111,7 +158,7 @@ bool DeviceInfoGL::checkForFeatureSupported(FeatureType feature)
featureSupported = checkForGLExtension("GL_OES_depth24");
break;
case FeatureType::ASTC:
featureSupported = checkForGLExtension("GL_OES_texture_compression_astc") || checkSupportsCompressedFormat(GL_COMPRESSED_RGBA_ASTC_4x4);
featureSupported = checkReallySupportsASTC();
break;
default:
break;