36 #ifndef __RE_OGLRender__
37 #define __RE_OGLRender__
85 #if defined(EXPERIMENTAL_QOPENGLWIDGET)
104 #define RE_DRIVER_INFO_VENDOR "OpenGL Vendor"
105 #define RE_DRIVER_INFO_RENDERER "OpenGL Renderer"
106 #define RE_DRIVER_INFO_VERSION "OpenGL Version"
107 #define RE_DRIVER_INFO_SHADING_LANGUAGE "OpenGL Shading Language"
108 #define RE_DRIVER_INFO_DETECTED "Detected"
117 const char *className()
const;
123 #if defined(EXPERIMENTAL_QOPENGLWIDGET)
133 {
return reinterpret_cast<RE_Render*
>(
this); }
135 {
return reinterpret_cast<const RE_Render*
>(
this); }
140 static bool hasGL11();
141 static bool hasGL12();
142 static bool hasGL13();
143 static bool hasGL14();
144 static bool hasGL15();
145 static bool hasGL20();
146 static bool hasGL21();
148 static bool hasGL3(
int minor);
149 static bool hasGL4(
int minor);
151 static int glMajorVersion();
152 static int glMinorVersion();
155 int glslMajorVersion();
156 int glslMinorVersion();
171 static void setPerformBadDriverCheck(
bool onoff);
174 static bool hasDriverVersion();
175 static int getDriverMajorVersion();
176 static int getDriverMinorVersion();
177 static int getDriverBuildMajorVersion();
178 static int getDriverBuildMinorVersion();
181 static bool getUsingCoreProfile();
182 static void setUsingCoreProfile(
bool using_core_profile);
189 static void clearGraphicsCache();
194 int64 getFreeTextureMemoryKB(
int64 *largest_chunk =
nullptr);
195 int64 getFreeBufferMemoryKB(
int64 *largest_chunk =
nullptr);
196 int64 getFreeFramebufferMemoryKB(
int64 *largest_chunk =
nullptr);
199 static int64 getInitialFreeMemoryKB();
203 static void exitWithBadDriver();
210 static void updateScreenSize();
215 static bool areScreensUniform();
233 static float pixelsToInches(
int n);
234 static int inchesToPixels(
float i);
235 static int scaledSize(
int size);
241 void checkForSuspendResume();
242 static void addSuspendResumeCB(
void (*cb)(
void*),
void *
data);
243 static void removeSuspendResumeCB(
void (*cb)(
void*),
void *
data);
250 void enableMultisample(
bool enable);
251 bool isMultisampleEnabled()
const;
253 void enableAlphaToCoverage(
bool enable);
254 bool isAlphaToCoverage()
const;
256 void getMaxViewportSize(
int &
w,
int &
h)
const;
257 int getMaxColorSamples()
const;
258 int getMaxDepthSamples()
const;
264 void setWindow(
RE_Window *,
bool attach =
true);
266 bool makeCurrent(
bool ignore_errors =
false);
267 #if defined(EXPERIMENTAL_QOPENGLWIDGET)
268 bool isCurrent()
const;
271 {
return theCurrentRender.get() ==
this; }
273 static void resetCurrent();
274 #if defined(EXPERIMENTAL_QOPENGLWIDGET)
275 bool contextIsValid()
const;
284 #if defined(EXPERIMENTAL_QOPENGLWIDGET)
289 void popOffscreenBuffer();
297 const RE_Window *getCurrentWindow()
const;
319 void lockContextForRender();
320 void unlockContextAfterRender();
321 bool tryLockContextForRender();
322 bool isContextLocked()
const;
324 #if defined(EXPERIMENTAL_QOPENGLWIDGET)
330 void unlockContext();
340 int getNextGLError();
341 void clearGLErrors();
342 const char *getGLErrorString(
int error );
343 void printGLError(
const char *header,
344 bool assert =
false );
345 void printAllGLErrors(
const char *header,
346 bool assert =
false );
348 void dumpNewState(
bool show_all =
false,
349 bool show_shader_blocks =
true);
350 void dumpViewportState(
bool show_all =
false);
351 void dumpTextureState()
const;
352 void dumpVertexAttributes()
const;
353 void dumpFragmentTests(
bool show_all =
false)
const;
354 void dumpRasterizeState(
bool show_all =
false)
const;
355 void dumpTextureCacheState(
int stack_level =-1)
const;
360 bool isDebugLabelSupported()
const;
363 bool isDebugging()
const;
365 int pushDebug(
bool enable);
366 void popDebug(
int *nest =
nullptr);
368 int pushDebugGroup(
const char *
name,
int id=1987);
369 void popDebugGroup(
int *nest =
nullptr);
371 void addComment(
const char *
name,
380 int pushDrawFramebuffer();
384 void popDrawFramebuffer(
int *nest =
nullptr);
386 int pushReadFramebuffer();
390 void popReadFramebuffer(
int *nest =
nullptr);
392 void updateFramebuffer();
398 void unregisterFBO(
int id);
402 void useSampleMask(
bool use);
403 bool usingSampleMask()
const;
404 int getMaxIntegerSamples()
const;
405 int getSampleMask(
int mask_number);
406 void setSampleMask(
int mask_number,
int mask);
407 static int getMatteMaskForSampleCount(
int samples);
413 void clearC(
float *
color =
nullptr);
414 void clearZ(
float z = 1.0);
415 void clearCZ(
float z = 1.0);
424 void enableColorBufferWriting();
425 void disableColorBufferWriting();
426 bool getColorBufferWriting();
427 void updateColorBufferWriting();
436 void popDrawBuffer(
int *nest = 0);
439 bool getDrawBufferIsBlendable();
442 void popReadBuffer(
int *nest = 0);
449 bool isFrontBufferDirty()
const;
450 void setFrontBufferDirty(
bool d);
452 void flush(
int wait=0);
464 void disableScreenMask();
465 void intersectMask2DI(
const UT_DimRect &rect);
468 bool getScreenMask();
471 int getOGLMaxClipPlanes();
472 void enableClipDistance(
int clip_plane,
bool enable);
473 bool clipDistanceEnabled(
int clip_plane)
const;
480 int pushBackfaceCulling();
481 int pushBackfaceCulling(
bool backface);
482 void popBackfaceCulling(
int *nested = 0);
484 bool isBackface()
const;
485 void setBackface(
bool removeBackface);
486 bool getReverseWinding();
487 void setReverseWinding(
bool reverse_winding);
492 bool isPointOffset();
494 bool isPolygonOffset();
495 void pointOffset(
bool onoff );
496 void lineOffset(
bool onoff );
497 void polygonOffset(
bool onoff );
498 void setOffsetAmount(
float variable,
float constant );
499 void getOffsetAmount(
float *variable,
float *constant)
const;
513 int stream_bitfield = 0x1);
516 void endTransformFeedback();
520 int getNumFeedbackPrimitives(
int stream = 0);
524 bool hasFeedbackBufferOverflow(
int stream = 0);
527 bool isTransformFeedbackEnabled()
const;
529 bool isRasterizeEnabled()
const;
534 float getLineWidth()
const;
535 float getMaxSmoothLineWidth();
543 void setProgramPointSize(
bool enable);
544 bool getProgramPointSize()
const;
552 int pushDepthState();
553 void popDepthState(
int *nest =
nullptr);
557 void enableDepthBufferWriting();
558 void disableDepthBufferWriting();
559 bool getDepthBufferWriting();
560 void updateDepthBufferWriting();
563 void enableDepthTest();
564 void disableDepthTest();
566 void updateDepthTest();
571 void updateZFunction()
const;
575 void enableDepthClamp(
bool b);
576 bool getDepthClamp();
577 void updateDepthClamp();
579 void setDepthRange(
double nr,
double fr);
580 void getDepthRange(
double &nr,
double &fr)
const;
583 int pushStencilState();
584 void popStencilState(
int *nest =
nullptr);
586 void setStencil(
bool enable);
587 void setSClearValue(
int clearValue);
588 void setSWriteMask(
int writeMask);
593 void updateStencilState();
594 void resetSFunction();
595 void resetSWriteMask();
596 void resetSClearValue();
597 void resetSOperation();
600 void enableLogicOp();
601 void disableLogicOp();
607 int pushBlendState();
608 void popBlendState(
int *nesting = 0);
610 bool isBlending()
const;
611 void blend(
int onoff);
626 void blendAlpha(
int onoff = 1);
627 void blendAlphaPremult(
bool onoff =
true);
629 int pushSmoothLines();
630 void popSmoothLines(
int *nesting = 0);
633 void smoothBlendLinesNoFlagChange(
bool by_smooth);
636 int getBlendSmoothLevel()
const;
638 static void allowSmoothLines(
int yn);
639 static int allowsSmoothLines();
651 RE_Shader *override_mat_shader =
nullptr,
652 bool allow_partial_render =
false);
656 RE_Shader *override_mat_shader =
nullptr,
657 bool allow_partial_render =
false);
659 void popMaterial(
int *nest =
nullptr);
675 void popShader(
int *nest =
nullptr);
679 int pushShaderTransformFeedback(
RE_Shader *sh,
682 int stream_bitfield = 0x1);
686 int stream_bitfield = 0x1);
687 void popShaderTransformFeedback(
int *nest =
nullptr);
693 void setShaderOnlyMode(
bool enable);
694 void requestFixedFunction();
706 void setPatchVertices(
int num_verts);
715 bool setShaderSampleRate(
fpreal rate);
716 fpreal getShaderSampleRate()
const;
718 bool isSampleShading()
const;
746 { popUniform(bindex); }
752 void printBuiltInUniforms(
bool bound_only);
766 {
return myBuiltInUniformSerial; }
782 bool inverse_too =
false);
783 void popObjectMatrix();
788 void setFragmentDerivativeHint(
bool nicest);
789 bool getFragmentDerivativeHint();
796 void setConstAttribF32(
int loc,
int vsize,
const fpreal32 *
data);
799 void setConstAttribF32(
int loc,
int vsize,
const fpreal64 *
data);
802 void setConstAttribF64(
int loc,
int vsize,
const fpreal64 *
data);
805 void setConstAttribI32(
int loc,
int vsize,
const int32 *
data);
808 void setConstAttribU32(
int loc,
int vsize,
const uint32 *
data);
845 int bindTextureRaw(
int id,
int unit);
856 void setActiveTexture(
int textureunit);
857 int getActiveTexture()
const;
865 void popTextureState(
int *nest =
nullptr);
874 int findFirstFreeTextureUnit(
int starting_unit = 0)
const;
877 void updateTextureState()
const;
881 {
return myMaxTextureShaderUnits; }
883 {
return myMaxTextureVertexUnits; }
885 {
return myMaxTextureGeometryUnits; }
887 {
return myMaxTextureFragmentUnits; }
889 {
return myMaxTextureAnisotropy; }
894 {
return myMaxTextureSize; }
896 {
return myMaxTexture3DSize; }
898 {
return myMaxTextureRectSize; }
902 {
return myMaxColorBuffers; }
905 {
return myMaxDrawBuffers; }
908 void disableAllTextures();
912 bool bindImageTexture(
int image_unit,
917 void unbindImageTexture(
int image_unit);
923 int pushReadAlignment(
const void *
data,
int scansize);
924 void popReadAlignment(
int *nest =
nullptr);
926 int pushWriteAlignment(
const void *
data,
int scansize);
927 void popWriteAlignment(
int *nest =
nullptr);
930 void useSeamlessMaps(
bool enable);
931 bool usingSeamlessMaps();
942 int num_layers,
int size = 64 );
948 RE_OGLTexture *getRandomSampleMaskTexture(
unsigned int seed,
int nsamples,
955 int convert16bit = 0,
956 bool isinteger =
false);
962 bool is3DLUTSupported()
const;
964 void buildRasterTextureGeometry(
971 void displayRasterTexture(
float x,
float y,
float z,
974 void displayRasterTexture(
float x,
float y,
float z,
978 void displayRasterTexture(
float x,
float y,
float z,
984 float alpha_mult=1.0
f);
990 void saveRaster(
int x,
int y,
int w,
int h,
994 bool use_backbuf =
true);
1003 void setViewportFontOffset(
int x,
int y);
1004 int getViewportFontOffsetX()
const;
1005 int getViewportFontOffsetY()
const;
1028 bool region_support);
1029 void endConditionalRender();
1033 void enablePrimitiveRestart(
bool enable);
1034 void setPrimitiveRestartIndex(
unsigned int index);
1038 void drawViewportPoint(
const fpreal32 p[3],
1043 void drawViewportString(
const fpreal32 p[3],
1049 void postDrawViewportString();
1052 static void destroyShaderObject(
unsigned int progid,
bool unreg,
1054 static void destroyTextureObject(
unsigned int texid,
RE_OGLTexture *tex);
1055 static void destroyRenderbufferObject(
unsigned int rb);
1056 static void destroyBufferObject(
unsigned int buf);
1057 static void destroySync(
void *sync);
1059 static void clearCachedUniformBuffer(
int id);
1062 void destroyVertexArrayObject(
unsigned int vao);
1063 void destroyQuery(
unsigned int query);
1064 void destroyFramebufferObject(
unsigned int fbo);
1070 void unbindPipeline();
1075 void invalidateCachedState();
1086 void enableSubBufferDrawing(
bool enable);
1095 RE_OGLRender(
int do_foreground,
const char *appname = 0);
1099 #define RE_FLAG_STATE(RE_NAME,GL_FLAG) \
1100 void enable##RE_NAME () { if( myState.my##RE_NAME##State != 1 ) { ::glEnable( GL_FLAG ); myState.my##RE_NAME##State = 1; } } \
1101 void disable##RE_NAME () { if( myState.my##RE_NAME##State != 0 ) { ::glDisable( GL_FLAG ); myState.my##RE_NAME##State = 0; } } \
1102 bool get##RE_NAME () { if(myState.my##RE_NAME##State == 3) update##RE_NAME(); return (myState.my##RE_NAME##State ==1); } \
1103 void update##RE_NAME () { myState.my##RE_NAME##State = ::glIsEnabled( GL_FLAG ); } \
1104 void invalidate##RE_NAME() { myState.my##RE_NAME##State = 3; }
1109 #undef RE_FLAG_STATE
1111 #define RE_FLAG_11_STATE(RE_NAME,GL_FLAG) \
1112 void enable##RE_NAME () { if( (myState.my##RE_NAME##State) != 1 && hasGL11() ) {::glEnable( GLenum(GL_FLAG) ); myState.my##RE_NAME##State = 1; } } \
1113 void disable##RE_NAME () { if( myState.my##RE_NAME##State && hasGL11() ) { ::glDisable( GLenum(GL_FLAG) ); myState.my##RE_NAME##State = 0; } } \
1114 bool get##RE_NAME () { if(myState.my##RE_NAME##State == 3) update##RE_NAME(); return (myState.my##RE_NAME##State==1) ; } \
1115 void update##RE_NAME () { if( hasGL11() ) { myState.my##RE_NAME##State = ::glIsEnabled( GLenum(GL_FLAG) ); } else { myState.my##RE_NAME##State = 0; } } \
1116 void invalidate##RE_NAME() { if(hasGL11()) myState.my##RE_NAME##State=3; }
1121 #undef RE_FLAG_11_STATE
1123 void updateOffsetAmount();
1125 static bool initGLVersionInfo();
1126 #if !defined(EXPERIMENTAL_QOPENGLWIDGET)
1127 virtual void initGLState();
1129 virtual void initGLExtensions();
1130 virtual void updateGLState();
1131 virtual void updateStacks();
1134 static void determineTwinView();
1135 bool switchContextForRender(
bool ignore_errors);
1141 void updateBlendSmoothState();
1142 int privPushBlendSmoothState(
bool smooth_too);
1143 void privPopBlendSmoothState(
bool smooth_too,
int *idx);
1145 void setupDebugging();
1147 void freePendingObjects();
1151 void assignPushedUniforms();
1157 void updateViewport();
1163 static RE_SOperation oglToREsoperation(
int oglSOperation );
1166 static const char *bufferName(
GLint e);
1167 static const char *faceName(
GLint e);
1168 static const char *hintName(
GLint e);
1169 static const char *cullName(
GLint e);
1188 #if defined(EXPERIMENTAL_QOPENGLWIDGET)
1190 bool myDrawableInitialized;
1327 void suspendTestPatternRender();
1328 bool suspendTestPatternCheck();
1346 #if defined(EXPERIMENTAL_QOPENGLWIDGET)
1350 void lockContextInternal_(
bool set_current_context);
1351 void unlockContextInternal_(
bool clear_current_context);
1362 if(!myR->isContextLocked())
1364 myR->lockContextForRender();
1365 myLockedFlag =
true;
1373 myR->unlockContextAfterRender();
1470 return (
float)n /
dpi();
1488 if (scaled_size < 1.0)
1491 return (
int)scaled_size;
1507 if (ui_scale == 1.0)
1554 enablePointOffset();
1556 disablePointOffset();
1565 disableLineOffset();
1574 disableFillOffset();
int getMaxDrawBuffers() const
UT_IntArray myPendingDeleteFBOs
RE_OGLExt * getExt() const
static int scaledSize(int size)
static int getDriverMajorVersion()
GLenum GLuint GLenum GLsizei const GLchar * buf
RE_PrimType getFeedbackMode() const
bool isRasterizeEnabled() const
int myDebugGroupStackSize
RV_API RV_VKImagePtr getRandomTextureArray(RV_Render *r, unsigned int seed, bool interp, int num_layers, int size=64)
Returns an 8b RGBA size^2 2D texture array of size 'num_layers'.
bool isInitialized() const
UT_Vector2F myLineWidthRange
bool isFrontBufferDirty() const
void setPointSize(fpreal32 size)
OGLDrawable myPushedDrawable
static int inchesToPixels(float i)
void rasterize(const PointDataTreeOrGridT &points, TransferT &transfer, const FilterT &filter=NullFilter(), InterrupterT *interrupter=nullptr)
Perform potentially complex rasterization from a user defined transfer scheme.
#define RE_FLAG_11_STATE(RE_NAME, GL_FLAG)
int myFragmentDerivativeHint
int getMaxTexture3DSize() const
static RE_GraphicsDevice theDevice
static int theDriverBuildMinor
RE_OGLFramebuffer * mySuspendTestFBO
RE_PrimType myTransformFeedbackType
GLdouble GLdouble GLdouble z
#define GL_POLYGON_OFFSET_POINT
bool myDebugLabelSupported
int64 myBuiltInUniformSerial
A collection of vertex arrays defining a geometry object. This class acts as a wrapper around multipl...
static UT_Array< std::pair< RE_Visual *, RE_DisplayMode > > theVisuals
GLenum GLenum GLsizei void * image
static int allowsSmoothLines()
UT_IntArray myPendingDeleteQueries
void pointOffset(bool onoff)
GLdouble GLdouble GLdouble q
UT_IntArray myClipDistance
bool subBufferDrawingEnabled() const
int myMaxTextureAnisotropy
UT_RecursiveSpinLock myOpenGLLock
GLenum GLenum GLenum dppass
int getViewportFontOffsetX() const
static int glMinorVersion()
static RE_GraphicsDevice getGraphicsDevice()
#define GL_POLYGON_OFFSET_FILL
void lineOffset(bool onoff)
static int minorGLVersion
GLenum GLuint GLint GLint layer
std::unique_ptr< T, Deleter > UT_UniquePtr
A smart pointer for unique ownership of dynamically allocated objects.
static RE_WindowList * theWindowList
vint4 blend(const vint4 &a, const vint4 &b, const vbool4 &mask)
int myMaxDebugGroupStackSize
RE_OGLTexture * mySuspendTestTexture
void getOffsetAmount(float *variable, float *constant) const
GA_API const UT_StringHolder scale
UT_IntArray myPendingDeleteVertexArrays
int getMaxColorBuffers() const
int getOGLMaxClipPlanes()
RE_Window * currentWindow
RE_Uniform * getUniform(RE_UniformBuiltIn builtin_var_type) const
bool myDebuggingSupported
static int getDriverMinorVersion()
int myMaxTextureGeometryUnits
int getBlendSmoothLevel() const
UT_IntArray & getBoundUniformBlocks()
RE_OcclusionQuery * myActiveQuery
int getMaxShaderTextureUnits() const
int getMaxVertexTextureUnits() const
void bumpBuiltInUniformSerial()
static RE_Window * theMainContextWindow
static int theDriverMajor
RE_Geometry * mySuspendBox
unsigned int RE_TextureID
GLuint GLint GLboolean layered
UT_StopWatch * mySuspendCheckTimer
GLint GLint GLsizei GLint GLenum format
bool contextIsValid() const
GLint GLenum GLboolean GLsizei stride
bool myActiveConditionalRender
static RE_Server * theServer
UT_ArrayMap< int, RE_OGLFramebuffer * > myFBOTable
int getViewportFontOffsetY() const
HUSD_API const char * raster()
static RE_Window * getMainContext()
static int getDriverBuildMinorVersion()
png_const_structrp png_const_inforp int * unit
GLfloat GLfloat GLfloat alpha
#define RE_MAX_TEXTURE_STATE_STACK
SIM_API const UT_StringHolder rotation
UT_Array< RE_FeedbackPrimitivesWrittenQuery * > myTransformFeedbackWrittenQuery
int myViewportFontOffsetY
GLuint const GLchar * name
OPENVDB_API void initialize()
Global registration of native Grid, Transform, Metadata and Point attribute types. Also initializes blosc (if enabled).
static UT_ThreadSpecificValue< RE_OGLRender * > theCurrentRender
void polygonOffset(bool onoff)
int myMaxTextureFragmentUnits
int myMaxTransformFeedbackComponents
static void allowSmoothLines(int yn)
GLboolean GLboolean GLboolean b
RE_OGLFramebuffer * mySuspendResultFBO
bool myContextInitialized
int myMaxTextureVertexUnits
fpreal32 SYSrint(fpreal32 val)
#define RE_FLAG_STATE(RE_NAME, GL_FLAG)
bool hasExtension(RE_Extension ext)
RE_OGLTexture * mySuspendResultTexture
int getMaxTextureSize() const
RE_OGLVertexArrayList * getDefaultVAO()
bool hasGLExtension(RE_Extension e) const
int getMaxFragmentTextureUnits() const
RE_OGLContext getContext() const
static int theDotsPerInch
int myViewportFontOffsetX
int myShaderOnlyModeCount
static int theDriverBuildMajor
const RE_Render * getRender() const
static int getDriverBuildMajorVersion()
static bool theSmoothLinesAllowed
GLfloat GLfloat GLfloat GLfloat h
RE_RenderAutoLock(RE_OGLRender *r)
static RE_WindowList * getWindowList()
void pushPointSize(fpreal32 size)
Point options that can change per-point.
bool isTransformFeedbackEnabled() const
SIM_API const UT_StringHolder force
UT_Array< RE_Uniform * > myPushedUniforms
int64 getBuiltInUniformSerial() const
bool myIsAllowingOtherThreads
static int theDriverMinor
const RE_Window * getCurrentWindow() const
static bool hasGL4(int minor)
bool isDebugLabelSupported() const
int myMaxTextureShaderUnits
fpreal myShaderSampleRate
int getTextureAnisotropyLimit() const
ut_thread_id_t myNativeThread
int myMaxTransformFeedbackBuffers
static float pixelsToInches(int n)
static bool hasDriverVersion()
RV_API RV_VKImagePtr getRandomTexture(RV_Render *r, unsigned int seed, bool interp, int size=64)
Returns an 8b RGBA 64x64 texture with 0-1 random values in all comps.
int64 getRenderCount() const
GLubyte GLubyte GLubyte GLubyte w
bool myTransformFeedbackEnabled
int getMaxVertexAttribs() const
static bool theUsingCoreProfile
RE_Window * mySavedMainThreadCurrentWindow
static bool hasGL3(int minor)
RE_OGLVertexArrayList * myCurrentVAO
re_BlendSmoothState myBlendSmoothStack[RE_SMOOTH_STACK_SIZE]
int getMaxGeometryTextureUnits() const
void popUniformData(RE_UniformBuiltIn bindex)
void setDefaultVAO(RE_OGLVertexArrayList *vao)
static UT_ThreadSpecificValue< RE_OGLRender * > theLastRender
int getMaxTextureRectangleSize()
QOpenGLContext * RE_OGLContext
RE_Uniform * myBuiltInUniforms[RE_UNIFORM_BUILT_IN__count]
void setFrontBufferDirty(bool d)
UT_Array< RE_PrimitivesGeneratedQuery * > myTransformFeedbackPrimitiveQuery
UT_Array< re_ConstVertexAttrib > myConstVertexAttribs
RE_Shader * myShaderOnlyActiveShader
png_structrp int png_fixed_point red
RV_API RV_VKImagePtr getRandomTexture3D(RV_Render *r, unsigned int seed, bool interp, int size=32)
Returns an 8b RGBA size^3 3D texture with 0-1 random values.
#define RE_BUFFER_STACK_SIZE
RE_OGLVertexArrayList * myDefaultVAO
RE_OGLContext pushedGraphicsContext
bool myMultisampleAlphaToCoverage
int myOpenGLContextLockCount
static int majorGLVersion
#define GL_POLYGON_OFFSET_LINE
GA_API const UT_StringHolder area
static RE_OGLRender * getCurrentRender()
Simple interface to building a shader from a .prog file.
static int glMajorVersion()