diff --git a/drivers/gles3/storage/texture_storage.cpp b/drivers/gles3/storage/texture_storage.cpp index a6842b1294f..e74747954f5 100644 --- a/drivers/gles3/storage/texture_storage.cpp +++ b/drivers/gles3/storage/texture_storage.cpp @@ -334,16 +334,7 @@ void TextureStorage::canvas_texture_set_texture_repeat(RID p_canvas_texture, RS: /* Texture API */ -Ref TextureStorage::_get_gl_image_and_format(const Ref &p_image, Image::Format p_format, Image::Format &r_real_format, GLenum &r_gl_format, GLenum &r_gl_internal_format, GLenum &r_gl_type, bool &r_compressed, bool p_force_decompress) const { - Config *config = Config::get_singleton(); - r_gl_format = 0; - Ref image = p_image; - r_compressed = false; - r_real_format = p_format; - - bool need_decompress = false; - bool decompress_ra_to_rg = false; - +static inline Error _get_gl_uncompressed_format(Image::Format p_format, GLenum &r_gl_format, GLenum &r_gl_internal_format, GLenum &r_gl_type) { switch (p_format) { case Image::FORMAT_L8: { if (RasterizerGLES3::is_gles_over_gl()) { @@ -371,55 +362,51 @@ Ref TextureStorage::_get_gl_image_and_format(const Ref &p_image, I r_gl_internal_format = GL_R8; r_gl_format = GL_RED; r_gl_type = GL_UNSIGNED_BYTE; - } break; case Image::FORMAT_RG8: { r_gl_internal_format = GL_RG8; r_gl_format = GL_RG; r_gl_type = GL_UNSIGNED_BYTE; - } break; case Image::FORMAT_RGB8: { r_gl_internal_format = GL_RGB8; r_gl_format = GL_RGB; r_gl_type = GL_UNSIGNED_BYTE; - } break; case Image::FORMAT_RGBA8: { - r_gl_format = GL_RGBA; r_gl_internal_format = GL_RGBA8; + r_gl_format = GL_RGBA; r_gl_type = GL_UNSIGNED_BYTE; - } break; case Image::FORMAT_RGBA4444: { r_gl_internal_format = GL_RGBA4; r_gl_format = GL_RGBA; r_gl_type = GL_UNSIGNED_SHORT_4_4_4_4; - + } break; + case Image::FORMAT_RGB565: { + r_gl_internal_format = GL_RGB565; + r_gl_format = GL_RGB; + r_gl_type = GL_UNSIGNED_SHORT_5_6_5; } break; case Image::FORMAT_RF: { r_gl_internal_format = GL_R32F; r_gl_format = GL_RED; r_gl_type = GL_FLOAT; - } break; case Image::FORMAT_RGF: { r_gl_internal_format = GL_RG32F; r_gl_format = GL_RG; r_gl_type = GL_FLOAT; - } break; case Image::FORMAT_RGBF: { r_gl_internal_format = GL_RGB32F; r_gl_format = GL_RGB; r_gl_type = GL_FLOAT; - } break; case Image::FORMAT_RGBAF: { r_gl_internal_format = GL_RGBA32F; r_gl_format = GL_RGBA; r_gl_type = GL_FLOAT; - } break; case Image::FORMAT_RH: { r_gl_internal_format = GL_R16F; @@ -430,26 +417,48 @@ Ref TextureStorage::_get_gl_image_and_format(const Ref &p_image, I r_gl_internal_format = GL_RG16F; r_gl_format = GL_RG; r_gl_type = GL_HALF_FLOAT; - } break; case Image::FORMAT_RGBH: { r_gl_internal_format = GL_RGB16F; r_gl_format = GL_RGB; r_gl_type = GL_HALF_FLOAT; - } break; case Image::FORMAT_RGBAH: { r_gl_internal_format = GL_RGBA16F; r_gl_format = GL_RGBA; r_gl_type = GL_HALF_FLOAT; - } break; case Image::FORMAT_RGBE9995: { r_gl_internal_format = GL_RGB9_E5; r_gl_format = GL_RGB; r_gl_type = GL_UNSIGNED_INT_5_9_9_9_REV; - } break; + default: { + return ERR_UNAVAILABLE; + } + } + + return OK; +} + +Ref TextureStorage::_get_gl_image_and_format(const Ref &p_image, Image::Format p_format, Image::Format &r_real_format, GLenum &r_gl_format, GLenum &r_gl_internal_format, GLenum &r_gl_type, bool &r_compressed, bool p_force_decompress) const { + Config *config = Config::get_singleton(); + r_gl_format = 0; + Ref image = p_image; + r_compressed = false; + r_real_format = p_format; + + if (!Image::is_format_compressed(p_format)) { + Error err = _get_gl_uncompressed_format(p_format, r_gl_format, r_gl_internal_format, r_gl_type); + ERR_FAIL_COND_V_MSG(err != OK, Ref(), vformat("The image format %d is not supported by the Compatibility renderer.", p_format)); + return p_image; + } + + // For compressed images, some formats may not be supported by the current device and will require decompression. + bool need_decompress = false; + bool decompress_ra_to_rg = false; + + switch (p_format) { case Image::FORMAT_DXT1: { if (config->s3tc_supported) { r_gl_internal_format = _EXT_COMPRESSED_RGBA_S3TC_DXT1_EXT; @@ -536,7 +545,6 @@ Ref TextureStorage::_get_gl_image_and_format(const Ref &p_image, I r_gl_format = GL_RED; r_gl_type = GL_UNSIGNED_BYTE; r_compressed = true; - } else { need_decompress = true; } @@ -547,7 +555,6 @@ Ref TextureStorage::_get_gl_image_and_format(const Ref &p_image, I r_gl_format = GL_RED; r_gl_type = GL_UNSIGNED_BYTE; r_compressed = true; - } else { need_decompress = true; } @@ -558,7 +565,6 @@ Ref TextureStorage::_get_gl_image_and_format(const Ref &p_image, I r_gl_format = GL_RG; r_gl_type = GL_UNSIGNED_BYTE; r_compressed = true; - } else { need_decompress = true; } @@ -569,7 +575,6 @@ Ref TextureStorage::_get_gl_image_and_format(const Ref &p_image, I r_gl_format = GL_RG; r_gl_type = GL_UNSIGNED_BYTE; r_compressed = true; - } else { need_decompress = true; } @@ -581,7 +586,6 @@ Ref TextureStorage::_get_gl_image_and_format(const Ref &p_image, I r_gl_format = GL_RGB; r_gl_type = GL_UNSIGNED_BYTE; r_compressed = true; - } else { need_decompress = true; } @@ -592,7 +596,6 @@ Ref TextureStorage::_get_gl_image_and_format(const Ref &p_image, I r_gl_format = GL_RGBA; r_gl_type = GL_UNSIGNED_BYTE; r_compressed = true; - } else { need_decompress = true; } @@ -603,7 +606,6 @@ Ref TextureStorage::_get_gl_image_and_format(const Ref &p_image, I r_gl_format = GL_RGBA; r_gl_type = GL_UNSIGNED_BYTE; r_compressed = true; - } else { need_decompress = true; } @@ -642,7 +644,6 @@ Ref TextureStorage::_get_gl_image_and_format(const Ref &p_image, I r_gl_format = GL_RGBA; r_gl_type = GL_UNSIGNED_BYTE; r_compressed = true; - } else { need_decompress = true; } @@ -653,7 +654,6 @@ Ref TextureStorage::_get_gl_image_and_format(const Ref &p_image, I r_gl_format = GL_RGBA; r_gl_type = GL_UNSIGNED_BYTE; r_compressed = true; - } else { need_decompress = true; } @@ -664,7 +664,6 @@ Ref TextureStorage::_get_gl_image_and_format(const Ref &p_image, I r_gl_format = GL_RGBA; r_gl_type = GL_UNSIGNED_BYTE; r_compressed = true; - } else { need_decompress = true; } @@ -675,7 +674,6 @@ Ref TextureStorage::_get_gl_image_and_format(const Ref &p_image, I r_gl_format = GL_RGBA; r_gl_type = GL_UNSIGNED_BYTE; r_compressed = true; - } else { need_decompress = true; } @@ -690,41 +688,17 @@ Ref TextureStorage::_get_gl_image_and_format(const Ref &p_image, I image = image->duplicate(); image->decompress(); ERR_FAIL_COND_V(image->is_compressed(), image); + if (decompress_ra_to_rg) { image->convert_ra_rgba8_to_rg(); image->convert(Image::FORMAT_RG8); } - switch (image->get_format()) { - case Image::FORMAT_RG8: { - r_gl_format = GL_RG; - r_gl_internal_format = GL_RG8; - r_gl_type = GL_UNSIGNED_BYTE; - r_real_format = Image::FORMAT_RG8; - r_compressed = false; - } break; - case Image::FORMAT_RGB8: { - r_gl_format = GL_RGB; - r_gl_internal_format = GL_RGB; - r_gl_type = GL_UNSIGNED_BYTE; - r_real_format = Image::FORMAT_RGB8; - r_compressed = false; - } break; - case Image::FORMAT_RGBA8: { - r_gl_format = GL_RGBA; - r_gl_internal_format = GL_RGBA; - r_gl_type = GL_UNSIGNED_BYTE; - r_real_format = Image::FORMAT_RGBA8; - r_compressed = false; - } break; - default: { - image->convert(Image::FORMAT_RGBA8); - r_gl_format = GL_RGBA; - r_gl_internal_format = GL_RGBA; - r_gl_type = GL_UNSIGNED_BYTE; - r_real_format = Image::FORMAT_RGBA8; - r_compressed = false; - } break; - } + + Error err = _get_gl_uncompressed_format(image->get_format(), r_gl_format, r_gl_internal_format, r_gl_type); + ERR_FAIL_COND_V_MSG(err != OK, Ref(), vformat("The image format %d is not supported by the Compatibility renderer.", image->get_format())); + + r_real_format = image->get_format(); + r_compressed = false; } return image;