Route VR and startup GL state through backend
This commit is contained in:
@@ -29,6 +29,11 @@ void disable_opengl_state(std::uint32_t state) noexcept
|
||||
glDisable(static_cast<GLenum>(state));
|
||||
}
|
||||
|
||||
std::uint8_t is_opengl_state_enabled(std::uint32_t state) noexcept
|
||||
{
|
||||
return static_cast<std::uint8_t>(glIsEnabled(static_cast<GLenum>(state)));
|
||||
}
|
||||
|
||||
void set_opengl_viewport(std::int32_t x, std::int32_t y, std::int32_t width, std::int32_t height) noexcept
|
||||
{
|
||||
glViewport(static_cast<GLint>(x), static_cast<GLint>(y), static_cast<GLsizei>(width), static_cast<GLsizei>(height));
|
||||
@@ -75,6 +80,20 @@ void apply_vr_render_capability(std::uint32_t state, bool enabled)
|
||||
LOG("OpenGL VR render state failed: %s", status.message);
|
||||
}
|
||||
|
||||
bool query_vr_render_capability(std::uint32_t state)
|
||||
{
|
||||
const auto result = pp::renderer::gl::query_opengl_capability_state(
|
||||
state,
|
||||
pp::renderer::gl::OpenGlCapabilityStateQueryDispatch {
|
||||
.is_enabled = is_opengl_state_enabled,
|
||||
});
|
||||
if (!result.ok()) {
|
||||
LOG("OpenGL VR render state query failed: %s", result.status().message);
|
||||
return false;
|
||||
}
|
||||
return result.value();
|
||||
}
|
||||
|
||||
void clear_vr_depth_buffer()
|
||||
{
|
||||
const auto status = pp::renderer::gl::clear_opengl_buffers(
|
||||
@@ -262,8 +281,8 @@ void App::vr_draw(const glm::mat4& proj, const glm::mat4& camera, const glm::mat
|
||||
glm::vec3 origin = glm::vec3(0, 0, -1) * glm::transpose(glm::mat3(pose));
|
||||
vr_rot = glm::lookAt({ 0, 0, 0 }, origin, { 0, 1, 0 });
|
||||
|
||||
auto blend = glIsEnabled(pp::renderer::gl::blend_state());
|
||||
auto depth = glIsEnabled(pp::renderer::gl::depth_test_state());
|
||||
const bool blend = query_vr_render_capability(pp::renderer::gl::blend_state());
|
||||
const bool depth = query_vr_render_capability(pp::renderer::gl::depth_test_state());
|
||||
|
||||
apply_vr_render_capability(pp::renderer::gl::blend_state(), false);
|
||||
apply_vr_render_capability(pp::renderer::gl::depth_test_state(), false);
|
||||
@@ -556,8 +575,8 @@ void App::vr_draw(const glm::mat4& proj, const glm::mat4& camera, const glm::mat
|
||||
mode->on_Draw(ortho_proj, proj, camera);
|
||||
*/
|
||||
|
||||
apply_vr_render_capability(pp::renderer::gl::blend_state(), blend != 0U);
|
||||
apply_vr_render_capability(pp::renderer::gl::depth_test_state(), depth != 0U);
|
||||
apply_vr_render_capability(pp::renderer::gl::blend_state(), blend);
|
||||
apply_vr_render_capability(pp::renderer::gl::depth_test_state(), depth);
|
||||
sampler.unbind();
|
||||
}
|
||||
|
||||
|
||||
24
src/main.cpp
24
src/main.cpp
@@ -89,6 +89,11 @@ void win32_renderdoc_frame_start() { }
|
||||
void win32_renderdoc_frame_end() { }
|
||||
#endif
|
||||
|
||||
const char* query_opengl_string(std::uint32_t name) noexcept
|
||||
{
|
||||
return reinterpret_cast<const char*>(glGetString(static_cast<GLenum>(name)));
|
||||
}
|
||||
|
||||
HRESULT(*GetDpiForMonitor_fn)(HMONITOR hmonitor, MONITOR_DPI_TYPE dpiType, UINT* dpiX, UINT* dpiY);
|
||||
HRESULT(*SetProcessDpiAwareness_fn)(PROCESS_DPI_AWARENESS value);
|
||||
void init_shcore_API()
|
||||
@@ -853,17 +858,28 @@ int main(int argc, char** argv)
|
||||
return 0;
|
||||
}
|
||||
|
||||
LOG("GL version: %s", glGetString(static_cast<GLenum>(pp::renderer::gl::version_string_name())));
|
||||
LOG("GL vendor: %s", glGetString(static_cast<GLenum>(pp::renderer::gl::vendor_string_name())));
|
||||
LOG("GL renderer: %s", glGetString(static_cast<GLenum>(pp::renderer::gl::renderer_string_name())));
|
||||
auto runtime_info = pp::renderer::gl::OpenGlRuntimeInfo {};
|
||||
const auto runtime_info_result = pp::renderer::gl::query_opengl_runtime_info(
|
||||
pp::renderer::gl::OpenGlRuntimeInfoDispatch {
|
||||
.get_string = query_opengl_string,
|
||||
});
|
||||
if (runtime_info_result.ok()) {
|
||||
runtime_info = runtime_info_result.value();
|
||||
LOG("GL version: %s", runtime_info.version);
|
||||
LOG("GL vendor: %s", runtime_info.vendor);
|
||||
LOG("GL renderer: %s", runtime_info.renderer);
|
||||
} else {
|
||||
LOG("OpenGL runtime info query failed: %s", runtime_info_result.status().message);
|
||||
}
|
||||
|
||||
#ifdef USE_RENDERDOC
|
||||
if (!win32_renderdoc_init())
|
||||
LOG("Renderdoc not started");
|
||||
#endif // USE_RENDERDOC
|
||||
|
||||
const auto renderer_name = std::string(runtime_info.renderer != nullptr ? runtime_info.renderer : "");
|
||||
swprintf_s(window_title, L"PanoPainter %s (%s)", g_version_number_w,
|
||||
str2wstr((char*)glGetString(static_cast<GLenum>(pp::renderer::gl::renderer_string_name()))).c_str());
|
||||
str2wstr(renderer_name).c_str());
|
||||
|
||||
// If supported create a 3.3 context
|
||||
if (GLAD_WGL_ARB_create_context)
|
||||
|
||||
@@ -526,6 +526,18 @@ pp::foundation::Status apply_opengl_capability(
|
||||
return pp::foundation::Status::success();
|
||||
}
|
||||
|
||||
pp::foundation::Result<bool> query_opengl_capability_state(
|
||||
std::uint32_t state,
|
||||
OpenGlCapabilityStateQueryDispatch dispatch) noexcept
|
||||
{
|
||||
if (dispatch.is_enabled == nullptr) {
|
||||
return pp::foundation::Result<bool>::failure(
|
||||
pp::foundation::Status::invalid_argument("OpenGL capability state query callback must not be null"));
|
||||
}
|
||||
|
||||
return pp::foundation::Result<bool>::success(dispatch.is_enabled(state) != 0U);
|
||||
}
|
||||
|
||||
pp::foundation::Status apply_opengl_render_platform_hints(
|
||||
OpenGlRenderPlatformHintDispatch dispatch) noexcept
|
||||
{
|
||||
|
||||
@@ -530,6 +530,10 @@ struct OpenGlCapabilityDispatch {
|
||||
OpenGlCapabilityFn disable = nullptr;
|
||||
};
|
||||
|
||||
struct OpenGlCapabilityStateQueryDispatch {
|
||||
OpenGlIsEnabledFn is_enabled = nullptr;
|
||||
};
|
||||
|
||||
struct OpenGlRenderPlatformHintDispatch {
|
||||
OpenGlCapabilityFn enable = nullptr;
|
||||
};
|
||||
@@ -760,6 +764,9 @@ struct OpenGlMeshDeleteDispatch {
|
||||
std::uint32_t state,
|
||||
bool enabled,
|
||||
OpenGlCapabilityDispatch dispatch) noexcept;
|
||||
[[nodiscard]] pp::foundation::Result<bool> query_opengl_capability_state(
|
||||
std::uint32_t state,
|
||||
OpenGlCapabilityStateQueryDispatch dispatch) noexcept;
|
||||
[[nodiscard]] pp::foundation::Status apply_opengl_render_platform_hints(
|
||||
OpenGlRenderPlatformHintDispatch dispatch) noexcept;
|
||||
[[nodiscard]] pp::foundation::Status apply_opengl_debug_output_states(
|
||||
|
||||
Reference in New Issue
Block a user