@@ -296,6 +296,30 @@ namespace {
296296 OcioPreviewProgram ocio_preview;
297297 };
298298
299+ RendererBackendState*
300+ ensure_opengl_backend_state (RendererState& renderer_state,
301+ std::string& error_message)
302+ {
303+ if (!ensure_default_backend_state<RendererBackendState>(
304+ renderer_state)) {
305+ error_message = " failed to allocate OpenGL renderer state" ;
306+ return nullptr ;
307+ }
308+ return backend_state<RendererBackendState>(renderer_state);
309+ }
310+
311+ RendererBackendState* opengl_window_state (RendererState& renderer_state,
312+ std::string& error_message)
313+ {
314+ RendererBackendState* state = backend_state<RendererBackendState>(
315+ renderer_state);
316+ if (state == nullptr || state->window == nullptr ) {
317+ error_message = " OpenGL window is not initialized" ;
318+ return nullptr ;
319+ }
320+ return state;
321+ }
322+
299323 bool ensure_basic_preview_program (RendererBackendState& state,
300324 std::string& error_message);
301325 bool ensure_preview_framebuffer (RendererBackendState& state,
@@ -1409,12 +1433,10 @@ void main()
14091433 RendererTexture& texture,
14101434 std::string& error_message)
14111435 {
1412- RendererBackendState* state = backend_state<RendererBackendState>(
1413- renderer_state);
1414- if (state == nullptr || state->window == nullptr ) {
1415- error_message = " OpenGL window is not initialized" ;
1436+ RendererBackendState* state = opengl_window_state (renderer_state,
1437+ error_message);
1438+ if (state == nullptr )
14161439 return false ;
1417- }
14181440
14191441 SourceTextureUploadDesc upload;
14201442 if (!describe_native_source_upload (image, upload, error_message))
@@ -1495,12 +1517,11 @@ void main()
14951517 const PreviewControls& controls,
14961518 std::string& error_message)
14971519 {
1498- RendererBackendState* state = backend_state<RendererBackendState>(
1499- renderer_state );
1520+ RendererBackendState* state = opengl_window_state (renderer_state,
1521+ error_message );
15001522 RendererTextureBackendState* texture_state
15011523 = texture_backend_state<RendererTextureBackendState>(texture);
1502- if (state == nullptr || state->window == nullptr
1503- || texture_state == nullptr ) {
1524+ if (state == nullptr || texture_state == nullptr ) {
15041525 error_message = " OpenGL preview state is not initialized" ;
15051526 return false ;
15061527 }
@@ -1567,54 +1588,6 @@ void main()
15671588 return true ;
15681589 }
15691590
1570- bool opengl_setup_instance (RendererState& renderer_state,
1571- ImVector<const char *>& instance_extensions,
1572- std::string& error_message)
1573- {
1574- (void )instance_extensions;
1575- if (!ensure_default_backend_state<RendererBackendState>(
1576- renderer_state)) {
1577- error_message = " failed to allocate OpenGL renderer state" ;
1578- return false ;
1579- }
1580- backend_state<RendererBackendState>(renderer_state)->glsl_version
1581- = open_gl_glsl_version ();
1582- error_message.clear ();
1583- return true ;
1584- }
1585-
1586- bool opengl_setup_device (RendererState& renderer_state,
1587- std::string& error_message)
1588- {
1589- if (backend_state<RendererBackendState>(renderer_state) == nullptr ) {
1590- error_message = " OpenGL renderer state is not initialized" ;
1591- return false ;
1592- }
1593- error_message.clear ();
1594- return true ;
1595- }
1596-
1597- bool opengl_setup_window (RendererState& renderer_state, int width,
1598- int height, std::string& error_message)
1599- {
1600- renderer_set_framebuffer_size (renderer_state, width, height);
1601- error_message.clear ();
1602- return true ;
1603- }
1604-
1605- bool opengl_create_surface (RendererState& renderer_state,
1606- GLFWwindow* window, std::string& error_message)
1607- {
1608- if (!ensure_default_backend_state<RendererBackendState>(
1609- renderer_state)) {
1610- error_message = " failed to allocate OpenGL renderer state" ;
1611- return false ;
1612- }
1613- backend_state<RendererBackendState>(renderer_state)->window = window;
1614- error_message.clear ();
1615- return true ;
1616- }
1617-
16181591 void opengl_cleanup (RendererState& renderer_state)
16191592 {
16201593 RendererBackendState* state = backend_state<RendererBackendState>(
@@ -1637,12 +1610,10 @@ void main()
16371610 bool opengl_imgui_init (RendererState& renderer_state,
16381611 std::string& error_message)
16391612 {
1640- RendererBackendState* state = backend_state<RendererBackendState>(
1641- renderer_state);
1642- if (state == nullptr || state->window == nullptr ) {
1643- error_message = " OpenGL window is not initialized" ;
1613+ RendererBackendState* state = opengl_window_state (renderer_state,
1614+ error_message);
1615+ if (state == nullptr )
16441616 return false ;
1645- }
16461617 platform_glfw_make_context_current (state->window );
16471618 if (ImGui_ImplOpenGL3_Init (state->glsl_version )) {
16481619 state->imgui_initialized = true ;
@@ -1653,25 +1624,6 @@ void main()
16531624 return false ;
16541625 }
16551626
1656- void opengl_prepare_platform_windows (RendererState& renderer_state)
1657- {
1658- RendererBackendState* state = backend_state<RendererBackendState>(
1659- renderer_state);
1660- if (state == nullptr )
1661- return ;
1662- state->backup_context = platform_glfw_get_current_context ();
1663- }
1664-
1665- void opengl_finish_platform_windows (RendererState& renderer_state)
1666- {
1667- RendererBackendState* state = backend_state<RendererBackendState>(
1668- renderer_state);
1669- if (state == nullptr || state->backup_context == nullptr )
1670- return ;
1671- platform_glfw_make_context_current (state->backup_context );
1672- state->backup_context = nullptr ;
1673- }
1674-
16751627 void opengl_frame_render (RendererState& renderer_state,
16761628 ImDrawData* draw_data)
16771629 {
@@ -1695,15 +1647,6 @@ void main()
16951647 ImGui_ImplOpenGL3_RenderDrawData (draw_data);
16961648 }
16971649
1698- void opengl_frame_present (RendererState& renderer_state)
1699- {
1700- RendererBackendState* state = backend_state<RendererBackendState>(
1701- renderer_state);
1702- if (state == nullptr || state->window == nullptr )
1703- return ;
1704- platform_glfw_swap_buffers (state->window );
1705- }
1706-
17071650 bool opengl_screen_capture (ImGuiID viewport_id, int x, int y, int w, int h,
17081651 unsigned int * pixels, void * user_data)
17091652 {
@@ -1868,10 +1811,43 @@ void main()
18681811 opengl_destroy_texture,
18691812 opengl_update_preview_texture,
18701813 renderer_noop_quiesce_texture_preview_submission,
1871- opengl_setup_instance,
1872- opengl_setup_device,
1873- opengl_setup_window,
1874- opengl_create_surface,
1814+ [](RendererState& renderer_state,
1815+ ImVector<const char *>& instance_extensions,
1816+ std::string& error_message) {
1817+ (void )instance_extensions;
1818+ RendererBackendState* state
1819+ = ensure_opengl_backend_state (renderer_state, error_message);
1820+ if (state == nullptr )
1821+ return false ;
1822+ state->glsl_version = open_gl_glsl_version ();
1823+ error_message.clear ();
1824+ return true ;
1825+ },
1826+ [](RendererState& renderer_state, std::string& error_message) {
1827+ if (backend_state<RendererBackendState>(renderer_state)
1828+ == nullptr ) {
1829+ error_message = " OpenGL renderer state is not initialized" ;
1830+ return false ;
1831+ }
1832+ error_message.clear ();
1833+ return true ;
1834+ },
1835+ [](RendererState& renderer_state, int width, int height,
1836+ std::string& error_message) {
1837+ renderer_set_framebuffer_size (renderer_state, width, height);
1838+ error_message.clear ();
1839+ return true ;
1840+ },
1841+ [](RendererState& renderer_state, GLFWwindow* window,
1842+ std::string& error_message) {
1843+ RendererBackendState* state
1844+ = ensure_opengl_backend_state (renderer_state, error_message);
1845+ if (state == nullptr )
1846+ return false ;
1847+ state->window = window;
1848+ error_message.clear ();
1849+ return true ;
1850+ },
18751851 renderer_clear_backend_window<RendererBackendState>,
18761852 renderer_noop_platform_windows,
18771853 opengl_cleanup,
@@ -1882,10 +1858,28 @@ void main()
18821858 renderer_framebuffer_size_changed,
18831859 renderer_set_framebuffer_size,
18841860 renderer_set_clear_color,
1885- opengl_prepare_platform_windows,
1886- opengl_finish_platform_windows,
1861+ [](RendererState& renderer_state) {
1862+ if (RendererBackendState* state
1863+ = backend_state<RendererBackendState>(renderer_state)) {
1864+ state->backup_context = platform_glfw_get_current_context ();
1865+ }
1866+ },
1867+ [](RendererState& renderer_state) {
1868+ RendererBackendState* state = backend_state<RendererBackendState>(
1869+ renderer_state);
1870+ if (state == nullptr || state->backup_context == nullptr )
1871+ return ;
1872+ platform_glfw_make_context_current (state->backup_context );
1873+ state->backup_context = nullptr ;
1874+ },
18871875 opengl_frame_render,
1888- opengl_frame_present,
1876+ [](RendererState& renderer_state) {
1877+ RendererBackendState* state = backend_state<RendererBackendState>(
1878+ renderer_state);
1879+ if (state == nullptr || state->window == nullptr )
1880+ return ;
1881+ platform_glfw_swap_buffers (state->window );
1882+ },
18891883 opengl_screen_capture,
18901884 };
18911885
0 commit comments