441 lines
21 KiB
C++
441 lines
21 KiB
C++
#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 {
|
|
|
|
void detects_common_extension_capabilities(pp::tests::Harness& h)
|
|
{
|
|
constexpr std::array<std::string_view, 2> extensions {
|
|
"GL_EXT_shader_framebuffer_fetch",
|
|
"GL_ARB_map_buffer_alignment",
|
|
};
|
|
|
|
PP_EXPECT(h, pp::renderer::gl::extension_count_query() == 0x821DU);
|
|
PP_EXPECT(h, pp::renderer::gl::extension_string_name() == 0x1F03U);
|
|
|
|
const auto capabilities = pp::renderer::gl::detect_opengl_capabilities(
|
|
extensions,
|
|
pp::renderer::gl::OpenGlRuntime {});
|
|
|
|
PP_EXPECT(h, capabilities.framebuffer_fetch);
|
|
PP_EXPECT(h, capabilities.map_buffer_alignment);
|
|
PP_EXPECT(h, !capabilities.float32_textures);
|
|
PP_EXPECT(h, !capabilities.float16_textures);
|
|
}
|
|
|
|
void treats_desktop_gl_float_rendering_as_core(pp::tests::Harness& h)
|
|
{
|
|
const auto capabilities = pp::renderer::gl::detect_opengl_capabilities(
|
|
{},
|
|
pp::renderer::gl::OpenGlRuntime { .desktop_gl = true });
|
|
|
|
PP_EXPECT(h, capabilities.float32_textures);
|
|
PP_EXPECT(h, capabilities.float32_linear);
|
|
PP_EXPECT(h, capabilities.float16_textures);
|
|
}
|
|
|
|
void detects_gles_texture_float_extensions(pp::tests::Harness& h)
|
|
{
|
|
constexpr std::array<std::string_view, 3> extensions {
|
|
"GL_OES_texture_float",
|
|
"GL_OES_texture_float_linear",
|
|
"GL_EXT_color_buffer_half_float",
|
|
};
|
|
|
|
const auto capabilities = pp::renderer::gl::detect_opengl_capabilities(
|
|
extensions,
|
|
pp::renderer::gl::OpenGlRuntime { .gles = true });
|
|
|
|
PP_EXPECT(h, capabilities.float32_textures);
|
|
PP_EXPECT(h, capabilities.float32_linear);
|
|
PP_EXPECT(h, capabilities.float16_textures);
|
|
}
|
|
|
|
void ignores_gles_texture_extensions_for_webgl_runtime(pp::tests::Harness& h)
|
|
{
|
|
constexpr std::array<std::string_view, 3> extensions {
|
|
"GL_OES_texture_float",
|
|
"GL_OES_texture_float_linear",
|
|
"GL_EXT_color_buffer_half_float",
|
|
};
|
|
|
|
const auto capabilities = pp::renderer::gl::detect_opengl_capabilities(
|
|
extensions,
|
|
pp::renderer::gl::OpenGlRuntime { .gles = true, .web = true });
|
|
|
|
PP_EXPECT(h, !capabilities.float32_textures);
|
|
PP_EXPECT(h, !capabilities.float32_linear);
|
|
PP_EXPECT(h, !capabilities.float16_textures);
|
|
}
|
|
|
|
void selects_texture_upload_type_from_internal_format(pp::tests::Harness& h)
|
|
{
|
|
constexpr std::uint32_t gl_unsigned_byte = 0x1401U;
|
|
constexpr std::uint32_t gl_float = 0x1406U;
|
|
constexpr std::uint32_t gl_half_float = 0x140BU;
|
|
constexpr std::uint32_t gl_rgba8 = 0x8058U;
|
|
constexpr std::uint32_t gl_rgba32f = 0x8814U;
|
|
constexpr std::uint32_t gl_rgba16f = 0x881AU;
|
|
|
|
PP_EXPECT(h, pp::renderer::gl::texture_upload_type_for_internal_format(gl_rgba8) == gl_unsigned_byte);
|
|
PP_EXPECT(h, pp::renderer::gl::texture_upload_type_for_internal_format(gl_rgba32f) == gl_float);
|
|
PP_EXPECT(h, pp::renderer::gl::texture_upload_type_for_internal_format(gl_rgba16f) == gl_half_float);
|
|
PP_EXPECT(h, pp::renderer::gl::texture_upload_type_for_internal_format(0U) == gl_unsigned_byte);
|
|
PP_EXPECT(h, pp::renderer::gl::unsigned_byte_component_type() == gl_unsigned_byte);
|
|
PP_EXPECT(h, pp::renderer::gl::rgba_pixel_format() == 0x1908U);
|
|
}
|
|
|
|
void maps_image_channel_count_to_texture_format(pp::tests::Harness& h)
|
|
{
|
|
constexpr std::uint32_t gl_red = 0x1903U;
|
|
constexpr std::uint32_t gl_rgb = 0x1907U;
|
|
constexpr std::uint32_t gl_rgba = 0x1908U;
|
|
constexpr std::uint32_t gl_rg = 0x8227U;
|
|
constexpr std::uint32_t gl_r8 = 0x8229U;
|
|
constexpr std::uint32_t gl_rg8 = 0x822BU;
|
|
constexpr std::uint32_t gl_rgb8 = 0x8051U;
|
|
constexpr std::uint32_t gl_rgba8 = 0x8058U;
|
|
|
|
const auto r = pp::renderer::gl::texture_format_for_channel_count(1U);
|
|
const auto rg = pp::renderer::gl::texture_format_for_channel_count(2U);
|
|
const auto rgb = pp::renderer::gl::texture_format_for_channel_count(3U);
|
|
const auto rgba = pp::renderer::gl::texture_format_for_channel_count(4U);
|
|
const auto invalid = pp::renderer::gl::texture_format_for_channel_count(5U);
|
|
|
|
PP_EXPECT(h, r.internal_format == gl_r8);
|
|
PP_EXPECT(h, r.pixel_format == gl_red);
|
|
PP_EXPECT(h, rg.internal_format == gl_rg8);
|
|
PP_EXPECT(h, rg.pixel_format == gl_rg);
|
|
PP_EXPECT(h, rgb.internal_format == gl_rgb8);
|
|
PP_EXPECT(h, rgb.pixel_format == gl_rgb);
|
|
PP_EXPECT(h, rgba.internal_format == gl_rgba8);
|
|
PP_EXPECT(h, rgba.pixel_format == gl_rgba);
|
|
PP_EXPECT(h, invalid.channel_count == 0U);
|
|
PP_EXPECT(h, invalid.internal_format == 0U);
|
|
PP_EXPECT(h, invalid.pixel_format == 0U);
|
|
}
|
|
|
|
void maps_readback_formats(pp::tests::Harness& h)
|
|
{
|
|
const auto rgba8 = pp::renderer::gl::rgba8_readback_format();
|
|
const auto rgba32f = pp::renderer::gl::rgba32f_readback_format();
|
|
|
|
PP_EXPECT(h, rgba8.pixel_format == 0x1908U);
|
|
PP_EXPECT(h, rgba8.component_type == 0x1401U);
|
|
PP_EXPECT(h, rgba8.bytes_per_pixel == 4U);
|
|
PP_EXPECT(h, pp::renderer::gl::readback_byte_count(rgba8, 3U, 5U) == 60U);
|
|
|
|
PP_EXPECT(h, rgba32f.pixel_format == 0x1908U);
|
|
PP_EXPECT(h, rgba32f.component_type == 0x1406U);
|
|
PP_EXPECT(h, rgba32f.bytes_per_pixel == 16U);
|
|
PP_EXPECT(h, pp::renderer::gl::readback_byte_count(rgba32f, 3U, 5U) == 240U);
|
|
}
|
|
|
|
void maps_pixel_buffer_parameters(pp::tests::Harness& h)
|
|
{
|
|
PP_EXPECT(h, pp::renderer::gl::pixel_pack_buffer_target() == 0x88EBU);
|
|
PP_EXPECT(h, pp::renderer::gl::pixel_unpack_buffer_target() == 0x88ECU);
|
|
PP_EXPECT(h, pp::renderer::gl::pixel_buffer_stream_read_usage() == 0x88E1U);
|
|
PP_EXPECT(h, pp::renderer::gl::pixel_buffer_map_read_access() == 0x0001U);
|
|
}
|
|
|
|
void names_framebuffer_status_codes(pp::tests::Harness& h)
|
|
{
|
|
PP_EXPECT(h, pp::renderer::gl::framebuffer_complete_status() == 0x8CD5U);
|
|
PP_EXPECT(h, pp::renderer::gl::framebuffer_status_name(0x8CD5U) == std::string_view("GL_FRAMEBUFFER_COMPLETE"));
|
|
PP_EXPECT(h, pp::renderer::gl::framebuffer_status_name(0x8219U) == std::string_view("GL_FRAMEBUFFER_UNDEFINED"));
|
|
PP_EXPECT(h, pp::renderer::gl::framebuffer_status_name(0x8CD6U)
|
|
== std::string_view("GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT"));
|
|
PP_EXPECT(h, pp::renderer::gl::framebuffer_status_name(0x8CD7U)
|
|
== std::string_view("GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT"));
|
|
PP_EXPECT(h, pp::renderer::gl::framebuffer_status_name(0x8CDBU)
|
|
== std::string_view("GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER"));
|
|
PP_EXPECT(h, pp::renderer::gl::framebuffer_status_name(0x8CDCU)
|
|
== std::string_view("GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER"));
|
|
PP_EXPECT(h, pp::renderer::gl::framebuffer_status_name(0x8CDDU)
|
|
== std::string_view("GL_FRAMEBUFFER_UNSUPPORTED"));
|
|
PP_EXPECT(h, pp::renderer::gl::framebuffer_status_name(0x8D56U)
|
|
== std::string_view("GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE"));
|
|
PP_EXPECT(h, pp::renderer::gl::framebuffer_status_name(0U) == std::string_view("UNKNOWN"));
|
|
}
|
|
|
|
void maps_framebuffer_render_target_parameters(pp::tests::Harness& h)
|
|
{
|
|
PP_EXPECT(h, pp::renderer::gl::texture_2d_target() == 0x0DE1U);
|
|
PP_EXPECT(h, pp::renderer::gl::renderbuffer_target() == 0x8D41U);
|
|
PP_EXPECT(h, pp::renderer::gl::depth_component24_format() == 0x81A6U);
|
|
PP_EXPECT(h, pp::renderer::gl::framebuffer_target() == 0x8D40U);
|
|
PP_EXPECT(h, pp::renderer::gl::draw_framebuffer_target() == 0x8CA9U);
|
|
PP_EXPECT(h, pp::renderer::gl::read_framebuffer_target() == 0x8CA8U);
|
|
PP_EXPECT(h, pp::renderer::gl::draw_framebuffer_binding_query() == 0x8CA6U);
|
|
PP_EXPECT(h, pp::renderer::gl::read_framebuffer_binding_query() == 0x8CAAU);
|
|
PP_EXPECT(h, pp::renderer::gl::framebuffer_color_attachment() == 0x8CE0U);
|
|
PP_EXPECT(h, pp::renderer::gl::framebuffer_depth_attachment() == 0x8D00U);
|
|
PP_EXPECT(h, pp::renderer::gl::default_framebuffer_id() == 0U);
|
|
}
|
|
|
|
void maps_framebuffer_blit_parameters(pp::tests::Harness& h)
|
|
{
|
|
PP_EXPECT(h, pp::renderer::gl::framebuffer_color_buffer_mask() == 0x00004000U);
|
|
PP_EXPECT(h, pp::renderer::gl::framebuffer_depth_buffer_mask() == 0x00000100U);
|
|
PP_EXPECT(h, pp::renderer::gl::color_write_mask_query() == 0x0C23U);
|
|
PP_EXPECT(h, pp::renderer::gl::framebuffer_blit_filter(true) == 0x2601U);
|
|
PP_EXPECT(h, pp::renderer::gl::framebuffer_blit_filter(false) == 0x2600U);
|
|
}
|
|
|
|
void maps_shape_index_and_primitive_modes(pp::tests::Harness& h)
|
|
{
|
|
constexpr std::uint32_t gl_points = 0x0000U;
|
|
constexpr std::uint32_t gl_lines = 0x0001U;
|
|
constexpr std::uint32_t gl_triangles = 0x0004U;
|
|
constexpr std::uint32_t gl_unsigned_short = 0x1403U;
|
|
constexpr std::uint32_t gl_unsigned_int = 0x1405U;
|
|
constexpr std::uint32_t gl_float = 0x1406U;
|
|
|
|
PP_EXPECT(h, pp::renderer::gl::index_type_for_index_size(2U) == gl_unsigned_short);
|
|
PP_EXPECT(h, pp::renderer::gl::index_type_for_index_size(4U) == gl_unsigned_int);
|
|
PP_EXPECT(h, pp::renderer::gl::index_type_for_index_size(1U) == 0U);
|
|
PP_EXPECT(h, pp::renderer::gl::index_type_for_index_size(8U) == 0U);
|
|
|
|
PP_EXPECT(h, pp::renderer::gl::primitive_mode_for_fill_count(1U) == gl_points);
|
|
PP_EXPECT(h, pp::renderer::gl::primitive_mode_for_fill_count(2U) == gl_lines);
|
|
PP_EXPECT(h, pp::renderer::gl::primitive_mode_for_fill_count(3U) == gl_triangles);
|
|
PP_EXPECT(h, pp::renderer::gl::primitive_mode_for_fill_count(99U) == gl_triangles);
|
|
|
|
PP_EXPECT(h, pp::renderer::gl::primitive_mode_for_stroke_count(1U) == gl_points);
|
|
PP_EXPECT(h, pp::renderer::gl::primitive_mode_for_stroke_count(2U) == gl_lines);
|
|
PP_EXPECT(h, pp::renderer::gl::primitive_mode_for_stroke_count(99U) == gl_lines);
|
|
|
|
PP_EXPECT(h, pp::renderer::gl::array_buffer_target() == 0x8892U);
|
|
PP_EXPECT(h, pp::renderer::gl::element_array_buffer_target() == 0x8893U);
|
|
PP_EXPECT(h, pp::renderer::gl::static_draw_buffer_usage() == 0x88E4U);
|
|
PP_EXPECT(h, pp::renderer::gl::vertex_attribute_float_component_type() == gl_float);
|
|
PP_EXPECT(h, pp::renderer::gl::vertex_attribute_not_normalized() == 0U);
|
|
}
|
|
|
|
void maps_panopainter_cube_faces_to_texture_targets(pp::tests::Harness& h)
|
|
{
|
|
const auto targets = pp::renderer::gl::panopainter_cube_face_texture_targets();
|
|
|
|
PP_EXPECT(h, pp::renderer::gl::texture_cube_map_target() == 0x8513U);
|
|
PP_EXPECT(h, pp::renderer::gl::cube_map_allocation_face_texture_target(0U) == 0x8515U);
|
|
PP_EXPECT(h, pp::renderer::gl::cube_map_allocation_face_texture_target(1U) == 0x8516U);
|
|
PP_EXPECT(h, pp::renderer::gl::cube_map_allocation_face_texture_target(2U) == 0x8517U);
|
|
PP_EXPECT(h, pp::renderer::gl::cube_map_allocation_face_texture_target(3U) == 0x8518U);
|
|
PP_EXPECT(h, pp::renderer::gl::cube_map_allocation_face_texture_target(4U) == 0x8519U);
|
|
PP_EXPECT(h, pp::renderer::gl::cube_map_allocation_face_texture_target(5U) == 0x851AU);
|
|
PP_EXPECT(h, pp::renderer::gl::cube_map_allocation_face_texture_target(6U) == 0U);
|
|
|
|
PP_EXPECT(h, targets.size() == 6U);
|
|
PP_EXPECT(h, targets[0] == 0x851AU);
|
|
PP_EXPECT(h, targets[1] == 0x8516U);
|
|
PP_EXPECT(h, targets[2] == 0x8519U);
|
|
PP_EXPECT(h, targets[3] == 0x8515U);
|
|
PP_EXPECT(h, targets[4] == 0x8518U);
|
|
PP_EXPECT(h, targets[5] == 0x8517U);
|
|
PP_EXPECT(h, pp::renderer::gl::cube_face_texture_target(0U) == 0x851AU);
|
|
PP_EXPECT(h, pp::renderer::gl::cube_face_texture_target(5U) == 0x8517U);
|
|
PP_EXPECT(h, pp::renderer::gl::cube_face_texture_target(6U) == 0U);
|
|
}
|
|
|
|
void exposes_default_render_target_texture_parameters(pp::tests::Harness& h)
|
|
{
|
|
const auto parameters = pp::renderer::gl::default_render_target_texture_parameters();
|
|
|
|
PP_EXPECT(h, parameters.size() == 4U);
|
|
PP_EXPECT(h, parameters[0].name == 0x2800U);
|
|
PP_EXPECT(h, parameters[0].value == 0x2601U);
|
|
PP_EXPECT(h, parameters[1].name == 0x2801U);
|
|
PP_EXPECT(h, parameters[1].value == 0x2601U);
|
|
PP_EXPECT(h, parameters[2].name == 0x2802U);
|
|
PP_EXPECT(h, parameters[2].value == 0x812FU);
|
|
PP_EXPECT(h, parameters[3].name == 0x2803U);
|
|
PP_EXPECT(h, parameters[3].value == 0x812FU);
|
|
}
|
|
|
|
void maps_sampler_parameters(pp::tests::Harness& h)
|
|
{
|
|
const auto parameters = pp::renderer::gl::sampler_parameters_for_filter_wrap(0x2601U, 0x812FU);
|
|
|
|
PP_EXPECT(h, parameters.size() == 5U);
|
|
PP_EXPECT(h, parameters[0].name == 0x2802U);
|
|
PP_EXPECT(h, parameters[0].value == 0x812FU);
|
|
PP_EXPECT(h, parameters[1].name == 0x2803U);
|
|
PP_EXPECT(h, parameters[1].value == 0x812FU);
|
|
PP_EXPECT(h, parameters[2].name == 0x8072U);
|
|
PP_EXPECT(h, parameters[2].value == 0x812FU);
|
|
PP_EXPECT(h, parameters[3].name == 0x2801U);
|
|
PP_EXPECT(h, parameters[3].value == 0x2601U);
|
|
PP_EXPECT(h, parameters[4].name == 0x2800U);
|
|
PP_EXPECT(h, parameters[4].value == 0x2601U);
|
|
|
|
const auto filters = pp::renderer::gl::sampler_filter_parameters(0x2600U, 0x2601U);
|
|
PP_EXPECT(h, filters.size() == 2U);
|
|
PP_EXPECT(h, filters[0].name == 0x2801U);
|
|
PP_EXPECT(h, filters[0].value == 0x2600U);
|
|
PP_EXPECT(h, filters[1].name == 0x2800U);
|
|
PP_EXPECT(h, filters[1].value == 0x2601U);
|
|
|
|
PP_EXPECT(h, pp::renderer::gl::sampler_border_color_parameter_name() == 0x1004U);
|
|
}
|
|
|
|
void exposes_shader_attribute_binding_catalog(pp::tests::Harness& h)
|
|
{
|
|
const auto bindings = pp::renderer::gl::panopainter_shader_attribute_bindings();
|
|
|
|
PP_EXPECT(h, pp::renderer::gl::vertex_shader_stage() == 0x8B31U);
|
|
PP_EXPECT(h, pp::renderer::gl::fragment_shader_stage() == 0x8B30U);
|
|
PP_EXPECT(h, pp::renderer::gl::shader_compile_status_query() == 0x8B81U);
|
|
PP_EXPECT(h, pp::renderer::gl::program_link_status_query() == 0x8B82U);
|
|
PP_EXPECT(h, pp::renderer::gl::active_uniform_count_query() == 0x8B86U);
|
|
PP_EXPECT(h, pp::renderer::gl::matrix_uniform_not_transposed() == 0U);
|
|
|
|
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 maps_app_initialization_parameters(pp::tests::Harness& h)
|
|
{
|
|
PP_EXPECT(h, pp::renderer::gl::debug_severity_notification() == 0x826BU);
|
|
PP_EXPECT(h, pp::renderer::gl::debug_severity_low() == 0x9148U);
|
|
PP_EXPECT(h, pp::renderer::gl::debug_severity_medium() == 0x9147U);
|
|
PP_EXPECT(h, pp::renderer::gl::debug_severity_high() == 0x9146U);
|
|
PP_EXPECT(h, pp::renderer::gl::debug_output_state() == 0x92E0U);
|
|
PP_EXPECT(h, pp::renderer::gl::debug_output_synchronous_state() == 0x8242U);
|
|
|
|
PP_EXPECT(h, pp::renderer::gl::version_string_name() == 0x1F02U);
|
|
PP_EXPECT(h, pp::renderer::gl::vendor_string_name() == 0x1F00U);
|
|
PP_EXPECT(h, pp::renderer::gl::renderer_string_name() == 0x1F01U);
|
|
PP_EXPECT(h, pp::renderer::gl::shading_language_version_string_name() == 0x8B8CU);
|
|
|
|
PP_EXPECT(h, pp::renderer::gl::depth_test_state() == 0x0B71U);
|
|
PP_EXPECT(h, pp::renderer::gl::scissor_test_state() == 0x0C11U);
|
|
PP_EXPECT(h, pp::renderer::gl::program_point_size_state() == 0x8642U);
|
|
PP_EXPECT(h, pp::renderer::gl::line_smooth_state() == 0x0B20U);
|
|
PP_EXPECT(h, pp::renderer::gl::source_alpha_blend_factor() == 0x0302U);
|
|
PP_EXPECT(h, pp::renderer::gl::one_minus_source_alpha_blend_factor() == 0x0303U);
|
|
PP_EXPECT(h, pp::renderer::gl::add_blend_equation() == 0x8006U);
|
|
PP_EXPECT(h, pp::renderer::gl::max_blend_equation() == 0x8008U);
|
|
PP_EXPECT(h, pp::renderer::gl::rgba8_internal_format() == 0x8058U);
|
|
PP_EXPECT(h, pp::renderer::gl::linear_texture_filter() == 0x2601U);
|
|
PP_EXPECT(h, pp::renderer::gl::nearest_texture_filter() == 0x2600U);
|
|
PP_EXPECT(h, pp::renderer::gl::repeat_texture_wrap() == 0x2901U);
|
|
PP_EXPECT(h, pp::renderer::gl::active_texture_unit(0U) == 0x84C0U);
|
|
PP_EXPECT(h, pp::renderer::gl::active_texture_unit(4U) == 0x84C4U);
|
|
}
|
|
|
|
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());
|
|
}
|
|
|
|
void exposes_shader_uniform_catalog(pp::tests::Harness& h)
|
|
{
|
|
const auto uniforms = pp::renderer::gl::panopainter_shader_uniform_names();
|
|
|
|
PP_EXPECT(h, uniforms.size() == 43U);
|
|
PP_EXPECT(h, pp::renderer::gl::validate_shader_uniform_names(uniforms).ok());
|
|
PP_EXPECT(h, std::strcmp(uniforms[0].name, "mvp") == 0);
|
|
PP_EXPECT(h, uniforms[0].id == pp::renderer::gl::shader_uniform_id("mvp"));
|
|
PP_EXPECT(h, uniforms[0].id == 40696U);
|
|
PP_EXPECT(h, std::strcmp(uniforms[1].name, "tex") == 0);
|
|
PP_EXPECT(h, uniforms[1].id == pp::renderer::gl::shader_uniform_id("tex"));
|
|
PP_EXPECT(h, uniforms[1].id == 48854U);
|
|
PP_EXPECT(h, pp::renderer::gl::shader_uniform_id("pattern_contr") == 54920U);
|
|
PP_EXPECT(h, pp::renderer::gl::shader_uniform_id("draw_outline") == 36178U);
|
|
}
|
|
|
|
void rejects_invalid_shader_uniform_catalogs(pp::tests::Harness& h)
|
|
{
|
|
const std::array<pp::renderer::gl::OpenGlUniformName, 0> empty {};
|
|
const std::array unnamed {
|
|
pp::renderer::gl::OpenGlUniformName { .name = "", .id = 0 },
|
|
};
|
|
const std::array null_named {
|
|
pp::renderer::gl::OpenGlUniformName { .name = nullptr, .id = 0 },
|
|
};
|
|
const std::array mismatched_hash {
|
|
pp::renderer::gl::OpenGlUniformName { .name = "mvp", .id = 1 },
|
|
};
|
|
const std::array duplicate_name {
|
|
pp::renderer::gl::OpenGlUniformName {
|
|
.name = "mvp",
|
|
.id = pp::renderer::gl::shader_uniform_id("mvp"),
|
|
},
|
|
pp::renderer::gl::OpenGlUniformName {
|
|
.name = "mvp",
|
|
.id = pp::renderer::gl::shader_uniform_id("mvp"),
|
|
},
|
|
};
|
|
|
|
PP_EXPECT(h, !pp::renderer::gl::validate_shader_uniform_names(empty).ok());
|
|
PP_EXPECT(h, !pp::renderer::gl::validate_shader_uniform_names(unnamed).ok());
|
|
PP_EXPECT(h, !pp::renderer::gl::validate_shader_uniform_names(null_named).ok());
|
|
PP_EXPECT(h, !pp::renderer::gl::validate_shader_uniform_names(mismatched_hash).ok());
|
|
PP_EXPECT(h, !pp::renderer::gl::validate_shader_uniform_names(duplicate_name).ok());
|
|
}
|
|
|
|
}
|
|
|
|
int main()
|
|
{
|
|
pp::tests::Harness harness;
|
|
harness.run("detects_common_extension_capabilities", detects_common_extension_capabilities);
|
|
harness.run("treats_desktop_gl_float_rendering_as_core", treats_desktop_gl_float_rendering_as_core);
|
|
harness.run("detects_gles_texture_float_extensions", detects_gles_texture_float_extensions);
|
|
harness.run("ignores_gles_texture_extensions_for_webgl_runtime", ignores_gles_texture_extensions_for_webgl_runtime);
|
|
harness.run("selects_texture_upload_type_from_internal_format", selects_texture_upload_type_from_internal_format);
|
|
harness.run("maps_image_channel_count_to_texture_format", maps_image_channel_count_to_texture_format);
|
|
harness.run("maps_readback_formats", maps_readback_formats);
|
|
harness.run("maps_pixel_buffer_parameters", maps_pixel_buffer_parameters);
|
|
harness.run("names_framebuffer_status_codes", names_framebuffer_status_codes);
|
|
harness.run("maps_framebuffer_render_target_parameters", maps_framebuffer_render_target_parameters);
|
|
harness.run("maps_framebuffer_blit_parameters", maps_framebuffer_blit_parameters);
|
|
harness.run("maps_shape_index_and_primitive_modes", maps_shape_index_and_primitive_modes);
|
|
harness.run("maps_panopainter_cube_faces_to_texture_targets", maps_panopainter_cube_faces_to_texture_targets);
|
|
harness.run("exposes_default_render_target_texture_parameters", exposes_default_render_target_texture_parameters);
|
|
harness.run("maps_sampler_parameters", maps_sampler_parameters);
|
|
harness.run("exposes_shader_attribute_binding_catalog", exposes_shader_attribute_binding_catalog);
|
|
harness.run("maps_app_initialization_parameters", maps_app_initialization_parameters);
|
|
harness.run("rejects_invalid_shader_attribute_binding_catalogs", rejects_invalid_shader_attribute_binding_catalogs);
|
|
harness.run("exposes_shader_uniform_catalog", exposes_shader_uniform_catalog);
|
|
harness.run("rejects_invalid_shader_uniform_catalogs", rejects_invalid_shader_uniform_catalogs);
|
|
return harness.finish();
|
|
}
|