From f388ea00bf820d8bfa621a9ff394804751db91e9 Mon Sep 17 00:00:00 2001 From: Vasiliy Makarov Date: Wed, 16 Sep 2020 18:07:54 +0300 Subject: [PATCH] iOS: Fix multiple issues with PVRTC import, disable ETC1 Fixes: #28683, #28621, #28596 and maybe others For iOS we enable pvrtc feature by default for both GLES2/GLES3 Etc1 for iOS doesn't have any sense, so it disabled. Fixed checks in export editor. Fixed pvrtc ability detection in GLES2 driver. Fixed pvrtc encoding procedure. --- drivers/gles2/rasterizer_storage_gles2.cpp | 2 +- editor/editor_export.cpp | 24 ++++++++++++++++++++++ editor/editor_export.h | 1 + modules/pvr/texture_loader_pvr.cpp | 8 +++++--- platform/iphone/export/export.cpp | 10 +++------ 5 files changed, 34 insertions(+), 11 deletions(-) diff --git a/drivers/gles2/rasterizer_storage_gles2.cpp b/drivers/gles2/rasterizer_storage_gles2.cpp index ede0ec2e532..1ea85c3b46f 100644 --- a/drivers/gles2/rasterizer_storage_gles2.cpp +++ b/drivers/gles2/rasterizer_storage_gles2.cpp @@ -5898,7 +5898,7 @@ void RasterizerStorageGLES2::initialize() { config.float_texture_supported = config.extensions.has("GL_ARB_texture_float") || config.extensions.has("GL_OES_texture_float"); config.s3tc_supported = config.extensions.has("GL_EXT_texture_compression_s3tc") || config.extensions.has("WEBGL_compressed_texture_s3tc"); config.etc1_supported = config.extensions.has("GL_OES_compressed_ETC1_RGB8_texture") || config.extensions.has("WEBGL_compressed_texture_etc1"); - config.pvrtc_supported = config.extensions.has("IMG_texture_compression_pvrtc") || config.extensions.has("WEBGL_compressed_texture_pvrtc"); + config.pvrtc_supported = config.extensions.has("GL_IMG_texture_compression_pvrtc") || config.extensions.has("WEBGL_compressed_texture_pvrtc"); config.support_npot_repeat_mipmap = config.extensions.has("GL_OES_texture_npot"); #ifdef JAVASCRIPT_ENABLED diff --git a/editor/editor_export.cpp b/editor/editor_export.cpp index 16e25cb319e..6779196124b 100644 --- a/editor/editor_export.cpp +++ b/editor/editor_export.cpp @@ -1298,6 +1298,30 @@ String EditorExportPlatform::test_etc2() const { return String(); } +String EditorExportPlatform::test_etc2_or_pvrtc() const { + + String driver = ProjectSettings::get_singleton()->get("rendering/quality/driver/driver_name"); + bool driver_fallback = ProjectSettings::get_singleton()->get("rendering/quality/driver/fallback_to_gles2"); + bool etc2_supported = ProjectSettings::get_singleton()->get("rendering/vram_compression/import_etc2"); + bool pvrtc_supported = ProjectSettings::get_singleton()->get("rendering/vram_compression/import_pvrtc"); + + if (driver == "GLES2" && !pvrtc_supported) { + return TTR("Target platform requires 'PVRTC' texture compression for GLES2. Enable 'Import Pvrtc' in Project Settings."); + } else if (driver == "GLES3") { + String err; + if (!etc2_supported && !pvrtc_supported) { + err += TTR("Target platform requires 'ETC2' or 'PVRTC' texture compression for GLES3. Enable 'Import Etc 2' or 'Import Pvrtc' in Project Settings."); + } + if (driver_fallback && !pvrtc_supported) { + if (err != String()) + err += "\n"; + err += TTR("Target platform requires 'PVRTC' texture compression for the driver fallback to GLES2.\nEnable 'Import Pvrtc' in Project Settings, or disable 'Driver Fallback Enabled'."); + } + return err; + } + return String(); +} + int EditorExport::get_export_preset_count() const { return export_presets.size(); diff --git a/editor/editor_export.h b/editor/editor_export.h index e6acda4c60c..5055da7782d 100644 --- a/editor/editor_export.h +++ b/editor/editor_export.h @@ -265,6 +265,7 @@ public: virtual Ref get_run_icon() const { return get_logo(); } String test_etc2() const; //generic test for etc2 since most platforms use it + String test_etc2_or_pvrtc() const; // test for etc2 or pvrtc support for iOS virtual bool can_export(const Ref &p_preset, String &r_error, bool &r_missing_templates) const = 0; virtual List get_binary_extensions(const Ref &p_preset) const = 0; diff --git a/modules/pvr/texture_loader_pvr.cpp b/modules/pvr/texture_loader_pvr.cpp index 65c21d5af82..0cf058250c6 100644 --- a/modules/pvr/texture_loader_pvr.cpp +++ b/modules/pvr/texture_loader_pvr.cpp @@ -215,10 +215,12 @@ static void _compress_pvrtc4(Image *p_img) { int ofs, size, w, h; img->get_mipmap_offset_size_and_dimensions(i, ofs, size, w, h); Javelin::RgbaBitmap bm(w, h); + void *dst = (void *)bm.GetData(); + copymem(dst, &r[ofs], size); + Javelin::ColorRgba *dp = bm.GetData(); for (int j = 0; j < size / 4; j++) { - Javelin::ColorRgba *dp = bm.GetData(); - /* red and Green colors are swapped. */ - new (dp) Javelin::ColorRgba(r[ofs + 4 * j + 2], r[ofs + 4 * j + 1], r[ofs + 4 * j], r[ofs + 4 * j + 3]); + /* red and blue colors are swapped. */ + SWAP(dp[j].r, dp[j].b); } new_img->get_mipmap_offset_size_and_dimensions(i, ofs, size, w, h); Javelin::PvrTcEncoder::EncodeRgba4Bpp(&wr[ofs], bm); diff --git a/platform/iphone/export/export.cpp b/platform/iphone/export/export.cpp index a205f217395..2d03b0af0ee 100644 --- a/platform/iphone/export/export.cpp +++ b/platform/iphone/export/export.cpp @@ -165,13 +165,9 @@ public: void EditorExportPlatformIOS::get_preset_features(const Ref &p_preset, List *r_features) { String driver = ProjectSettings::get_singleton()->get("rendering/quality/driver/driver_name"); - if (driver == "GLES2") { - r_features->push_back("etc"); - } else if (driver == "GLES3") { + r_features->push_back("pvrtc"); + if (driver == "GLES3") { r_features->push_back("etc2"); - if (ProjectSettings::get_singleton()->get("rendering/quality/driver/fallback_to_gles2")) { - r_features->push_back("etc"); - } } Vector architectures = _get_preset_architectures(p_preset); @@ -1515,7 +1511,7 @@ bool EditorExportPlatformIOS::can_export(const Ref &p_preset } } - String etc_error = test_etc2(); + String etc_error = test_etc2_or_pvrtc(); if (etc_error != String()) { valid = false; err += etc_error;