/** * PANDA 3D SOFTWARE * Copyright (c) Carnegie Mellon University. All rights reserved. * * All use of this software is subject to the terms of the revised BSD * license. You should have received a copy of this license along * with this source code in a file named "LICENSE." * * @file glGraphicsStateGuardian_src.h * @author drose * @date 1999-02-02 * @author fperazzi, PandaSE * @date 2010-05-05 * get_supports_cg_profile) */ #include "pandabase.h" #include "graphicsStateGuardian.h" #include "geomVertexColumn.h" #include "texture.h" #include "displayRegion.h" #include "material.h" #include "colorWriteAttrib.h" #include "depthTestAttrib.h" #include "textureAttrib.h" #include "texMatrixAttrib.h" #include "texGenAttrib.h" #include "shaderAttrib.h" #include "textureStage.h" #include "antialiasAttrib.h" #include "renderModeAttrib.h" #include "colorBlendAttrib.h" #include "pointerToArray.h" #include "fog.h" #include "graphicsWindow.h" #include "pset.h" #include "pmap.h" #include "geomVertexArrayData.h" #include "lightMutex.h" #include "pStatGPUTimer.h" class PlaneNode; class Light; #ifdef OPENGLES // This is a cheesy hack to allow the following typedefs to compile for OpenGL // ES. We won't actually be calling any of the "double" functions in this // case (and they don't exist anyway), but we need to be able to get past // their declarations. typedef double GLdouble; #endif // OPENGLES // These typedefs are declared in glext.h, but we must repeat them here, // mainly because they will not be included from glext.h if the system GL // version matches or exceeds the GL version in which these functions are // defined, and the system gl.h sometimes doesn't declare these typedefs. #if !defined( __EDG__ ) || defined( __INTEL_COMPILER ) // Protect the following from the Tau instrumentor and expose it for the intel compiler. typedef const GLubyte * (APIENTRYP PFNGLGETSTRINGIPROC) (GLenum name, GLuint index); typedef void (APIENTRY *GLDEBUGPROC_P)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const GLvoid *userParam); typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKPROC_P) (GLDEBUGPROC_P callback, const void *userParam); typedef void (APIENTRYP PFNGLDEBUGMESSAGECONTROLPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); typedef void (APIENTRYP PFNGLOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, GLvoid *img); typedef void (APIENTRYP PFNGLGENQUERIESPROC) (GLsizei n, GLuint *ids); typedef void (APIENTRYP PFNGLBEGINQUERYPROC) (GLenum target, GLuint id); typedef void (APIENTRYP PFNGLENDQUERYPROC) (GLenum target); typedef void (APIENTRYP PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint *ids); typedef void (APIENTRYP PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint *params); typedef void (APIENTRYP PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params); typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); // There is some trivial disagreement between different gl.h headers about // this one, so we use our own typename. typedef void (APIENTRYP PFNGLTEXIMAGE3DPROC_P) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture); typedef void (APIENTRYP PFNGLMULTITEXCOORD1FPROC) (GLenum target, const GLfloat s); typedef void (APIENTRYP PFNGLMULTITEXCOORD2FPROC) (GLenum target, const GLfloat s, const GLfloat t); typedef void (APIENTRYP PFNGLMULTITEXCOORD3FPROC) (GLenum target, const GLfloat s, const GLfloat t, const GLfloat r); typedef void (APIENTRYP PFNGLMULTITEXCOORD4FPROC) (GLenum target, const GLfloat s, const GLfloat t, const GLfloat r, const GLfloat q); typedef void (APIENTRYP PFNGLMULTITEXCOORD1DPROC) (GLenum target, const GLdouble s); typedef void (APIENTRYP PFNGLMULTITEXCOORD2DPROC) (GLenum target, const GLdouble s, const GLdouble t); typedef void (APIENTRYP PFNGLMULTITEXCOORD3DPROC) (GLenum target, const GLdouble s, const GLdouble t, const GLdouble r); typedef void (APIENTRYP PFNGLMULTITEXCOORD4DPROC) (GLenum target, const GLdouble s, const GLdouble t, const GLdouble r, const GLdouble q); typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode); typedef void (APIENTRYP PFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture); typedef void (APIENTRYP PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program); typedef void (APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers); typedef void (APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); typedef void (APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data); typedef void (APIENTRYP PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum *bufs); typedef void (APIENTRYP PFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawbuffer, const GLfloat *value); typedef void (APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage); typedef void (APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers); typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); typedef void (APIENTRYP PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face); typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); typedef void (APIENTRYP PFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); typedef void (APIENTRYP PFNGLVERTEXBLENDARBPROC) (GLint count); typedef void (APIENTRYP PFNGLWEIGHTFVARBPROC) (GLint size, const GLfloat *weights); typedef void (APIENTRYP PFNGLWEIGHTDVARBPROC) (GLint size, const GLdouble *weights); typedef GLboolean (APIENTRYP PFNGLISRENDERBUFFEREXTPROC) (GLuint renderbuffer); typedef void (APIENTRYP PFNGLBINDRENDERBUFFEREXTPROC) (GLenum target, GLuint renderbuffer); typedef void (APIENTRYP PFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuint *renderbuffers); typedef void (APIENTRYP PFNGLGENRENDERBUFFERSEXTPROC) (GLsizei n, GLuint *renderbuffers); typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); typedef void (APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); typedef GLboolean (APIENTRYP PFNGLISFRAMEBUFFEREXTPROC) (GLuint framebuffer); typedef void (APIENTRYP PFNGLBINDFRAMEBUFFEREXTPROC) (GLenum target, GLuint framebuffer); typedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSEXTPROC) (GLsizei n, const GLuint *framebuffers); typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint *framebuffers); typedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) (GLenum target); typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); #ifdef OPENGLES_2 typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DOES) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); #else typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); #endif typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); typedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); typedef void (APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGENERATEMIPMAPEXTPROC) (GLenum target); typedef void (APIENTRYP PFNGLBLITFRAMEBUFFEREXTPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); typedef void (APIENTRYP PFNGLTEXSTORAGE1DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); typedef void (APIENTRYP PFNGLTEXSTORAGE2DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); typedef void (APIENTRYP PFNGLTEXSTORAGE3DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); typedef void (APIENTRYP PFNGLBINDVERTEXARRAYPROC) (GLuint array); typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint *arrays); typedef void (APIENTRYP PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays); typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha); typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); #ifndef OPENGLES_1 // GLSL shader functions typedef void (APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name); typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONPROC) (GLuint program, GLuint color, const GLchar *name); typedef void (APIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader); typedef GLuint (APIENTRYP PFNGLCREATEPROGRAMPROC) (void); typedef GLuint (APIENTRYP PFNGLCREATESHADERPROC) (GLenum type); typedef void (APIENTRYP PFNGLDELETEPROGRAMPROC) (GLuint program); typedef void (APIENTRYP PFNGLDELETESHADERPROC) (GLuint shader); typedef void (APIENTRYP PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index); typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index); typedef void (APIENTRYP PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name); typedef void (APIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); typedef void (APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params); typedef void (APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name); typedef void (APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program); typedef void (APIENTRYP PFNGLSHADERSOURCEPROC_P) (GLuint shader, GLsizei count, const GLchar* const *string, const GLint *length); typedef void (APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program); typedef void (APIENTRYP PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); typedef void (APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0); typedef void (APIENTRYP PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value); typedef void (APIENTRYP PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value); typedef void (APIENTRYP PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value); typedef void (APIENTRYP PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value); typedef void (APIENTRYP PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value); typedef void (APIENTRYP PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value); typedef void (APIENTRYP PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value); typedef void (APIENTRYP PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value); typedef void (APIENTRYP PFNGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint *value); typedef void (APIENTRYP PFNGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint *value); typedef void (APIENTRYP PFNGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint *value); typedef void (APIENTRYP PFNGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint *value); typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program); typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v); typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble *v); typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); typedef void (APIENTRYP PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); typedef void (APIENTRYP PFNGLVERTEXATTRIBLPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); 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); 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); typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pname, GLint param); 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 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 PFNGLBINDIMAGETEXTURESPROC) (GLuint first, GLsizei count, const GLuint *textures); typedef GLuint64 (APIENTRYP PFNGLGETTEXTUREHANDLEPROC) (GLuint texture); typedef GLuint64 (APIENTRYP PFNGLGETTEXTURESAMPLERHANDLEPROC) (GLuint texture, GLuint sampler); typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLERESIDENTPROC) (GLuint64 handle); typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLENONRESIDENTPROC) (GLuint64 handle); typedef GLuint64 (APIENTRYP PFNGLGETIMAGEHANDLEPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); typedef void (APIENTRYP PFNGLMAKEIMAGEHANDLERESIDENTPROC) (GLuint64 handle, GLenum access); typedef void (APIENTRYP PFNGLMAKEIMAGEHANDLENONRESIDENTPROC) (GLuint64 handle); typedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64PROC) (GLint location, GLuint64 value); typedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64VPROC) (GLint location, GLsizei count, const GLuint64 *value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64PROC) (GLuint program, GLint location, GLuint64 value); typedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64VPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *values); typedef GLboolean (APIENTRYP PFNGLISTEXTUREHANDLERESIDENTPROC) (GLuint64 handle); typedef GLboolean (APIENTRYP PFNGLISIMAGEHANDLERESIDENTPROC) (GLuint64 handle); typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64PROC) (GLuint index, GLuint64EXT x); typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64VPROC) (GLuint index, const GLuint64EXT *v); typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLUI64VPROC) (GLuint index, GLenum pname, GLuint64EXT *params); typedef void *(APIENTRYP PFNGLMAPBUFFERPROC) (GLenum target, GLenum access); typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERPROC) (GLenum target); typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, void *data); #endif // OPENGLES #endif // __EDG__ /** * A GraphicsStateGuardian specialized for rendering into OpenGL contexts. * There should be no GL calls outside of this object. */ class EXPCL_GL CLP(GraphicsStateGuardian) : public GraphicsStateGuardian { public: CLP(GraphicsStateGuardian)(GraphicsEngine *engine, GraphicsPipe *pipe); virtual ~CLP(GraphicsStateGuardian)(); // #--- Zhao Nov2011 virtual std::string get_driver_vendor(); virtual std::string get_driver_renderer(); virtual std::string get_driver_version(); virtual int get_driver_version_major(); virtual int get_driver_version_minor(); virtual int get_driver_shader_version_major(); virtual int get_driver_shader_version_minor(); static void APIENTRY debug_callback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, GLvoid *userParam); INLINE virtual void push_group_marker(const std::string &marker) final; INLINE virtual void pop_group_marker() final; virtual void reset(); virtual void prepare_display_region(DisplayRegionPipelineReader *dr); virtual void clear_before_callback(); virtual CPT(TransformState) calc_projection_mat(const Lens *lens); virtual bool prepare_lens(); virtual bool begin_frame(Thread *current_thread); virtual bool begin_scene(); virtual void end_scene(); virtual void end_frame(Thread *current_thread); virtual bool begin_draw_primitives(const GeomPipelineReader *geom_reader, const GeomVertexDataPipelineReader *data_reader, bool force); virtual bool draw_triangles(const GeomPrimitivePipelineReader *reader, bool force); #ifndef OPENGLES virtual bool draw_triangles_adj(const GeomPrimitivePipelineReader *reader, bool force); #endif virtual bool draw_tristrips(const GeomPrimitivePipelineReader *reader, bool force); #ifndef OPENGLES virtual bool draw_tristrips_adj(const GeomPrimitivePipelineReader *reader, bool force); #endif virtual bool draw_trifans(const GeomPrimitivePipelineReader *reader, bool force); virtual bool draw_patches(const GeomPrimitivePipelineReader *reader, bool force); virtual bool draw_lines(const GeomPrimitivePipelineReader *reader, bool force); #ifndef OPENGLES virtual bool draw_lines_adj(const GeomPrimitivePipelineReader *reader, bool force); #endif virtual bool draw_linestrips(const GeomPrimitivePipelineReader *reader, bool force); #ifndef OPENGLES virtual bool draw_linestrips_adj(const GeomPrimitivePipelineReader *reader, bool force); #endif virtual bool draw_points(const GeomPrimitivePipelineReader *reader, bool force); virtual void end_draw_primitives(); #ifndef OPENGLES_1 void issue_memory_barrier(GLbitfield barrier); #endif virtual TextureContext *prepare_texture(Texture *tex, int view); virtual bool update_texture(TextureContext *tc, bool force); virtual void release_texture(TextureContext *tc); virtual bool extract_texture_data(Texture *tex); #ifndef OPENGLES_1 virtual SamplerContext *prepare_sampler(const SamplerState &sampler); virtual void release_sampler(SamplerContext *sc); #endif virtual GeomContext *prepare_geom(Geom *geom); virtual void release_geom(GeomContext *gc); virtual ShaderContext *prepare_shader(Shader *shader); virtual void release_shader(ShaderContext *sc); void record_deleted_display_list(GLuint index); virtual VertexBufferContext *prepare_vertex_buffer(GeomVertexArrayData *data); bool update_vertex_buffer(CLP(VertexBufferContext) *gvbc, const GeomVertexArrayDataHandle *reader, bool force); virtual void release_vertex_buffer(VertexBufferContext *vbc); bool setup_array_data(const unsigned char *&client_pointer, const GeomVertexArrayDataHandle *data, bool force); virtual IndexBufferContext *prepare_index_buffer(GeomPrimitive *data); bool apply_index_buffer(IndexBufferContext *ibc, const GeomPrimitivePipelineReader *reader, bool force); virtual void release_index_buffer(IndexBufferContext *ibc); bool setup_primitive(const unsigned char *&client_pointer, const GeomPrimitivePipelineReader *reader, bool force); #ifndef OPENGLES virtual BufferContext *prepare_shader_buffer(ShaderBuffer *data); void apply_shader_buffer(GLuint base, ShaderBuffer *buffer); virtual void release_shader_buffer(BufferContext *bc); #endif #ifndef OPENGLES virtual void begin_occlusion_query(); virtual PT(OcclusionQueryContext) end_occlusion_query(); #endif virtual PT(TimerQueryContext) issue_timer_query(int pstats_index); #ifndef OPENGLES_1 virtual void dispatch_compute(int size_x, int size_y, int size_z); #endif virtual PT(GeomMunger) make_geom_munger(const RenderState *state, Thread *current_thread); virtual void clear(DrawableRegion *region); virtual bool framebuffer_copy_to_texture (Texture *tex, int view, int z, const DisplayRegion *dr, const RenderBuffer &rb); virtual bool framebuffer_copy_to_ram (Texture *tex, int view, int z, const DisplayRegion *dr, const RenderBuffer &rb); #ifdef SUPPORT_FIXED_FUNCTION void apply_fog(Fog *fog); virtual void bind_light(PointLight *light_obj, const NodePath &light, int light_id); virtual void bind_light(DirectionalLight *light_obj, const NodePath &light, int light_id); virtual void bind_light(Spotlight *light_obj, const NodePath &light, int light_id); #endif virtual GraphicsOutput *make_shadow_buffer(LightLensNode *light, Texture *tex, GraphicsOutput *host); LVecBase4 get_light_color(Light *light) const; #ifdef SUPPORT_IMMEDIATE_MODE void draw_immediate_simple_primitives(const GeomPrimitivePipelineReader *reader, GLenum mode); void draw_immediate_composite_primitives(const GeomPrimitivePipelineReader *reader, GLenum mode); #endif // SUPPORT_IMMEDIATE_MODE INLINE bool report_errors(int line, const char *source_file); INLINE void report_my_errors(int line, const char *source_file); INLINE bool clear_errors(int line, const char *source_file); INLINE void clear_my_errors(int line, const char *source_file); INLINE const std::string &get_gl_vendor() const; INLINE const std::string &get_gl_renderer() const; INLINE const std::string &get_gl_version() const; INLINE int get_gl_version_major() const; INLINE int get_gl_version_minor() const; INLINE bool has_fixed_function_pipeline() const; virtual void set_state_and_transform(const RenderState *state, const TransformState *transform); void bind_fbo(GLuint fbo); virtual bool get_supports_cg_profile(const std::string &name) const; void finish(); protected: void do_issue_transform(); void do_issue_render_mode(); void do_issue_antialias(); void do_issue_rescale_normal(); void do_issue_color_write(); void do_issue_depth_test(); #ifdef SUPPORT_FIXED_FUNCTION void do_issue_alpha_test(); #endif void do_issue_depth_write(); void do_issue_cull_face(); #ifdef SUPPORT_FIXED_FUNCTION void do_issue_fog(); #endif void do_issue_depth_offset(); void do_issue_shade_model(); #ifndef OPENGLES_1 void do_issue_shader(); #endif #ifdef SUPPORT_FIXED_FUNCTION void do_issue_material(); #endif void do_issue_texture(); #if !defined(OPENGLES) || defined(OPENGLES_1) void do_issue_logic_op(); #endif void do_issue_blending(); #ifdef SUPPORT_FIXED_FUNCTION void do_issue_tex_gen(); void do_issue_tex_matrix(); #endif void do_issue_stencil(); void do_issue_scissor(); virtual void gl_flush() const; INLINE void maybe_gl_finish() const; virtual GLenum gl_get_error() const; static bool report_errors_loop(int line, const char *source_file, GLenum error_code, int &error_count); static std::string get_error_string(GLenum error_code); std::string show_gl_string(const std::string &name, GLenum id); virtual void query_gl_version(); void query_glsl_version(); void save_extensions(const char *extensions); virtual void get_extra_extensions(); void report_extensions() const; INLINE virtual bool has_extension(const std::string &extension) const; INLINE bool is_at_least_gl_version(int major_version, int minor_version) const; INLINE bool is_at_least_gles_version(int major_version, int minor_version) const; void *get_extension_func(const char *name); virtual void *do_get_extension_func(const char *name); virtual void reissue_transforms(); #ifdef SUPPORT_FIXED_FUNCTION virtual void enable_lighting(bool enable); virtual void set_ambient_light(const LColor &color); virtual void enable_light(int light_id, bool enable); virtual void begin_bind_lights(); virtual void end_bind_lights(); virtual void enable_clip_plane(int plane_id, bool enable); virtual void begin_bind_clip_planes(); virtual void bind_clip_plane(const NodePath &plane, int plane_id); virtual void end_bind_clip_planes(); #endif virtual void free_pointers(); #ifndef OPENGLES_1 INLINE void enable_vertex_attrib_array(GLuint index); INLINE void disable_vertex_attrib_array(GLuint index); INLINE void set_vertex_attrib_divisor(GLuint index, GLuint divisor); #endif INLINE void set_active_texture_stage(int i); INLINE void enable_multisample_antialias(bool val); INLINE void enable_multisample_alpha_one(bool val); INLINE void enable_multisample_alpha_mask(bool val); INLINE void enable_line_smooth(bool val); INLINE void enable_point_smooth(bool val); INLINE void enable_polygon_smooth(bool val); INLINE void setup_antialias_line(); INLINE void setup_antialias_point(); INLINE void setup_antialias_polygon(); INLINE void enable_stencil_test(bool val); INLINE void enable_blend(bool val); INLINE void enable_depth_test(bool val); #ifdef SUPPORT_FIXED_FUNCTION INLINE void enable_fog(bool val); INLINE void enable_alpha_test(bool val); #endif INLINE void enable_polygon_offset(bool val); INLINE void set_color_write_mask(int mask); INLINE void clear_color_write_mask(); #ifdef SUPPORT_FIXED_FUNCTION INLINE void call_glLoadMatrix(const LMatrix4 &mat); INLINE void call_glFogfv(GLenum pname, const LColor &color); INLINE void call_glMaterialfv(GLenum face, GLenum pname, const LColor &color); INLINE void call_glLightfv(GLenum light, GLenum pname, const LVecBase4 &value); INLINE void call_glLightfv(GLenum light, GLenum pname, const LVecBase3 &value); INLINE void call_glLightModelfv(GLenum pname, const LVecBase4 &value); INLINE void call_glTexEnvfv(GLenum target, GLenum pname, const LVecBase4 &value); #endif INLINE void call_glTexParameterfv(GLenum target, GLenum pname, const LVecBase4 &value); #ifdef SUPPORT_FIXED_FUNCTION INLINE GLenum get_light_id(int index) const; INLINE GLenum get_clip_plane_id(int index) const; #endif void set_draw_buffer(int rbtype); void set_read_buffer(int rbtype); static GLenum get_numeric_type(Geom::NumericType numeric_type); GLenum get_texture_target(Texture::TextureType texture_type) const; GLenum get_texture_wrap_mode(SamplerState::WrapMode wm) const; static SamplerState::WrapMode get_panda_wrap_mode(GLenum wm); static GLenum get_texture_filter_type(SamplerState::FilterType ft, bool ignore_mipmaps); static SamplerState::FilterType get_panda_filter_type(GLenum ft); GLenum get_component_type(Texture::ComponentType component_type); GLint get_external_image_format(Texture *tex) const; GLint get_internal_image_format(Texture *tex, bool force_sized=false) const; static bool is_mipmap_filter(GLenum min_filter); static bool is_compressed_format(GLenum format); static GLint get_texture_apply_mode_type(TextureStage::Mode am); static GLint get_texture_combine_type(TextureStage::CombineMode cm); GLint get_texture_src_type(TextureStage::CombineSource cs, int last_stage, int last_saved_result, int this_stage) const; static GLint get_texture_operand_type(TextureStage::CombineOperand co); static GLenum get_fog_mode_type(Fog::Mode m); static GLenum get_blend_equation_type(ColorBlendAttrib::Mode mode); static GLenum get_blend_func(ColorBlendAttrib::Operand operand); static GLenum get_usage(Geom::UsageHint usage_hint); #ifndef NDEBUG static const char *get_compressed_format_string(GLenum format); #endif void unbind_buffers(); #ifdef SUPPORT_FIXED_FUNCTION void disable_standard_vertex_arrays(); bool update_standard_vertex_arrays(bool force); void disable_standard_texture_bindings(); void update_standard_texture_bindings(); #endif #ifndef OPENGLES_1 void update_shader_vertex_format(const GeomVertexFormat *format); #endif void apply_white_texture(GLuint unit); GLuint get_white_texture(); #ifndef NDEBUG void update_show_usage_texture_bindings(int show_stage_index); void upload_usage_texture(int width, int height); #endif // NDEBUG bool specify_texture(CLP(TextureContext) *gtc, const SamplerState &sampler); bool apply_texture(CLP(TextureContext) *gtc); bool apply_sampler(GLuint unit, const SamplerState &sampler, CLP(TextureContext) *gtc); bool upload_texture(CLP(TextureContext) *gtc, bool force, bool uses_mipmaps); bool upload_texture_image(CLP(TextureContext) *gtc, bool needs_reload, bool uses_mipmaps, int mipmap_bias, GLenum texture_target, GLenum page_target, GLint internal_format, GLint external_format, GLenum component_type, bool one_page_only, int z, Texture::CompressionMode image_compression); void generate_mipmaps(CLP(TextureContext) *gtc); bool upload_simple_texture(CLP(TextureContext) *gtc); size_t get_texture_memory_size(CLP(TextureContext) *gtc); void check_nonresident_texture(BufferContextChain &chain); bool do_extract_texture_data(CLP(TextureContext) *gtc); bool extract_texture_image(PTA_uchar &image, size_t &page_size, Texture *tex, GLenum target, GLenum page_target, Texture::ComponentType type, Texture::CompressionMode compression, int n); #ifdef SUPPORT_FIXED_FUNCTION void do_point_size(); #endif enum AutoAntialiasMode { AA_poly, AA_line, AA_point, }; enum MultisampleMode { MM_antialias = 0x0001, MM_alpha_one = 0x0002, MM_alpha_mask = 0x0004, }; int _multisample_mode; bool _line_smooth_enabled; bool _point_smooth_enabled; bool _polygon_smooth_enabled; bool _stencil_test_enabled; bool _blend_enabled; bool _depth_test_enabled; bool _fog_enabled; bool _alpha_test_enabled; bool _polygon_offset_enabled; bool _flat_shade_model; int _decal_level; int _active_color_write_mask; bool _dithering_enabled; int _viewport_x; int _viewport_y; int _viewport_width; int _viewport_height; int _draw_buffer_type; bool _auto_antialias_mode; RenderModeAttrib::Mode _render_mode; PN_stdfloat _point_size; bool _point_perspective; bool _scissor_enabled; bool _scissor_attrib_active; epvector _scissor_array; #ifndef OPENGLES_1 BitMask32 _enabled_vertex_attrib_arrays; GLuint _vertex_attrib_divisors[32]; PT(Shader) _current_shader; ShaderContext *_current_shader_context; PT(Shader) _vertex_array_shader; ShaderContext *_vertex_array_shader_context; PT(Shader) _texture_binding_shader; ShaderContext *_texture_binding_shader_context; PT(Shader) _default_shader; #ifndef OPENGLES bool _shader_point_size; #endif #endif GLfloat _max_line_width; #ifdef HAVE_CG CGcontext _cg_context; #endif #ifdef SUPPORT_IMMEDIATE_MODE CLP(ImmediateModeSender) _sender; bool _use_sender; #endif // SUPPORT_IMMEDIATE_MODE bool _supports_vertex_attrib_divisor; // Cache the data necessary to bind each particular light each frame, so if // we bind a given light multiple times, we only have to compute its data // once. class DirectionalLightFrameData { public: LVector4 _neg_dir; }; typedef pmap DirectionalLights; DirectionalLights _dlights; int _pass_number; GLuint _geom_display_list; GLuint _current_vbuffer_index; GLuint _current_ibuffer_index; GLuint _current_fbo; #ifndef OPENGLES_1 pvector _current_vertex_buffers; bool _use_vertex_attrib_binding; CPT(GeomVertexFormat) _current_vertex_format; const GeomVertexColumn *_vertex_attrib_columns[32]; GLuint _current_sbuffer_index; pvector _current_sbuffer_base; #endif int _active_texture_stage; int _num_active_texture_stages; PN_stdfloat _max_anisotropy; bool _supports_anisotropy; GLint _max_image_units; bool _supports_multi_bind; bool _supports_get_program_binary; pset _program_binary_formats; #ifdef OPENGLES bool _supports_depth24; bool _supports_depth32; #endif std::string _gl_vendor; std::string _gl_renderer; std::string _gl_version; int _gl_version_major, _gl_version_minor; // #--- Zhao Nov2011 int _gl_shadlang_ver_major, _gl_shadlang_ver_minor; pset _extensions; #ifndef OPENGLES // True for non-compatibility GL 3.2+ contexts. bool _core_profile; #endif public: #ifndef OPENGLES bool _use_depth_zero_to_one; bool _use_remapped_depth_range; PFNGLDEPTHRANGEDNVPROC _glDepthRangedNV; #endif bool _supports_point_parameters; PFNGLPOINTPARAMETERFVPROC _glPointParameterfv; bool _supports_point_sprite; #ifndef OPENGLES PFNGLPRIMITIVERESTARTINDEXPROC _glPrimitiveRestartIndex; bool _explicit_primitive_restart; #endif #if defined(SUPPORT_FIXED_FUNCTION) && !defined(OPENGLES) PFNGLSECONDARYCOLORPOINTERPROC _glSecondaryColorPointer; #endif #ifndef OPENGLES_1 PFNGLDRAWRANGEELEMENTSPROC _glDrawRangeElements; #endif #ifndef OPENGLES_1 PFNGLTEXIMAGE3DPROC_P _glTexImage3D; PFNGLTEXSUBIMAGE3DPROC _glTexSubImage3D; PFNGLCOPYTEXSUBIMAGE3DPROC _glCopyTexSubImage3D; #endif bool _supports_tex_storage; PFNGLTEXSTORAGE1DPROC _glTexStorage1D; PFNGLTEXSTORAGE2DPROC _glTexStorage2D; PFNGLTEXSTORAGE3DPROC _glTexStorage3D; #ifndef OPENGLES PFNGLTEXBUFFERPROC _glTexBuffer; #endif bool _supports_clear_texture; #ifndef OPENGLES PFNGLCLEARTEXIMAGEPROC _glClearTexImage; #endif bool _supports_clear_buffer; #ifndef OPENGLES PFNGLCLEARBUFFERDATAPROC _glClearBufferData; #endif PFNGLCOMPRESSEDTEXIMAGE1DPROC _glCompressedTexImage1D; PFNGLCOMPRESSEDTEXIMAGE2DPROC _glCompressedTexImage2D; PFNGLCOMPRESSEDTEXIMAGE3DPROC _glCompressedTexImage3D; PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC _glCompressedTexSubImage1D; PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC _glCompressedTexSubImage2D; PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC _glCompressedTexSubImage3D; PFNGLGETCOMPRESSEDTEXIMAGEPROC _glGetCompressedTexImage; bool _supports_bgr; bool _supports_packed_dabc; bool _supports_packed_ufloat; #ifdef SUPPORT_FIXED_FUNCTION bool _supports_rescale_normal; #ifndef OPENGLES bool _use_separate_specular_color; #endif #endif #ifndef OPENGLES_2 PFNGLACTIVETEXTUREPROC _glActiveTexture; #endif #ifdef SUPPORT_FIXED_FUNCTION PFNGLCLIENTACTIVETEXTUREPROC _glClientActiveTexture; #endif #ifdef SUPPORT_IMMEDIATE_MODE PFNGLMULTITEXCOORD1FPROC _glMultiTexCoord1f; PFNGLMULTITEXCOORD2FPROC _glMultiTexCoord2f; PFNGLMULTITEXCOORD3FPROC _glMultiTexCoord3f; PFNGLMULTITEXCOORD4FPROC _glMultiTexCoord4f; PFNGLMULTITEXCOORD1DPROC _glMultiTexCoord1d; PFNGLMULTITEXCOORD2DPROC _glMultiTexCoord2d; PFNGLMULTITEXCOORD3DPROC _glMultiTexCoord3d; PFNGLMULTITEXCOORD4DPROC _glMultiTexCoord4d; #endif bool _supports_buffers; PFNGLGENBUFFERSPROC _glGenBuffers; PFNGLBINDBUFFERPROC _glBindBuffer; PFNGLBUFFERDATAPROC _glBufferData; PFNGLBUFFERSUBDATAPROC _glBufferSubData; PFNGLDELETEBUFFERSPROC _glDeleteBuffers; #ifndef OPENGLES PFNGLMAPBUFFERPROC _glMapBuffer; PFNGLUNMAPBUFFERPROC _glUnmapBuffer; PFNGLGETBUFFERSUBDATAPROC _glGetBufferSubData; #endif #ifdef OPENGLES PFNGLMAPBUFFERRANGEEXTPROC _glMapBufferRange; #else PFNGLMAPBUFFERRANGEPROC _glMapBufferRange; #endif #ifndef OPENGLES_1 bool _supports_uniform_buffers; bool _supports_shader_buffers; PFNGLBINDBUFFERBASEPROC _glBindBufferBase; bool _supports_buffer_storage; PFNGLBUFFERSTORAGEPROC _glBufferStorage; #endif bool _supports_blend_equation_separate; #ifndef OPENGLES_2 // OpenGL ES 2+ has these in the core. PFNGLBLENDEQUATIONPROC _glBlendEquation; PFNGLBLENDEQUATIONSEPARATEPROC _glBlendEquationSeparate; PFNGLBLENDFUNCSEPARATEPROC _glBlendFuncSeparate; #endif #ifndef OPENGLES PFNGLBLENDCOLORPROC _glBlendColor; #endif bool _supports_vao; GLuint _current_vao_index; PFNGLBINDVERTEXARRAYPROC _glBindVertexArray; PFNGLDELETEVERTEXARRAYSPROC _glDeleteVertexArrays; PFNGLGENVERTEXARRAYSPROC _glGenVertexArrays; #ifndef OPENGLES_1 PFNGLDRAWARRAYSINDIRECTPROC _glDrawArraysIndirect; PFNGLDRAWELEMENTSINDIRECTPROC _glDrawElementsIndirect; #endif bool _supports_framebuffer_object; PFNGLISRENDERBUFFEREXTPROC _glIsRenderbuffer; PFNGLBINDRENDERBUFFEREXTPROC _glBindRenderbuffer; PFNGLDELETERENDERBUFFERSEXTPROC _glDeleteRenderbuffers; PFNGLGENRENDERBUFFERSEXTPROC _glGenRenderbuffers; PFNGLRENDERBUFFERSTORAGEEXTPROC _glRenderbufferStorage; PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC _glGetRenderbufferParameteriv; PFNGLISFRAMEBUFFEREXTPROC _glIsFramebuffer; PFNGLBINDFRAMEBUFFEREXTPROC _glBindFramebuffer; PFNGLDELETEFRAMEBUFFERSEXTPROC _glDeleteFramebuffers; PFNGLGENFRAMEBUFFERSEXTPROC _glGenFramebuffers; PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC _glCheckFramebufferStatus; PFNGLFRAMEBUFFERTEXTURE1DEXTPROC _glFramebufferTexture1D; PFNGLFRAMEBUFFERTEXTURE2DEXTPROC _glFramebufferTexture2D; #ifdef OPENGLES_2 PFNGLFRAMEBUFFERTEXTURE3DOES _glFramebufferTexture3D; #else PFNGLFRAMEBUFFERTEXTURE3DEXTPROC _glFramebufferTexture3D; #endif PFNGLFRAMEBUFFERTEXTUREARBPROC _glFramebufferTexture; PFNGLFRAMEBUFFERTEXTURELAYERPROC _glFramebufferTextureLayer; PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC _glFramebufferRenderbuffer; PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC _glGetFramebufferAttachmentParameteriv; PFNGLGENERATEMIPMAPEXTPROC _glGenerateMipmap; PFNGLBINDPROGRAMARBPROC _glBindProgram; #ifndef OPENGLES bool _supports_dsa; PFNGLGENERATETEXTUREMIPMAPPROC _glGenerateTextureMipmap; #endif #ifndef OPENGLES_1 bool _supports_empty_framebuffer; PFNGLFRAMEBUFFERPARAMETERIPROC _glFramebufferParameteri; #endif bool _supports_framebuffer_multisample; bool _supports_framebuffer_multisample_coverage_nv; INLINE bool get_supports_framebuffer_multisample(); INLINE bool get_supports_framebuffer_multisample_coverage_nv(); PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC _glRenderbufferStorageMultisample; PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC _glRenderbufferStorageMultisampleCoverage; bool _supports_framebuffer_blit; INLINE bool get_supports_framebuffer_blit(); PFNGLBLITFRAMEBUFFEREXTPROC _glBlitFramebuffer; PFNGLDRAWBUFFERSPROC _glDrawBuffers; #ifndef OPENGLES_1 PFNGLCLEARBUFFERFVPROC _glClearBufferfv; PFNGLCLEARBUFFERIVPROC _glClearBufferiv; PFNGLCLEARBUFFERFIPROC _glClearBufferfi; #endif int _max_fb_samples; bool _supports_viewport_arrays; bool _supports_bindless_texture; PFNGLGENQUERIESPROC _glGenQueries; PFNGLBEGINQUERYPROC _glBeginQuery; PFNGLENDQUERYPROC _glEndQuery; PFNGLDELETEQUERIESPROC _glDeleteQueries; PFNGLGETQUERYIVPROC _glGetQueryiv; PFNGLGETQUERYOBJECTUIVPROC _glGetQueryObjectuiv; #ifndef OPENGLES PFNGLQUERYCOUNTERPROC _glQueryCounter; PFNGLGETQUERYOBJECTI64VPROC _glGetQueryObjecti64v; PFNGLGETQUERYOBJECTUI64VPROC _glGetQueryObjectui64v; PFNGLGETINTEGER64VPROC _glGetInteger64v; #endif PFNGLACTIVESTENCILFACEEXTPROC _glActiveStencilFaceEXT; #ifndef OPENGLES_1 // GLSL functions PFNGLATTACHSHADERPROC _glAttachShader; PFNGLBINDATTRIBLOCATIONPROC _glBindAttribLocation; PFNGLBINDFRAGDATALOCATIONPROC _glBindFragDataLocation; PFNGLCOMPILESHADERPROC _glCompileShader; PFNGLCREATEPROGRAMPROC _glCreateProgram; PFNGLCREATESHADERPROC _glCreateShader; PFNGLDELETEPROGRAMPROC _glDeleteProgram; PFNGLDELETESHADERPROC _glDeleteShader; PFNGLDETACHSHADERPROC _glDetachShader; PFNGLDISABLEVERTEXATTRIBARRAYPROC _glDisableVertexAttribArray; PFNGLENABLEVERTEXATTRIBARRAYPROC _glEnableVertexAttribArray; PFNGLGETACTIVEATTRIBPROC _glGetActiveAttrib; PFNGLGETACTIVEUNIFORMPROC _glGetActiveUniform; PFNGLGETATTRIBLOCATIONPROC _glGetAttribLocation; PFNGLGETPROGRAMIVPROC _glGetProgramiv; PFNGLGETPROGRAMINFOLOGPROC _glGetProgramInfoLog; PFNGLGETSHADERIVPROC _glGetShaderiv; PFNGLGETSHADERINFOLOGPROC _glGetShaderInfoLog; PFNGLGETUNIFORMLOCATIONPROC _glGetUniformLocation; PFNGLLINKPROGRAMPROC _glLinkProgram; PFNGLSHADERSOURCEPROC_P _glShaderSource; PFNGLUSEPROGRAMPROC _glUseProgram; PFNGLUNIFORM4FPROC _glUniform4f; PFNGLUNIFORM1IPROC _glUniform1i; PFNGLUNIFORM1FVPROC _glUniform1fv; PFNGLUNIFORM2FVPROC _glUniform2fv; PFNGLUNIFORM3FVPROC _glUniform3fv; PFNGLUNIFORM4FVPROC _glUniform4fv; PFNGLUNIFORM1IVPROC _glUniform1iv; PFNGLUNIFORM2IVPROC _glUniform2iv; PFNGLUNIFORM3IVPROC _glUniform3iv; PFNGLUNIFORM4IVPROC _glUniform4iv; PFNGLUNIFORM1UIVPROC _glUniform1uiv; PFNGLUNIFORM2UIVPROC _glUniform2uiv; PFNGLUNIFORM3UIVPROC _glUniform3uiv; PFNGLUNIFORM4UIVPROC _glUniform4uiv; PFNGLUNIFORMMATRIX3FVPROC _glUniformMatrix3fv; PFNGLUNIFORMMATRIX4FVPROC _glUniformMatrix4fv; PFNGLVALIDATEPROGRAMPROC _glValidateProgram; PFNGLVERTEXATTRIB4FVPROC _glVertexAttrib4fv; PFNGLVERTEXATTRIB4DVPROC _glVertexAttrib4dv; PFNGLVERTEXATTRIBPOINTERPROC _glVertexAttribPointer; PFNGLVERTEXATTRIBIPOINTERPROC _glVertexAttribIPointer; PFNGLVERTEXATTRIBLPOINTERPROC _glVertexAttribLPointer; PFNGLVERTEXATTRIBDIVISORPROC _glVertexAttribDivisor; PFNGLDRAWARRAYSINSTANCEDPROC _glDrawArraysInstanced; PFNGLDRAWELEMENTSINSTANCEDPROC _glDrawElementsInstanced; PFNGLBINDVERTEXBUFFERPROC _glBindVertexBuffer; PFNGLVERTEXATTRIBFORMATPROC _glVertexAttribFormat; PFNGLVERTEXATTRIBIFORMATPROC _glVertexAttribIFormat; PFNGLVERTEXATTRIBLFORMATPROC _glVertexAttribLFormat; PFNGLVERTEXATTRIBBINDINGPROC _glVertexAttribBinding; PFNGLVERTEXBINDINGDIVISORPROC _glVertexBindingDivisor; PFNGLGETACTIVEUNIFORMSIVPROC _glGetActiveUniformsiv; PFNGLGETACTIVEUNIFORMBLOCKIVPROC _glGetActiveUniformBlockiv; PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC _glGetActiveUniformBlockName; PFNGLGENSAMPLERSPROC _glGenSamplers; PFNGLDELETESAMPLERSPROC _glDeleteSamplers; PFNGLBINDSAMPLERPROC _glBindSampler; PFNGLSAMPLERPARAMETERIPROC _glSamplerParameteri; PFNGLSAMPLERPARAMETERIVPROC _glSamplerParameteriv; PFNGLSAMPLERPARAMETERFPROC _glSamplerParameterf; PFNGLSAMPLERPARAMETERFVPROC _glSamplerParameterfv; PFNGLPROGRAMPARAMETERIPROC _glProgramParameteri; 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; PFNGLGETTEXTUREHANDLEPROC _glGetTextureHandle; PFNGLGETTEXTURESAMPLERHANDLEPROC _glGetTextureSamplerHandle; PFNGLMAKETEXTUREHANDLERESIDENTPROC _glMakeTextureHandleResident; PFNGLMAKETEXTUREHANDLENONRESIDENTPROC _glMakeTextureHandleNonResident; PFNGLUNIFORMHANDLEUI64PROC _glUniformHandleui64; PFNGLUNIFORMHANDLEUI64VPROC _glUniformHandleui64v; PFNGLGETPROGRAMINTERFACEIVPROC _glGetProgramInterfaceiv; PFNGLGETPROGRAMRESOURCENAMEPROC _glGetProgramResourceName; PFNGLGETPROGRAMRESOURCEIVPROC _glGetProgramResourceiv; #endif // !OPENGLES GLenum _edge_clamp; GLenum _border_clamp; GLenum _mirror_repeat; GLenum _mirror_clamp; GLenum _mirror_edge_clamp; GLenum _mirror_border_clamp; bool _supports_texture_lod; bool _supports_texture_lod_bias; bool _supports_texture_max_level; #ifndef OPENGLES_1 GLsizei _instance_count; #endif LightMutex _lock; typedef pvector DeletedNames; DeletedNames _deleted_display_lists; DeletedNames _deleted_queries; #ifndef OPENGLES_1 // Stores textures for which memory bariers should be issued. typedef pset TextureSet; TextureSet _textures_needing_fetch_barrier; TextureSet _textures_needing_image_access_barrier; TextureSet _textures_needing_update_barrier; TextureSet _textures_needing_framebuffer_barrier; #endif // RenderState::SlotMask _inv_state_mask; int _error_count; double _last_error_check; bool _check_errors; bool _force_flush; bool _supports_debug; bool _use_object_labels; PFNGLOBJECTLABELPROC _glObjectLabel; GLuint _white_texture; #ifndef NDEBUG #ifndef OPENGLES_1 PFNGLPUSHGROUPMARKEREXTPROC _glPushGroupMarker; PFNGLPOPGROUPMARKEREXTPROC _glPopGroupMarker; #endif bool _show_texture_usage; int _show_texture_usage_max_size; int _show_texture_usage_index; class UsageTextureKey { public: INLINE UsageTextureKey(int x_size, int y_size); INLINE bool operator < (const UsageTextureKey &other) const; int _x_size; int _y_size; }; typedef pmap UsageTextures; UsageTextures _usage_textures; #endif // NDEBUG BufferResidencyTracker _renderbuffer_residency; static PStatCollector _load_display_list_pcollector; static PStatCollector _primitive_batches_display_list_pcollector; static PStatCollector _vertices_display_list_pcollector; static PStatCollector _vertices_immediate_pcollector; static PStatCollector _memory_barrier_pcollector; static PStatCollector _vertex_array_update_pcollector; static PStatCollector _texture_update_pcollector; static PStatCollector _fbo_bind_pcollector; static PStatCollector _check_error_pcollector; static PStatCollector _check_residency_pcollector; public: virtual TypeHandle get_type() const { return get_class_type(); } virtual TypeHandle force_init_type() {init_type(); return get_class_type();} static TypeHandle get_class_type() { return _type_handle; } public: static void init_type() { GraphicsStateGuardian::init_type(); register_type(_type_handle, CLASSPREFIX_QUOTED "GraphicsStateGuardian", GraphicsStateGuardian::get_class_type()); } private: static TypeHandle _type_handle; friend class CLP(VertexBufferContext); friend class CLP(IndexBufferContext); friend class CLP(BufferContext); friend class CLP(ShaderContext); friend class CLP(CgShaderContext); friend class CLP(GraphicsBuffer); friend class CLP(OcclusionQueryContext); friend class CLP(TimerQueryContext); }; #include "glGraphicsStateGuardian_src.I"