diff options
Diffstat (limited to 'Samples/CommonSrc/Render/Render_GL_Device.h')
-rw-r--r-- | Samples/CommonSrc/Render/Render_GL_Device.h | 234 |
1 files changed, 207 insertions, 27 deletions
diff --git a/Samples/CommonSrc/Render/Render_GL_Device.h b/Samples/CommonSrc/Render/Render_GL_Device.h index 0e24517..620d1bb 100644 --- a/Samples/CommonSrc/Render/Render_GL_Device.h +++ b/Samples/CommonSrc/Render/Render_GL_Device.h @@ -5,7 +5,7 @@ Content : RenderDevice implementation header for OpenGL Created : September 10, 2012 Authors : Andrew Reisse, David Borel -Copyright : Copyright 2012 Oculus VR, Inc. All Rights reserved. +Copyright : Copyright 2012 Oculus VR, LLC All Rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -62,6 +62,7 @@ extern PFNGLXSWAPINTERVALEXTPROC glXSwapIntervalEXT; #endif +extern PFNGLGETSTRINGIPROC glGetStringi; extern PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers; extern PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers; extern PFNGLDELETESHADERPROC glDeleteShader; @@ -102,6 +103,7 @@ extern PFNGLUNIFORM3FVPROC glUniform3fv; extern PFNGLUNIFORM2FVPROC glUniform2fv; extern PFNGLUNIFORM1FVPROC glUniform1fv; extern PFNGLCOMPRESSEDTEXIMAGE2DPROC glCompressedTexImage2D; +extern PFNGLTEXIMAGE2DMULTISAMPLEPROC glTexImage2DMultisample; extern PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage; extern PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer; extern PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers; @@ -109,6 +111,7 @@ extern PFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers; extern PFNGLGENVERTEXARRAYSPROC glGenVertexArrays; extern PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays; extern PFNGLBINDVERTEXARRAYPROC glBindVertexArray; +extern PFNGLBLITFRAMEBUFFEREXTPROC glBlitFramebuffer; extern void InitGLExtensions(); @@ -116,22 +119,26 @@ extern void InitGLExtensions(); -//// GLVersion - -/* - FIXME: CODE DUPLICATION WARNING - - Right now we have this same code in CommonSrc and in CAPI::GL. - At some point we need to consolidate these, in Kernel or Util. - Be sure to update both locations for now! -*/ - -struct GLVersionAndExtensions +//// GLVersionAndExtensions +// +// FIXME: CODE DUPLICATION WARNING +// Right now we have this same code in CommonSrc and in CAPI::GL. +// At some point we need to consolidate these, in Kernel or Util. +// Be sure to update both locations for now! +// +// This class needs to be initialized at runtime with GetGLVersionAndExtensions, +// after an OpenGL context has been created. It must be re-initialized any time +// a new OpenGL context is created, as the new context may differ in version or +// supported functionality. +class GLVersionAndExtensions { +public: // Version information int MajorVersion; // Best guess at major version int MinorVersion; // Best guess at minor version + int WholeVersion; // Equals ((MajorVersion * 100) + MinorVersion). Example usage: if(glv.WholeVersion >= 302) // If OpenGL v3.02+ ... bool IsGLES; // Open GL ES? + bool IsCoreProfile; // Is the current OpenGL context a core profile context? Its trueness may be a false positive but will never be a false negative. // Extension information bool SupportsVAO; // Supports Vertex Array Objects? @@ -139,19 +146,185 @@ struct GLVersionAndExtensions const char* Extensions; // Other extensions string (will not be null) GLVersionAndExtensions() + : MajorVersion(0), + MinorVersion(0), + WholeVersion(0), + IsGLES(false), + IsCoreProfile(false), + SupportsDrawBuffers(false), + SupportsVAO(false), + Extensions("") { - IsGLES = false; - MajorVersion = 0; - MinorVersion = 0; - SupportsDrawBuffers = false; - SupportsVAO = false; - Extensions = ""; } + + bool HasGLExtension(const char* searchKey) const; + +protected: + friend void GetGLVersionAndExtensions(GLVersionAndExtensions& versionInfo); + + void ParseGLVersion(); + void ParseGLExtensions(); }; void GetGLVersionAndExtensions(GLVersionAndExtensions& versionInfo); + +//// DebugCallback +// +// Used for high level usage and control of the various OpenGL debug output extensions. This is useful for +// intercepting all OpenGL errors in a single place. +// This functionality is specific to OpenGL and no analog exists in DirectX, as DirectX doesn't support +// debug callbacks. +// +// Example basic usage: +// DebugCallback glDebug; +// +// <initialize OpenGL context> +// glDebug.Initialize(); +// glDebug.SetMinSeverity(SeverityMedium, SeverityHigh); +// <use OpenGL. Debug output will be logged by default.> +// glDebug.Shutdown(); +// <destroy OpenGL context> +// +// There are three OpenGL API debug interfaces, each being an evolution of its predecessor: +// AMD_debug_output - https://www.opengl.org/registry/specs/AMD/debug_output.txt +// ARB_debug_output - https://www.opengl.org/registry/specs/ARB/debug_output.txt +// KHR_debug - https://www.opengl.org/registry/specs/KHR/debug.txt +// +// If the AMD_debug_output functionality is present in the OpenGL headers, GL_AMD_debug_output will be defined by glext.h. +// If the ARB_debug_output functionality is present in the OpenGL headers, GL_ARB_debug_output will be defined by glext.h. +// If the KHR_debug functionality is present in the OpenGL headers, GL_KHR_debug will be defined. +// +// As of at least XCode 5.1, debug functionality isn't yet supported by Macintosh OS X. +// KHR_debug is part of the OpenGL 4.3 core profile. It uses the same interface as the ARB extension along with some additions. +// The KHR_debug functionality doesn't include an API suffix (e.g. you would call glDebugMessageCallback). +// OpenGL ES supports KHR debug callbacks as of v3.1. However, for OpenGL ES entry points use the "KHR" suffix (e.g. glDebugMessageCallbackKHR). +// With the KHR version you can control debug messages at runtime with glEnable/glDisable(DEBUG_OUTPUT). +// The KHR_debug functionality requires that the OpenGL context be created with the CONTEXT_FLAG_DEBUG_BIT. +// Windows wglCreateContextAttribsARB should be done with WGL_CONTEXT_DEBUG_BIT_ARB with in WGL_CONTEXT_FLAGS. +// Linux glXCreateContext should be done with GLX_CONTEXT_DEBUG_BIT_ARB set in GLX_CONTEXT_FLAGS. + +// We manually declare types and define values that aren't already declared and defined. This is because this functionality +// is fairly recent (2010 through 2014) and isn't present in all OpenGL headers and implementations. +#ifndef GL_AMD_debug_output + typedef void (APIENTRY *GLDEBUGPROCAMD)(GLuint id, GLenum category, GLenum severity, GLsizei length, const GLchar *message, GLvoid *userParam); + typedef void (APIENTRYP PFNGLDEBUGMESSAGEENABLEAMDPROC) (GLenum category, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); + typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKAMDPROC)(GLDEBUGPROCAMD callback, GLvoid *userParam); + + #define GL_DEBUG_CATEGORY_API_ERROR_AMD 0x9149 + #define GL_DEBUG_CATEGORY_OTHER_AMD 0x9150 + #define GL_DEBUG_SEVERITY_LOW_AMD 0x9148 +#endif + +#ifndef GL_ARB_debug_output + typedef void (APIENTRY *GLDEBUGPROCARB)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, GLvoid *userParam); + typedef void (APIENTRYP PFNGLDEBUGMESSAGECONTROLARBPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); + typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKARBPROC)(GLDEBUGPROCARB callback, const void *userParam); + + // We don't define anything here because the defines are the same as the KHR defines below (aside from the _ARB suffix). +#endif + +#ifndef GL_KHR_debug // The following defines were added to OpenGL 4.3+ headers. + typedef void (APIENTRY *GLDEBUGPROC)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, GLvoid *userParam); + typedef void (APIENTRYP PFNGLDEBUGMESSAGECONTROLPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); + typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKPROC)(GLDEBUGPROC callback, const void *userParam); + + #define GL_DEBUG_CALLBACK_FUNCTION 0x8244 + #define GL_DEBUG_CALLBACK_USER_PARAM 0x8245 + #define GL_DEBUG_TYPE_MARKER 0x8268 + #define GL_DEBUG_TYPE_PUSH_GROUP 0x8269 + #define GL_DEBUG_TYPE_POP_GROUP 0x826A + #define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242 + #define GL_DEBUG_SEVERITY_NOTIFICATION 0x826b + #define GL_DEBUG_SEVERITY_LOW 0x9148 + #define GL_DEBUG_SEVERITY_MEDIUM 0x9147 + #define GL_DEBUG_SEVERITY_HIGH 0x9146 + #define GL_DEBUG_SOURCE_APPLICATION 0x824A + #define GL_DEBUG_SOURCE_OTHER 0x824b + #define GL_DEBUG_SOURCE_API 0x8246 + #define GL_DEBUG_TYPE_ERROR 0x824C + #define GL_DEBUG_TYPE_OTHER 0x8251 + #define GL_DEBUG_OUTPUT 0x92E0 +#endif + + +class DebugCallback +{ +public: + DebugCallback(); + ~DebugCallback(); + + // Initialize must be called after the OpenGL context is created. + void Initialize(); + + // Shutdown must be called before the OpenGL context is destroyed. + void Shutdown(); + + enum Implementation + { + ImplementationNone, + ImplementationAMD, // Oldest version, deprecated by later versions. + ImplementationARB, // ARB version, deprecated by KHR version. + ImplementationKHR // OpenGL 4.3+ core profile version. + }; + + // Will return ImplementationNone until Initialize has been called, at which point it will return the version used. + Implementation GetImplementation() const; + + // Maps to glEnable(GL_DEBUG_OUTPUT) when it is available, else does nothing. This controls debug output at the driver + // level and can be used, for example, to temporarily disable debug output that some other application entity enabled + // via glDebugMessageCallback. In practice this is available only when KHR_debug is available + void EnableGLDebug(bool enabled); + + enum Severity // These are a mirror of the OpenGL types. + { + SeverityNone = 0, + SeverityNotification, + SeverityLow, + SeverityMedium, + SeverityHigh, + SeverityDisabled // When min severity is set to this level, it is never logged or assertion-failed. + }; + + // Set the severity required before we log or assert on a debug message. Default is SeverityHigh/SeverityHigh. + void SetMinSeverity(Severity minLogSeverity, Severity minAssertSeverity); + + // Returns the debug callback currently used by OpenGL. + // This works for both ARB and KHR implementations. The same debug callback is used by OpenGL implementations for both. + // However, you can call GetImplementation to see which of the two we are using. This functionality is not available + // with the AMD implementation. Returns false and sets debugCallback and userParam to NULL if there is no existing callback. + bool GetGLDebugCallback(PFNGLDEBUGMESSAGECALLBACKPROC* debugCallback, const void** userParam) const; + +protected: + void DebugCallbackInternal(Severity s, const char* pSource, const char* pType, GLuint id, const char* pSeverity, const char* message); + + // ARB and KHR debug handler + static void APIENTRY DebugMessageCallback(GLenum Source, GLenum Type, GLuint Id, GLenum Severity, GLsizei Length, const GLchar* Message, GLvoid* UserParam); + static const char* GetSource(GLenum Source); + static const char* GetType(GLenum Type); + static const char* GetSeverity(GLenum Severity); + + // AMD handler + static void APIENTRY DebugMessageCallbackAMD(GLuint id, GLenum category, GLenum severity, GLsizei length, const GLchar *message, GLvoid *userParam); + static const char* GetCategoryAMD(GLenum Category); + +protected: + bool Initialized; + int MinLogSeverity; // Minimum severity for us to log the event. + int MinAssertSeverity; // Minimum severity for us to assertion-fail the event. + PFNGLDEBUGMESSAGECALLBACKPROC glDebugMessageCallback; + PFNGLDEBUGMESSAGECONTROLPROC glDebugMessageControl; + PFNGLDEBUGMESSAGECALLBACKARBPROC glDebugMessageCallbackARB; // glDebugMessageCallbackARB is the same as glDebugMessageCallback and may not need to be a separate variable. + PFNGLDEBUGMESSAGECONTROLARBPROC glDebugMessageControlARB; + PFNGLDEBUGMESSAGECALLBACKAMDPROC glDebugMessageCallbackAMD; + PFNGLDEBUGMESSAGEENABLEAMDPROC glDebugMessageControlAMD; +}; + + + + + class RenderDevice; class Buffer : public Render::Buffer @@ -179,16 +352,17 @@ class Texture : public Render::Texture public: RenderDevice* Ren; GLuint TexId; - int Width, Height; + int Width, Height, Samples; - Texture(RenderDevice* r, int w, int h); + Texture(RenderDevice* r, int w, int h, int samples); ~Texture(); virtual int GetWidth() const { return Width; } virtual int GetHeight() const { return Height; } + virtual int GetSamples() const { return Samples; } virtual void SetSampleMode(int); - virtual ovrTexture Get_ovrTexture(); + virtual ovrTexture Get_ovrTexture(); virtual void Set(int slot, ShaderStage stage = Shader_Fragment) const; }; @@ -204,7 +378,7 @@ public: Compile(src); } - ~Shader(); + ~Shader(); bool Compile(const char* src); GLenum GLStage() const @@ -231,6 +405,8 @@ public: String Name; int Location, Size; int Type; // currently number of floats in vector + + Uniform() : Name(), Location(0), Size(0), Type(0){} }; Array<Uniform> UniformInfo; @@ -243,7 +419,7 @@ public: ~ShaderSet(); virtual void SetShader(Render::Shader *s); - virtual void UnsetShader(int stage); + virtual void UnsetShader(int stage); virtual void Set(PrimitiveType prim) const; @@ -275,14 +451,15 @@ class RenderDevice : public Render::RenderDevice Matrix4f Proj; - GLuint Vao; + GLuint Vao; protected: Ptr<Texture> CurRenderTarget; Array<Ptr<Texture> > DepthBuffers; GLuint CurrentFbo; + GLuint MsaaFbo; GLVersionAndExtensions GLVersionInfo; - + DebugCallback DebugCallbackControl; const LightingParams* Lighting; public: @@ -290,11 +467,11 @@ public: virtual ~RenderDevice(); virtual void Shutdown(); - + virtual void FillTexturedRect(float left, float top, float right, float bottom, float ul, float vt, float ur, float vb, Color c, Ptr<OVR::Render::Texture> tex); virtual void SetViewport(const Recti& vp); - + virtual void WaitUntilGpuIdle(); virtual void Flush(); @@ -308,6 +485,8 @@ public: Texture* GetDepthBuffer(int w, int h, int ms); + virtual void ResolveMsaa(OVR::Render::Texture* msaaTex, OVR::Render::Texture* outputTex) OVR_OVERRIDE; + virtual void Present (bool withVsync){OVR_UNUSED(withVsync);}; virtual void SetRenderTarget(Render::Texture* color, Render::Texture* depth = NULL, Render::Texture* stencil = NULL); @@ -332,6 +511,7 @@ public: }; + }}} #endif |