Move shader feature negotiation into renderer backend

This commit is contained in:
2026-06-04 19:49:06 +02:00
parent 1057dd488a
commit f2cb0f2276
7 changed files with 171 additions and 35 deletions

View File

@@ -6,15 +6,14 @@
namespace {
[[nodiscard]] pp::renderer::gl::OpenGlCapabilities shader_manager_capabilities() noexcept
void apply_shader_manager_feature_state(pp::renderer::gl::OpenGlFeatureState feature_state) noexcept
{
pp::renderer::gl::OpenGlCapabilities capabilities;
capabilities.framebuffer_fetch = ShaderManager::ext_framebuffer_fetch;
capabilities.map_buffer_alignment = ShaderManager::ext_map_aligned;
capabilities.float32_textures = ShaderManager::ext_float32;
capabilities.float32_linear = ShaderManager::ext_float32_linear;
capabilities.float16_textures = ShaderManager::ext_float16;
return capabilities;
ShaderManager::ext_framebuffer_fetch = feature_state.capabilities.framebuffer_fetch;
ShaderManager::ext_map_aligned = feature_state.capabilities.map_buffer_alignment;
ShaderManager::ext_float32 = feature_state.capabilities.float32_textures;
ShaderManager::ext_float32_linear = feature_state.capabilities.float32_linear;
ShaderManager::ext_float16 = feature_state.capabilities.float16_textures;
ShaderManager::set_render_device_features(feature_state.features);
}
void query_gl_integer(std::uint32_t name, std::int32_t* value) noexcept
@@ -40,42 +39,28 @@ void App::initShaders()
#endif // _DEBUG
render_task([] {
const auto extensions_result = pp::renderer::gl::query_opengl_extensions(
const auto detection_result = pp::renderer::gl::query_opengl_capability_detection(
pp::renderer::gl::OpenGlExtensionQueryDispatch {
.get_integer = query_gl_integer,
.get_string_indexed = query_gl_string_indexed,
});
if (!extensions_result.ok()) {
LOG("OpenGL extension query failed: %s", extensions_result.status().message);
},
pp::renderer::gl::opengl_runtime_for_current_build());
if (!detection_result.ok()) {
LOG("OpenGL capability detection failed: %s", detection_result.status().message);
return;
}
const auto& extension_storage = extensions_result.value();
std::vector<std::string_view> extension_views;
extension_views.reserve(extension_storage.size());
for (const auto& extension : extension_storage) {
extension_views.push_back(extension);
const auto& detection = detection_result.value();
for (const auto& extension : detection.extensions) {
LOG("EXT: %s", extension.c_str());
}
const auto runtime = pp::renderer::gl::opengl_runtime_for_current_build();
const auto capabilities = pp::renderer::gl::detect_opengl_capabilities(extension_views, runtime);
ShaderManager::ext_framebuffer_fetch = capabilities.framebuffer_fetch;
ShaderManager::ext_map_aligned = capabilities.map_buffer_alignment;
ShaderManager::ext_float32 = capabilities.float32_textures;
ShaderManager::ext_float32_linear = capabilities.float32_linear;
ShaderManager::ext_float16 = capabilities.float16_textures;
ShaderManager::set_render_device_features(pp::renderer::gl::render_device_features(capabilities));
apply_shader_manager_feature_state(detection.feature_state);
});
if (pp::renderer::gl::opengl_runtime_for_current_build().desktop_gl) {
// In OpenGL 3.3 these should be already available.
ShaderManager::ext_float32_linear = true;
ShaderManager::ext_float32 = true;
ShaderManager::ext_float16 = true;
}
ShaderManager::set_render_device_features(
pp::renderer::gl::render_device_features(shader_manager_capabilities()));
apply_shader_manager_feature_state(pp::renderer::gl::detect_opengl_feature_state(
std::span<const std::string_view> {},
pp::renderer::gl::opengl_runtime_for_current_build()));
LOG("Shader Extension shader_framebuffer_fetch: %s", ShaderManager::ext_framebuffer_fetch ? "enabled" : "disabled");