|
@@ -28,6 +28,8 @@
|
|
* #define RLGL_STANDALONE
|
|
* #define RLGL_STANDALONE
|
|
* Use rlgl as standalone library (no raylib dependency)
|
|
* Use rlgl as standalone library (no raylib dependency)
|
|
*
|
|
*
|
|
|
|
+* #define SUPPORT_GL_DETAILS_INFO
|
|
|
|
+* Show OpenGL extensions and capabilities detailed logs on init
|
|
*
|
|
*
|
|
* DEPENDENCIES:
|
|
* DEPENDENCIES:
|
|
* raymath - 3D math functionality (Vector3, Matrix, Quaternion)
|
|
* raymath - 3D math functionality (Vector3, Matrix, Quaternion)
|
|
@@ -837,7 +839,7 @@ typedef struct rlglData {
|
|
bool texMirrorClamp; // Clamp mirror wrap mode supported (GL_EXT_texture_mirror_clamp)
|
|
bool texMirrorClamp; // Clamp mirror wrap mode supported (GL_EXT_texture_mirror_clamp)
|
|
bool texAnisoFilter; // Anisotropic texture filtering support (GL_EXT_texture_filter_anisotropic)
|
|
bool texAnisoFilter; // Anisotropic texture filtering support (GL_EXT_texture_filter_anisotropic)
|
|
|
|
|
|
- float maxAnisotropicLevel; // Maximum anisotropy level supported (minimum is 2.0f)
|
|
|
|
|
|
+ float maxAnisotropyLevel; // Maximum anisotropy level supported (minimum is 2.0f)
|
|
int maxDepthBits; // Maximum bits for depth component
|
|
int maxDepthBits; // Maximum bits for depth component
|
|
|
|
|
|
} ExtSupported; // Extensions supported flags
|
|
} ExtSupported; // Extensions supported flags
|
|
@@ -869,6 +871,9 @@ static PFNGLVERTEXATTRIBDIVISOREXTPROC glVertexAttribDivisor = NULL;
|
|
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
|
|
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
|
|
static void rlLoadShaderDefault(void); // Load default shader (RLGL.State.defaultShader)
|
|
static void rlLoadShaderDefault(void); // Load default shader (RLGL.State.defaultShader)
|
|
static void rlUnloadShaderDefault(void); // Unload default shader (RLGL.State.defaultShader)
|
|
static void rlUnloadShaderDefault(void); // Unload default shader (RLGL.State.defaultShader)
|
|
|
|
+#if defined(SUPPORT_GL_DETAILS_INFO)
|
|
|
|
+static char *rlGetCompressedFormatName(int format); // Get compressed format official GL identifier name
|
|
|
|
+#endif // SUPPORT_GL_DETAILS_INFO
|
|
#endif // GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2
|
|
#endif // GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2
|
|
#if defined(GRAPHICS_API_OPENGL_11)
|
|
#if defined(GRAPHICS_API_OPENGL_11)
|
|
static int rlGenerateMipmapsData(unsigned char *data, int baseWidth, int baseHeight); // Generate mipmaps data on CPU side
|
|
static int rlGenerateMipmapsData(unsigned char *data, int baseWidth, int baseHeight); // Generate mipmaps data on CPU side
|
|
@@ -1346,10 +1351,10 @@ void rlTextureParameters(unsigned int id, int param, int value)
|
|
case RL_TEXTURE_FILTER_ANISOTROPIC:
|
|
case RL_TEXTURE_FILTER_ANISOTROPIC:
|
|
{
|
|
{
|
|
#if !defined(GRAPHICS_API_OPENGL_11)
|
|
#if !defined(GRAPHICS_API_OPENGL_11)
|
|
- if (value <= RLGL.ExtSupported.maxAnisotropicLevel) glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, (float)value);
|
|
|
|
- else if (RLGL.ExtSupported.maxAnisotropicLevel > 0.0f)
|
|
|
|
|
|
+ if (value <= RLGL.ExtSupported.maxAnisotropyLevel) glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, (float)value);
|
|
|
|
+ else if (RLGL.ExtSupported.maxAnisotropyLevel > 0.0f)
|
|
{
|
|
{
|
|
- TRACELOG(LOG_WARNING, "GL: Maximum anisotropic filter level supported is %iX", id, RLGL.ExtSupported.maxAnisotropicLevel);
|
|
|
|
|
|
+ TRACELOG(LOG_WARNING, "GL: Maximum anisotropic filter level supported is %iX", id, RLGL.ExtSupported.maxAnisotropyLevel);
|
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, (float)value);
|
|
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, (float)value);
|
|
}
|
|
}
|
|
else TRACELOG(LOG_WARNING, "GL: Anisotropic filtering not supported");
|
|
else TRACELOG(LOG_WARNING, "GL: Anisotropic filtering not supported");
|
|
@@ -1577,72 +1582,141 @@ void rlSetBlendFactors(int glSrcFactor, int glDstFactor, int glEquation)
|
|
// Initialize rlgl: OpenGL extensions, default buffers/shaders/textures, OpenGL states
|
|
// Initialize rlgl: OpenGL extensions, default buffers/shaders/textures, OpenGL states
|
|
void rlglInit(int width, int height)
|
|
void rlglInit(int width, int height)
|
|
{
|
|
{
|
|
- // Check OpenGL information and capabilities
|
|
|
|
- //------------------------------------------------------------------------------
|
|
|
|
- // Print current OpenGL and GLSL version
|
|
|
|
- TRACELOG(LOG_INFO, "GL: OpenGL device information:");
|
|
|
|
- TRACELOG(LOG_INFO, " > Vendor: %s", glGetString(GL_VENDOR));
|
|
|
|
- TRACELOG(LOG_INFO, " > Renderer: %s", glGetString(GL_RENDERER));
|
|
|
|
- TRACELOG(LOG_INFO, " > Version: %s", glGetString(GL_VERSION));
|
|
|
|
- TRACELOG(LOG_INFO, " > GLSL: %s", glGetString(GL_SHADING_LANGUAGE_VERSION));
|
|
|
|
|
|
+#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
|
|
|
|
+ // Init default white texture
|
|
|
|
+ unsigned char pixels[4] = { 255, 255, 255, 255 }; // 1 pixel RGBA (4 bytes)
|
|
|
|
+ RLGL.State.defaultTextureId = rlLoadTexture(pixels, 1, 1, PIXELFORMAT_UNCOMPRESSED_R8G8B8A8, 1);
|
|
|
|
|
|
- // NOTE: We can get a bunch of extra information about GPU capabilities (glGet*)
|
|
|
|
- //int maxTexSize;
|
|
|
|
- //glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTexSize);
|
|
|
|
- //TRACELOG(LOG_INFO, "GL: Maximum texture size: %i", maxTexSize);
|
|
|
|
|
|
+ if (RLGL.State.defaultTextureId != 0) TRACELOG(LOG_INFO, "TEXTURE: [ID %i] Default texture loaded successfully", RLGL.State.defaultTextureId);
|
|
|
|
+ else TRACELOG(LOG_WARNING, "TEXTURE: Failed to load default texture");
|
|
|
|
|
|
- //GL_MAX_TEXTURE_IMAGE_UNITS
|
|
|
|
- //GL_MAX_VIEWPORT_DIMS
|
|
|
|
|
|
+ // Init default Shader (customized for GL 3.3 and ES2)
|
|
|
|
+ rlLoadShaderDefault(); // RLGL.State.defaultShader
|
|
|
|
+ RLGL.State.currentShader = RLGL.State.defaultShader;
|
|
|
|
|
|
- //int numAuxBuffers;
|
|
|
|
- //glGetIntegerv(GL_AUX_BUFFERS, &numAuxBuffers);
|
|
|
|
- //TRACELOG(LOG_INFO, "GL: Number of aixiliar buffers: %i", numAuxBuffers);
|
|
|
|
|
|
+ // Init default vertex arrays buffers
|
|
|
|
+ RLGL.defaultBatch = rlLoadRenderBatch(DEFAULT_BATCH_BUFFERS, DEFAULT_BATCH_BUFFER_ELEMENTS);
|
|
|
|
+ RLGL.currentBatch = &RLGL.defaultBatch;
|
|
|
|
|
|
- //GLint numComp = 0;
|
|
|
|
- //GLint format[32] = { 0 };
|
|
|
|
- //glGetIntegerv(GL_NUM_COMPRESSED_TEXTURE_FORMATS, &numComp);
|
|
|
|
- //glGetIntegerv(GL_COMPRESSED_TEXTURE_FORMATS, format);
|
|
|
|
- //for (int i = 0; i < numComp; i++) TRACELOG(LOG_INFO, "GL: Supported compressed format: 0x%x", format[i]);
|
|
|
|
|
|
+ // Init stack matrices (emulating OpenGL 1.1)
|
|
|
|
+ for (int i = 0; i < MAX_MATRIX_STACK_SIZE; i++) RLGL.State.stack[i] = MatrixIdentity();
|
|
|
|
|
|
- // NOTE: We don't need that much data on screen... right now...
|
|
|
|
|
|
+ // Init internal matrices
|
|
|
|
+ RLGL.State.transform = MatrixIdentity();
|
|
|
|
+ RLGL.State.projection = MatrixIdentity();
|
|
|
|
+ RLGL.State.modelview = MatrixIdentity();
|
|
|
|
+ RLGL.State.currentMatrix = &RLGL.State.modelview;
|
|
|
|
+#endif // GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2
|
|
|
|
|
|
- // TODO: Automatize extensions loading using rlLoadExtensions() and GLAD
|
|
|
|
- // Actually, when rlglInit() is called in InitWindow() in core.c,
|
|
|
|
- // OpenGL context has already been created and required extensions loaded
|
|
|
|
|
|
+ // Initialize OpenGL default states
|
|
|
|
+ //----------------------------------------------------------
|
|
|
|
+ // Init state: Depth test
|
|
|
|
+ glDepthFunc(GL_LEQUAL); // Type of depth testing to apply
|
|
|
|
+ glDisable(GL_DEPTH_TEST); // Disable depth testing for 2D (only used for 3D)
|
|
|
|
+
|
|
|
|
+ // Init state: Blending mode
|
|
|
|
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Color blending function (how colors are mixed)
|
|
|
|
+ glEnable(GL_BLEND); // Enable color blending (required to work with transparencies)
|
|
|
|
+
|
|
|
|
+ // Init state: Culling
|
|
|
|
+ // NOTE: All shapes/models triangles are drawn CCW
|
|
|
|
+ glCullFace(GL_BACK); // Cull the back face (default)
|
|
|
|
+ glFrontFace(GL_CCW); // Front face are defined counter clockwise (default)
|
|
|
|
+ glEnable(GL_CULL_FACE); // Enable backface culling
|
|
|
|
+
|
|
|
|
+ // Init state: Cubemap seamless
|
|
|
|
+#if defined(GRAPHICS_API_OPENGL_33)
|
|
|
|
+ glEnable(GL_TEXTURE_CUBE_MAP_SEAMLESS); // Seamless cubemaps (not supported on OpenGL ES 2.0)
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+#if defined(GRAPHICS_API_OPENGL_11)
|
|
|
|
+ // Init state: Color hints (deprecated in OpenGL 3.0+)
|
|
|
|
+ glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Improve quality of color and texture coordinate interpolation
|
|
|
|
+ glShadeModel(GL_SMOOTH); // Smooth shading between vertex (vertex colors interpolation)
|
|
|
|
+#endif
|
|
|
|
|
|
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
|
|
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
|
|
- // Get supported extensions list
|
|
|
|
|
|
+ // Store screen size into global variables
|
|
|
|
+ RLGL.State.framebufferWidth = width;
|
|
|
|
+ RLGL.State.framebufferHeight = height;
|
|
|
|
+
|
|
|
|
+ TRACELOG(LOG_INFO, "RLGL: Default OpenGL state initialized successfully");
|
|
|
|
+ //----------------------------------------------------------
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+ // Init state: Color/Depth buffers clear
|
|
|
|
+ glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Set clear color (black)
|
|
|
|
+ glClearDepth(1.0f); // Set clear depth value (default)
|
|
|
|
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear color and depth buffers (depth buffer required for 3D)
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// Vertex Buffer Object deinitialization (memory free)
|
|
|
|
+void rlglClose(void)
|
|
|
|
+{
|
|
|
|
+#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
|
|
|
|
+ rlUnloadRenderBatch(RLGL.defaultBatch);
|
|
|
|
+
|
|
|
|
+ rlUnloadShaderDefault(); // Unload default shader
|
|
|
|
+
|
|
|
|
+ glDeleteTextures(1, &RLGL.State.defaultTextureId); // Unload default texture
|
|
|
|
+ TRACELOG(LOG_INFO, "TEXTURE: [ID %i] Default texture unloaded successfully", RLGL.State.defaultTextureId);
|
|
|
|
+#endif
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// Load OpenGL extensions
|
|
|
|
+// NOTE: External loader function could be passed as a pointer
|
|
|
|
+void rlLoadExtensions(void *loader)
|
|
|
|
+{
|
|
|
|
+#if defined(GRAPHICS_API_OPENGL_33) // Also defined for GRAPHICS_API_OPENGL_21
|
|
|
|
+ // NOTE: glad is generated and contains only required OpenGL 3.3 Core extensions (and lower versions)
|
|
|
|
+ #if !defined(__APPLE__)
|
|
|
|
+ if (!gladLoadGLLoader((GLADloadproc)loader)) TRACELOG(LOG_WARNING, "GLAD: Cannot load OpenGL extensions");
|
|
|
|
+ else TRACELOG(LOG_INFO, "GLAD: OpenGL extensions loaded successfully");
|
|
|
|
+ #endif
|
|
|
|
+
|
|
|
|
+ // Get number of supported extensions
|
|
GLint numExt = 0;
|
|
GLint numExt = 0;
|
|
|
|
+ glGetIntegerv(GL_NUM_EXTENSIONS, &numExt);
|
|
|
|
+ TRACELOG(LOG_INFO, "GL: Supported extensions count: %i", numExt);
|
|
|
|
|
|
-#if defined(GRAPHICS_API_OPENGL_33) && !defined(GRAPHICS_API_OPENGL_21)
|
|
|
|
|
|
+#if defined(SUPPORT_GL_DETAILS_INFO)
|
|
|
|
+ // Get supported extensions list
|
|
|
|
+ // WARNING: glGetStringi() not available on OpenGL 2.1
|
|
|
|
+ char **extList = RL_MALLOC(sizeof(char *)*numExt);
|
|
|
|
+ TRACELOG(LOG_INFO, "GL: OpenGL extensions:");
|
|
|
|
+ for (int i = 0; i < numExt; i++)
|
|
|
|
+ {
|
|
|
|
+ extList[i] = (char *)glGetStringi(GL_EXTENSIONS, i);
|
|
|
|
+ TRACELOG(LOG_INFO, " %s", extList[i]);
|
|
|
|
+ }
|
|
|
|
+ RL_FREE(extList); // Free extensions pointers
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+ // Register supported extensions flags
|
|
// OpenGL 3.3 extensions supported by default (core)
|
|
// OpenGL 3.3 extensions supported by default (core)
|
|
RLGL.ExtSupported.vao = true;
|
|
RLGL.ExtSupported.vao = true;
|
|
RLGL.ExtSupported.instancing = true;
|
|
RLGL.ExtSupported.instancing = true;
|
|
RLGL.ExtSupported.texNPOT = true;
|
|
RLGL.ExtSupported.texNPOT = true;
|
|
RLGL.ExtSupported.texFloat32 = true;
|
|
RLGL.ExtSupported.texFloat32 = true;
|
|
RLGL.ExtSupported.texDepth = true;
|
|
RLGL.ExtSupported.texDepth = true;
|
|
|
|
+ RLGL.ExtSupported.maxDepthBits = 32;
|
|
|
|
+ RLGL.ExtSupported.texAnisoFilter = true;
|
|
|
|
+ RLGL.ExtSupported.texMirrorClamp = true;
|
|
|
|
+ // NOTE: With GLAD, we can check if an extension is supported using the GLAD_GL_xxx booleans
|
|
|
|
+ if (GLAD_GL_EXT_texture_compression_s3tc) RLGL.ExtSupported.texCompDXT = true; // Texture compression: DXT
|
|
|
|
+ if (GLAD_GL_ARB_ES3_compatibility) RLGL.ExtSupported.texCompETC2 = true; // Texture compression: ETC2/EAC
|
|
|
|
+#endif // GRAPHICS_API_OPENGL_33
|
|
|
|
|
|
- // We get a list of available extensions and we check for some of them (compressed textures)
|
|
|
|
- // NOTE: We don't need to check again supported extensions but we do (GLAD already dealt with that)
|
|
|
|
- glGetIntegerv(GL_NUM_EXTENSIONS, &numExt);
|
|
|
|
-
|
|
|
|
- // Allocate numExt strings pointers
|
|
|
|
- char **extList = RL_MALLOC(sizeof(char *)*numExt);
|
|
|
|
-
|
|
|
|
- // Get extensions strings
|
|
|
|
- for (int i = 0; i < numExt; i++) extList[i] = (char *)glGetStringi(GL_EXTENSIONS, i);
|
|
|
|
-#endif
|
|
|
|
-#if defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
|
|
|
|
- // Allocate 512 strings pointers (2 KB)
|
|
|
|
- const char **extList = RL_MALLOC(512*sizeof(const char *));
|
|
|
|
-
|
|
|
|
|
|
+#if defined(GRAPHICS_API_OPENGL_ES2)
|
|
|
|
+ // Get supported extensions list
|
|
|
|
+ GLint numExt = 0;
|
|
|
|
+ const char **extList = RL_MALLOC(512*sizeof(const char *)); // Allocate 512 strings pointers (2 KB)
|
|
const char *extensions = (const char *)glGetString(GL_EXTENSIONS); // One big const string
|
|
const char *extensions = (const char *)glGetString(GL_EXTENSIONS); // One big const string
|
|
|
|
|
|
// NOTE: We have to duplicate string because glGetString() returns a const string
|
|
// NOTE: We have to duplicate string because glGetString() returns a const string
|
|
int len = strlen(extensions) + 1;
|
|
int len = strlen(extensions) + 1;
|
|
char *extensionsDup = (char *)RL_CALLOC(len, sizeof(char));
|
|
char *extensionsDup = (char *)RL_CALLOC(len, sizeof(char));
|
|
strcpy(extensionsDup, extensions);
|
|
strcpy(extensionsDup, extensions);
|
|
-
|
|
|
|
extList[numExt] = extensionsDup;
|
|
extList[numExt] = extensionsDup;
|
|
|
|
|
|
for (int i = 0; i < len; i++)
|
|
for (int i = 0; i < len; i++)
|
|
@@ -1650,24 +1724,21 @@ void rlglInit(int width, int height)
|
|
if (extensionsDup[i] == ' ')
|
|
if (extensionsDup[i] == ' ')
|
|
{
|
|
{
|
|
extensionsDup[i] = '\0';
|
|
extensionsDup[i] = '\0';
|
|
-
|
|
|
|
numExt++;
|
|
numExt++;
|
|
extList[numExt] = &extensionsDup[i + 1];
|
|
extList[numExt] = &extensionsDup[i + 1];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-
|
|
|
|
- // NOTE: Duplicated string (extensionsDup) must be deallocated
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
|
|
+
|
|
TRACELOG(LOG_INFO, "GL: Supported extensions count: %i", numExt);
|
|
TRACELOG(LOG_INFO, "GL: Supported extensions count: %i", numExt);
|
|
|
|
|
|
- // Show supported extensions
|
|
|
|
- //for (int i = 0; i < numExt; i++) TRACELOG(LOG_INFO, "Supported extension: %s", extList[i]);
|
|
|
|
|
|
+#if defined(SUPPORT_GL_DETAILS_INFO)
|
|
|
|
+ TRACELOG(LOG_INFO, "GL: OpenGL extensions:");
|
|
|
|
+ for (int i = 0; i < numExt; i++) TRACELOG(LOG_INFO, " %s", extList[i]);
|
|
|
|
+#endif
|
|
|
|
|
|
// Check required extensions
|
|
// Check required extensions
|
|
for (int i = 0; i < numExt; i++)
|
|
for (int i = 0; i < numExt; i++)
|
|
{
|
|
{
|
|
-#if defined(GRAPHICS_API_OPENGL_ES2)
|
|
|
|
// Check VAO support
|
|
// Check VAO support
|
|
// NOTE: Only check on OpenGL ES, OpenGL 3.3 has VAO support as core feature
|
|
// NOTE: Only check on OpenGL ES, OpenGL 3.3 has VAO support as core feature
|
|
if (strcmp(extList[i], (const char *)"GL_OES_vertex_array_object") == 0)
|
|
if (strcmp(extList[i], (const char *)"GL_OES_vertex_array_object") == 0)
|
|
@@ -1717,162 +1788,98 @@ void rlglInit(int width, int height)
|
|
|
|
|
|
if (strcmp(extList[i], (const char *)"GL_OES_depth24") == 0) RLGL.ExtSupported.maxDepthBits = 24;
|
|
if (strcmp(extList[i], (const char *)"GL_OES_depth24") == 0) RLGL.ExtSupported.maxDepthBits = 24;
|
|
if (strcmp(extList[i], (const char *)"GL_OES_depth32") == 0) RLGL.ExtSupported.maxDepthBits = 32;
|
|
if (strcmp(extList[i], (const char *)"GL_OES_depth32") == 0) RLGL.ExtSupported.maxDepthBits = 32;
|
|
-#endif
|
|
|
|
- // DDS texture compression support
|
|
|
|
|
|
+
|
|
|
|
+ // Check texture compression support: DXT
|
|
if ((strcmp(extList[i], (const char *)"GL_EXT_texture_compression_s3tc") == 0) ||
|
|
if ((strcmp(extList[i], (const char *)"GL_EXT_texture_compression_s3tc") == 0) ||
|
|
(strcmp(extList[i], (const char *)"GL_WEBGL_compressed_texture_s3tc") == 0) ||
|
|
(strcmp(extList[i], (const char *)"GL_WEBGL_compressed_texture_s3tc") == 0) ||
|
|
(strcmp(extList[i], (const char *)"GL_WEBKIT_WEBGL_compressed_texture_s3tc") == 0)) RLGL.ExtSupported.texCompDXT = true;
|
|
(strcmp(extList[i], (const char *)"GL_WEBKIT_WEBGL_compressed_texture_s3tc") == 0)) RLGL.ExtSupported.texCompDXT = true;
|
|
|
|
|
|
- // ETC1 texture compression support
|
|
|
|
|
|
+ // Check texture compression support: ETC1
|
|
if ((strcmp(extList[i], (const char *)"GL_OES_compressed_ETC1_RGB8_texture") == 0) ||
|
|
if ((strcmp(extList[i], (const char *)"GL_OES_compressed_ETC1_RGB8_texture") == 0) ||
|
|
(strcmp(extList[i], (const char *)"GL_WEBGL_compressed_texture_etc1") == 0)) RLGL.ExtSupported.texCompETC1 = true;
|
|
(strcmp(extList[i], (const char *)"GL_WEBGL_compressed_texture_etc1") == 0)) RLGL.ExtSupported.texCompETC1 = true;
|
|
|
|
|
|
- // ETC2/EAC texture compression support
|
|
|
|
|
|
+ // Check texture compression support: ETC2/EAC
|
|
if (strcmp(extList[i], (const char *)"GL_ARB_ES3_compatibility") == 0) RLGL.ExtSupported.texCompETC2 = true;
|
|
if (strcmp(extList[i], (const char *)"GL_ARB_ES3_compatibility") == 0) RLGL.ExtSupported.texCompETC2 = true;
|
|
|
|
|
|
- // PVR texture compression support
|
|
|
|
|
|
+ // Check texture compression support: PVR
|
|
if (strcmp(extList[i], (const char *)"GL_IMG_texture_compression_pvrtc") == 0) RLGL.ExtSupported.texCompPVRT = true;
|
|
if (strcmp(extList[i], (const char *)"GL_IMG_texture_compression_pvrtc") == 0) RLGL.ExtSupported.texCompPVRT = true;
|
|
|
|
|
|
- // ASTC texture compression support
|
|
|
|
|
|
+ // Check texture compression support: ASTC
|
|
if (strcmp(extList[i], (const char *)"GL_KHR_texture_compression_astc_hdr") == 0) RLGL.ExtSupported.texCompASTC = true;
|
|
if (strcmp(extList[i], (const char *)"GL_KHR_texture_compression_astc_hdr") == 0) RLGL.ExtSupported.texCompASTC = true;
|
|
|
|
|
|
- // Anisotropic texture filter support
|
|
|
|
- if (strcmp(extList[i], (const char *)"GL_EXT_texture_filter_anisotropic") == 0)
|
|
|
|
- {
|
|
|
|
- RLGL.ExtSupported.texAnisoFilter = true;
|
|
|
|
- glGetFloatv(0x84FF, &RLGL.ExtSupported.maxAnisotropicLevel); // GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT
|
|
|
|
- }
|
|
|
|
|
|
+ // Check anisotropic texture filter support
|
|
|
|
+ if (strcmp(extList[i], (const char *)"GL_EXT_texture_filter_anisotropic") == 0) RLGL.ExtSupported.texAnisoFilter = true;
|
|
|
|
|
|
- // Clamp mirror wrap mode supported
|
|
|
|
|
|
+ // Check clamp mirror wrap mode support
|
|
if (strcmp(extList[i], (const char *)"GL_EXT_texture_mirror_clamp") == 0) RLGL.ExtSupported.texMirrorClamp = true;
|
|
if (strcmp(extList[i], (const char *)"GL_EXT_texture_mirror_clamp") == 0) RLGL.ExtSupported.texMirrorClamp = true;
|
|
}
|
|
}
|
|
|
|
|
|
// Free extensions pointers
|
|
// Free extensions pointers
|
|
RL_FREE(extList);
|
|
RL_FREE(extList);
|
|
-
|
|
|
|
-#if defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21)
|
|
|
|
RL_FREE(extensionsDup); // Duplicated string must be deallocated
|
|
RL_FREE(extensionsDup); // Duplicated string must be deallocated
|
|
-#endif
|
|
|
|
|
|
+#endif // GRAPHICS_API_OPENGL_ES2
|
|
|
|
|
|
-#if defined(GRAPHICS_API_OPENGL_ES2)
|
|
|
|
- if (RLGL.ExtSupported.vao) TRACELOG(LOG_INFO, "GL: VAO extension detected, VAO functions initialized successfully");
|
|
|
|
|
|
+ // Check OpenGL information and capabilities
|
|
|
|
+ //------------------------------------------------------------------------------
|
|
|
|
+ // Show current OpenGL and GLSL version
|
|
|
|
+ TRACELOG(LOG_INFO, "GL: OpenGL device information:");
|
|
|
|
+ TRACELOG(LOG_INFO, " > Vendor: %s", glGetString(GL_VENDOR));
|
|
|
|
+ TRACELOG(LOG_INFO, " > Renderer: %s", glGetString(GL_RENDERER));
|
|
|
|
+ TRACELOG(LOG_INFO, " > Version: %s", glGetString(GL_VERSION));
|
|
|
|
+ TRACELOG(LOG_INFO, " > GLSL: %s", glGetString(GL_SHADING_LANGUAGE_VERSION));
|
|
|
|
+
|
|
|
|
+ // NOTE: Anisotropy levels capability is an extension
|
|
|
|
+ #ifndef GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT
|
|
|
|
+ #define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF
|
|
|
|
+ #endif
|
|
|
|
+ glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &RLGL.ExtSupported.maxAnisotropyLevel);
|
|
|
|
+
|
|
|
|
+#if defined(SUPPORT_GL_DETAILS_INFO)
|
|
|
|
+ // Show some OpenGL GPU capabilities
|
|
|
|
+ TRACELOG(LOG_INFO, "GL: OpenGL capabilities:");
|
|
|
|
+ GLint capability = 0;
|
|
|
|
+ glGetIntegerv(GL_MAX_TEXTURE_SIZE, &capability);
|
|
|
|
+ TRACELOG(LOG_INFO, " GL_MAX_TEXTURE_SIZE: %i", capability);
|
|
|
|
+ glGetIntegerv(GL_MAX_CUBE_MAP_TEXTURE_SIZE, &capability);
|
|
|
|
+ TRACELOG(LOG_INFO, " GL_MAX_CUBE_MAP_TEXTURE_SIZE: %i", capability);
|
|
|
|
+ glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &capability);
|
|
|
|
+ TRACELOG(LOG_INFO, " GL_MAX_TEXTURE_IMAGE_UNITS: %i", capability);
|
|
|
|
+ glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &capability);
|
|
|
|
+ TRACELOG(LOG_INFO, " GL_MAX_VERTEX_ATTRIBS: %i", capability);
|
|
|
|
+ #if !defined(GRAPHICS_API_OPENGL_ES2)
|
|
|
|
+ glGetIntegerv(GL_MAX_UNIFORM_BLOCK_SIZE, &capability);
|
|
|
|
+ TRACELOG(LOG_INFO, " GL_MAX_UNIFORM_BLOCK_SIZE: %i", capability);
|
|
|
|
+ glGetIntegerv(GL_MAX_DRAW_BUFFERS, &capability);
|
|
|
|
+ TRACELOG(LOG_INFO, " GL_MAX_DRAW_BUFFERS: %i", capability);
|
|
|
|
+ if (RLGL.ExtSupported.texAnisoFilter) TRACELOG(LOG_INFO, " GL_MAX_TEXTURE_MAX_ANISOTROPY: %.0f", RLGL.ExtSupported.maxAnisotropyLevel);
|
|
|
|
+ #endif
|
|
|
|
+ glGetIntegerv(GL_NUM_COMPRESSED_TEXTURE_FORMATS, &capability);
|
|
|
|
+ TRACELOG(LOG_INFO, " GL_NUM_COMPRESSED_TEXTURE_FORMATS: %i", capability);
|
|
|
|
+ GLint format[32] = { 0 };
|
|
|
|
+ glGetIntegerv(GL_COMPRESSED_TEXTURE_FORMATS, format);
|
|
|
|
+ for (int i = 0; i < capability; i++) TRACELOG(LOG_INFO, " %s", rlGetCompressedFormatName(format[i]));
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ // Following capabilities are only supported by OpenGL 4.3 or greater
|
|
|
|
+ glGetIntegerv(GL_MAX_VERTEX_ATTRIB_BINDINGS, &capability);
|
|
|
|
+ TRACELOG(LOG_INFO, " GL_MAX_VERTEX_ATTRIB_BINDINGS: %i", capability);
|
|
|
|
+ glGetIntegerv(GL_MAX_UNIFORM_LOCATIONS, &capability);
|
|
|
|
+ TRACELOG(LOG_INFO, " GL_MAX_UNIFORM_LOCATIONS: %i", capability);
|
|
|
|
+ */
|
|
|
|
+#else // SUPPORT_GL_DETAILS_INFO
|
|
|
|
+
|
|
|
|
+ // Show some basic info about GL supported features
|
|
|
|
+ #if defined(GRAPHICS_API_OPENGL_ES2)
|
|
|
|
+ if (RLGL.ExtSupported.vao) TRACELOG(LOG_INFO, "GL: VAO extension detected, VAO functions loaded successfully");
|
|
else TRACELOG(LOG_WARNING, "GL: VAO extension not found, VAO not supported");
|
|
else TRACELOG(LOG_WARNING, "GL: VAO extension not found, VAO not supported");
|
|
-
|
|
|
|
if (RLGL.ExtSupported.texNPOT) TRACELOG(LOG_INFO, "GL: NPOT textures extension detected, full NPOT textures supported");
|
|
if (RLGL.ExtSupported.texNPOT) TRACELOG(LOG_INFO, "GL: NPOT textures extension detected, full NPOT textures supported");
|
|
else TRACELOG(LOG_WARNING, "GL: NPOT textures extension not found, limited NPOT support (no-mipmaps, no-repeat)");
|
|
else TRACELOG(LOG_WARNING, "GL: NPOT textures extension not found, limited NPOT support (no-mipmaps, no-repeat)");
|
|
-#endif
|
|
|
|
-
|
|
|
|
|
|
+ #endif
|
|
if (RLGL.ExtSupported.texCompDXT) TRACELOG(LOG_INFO, "GL: DXT compressed textures supported");
|
|
if (RLGL.ExtSupported.texCompDXT) TRACELOG(LOG_INFO, "GL: DXT compressed textures supported");
|
|
if (RLGL.ExtSupported.texCompETC1) TRACELOG(LOG_INFO, "GL: ETC1 compressed textures supported");
|
|
if (RLGL.ExtSupported.texCompETC1) TRACELOG(LOG_INFO, "GL: ETC1 compressed textures supported");
|
|
if (RLGL.ExtSupported.texCompETC2) TRACELOG(LOG_INFO, "GL: ETC2/EAC compressed textures supported");
|
|
if (RLGL.ExtSupported.texCompETC2) TRACELOG(LOG_INFO, "GL: ETC2/EAC compressed textures supported");
|
|
if (RLGL.ExtSupported.texCompPVRT) TRACELOG(LOG_INFO, "GL: PVRT compressed textures supported");
|
|
if (RLGL.ExtSupported.texCompPVRT) TRACELOG(LOG_INFO, "GL: PVRT compressed textures supported");
|
|
if (RLGL.ExtSupported.texCompASTC) TRACELOG(LOG_INFO, "GL: ASTC compressed textures supported");
|
|
if (RLGL.ExtSupported.texCompASTC) TRACELOG(LOG_INFO, "GL: ASTC compressed textures supported");
|
|
-
|
|
|
|
- if (RLGL.ExtSupported.texAnisoFilter) TRACELOG(LOG_INFO, "GL: Anisotropic textures filtering supported (max: %.0fX)", RLGL.ExtSupported.maxAnisotropicLevel);
|
|
|
|
- if (RLGL.ExtSupported.texMirrorClamp) TRACELOG(LOG_INFO, "GL: Mirror clamp wrap texture mode supported");
|
|
|
|
-
|
|
|
|
- // Initialize buffers, default shaders and default textures
|
|
|
|
- //----------------------------------------------------------
|
|
|
|
- // Init default white texture
|
|
|
|
- unsigned char pixels[4] = { 255, 255, 255, 255 }; // 1 pixel RGBA (4 bytes)
|
|
|
|
- RLGL.State.defaultTextureId = rlLoadTexture(pixels, 1, 1, PIXELFORMAT_UNCOMPRESSED_R8G8B8A8, 1);
|
|
|
|
-
|
|
|
|
- if (RLGL.State.defaultTextureId != 0) TRACELOG(LOG_INFO, "TEXTURE: [ID %i] Default texture loaded successfully", RLGL.State.defaultTextureId);
|
|
|
|
- else TRACELOG(LOG_WARNING, "TEXTURE: Failed to load default texture");
|
|
|
|
-
|
|
|
|
- // Init default Shader (customized for GL 3.3 and ES2)
|
|
|
|
- rlLoadShaderDefault(); // RLGL.State.defaultShader
|
|
|
|
- RLGL.State.currentShader = RLGL.State.defaultShader;
|
|
|
|
-
|
|
|
|
- // Init default vertex arrays buffers
|
|
|
|
- RLGL.defaultBatch = rlLoadRenderBatch(DEFAULT_BATCH_BUFFERS, DEFAULT_BATCH_BUFFER_ELEMENTS);
|
|
|
|
- RLGL.currentBatch = &RLGL.defaultBatch;
|
|
|
|
-
|
|
|
|
- // Init stack matrices (emulating OpenGL 1.1)
|
|
|
|
- for (int i = 0; i < MAX_MATRIX_STACK_SIZE; i++) RLGL.State.stack[i] = MatrixIdentity();
|
|
|
|
-
|
|
|
|
- // Init internal matrices
|
|
|
|
- RLGL.State.transform = MatrixIdentity();
|
|
|
|
- RLGL.State.projection = MatrixIdentity();
|
|
|
|
- RLGL.State.modelview = MatrixIdentity();
|
|
|
|
- RLGL.State.currentMatrix = &RLGL.State.modelview;
|
|
|
|
-
|
|
|
|
-#endif // GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2
|
|
|
|
-
|
|
|
|
- // Initialize OpenGL default states
|
|
|
|
- //----------------------------------------------------------
|
|
|
|
- // Init state: Depth test
|
|
|
|
- glDepthFunc(GL_LEQUAL); // Type of depth testing to apply
|
|
|
|
- glDisable(GL_DEPTH_TEST); // Disable depth testing for 2D (only used for 3D)
|
|
|
|
-
|
|
|
|
- // Init state: Blending mode
|
|
|
|
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Color blending function (how colors are mixed)
|
|
|
|
- glEnable(GL_BLEND); // Enable color blending (required to work with transparencies)
|
|
|
|
-
|
|
|
|
- // Init state: Culling
|
|
|
|
- // NOTE: All shapes/models triangles are drawn CCW
|
|
|
|
- glCullFace(GL_BACK); // Cull the back face (default)
|
|
|
|
- glFrontFace(GL_CCW); // Front face are defined counter clockwise (default)
|
|
|
|
- glEnable(GL_CULL_FACE); // Enable backface culling
|
|
|
|
-
|
|
|
|
- // Init state: Cubemap seamless
|
|
|
|
-#if defined(GRAPHICS_API_OPENGL_33)
|
|
|
|
- glEnable(GL_TEXTURE_CUBE_MAP_SEAMLESS); // Seamless cubemaps (not supported on OpenGL ES 2.0)
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
-#if defined(GRAPHICS_API_OPENGL_11)
|
|
|
|
- // Init state: Color hints (deprecated in OpenGL 3.0+)
|
|
|
|
- glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Improve quality of color and texture coordinate interpolation
|
|
|
|
- glShadeModel(GL_SMOOTH); // Smooth shading between vertex (vertex colors interpolation)
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
-#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
|
|
|
|
- // Store screen size into global variables
|
|
|
|
- RLGL.State.framebufferWidth = width;
|
|
|
|
- RLGL.State.framebufferHeight = height;
|
|
|
|
-
|
|
|
|
- TRACELOG(LOG_INFO, "RLGL: Default state initialized successfully");
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
- // Init state: Color/Depth buffers clear
|
|
|
|
- glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Set clear color (black)
|
|
|
|
- glClearDepth(1.0f); // Set clear depth value (default)
|
|
|
|
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear color and depth buffers (depth buffer required for 3D)
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-// Vertex Buffer Object deinitialization (memory free)
|
|
|
|
-void rlglClose(void)
|
|
|
|
-{
|
|
|
|
-#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
|
|
|
|
- rlUnloadRenderBatch(RLGL.defaultBatch);
|
|
|
|
-
|
|
|
|
- rlUnloadShaderDefault(); // Unload default shader
|
|
|
|
- glDeleteTextures(1, &RLGL.State.defaultTextureId); // Unload default texture
|
|
|
|
-
|
|
|
|
- TRACELOG(LOG_INFO, "TEXTURE: [ID %i] Unloaded default texture data from VRAM (GPU)", RLGL.State.defaultTextureId);
|
|
|
|
-#endif
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-// Load OpenGL extensions
|
|
|
|
-// NOTE: External loader function could be passed as a pointer
|
|
|
|
-void rlLoadExtensions(void *loader)
|
|
|
|
-{
|
|
|
|
-#if defined(GRAPHICS_API_OPENGL_33)
|
|
|
|
- // NOTE: glad is generated and contains only required OpenGL 3.3 Core extensions (and lower versions)
|
|
|
|
- #if !defined(__APPLE__)
|
|
|
|
- if (!gladLoadGLLoader((GLADloadproc)loader)) TRACELOG(LOG_WARNING, "GLAD: Cannot load OpenGL extensions");
|
|
|
|
- else TRACELOG(LOG_INFO, "GLAD: OpenGL extensions loaded successfully");
|
|
|
|
-
|
|
|
|
- #if defined(GRAPHICS_API_OPENGL_21)
|
|
|
|
- if (GLAD_GL_VERSION_2_1) TRACELOG(LOG_INFO, "GL: OpenGL 2.1 profile supported");
|
|
|
|
- #else
|
|
|
|
- if (GLAD_GL_VERSION_3_3) TRACELOG(LOG_INFO, "GL: OpenGL 3.3 Core profile supported");
|
|
|
|
- else TRACELOG(LOG_ERROR, "GL: OpenGL 3.3 Core profile not supported");
|
|
|
|
- #endif
|
|
|
|
- #endif
|
|
|
|
-
|
|
|
|
- // With GLAD, we can check if an extension is supported using the GLAD_GL_xxx booleans
|
|
|
|
- //if (GLAD_GL_ARB_vertex_array_object) // Use GL_ARB_vertex_array_object
|
|
|
|
#endif
|
|
#endif
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1991,7 +1998,7 @@ RenderBatch rlLoadRenderBatch(int numBuffers, int bufferElements)
|
|
batch.vertexBuffer[i].cCounter = 0;
|
|
batch.vertexBuffer[i].cCounter = 0;
|
|
}
|
|
}
|
|
|
|
|
|
- TRACELOG(LOG_INFO, "RLGL: Internal vertex buffers initialized successfully in RAM (CPU)");
|
|
|
|
|
|
+ TRACELOG(LOG_INFO, "RLGL: Render batch vertex buffers loaded successfully in RAM (CPU)");
|
|
//--------------------------------------------------------------------------------------------
|
|
//--------------------------------------------------------------------------------------------
|
|
|
|
|
|
// Upload to GPU (VRAM) vertex data and initialize VAOs/VBOs
|
|
// Upload to GPU (VRAM) vertex data and initialize VAOs/VBOs
|
|
@@ -2038,7 +2045,7 @@ RenderBatch rlLoadRenderBatch(int numBuffers, int bufferElements)
|
|
#endif
|
|
#endif
|
|
}
|
|
}
|
|
|
|
|
|
- TRACELOG(LOG_INFO, "RLGL: Render batch vertex buffers loaded successfully");
|
|
|
|
|
|
+ TRACELOG(LOG_INFO, "RLGL: Render batch vertex buffers loaded successfully in VRAM (GPU)");
|
|
|
|
|
|
// Unbind the current VAO
|
|
// Unbind the current VAO
|
|
if (RLGL.ExtSupported.vao) glBindVertexArray(0);
|
|
if (RLGL.ExtSupported.vao) glBindVertexArray(0);
|
|
@@ -2480,7 +2487,7 @@ unsigned int rlLoadTexture(void *data, int width, int height, int format, int mi
|
|
// Unbind current texture
|
|
// Unbind current texture
|
|
glBindTexture(GL_TEXTURE_2D, 0);
|
|
glBindTexture(GL_TEXTURE_2D, 0);
|
|
|
|
|
|
- if (id > 0) TRACELOG(LOG_INFO, "TEXTURE: [ID %i] Texture created successfully (%ix%i - %i mipmaps)", id, width, height, mipmapCount);
|
|
|
|
|
|
+ if (id > 0) TRACELOG(LOG_INFO, "TEXTURE: [ID %i] Texture loaded successfully (%ix%i - %i mipmaps)", id, width, height, mipmapCount);
|
|
else TRACELOG(LOG_WARNING, "TEXTURE: Failed to load texture");
|
|
else TRACELOG(LOG_WARNING, "TEXTURE: Failed to load texture");
|
|
|
|
|
|
return id;
|
|
return id;
|
|
@@ -2611,7 +2618,7 @@ unsigned int rlLoadTextureCubemap(void *data, int size, int format)
|
|
glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
|
|
glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
|
|
#endif
|
|
#endif
|
|
|
|
|
|
- if (id > 0) TRACELOG(LOG_INFO, "TEXTURE: [ID %i] Cubemap texture created successfully (%ix%i)", id, size, size);
|
|
|
|
|
|
+ if (id > 0) TRACELOG(LOG_INFO, "TEXTURE: [ID %i] Cubemap texture loaded successfully (%ix%i)", id, size, size);
|
|
else TRACELOG(LOG_WARNING, "TEXTURE: Failed to load cubemap texture");
|
|
else TRACELOG(LOG_WARNING, "TEXTURE: Failed to load cubemap texture");
|
|
|
|
|
|
return id;
|
|
return id;
|
|
@@ -3245,7 +3252,14 @@ unsigned int rlCompileShader(const char *shaderCode, int type)
|
|
|
|
|
|
if (success == GL_FALSE)
|
|
if (success == GL_FALSE)
|
|
{
|
|
{
|
|
- TRACELOG(LOG_WARNING, "SHADER: [ID %i] Failed to compile shader code", shader);
|
|
|
|
|
|
+ switch (type)
|
|
|
|
+ {
|
|
|
|
+ case GL_VERTEX_SHADER: TRACELOG(LOG_WARNING, "SHADER: [ID %i] Failed to compile vertex shader code", shader); break;
|
|
|
|
+ case GL_FRAGMENT_SHADER: TRACELOG(LOG_WARNING, "SHADER: [ID %i] Failed to compile fragment shader code", shader); break;
|
|
|
|
+ //case GL_GEOMETRY_SHADER:
|
|
|
|
+ //case GL_COMPUTE_SHADER:
|
|
|
|
+ default: break;
|
|
|
|
+ }
|
|
|
|
|
|
int maxLength = 0;
|
|
int maxLength = 0;
|
|
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &maxLength);
|
|
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &maxLength);
|
|
@@ -3259,7 +3273,17 @@ unsigned int rlCompileShader(const char *shaderCode, int type)
|
|
RL_FREE(log);
|
|
RL_FREE(log);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- else TRACELOG(LOG_INFO, "SHADER: [ID %i] Compiled successfully", shader);
|
|
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ switch (type)
|
|
|
|
+ {
|
|
|
|
+ case GL_VERTEX_SHADER: TRACELOG(LOG_INFO, "SHADER: [ID %i] Vertex shader compiled successfully", shader); break;
|
|
|
|
+ case GL_FRAGMENT_SHADER: TRACELOG(LOG_INFO, "SHADER: [ID %i] Fragment shader compiled successfully", shader); break;
|
|
|
|
+ //case GL_GEOMETRY_SHADER:
|
|
|
|
+ //case GL_COMPUTE_SHADER:
|
|
|
|
+ default: break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
#endif
|
|
#endif
|
|
|
|
|
|
return shader;
|
|
return shader;
|
|
@@ -3313,7 +3337,7 @@ unsigned int rlLoadShaderProgram(unsigned int vShaderId, unsigned int fShaderId)
|
|
|
|
|
|
program = 0;
|
|
program = 0;
|
|
}
|
|
}
|
|
- else TRACELOG(LOG_INFO, "SHADER: [ID %i] Program loaded successfully", program);
|
|
|
|
|
|
+ else TRACELOG(LOG_INFO, "SHADER: [ID %i] Program shader loaded successfully", program);
|
|
#endif
|
|
#endif
|
|
return program;
|
|
return program;
|
|
}
|
|
}
|
|
@@ -3777,7 +3801,91 @@ static void rlUnloadShaderDefault(void)
|
|
glDeleteProgram(RLGL.State.defaultShader.id);
|
|
glDeleteProgram(RLGL.State.defaultShader.id);
|
|
|
|
|
|
RL_FREE(RLGL.State.defaultShader.locs);
|
|
RL_FREE(RLGL.State.defaultShader.locs);
|
|
|
|
+
|
|
|
|
+ TRACELOG(LOG_INFO, "SHADER: [ID %i] Default shader unloaded successfully", RLGL.State.defaultShader.id);
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+#if defined(SUPPORT_GL_DETAILS_INFO)
|
|
|
|
+// Get compressed format official GL identifier name
|
|
|
|
+static char *rlGetCompressedFormatName(int format)
|
|
|
|
+{
|
|
|
|
+ static char compName[64] = { 0 };
|
|
|
|
+ memset(compName, 0, 64);
|
|
|
|
+
|
|
|
|
+ switch (format)
|
|
|
|
+ {
|
|
|
|
+ // GL_EXT_texture_compression_s3tc
|
|
|
|
+ case 0x83F0: strcpy(compName, "GL_COMPRESSED_RGB_S3TC_DXT1_EXT"); break;
|
|
|
|
+ case 0x83F1: strcpy(compName, "GL_COMPRESSED_RGBA_S3TC_DXT1_EXT"); break;
|
|
|
|
+ case 0x83F2: strcpy(compName, "GL_COMPRESSED_RGBA_S3TC_DXT3_EXT"); break;
|
|
|
|
+ case 0x83F3: strcpy(compName, "GL_COMPRESSED_RGBA_S3TC_DXT5_EXT"); break;
|
|
|
|
+ // GL_3DFX_texture_compression_FXT1
|
|
|
|
+ case 0x86B0: strcpy(compName, "GL_COMPRESSED_RGB_FXT1_3DFX"); break;
|
|
|
|
+ case 0x86B1: strcpy(compName, "GL_COMPRESSED_RGBA_FXT1_3DFX"); break;
|
|
|
|
+ // GL_IMG_texture_compression_pvrtc
|
|
|
|
+ case 0x8C00: strcpy(compName, "GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG"); break;
|
|
|
|
+ case 0x8C01: strcpy(compName, "GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG"); break;
|
|
|
|
+ case 0x8C02: strcpy(compName, "GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG"); break;
|
|
|
|
+ case 0x8C03: strcpy(compName, "GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG"); break;
|
|
|
|
+ // GL_OES_compressed_ETC1_RGB8_texture
|
|
|
|
+ case 0x8D64: strcpy(compName, "GL_ETC1_RGB8_OES"); break;
|
|
|
|
+ // GL_ARB_texture_compression_rgtc
|
|
|
|
+ case 0x8DBB: strcpy(compName, "GL_COMPRESSED_RED_RGTC1"); break;
|
|
|
|
+ case 0x8DBC: strcpy(compName, "GL_COMPRESSED_SIGNED_RED_RGTC1"); break;
|
|
|
|
+ case 0x8DBD: strcpy(compName, "GL_COMPRESSED_RG_RGTC2"); break;
|
|
|
|
+ case 0x8DBE: strcpy(compName, "GL_COMPRESSED_SIGNED_RG_RGTC2"); break;
|
|
|
|
+ // GL_ARB_texture_compression_bptc
|
|
|
|
+ case 0x8E8C: strcpy(compName, "GL_COMPRESSED_RGBA_BPTC_UNORM_ARB"); break;
|
|
|
|
+ case 0x8E8D: strcpy(compName, "GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB"); break;
|
|
|
|
+ case 0x8E8E: strcpy(compName, "GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB"); break;
|
|
|
|
+ case 0x8E8F: strcpy(compName, "GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB"); break;
|
|
|
|
+ // GL_ARB_ES3_compatibility
|
|
|
|
+ case 0x9274: strcpy(compName, "GL_COMPRESSED_RGB8_ETC2"); break;
|
|
|
|
+ case 0x9275: strcpy(compName, "GL_COMPRESSED_SRGB8_ETC2"); break;
|
|
|
|
+ case 0x9276: strcpy(compName, "GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2"); break;
|
|
|
|
+ case 0x9277: strcpy(compName, "GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2"); break;
|
|
|
|
+ case 0x9278: strcpy(compName, "GL_COMPRESSED_RGBA8_ETC2_EAC"); break;
|
|
|
|
+ case 0x9279: strcpy(compName, "GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC"); break;
|
|
|
|
+ case 0x9270: strcpy(compName, "GL_COMPRESSED_R11_EAC"); break;
|
|
|
|
+ case 0x9271: strcpy(compName, "GL_COMPRESSED_SIGNED_R11_EAC"); break;
|
|
|
|
+ case 0x9272: strcpy(compName, "GL_COMPRESSED_RG11_EAC"); break;
|
|
|
|
+ case 0x9273: strcpy(compName, "GL_COMPRESSED_SIGNED_RG11_EAC"); break;
|
|
|
|
+ // GL_KHR_texture_compression_astc_hdr
|
|
|
|
+ case 0x93B0: strcpy(compName, "GL_COMPRESSED_RGBA_ASTC_4x4_KHR"); break;
|
|
|
|
+ case 0x93B1: strcpy(compName, "GL_COMPRESSED_RGBA_ASTC_5x4_KHR"); break;
|
|
|
|
+ case 0x93B2: strcpy(compName, "GL_COMPRESSED_RGBA_ASTC_5x5_KHR"); break;
|
|
|
|
+ case 0x93B3: strcpy(compName, "GL_COMPRESSED_RGBA_ASTC_6x5_KHR"); break;
|
|
|
|
+ case 0x93B4: strcpy(compName, "GL_COMPRESSED_RGBA_ASTC_6x6_KHR"); break;
|
|
|
|
+ case 0x93B5: strcpy(compName, "GL_COMPRESSED_RGBA_ASTC_8x5_KHR"); break;
|
|
|
|
+ case 0x93B6: strcpy(compName, "GL_COMPRESSED_RGBA_ASTC_8x6_KHR"); break;
|
|
|
|
+ case 0x93B7: strcpy(compName, "GL_COMPRESSED_RGBA_ASTC_8x8_KHR"); break;
|
|
|
|
+ case 0x93B8: strcpy(compName, "GL_COMPRESSED_RGBA_ASTC_10x5_KHR"); break;
|
|
|
|
+ case 0x93B9: strcpy(compName, "GL_COMPRESSED_RGBA_ASTC_10x6_KHR"); break;
|
|
|
|
+ case 0x93BA: strcpy(compName, "GL_COMPRESSED_RGBA_ASTC_10x8_KHR"); break;
|
|
|
|
+ case 0x93BB: strcpy(compName, "GL_COMPRESSED_RGBA_ASTC_10x10_KHR"); break;
|
|
|
|
+ case 0x93BC: strcpy(compName, "GL_COMPRESSED_RGBA_ASTC_12x10_KHR"); break;
|
|
|
|
+ case 0x93BD: strcpy(compName, "GL_COMPRESSED_RGBA_ASTC_12x12_KHR"); break;
|
|
|
|
+ case 0x93D0: strcpy(compName, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR"); break;
|
|
|
|
+ case 0x93D1: strcpy(compName, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR"); break;
|
|
|
|
+ case 0x93D2: strcpy(compName, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR"); break;
|
|
|
|
+ case 0x93D3: strcpy(compName, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR"); break;
|
|
|
|
+ case 0x93D4: strcpy(compName, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR"); break;
|
|
|
|
+ case 0x93D5: strcpy(compName, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR"); break;
|
|
|
|
+ case 0x93D6: strcpy(compName, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR"); break;
|
|
|
|
+ case 0x93D7: strcpy(compName, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR"); break;
|
|
|
|
+ case 0x93D8: strcpy(compName, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR"); break;
|
|
|
|
+ case 0x93D9: strcpy(compName, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR"); break;
|
|
|
|
+ case 0x93DA: strcpy(compName, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR"); break;
|
|
|
|
+ case 0x93DB: strcpy(compName, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR"); break;
|
|
|
|
+ case 0x93DC: strcpy(compName, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR"); break;
|
|
|
|
+ case 0x93DD: strcpy(compName, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR"); break;
|
|
|
|
+ default: strcpy(compName, "GL_COMPRESSED_UNKNOWN"); break;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return compName;
|
|
|
|
+}
|
|
|
|
+#endif // SUPPORT_GL_DETAILS_INFO
|
|
|
|
+
|
|
#endif // GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2
|
|
#endif // GRAPHICS_API_OPENGL_33 || GRAPHICS_API_OPENGL_ES2
|
|
|
|
|
|
#if defined(GRAPHICS_API_OPENGL_11)
|
|
#if defined(GRAPHICS_API_OPENGL_11)
|