Extract OpenGL shader attribute bindings

This commit is contained in:
2026-06-01 17:58:09 +02:00
parent 05064b3a0d
commit bdcd44b340
7 changed files with 127 additions and 19 deletions

View File

@@ -1,8 +1,10 @@
#include "renderer_gl/opengl_capabilities.h"
#include "renderer_gl/shader_bindings.h"
#include "test_harness.h"
#include <array>
#include <cstdint>
#include <cstring>
#include <string_view>
namespace {
@@ -156,6 +158,49 @@ void maps_shape_index_and_primitive_modes(pp::tests::Harness& h)
PP_EXPECT(h, pp::renderer::gl::primitive_mode_for_stroke_count(99U) == gl_lines);
}
void exposes_shader_attribute_binding_catalog(pp::tests::Harness& h)
{
const auto bindings = pp::renderer::gl::panopainter_shader_attribute_bindings();
PP_EXPECT(h, bindings.size() == 5U);
PP_EXPECT(h, pp::renderer::gl::validate_shader_attribute_bindings(bindings).ok());
PP_EXPECT(h, std::strcmp(bindings[0].name, "pos") == 0);
PP_EXPECT(h, bindings[0].location == 0U);
PP_EXPECT(h, std::strcmp(bindings[1].name, "uvs") == 0);
PP_EXPECT(h, bindings[1].location == 1U);
PP_EXPECT(h, std::strcmp(bindings[2].name, "uvs2") == 0);
PP_EXPECT(h, bindings[2].location == 2U);
PP_EXPECT(h, std::strcmp(bindings[3].name, "col") == 0);
PP_EXPECT(h, bindings[3].location == 3U);
PP_EXPECT(h, std::strcmp(bindings[4].name, "nor") == 0);
PP_EXPECT(h, bindings[4].location == 3U);
}
void rejects_invalid_shader_attribute_binding_catalogs(pp::tests::Harness& h)
{
const std::array<pp::renderer::gl::OpenGlAttributeBinding, 0> empty {};
const std::array unnamed {
pp::renderer::gl::OpenGlAttributeBinding { .name = "", .location = 0 },
};
const std::array null_named {
pp::renderer::gl::OpenGlAttributeBinding { .name = nullptr, .location = 0 },
};
const std::array duplicate_name {
pp::renderer::gl::OpenGlAttributeBinding { .name = "pos", .location = 0 },
pp::renderer::gl::OpenGlAttributeBinding { .name = "pos", .location = 1 },
};
const std::array duplicate_location {
pp::renderer::gl::OpenGlAttributeBinding { .name = "col", .location = 3 },
pp::renderer::gl::OpenGlAttributeBinding { .name = "nor", .location = 3 },
};
PP_EXPECT(h, !pp::renderer::gl::validate_shader_attribute_bindings(empty).ok());
PP_EXPECT(h, !pp::renderer::gl::validate_shader_attribute_bindings(unnamed).ok());
PP_EXPECT(h, !pp::renderer::gl::validate_shader_attribute_bindings(null_named).ok());
PP_EXPECT(h, !pp::renderer::gl::validate_shader_attribute_bindings(duplicate_name).ok());
PP_EXPECT(h, pp::renderer::gl::validate_shader_attribute_bindings(duplicate_location).ok());
}
}
int main()
@@ -169,5 +214,7 @@ int main()
harness.run("maps_image_channel_count_to_texture_format", maps_image_channel_count_to_texture_format);
harness.run("names_framebuffer_status_codes", names_framebuffer_status_codes);
harness.run("maps_shape_index_and_primitive_modes", maps_shape_index_and_primitive_modes);
harness.run("exposes_shader_attribute_binding_catalog", exposes_shader_attribute_binding_catalog);
harness.run("rejects_invalid_shader_attribute_binding_catalogs", rejects_invalid_shader_attribute_binding_catalogs);
return harness.finish();
}