HostDisplay: Fix possible race when saving screenshots

This commit is contained in:
Connor McLaughlin 2020-11-29 15:10:48 +10:00
parent 53697154f5
commit 39010320ea
2 changed files with 12 additions and 11 deletions

View file

@ -360,7 +360,7 @@ static bool CompressAndWriteTextureToFile(u32 width, u32 height, std::string fil
} }
bool HostDisplay::WriteTextureToFile(const void* texture_handle, u32 x, u32 y, u32 width, u32 height, bool HostDisplay::WriteTextureToFile(const void* texture_handle, u32 x, u32 y, u32 width, u32 height,
const char* filename, bool clear_alpha /* = true */, bool flip_y /* = false */, std::string filename, bool clear_alpha /* = true */, bool flip_y /* = false */,
u32 resize_width /* = 0 */, u32 resize_height /* = 0 */, u32 resize_width /* = 0 */, u32 resize_height /* = 0 */,
bool compress_on_thread /* = false */) bool compress_on_thread /* = false */)
{ {
@ -372,26 +372,27 @@ bool HostDisplay::WriteTextureToFile(const void* texture_handle, u32 x, u32 y, u
return false; return false;
} }
auto fp = FileSystem::OpenManagedCFile(filename, "wb"); auto fp = FileSystem::OpenManagedCFile(filename.c_str(), "wb");
if (!fp) if (!fp)
{ {
Log_ErrorPrintf("Can't open file '%s': errno %d", filename, errno); Log_ErrorPrintf("Can't open file '%s': errno %d", filename.c_str(), errno);
return false; return false;
} }
if (!compress_on_thread) if (!compress_on_thread)
{ {
return CompressAndWriteTextureToFile(width, height, filename, std::move(fp), clear_alpha, flip_y, resize_width, return CompressAndWriteTextureToFile(width, height, std::move(filename), std::move(fp), clear_alpha, flip_y,
resize_height, std::move(texture_data), texture_data_stride); resize_width, resize_height, std::move(texture_data), texture_data_stride);
} }
std::thread compress_thread(CompressAndWriteTextureToFile, width, height, filename, std::move(fp), clear_alpha, std::thread compress_thread(CompressAndWriteTextureToFile, width, height, std::move(filename), std::move(fp),
flip_y, resize_width, resize_height, std::move(texture_data), texture_data_stride); clear_alpha, flip_y, resize_width, resize_height, std::move(texture_data),
texture_data_stride);
compress_thread.detach(); compress_thread.detach();
return true; return true;
} }
bool HostDisplay::WriteDisplayTextureToFile(const char* filename, bool full_resolution /* = true */, bool HostDisplay::WriteDisplayTextureToFile(std::string filename, bool full_resolution /* = true */,
bool apply_aspect_ratio /* = true */, bool compress_on_thread /* = false */) bool apply_aspect_ratio /* = true */, bool compress_on_thread /* = false */)
{ {
if (!m_display_texture_handle || m_display_texture_format != HostDisplayPixelFormat::RGBA8) if (!m_display_texture_handle || m_display_texture_format != HostDisplayPixelFormat::RGBA8)
@ -454,7 +455,7 @@ bool HostDisplay::WriteDisplayTextureToFile(const char* filename, bool full_reso
} }
return WriteTextureToFile(m_display_texture_handle, m_display_texture_view_x, read_y, m_display_texture_view_width, return WriteTextureToFile(m_display_texture_handle, m_display_texture_view_x, read_y, m_display_texture_view_width,
read_height, filename, true, flip_y, static_cast<u32>(resize_width), read_height, std::move(filename), true, flip_y, static_cast<u32>(resize_width),
static_cast<u32>(resize_height), compress_on_thread); static_cast<u32>(resize_height), compress_on_thread);
} }

View file

@ -194,12 +194,12 @@ public:
s32 window_height, s32 top_margin) const; s32 window_height, s32 top_margin) const;
/// Helper function to save texture data to a PNG. If flip_y is set, the image will be flipped aka OpenGL. /// Helper function to save texture data to a PNG. If flip_y is set, the image will be flipped aka OpenGL.
bool WriteTextureToFile(const void* texture_handle, u32 x, u32 y, u32 width, u32 height, const char* filename, bool WriteTextureToFile(const void* texture_handle, u32 x, u32 y, u32 width, u32 height, std::string filename,
bool clear_alpha = true, bool flip_y = false, u32 resize_width = 0, u32 resize_height = 0, bool clear_alpha = true, bool flip_y = false, u32 resize_width = 0, u32 resize_height = 0,
bool compress_on_thread = false); bool compress_on_thread = false);
/// Helper function to save current display texture to PNG. /// Helper function to save current display texture to PNG.
bool WriteDisplayTextureToFile(const char* filename, bool full_resolution = true, bool apply_aspect_ratio = true, bool WriteDisplayTextureToFile(std::string filename, bool full_resolution = true, bool apply_aspect_ratio = true,
bool compress_on_thread = false); bool compress_on_thread = false);
/// Helper function to save current display texture to a buffer. /// Helper function to save current display texture to a buffer.