libobs: Add gs_begin_frame for duplicators

We really shouldn't be resetting duplicator state as part of gs_flush.
gs_begin_scene is not ideal because it is called twice per frame, and
only after duplicators have been ticked. Even though it makes no
user-facing difference, it makes more logical sense to reset at the top
of the frame than the bottom.
master
jpark37 2019-10-10 21:06:01 -07:00
parent 9fa1ec3ae9
commit ade65df2aa
8 changed files with 34 additions and 3 deletions

View File

@ -1631,6 +1631,16 @@ void device_stage_texture(gs_device_t *device, gs_stagesurf_t *dst,
} }
} }
extern "C" void reset_duplicators(void);
void device_begin_frame(gs_device_t *device)
{
/* does nothing in D3D11 */
UNUSED_PARAMETER(device);
reset_duplicators();
}
void device_begin_scene(gs_device_t *device) void device_begin_scene(gs_device_t *device)
{ {
clear_textures(device); clear_textures(device);
@ -1761,12 +1771,9 @@ void device_present(gs_device_t *device)
} }
} }
extern "C" void reset_duplicators(void);
void device_flush(gs_device_t *device) void device_flush(gs_device_t *device)
{ {
device->context->Flush(); device->context->Flush();
reset_duplicators();
} }
void device_set_cull_mode(gs_device_t *device, enum gs_cull_mode mode) void device_set_cull_mode(gs_device_t *device, enum gs_cull_mode mode)

View File

@ -929,6 +929,12 @@ void device_copy_texture(gs_device_t *device, gs_texture_t *dst,
device_copy_texture_region(device, dst, 0, 0, src, 0, 0, 0, 0); device_copy_texture_region(device, dst, 0, 0, src, 0, 0, 0, 0);
} }
void device_begin_frame(gs_device_t *device)
{
/* does nothing */
UNUSED_PARAMETER(device);
}
void device_begin_scene(gs_device_t *device) void device_begin_scene(gs_device_t *device)
{ {
clear_textures(device); clear_textures(device);

View File

@ -113,6 +113,7 @@ EXPORT void device_copy_texture_region(gs_device_t *device, gs_texture_t *dst,
uint32_t src_h); uint32_t src_h);
EXPORT void device_stage_texture(gs_device_t *device, gs_stagesurf_t *dst, EXPORT void device_stage_texture(gs_device_t *device, gs_stagesurf_t *dst,
gs_texture_t *src); gs_texture_t *src);
EXPORT void device_begin_frame(gs_device_t *device);
EXPORT void device_begin_scene(gs_device_t *device); EXPORT void device_begin_scene(gs_device_t *device);
EXPORT void device_draw(gs_device_t *device, enum gs_draw_mode draw_mode, EXPORT void device_draw(gs_device_t *device, enum gs_draw_mode draw_mode,
uint32_t start_vert, uint32_t num_verts); uint32_t start_vert, uint32_t num_verts);

View File

@ -85,6 +85,7 @@ bool load_graphics_imports(struct gs_exports *exports, void *module,
GRAPHICS_IMPORT(device_copy_texture_region); GRAPHICS_IMPORT(device_copy_texture_region);
GRAPHICS_IMPORT(device_copy_texture); GRAPHICS_IMPORT(device_copy_texture);
GRAPHICS_IMPORT(device_stage_texture); GRAPHICS_IMPORT(device_stage_texture);
GRAPHICS_IMPORT(device_begin_frame);
GRAPHICS_IMPORT(device_begin_scene); GRAPHICS_IMPORT(device_begin_scene);
GRAPHICS_IMPORT(device_draw); GRAPHICS_IMPORT(device_draw);
GRAPHICS_IMPORT(device_load_swapchain); GRAPHICS_IMPORT(device_load_swapchain);

View File

@ -115,6 +115,7 @@ struct gs_exports {
uint32_t src_w, uint32_t src_h); uint32_t src_w, uint32_t src_h);
void (*device_stage_texture)(gs_device_t *device, gs_stagesurf_t *dst, void (*device_stage_texture)(gs_device_t *device, gs_stagesurf_t *dst,
gs_texture_t *src); gs_texture_t *src);
void (*device_begin_frame)(gs_device_t *device);
void (*device_begin_scene)(gs_device_t *device); void (*device_begin_scene)(gs_device_t *device);
void (*device_draw)(gs_device_t *device, enum gs_draw_mode draw_mode, void (*device_draw)(gs_device_t *device, enum gs_draw_mode draw_mode,
uint32_t start_vert, uint32_t num_verts); uint32_t start_vert, uint32_t num_verts);

View File

@ -1737,6 +1737,16 @@ void gs_stage_texture(gs_stagesurf_t *dst, gs_texture_t *src)
graphics->exports.device_stage_texture(graphics->device, dst, src); graphics->exports.device_stage_texture(graphics->device, dst, src);
} }
void gs_begin_frame(void)
{
graphics_t *graphics = thread_graphics;
if (!gs_valid("gs_begin_frame"))
return;
graphics->exports.device_begin_frame(graphics->device);
}
void gs_begin_scene(void) void gs_begin_scene(void)
{ {
graphics_t *graphics = thread_graphics; graphics_t *graphics = thread_graphics;

View File

@ -668,6 +668,7 @@ EXPORT void gs_copy_texture_region(gs_texture_t *dst, uint32_t dst_x,
uint32_t src_w, uint32_t src_h); uint32_t src_w, uint32_t src_h);
EXPORT void gs_stage_texture(gs_stagesurf_t *dst, gs_texture_t *src); EXPORT void gs_stage_texture(gs_stagesurf_t *dst, gs_texture_t *src);
EXPORT void gs_begin_frame(void);
EXPORT void gs_begin_scene(void); EXPORT void gs_begin_scene(void);
EXPORT void gs_draw(enum gs_draw_mode draw_mode, uint32_t start_vert, EXPORT void gs_draw(enum gs_draw_mode draw_mode, uint32_t start_vert,
uint32_t num_verts); uint32_t num_verts);

View File

@ -866,6 +866,10 @@ void *obs_graphics_thread(void *param)
profile_start(video_thread_name); profile_start(video_thread_name);
gs_enter_context(obs->video.graphics);
gs_begin_frame();
gs_leave_context();
profile_start(tick_sources_name); profile_start(tick_sources_name);
last_time = tick_sources(obs->video.video_time, last_time); last_time = tick_sources(obs->video.video_time, last_time);
profile_end(tick_sources_name); profile_end(tick_sources_name);