irrlicht/source/Irrlicht/CWebGLExtensionHandler.h
2023-03-11 15:04:09 +01:00

182 lines
5.0 KiB
C++

// Copyright (C) 2017 Michael Zeilfelder
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in Irrlicht.h
#ifndef __E_WEGL_EXTENSION_HANDLER_H_INCLUDED__
#define __E_WEGL_EXTENSION_HANDLER_H_INCLUDED__
#if defined(_IRR_COMPILE_WITH_WEBGL1_) // Note: should also work with WebGL2 once we add that to Irrlicht
#include "COpenGLCoreFeature.h"
namespace irr
{
namespace video
{
// Extension handling for WebGL.
class CWebGLExtensionHandler
{
public:
// Enums used internally to check for WebGL extensions quickly.
// We buffer all extensions on start once in an array.
enum EWebGLFeatures
{
// If you update this enum also update the corresponding WebGLFeatureStrings string-array
// Last updated was up to (including) extension number 35 (EXT_float_blend)
// Khronos ratified WebGL Extensions
IRR_OES_texture_float, // 1
IRR_OES_texture_half_float, // 2
IRR_WEBGL_lose_context, // 3
IRR_OES_standard_derivatives, // 4
IRR_OES_vertex_array_object, // 5
IRR_WEBGL_debug_renderer_info, // 6
IRR_WEBGL_debug_shaders, // 7
IRR_WEBGL_compressed_texture_s3tc, // 8
IRR_WEBGL_depth_texture, // 9
IRR_OES_element_index_uint, // 10
IRR_EXT_texture_filter_anisotropic, // 11
IRR_EXT_frag_depth, // 16
IRR_WEBGL_draw_buffers, // 18
IRR_ANGLE_instanced_arrays, // 19
IRR_OES_texture_float_linear, // 20
IRR_OES_texture_half_float_linear, // 21
IRR_EXT_blend_minmax, // 25
IRR_EXT_shader_texture_lod, // 27
// Community approved WebGL Extensions
IRR_WEBGL_compressed_texture_atc, // 12
IRR_WEBGL_compressed_texture_pvrtc, // 13
IRR_EXT_color_buffer_half_float, // 14
IRR_WEBGL_color_buffer_float, // 15
IRR_EXT_sRGB, // 17
IRR_WEBGL_compressed_texture_etc1, // 24
IRR_EXT_disjoint_timer_query, // 26
IRR_WEBGL_compressed_texture_etc, // 29
IRR_WEBGL_compressed_texture_astc, // 30
IRR_EXT_color_buffer_float, // 31
IRR_WEBGL_compressed_texture_s3tc_srgb, // 32
IRR_EXT_disjoint_timer_query_webgl2, // 33
// Draft WebGL Extensions
IRR_WEBGL_shared_resources, // 22
IRR_WEBGL_security_sensitive_resources, // 23
IRR_OES_fbo_render_mipmap, // 28
IRR_WEBGL_get_buffer_sub_data_async, // 34
IRR_EXT_float_blend, // 35
IRR_WEBGL_Feature_Count
};
CWebGLExtensionHandler()
{
for (u32 i = 0; i < IRR_WEBGL_Feature_Count; ++i)
FeatureAvailable[i] = false;
}
virtual ~CWebGLExtensionHandler() {}
void dump() const
{
for (u32 i = 0; i < IRR_WEBGL_Feature_Count; ++i)
os::Printer::log(getFeatureString(i), FeatureAvailable[i] ? " true" : " false");
}
bool queryWebGLFeature(EWebGLFeatures feature) const
{
return FeatureAvailable[feature];
}
void getGLExtensions()
{
core::stringc extensions = glGetString(GL_EXTENSIONS);
os::Printer::log(extensions.c_str());
const u32 size = extensions.size() + 1;
c8* str = new c8[size];
strncpy(str, extensions.c_str(), extensions.size());
str[extensions.size()] = ' ';
c8* p = str;
for (u32 i=0; i<size; ++i)
{
if (str[i] == ' ')
{
str[i] = 0;
if (*p)
for (size_t j=0; j<IRR_WEBGL_Feature_Count; ++j)
{
if (!strcmp(getFeatureString(j), p))
{
FeatureAvailable[j] = true;
break;
}
}
p = p + strlen(p) + 1;
}
}
delete[] str;
}
protected:
const char* getFeatureString(size_t index) const
{
// Based on https://www.khronos.org/registry/webgl/extensions
// One for each EWebGLFeatures
static const char* const WebGLFeatureStrings[IRR_WEBGL_Feature_Count] =
{
"OES_texture_float",
"OES_texture_half_float",
"WEBGL_lose_context",
"OES_standard_derivatives",
"OES_vertex_array_object",
"WEBGL_debug_renderer_info",
"WEBGL_debug_shaders",
"WEBGL_compressed_texture_s3tc",
"WEBGL_depth_texture",
"OES_element_index_uint",
"EXT_texture_filter_anisotropic",
"EXT_frag_depth",
"WEBGL_draw_buffers",
"ANGLE_instanced_arrays",
"OES_texture_float_linear",
"OES_texture_half_float_linear",
"EXT_blend_minmax",
"EXT_shader_texture_lod",
"WEBGL_compressed_texture_atc",
"WEBGL_compressed_texture_pvrtc",
"EXT_color_buffer_half_float",
"WEBGL_color_buffer_float",
"EXT_sRGB",
"WEBGL_compressed_texture_etc1",
"EXT_disjoint_timer_query",
"WEBGL_compressed_texture_etc",
"WEBGL_compressed_texture_astc",
"EXT_color_buffer_float",
"WEBGL_compressed_texture_s3tc_srgb",
"EXT_disjoint_timer_query_webgl2",
"WEBGL_shared_resources",
"WEBGL_security_sensitive_resources",
"OES_fbo_render_mipmap",
"WEBGL_get_buffer_sub_data_async",
"EXT_float_blend"
};
return WebGLFeatureStrings[index];
}
bool FeatureAvailable[IRR_WEBGL_Feature_Count];
};
}
}
#endif // defined(_IRR_COMPILE_WITH_WEBGL1_)
#endif // __E_WEGL1_EXTENSION_HANDLER_H_INCLUDED__