#include "renderer_gl/opengl_capabilities.h" #include "test_harness.h" #include #include #include namespace { void detects_common_extension_capabilities(pp::tests::Harness& h) { constexpr std::array extensions { "GL_EXT_shader_framebuffer_fetch", "GL_ARB_map_buffer_alignment", }; 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 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 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); } } 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); return harness.finish(); }