#pragma once
#include <string>
#include <cstdint>
enum {
GPU_VENDOR_NVIDIA = 1,
GPU_VENDOR_AMD = 2,
GPU_VENDOR_INTEL = 3,
GPU_VENDOR_ARM = 4,
GPU_VENDOR_IMGTEC = 5,
GPU_VENDOR_QUALCOMM = 6,
GPU_VENDOR_BROADCOM = 7,
GPU_VENDOR_VIVANTE = 8,
GPU_VENDOR_APPLE = 9,
GPU_VENDOR_MESA = 10,
GPU_VENDOR_UNKNOWN = 0,
};
enum {
BUG_FBO_UNUSABLE = 1,
BUG_PVR_SHADER_PRECISION_BAD = 2,
BUG_PVR_SHADER_PRECISION_TERRIBLE = 4,
};
struct GLExtensions {
int ver[3];
int gpuVendor;
char model[128];
int modelNumber;
bool IsGLES;
bool IsCoreContext;
bool GLES3;
bool OES_depth24;
bool OES_packed_depth_stencil;
bool OES_depth_texture;
bool OES_texture_npot;
bool OES_mapbuffer;
bool OES_vertex_array_object;
bool OES_copy_image;
bool OES_texture_float;
bool OES_texture_3D;
bool OES_texture_compression_astc;
bool ARB_framebuffer_object;
bool ARB_pixel_buffer_object;
bool ARB_blend_func_extended;
bool EXT_blend_func_extended;
bool ARB_explicit_attrib_location;
bool ARB_shader_image_load_store;
bool ARB_shading_language_420pack;
bool ARB_conservative_depth;
bool ARB_copy_image;
bool ARB_vertex_array_object;
bool ARB_texture_float;
bool ARB_draw_instanced;
bool ARB_buffer_storage;
bool ARB_cull_distance;
bool ARB_depth_clamp;
bool ARB_uniform_buffer_object;
bool ARB_texture_non_power_of_two;
bool ARB_stencil_texturing;
bool ARB_shader_stencil_export;
bool ARB_texture_compression_bptc;
bool ARB_texture_compression_rgtc;
bool KHR_texture_compression_astc_ldr;
bool EXT_texture_compression_s3tc;
bool EXT_swap_control_tear;
bool EXT_discard_framebuffer;
bool EXT_unpack_subimage;
bool EXT_bgra;
bool EXT_shader_framebuffer_fetch;
bool EXT_gpu_shader4;
bool EXT_blend_minmax;
bool EXT_framebuffer_object;
bool EXT_copy_image;
bool EXT_texture_filter_anisotropic;
bool PBO_EXT;
bool EXT_draw_instanced;
bool EXT_buffer_storage;
bool EXT_clip_cull_distance;
bool EXT_depth_clamp;
bool NV_copy_image;
bool NV_framebuffer_blit;
bool NV_pixel_buffer_object;
bool ARM_shader_framebuffer_fetch;
bool APPLE_clip_distance;
bool EGL_NV_system_time;
bool EGL_NV_coverage_sample;
int bugs;
int range[2][6][2];
int precision[2][6];
int maxVertexTextureUnits;
bool supportsETC2;
bool supportsBC123;
bool supportsBC45;
bool supportsBC7;
bool supportsASTC;
bool VersionGEThan(int major, int minor, int sub = 0);
int GLSLVersion();
};
extern GLExtensions gl_extensions;
void ProcessGPUFeatures();
extern std::string g_all_gl_extensions;
extern std::string g_all_egl_extensions;
bool CheckGLExtensions();
void SetGLCoreContext(bool flag);
void ResetGLExtensions();
std::string ApplyGLSLPrelude(const std::string &source, uint32_t stage);