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.
This commit is contained in:
Vasiliy Makarov 2020-09-16 18:07:54 +03:00
parent 26512dda93
commit f388ea00bf
5 changed files with 34 additions and 11 deletions

View file

@ -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.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.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.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"); config.support_npot_repeat_mipmap = config.extensions.has("GL_OES_texture_npot");
#ifdef JAVASCRIPT_ENABLED #ifdef JAVASCRIPT_ENABLED

View file

@ -1298,6 +1298,30 @@ String EditorExportPlatform::test_etc2() const {
return String(); 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 { int EditorExport::get_export_preset_count() const {
return export_presets.size(); return export_presets.size();

View file

@ -265,6 +265,7 @@ public:
virtual Ref<Texture> get_run_icon() const { return get_logo(); } virtual Ref<Texture> get_run_icon() const { return get_logo(); }
String test_etc2() const; //generic test for etc2 since most platforms use it 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<EditorExportPreset> &p_preset, String &r_error, bool &r_missing_templates) const = 0; virtual bool can_export(const Ref<EditorExportPreset> &p_preset, String &r_error, bool &r_missing_templates) const = 0;
virtual List<String> get_binary_extensions(const Ref<EditorExportPreset> &p_preset) const = 0; virtual List<String> get_binary_extensions(const Ref<EditorExportPreset> &p_preset) const = 0;

View file

@ -215,10 +215,12 @@ static void _compress_pvrtc4(Image *p_img) {
int ofs, size, w, h; int ofs, size, w, h;
img->get_mipmap_offset_size_and_dimensions(i, ofs, size, w, h); img->get_mipmap_offset_size_and_dimensions(i, ofs, size, w, h);
Javelin::RgbaBitmap bm(w, h); Javelin::RgbaBitmap bm(w, h);
for (int j = 0; j < size / 4; j++) { void *dst = (void *)bm.GetData();
copymem(dst, &r[ofs], size);
Javelin::ColorRgba<unsigned char> *dp = bm.GetData(); Javelin::ColorRgba<unsigned char> *dp = bm.GetData();
/* red and Green colors are swapped. */ for (int j = 0; j < size / 4; j++) {
new (dp) Javelin::ColorRgba<unsigned char>(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); new_img->get_mipmap_offset_size_and_dimensions(i, ofs, size, w, h);
Javelin::PvrTcEncoder::EncodeRgba4Bpp(&wr[ofs], bm); Javelin::PvrTcEncoder::EncodeRgba4Bpp(&wr[ofs], bm);

View file

@ -165,13 +165,9 @@ public:
void EditorExportPlatformIOS::get_preset_features(const Ref<EditorExportPreset> &p_preset, List<String> *r_features) { void EditorExportPlatformIOS::get_preset_features(const Ref<EditorExportPreset> &p_preset, List<String> *r_features) {
String driver = ProjectSettings::get_singleton()->get("rendering/quality/driver/driver_name"); String driver = ProjectSettings::get_singleton()->get("rendering/quality/driver/driver_name");
if (driver == "GLES2") { r_features->push_back("pvrtc");
r_features->push_back("etc"); if (driver == "GLES3") {
} else if (driver == "GLES3") {
r_features->push_back("etc2"); r_features->push_back("etc2");
if (ProjectSettings::get_singleton()->get("rendering/quality/driver/fallback_to_gles2")) {
r_features->push_back("etc");
}
} }
Vector<String> architectures = _get_preset_architectures(p_preset); Vector<String> architectures = _get_preset_architectures(p_preset);
@ -1515,7 +1511,7 @@ bool EditorExportPlatformIOS::can_export(const Ref<EditorExportPreset> &p_preset
} }
} }
String etc_error = test_etc2(); String etc_error = test_etc2_or_pvrtc();
if (etc_error != String()) { if (etc_error != String()) {
valid = false; valid = false;
err += etc_error; err += etc_error;