70 lines
2.4 KiB
C++
70 lines
2.4 KiB
C++
#include "pch.h"
|
|
#include "app.h"
|
|
#include "legacy_gl_runtime_dispatch.h"
|
|
#include "renderer_api/shader_catalog.h"
|
|
#include "renderer_gl/opengl_capabilities.h"
|
|
#include "shader.h"
|
|
|
|
namespace {
|
|
|
|
void apply_shader_manager_feature_state(pp::renderer::gl::OpenGlFeatureState feature_state) noexcept
|
|
{
|
|
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 App::initShaders()
|
|
{
|
|
#ifdef _DEBUG
|
|
if (!check_uniform_uniqueness())
|
|
LOG("check_uniform_uniqueness() failed");
|
|
#endif // _DEBUG
|
|
|
|
render_task([] {
|
|
const auto detection_result = pp::renderer::gl::query_opengl_capability_detection(
|
|
pp::legacy::gl_runtime::extension_query_dispatch(),
|
|
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& detection = detection_result.value();
|
|
for (const auto& extension : detection.extensions) {
|
|
LOG("EXT: %s", extension.c_str());
|
|
}
|
|
|
|
apply_shader_manager_feature_state(detection.feature_state);
|
|
});
|
|
|
|
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");
|
|
|
|
LOG("initializing shaders");
|
|
const auto shader_catalog = pp::renderer::panopainter_shader_catalog();
|
|
const auto catalog_status = pp::renderer::validate_shader_catalog(shader_catalog);
|
|
if (!catalog_status.ok())
|
|
{
|
|
LOG("Shader catalog validation failed: %s", catalog_status.message);
|
|
return;
|
|
}
|
|
|
|
for (const auto& shader : shader_catalog)
|
|
{
|
|
if (!ShaderManager::load(static_cast<kShader>(const_hash(shader.name)), shader.path))
|
|
LOG("Failed to create shader %s", shader.name);
|
|
}
|
|
LOG("shaders initialized");
|
|
}
|
|
|
|
|