mirror of
https://github.com/minetest/irrlicht.git
synced 2024-12-29 09:27:31 +01:00
183 lines
5.1 KiB
C
183 lines
5.1 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__
|
||
|
|
||
|
#include "IrrCompileConfig.h"
|
||
|
|
||
|
#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__
|