Fix some possible segfaults with HW render.

This commit is contained in:
Themaister 2013-03-28 12:27:40 +01:00
parent d1b204e63e
commit 4bcc566afb
2 changed files with 29 additions and 5 deletions

View File

@ -667,6 +667,12 @@ static void init_filter(bool rgb32)
if (!*g_settings.video.filter_path) if (!*g_settings.video.filter_path)
return; return;
if (g_extern.system.hw_render_callback.context_type)
{
RARCH_WARN("Cannot use CPU filters when hardware rendering is used.\n");
return;
}
RARCH_LOG("Loading bSNES filter from \"%s\"\n", g_settings.video.filter_path); RARCH_LOG("Loading bSNES filter from \"%s\"\n", g_settings.video.filter_path);
g_extern.filter.lib = dylib_load(g_settings.video.filter_path); g_extern.filter.lib = dylib_load(g_settings.video.filter_path);
if (!g_extern.filter.lib) if (!g_extern.filter.lib)

View File

@ -141,10 +141,18 @@ static void take_screenshot(void)
bool ret = false; bool ret = false;
if (g_settings.video.gpu_screenshot && driver.video->read_viewport && driver.video->viewport_info) if (g_extern.frame_cache.data)
ret = take_screenshot_viewport(); {
else if (g_extern.frame_cache.data) if ((g_settings.video.gpu_screenshot ||
ret = take_screenshot_raw(); (g_extern.frame_cache.data == RETRO_HW_FRAME_BUFFER_VALID)) &&
driver.video->read_viewport &&
driver.video->viewport_info)
ret = take_screenshot_viewport();
else if (g_extern.frame_cache.data && (g_extern.frame_cache.data != RETRO_HW_FRAME_BUFFER_VALID))
ret = take_screenshot_raw();
else
RARCH_ERR("Cannot take screenshot. GPU rendering is used and read_viewport is not supported.\n");
}
const char *msg = NULL; const char *msg = NULL;
if (ret) if (ret)
@ -329,10 +337,14 @@ void rarch_render_cached_frame(void)
g_extern.recording = false; g_extern.recording = false;
#endif #endif
const void *frame = g_extern.frame_cache.data;
if (frame == RETRO_HW_FRAME_BUFFER_VALID)
frame = NULL; // Dupe
// Not 100% safe, since the library might have // Not 100% safe, since the library might have
// freed the memory, but no known implementations do this :D // freed the memory, but no known implementations do this :D
// It would be really stupid at any rate ... // It would be really stupid at any rate ...
video_frame(g_extern.frame_cache.data, video_frame(frame,
g_extern.frame_cache.width, g_extern.frame_cache.width,
g_extern.frame_cache.height, g_extern.frame_cache.height,
g_extern.frame_cache.pitch); g_extern.frame_cache.pitch);
@ -1291,6 +1303,12 @@ static void init_recording(void)
if (!g_extern.recording) if (!g_extern.recording)
return; return;
if (!g_settings.video.gpu_record && g_extern.system.hw_render_callback.context_type)
{
RARCH_WARN("Libretro core is hardware rendered. Must use post-shaded FFmpeg recording as well.\n");
return;
}
double fps = g_extern.system.av_info.timing.fps; double fps = g_extern.system.av_info.timing.fps;
double samplerate = g_extern.system.av_info.timing.sample_rate; double samplerate = g_extern.system.av_info.timing.sample_rate;
RARCH_LOG("Custom timing given: FPS: %.4f, Sample rate: %.4f\n", (float)fps, (float)samplerate); RARCH_LOG("Custom timing given: FPS: %.4f, Sample rate: %.4f\n", (float)fps, (float)samplerate);