Skip to content

Commit 51f63a8

Browse files
committed
Refactor OpenGL/Vulkan backend setup
helper functions to obtain/validate backend state (ensure_opengl_backend_state, opengl_window_state, ensure_vulkan_backend_state, vulkan_backend_state) and consolidate repeated null/initialization checks. Replace many explicit backend setup/teardown functions with inline lambdas in the renderer vtables, reducing duplicated code for instance/device/window/surface setup, context backup/restore, frame present and cleanup. Also standardize framebuffer size handling (use renderer_set_framebuffer_size) and adjust texture/create/update flows to use the new helpers and clearer error messages. Overall this simplifies control flow and centralizes error handling for OpenGL and Vulkan backends. Signed-off-by: Vlad <shaamaan@gmail.com>
1 parent 8f9a1c9 commit 51f63a8

2 files changed

Lines changed: 197 additions & 209 deletions

File tree

src/imiv/imiv_renderer_opengl.cpp

Lines changed: 91 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)