266 lines
8.1 KiB
C++
266 lines
8.1 KiB
C++
// Copyright (C) 2009-2010 Amundis
|
|
// Heavily based on the OpenGL driver implemented by Nikolaus Gebhardt
|
|
// and OpenGL ES driver implemented by Christian Stehno
|
|
// This file is part of the "Irrlicht Engine".
|
|
// For conditions of distribution and use, see copyright notice in Irrlicht.h
|
|
|
|
#ifndef __C_OGLES2_EXTENSION_HANDLER_H_INCLUDED__
|
|
#define __C_OGLES2_EXTENSION_HANDLER_H_INCLUDED__
|
|
|
|
#include "IrrCompileConfig.h"
|
|
|
|
#ifdef _IRR_COMPILE_WITH_OGLES2_
|
|
|
|
#if defined(_IRR_COMPILE_WITH_SDL_DEVICE_)
|
|
#include "glad/gl.h"
|
|
#else
|
|
|
|
#ifdef IOS_STK
|
|
#include <OpenGLES/ES2/gl.h>
|
|
#include <OpenGLES/ES2/glext.h>
|
|
#else
|
|
#include <GLES2/gl2.h>
|
|
// seems to be missing...
|
|
typedef char GLchar;
|
|
#if defined(_IRR_OGLES2_USE_EXTPOINTER_)
|
|
#include "gles2-ext.h"
|
|
#endif
|
|
#endif
|
|
|
|
#endif
|
|
#include "os.h"
|
|
#include "EDriverFeatures.h"
|
|
|
|
namespace irr
|
|
{
|
|
namespace video
|
|
{
|
|
class COGLES2Driver;
|
|
class COGLES2ExtensionHandler
|
|
{
|
|
public:
|
|
enum EOGLES2Features
|
|
{
|
|
IRR_AMD_compressed_3DC_texture=0, // 39
|
|
IRR_AMD_compressed_ATC_texture, // 40
|
|
IRR_AMD_performance_monitor, // 50
|
|
IRR_AMD_program_binary_Z400, // 48
|
|
IRR_ANGLE_framebuffer_blit, // 84
|
|
IRR_ANGLE_framebuffer_multisample, // 84
|
|
IRR_ANGLE_instanced_arrays, // 109
|
|
IRR_ANGLE_pack_reverse_row_order, // 110
|
|
IRR_ANGLE_texture_compression_dxt3, // 111
|
|
IRR_ANGLE_texture_compression_dxt5, // 111
|
|
IRR_ANGLE_texture_usage, // 112
|
|
IRR_ANGLE_translated_shader_source, // 113
|
|
IRR_APPLE_copy_texture_levels, // 123
|
|
IRR_APPLE_framebuffer_multisample, // 78
|
|
IRR_APPLE_rgb_422, // 76
|
|
IRR_APPLE_sync, // 124
|
|
IRR_APPLE_texture_2D_limited_npot, // 59
|
|
IRR_APPLE_texture_format_BGRA8888, // 79
|
|
IRR_APPLE_texture_max_level, // 80
|
|
IRR_ARB_texture_env_combine, //ogl, IMG simulator
|
|
IRR_ARB_texture_env_dot3, //ogl, IMG simulator
|
|
IRR_ARM_mali_program_binary, // 120
|
|
IRR_ARM_mali_shader_binary, // 81
|
|
IRR_ARM_rgba8, // 82
|
|
IRR_DMP_shader_binary, // 88
|
|
IRR_EXT_blend_minmax, // 65
|
|
IRR_EXT_color_buffer_half_float, // 97
|
|
IRR_EXT_debug_label, // 98
|
|
IRR_EXT_debug_marker, // 99
|
|
IRR_EXT_discard_framebuffer, // 64
|
|
IRR_EXT_frag_depth, // 86
|
|
IRR_EXT_map_buffer_range, // 121
|
|
IRR_EXT_multisampled_render_to_texture, // 106
|
|
IRR_EXT_multiview_draw_buffers, // 125
|
|
IRR_EXT_multi_draw_arrays, // 69
|
|
IRR_EXT_occlusion_query_boolean, // 100
|
|
IRR_EXT_read_format_bgra, // 66
|
|
IRR_EXT_robustness, // 107
|
|
IRR_EXT_separate_shader_objects, // 101
|
|
IRR_EXT_shader_framebuffer_fetch, // 122
|
|
IRR_EXT_shader_texture_lod, // 77
|
|
IRR_EXT_shadow_samplers, // 102
|
|
IRR_EXT_sRGB, // 105
|
|
IRR_EXT_texture_compression_dxt1, // 49
|
|
IRR_EXT_texture_filter_anisotropic, // 41
|
|
IRR_EXT_texture_format_BGRA8888, // 51
|
|
IRR_EXT_texture_lod_bias, // 60
|
|
IRR_EXT_texture_rg, // 103
|
|
IRR_EXT_texture_storage, // 108
|
|
IRR_EXT_texture_type_2_10_10_10_REV, // 42
|
|
IRR_EXT_unpack_subimage, // 90
|
|
IRR_FJ_shader_binary_GCCSO, // 114
|
|
IRR_IMG_multisampled_render_to_texture, // 74
|
|
IRR_IMG_program_binary, // 67
|
|
IRR_IMG_read_format, // 53
|
|
IRR_IMG_shader_binary, // 68
|
|
IRR_IMG_texture_compression_pvrtc, // 54
|
|
IRR_IMG_texture_env_enhanced_fixed_function, // 58
|
|
IRR_IMG_texture_format_BGRA8888, // replaced by EXT version
|
|
IRR_IMG_user_clip_plane, // 57, was clip_planes
|
|
IRR_IMG_vertex_program, // non-standard
|
|
IRR_KHR_debug, // 118
|
|
IRR_KHR_texture_compression_astc_ldr, // 117
|
|
IRR_NV_coverage_sample, // 72
|
|
IRR_NV_depth_nonlinear, // 73
|
|
IRR_NV_draw_buffers, // 91
|
|
IRR_NV_EGL_stream_consumer_external, // 104
|
|
IRR_NV_fbo_color_attachments, // 92
|
|
IRR_NV_fence, // 52
|
|
IRR_NV_read_buffer, // 93
|
|
IRR_NV_read_buffer_front, // part of 93
|
|
IRR_NV_read_depth, // part of 94
|
|
IRR_NV_read_depth_stencil, // 94
|
|
IRR_NV_read_stencil, // part of 94
|
|
IRR_NV_texture_compression_s3tc_update, // 95
|
|
IRR_NV_texture_npot_2D_mipmap, // 96
|
|
IRR_OES_blend_equation_separate, // 1
|
|
IRR_OES_blend_func_separate, // 2
|
|
IRR_OES_blend_subtract, // 3
|
|
IRR_OES_byte_coordinates, // 4
|
|
IRR_OES_compressed_ETC1_RGB8_texture, // 5
|
|
IRR_OES_compressed_paletted_texture, // 6
|
|
IRR_OES_depth24, // 24
|
|
IRR_OES_depth32, // 25
|
|
IRR_OES_depth_texture, // 43
|
|
IRR_OES_draw_texture, // 7
|
|
IRR_OES_EGL_image, // 23
|
|
IRR_OES_EGL_image_external, // 87
|
|
IRR_OES_EGL_sync, // 75
|
|
IRR_OES_element_index_uint, // 26
|
|
IRR_OES_extended_matrix_palette, // 8
|
|
IRR_OES_fbo_render_mipmap, // 27
|
|
IRR_OES_fixed_point, // 9
|
|
IRR_OES_fragment_precision_high, // 28
|
|
IRR_OES_framebuffer_object, // 10
|
|
IRR_OES_get_program_binary, // 47
|
|
IRR_OES_mapbuffer, // 29
|
|
IRR_OES_matrix_get, // 11
|
|
IRR_OES_matrix_palette, // 12
|
|
IRR_OES_packed_depth_stencil, // 44
|
|
IRR_OES_point_size_array, // 14
|
|
IRR_OES_point_sprite, // 15
|
|
IRR_OES_query_matrix, // 16
|
|
IRR_OES_read_format, // 17
|
|
IRR_OES_required_internalformat, // 115
|
|
IRR_OES_rgb8_rgba8, // 30
|
|
IRR_OES_single_precision, // 18
|
|
IRR_OES_standard_derivatives, // 45
|
|
IRR_OES_stencil1, // 31
|
|
IRR_OES_stencil4, // 32
|
|
IRR_OES_stencil8, // 33
|
|
IRR_OES_stencil_wrap, // 19
|
|
IRR_OES_surfaceless_context, // 116
|
|
IRR_OES_texture_3D, // 34
|
|
IRR_OES_texture_cube_map, // 20
|
|
IRR_OES_texture_env_crossbar, // 21
|
|
IRR_OES_texture_float, // 36
|
|
IRR_OES_texture_float_linear, // 35
|
|
IRR_OES_texture_half_float, // 36
|
|
IRR_OES_texture_half_float_linear, // 35
|
|
IRR_OES_texture_mirrored_repeat, // 22
|
|
IRR_OES_texture_npot, // 37
|
|
IRR_OES_vertex_array_object, // 71
|
|
IRR_OES_vertex_half_float, // 38
|
|
IRR_OES_vertex_type_10_10_10_2, // 46
|
|
IRR_QCOM_alpha_test, // 89
|
|
IRR_QCOM_binning_control, // 119
|
|
IRR_QCOM_driver_control, // 55
|
|
IRR_QCOM_extended_get, // 62
|
|
IRR_QCOM_extended_get2, // 63
|
|
IRR_QCOM_performance_monitor_global_mode, // 56
|
|
IRR_QCOM_tiled_rendering, // 70
|
|
IRR_QCOM_writeonly_rendering, // 61
|
|
IRR_SUN_multi_draw_arrays, // 69
|
|
IRR_VIV_shader_binary, // 85
|
|
|
|
IRR_OGLES2_Feature_Count
|
|
};
|
|
|
|
//! queries the features of the driver, returns true if feature is available
|
|
bool queryOpenGLFeature(EOGLES2Features feature) const
|
|
{
|
|
return FeatureAvailable[feature];
|
|
}
|
|
|
|
|
|
protected:
|
|
COGLES2ExtensionHandler();
|
|
|
|
bool queryFeature(video::E_VIDEO_DRIVER_FEATURE feature) const
|
|
{
|
|
switch (feature)
|
|
{
|
|
case EVDF_RENDER_TO_TARGET:
|
|
case EVDF_HARDWARE_TL:
|
|
case EVDF_MULTITEXTURE:
|
|
case EVDF_BILINEAR_FILTER:
|
|
case EVDF_MIP_MAP:
|
|
case EVDF_MIP_MAP_AUTO_UPDATE:
|
|
case EVDF_VERTEX_SHADER_1_1:
|
|
case EVDF_PIXEL_SHADER_1_1:
|
|
case EVDF_PIXEL_SHADER_1_2:
|
|
case EVDF_PIXEL_SHADER_2_0:
|
|
case EVDF_VERTEX_SHADER_2_0:
|
|
case EVDF_ARB_GLSL:
|
|
case EVDF_TEXTURE_NSQUARE:
|
|
case EVDF_TEXTURE_NPOT:
|
|
case EVDF_FRAMEBUFFER_OBJECT:
|
|
case EVDF_VERTEX_BUFFER_OBJECT:
|
|
case EVDF_COLOR_MASK:
|
|
case EVDF_ALPHA_TO_COVERAGE:
|
|
case EVDF_POLYGON_OFFSET:
|
|
case EVDF_TEXTURE_MATRIX:
|
|
return true;
|
|
case EVDF_ARB_VERTEX_PROGRAM_1:
|
|
case EVDF_ARB_FRAGMENT_PROGRAM_1:
|
|
case EVDF_GEOMETRY_SHADER:
|
|
case EVDF_MULTIPLE_RENDER_TARGETS:
|
|
case EVDF_MRT_BLEND:
|
|
case EVDF_MRT_COLOR_MASK:
|
|
case EVDF_MRT_BLEND_FUNC:
|
|
case EVDF_OCCLUSION_QUERY:
|
|
return false;
|
|
case EVDF_BLEND_OPERATIONS:
|
|
return false;
|
|
case EVDF_TEXTURE_COMPRESSED_DXT:
|
|
return false; // NV Tegra need improvements here
|
|
case EVDF_STENCIL_BUFFER:
|
|
return StencilBuffer;
|
|
default:
|
|
return false;
|
|
};
|
|
}
|
|
|
|
void dump() const;
|
|
|
|
void initExtensions(COGLES2Driver* driver,
|
|
bool withStencil);
|
|
|
|
protected:
|
|
u16 Version;
|
|
u8 MaxTextureUnits;
|
|
u8 MaxSupportedTextures;
|
|
u8 MaxAnisotropy;
|
|
u32 MaxIndices;
|
|
u32 MaxTextureSize;
|
|
f32 MaxTextureLODBias;
|
|
//! Minimal and maximal supported thickness for lines without smoothing
|
|
GLfloat DimAliasedLine[2];
|
|
//! Minimal and maximal supported thickness for points without smoothing
|
|
GLfloat DimAliasedPoint[2];
|
|
bool StencilBuffer;
|
|
bool FeatureAvailable[IRR_OGLES2_Feature_Count];
|
|
};
|
|
|
|
} // end namespace video
|
|
} // end namespace irr
|
|
|
|
|
|
#endif // _IRR_COMPILE_WITH_OGLES2_
|
|
#endif
|
|
|