Move shader state mapping to renderer gl

This commit is contained in:
2026-06-02 06:51:31 +02:00
parent 47eb1ec0b2
commit 9e0a88726c
7 changed files with 111 additions and 22 deletions

View File

@@ -3,8 +3,45 @@
#include "shader.h"
#include "asset.h"
#include "app.h"
#include "renderer_gl/opengl_capabilities.h"
#include "renderer_gl/shader_bindings.h"
#include <cstdint>
namespace {
[[nodiscard]] GLenum vertex_shader_stage() noexcept
{
return static_cast<GLenum>(pp::renderer::gl::vertex_shader_stage());
}
[[nodiscard]] GLenum fragment_shader_stage() noexcept
{
return static_cast<GLenum>(pp::renderer::gl::fragment_shader_stage());
}
[[nodiscard]] GLenum shader_compile_status_query() noexcept
{
return static_cast<GLenum>(pp::renderer::gl::shader_compile_status_query());
}
[[nodiscard]] GLenum program_link_status_query() noexcept
{
return static_cast<GLenum>(pp::renderer::gl::program_link_status_query());
}
[[nodiscard]] GLenum active_uniform_count_query() noexcept
{
return static_cast<GLenum>(pp::renderer::gl::active_uniform_count_query());
}
[[nodiscard]] GLboolean matrix_uniform_not_transposed() noexcept
{
return static_cast<GLboolean>(pp::renderer::gl::matrix_uniform_not_transposed());
}
}
std::map<kShader, Shader> ShaderManager::m_shaders;
Shader* ShaderManager::m_current;
bool ShaderManager::ext_framebuffer_fetch = false;
@@ -40,10 +77,10 @@ std::string Shader::read(const std::string& path)
for (const auto& l : split(data, '\n'))
{
std::smatch m;
if (std::regex_search(l, m, reg_include))
std::smatch include_match;
if (std::regex_search(l, include_match, reg_include))
{
std::string inc = base + "/" + m[1].str();
std::string inc = base + "/" + include_match[1].str();
if (Asset::exist(inc.c_str()))
{
std::string subdata = read(inc);
@@ -169,7 +206,7 @@ bool Shader::create(const std::string& vertex, const std::string& fragment)
int infolen;
const GLchar* source;
auto vs = glCreateShader(GL_VERTEX_SHADER);
auto vs = glCreateShader(vertex_shader_stage());
if (!vs)
{
ret = false;
@@ -178,7 +215,7 @@ bool Shader::create(const std::string& vertex, const std::string& fragment)
source = vertex.c_str();
glShaderSource(vs, 1, &source, nullptr);
glCompileShader(vs);
glGetShaderiv(vs, GL_COMPILE_STATUS, &status);
glGetShaderiv(vs, shader_compile_status_query(), &status);
glGetShaderInfoLog(vs, sizeof(infolog), &infolen, infolog);
if (infolen > 0)
{
@@ -192,7 +229,7 @@ bool Shader::create(const std::string& vertex, const std::string& fragment)
return;
}
auto fs = glCreateShader(GL_FRAGMENT_SHADER);
auto fs = glCreateShader(fragment_shader_stage());
if (!fs)
{
glDeleteShader(vs);
@@ -202,7 +239,7 @@ bool Shader::create(const std::string& vertex, const std::string& fragment)
source = fragment.c_str();
glShaderSource(fs, 1, &source, nullptr);
glCompileShader(fs);
glGetShaderiv(fs, GL_COMPILE_STATUS, &status);
glGetShaderiv(fs, shader_compile_status_query(), &status);
glGetShaderInfoLog(fs, sizeof(infolog), &infolen, infolog);
if (infolen > 0)
{
@@ -238,7 +275,7 @@ bool Shader::create(const std::string& vertex, const std::string& fragment)
}
glLinkProgram(ps);
glGetProgramiv(ps, GL_LINK_STATUS, &status);
glGetProgramiv(ps, program_link_status_query(), &status);
glGetProgramInfoLog(ps, sizeof(infolog), &infolen, infolog);
if (infolen > 0)
LOG("LINK SHADER: %s\n%s", m_path.c_str(), infolog);
@@ -257,7 +294,7 @@ bool Shader::create(const std::string& vertex, const std::string& fragment)
const GLsizei bufSize = 64; // maximum name length
GLchar name[bufSize]; // variable name in GLSL
GLsizei length; // name length
glGetProgramiv(ps, GL_ACTIVE_UNIFORMS, &count);
glGetProgramiv(ps, active_uniform_count_query(), &count);
for (int i = 0; i < count; i++)
{
glGetActiveUniform(ps, (GLuint)i, bufSize, &length, &size, &type, name);
@@ -318,7 +355,7 @@ void Shader::u_mat4(kShaderUniform id, const glm::mat4& m)
{
if (m_umap.count(id) == 0)
LOG("UNIFORM mat4 %d NOT FOUND in shader %d", (int)id, (int)name)
else glUniformMatrix4fv(m_umap[id], 1, GL_FALSE, glm::value_ptr(m));
else glUniformMatrix4fv(m_umap[id], 1, matrix_uniform_not_transposed(), glm::value_ptr(m));
}
void Shader::u_int(kShaderUniform id, int i)
{
@@ -327,9 +364,9 @@ void Shader::u_int(kShaderUniform id, int i)
else
glUniform1i(m_umap[id], i);
}
void Shader::u_int(const char* name, int i)
void Shader::u_int(const char* uniform_name, int i)
{
glUniform1i(glGetAttribLocation(prog, name), i);
glUniform1i(glGetAttribLocation(prog, uniform_name), i);
}
void Shader::u_float(kShaderUniform id, float f)
{
@@ -337,9 +374,9 @@ void Shader::u_float(kShaderUniform id, float f)
LOG("UNIFORM float %d NOT FOUND in shader %d", (int)id, (int)name)
else glUniform1f(m_umap[id], f);
}
GLint Shader::GetAttribLocation(const char* name)
GLint Shader::GetAttribLocation(const char* attribute_name)
{
return glGetAttribLocation(prog, name);
return glGetAttribLocation(prog, attribute_name);
}
bool ShaderManager::load(kShader id, const std::string& path)