Delayed CRC calculation for need_fullpath ROM loading (unpatched) -

we can get rid of the GEKKO ifdef for Gamecube/Wii since CRC
calculation for these kind of games will now be delayed until
content_get_rom_crc is called the first time, which typically only
happens during netplay
This commit is contained in:
twinaphex 2019-06-03 18:49:17 +02:00
parent 240f0a578c
commit 717c5c1e2f
2 changed files with 42 additions and 21 deletions

View File

@ -157,6 +157,9 @@ static int pending_subsystem_rom_num = 0;
static int pending_subsystem_id = 0; static int pending_subsystem_id = 0;
static unsigned pending_subsystem_rom_id = 0; static unsigned pending_subsystem_rom_id = 0;
static bool pending_content_rom_crc = false;
static char pending_content_rom_crc_path[PATH_MAX_LENGTH] = {0};
static char pending_subsystem_ident[255]; static char pending_subsystem_ident[255];
#if 0 #if 0
static char pending_subsystem_extensions[PATH_MAX_LENGTH]; static char pending_subsystem_extensions[PATH_MAX_LENGTH];
@ -349,12 +352,14 @@ static bool load_content_into_memory(
/* If we have a media type, ignore CRC32 calculation. */ /* If we have a media type, ignore CRC32 calculation. */
if (type == RARCH_CONTENT_NONE) if (type == RARCH_CONTENT_NONE)
{ {
bool has_patch = false;
/* First content file is significant, attempt to do patching, /* First content file is significant, attempt to do patching,
* CRC checking, etc. */ * CRC checking, etc. */
/* Attempt to apply a patch. */ /* Attempt to apply a patch. */
if (!content_ctx->patch_is_blocked) if (!content_ctx->patch_is_blocked)
patch_content( has_patch = patch_content(
content_ctx->is_ips_pref, content_ctx->is_ips_pref,
content_ctx->is_bps_pref, content_ctx->is_bps_pref,
content_ctx->is_ups_pref, content_ctx->is_ups_pref,
@ -364,9 +369,17 @@ static bool load_content_into_memory(
(uint8_t**)&ret_buf, (uint8_t**)&ret_buf,
(void*)length); (void*)length);
content_rom_crc = encoding_crc32(0, ret_buf, (size_t)*length); if (has_patch)
{
RARCH_LOG("CRC32: 0x%x .\n", (unsigned)content_rom_crc); content_rom_crc = encoding_crc32(0, ret_buf, (size_t)*length);
RARCH_LOG("CRC32: 0x%x .\n", (unsigned)content_rom_crc);
}
else
{
pending_content_rom_crc = true;
strlcpy(pending_content_rom_crc_path,
path, sizeof(pending_content_rom_crc_path));
}
} }
else else
content_rom_crc = 0; content_rom_crc = 0;
@ -644,14 +657,14 @@ static bool content_file_load(
if (string_is_empty(new_basedir) || !path_is_directory(new_basedir) || !is_path_accessible_using_standard_io(new_basedir)) if (string_is_empty(new_basedir) || !path_is_directory(new_basedir) || !is_path_accessible_using_standard_io(new_basedir))
{ {
RARCH_WARN("Tried copying to cache directory, but " RARCH_WARN("Tried copying to cache directory, but "
"cache directory was not set or found. " "cache directory was not set or found. "
"Setting cache directory to root of " "Setting cache directory to root of "
"writable app directory...\n"); "writable app directory...\n");
strlcpy(new_basedir, uwp_dir_data, new_basedir_size); strlcpy(new_basedir, uwp_dir_data, new_basedir_size);
} }
fill_pathname_join(new_path, new_basedir, fill_pathname_join(new_path, new_basedir,
path_basename(path), new_path_size); path_basename(path), new_path_size);
free(new_basedir); free(new_basedir);
/* TODO: This may fail on very large files... /* TODO: This may fail on very large files...
@ -679,10 +692,10 @@ static bool content_file_load(
free(buf); free(buf);
snprintf(msg, snprintf(msg,
msg_size, msg_size,
"%s \"%s\". (during copy write)\n", "%s \"%s\". (during copy write)\n",
msg_hash_to_str(MSG_COULD_NOT_READ_CONTENT_FILE), msg_hash_to_str(MSG_COULD_NOT_READ_CONTENT_FILE),
path); path);
*error_string = strdup(msg); *error_string = strdup(msg);
free(msg); free(msg);
return false; return false;
@ -694,7 +707,7 @@ static bool content_file_load(
additional_path_allocs->elems[additional_path_allocs->size - 1].data; additional_path_allocs->elems[additional_path_allocs->size - 1].data;
string_list_append(content_ctx->temporary_content, string_list_append(content_ctx->temporary_content,
new_path, attributes); new_path, attributes);
free(new_path); free(new_path);
@ -702,14 +715,11 @@ static bool content_file_load(
} }
#endif #endif
/* It adds up to 10 seconds when loading large roms.
* It's mainly used for network play which isn't available for these platforms. */
#if !defined(GEKKO)
RARCH_LOG("%s\n", msg_hash_to_str( RARCH_LOG("%s\n", msg_hash_to_str(
MSG_CONTENT_LOADING_SKIPPED_IMPLEMENTATION_WILL_DO_IT)); MSG_CONTENT_LOADING_SKIPPED_IMPLEMENTATION_WILL_DO_IT));
content_rom_crc = file_crc32(0, path); pending_content_rom_crc = true;
RARCH_LOG("CRC32: 0x%x .\n", (unsigned)content_rom_crc); strlcpy(pending_content_rom_crc_path,
#endif path, sizeof(pending_content_rom_crc_path));
} }
} }
@ -2032,6 +2042,13 @@ void content_unset_does_not_need_content(void)
uint32_t content_get_crc(void) uint32_t content_get_crc(void)
{ {
if (pending_content_rom_crc)
{
pending_content_rom_crc = false;
content_rom_crc = file_crc32(0,
(const char*)pending_content_rom_crc_path);
RARCH_LOG("CRC32: 0x%x .\n", (unsigned)content_rom_crc);
}
return content_rom_crc; return content_rom_crc;
} }
@ -2069,6 +2086,7 @@ void content_deinit(void)
content_rom_crc = 0; content_rom_crc = 0;
_content_is_inited = false; _content_is_inited = false;
core_does_not_need_content = false; core_does_not_need_content = false;
pending_content_rom_crc = false;
} }
/* Set environment variables before a subsystem load */ /* Set environment variables before a subsystem load */

View File

@ -630,7 +630,7 @@ static bool try_ips_patch(bool allow_ips,
* Apply patch to the content file in-memory. * Apply patch to the content file in-memory.
* *
**/ **/
static void patch_content( static bool patch_content(
bool is_ips_pref, bool is_ips_pref,
bool is_bps_pref, bool is_bps_pref,
bool is_ups_pref, bool is_ups_pref,
@ -651,7 +651,7 @@ static void patch_content(
{ {
RARCH_WARN("%s\n", RARCH_WARN("%s\n",
msg_hash_to_str(MSG_SEVERAL_PATCHES_ARE_EXPLICITLY_DEFINED)); msg_hash_to_str(MSG_SEVERAL_PATCHES_ARE_EXPLICITLY_DEFINED));
return; return false;
} }
if ( !try_ips_patch(allow_ips, name_ips, buf, size) if ( !try_ips_patch(allow_ips, name_ips, buf, size)
@ -660,5 +660,8 @@ static void patch_content(
{ {
RARCH_LOG("%s\n", RARCH_LOG("%s\n",
msg_hash_to_str(MSG_DID_NOT_FIND_A_VALID_CONTENT_PATCH)); msg_hash_to_str(MSG_DID_NOT_FIND_A_VALID_CONTENT_PATCH));
return false;
} }
return true;
} }