diff --git a/panda/src/gles2gsg/gles2gsg.h b/panda/src/gles2gsg/gles2gsg.h index cd905832a1..33046d00f9 100644 --- a/panda/src/gles2gsg/gles2gsg.h +++ b/panda/src/gles2gsg/gles2gsg.h @@ -81,6 +81,7 @@ typedef char GLchar; #define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT GL_FRAMEBUFFER_INCOMPLETE_FORMATS #define GL_DEPTH_ATTACHMENT_EXT GL_DEPTH_ATTACHMENT #define GL_COLOR_ATTACHMENT0_EXT GL_COLOR_ATTACHMENT0 +#define GL_COLOR_ATTACHMENT1_EXT (GL_COLOR_ATTACHMENT0 + 1) #define GL_STENCIL_ATTACHMENT_EXT GL_STENCIL_ATTACHMENT #define GL_DEPTH_STENCIL GL_DEPTH_STENCIL_OES #define GL_DEPTH_STENCIL_EXT GL_DEPTH_STENCIL_OES @@ -123,6 +124,104 @@ typedef char GLchar; #define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE #define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE +// For GLES 3 compat - need a better solution for this +#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x1 +#define GL_ELEMENT_ARRAY_BARRIER_BIT 0x2 +#define GL_UNIFORM_BARRIER_BIT 0x4 +#define GL_TEXTURE_FETCH_BARRIER_BIT 0x8 +#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x20 +#define GL_COMMAND_BARRIER_BIT 0x40 +#define GL_PIXEL_BUFFER_BARRIER_BIT 0x80 +#define GL_TEXTURE_UPDATE_BARRIER_BIT 0x100 +#define GL_BUFFER_UPDATE_BARRIER_BIT 0x200 +#define GL_FRAMEBUFFER_BARRIER_BIT 0x400 +#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT 0x800 +#define GL_ATOMIC_COUNTER_BARRIER_BIT 0x1000 +#define GL_HALF_FLOAT 0x140B +#define GL_COLOR 0x1800 +#define GL_DEPTH 0x1801 +#define GL_STENCIL 0x1802 +#define GL_RGB10_A2 0x8059 +#define GL_TEXTURE_WRAP_R 0x8072 +#define GL_TEXTURE_MIN_LOD 0x813A +#define GL_TEXTURE_MAX_LOD 0x813B +#define GL_TEXTURE_MAX_LEVEL 0x813D +#define GL_NUM_EXTENSIONS 0x821D +#define GL_RG_INTEGER 0x8228 +#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257 +#define GL_PROGRAM_BINARY_LENGTH 0x8741 +#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE +#define GL_PROGRAM_BINARY_FORMATS 0x87FF +#define GL_READ_ONLY 0x88B8 +#define GL_WRITE_ONLY 0x88B9 +#define GL_READ_WRITE 0x88BA +#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF +#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35 +#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36 +#define GL_UNIFORM_TYPE 0x8A37 +#define GL_UNIFORM_SIZE 0x8A38 +#define GL_UNIFORM_NAME_LENGTH 0x8A39 +#define GL_UNIFORM_BLOCK_INDEX 0x8A3A +#define GL_UNIFORM_OFFSET 0x8A3B +#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C +#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D +#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E +#define GL_UNIFORM_BLOCK_BINDING 0x8A3F +#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40 +#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41 +#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42 +#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43 +#define GL_FLOAT_MAT2x3 0x8B65 +#define GL_FLOAT_MAT2x4 0x8B66 +#define GL_FLOAT_MAT3x2 0x8B67 +#define GL_FLOAT_MAT3x4 0x8B68 +#define GL_FLOAT_MAT4x2 0x8B69 +#define GL_FLOAT_MAT4x3 0x8B6A +#define GL_TEXTURE_2D_ARRAY 0x8C1A +#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D +#define GL_R11F_G11F_B10F 0x8C3A +#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B +#define GL_RGB9_E5 0x8C3D +#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E +#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B +#define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69 +#define GL_RED_INTEGER 0x8D94 +#define GL_RGB_INTEGER 0x8D98 +#define GL_RGBA_INTEGER 0x8D99 +#define GL_SAMPLER_2D_ARRAY 0x8DC1 +#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4 +#define GL_SAMPLER_CUBE_SHADOW 0x8DC5 +#define GL_UNSIGNED_INT_VEC2 0x8DC6 +#define GL_UNSIGNED_INT_VEC3 0x8DC7 +#define GL_UNSIGNED_INT_VEC4 0x8DC8 +#define GL_INT_SAMPLER_2D 0x8DCA +#define GL_INT_SAMPLER_3D 0x8DCB +#define GL_INT_SAMPLER_CUBE 0x8DCC +#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF +#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2 +#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3 +#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4 +#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7 +#define GL_MAX_IMAGE_UNITS 0x8F38 +#define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009 +#define GL_IMAGE_2D 0x904D +#define GL_IMAGE_3D 0x904E +#define GL_IMAGE_CUBE 0x9050 +#define GL_IMAGE_2D_ARRAY 0x9053 +#define GL_INT_IMAGE_2D 0x9058 +#define GL_INT_IMAGE_3D 0x9059 +#define GL_INT_IMAGE_CUBE 0x905B +#define GL_INT_IMAGE_2D_ARRAY 0x905E +#define GL_UNSIGNED_INT_IMAGE_2D 0x9063 +#define GL_UNSIGNED_INT_IMAGE_3D 0x9064 +#define GL_UNSIGNED_INT_IMAGE_CUBE 0x9066 +#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY 0x9069 +#define GL_COMPUTE_SHADER 0x91B9 +#define GL_FRAMEBUFFER_DEFAULT_WIDTH 0x9310 +#define GL_FRAMEBUFFER_DEFAULT_HEIGHT 0x9311 +#define GL_FRAMEBUFFER_DEFAULT_SAMPLES 0x9313 +#define GL_ALL_BARRIER_BITS 0xFFFFFFFF + #undef SUPPORT_IMMEDIATE_MODE #define APIENTRY #define APIENTRYP * diff --git a/panda/src/glesgsg/glesgsg.h b/panda/src/glesgsg/glesgsg.h index 40b4722b22..416e5737cb 100644 --- a/panda/src/glesgsg/glesgsg.h +++ b/panda/src/glesgsg/glesgsg.h @@ -73,6 +73,7 @@ #define GL_RENDERBUFFER_ALPHA_SIZE_EXT GL_RENDERBUFFER_ALPHA_SIZE_OES #define GL_RENDERBUFFER_DEPTH_SIZE_EXT GL_RENDERBUFFER_DEPTH_SIZE_OES #define GL_RENDERBUFFER_STENCIL_SIZE_EXT GL_RENDERBUFFER_STENCIL_SIZE_OES +#define GL_FRAMEBUFFER GL_FRAMEBUFFER_OES #define GL_FRAMEBUFFER_EXT GL_FRAMEBUFFER_OES #define GL_DRAW_FRAMEBUFFER_EXT GL_FRAMEBUFFER_OES #define GL_READ_FRAMEBUFFER_EXT GL_FRAMEBUFFER_OES @@ -119,6 +120,17 @@ #define GL_LUMINANCE8 GL_LUMINANCE8_EXT #define GL_LUMINANCE8_ALPHA8 GL_LUMINANCE8_ALPHA8_EXT #define GL_MAX_VERTEX_UNITS_ARB GL_MAX_VERTEX_UNITS_OES +#define GL_TEXTURE_MAX_LEVEL GL_TEXTURE_MAX_LEVEL_APPLE + +// These aren't technically part of OpenGL ES 1.0, but some implementations +// nonetheless implement it. +#define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242 +#define GL_DEBUG_TYPE_PERFORMANCE 0x8250 +#define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B +#define GL_DEBUG_SEVERITY_HIGH 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM 0x9147 +#define GL_DEBUG_SEVERITY_LOW 0x9148 +#define GL_DEBUG_OUTPUT 0x92E0 #undef SUPPORT_IMMEDIATE_MODE #define APIENTRY diff --git a/panda/src/glstuff/glGraphicsBuffer_src.cxx b/panda/src/glstuff/glGraphicsBuffer_src.cxx index b750233520..9586b93490 100644 --- a/panda/src/glstuff/glGraphicsBuffer_src.cxx +++ b/panda/src/glstuff/glGraphicsBuffer_src.cxx @@ -252,7 +252,7 @@ begin_frame(FrameMode mode, Thread *current_thread) { // In case of multisample rendering, we don't need to issue the barrier // until we call glBlitFramebuffer. -#ifndef OPENGLES +#ifndef OPENGLES_1 if (gl_enable_memory_barriers && _fbo_multisample == 0) { CLP(GraphicsStateGuardian) *glgsg; DCAST_INTO_R(glgsg, _gsg, false); @@ -526,7 +526,6 @@ rebuild_bitplanes() { } glgsg->bind_fbo(_fbo[layer]); -#ifndef OPENGLES if (glgsg->_use_object_labels) { // Assign a label for OpenGL to use when displaying debug messages. if (num_fbos > 1) { @@ -538,7 +537,6 @@ rebuild_bitplanes() { glgsg->_glObjectLabel(GL_FRAMEBUFFER, _fbo[layer], _name.size(), _name.data()); } } -#endif // For all slots, update the slot. if (_use_depth_stencil) { @@ -591,7 +589,7 @@ rebuild_bitplanes() { glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); } -#ifndef OPENGLES +#ifndef OPENGLES_1 } else if (glgsg->_supports_empty_framebuffer) { // Set the "default" width and height, which is required to have an FBO // without any attachments. @@ -751,12 +749,10 @@ bind_slot(int layer, bool rb_resize, Texture **attach, RenderTexturePlane slot, _fb_properties.setup_color_texture(tex); } -#ifndef OPENGLES GLenum target = glgsg->get_texture_target(tex->get_texture_type()); if (target == GL_TEXTURE_CUBE_MAP) { target = GL_TEXTURE_CUBE_MAP_POSITIVE_X + layer; } -#endif if (attachpoint == GL_DEPTH_ATTACHMENT_EXT) { GLCAT.debug() << "Binding texture " << *tex << " to depth attachment.\n"; @@ -815,7 +811,7 @@ bind_slot(int layer, bool rb_resize, Texture **attach, RenderTexturePlane slot, GLuint gl_format = GL_RGBA4; switch (slot) { case RTP_depth_stencil: - gl_format = GL_DEPTH_STENCIL_OES; + gl_format = GL_DEPTH24_STENCIL8_OES; break; case RTP_depth: if (_fb_properties.get_depth_bits() > 24 && glgsg->_supports_depth32) { @@ -1191,9 +1187,7 @@ attach_tex(int layer, int view, Texture *attach, GLenum attachpoint) { glgsg->_glFramebufferTexture3D(GL_FRAMEBUFFER_EXT, attachpoint, target, gtc->_index, 0, layer); break; -#endif -#ifndef OPENGLES - case GL_TEXTURE_2D_ARRAY_EXT: + case GL_TEXTURE_2D_ARRAY: glgsg->_glFramebufferTextureLayer(GL_FRAMEBUFFER_EXT, attachpoint, gtc->_index, 0, layer); break; @@ -1729,7 +1723,7 @@ resolve_multisamples() { PStatGPUTimer timer(glgsg, _resolve_multisample_pcollector); -#ifndef OPENGLES +#ifndef OPENGLES_1 if (gl_enable_memory_barriers) { // Issue memory barriers as necessary to make sure that the texture memory // is synchronized before we blit to it. diff --git a/panda/src/glstuff/glGraphicsStateGuardian_src.I b/panda/src/glstuff/glGraphicsStateGuardian_src.I index a1fa34dd4a..221aff21b9 100644 --- a/panda/src/glstuff/glGraphicsStateGuardian_src.I +++ b/panda/src/glstuff/glGraphicsStateGuardian_src.I @@ -189,6 +189,8 @@ INLINE bool CLP(GraphicsStateGuardian):: is_at_least_gles_version(int major_version, int minor_version) const { #ifndef OPENGLES return false; +#elif defined(OPENGLES_1) + return major_version == 1 && _gl_version_minor >= minor_version; #else if (_gl_version_major < major_version) { return false; diff --git a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx index ad15b7d210..a9df4de469 100644 --- a/panda/src/glstuff/glGraphicsStateGuardian_src.cxx +++ b/panda/src/glstuff/glGraphicsStateGuardian_src.cxx @@ -97,8 +97,8 @@ static void APIENTRY null_glPointParameterfv(GLenum, const GLfloat *) { } -#ifdef OPENGLES -// OpenGL ES doesn't support this, period. Might as well macro it. +#ifdef OPENGLES_1 +// OpenGL ES 1 doesn't support this, period. Might as well macro it. #define _glDrawRangeElements(mode, start, end, count, type, indices) \ glDrawElements(mode, count, type, indices) @@ -127,9 +127,14 @@ null_glActiveTexture(GLenum gl_texture_stage) { nassertv(gl_texture_stage == GL_TEXTURE0); } +#ifdef OPENGLES_2 +#define _glBlendEquation glBlendEquation +#define _glBlendColor glBlendColor +#else static void APIENTRY null_glBlendEquation(GLenum) { } +#endif static void APIENTRY null_glBlendColor(GLclampf, GLclampf, GLclampf, GLclampf) { @@ -186,7 +191,7 @@ static const string default_fshader = " p3d_FragColor += p3d_TexAlphaOnly;\n" // Hack for text rendering " p3d_FragColor *= color;\n" #else - " gl_FragColor = texture2D(p3d_Texture0, texcoord).bgra;\n" + " gl_FragColor = texture2D(p3d_Texture0, texcoord);\n" " gl_FragColor += p3d_TexAlphaOnly;\n" // Hack for text rendering " gl_FragColor *= color;\n" #endif @@ -404,7 +409,6 @@ CLP(GraphicsStateGuardian):: * This is called by the GL if an error occurs, if gl_debug has been enabled * (and the driver supports the GL_ARB_debug_output extension). */ -#ifndef OPENGLES_1 void CLP(GraphicsStateGuardian):: debug_callback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, GLvoid *userParam) { // Determine how to map the severity level. @@ -445,7 +449,6 @@ debug_callback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei l } #endif } -#endif // OPENGLES_1 /** * Resets all internal state as if the gsg were newly created. @@ -498,9 +501,9 @@ reset() { // Save the extensions tokens. _extensions.clear(); - // In OpenGL 3.0 and later, glGetString(GL_EXTENSIONS) is deprecated. -#ifndef OPENGLES - if (is_at_least_gl_version(3, 0)) { + // In OpenGL (ES) 3.0 and later, glGetString(GL_EXTENSIONS) is deprecated. +#ifndef OPENGLES_1 + if (_gl_version_major >= 3) { PFNGLGETSTRINGIPROC _glGetStringi = (PFNGLGETSTRINGIPROC)get_extension_func("glGetStringi"); @@ -549,7 +552,6 @@ reset() { // Initialize OpenGL debugging output first, if enabled and supported. _supports_debug = false; _use_object_labels = false; -#ifndef OPENGLES_1 if (gl_debug) { PFNGLDEBUGMESSAGECALLBACKPROC_P _glDebugMessageCallback; PFNGLDEBUGMESSAGECONTROLPROC _glDebugMessageControl; @@ -617,7 +619,6 @@ reset() { GLCAT.debug() << "gl-debug disabled and unsupported.\n"; } } -#endif // OPENGLES_1 _supported_geom_rendering = Geom::GR_indexed_point | @@ -629,7 +630,11 @@ reset() { _supports_point_parameters = false; -#ifndef OPENGLES_2 +#ifdef OPENGLES_1 + _glPointParameterfv = glPointParameterfv; +#elif defined(OPENGLES) + // Other OpenGL ES versions don't support point parameters. +#else if (is_at_least_gl_version(1, 4)) { _supports_point_parameters = true; _glPointParameterfv = (PFNGLPOINTPARAMETERFVPROC) @@ -671,7 +676,16 @@ reset() { _supported_geom_rendering |= Geom::GR_point_sprite; } -#ifndef OPENGLES +#ifdef OPENGLES_1 + // OpenGL ES 1.0 does not support primitive restart indices. + +#elif defined(OPENGLES) + if (gl_support_primitive_restart_index && is_at_least_gles_version(3, 0)) { + glEnable(GL_PRIMITIVE_RESTART_FIXED_INDEX); + _supported_geom_rendering |= Geom::GR_strip_cut_index; + } + +#else _explicit_primitive_restart = false; _glPrimitiveRestartIndex = NULL; @@ -682,7 +696,7 @@ reset() { // possible index for a numeric type as strip cut index, which coincides // with our convention. This saves us a call to glPrimitiveRestartIndex // ... of course, though, the Gallium driver bugs out here. See also: - // https:www.panda3d.orgforumsviewtopic.php?f=5&t=17512 + // https://www.panda3d.org/forums/viewtopic.php?f=5&t=17512 glEnable(GL_PRIMITIVE_RESTART_FIXED_INDEX); _supported_geom_rendering |= Geom::GR_strip_cut_index; @@ -709,9 +723,15 @@ reset() { } #endif -#ifndef OPENGLES +#ifndef OPENGLES_1 _glDrawRangeElements = null_glDrawRangeElements; +#ifdef OPENGLES + if (is_at_least_gles_version(3, 0)) { + _glDrawRangeElements = (PFNGLDRAWRANGEELEMENTSPROC) + get_extension_func("glDrawRangeElements"); + } +#else if (is_at_least_gl_version(1, 2)) { _glDrawRangeElements = (PFNGLDRAWRANGEELEMENTSPROC) get_extension_func("glDrawRangeElements"); @@ -720,17 +740,18 @@ reset() { _glDrawRangeElements = (PFNGLDRAWRANGEELEMENTSPROC) get_extension_func("glDrawRangeElementsEXT"); } +#endif if (_glDrawRangeElements == NULL) { GLCAT.warning() << "glDrawRangeElements advertised as supported by OpenGL runtime, but could not get pointers to extension functions.\n"; _glDrawRangeElements = null_glDrawRangeElements; } -#endif +#endif // !OPENGLES_1 _supports_3d_texture = false; #ifndef OPENGLES_1 - if (is_at_least_gl_version(1, 2)) { + if (is_at_least_gl_version(1, 2) || is_at_least_gles_version(3, 0)) { _supports_3d_texture = true; _glTexImage3D = (PFNGLTEXIMAGE3DPROC_P) @@ -740,6 +761,7 @@ reset() { _glCopyTexSubImage3D = (PFNGLCOPYTEXSUBIMAGE3DPROC) get_extension_func("glCopyTexSubImage3D"); +#ifndef OPENGLES } else if (has_extension("GL_EXT_texture3D")) { _supports_3d_texture = true; @@ -753,7 +775,7 @@ reset() { _glCopyTexSubImage3D = (PFNGLCOPYTEXSUBIMAGE3DPROC) get_extension_func("glCopyTexSubImage3DEXT"); } - +#else } else if (has_extension("GL_OES_texture_3D")) { _supports_3d_texture = true; @@ -763,8 +785,6 @@ reset() { get_extension_func("glTexSubImage3DOES"); _glCopyTexSubImage3D = (PFNGLCOPYTEXSUBIMAGE3DPROC) get_extension_func("glCopyTexSubImage3DOES"); - -#ifdef OPENGLES_2 _glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DOES) get_extension_func("glFramebufferTexture3DOES"); #endif @@ -781,8 +801,11 @@ reset() { _supports_tex_storage = false; -#ifndef OPENGLES +#ifdef OPENGLES + if (is_at_least_gles_version(3, 0)) { +#else if (is_at_least_gl_version(4, 2) || has_extension("GL_ARB_texture_storage")) { +#endif _supports_tex_storage = true; _glTexStorage1D = (PFNGLTEXSTORAGE1DPROC) @@ -791,10 +814,9 @@ reset() { get_extension_func("glTexStorage2D"); _glTexStorage3D = (PFNGLTEXSTORAGE3DPROC) get_extension_func("glTexStorage3D"); - - } else -#endif - if (has_extension("GL_EXT_texture_storage")) { // GLES case + } +#ifdef OPENGLES + else if (has_extension("GL_EXT_texture_storage")) { _supports_tex_storage = true; _glTexStorage1D = (PFNGLTEXSTORAGE1DPROC) @@ -804,6 +826,7 @@ reset() { _glTexStorage3D = (PFNGLTEXSTORAGE3DPROC) get_extension_func("glTexStorage3DEXT"); } +#endif if (_supports_tex_storage) { if (_glTexStorage1D == NULL || _glTexStorage2D == NULL || _glTexStorage3D == NULL) { @@ -844,25 +867,27 @@ reset() { #endif _supports_2d_texture_array = false; -#ifndef OPENGLES - if (is_at_least_gl_version(3, 0)) { +#ifndef OPENGLES_1 + if (_gl_version_major >= 3) { _supports_2d_texture_array = true; _glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC) get_extension_func("glFramebufferTextureLayer"); +#ifndef OPENGLES } else if (has_extension("GL_EXT_texture_array")) { _supports_2d_texture_array = true; _glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC) get_extension_func("glFramebufferTextureLayerEXT"); +#endif } if (_supports_2d_texture_array && _glFramebufferTextureLayer == NULL) { GLCAT.warning() << "Texture arrays advertised as supported by OpenGL runtime, but could not get pointer to glFramebufferTextureLayer function.\n"; } -#endif +#endif // !OPENGLES_1 #ifdef OPENGLES_2 _supports_cube_map = true; @@ -897,13 +922,13 @@ reset() { } #endif - _supports_texture_srgb = false; - if (is_at_least_gl_version(2, 1) || has_extension("GL_EXT_texture_sRGB")) { - _supports_texture_srgb = true; - - } else if (has_extension("GL_EXT_sRGB")) { // GLES case. - _supports_texture_srgb = true; - } +#ifdef OPENGLES + _supports_texture_srgb = + is_at_least_gles_version(3, 0) || has_extension("GL_EXT_sRGB"); +#else + _supports_texture_srgb = + is_at_least_gl_version(2, 1) || has_extension("GL_EXT_texture_sRGB"); +#endif #ifdef OPENGLES _supports_compressed_texture = true; @@ -1037,23 +1062,30 @@ reset() { #endif } -#ifdef OPENGLES_2 - _supports_bgr = false; +#ifdef OPENGLES + // Note that these extensions only offer support for GL_BGRA, not GL_BGR. + _supports_bgr = has_extension("GL_EXT_texture_format_BGRA8888") || + has_extension("GL_APPLE_texture_format_BGRA8888"); #else + // In regular OpenGL, we have both GL_BGRA and GL_BGR. _supports_bgr = is_at_least_gl_version(1, 2) || has_extension("GL_EXT_bgra"); #endif #ifdef SUPPORT_FIXED_FUNCTION +#ifdef OPENGLES_1 + _supports_rescale_normal = true; +#else _supports_rescale_normal = !core_profile && gl_support_rescale_normal && (is_at_least_gl_version(1, 2) || has_extension("GL_EXT_rescale_normal")); +#endif #ifndef OPENGLES _use_separate_specular_color = gl_separate_specular_color && (is_at_least_gl_version(1, 2) || has_extension("GL_EXT_separate_specular_color")); #endif -#endif +#endif // SUPPORT_FIXED_FUNCTION #ifdef OPENGLES _supports_packed_dabc = false; @@ -1066,8 +1098,13 @@ reset() { has_extension("GL_ARB_vertex_type_10f_11f_11f_rev"); #endif +#ifdef OPENGLES + //TODO + _supports_multisample = false; +#else _supports_multisample = has_extension("GL_ARB_multisample") || is_at_least_gl_version(1, 3); +#endif #ifdef OPENGLES_1 _supports_generate_mipmap = is_at_least_gles_version(1, 1); @@ -1078,8 +1115,10 @@ reset() { has_extension("GL_SGIS_generate_mipmap"); #endif -#ifdef OPENGLES - _supports_tex_non_pow2 = +#ifdef OPENGLES_1 + _supports_tex_non_pow2 = false; +#elif defined(OPENGLES) + _supports_tex_non_pow2 = is_at_least_gles_version(3, 0) || has_extension("GL_OES_texture_npot"); #else _supports_tex_non_pow2 = is_at_least_gl_version(2, 0) || @@ -1179,19 +1218,31 @@ reset() { #endif #endif // OPENGLES_2 -#ifdef OPENGLES - if (has_extension("GL_ANGLE_depth_texture")) { - // This extension provides both depth textures and depth-stencil support. - _supports_depth_texture = true; - _supports_depth_stencil = true; - - } else if (has_extension("GL_OES_depth_texture")) { - _supports_depth_texture = true; - _supports_depth_stencil = has_extension("GL_OES_packed_depth_stencil"); - } +#ifdef OPENGLES_1 + _supports_depth_texture = false; + _supports_depth_stencil = has_extension("GL_OES_packed_depth_stencil"); _supports_depth24 = has_extension("GL_OES_depth24"); _supports_depth32 = has_extension("GL_OES_depth32"); +#elif defined(OPENGLES) + if (is_at_least_gles_version(3, 0)) { + _supports_depth_texture = true; + _supports_depth_stencil = true; + _supports_depth24 = true; + _supports_depth32 = true; + } else { + if (has_extension("GL_ANGLE_depth_texture")) { + // This extension provides both depth textures and depth-stencil support. + _supports_depth_texture = true; + _supports_depth_stencil = true; + + } else if (has_extension("GL_OES_depth_texture")) { + _supports_depth_texture = true; + _supports_depth_stencil = has_extension("GL_OES_packed_depth_stencil"); + } + _supports_depth24 = has_extension("GL_OES_depth24"); + _supports_depth32 = has_extension("GL_OES_depth32"); + } #else _supports_depth_texture = (is_at_least_gl_version(1, 4) || has_extension("GL_ARB_depth_texture")); @@ -1202,7 +1253,7 @@ reset() { #ifdef OPENGLES_2 if (gl_support_shadow_filter && _supports_depth_texture && - has_extension("GL_EXT_shadow_samplers")) { + (is_at_least_gles_version(3, 0) || has_extension("GL_EXT_shadow_samplers"))) { _supports_shadow_filter = true; } #else @@ -1232,17 +1283,21 @@ reset() { is_at_least_gles_version(1, 1) || has_extension("GL_ARB_texture_env_combine"); +#ifdef OPENGLES_1 + _supports_texture_saved_result = + has_extension("GL_OES_texture_env_crossbar"); +#else _supports_texture_saved_result = is_at_least_gl_version(1, 4) || - has_extension("GL_ARB_texture_env_crossbar") || - has_extension("GL_OES_texture_env_crossbar"); + has_extension("GL_ARB_texture_env_crossbar"); +#endif _supports_texture_dot3 = is_at_least_gl_version(1, 3) || is_at_least_gles_version(1, 1) || has_extension("GL_ARB_texture_env_dot3"); } -#endif +#endif // SUPPORT_FIXED_FUNCTION #ifdef OPENGLES_2 _supports_buffers = true; @@ -1307,7 +1362,19 @@ reset() { } #endif -#ifndef OPENGLES +#ifdef OPENGLES + if (is_at_least_gles_version(3, 0)) { + _glMapBufferRange = (PFNGLMAPBUFFERRANGEEXTPROC) + get_extension_func("glMapBufferRange"); + + } else if (has_extension("GL_EXT_map_buffer_range")) { + _glMapBufferRange = (PFNGLMAPBUFFERRANGEEXTPROC) + get_extension_func("glMapBufferRangeEXT"); + + } else { + _glMapBufferRange = NULL; + } +#else // Check for various advanced buffer management features. if (is_at_least_gl_version(3, 0) || has_extension("GL_ARB_map_buffer_range")) { _glMapBufferRange = (PFNGLMAPBUFFERRANGEPROC) @@ -1334,7 +1401,11 @@ reset() { _supports_vao = false; +#ifdef OPENGLES + if (is_at_least_gles_version(3, 0)) { +#else if (is_at_least_gl_version(3, 0) || has_extension("GL_ARB_vertex_array_object")) { +#endif _supports_vao = true; _glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC) @@ -1344,6 +1415,7 @@ reset() { _glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC) get_extension_func("glGenVertexArrays"); +#ifdef OPENGLES } else if (has_extension("GL_OES_vertex_array_object")) { _supports_vao = true; @@ -1353,6 +1425,7 @@ reset() { get_extension_func("glDeleteVertexArraysOES"); _glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC) get_extension_func("glGenVertexArraysOES"); +#endif } if (_supports_vao) { @@ -1476,8 +1549,12 @@ reset() { #endif // HAVE_CG _supports_compute_shaders = false; -#ifndef OPENGLES +#ifndef OPENGLES_1 +#ifdef OPENGLES + if (is_at_least_gles_version(3, 1)) { +#else if (is_at_least_gl_version(4, 3) || has_extension("GL_ARB_compute_shader")) { +#endif _glDispatchCompute = (PFNGLDISPATCHCOMPUTEPROC) get_extension_func("glDispatchCompute"); @@ -1485,7 +1562,7 @@ reset() { _supports_compute_shaders = true; } } -#endif +#endif // !OPENGLES_1 #ifndef OPENGLES if (_supports_glsl) { @@ -1635,26 +1712,39 @@ reset() { _glVertexAttrib4fv = glVertexAttrib4fv; _glVertexAttrib4dv = null_glVertexAttrib4dv; _glVertexAttribPointer = glVertexAttribPointer; - _glVertexAttribIPointer = NULL; _glVertexAttribLPointer = NULL; + + if (is_at_least_gles_version(3, 0)) { + _glVertexAttribIPointer = (PFNGLVERTEXATTRIBIPOINTERPROC) + get_extension_func("glVertexAttribIPointer"); + } else { + _glVertexAttribIPointer = NULL; + } #endif -#ifndef OPENGLES +#ifndef OPENGLES_1 _use_vertex_attrib_binding = false; +#ifdef OPENGLES + if (is_at_least_gles_version(3, 1)) { +#else if (is_at_least_gl_version(4, 3) || has_extension("GL_ARB_vertex_attrib_binding")) { +#endif _glBindVertexBuffer = (PFNGLBINDVERTEXBUFFERPROC) get_extension_func("glBindVertexBuffer"); _glVertexAttribFormat = (PFNGLVERTEXATTRIBFORMATPROC) get_extension_func("glVertexAttribFormat"); _glVertexAttribIFormat = (PFNGLVERTEXATTRIBIFORMATPROC) get_extension_func("glVertexAttribIFormat"); - _glVertexAttribLFormat = (PFNGLVERTEXATTRIBLFORMATPROC) - get_extension_func("glVertexAttribLFormat"); _glVertexAttribBinding = (PFNGLVERTEXATTRIBBINDINGPROC) get_extension_func("glVertexAttribBinding"); _glVertexBindingDivisor = (PFNGLVERTEXBINDINGDIVISORPROC) get_extension_func("glVertexBindingDivisor"); +#ifndef OPENGLES + _glVertexAttribLFormat = (PFNGLVERTEXATTRIBLFORMATPROC) + get_extension_func("glVertexAttribLFormat"); +#endif + if (gl_fixed_vertex_attrib_locations) { _use_vertex_attrib_binding = true; } @@ -1676,7 +1766,11 @@ reset() { #ifndef OPENGLES // Check for uniform buffers. +#ifdef OPENGLES if (is_at_least_gl_version(3, 1) || has_extension("GL_ARB_uniform_buffer_object")) { +#else + if (is_at_least_gles_version(3, 0)) { +#endif _supports_uniform_buffers = true; _glGetActiveUniformsiv = (PFNGLGETACTIVEUNIFORMSIVPROC) get_extension_func("glGetActiveUniformsiv"); @@ -1698,8 +1792,20 @@ reset() { _supports_vertex_attrib_divisor = false; _supports_geometry_instancing = false; -#elif defined(OPENGLES_2) - if (has_extension("GL_ANGLE_instanced_arrays")) { +#elif defined(OPENGLES) + if (is_at_least_gles_version(3, 0)) { + // OpenGL ES 3 has all of this in the core. + _glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISORPROC) + get_extension_func("glVertexAttribDivisor"); + _glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDPROC) + get_extension_func("glDrawArraysInstanced"); + _glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDPROC) + get_extension_func("glDrawElementsInstanced"); + + _supports_vertex_attrib_divisor = true; + _supports_geometry_instancing = true; + + } else if (has_extension("GL_ANGLE_instanced_arrays")) { // This extension has both things in one. #ifdef __EMSCRIPTEN__ // Work around bug - it doesn't allow ANGLE suffix in getProcAddress. @@ -1821,8 +1927,12 @@ reset() { // Check if we support indirect draw. _supports_indirect_draw = false; -#ifndef OPENGLES +#ifndef OPENGLES_1 +#ifdef OPENGLES + if (is_at_least_gles_version(3, 1)) { +#else if (is_at_least_gl_version(4, 0) || has_extension("GL_ARB_draw_indirect")) { +#endif _glDrawArraysIndirect = (PFNGLDRAWARRAYSINDIRECTPROC) get_extension_func("glDrawArraysIndirect"); _glDrawElementsIndirect = (PFNGLDRAWELEMENTSINDIRECTPROC) @@ -1837,7 +1947,45 @@ reset() { } #endif -#ifdef OPENGLES_2 +#ifdef OPENGLES_1 + if (has_extension("GL_OES_framebuffer_object")) { + _supports_framebuffer_object = true; + _glIsRenderbuffer = (PFNGLISRENDERBUFFEROESPROC) + get_extension_func("glIsRenderbufferOES"); + _glBindRenderbuffer = (PFNGLBINDRENDERBUFFEROESPROC) + get_extension_func("glBindRenderbufferOES"); + _glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSOESPROC) + get_extension_func("glDeleteRenderbuffersOES"); + _glGenRenderbuffers = (PFNGLGENRENDERBUFFERSOESPROC) + get_extension_func("glGenRenderbuffersOES"); + _glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEOESPROC) + get_extension_func("glRenderbufferStorageOES"); + _glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVOESPROC) + get_extension_func("glGetRenderbufferParameterivOES"); + _glIsFramebuffer = (PFNGLISFRAMEBUFFEROESPROC) + get_extension_func("glIsFramebufferOES"); + _glBindFramebuffer = (PFNGLBINDFRAMEBUFFEROESPROC) + get_extension_func("glBindFramebufferOES"); + _glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSOESPROC) + get_extension_func("glDeleteFramebuffersOES"); + _glGenFramebuffers = (PFNGLGENFRAMEBUFFERSOESPROC) + get_extension_func("glGenFramebuffersOES"); + _glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSOESPROC) + get_extension_func("glCheckFramebufferStatusOES"); + _glFramebufferTexture1D = NULL; + _glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DOESPROC) + get_extension_func("glFramebufferTexture2DOES"); + _glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFEROESPROC) + get_extension_func("glFramebufferRenderbufferOES"); + _glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVOESPROC) + get_extension_func("glGetFramebufferAttachmentParameterivOES"); + _glGenerateMipmap = (PFNGLGENERATEMIPMAPOESPROC) + get_extension_func("glGenerateMipmapOES"); + } else { + _supports_framebuffer_object = false; + _glGenerateMipmap = NULL; + } +#elif defined(OPENGLES) // In OpenGL ES 2.x, FBO's are supported in the core. _supports_framebuffer_object = true; _glIsRenderbuffer = glIsRenderbuffer; @@ -1856,13 +2004,9 @@ reset() { _glFramebufferRenderbuffer = glFramebufferRenderbuffer; _glGetFramebufferAttachmentParameteriv = glGetFramebufferAttachmentParameteriv; _glGenerateMipmap = glGenerateMipmap; + #else - // Make sure this is properly initialized. - _glGenerateMipmap = NULL; - // TODO: add ARB3.0 version - - _supports_framebuffer_object = false; if (has_extension("GL_EXT_framebuffer_object")) { _supports_framebuffer_object = true; _glIsRenderbuffer = (PFNGLISRENDERBUFFEREXTPROC) @@ -1899,43 +2043,17 @@ reset() { get_extension_func("glGetFramebufferAttachmentParameterivEXT"); _glGenerateMipmap = (PFNGLGENERATEMIPMAPEXTPROC) get_extension_func("glGenerateMipmapEXT"); + + } else if (is_at_least_gl_version(3, 0)) { + // This case should go away when we support the ARB/3.0 version of FBOs. + _supports_framebuffer_object = false; + _glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC) + get_extension_func("glGenerateMipmap"); + + } else { + _supports_framebuffer_object = false; + _glGenerateMipmap = NULL; } -#ifdef OPENGLES - else if (has_extension("GL_OES_framebuffer_object")) { - _supports_framebuffer_object = true; - _glIsRenderbuffer = (PFNGLISRENDERBUFFEROESPROC) - get_extension_func("glIsRenderbufferOES"); - _glBindRenderbuffer = (PFNGLBINDRENDERBUFFEROESPROC) - get_extension_func("glBindRenderbufferOES"); - _glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSOESPROC) - get_extension_func("glDeleteRenderbuffersOES"); - _glGenRenderbuffers = (PFNGLGENRENDERBUFFERSOESPROC) - get_extension_func("glGenRenderbuffersOES"); - _glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEOESPROC) - get_extension_func("glRenderbufferStorageOES"); - _glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVOESPROC) - get_extension_func("glGetRenderbufferParameterivOES"); - _glIsFramebuffer = (PFNGLISFRAMEBUFFEROESPROC) - get_extension_func("glIsFramebufferOES"); - _glBindFramebuffer = (PFNGLBINDFRAMEBUFFEROESPROC) - get_extension_func("glBindFramebufferOES"); - _glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSOESPROC) - get_extension_func("glDeleteFramebuffersOES"); - _glGenFramebuffers = (PFNGLGENFRAMEBUFFERSOESPROC) - get_extension_func("glGenFramebuffersOES"); - _glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSOESPROC) - get_extension_func("glCheckFramebufferStatusOES"); - _glFramebufferTexture1D = NULL; - _glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DOESPROC) - get_extension_func("glFramebufferTexture2DOES"); - _glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFEROESPROC) - get_extension_func("glFramebufferRenderbufferOES"); - _glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVOESPROC) - get_extension_func("glGetFramebufferAttachmentParameterivOES"); - _glGenerateMipmap = (PFNGLGENERATEMIPMAPOESPROC) - get_extension_func("glGenerateMipmapOES"); - } -#endif // OPENGLES #endif #ifndef OPENGLES @@ -1947,21 +2065,38 @@ reset() { } #endif -#ifndef OPENGLES +#ifndef OPENGLES_1 + // Do we support empty framebuffer objects? +#ifdef OPENGLES + if (is_at_least_gles_version(3, 1)) { +#else if (is_at_least_gl_version(4, 3) || has_extension("GL_ARB_framebuffer_no_attachments")) { +#endif _glFramebufferParameteri = (PFNGLFRAMEBUFFERPARAMETERIPROC) get_extension_func("glFramebufferParameteri"); _supports_empty_framebuffer = true; } else { _supports_empty_framebuffer = false; } -#endif +#endif // !OPENGLES_1 _supports_framebuffer_multisample = false; - if (has_extension("GL_EXT_framebuffer_multisample")) { + if (is_at_least_gles_version(3, 0)) { + _supports_framebuffer_multisample = true; + _glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) + get_extension_func("glRenderbufferStorageMultisample"); + +#ifdef OPENGLES + } else if (has_extension("GL_APPLE_framebuffer_multisample")) { + _supports_framebuffer_multisample = true; + _glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEAPPLEPROC) + get_extension_func("glRenderbufferStorageMultisampleAPPLE"); +#else + } else if (has_extension("GL_EXT_framebuffer_multisample")) { _supports_framebuffer_multisample = true; _glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) get_extension_func("glRenderbufferStorageMultisampleEXT"); +#endif } #ifndef OPENGLES @@ -1975,7 +2110,13 @@ reset() { #ifndef OPENGLES_1 _supports_framebuffer_blit = false; - if (has_extension("GL_EXT_framebuffer_blit")) { + + if (is_at_least_gles_version(3, 0)) { + _supports_framebuffer_blit = true; + _glBlitFramebuffer = (PFNGLBLITFRAMEBUFFEREXTPROC) + get_extension_func("glBlitFramebuffer"); + + } else if (has_extension("GL_EXT_framebuffer_blit")) { _supports_framebuffer_blit = true; _glBlitFramebuffer = (PFNGLBLITFRAMEBUFFEREXTPROC) get_extension_func("glBlitFramebufferEXT"); @@ -1987,7 +2128,11 @@ reset() { _max_color_targets = 1; #elif defined(OPENGLES_2) - if (has_extension("GL_EXT_draw_buffers")) { + if (is_at_least_gles_version(3, 0)) { + _glDrawBuffers = (PFNGLDRAWBUFFERSPROC) + get_extension_func("glDrawBuffers"); + + } else if (has_extension("GL_EXT_draw_buffers")) { _glDrawBuffers = (PFNGLDRAWBUFFERSPROC) get_extension_func("glDrawBuffersEXT"); @@ -2022,8 +2167,8 @@ reset() { } #endif // !OPENGLES_1 -#ifndef OPENGLES - if (is_at_least_gl_version(3, 0)) { +#ifndef OPENGLES_1 + if (_gl_version_major >= 3) { _glClearBufferfv = (PFNGLCLEARBUFFERFVPROC) get_extension_func("glClearBufferfv"); _glClearBufferiv = (PFNGLCLEARBUFFERIVPROC) @@ -2139,10 +2284,8 @@ reset() { } #endif -#ifdef OPENGLES_2 // In OpenGL ES 2.x, this is supported in the core. - _glBlendEquation = glBlendEquation; -#else +#ifndef OPENGLES_2 _glBlendEquation = NULL; bool supports_blend_equation = false; if (is_at_least_gl_version(1, 2)) { @@ -2167,10 +2310,8 @@ reset() { } #endif -#ifdef OPENGLES_2 - // In OpenGL ES 2.x, this is supported in the core. - _glBlendColor = glBlendColor; -#else + // In OpenGL ES 2.x, this is supported in the core. In 1.x, not at all. +#ifndef OPENGLES _glBlendColor = NULL; bool supports_blend_color = false; if (is_at_least_gl_version(1, 2)) { @@ -2210,13 +2351,18 @@ reset() { } #endif -#ifdef OPENGLES_2 +#ifdef OPENGLES_1 + _mirror_repeat = GL_REPEAT; + if (has_extension("GL_OES_texture_mirrored_repeat")) { + _mirror_repeat = GL_MIRRORED_REPEAT; + } +#elif defined(OPENGLES) + // OpenGL 2.x and above support this in the core. _mirror_repeat = GL_MIRRORED_REPEAT; #else _mirror_repeat = GL_REPEAT; - if (has_extension("GL_ARB_texture_mirrored_repeat") || - is_at_least_gl_version(1, 4) || - has_extension("GL_OES_texture_mirrored_repeat")) { + if (is_at_least_gl_version(1, 4) || + has_extension("GL_ARB_texture_mirrored_repeat")) { _mirror_repeat = GL_MIRRORED_REPEAT; } #endif @@ -2232,7 +2378,10 @@ reset() { } #endif -#ifndef OPENGLES +#ifdef OPENGLES + _supports_texture_lod = is_at_least_gles_version(3, 0); + _supports_texture_lod_bias = false; +#else _supports_texture_lod = false; _supports_texture_lod_bias = false; @@ -2246,6 +2395,13 @@ reset() { } #endif +#ifdef OPENGLES + _supports_texture_max_level = is_at_least_gles_version(3, 0) || + has_extension("GL_APPLE_texture_max_level"); +#else + _supports_texture_max_level = is_at_least_gl_version(1, 2); +#endif + if (_supports_multisample) { GLint sample_buffers = 0; glGetIntegerv(GL_SAMPLE_BUFFERS, &sample_buffers); @@ -2276,9 +2432,9 @@ reset() { } else { _max_3d_texture_dimension = 0; } -#ifndef OPENGLES - if(_supports_2d_texture_array) { - glGetIntegerv(GL_MAX_ARRAY_TEXTURE_LAYERS_EXT, &max_2d_texture_array_layers); +#ifndef OPENGLES_1 + if (_supports_2d_texture_array) { + glGetIntegerv(GL_MAX_ARRAY_TEXTURE_LAYERS, &max_2d_texture_array_layers); _max_2d_texture_array_layers = max_2d_texture_array_layers; } #endif @@ -2319,9 +2475,11 @@ reset() { << ", max 3d texture = " << _max_3d_texture_dimension << ", max 2d texture array = " << max_2d_texture_array_layers << ", max cube map = " << _max_cube_map_dimension << "\n"; +#ifndef OPENGLES GLCAT.debug() << "max_elements_vertices = " << max_elements_vertices << ", max_elements_indices = " << max_elements_indices << "\n"; +#endif if (_supports_buffers) { if (vertex_buffers) { GLCAT.debug() @@ -2386,10 +2544,14 @@ reset() { _supports_anisotropy = true; } - // Check availability of image readwrite functionality in shaders. + // Check availability of image read/write functionality in shaders. _max_image_units = 0; -#ifndef OPENGLES +#ifndef OPENGLES_1 +#ifdef OPENGLES + if (is_at_least_gl_version(3, 1)) { +#else if (is_at_least_gl_version(4, 2) || has_extension("GL_ARB_shader_image_load_store")) { +#endif _glBindImageTexture = (PFNGLBINDIMAGETEXTUREPROC) get_extension_func("glBindImageTexture"); _glMemoryBarrier = (PFNGLMEMORYBARRIERPROC) @@ -2397,6 +2559,7 @@ reset() { glGetIntegerv(GL_MAX_IMAGE_UNITS, &_max_image_units); +#ifndef OPENGLES } else if (has_extension("GL_EXT_shader_image_load_store")) { _glBindImageTexture = (PFNGLBINDIMAGETEXTUREPROC) get_extension_func("glBindImageTextureEXT"); @@ -2404,17 +2567,23 @@ reset() { get_extension_func("glMemoryBarrierEXT"); glGetIntegerv(GL_MAX_IMAGE_UNITS_EXT, &_max_image_units); +#endif } else { _glBindImageTexture = NULL; _glMemoryBarrier = NULL; } +#endif // !OPENGLES_1 _supports_sampler_objects = false; -#ifndef OPENGLES +#ifndef OPENGLES_1 if (gl_support_sampler_objects && - ((is_at_least_gl_version(3, 3) || has_extension("GL_ARB_sampler_objects")))) { +#ifdef OPENGLES + is_at_least_gles_version(3, 0)) { +#else + (is_at_least_gl_version(3, 3) || has_extension("GL_ARB_sampler_objects"))) { +#endif _glGenSamplers = (PFNGLGENSAMPLERSPROC) get_extension_func("glGenSamplers"); _glDeleteSamplers = (PFNGLDELETESAMPLERSPROC) get_extension_func("glDeleteSamplers"); _glBindSampler = (PFNGLBINDSAMPLERPROC) get_extension_func("glBindSampler"); @@ -2433,7 +2602,7 @@ reset() { _supports_sampler_objects = true; } } -#endif // OPENGLES +#endif // !OPENGLES_1 // Check availability of multi-bind functions. _supports_multi_bind = false; @@ -2461,9 +2630,14 @@ reset() { << "ARB_multi_bind advertised as supported by OpenGL runtime, but could not get pointers to extension function.\n"; } } -#endif // OPENGLES +#endif // !OPENGLES +#ifndef OPENGLES_1 +#ifdef OPENGLES + if (is_at_least_gl_version(3, 0)) { +#else if (is_at_least_gl_version(4, 3) || has_extension("GL_ARB_internalformat_query2")) { +#endif _glGetInternalformativ = (PFNGLGETINTERNALFORMATIVPROC) get_extension_func("glGetInternalformativ"); @@ -2472,8 +2646,10 @@ reset() { << "ARB_internalformat_query2 advertised as supported by OpenGL runtime, but could not get pointers to extension function.\n"; } } +#endif // !OPENGLES_1 _supports_bindless_texture = false; +#ifndef OPENGLES if (has_extension("GL_ARB_bindless_texture")) { _glGetTextureHandle = (PFNGLGETTEXTUREHANDLEPROC) get_extension_func("glGetTextureHandleARB"); @@ -2492,13 +2668,17 @@ reset() { _supports_bindless_texture = true; } } -#endif +#endif // !OPENGLES -#ifndef OPENGLES +#ifndef OPENGLES_1 _supports_get_program_binary = false; _program_binary_formats.clear(); +#ifdef OPENGLES + if (is_at_least_gles_version(3, 0)) { +#else if (is_at_least_gl_version(4, 1) || has_extension("GL_ARB_get_program_binary")) { +#endif _glGetProgramBinary = (PFNGLGETPROGRAMBINARYPROC) get_extension_func("glGetProgramBinary"); _glProgramBinary = (PFNGLPROGRAMBINARYPROC) @@ -2524,7 +2704,7 @@ reset() { } } } -#endif +#endif // !OPENGLES_1 report_my_gl_errors(); @@ -2540,12 +2720,18 @@ reset() { } #endif - _supports_stencil_wrap = - has_extension("GL_EXT_stencil_wrap") || has_extension("GL_OES_stencil_wrap"); - +#ifdef OPENGLES_1 + _supports_stencil_wrap = has_extension("GL_OES_stencil_wrap"); +#elif defined(OPENGLES) + _supports_stencil_wrap = true; +#else + _supports_stencil_wrap = is_at_least_gl_version(1, 4) || + has_extension("GL_EXT_stencil_wrap"); +#endif _supports_two_sided_stencil = false; #ifndef OPENGLES + //TODO: support the two-sided stencil functions that ended up in core. if (has_extension("GL_EXT_stencil_two_side")) { _glActiveStencilFaceEXT = (PFNGLACTIVESTENCILFACEEXTPROC) get_extension_func("glActiveStencilFaceEXT"); @@ -2600,10 +2786,8 @@ reset() { memset(_vertex_attrib_divisors, 0, sizeof(GLint) * 32); #endif -#ifndef OPENGLES // Dither is on by default in GL; let's turn it off glDisable(GL_DITHER); -#endif // OPENGLES _dithering_enabled = false; #ifndef OPENGLES_1 @@ -2709,20 +2893,24 @@ reset() { report_my_gl_errors(); -#ifndef OPENGLES +#ifndef OPENGLES_1 if (GLCAT.is_debug()) { - GLCAT.debug() - << "Supported shader binary formats:\n"; - GLCAT.debug() << " "; + if (_supports_get_program_binary) { + GLCAT.debug() + << "Supported shader binary formats:\n"; + GLCAT.debug() << " "; - pset::const_iterator it; - for (it = _program_binary_formats.begin(); - it != _program_binary_formats.end(); ++it) { - char number[16]; - sprintf(number, "0x%04X", *it); - GLCAT.debug(false) << " " << number << ""; + pset::const_iterator it; + for (it = _program_binary_formats.begin(); + it != _program_binary_formats.end(); ++it) { + char number[16]; + sprintf(number, "0x%04X", *it); + GLCAT.debug(false) << " " << number << ""; + } + GLCAT.debug(false) << "\n"; + } else { + GLCAT.debug() << "No shader binary formats supported.\n"; } - GLCAT.debug(false) << "\n"; } #endif @@ -2882,7 +3070,7 @@ clear(DrawableRegion *clearable) { int mask = 0; -#ifndef OPENGLES +#ifndef OPENGLES_1 if (_current_fbo != 0 && _glClearBufferfv != NULL) { // We can use glClearBuffer to clear all the color attachments, which // protects us from the overhead of having to call set_draw_buffer for @@ -3174,7 +3362,7 @@ clear_before_callback() { // Clear the bound sampler object, so that we do not inadvertently override // the callback's desired sampler settings. -#ifndef OPENGLES +#ifndef OPENGLES_1 if (_supports_sampler_objects) { _glBindSampler(0, 0); @@ -3666,7 +3854,7 @@ begin_draw_primitives(const GeomPipelineReader *geom_reader, _use_sender = !vertex_arrays; #endif -#ifndef OPENGLES +#ifndef OPENGLES_1 if (_use_vertex_attrib_binding) { const GeomVertexFormat *format = data_reader->get_format(); if (format != _current_vertex_format) { @@ -3982,7 +4170,7 @@ disable_standard_vertex_arrays() { } #endif // SUPPORT_FIXED_FUNCTION -#ifndef OPENGLES +#ifndef OPENGLES_1 /** * Updates the vertex format used by the shader. This is still an * experimental feature. @@ -4689,7 +4877,7 @@ end_draw_primitives() { report_my_gl_errors(); } -#ifndef OPENGLES +#ifndef OPENGLES_1 /** * Issues the given memory barriers, and clears the list of textures marked as * incoherent for the given bits. @@ -4734,7 +4922,7 @@ issue_memory_barrier(GLbitfield barriers) { report_my_gl_errors(); } -#endif // OPENGLES +#endif // OPENGLES_1 /** * Creates whatever structures the GSG requires to represent the texture @@ -4876,7 +5064,7 @@ void CLP(GraphicsStateGuardian):: release_texture(TextureContext *tc) { CLP(TextureContext) *gtc = DCAST(CLP(TextureContext), tc); -#ifndef OPENGLES +#ifndef OPENGLES_1 _textures_needing_fetch_barrier.erase(gtc); _textures_needing_image_access_barrier.erase(gtc); _textures_needing_update_barrier.erase(gtc); @@ -4920,7 +5108,7 @@ extract_texture_data(Texture *tex) { return success; } -#ifndef OPENGLES +#ifndef OPENGLES_1 /** * Creates whatever structures the GSG requires to represent the sampler state * internally, and returns a newly-allocated SamplerContext object with this @@ -4948,6 +5136,7 @@ prepare_sampler(const SamplerState &sampler) { _glSamplerParameteri(index, GL_TEXTURE_WRAP_R, get_texture_wrap_mode(sampler.get_wrap_w())); +#ifndef OPENGLES #ifdef STDFLOAT_DOUBLE LVecBase4f fvalue = LCAST(float, sampler.get_border_color()); _glSamplerParameterfv(index, GL_TEXTURE_BORDER_COLOR, fvalue.get_data()); @@ -4955,6 +5144,7 @@ prepare_sampler(const SamplerState &sampler) { _glSamplerParameterfv(index, GL_TEXTURE_BORDER_COLOR, sampler.get_border_color().get_data()); #endif +#endif // OPENGLES SamplerState::FilterType minfilter = sampler.get_effective_minfilter(); SamplerState::FilterType magfilter = sampler.get_effective_magfilter(); @@ -4997,18 +5187,20 @@ prepare_sampler(const SamplerState &sampler) { _glSamplerParameterf(index, GL_TEXTURE_MAX_LOD, sampler.get_max_lod()); } +#ifndef OPENGLES if (_supports_texture_lod_bias) { _glSamplerParameterf(index, GL_TEXTURE_LOD_BIAS, sampler.get_lod_bias()); } +#endif gsc->enqueue_lru(&_prepared_objects->_sampler_object_lru); report_my_gl_errors(); return gsc; } -#endif // !OPENGLES +#endif // !OPENGLES_1 -#ifndef OPENGLES +#ifndef OPENGLES_1 /** * Frees the GL resources previously allocated for the sampler. This function * should never be called directly; instead, call SamplerState::release(). @@ -5023,7 +5215,7 @@ release_sampler(SamplerContext *sc) { delete gsc; } -#endif // !OPENGLES +#endif // !OPENGLES_1 /** * Creates a new retained-mode representation of the given geom, and returns a @@ -5629,7 +5821,7 @@ issue_timer_query(int pstats_index) { #endif } -#ifndef OPENGLES +#ifndef OPENGLES_1 /** * Dispatches a currently bound compute shader using the given work group * counts. @@ -5645,7 +5837,7 @@ dispatch_compute(int num_groups_x, int num_groups_y, int num_groups_z) { maybe_gl_finish(); } -#endif // !OPENGLES +#endif // !OPENGLES_1 /** * Creates a new GeomMunger object to munge vertices appropriate to this GSG @@ -5825,7 +6017,7 @@ framebuffer_copy_to_texture(Texture *tex, int view, int z, } } -#ifndef OPENGLES +#ifndef OPENGLES_1 if (gtc->needs_barrier(GL_TEXTURE_UPDATE_BARRIER_BIT)) { // Make sure that any incoherent writes to this texture have been synced. issue_memory_barrier(GL_TEXTURE_UPDATE_BARRIER_BIT); @@ -5905,7 +6097,6 @@ framebuffer_copy_to_ram(Texture *tex, int view, int z, dr->get_region_pixels(xo, yo, w, h); Texture::ComponentType component_type = tex->get_component_type(); - bool color_mode = false; Texture::Format format = tex->get_format(); switch (format) { @@ -5930,7 +6121,6 @@ framebuffer_copy_to_ram(Texture *tex, int view, int z, break; default: - color_mode = true; if (_current_properties->get_srgb_color()) { if (_current_properties->get_alpha_bits()) { format = Texture::F_srgb_alpha; @@ -5990,6 +6180,11 @@ framebuffer_copy_to_ram(Texture *tex, int view, int z, case GL_DEPTH_STENCIL: GLCAT.spam(false) << "GL_DEPTH_STENCIL, "; break; +#ifndef OPENGLES_1 + case GL_RG: + GLCAT.spam(false) << "GL_RG, "; + break; +#endif case GL_RGB: GLCAT.spam(false) << "GL_RGB, "; break; @@ -6048,7 +6243,7 @@ framebuffer_copy_to_ram(Texture *tex, int view, int z, // We may have to reverse the byte ordering of the image if GL didn't do it // for us. - if (color_mode && !_supports_bgr) { + if (external_format == GL_RGBA || external_format == GL_RGB) { PTA_uchar new_image; const unsigned char *result = fix_component_ordering(new_image, image_ptr, image_size, @@ -6723,6 +6918,7 @@ do_issue_blending() { glBlendFunc(get_blend_func(color_blend->get_operand_a()), get_blend_func(color_blend->get_operand_b())); +#ifndef OPENGLES_1 LColor c; if (_color_blend_involves_color_scale) { // Apply the current color scale to the blend mode. @@ -6732,12 +6928,15 @@ do_issue_blending() { } _glBlendColor(c[0], c[1], c[2], c[3]); +#endif if (GLCAT.is_spam()) { GLCAT.spam() << "glBlendEquation(" << color_blend_mode << ")\n"; GLCAT.spam() << "glBlendFunc(" << color_blend->get_operand_a() << color_blend->get_operand_b() << ")\n"; +#ifndef OPENGLES_1 GLCAT.spam() << "glBlendColor(" << c << ")\n"; +#endif } return; } @@ -7445,7 +7644,7 @@ do_get_extension_func(const char *) { */ void CLP(GraphicsStateGuardian):: set_draw_buffer(int rbtype) { -#ifndef OPENGLES // Draw buffers not supported by OpenGL ES. +#ifndef OPENGLES // Draw buffers not supported by OpenGL ES. (TODO!) if (_current_fbo) { GLuint buffers[16]; int nbuffers = 0; @@ -7539,7 +7738,7 @@ set_draw_buffer(int rbtype) { */ void CLP(GraphicsStateGuardian):: set_read_buffer(int rbtype) { -#ifndef OPENGLES // Draw buffers not supported by OpenGL ES. +#ifndef OPENGLES // Draw buffers not supported by OpenGL ES. (TODO!) if (rbtype & (RenderBuffer::T_depth | RenderBuffer::T_stencil)) { // Special case: don't have to call ReadBuffer for these. return; @@ -7667,7 +7866,7 @@ get_numeric_type(Geom::NumericType numeric_type) { #endif case Geom::NT_packed_ufloat: -#ifndef OPENGLES +#ifndef OPENGLES_1 return GL_UNSIGNED_INT_10F_11F_11F_REV; #else break; @@ -7703,7 +7902,7 @@ get_texture_target(Texture::TextureType texture_type) const { return GL_NONE; case Texture::TT_2d_texture_array: -#ifndef OPENGLES +#ifndef OPENGLES_1 if (_supports_2d_texture_array) { return GL_TEXTURE_2D_ARRAY; } @@ -7902,7 +8101,7 @@ get_component_type(Texture::ComponentType component_type) { case Texture::T_short: return GL_SHORT; -#ifndef OPENGLES +#ifndef OPENGLES_1 case Texture::T_half_float: return GL_HALF_FLOAT; #endif @@ -8137,10 +8336,12 @@ get_external_image_format(Texture *tex) const { case Texture::F_r11_g11_b10: case Texture::F_rgb9_e5: #ifdef OPENGLES + // OpenGL ES never supports BGR, even if _supports_bgr is true. return GL_RGB; #else return _supports_bgr ? GL_BGR : GL_RGB; #endif + case Texture::F_rgba: case Texture::F_rgbm: case Texture::F_rgba4: @@ -8151,11 +8352,7 @@ get_external_image_format(Texture *tex) const { case Texture::F_rgba32: case Texture::F_srgb_alpha: case Texture::F_rgb10_a2: -#ifdef OPENGLES_2 - return GL_RGBA; -#else return _supports_bgr ? GL_BGRA : GL_RGBA; -#endif case Texture::F_luminance: case Texture::F_sluminance: @@ -8173,7 +8370,7 @@ get_external_image_format(Texture *tex) const { return GL_RG; #endif -#ifndef OPENGLES +#ifndef OPENGLES_1 case Texture::F_r8i: case Texture::F_r32i: return GL_RED_INTEGER; @@ -8776,7 +8973,7 @@ get_internal_image_format(Texture *tex, bool force_sized) const { return force_sized ? GL_RG8 : GL_RG; #endif -#ifndef OPENGLES +#ifndef OPENGLES_1 case Texture::F_rg: return force_sized ? GL_RG8 : GL_RG; #endif @@ -8801,7 +8998,7 @@ get_internal_image_format(Texture *tex, bool force_sized) const { return GL_R32I; #endif -#ifndef OPENGLES +#ifndef OPENGLES_1 case Texture::F_r11_g11_b10: return GL_R11F_G11F_B10F; @@ -9141,7 +9338,7 @@ GLenum CLP(GraphicsStateGuardian):: get_usage(Geom::UsageHint usage_hint) { switch (usage_hint) { case Geom::UH_stream: -#ifdef OPENGLES +#ifdef OPENGLES_1 return GL_DYNAMIC_DRAW; #else return GL_STREAM_DRAW; @@ -9176,6 +9373,7 @@ get_compressed_format_string(GLenum format) { case 0x83F3: return "GL_COMPRESSED_RGBA_S3TC_DXT5_EXT"; case 0x86B0: return "GL_COMPRESSED_RGB_FXT1_3DFX"; case 0x86B1: return "GL_COMPRESSED_RGBA_FXT1_3DFX"; + case 0x88EE: return "GL_ETC1_SRGB8_NV"; case 0x8A54: return "GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT"; case 0x8A55: return "GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT"; case 0x8A56: return "GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT"; @@ -9206,6 +9404,7 @@ get_compressed_format_string(GLenum format) { case 0x8C71: return "GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT"; case 0x8C72: return "GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT"; case 0x8C73: return "GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT"; + case 0x8D64: return "GL_ETC1_RGB8_OES"; case 0x8DBB: return "GL_COMPRESSED_RED_RGTC1"; case 0x8DBC: return "GL_COMPRESSED_SIGNED_RED_RGTC1"; case 0x8DBD: return "GL_COMPRESSED_RG_RGTC2"; @@ -9319,7 +9518,7 @@ reissue_transforms() { _active_texture_stage = -1; -#ifndef OPENGLES +#ifndef OPENGLES_1 // Might also want to reissue the vertex format, for good measure. _current_vertex_format.clear(); memset(_vertex_attrib_columns, 0, sizeof(const GeomVertexColumn *) * 32); @@ -9963,7 +10162,7 @@ update_standard_texture_bindings() { // Unsupported texture mode. continue; } -#ifndef OPENGLES +#ifndef OPENGLES_1 if (target == GL_TEXTURE_2D_ARRAY || target == GL_TEXTURE_CUBE_MAP_ARRAY) { // Cannot be applied via the FFP. continue; @@ -10703,23 +10902,20 @@ specify_texture(CLP(TextureContext) *gtc, const SamplerState &sampler) { glTexParameteri(target, GL_TEXTURE_WRAP_S, get_texture_wrap_mode(sampler.get_wrap_u())); #ifndef OPENGLES - if (target != GL_TEXTURE_1D) { + if (target != GL_TEXTURE_1D) +#endif + { glTexParameteri(target, GL_TEXTURE_WRAP_T, get_texture_wrap_mode(sampler.get_wrap_v())); } -#endif -#ifdef OPENGLES_2 - if (target == GL_TEXTURE_3D_OES) { - glTexParameteri(target, GL_TEXTURE_WRAP_R_OES, - get_texture_wrap_mode(sampler.get_wrap_w())); - } -#endif -#ifndef OPENGLES +#ifndef OPENGLES_1 if (target == GL_TEXTURE_3D) { glTexParameteri(target, GL_TEXTURE_WRAP_R, get_texture_wrap_mode(sampler.get_wrap_w())); } +#endif +#ifndef OPENGLES LColor border_color = sampler.get_border_color(); call_glTexParameterfv(target, GL_TEXTURE_BORDER_COLOR, border_color); #endif // OPENGLES @@ -10782,12 +10978,14 @@ specify_texture(CLP(TextureContext) *gtc, const SamplerState &sampler) { } #endif -#ifndef OPENGLES +#ifndef OPENGLES_1 if (_supports_texture_lod) { glTexParameterf(target, GL_TEXTURE_MIN_LOD, sampler.get_min_lod()); glTexParameterf(target, GL_TEXTURE_MAX_LOD, sampler.get_max_lod()); } +#endif +#ifndef OPENGLES if (_supports_texture_lod_bias) { glTexParameterf(target, GL_TEXTURE_LOD_BIAS, sampler.get_lod_bias()); } @@ -10843,7 +11041,7 @@ apply_texture(CLP(TextureContext) *gtc) { */ bool CLP(GraphicsStateGuardian):: apply_sampler(GLuint unit, const SamplerState &sampler, CLP(TextureContext) *gtc) { -#ifndef OPENGLES +#ifndef OPENGLES_1 if (_supports_sampler_objects) { // We support sampler objects. Prepare the sampler object and bind it to // the indicated texture unit. @@ -10861,7 +11059,7 @@ apply_sampler(GLuint unit, const SamplerState &sampler, CLP(TextureContext) *gtc } } else -#endif // OPENGLES +#endif // !OPENGLES_1 { // We don't support sampler objects. We'll have to bind the texture and // change the texture parameters if they don't match. @@ -11199,14 +11397,12 @@ upload_texture(CLP(TextureContext) *gtc, bool force, bool uses_mipmaps) { } } -#ifndef OPENGLES // OpenGL ES doesn't have GL_TEXTURE_MAX_LEVEL. - if (is_at_least_gl_version(1, 2)) { + if (_supports_texture_max_level) { // By the time we get here, we have a pretty good prediction for the // number of mipmaps we're going to have, so tell the GL that's all it's // going to get. glTexParameteri(target, GL_TEXTURE_MAX_LEVEL, num_levels - 1); } -#endif #ifndef OPENGLES_2 if (gtc->_generate_mipmaps && _glGenerateMipmap == NULL) { @@ -11465,7 +11661,7 @@ upload_texture_image(CLP(TextureContext) *gtc, bool needs_reload, } } -#ifndef OPENGLES +#ifndef OPENGLES_1 if (needs_reload || num_ram_mipmap_levels > 0) { // Make sure that any incoherent writes to this texture have been synced. if (gtc->needs_barrier(GL_TEXTURE_UPDATE_BARRIER_BIT)) { @@ -11568,7 +11764,7 @@ upload_texture_image(CLP(TextureContext) *gtc, bool needs_reload, } nassertr(image_ptr >= orig_image_ptr && image_ptr + view_size <= orig_image_ptr + tex->get_ram_mipmap_image_size(n), false); - if (!_supports_bgr && image_compression == Texture::CM_off) { + if (image_compression == Texture::CM_off) { // If the GL doesn't claim to support BGR, we may have to reverse // the component ordering of the image. image_ptr = fix_component_ordering(bgr_image, image_ptr, view_size, @@ -11613,7 +11809,7 @@ upload_texture_image(CLP(TextureContext) *gtc, bool needs_reload, break; #endif // OPENGLES -#ifndef OPENGLES +#ifndef OPENGLES_1 case GL_TEXTURE_2D_ARRAY: case GL_TEXTURE_CUBE_MAP_ARRAY: if (_supports_2d_texture_array) { @@ -11629,7 +11825,7 @@ upload_texture_image(CLP(TextureContext) *gtc, bool needs_reload, return false; } break; -#endif // OPENGLES +#endif // OPENGLES_1 #ifndef OPENGLES case GL_TEXTURE_BUFFER: @@ -11712,12 +11908,10 @@ upload_texture_image(CLP(TextureContext) *gtc, bool needs_reload, GLCAT.warning() << "No mipmap level " << n << " defined for " << tex->get_name() << "\n"; -#ifndef OPENGLES - if (is_at_least_gl_version(1, 2)) { + if (_supports_texture_max_level) { // Tell the GL we have no more mipmaps for it to use. glTexParameteri(texture_target, GL_TEXTURE_MAX_LEVEL, n - mipmap_bias); } -#endif break; } @@ -11742,7 +11936,7 @@ upload_texture_image(CLP(TextureContext) *gtc, bool needs_reload, } nassertr(image_ptr >= orig_image_ptr && image_ptr + view_size <= orig_image_ptr + tex->get_ram_mipmap_image_size(n), false); - if (!_supports_bgr && image_compression == Texture::CM_off) { + if (image_compression == Texture::CM_off) { // If the GL doesn't claim to support BGR, we may have to reverse // the component ordering of the image. image_ptr = fix_component_ordering(bgr_image, image_ptr, view_size, @@ -11771,13 +11965,8 @@ upload_texture_image(CLP(TextureContext) *gtc, bool needs_reload, break; #endif // OPENGLES // OpenGL ES will fall through. -#ifdef OPENGLES_2 - case GL_TEXTURE_3D_OES: -#endif -#ifndef OPENGLES - case GL_TEXTURE_3D: -#endif #ifndef OPENGLES_1 + case GL_TEXTURE_3D: if (_supports_3d_texture) { if (image_compression == Texture::CM_off) { _glTexImage3D(page_target, n - mipmap_bias, internal_format, @@ -11793,9 +11982,9 @@ upload_texture_image(CLP(TextureContext) *gtc, bool needs_reload, return false; } break; -#endif +#endif // OPENGLES_1 -#ifndef OPENGLES +#ifndef OPENGLES_1 case GL_TEXTURE_2D_ARRAY: case GL_TEXTURE_CUBE_MAP_ARRAY: if (_supports_2d_texture_array) { @@ -11813,7 +12002,7 @@ upload_texture_image(CLP(TextureContext) *gtc, bool needs_reload, return false; } break; -#endif // OPENGLES +#endif // OPENGLES_1 #ifndef OPENGLES case GL_TEXTURE_BUFFER: @@ -11892,12 +12081,8 @@ upload_simple_texture(CLP(TextureContext) *gtc) { Texture *tex = gtc->get_texture(); nassertr(tex != (Texture *)NULL, false); - int internal_format = GL_RGBA; -#ifdef OPENGLES_2 - int external_format = GL_RGBA; -#else - int external_format = GL_BGRA; -#endif + GLenum internal_format = GL_RGBA; + GLenum external_format = GL_BGRA; const unsigned char *image_ptr = tex->get_simple_ram_image(); if (image_ptr == (const unsigned char *)NULL) { @@ -11916,19 +12101,17 @@ upload_simple_texture(CLP(TextureContext) *gtc) { int width = tex->get_simple_x_size(); int height = tex->get_simple_y_size(); - int component_type = GL_UNSIGNED_BYTE; + GLenum component_type = GL_UNSIGNED_BYTE; if (GLCAT.is_debug()) { GLCAT.debug() << "loading simple image for " << tex->get_name() << "\n"; } -#ifndef OPENGLES // Turn off mipmaps for the simple texture. - if (tex->uses_mipmaps() && is_at_least_gl_version(1, 2)) { + if (tex->uses_mipmaps() && _supports_texture_max_level) { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0); } -#endif #ifdef DO_PSTATS _data_transferred_pcollector.add_level(image_size); @@ -12096,7 +12279,7 @@ do_extract_texture_data(CLP(TextureContext) *gtc) { return false; } -#ifndef OPENGLES +#ifndef OPENGLES_1 // Make sure any incoherent writes to the texture have been synced. if (gtc->needs_barrier(GL_TEXTURE_UPDATE_BARRIER_BIT)) { issue_memory_barrier(GL_TEXTURE_UPDATE_BARRIER_BIT); @@ -12118,19 +12301,11 @@ do_extract_texture_data(CLP(TextureContext) *gtc) { glGetTexParameteriv(target, GL_TEXTURE_WRAP_S, &wrap_u); glGetTexParameteriv(target, GL_TEXTURE_WRAP_T, &wrap_v); wrap_w = GL_REPEAT; +#ifndef OPENGLES_1 if (_supports_3d_texture) { -#ifdef OPENGLES_2 - glGetTexParameteriv(target, GL_TEXTURE_WRAP_R_OES, &wrap_w); -#endif -#ifndef OPENGLES glGetTexParameteriv(target, GL_TEXTURE_WRAP_R, &wrap_w); -#endif } - if (_supports_2d_texture_array) { -#ifndef OPENGLES - glGetTexParameteriv(target, GL_TEXTURE_WRAP_R, &wrap_w); #endif - } glGetTexParameteriv(target, GL_TEXTURE_MIN_FILTER, &minfilter); glGetTexParameteriv(target, GL_TEXTURE_MAG_FILTER, &magfilter); @@ -12153,13 +12328,9 @@ do_extract_texture_data(CLP(TextureContext) *gtc) { if (_supports_3d_texture && target == GL_TEXTURE_3D) { glGetTexLevelParameteriv(page_target, 0, GL_TEXTURE_DEPTH, &depth); - } -#ifndef OPENGLES - else if (target == GL_TEXTURE_2D_ARRAY || target == GL_TEXTURE_CUBE_MAP_ARRAY) { + } else if (target == GL_TEXTURE_2D_ARRAY || target == GL_TEXTURE_CUBE_MAP_ARRAY) { glGetTexLevelParameteriv(page_target, 0, GL_TEXTURE_DEPTH, &depth); - } -#endif - else if (target == GL_TEXTURE_CUBE_MAP) { + } else if (target == GL_TEXTURE_CUBE_MAP) { depth = 6; } #endif @@ -12368,7 +12539,7 @@ do_extract_texture_data(CLP(TextureContext) *gtc) { break; #endif -#ifndef OPENGLES +#ifndef OPENGLES_1 case GL_R11F_G11F_B10F: type = Texture::T_float; format = Texture::F_r11_g11_b10; @@ -12618,12 +12789,11 @@ do_extract_texture_data(CLP(TextureContext) *gtc) { // Also get the mipmap levels. GLint num_expected_levels = tex->get_expected_num_mipmap_levels(); GLint highest_level = num_expected_levels; -#ifndef OPENGLES - if (is_at_least_gl_version(1, 2)) { + + if (_supports_texture_max_level) { glGetTexParameteriv(target, GL_TEXTURE_MAX_LEVEL, &highest_level); highest_level = min(highest_level, num_expected_levels); } -#endif for (int n = 1; n <= highest_level; ++n) { if (!extract_texture_image(image, page_size, tex, target, page_target, type, compression, n)) { diff --git a/panda/src/glstuff/glGraphicsStateGuardian_src.h b/panda/src/glstuff/glGraphicsStateGuardian_src.h index 5a1ded8644..12739321db 100644 --- a/panda/src/glstuff/glGraphicsStateGuardian_src.h +++ b/panda/src/glstuff/glGraphicsStateGuardian_src.h @@ -186,8 +186,26 @@ typedef void (APIENTRYP PFNGLVERTEXATTRIBLPOINTERPROC) (GLuint index, GLint size typedef void (APIENTRYP PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor); typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount); -#endif // OPENGLES_1 -#ifndef OPENGLES +typedef void (APIENTRYP PFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer); +typedef void (APIENTRYP PFNGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect); +typedef void (APIENTRYP PFNGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawbuffer, const GLint *value); +typedef void (APIENTRYP PFNGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawbuffer, const GLuint *value); +typedef void (APIENTRYP PFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawbuffer, const GLfloat *value); +typedef void (APIENTRYP PFNGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); +typedef void (APIENTRYP PFNGLBINDVERTEXBUFFERPROC) (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +typedef void (APIENTRYP PFNGLVERTEXATTRIBFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXATTRIBIFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXATTRIBLFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXATTRIBBINDINGPROC) (GLuint attribindex, GLuint bindingindex); +typedef void (APIENTRYP PFNGLVERTEXBINDINGDIVISORPROC) (GLuint bindingindex, GLuint divisor); +typedef void (APIENTRYP PFNGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMSIVPROC) (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMNAMEPROC) (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName); +typedef GLuint (APIENTRYP PFNGLGETUNIFORMBLOCKINDEXPROC) (GLuint program, const GLchar *uniformBlockName); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKIVPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); +typedef void (APIENTRYP PFNGLUNIFORMBLOCKBINDINGPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); typedef void (APIENTRYP PFNGLGENSAMPLERSPROC) (GLsizei count, GLuint *samplers); typedef void (APIENTRYP PFNGLDELETESAMPLERSPROC) (GLsizei count, const GLuint *samplers); typedef void (APIENTRYP PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler); @@ -195,17 +213,22 @@ typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pnam typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, const GLint *param); typedef void (APIENTRYP PFNGLSAMPLERPARAMETERFPROC) (GLuint sampler, GLenum pname, GLfloat param); typedef void (APIENTRYP PFNGLSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, const GLfloat *param); -typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value); +typedef void (APIENTRYP PFNGLDISPATCHCOMPUTEPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); +typedef void (APIENTRYP PFNGLFRAMEBUFFERPARAMETERIPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLMEMORYBARRIERPROC) (GLbitfield barriers); +typedef void (APIENTRYP PFNGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); +typedef void (APIENTRYP PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length); +typedef void (APIENTRYP PFNGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params); +typedef void (APIENTRYP PFNGLBUFFERSTORAGEPROC) (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); +typedef void (APIENTRYP PFNGLBINDIMAGETEXTUREPROC) (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); +#endif // OPENGLES_1 +#ifndef OPENGLES typedef void (APIENTRYP PFNGLCLEARTEXIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); typedef void (APIENTRYP PFNGLCLEARTEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); typedef void (APIENTRYP PFNGLBINDTEXTURESPROC) (GLuint first, GLsizei count, const GLuint *textures); typedef void (APIENTRYP PFNGLBINDSAMPLERSPROC) (GLuint first, GLsizei count, const GLuint *samplers); -typedef void (APIENTRYP PFNGLBINDIMAGETEXTUREPROC) (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); typedef void (APIENTRYP PFNGLBINDIMAGETEXTURESPROC) (GLuint first, GLsizei count, const GLuint *textures); -typedef void (APIENTRYP PFNGLDISPATCHCOMPUTEPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); -typedef void (APIENTRYP PFNGLMEMORYBARRIERPROC) (GLbitfield barriers); -typedef void (APIENTRYP PFNGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufsize, GLsizei *length, GLenum *binaryFormat, void *binary); -typedef void (APIENTRYP PFNGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params); typedef GLuint64 (APIENTRYP PFNGLGETTEXTUREHANDLEPROC) (GLuint texture); typedef GLuint64 (APIENTRYP PFNGLGETTEXTURESAMPLERHANDLEPROC) (GLuint texture, GLuint sampler); typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLERESIDENTPROC) (GLuint64 handle); @@ -245,9 +268,7 @@ public: virtual int get_driver_shader_version_major(); virtual int get_driver_shader_version_minor(); -#ifndef OPENGLES_1 static void debug_callback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, GLvoid *userParam); -#endif virtual void reset(); @@ -281,7 +302,7 @@ public: bool force); virtual void end_draw_primitives(); -#ifndef OPENGLES +#ifndef OPENGLES_1 void issue_memory_barrier(GLbitfield barrier); #endif @@ -290,7 +311,7 @@ public: virtual void release_texture(TextureContext *tc); virtual bool extract_texture_data(Texture *tex); -#ifndef OPENGLES +#ifndef OPENGLES_1 virtual SamplerContext *prepare_sampler(const SamplerState &sampler); virtual void release_sampler(SamplerContext *sc); #endif @@ -329,7 +350,7 @@ public: virtual PT(TimerQueryContext) issue_timer_query(int pstats_index); -#ifndef OPENGLES +#ifndef OPENGLES_1 virtual void dispatch_compute(int size_x, int size_y, int size_z); #endif @@ -536,7 +557,7 @@ protected: void disable_standard_texture_bindings(); void update_standard_texture_bindings(); #endif -#ifndef OPENGLES +#ifndef OPENGLES_1 void update_shader_vertex_format(const GeomVertexFormat *format); #endif @@ -660,7 +681,7 @@ protected: GLuint _current_ibuffer_index; GLuint _current_fbo; -#ifndef OPENGLES +#ifndef OPENGLES_1 pvector _current_vertex_buffers; bool _use_vertex_attrib_binding; CPT(GeomVertexFormat) _current_vertex_format; @@ -704,7 +725,7 @@ public: PFNGLSECONDARYCOLORPOINTERPROC _glSecondaryColorPointer; #endif -#ifndef OPENGLES +#ifndef OPENGLES_1 PFNGLDRAWRANGEELEMENTSPROC _glDrawRangeElements; #endif @@ -780,8 +801,15 @@ public: #ifndef OPENGLES PFNGLMAPBUFFERPROC _glMapBuffer; PFNGLUNMAPBUFFERPROC _glUnmapBuffer; - PFNGLMAPBUFFERRANGEPROC _glMapBufferRange; +#endif +#ifdef OPENGLES + PFNGLMAPBUFFERRANGEEXTPROC _glMapBufferRange; +#else + PFNGLMAPBUFFERRANGEPROC _glMapBufferRange; +#endif + +#ifndef OPENGLES_1 bool _supports_uniform_buffers; PFNGLBINDBUFFERBASEPROC _glBindBufferBase; @@ -789,8 +817,12 @@ public: PFNGLBUFFERSTORAGEPROC _glBufferStorage; #endif +#ifndef OPENGLES_2 PFNGLBLENDEQUATIONPROC _glBlendEquation; +#endif +#ifndef OPENGLES PFNGLBLENDCOLORPROC _glBlendColor; +#endif bool _supports_vao; GLuint _current_vao_index; @@ -798,7 +830,7 @@ public: PFNGLDELETEVERTEXARRAYSPROC _glDeleteVertexArrays; PFNGLGENVERTEXARRAYSPROC _glGenVertexArrays; -#ifndef OPENGLES +#ifndef OPENGLES_1 PFNGLDRAWARRAYSINDIRECTPROC _glDrawArraysIndirect; PFNGLDRAWELEMENTSINDIRECTPROC _glDrawElementsIndirect; #endif @@ -833,7 +865,7 @@ public: PFNGLGENERATETEXTUREMIPMAPPROC _glGenerateTextureMipmap; #endif -#ifndef OPENGLES +#ifndef OPENGLES_1 bool _supports_empty_framebuffer; PFNGLFRAMEBUFFERPARAMETERIPROC _glFramebufferParameteri; #endif @@ -849,7 +881,7 @@ public: PFNGLBLITFRAMEBUFFEREXTPROC _glBlitFramebuffer; PFNGLDRAWBUFFERSPROC _glDrawBuffers; -#ifndef OPENGLES +#ifndef OPENGLES_1 PFNGLCLEARBUFFERFVPROC _glClearBufferfv; PFNGLCLEARBUFFERIVPROC _glClearBufferiv; PFNGLCLEARBUFFERFIPROC _glClearBufferfi; @@ -920,10 +952,7 @@ public: PFNGLVERTEXATTRIBDIVISORPROC _glVertexAttribDivisor; PFNGLDRAWARRAYSINSTANCEDPROC _glDrawArraysInstanced; PFNGLDRAWELEMENTSINSTANCEDPROC _glDrawElementsInstanced; -#endif // !OPENGLES_1 -#ifndef OPENGLES PFNGLBINDVERTEXBUFFERPROC _glBindVertexBuffer; - PFNGLBINDVERTEXBUFFERSPROC _glBindVertexBuffers; PFNGLVERTEXATTRIBFORMATPROC _glVertexAttribFormat; PFNGLVERTEXATTRIBIFORMATPROC _glVertexAttribIFormat; PFNGLVERTEXATTRIBLFORMATPROC _glVertexAttribLFormat; @@ -940,16 +969,19 @@ public: PFNGLSAMPLERPARAMETERFPROC _glSamplerParameterf; PFNGLSAMPLERPARAMETERFVPROC _glSamplerParameterfv; PFNGLPROGRAMPARAMETERIPROC _glProgramParameteri; - PFNGLPATCHPARAMETERIPROC _glPatchParameteri; - PFNGLBINDTEXTURESPROC _glBindTextures; - PFNGLBINDSAMPLERSPROC _glBindSamplers; - PFNGLBINDIMAGETEXTUREPROC _glBindImageTexture; - PFNGLBINDIMAGETEXTURESPROC _glBindImageTextures; PFNGLDISPATCHCOMPUTEPROC _glDispatchCompute; PFNGLMEMORYBARRIERPROC _glMemoryBarrier; PFNGLGETPROGRAMBINARYPROC _glGetProgramBinary; PFNGLPROGRAMBINARYPROC _glProgramBinary; PFNGLGETINTERNALFORMATIVPROC _glGetInternalformativ; + PFNGLBINDIMAGETEXTUREPROC _glBindImageTexture; +#endif // !OPENGLES_1 +#ifndef OPENGLES + PFNGLBINDVERTEXBUFFERSPROC _glBindVertexBuffers; + PFNGLPATCHPARAMETERIPROC _glPatchParameteri; + PFNGLBINDTEXTURESPROC _glBindTextures; + PFNGLBINDSAMPLERSPROC _glBindSamplers; + PFNGLBINDIMAGETEXTURESPROC _glBindImageTextures; PFNGLVIEWPORTARRAYVPROC _glViewportArrayv; PFNGLSCISSORARRAYVPROC _glScissorArrayv; PFNGLDEPTHRANGEARRAYVPROC _glDepthRangeArrayv; @@ -968,10 +1000,9 @@ public: GLenum _mirror_edge_clamp; GLenum _mirror_border_clamp; -#ifndef OPENGLES bool _supports_texture_lod; bool _supports_texture_lod_bias; -#endif + bool _supports_texture_max_level; #ifndef OPENGLES_1 GLsizei _instance_count; @@ -982,7 +1013,7 @@ public: DeletedNames _deleted_display_lists; DeletedNames _deleted_queries; -#ifndef OPENGLES +#ifndef OPENGLES_1 // Stores textures for which memory bariers should be issued. typedef pset TextureSet; TextureSet _textures_needing_fetch_barrier; diff --git a/panda/src/glstuff/glSamplerContext_src.cxx b/panda/src/glstuff/glSamplerContext_src.cxx index fa5f4984ae..486ebb0cc5 100644 --- a/panda/src/glstuff/glSamplerContext_src.cxx +++ b/panda/src/glstuff/glSamplerContext_src.cxx @@ -13,7 +13,7 @@ #include "pnotify.h" -#ifndef OPENGLES +#ifndef OPENGLES_1 TypeHandle CLP(SamplerContext)::_type_handle; @@ -68,4 +68,4 @@ reset_data() { // the sampler later. glGenSamplers(1, &_index); } -#endif // OPENGLES +#endif // OPENGLES_1 diff --git a/panda/src/glstuff/glSamplerContext_src.h b/panda/src/glstuff/glSamplerContext_src.h index 369ab49ab6..2a07bdd4a1 100644 --- a/panda/src/glstuff/glSamplerContext_src.h +++ b/panda/src/glstuff/glSamplerContext_src.h @@ -11,7 +11,7 @@ * @date 2014-12-11 */ -#ifndef OPENGLES +#ifndef OPENGLES_1 #include "pandabase.h" #include "samplerContext.h" @@ -56,4 +56,4 @@ private: static TypeHandle _type_handle; }; -#endif // OPENGLES +#endif // OPENGLES_1 diff --git a/panda/src/glstuff/glShaderContext_src.cxx b/panda/src/glstuff/glShaderContext_src.cxx index c2f7edaa48..e68ea6429c 100644 --- a/panda/src/glstuff/glShaderContext_src.cxx +++ b/panda/src/glstuff/glShaderContext_src.cxx @@ -300,7 +300,6 @@ CLP(ShaderContext)(CLP(GraphicsStateGuardian) *glgsg, Shader *s) : ShaderContext name_buflen = max(64, name_buflen); name_buffer = (char *)alloca(name_buflen); -#ifndef OPENGLES // Get the used uniform blocks. if (_glgsg->_supports_uniform_buffers) { GLint block_count = 0, block_maxlength = 0; @@ -324,7 +323,6 @@ CLP(ShaderContext)(CLP(GraphicsStateGuardian) *glgsg, Shader *s) : ShaderContext reflect_uniform_block(i, block_name_cstr, name_buffer, name_buflen); } } -#endif // !OPENGLES // Bind the program, so that we can call glUniform1i for the textures. _glgsg->_glUseProgram(_glsl_program); @@ -402,11 +400,9 @@ reflect_attribute(int i, char *name_buffer, GLsizei name_buflen) { param_type == GL_INT_VEC2 || param_type == GL_INT_VEC3 || param_type == GL_INT_VEC4 || -#ifndef OPENGLES param_type == GL_UNSIGNED_INT_VEC2 || param_type == GL_UNSIGNED_INT_VEC3 || param_type == GL_UNSIGNED_INT_VEC4 || -#endif param_type == GL_UNSIGNED_INT); // Check if it has a p3d_ prefix - if so, assign special meaning. @@ -505,7 +501,6 @@ reflect_attribute(int i, char *name_buffer, GLsizei name_buflen) { _shader->_var_spec.push_back(bind); } -#ifndef OPENGLES /** * Analyzes the uniform block and stores its format. */ @@ -583,6 +578,7 @@ reflect_uniform_block(int i, const char *name, char *name_buffer, GLsizei name_b numeric_type = GeomEnums::NT_float32; break; +#ifndef OPENGLES case GL_DOUBLE: case GL_DOUBLE_VEC2: case GL_DOUBLE_VEC3: @@ -592,6 +588,7 @@ reflect_uniform_block(int i, const char *name, char *name_buffer, GLsizei name_b case GL_DOUBLE_MAT4: numeric_type = GeomEnums::NT_float64; break; +#endif default: GLCAT.info() << "Ignoring uniform '" << name_buffer @@ -604,7 +601,9 @@ reflect_uniform_block(int i, const char *name, char *name_buffer, GLsizei name_b case GL_BOOL_VEC2: case GL_UNSIGNED_INT_VEC2: case GL_FLOAT_VEC2: +#ifndef OPENGLES case GL_DOUBLE_VEC2: +#endif num_components = 2; break; @@ -612,7 +611,9 @@ reflect_uniform_block(int i, const char *name, char *name_buffer, GLsizei name_b case GL_BOOL_VEC3: case GL_UNSIGNED_INT_VEC3: case GL_FLOAT_VEC3: +#ifndef OPENGLES case GL_DOUBLE_VEC3: +#endif num_components = 3; break; @@ -620,12 +621,16 @@ reflect_uniform_block(int i, const char *name, char *name_buffer, GLsizei name_b case GL_BOOL_VEC4: case GL_UNSIGNED_INT_VEC4: case GL_FLOAT_VEC4: +#ifndef OPENGLES case GL_DOUBLE_VEC4: +#endif num_components = 4; break; case GL_FLOAT_MAT3: +#ifndef OPENGLES case GL_DOUBLE_MAT3: +#endif num_components = 3; contents = GeomEnums::C_matrix; nassertd(param_size <= 1 || astrides[ui] == mstrides[ui] * 3) continue; @@ -633,7 +638,9 @@ reflect_uniform_block(int i, const char *name, char *name_buffer, GLsizei name_b break; case GL_FLOAT_MAT4: +#ifndef OPENGLES case GL_DOUBLE_MAT4: +#endif num_components = 4; contents = GeomEnums::C_matrix; nassertd(param_size <= 1 || astrides[ui] == mstrides[ui] * 4) continue; @@ -655,7 +662,6 @@ reflect_uniform_block(int i, const char *name, char *name_buffer, GLsizei name_b // _uniform_blocks.push_back(block); } -#endif // !OPENGLES /** * Analyzes a single uniform variable and considers how it should be handled @@ -1099,9 +1105,7 @@ reflect_uniform(int i, char *name_buffer, GLsizei name_buflen) { string member_name(name_buffer); if (member_name == "shadowMap") { switch (param_type) { -#ifndef OPENGLES case GL_SAMPLER_CUBE_SHADOW: -#endif // !OPENGLES case GL_SAMPLER_2D: case GL_SAMPLER_2D_SHADOW: case GL_SAMPLER_CUBE: @@ -1279,26 +1283,26 @@ reflect_uniform(int i, char *name_buffer, GLsizei name_buflen) { if (param_size == 1) { // A single uniform (not an array, or an array of size 1). switch (param_type) { -#ifndef OPENGLES - case GL_INT_SAMPLER_1D: case GL_INT_SAMPLER_2D: case GL_INT_SAMPLER_3D: case GL_INT_SAMPLER_2D_ARRAY: case GL_INT_SAMPLER_CUBE: - case GL_INT_SAMPLER_BUFFER: - case GL_INT_SAMPLER_CUBE_MAP_ARRAY: - case GL_UNSIGNED_INT_SAMPLER_1D: case GL_UNSIGNED_INT_SAMPLER_2D: case GL_UNSIGNED_INT_SAMPLER_3D: case GL_UNSIGNED_INT_SAMPLER_CUBE: case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY: - case GL_UNSIGNED_INT_SAMPLER_BUFFER: - case GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY: - case GL_SAMPLER_1D_SHADOW: - case GL_SAMPLER_1D: case GL_SAMPLER_CUBE_SHADOW: case GL_SAMPLER_2D_ARRAY: case GL_SAMPLER_2D_ARRAY_SHADOW: +#ifndef OPENGLES + case GL_INT_SAMPLER_1D: + case GL_INT_SAMPLER_BUFFER: + case GL_INT_SAMPLER_CUBE_MAP_ARRAY: + case GL_UNSIGNED_INT_SAMPLER_1D: + case GL_UNSIGNED_INT_SAMPLER_BUFFER: + case GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY: + case GL_SAMPLER_1D: + case GL_SAMPLER_1D_SHADOW: case GL_SAMPLER_BUFFER: case GL_SAMPLER_CUBE_MAP_ARRAY: case GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW: @@ -1320,14 +1324,12 @@ reflect_uniform(int i, char *name_buffer, GLsizei name_buflen) { return; } case GL_FLOAT_MAT2: -#ifndef OPENGLES case GL_FLOAT_MAT2x3: case GL_FLOAT_MAT2x4: case GL_FLOAT_MAT3x2: case GL_FLOAT_MAT3x4: case GL_FLOAT_MAT4x2: case GL_FLOAT_MAT4x3: -#endif GLCAT.warning() << "GLSL shader requested an unsupported matrix type\n"; return; case GL_FLOAT_MAT3: { @@ -1461,28 +1463,29 @@ reflect_uniform(int i, char *name_buffer, GLsizei name_buflen) { _shader->_ptr_spec.push_back(bind); return; } -#ifndef OPENGLES - case GL_IMAGE_1D: case GL_IMAGE_2D: case GL_IMAGE_3D: case GL_IMAGE_CUBE: case GL_IMAGE_2D_ARRAY: - case GL_IMAGE_CUBE_MAP_ARRAY: - case GL_IMAGE_BUFFER: - case GL_INT_IMAGE_1D: case GL_INT_IMAGE_2D: case GL_INT_IMAGE_3D: case GL_INT_IMAGE_CUBE: case GL_INT_IMAGE_2D_ARRAY: - case GL_INT_IMAGE_CUBE_MAP_ARRAY: - case GL_INT_IMAGE_BUFFER: - case GL_UNSIGNED_INT_IMAGE_1D: case GL_UNSIGNED_INT_IMAGE_2D: case GL_UNSIGNED_INT_IMAGE_3D: case GL_UNSIGNED_INT_IMAGE_CUBE: case GL_UNSIGNED_INT_IMAGE_2D_ARRAY: +#ifndef OPENGLES + case GL_IMAGE_1D: + case GL_IMAGE_CUBE_MAP_ARRAY: + case GL_IMAGE_BUFFER: + case GL_INT_IMAGE_1D: + case GL_INT_IMAGE_CUBE_MAP_ARRAY: + case GL_INT_IMAGE_BUFFER: + case GL_UNSIGNED_INT_IMAGE_1D: case GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY: case GL_UNSIGNED_INT_IMAGE_BUFFER: +#endif // This won't really change at runtime, so we might as well bind once // and then forget about it. _glgsg->_glUniform1i(p, _glsl_img_inputs.size()); @@ -1494,7 +1497,6 @@ reflect_uniform(int i, char *name_buffer, GLsizei name_buflen) { _glsl_img_inputs.push_back(input); } return; -#endif default: GLCAT.warning() << "Ignoring unrecognized GLSL parameter type!\n"; } @@ -1502,14 +1504,12 @@ reflect_uniform(int i, char *name_buffer, GLsizei name_buflen) { // A uniform array. switch (param_type) { case GL_FLOAT_MAT2: -#ifndef OPENGLES case GL_FLOAT_MAT2x3: case GL_FLOAT_MAT2x4: case GL_FLOAT_MAT3x2: case GL_FLOAT_MAT3x4: case GL_FLOAT_MAT4x2: case GL_FLOAT_MAT4x3: -#endif GLCAT.warning() << "GLSL shader requested an unrecognized matrix array type\n"; return; case GL_BOOL: @@ -1597,10 +1597,10 @@ get_sampler_texture_type(int &out, GLenum param_type) { case GL_SAMPLER_1D: out = Texture::TT_1d_texture; return true; +#endif case GL_INT_SAMPLER_2D: case GL_UNSIGNED_INT_SAMPLER_2D: -#endif case GL_SAMPLER_2D: out = Texture::TT_2d_texture; return true; @@ -1614,10 +1614,8 @@ get_sampler_texture_type(int &out, GLenum param_type) { } return true; -#ifndef OPENGLES case GL_INT_SAMPLER_3D: case GL_UNSIGNED_INT_SAMPLER_3D: -#endif case GL_SAMPLER_3D: out = Texture::TT_3d_texture; if (_glgsg->_supports_3d_texture) { @@ -1628,7 +1626,6 @@ get_sampler_texture_type(int &out, GLenum param_type) { return false; } -#ifndef OPENGLES case GL_SAMPLER_CUBE_SHADOW: if (!_glgsg->_supports_shadow_filter) { GLCAT.error() @@ -1638,7 +1635,6 @@ get_sampler_texture_type(int &out, GLenum param_type) { // Fall through case GL_INT_SAMPLER_CUBE: case GL_UNSIGNED_INT_SAMPLER_CUBE: -#endif case GL_SAMPLER_CUBE: out = Texture::TT_cube_map; if (!_glgsg->_supports_cube_map) { @@ -1648,7 +1644,6 @@ get_sampler_texture_type(int &out, GLenum param_type) { } return true; -#ifndef OPENGLES case GL_SAMPLER_2D_ARRAY_SHADOW: if (!_glgsg->_supports_shadow_filter) { GLCAT.error() @@ -1668,6 +1663,7 @@ get_sampler_texture_type(int &out, GLenum param_type) { return false; } +#ifndef OPENGLES case GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW: if (!_glgsg->_supports_shadow_filter) { GLCAT.error() @@ -1699,7 +1695,7 @@ get_sampler_texture_type(int &out, GLenum param_type) { << "GLSL shader uses buffer texture, which is unsupported by the driver.\n"; return false; } -#endif +#endif // !OPENGLES default: GLCAT.error() @@ -2129,7 +2125,6 @@ update_shader_vertex_arrays(ShaderContext *prev, bool force) { const GeomVertexArrayDataHandle *array_reader; -#ifndef OPENGLES if (_glgsg->_use_vertex_attrib_binding) { // Use experimental new separated formatbinding state. const GeomVertexDataPipelineReader *data_reader = _glgsg->_data_reader; @@ -2185,9 +2180,7 @@ update_shader_vertex_arrays(ShaderContext *prev, bool force) { } _glgsg->_enabled_vertex_attrib_arrays = enabled_attribs; - } else -#endif - { + } else { Geom::NumericType numeric_type; int start, stride, num_values; size_t nvarying = _shader->_var_spec.size(); @@ -2230,13 +2223,10 @@ update_shader_vertex_arrays(ShaderContext *prev, bool force) { for (int i = 0; i < num_elements; ++i) { _glgsg->enable_vertex_attrib_array(p); -#ifndef OPENGLES if (bind._integer) { _glgsg->_glVertexAttribIPointer(p, num_values, _glgsg->get_numeric_type(numeric_type), stride, client_pointer); - } else -#endif - if (numeric_type == GeomEnums::NT_packed_dabc) { + } else if (numeric_type == GeomEnums::NT_packed_dabc) { // GL_BGRA is a special accepted value available since OpenGL 3.2. // It requires us to pass GL_TRUE for normalized. _glgsg->_glVertexAttribPointer(p, GL_BGRA, GL_UNSIGNED_BYTE, @@ -2340,9 +2330,7 @@ disable_shader_texture_bindings() { break; case Texture::TT_2d_texture_array: -#ifndef OPENGLES - glBindTexture(GL_TEXTURE_2D_ARRAY_EXT, 0); -#endif + glBindTexture(GL_TEXTURE_2D_ARRAY, 0); break; case Texture::TT_cube_map: @@ -2357,15 +2345,16 @@ disable_shader_texture_bindings() { } } -#ifndef OPENGLES // Now unbind all the image units. Not sure if we *have* to do this. int num_image_units = min(_glsl_img_inputs.size(), (size_t)_glgsg->_max_image_units); if (num_image_units > 0) { +#ifndef OPENGLES if (_glgsg->_supports_multi_bind) { _glgsg->_glBindImageTextures(0, num_image_units, NULL); - - } else { + } else +#endif + { for (int i = 0; i < num_image_units; ++i) { _glgsg->_glBindImageTexture(i, 0, 0, GL_FALSE, 0, GL_READ_ONLY, GL_R8); } @@ -2382,7 +2371,6 @@ disable_shader_texture_bindings() { } } } -#endif _glgsg->report_my_gl_errors(); } @@ -2402,7 +2390,6 @@ update_shader_texture_bindings(ShaderContext *prev) { return; } -#ifndef OPENGLES GLbitfield barriers = 0; // First bind all the 'image units'; a bit of an esoteric OpenGL feature @@ -2500,7 +2487,6 @@ update_shader_texture_bindings(ShaderContext *prev) { } } } -#endif size_t num_textures = _shader->_tex_spec.size(); GLuint *textures; @@ -2781,12 +2767,12 @@ glsl_compile_shader(Shader::ShaderType type) { handle = _glgsg->_glCreateShader(GL_TESS_EVALUATION_SHADER); } break; +#endif case Shader::ST_compute: if (_glgsg->get_supports_compute_shaders()) { handle = _glgsg->_glCreateShader(GL_COMPUTE_SHADER); } break; -#endif default: break; } @@ -2844,7 +2830,6 @@ glsl_compile_and_link() { _glgsg->_glObjectLabel(GL_PROGRAM, _glsl_program, name.size(), name.data()); } -#ifndef OPENGLES // Do we have a compiled program? Try to load that. unsigned int format; string binary; @@ -2868,7 +2853,6 @@ glsl_compile_and_link() { << _shader->get_filename() << "\n"; } } -#endif bool valid = true; @@ -2933,7 +2917,6 @@ glsl_compile_and_link() { // If we requested to retrieve the shader, we should indicate that before // linking. -#ifndef OPENGLES bool retrieve_binary = false; if (_glgsg->_supports_get_program_binary) { retrieve_binary = _shader->get_cache_compiled_shader(); @@ -2946,7 +2929,6 @@ glsl_compile_and_link() { _glgsg->_glProgramParameteri(_glsl_program, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, GL_TRUE); } -#endif if (GLCAT.is_debug()) { GLCAT.debug() @@ -2967,7 +2949,6 @@ glsl_compile_and_link() { // Report any warnings. glsl_report_program_errors(_glsl_program, false); -#ifndef OPENGLES if (retrieve_binary) { GLint length = 0; _glgsg->_glGetProgramiv(_glsl_program, GL_PROGRAM_BINARY_LENGTH, &length); @@ -2998,7 +2979,6 @@ glsl_compile_and_link() { } #endif // NDEBUG } -#endif // OPENGLES _glgsg->report_my_gl_errors(); return true; diff --git a/panda/src/glstuff/glShaderContext_src.h b/panda/src/glstuff/glShaderContext_src.h index 4209ec66fb..13f90fcecc 100644 --- a/panda/src/glstuff/glShaderContext_src.h +++ b/panda/src/glstuff/glShaderContext_src.h @@ -35,10 +35,8 @@ public: ALLOC_DELETED_CHAIN(CLP(ShaderContext)); void reflect_attribute(int i, char *name_buf, GLsizei name_buflen); -#ifndef OPENGLES void reflect_uniform_block(int i, const char *block_name, char *name_buffer, GLsizei name_buflen); -#endif void reflect_uniform(int i, char *name_buffer, GLsizei name_buflen); bool get_sampler_texture_type(int &out, GLenum param_type); diff --git a/panda/src/glstuff/glTextureContext_src.cxx b/panda/src/glstuff/glTextureContext_src.cxx index 8639b898a2..a5b97dd2f7 100644 --- a/panda/src/glstuff/glTextureContext_src.cxx +++ b/panda/src/glstuff/glTextureContext_src.cxx @@ -82,7 +82,7 @@ reset_data() { _has_storage = false; _immutable = false; -#ifndef OPENGLES +#ifndef OPENGLES_1 // Mark the texture as coherent. if (gl_enable_memory_barriers) { _glgsg->_textures_needing_fetch_barrier.erase(this); @@ -131,7 +131,7 @@ get_handle() { #endif } -#ifndef OPENGLES +#ifndef OPENGLES_1 /** * */ @@ -176,4 +176,4 @@ mark_incoherent(bool wrote) { _glgsg->_textures_needing_framebuffer_barrier.insert(this); } -#endif // OPENGLES +#endif // !OPENGLES_1 diff --git a/panda/src/glstuff/glTextureContext_src.h b/panda/src/glstuff/glTextureContext_src.h index 8a36882f26..123f2d207d 100644 --- a/panda/src/glstuff/glTextureContext_src.h +++ b/panda/src/glstuff/glTextureContext_src.h @@ -36,7 +36,7 @@ public: void make_handle_resident(); GLuint64 get_handle(); -#ifdef OPENGLES +#ifdef OPENGLES_1 static CONSTEXPR bool needs_barrier(GLbitfield barrier) { return false; }; #else bool needs_barrier(GLbitfield barrier);