mirror of
https://github.com/godotengine/godot
synced 2024-09-05 04:38:26 +00:00
Add ARB_get_program_binary to glad to support shader cache over desktop GL
This commit is contained in:
parent
4adbfcfbb2
commit
6441210177
|
@ -507,15 +507,20 @@ String ShaderGLES3::_version_get_sha1(Version *p_version) const {
|
|||
return hash_build.as_string().sha1_text();
|
||||
}
|
||||
|
||||
#ifndef GLES_OVER_GL
|
||||
#ifndef WEB_ENABLED // not supported in webgl
|
||||
static const char *shader_file_header = "GLSC";
|
||||
static const uint32_t cache_file_version = 3;
|
||||
#endif
|
||||
|
||||
bool ShaderGLES3::_load_from_cache(Version *p_version) {
|
||||
#ifdef GLES_OVER_GL // glGetProgramBinary and glProgramBinary require GL version 4.1 while GLAD is only configured for 3.3 right now
|
||||
#ifdef WEB_ENABLED // not supported in webgl
|
||||
return false;
|
||||
#else
|
||||
#ifdef GLES_OVER_GL
|
||||
if (glProgramBinary == NULL) { // ARB_get_program_binary extension not available
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
String sha1 = _version_get_sha1(p_version);
|
||||
String path = shader_cache_dir.path_join(name).path_join(base_sha256).path_join(sha1) + ".cache";
|
||||
|
||||
|
@ -533,14 +538,14 @@ bool ShaderGLES3::_load_from_cache(Version *p_version) {
|
|||
return false; // wrong version
|
||||
}
|
||||
|
||||
int variant_count = static_cast<int>(f->get_32());
|
||||
ERR_FAIL_COND_V_MSG(variant_count != this->variant_count, false, "shader cache variant count mismatch, expected " + itos(this->variant_count) + " got " + itos(variant_count)); //should not happen but check
|
||||
int cache_variant_count = static_cast<int>(f->get_32());
|
||||
ERR_FAIL_COND_V_MSG(cache_variant_count != this->variant_count, false, "shader cache variant count mismatch, expected " + itos(this->variant_count) + " got " + itos(cache_variant_count)); //should not happen but check
|
||||
|
||||
LocalVector<OAHashMap<uint64_t, Version::Specialization>> variants;
|
||||
for (int i = 0; i < variant_count; i++) {
|
||||
uint32_t specialization_count = f->get_32();
|
||||
for (int i = 0; i < cache_variant_count; i++) {
|
||||
uint32_t cache_specialization_count = f->get_32();
|
||||
OAHashMap<uint64_t, Version::Specialization> variant;
|
||||
for (uint32_t j = 0; j < specialization_count; j++) {
|
||||
for (uint32_t j = 0; j < cache_specialization_count; j++) {
|
||||
uint64_t specialization_key = f->get_64();
|
||||
uint32_t variant_size = f->get_32();
|
||||
if (variant_size == 0) {
|
||||
|
@ -570,13 +575,18 @@ bool ShaderGLES3::_load_from_cache(Version *p_version) {
|
|||
p_version->variants = variants;
|
||||
|
||||
return true;
|
||||
#endif
|
||||
#endif // WEB_ENABLED
|
||||
}
|
||||
|
||||
void ShaderGLES3::_save_to_cache(Version *p_version) {
|
||||
#ifdef GLES_OVER_GL // glGetProgramBinary and glProgramBinary require GL version 4.1 while GLAD is only configured for 3.3 right now
|
||||
#ifdef WEB_ENABLED // not supported in webgl
|
||||
return;
|
||||
#else
|
||||
#ifdef GLES_OVER_GL
|
||||
if (glGetProgramBinary == NULL) { // ARB_get_program_binary extension not available
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
String sha1 = _version_get_sha1(p_version);
|
||||
String path = shader_cache_dir.path_join(name).path_join(base_sha256).path_join(sha1) + ".cache";
|
||||
|
||||
|
@ -588,8 +598,8 @@ void ShaderGLES3::_save_to_cache(Version *p_version) {
|
|||
f->store_32(variant_count);
|
||||
|
||||
for (int i = 0; i < variant_count; i++) {
|
||||
int specialization_count = p_version->variants[i].get_num_elements();
|
||||
f->store_32(specialization_count);
|
||||
int cache_specialization_count = p_version->variants[i].get_num_elements();
|
||||
f->store_32(cache_specialization_count);
|
||||
|
||||
for (OAHashMap<uint64_t, ShaderGLES3::Version::Specialization>::Iterator it = p_version->variants[i].iter(); it.valid; it = p_version->variants[i].next_iter(it)) {
|
||||
const uint64_t specialization_key = *it.key;
|
||||
|
@ -619,7 +629,7 @@ void ShaderGLES3::_save_to_cache(Version *p_version) {
|
|||
f->store_buffer(compiled_program.ptr(), compiled_program.size());
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endif // WEB_ENABLED
|
||||
}
|
||||
|
||||
void ShaderGLES3::_clear_version(Version *p_version) {
|
||||
|
|
12
thirdparty/glad/gl.c
vendored
12
thirdparty/glad/gl.c
vendored
|
@ -37,6 +37,7 @@ int GLAD_GL_VERSION_3_2 = 0;
|
|||
int GLAD_GL_VERSION_3_3 = 0;
|
||||
int GLAD_GL_ARB_debug_output = 0;
|
||||
int GLAD_GL_ARB_framebuffer_object = 0;
|
||||
int GLAD_GL_ARB_get_program_binary = 0;
|
||||
int GLAD_GL_EXT_framebuffer_blit = 0;
|
||||
int GLAD_GL_EXT_framebuffer_multisample = 0;
|
||||
int GLAD_GL_EXT_framebuffer_object = 0;
|
||||
|
@ -292,6 +293,7 @@ PFNGLGETPIXELMAPUIVPROC glad_glGetPixelMapuiv = NULL;
|
|||
PFNGLGETPIXELMAPUSVPROC glad_glGetPixelMapusv = NULL;
|
||||
PFNGLGETPOINTERVPROC glad_glGetPointerv = NULL;
|
||||
PFNGLGETPOLYGONSTIPPLEPROC glad_glGetPolygonStipple = NULL;
|
||||
PFNGLGETPROGRAMBINARYPROC glad_glGetProgramBinary = NULL;
|
||||
PFNGLGETPROGRAMINFOLOGPROC glad_glGetProgramInfoLog = NULL;
|
||||
PFNGLGETPROGRAMIVPROC glad_glGetProgramiv = NULL;
|
||||
PFNGLGETQUERYOBJECTI64VPROC glad_glGetQueryObjecti64v = NULL;
|
||||
|
@ -485,6 +487,8 @@ PFNGLPOPMATRIXPROC glad_glPopMatrix = NULL;
|
|||
PFNGLPOPNAMEPROC glad_glPopName = NULL;
|
||||
PFNGLPRIMITIVERESTARTINDEXPROC glad_glPrimitiveRestartIndex = NULL;
|
||||
PFNGLPRIORITIZETEXTURESPROC glad_glPrioritizeTextures = NULL;
|
||||
PFNGLPROGRAMBINARYPROC glad_glProgramBinary = NULL;
|
||||
PFNGLPROGRAMPARAMETERIPROC glad_glProgramParameteri = NULL;
|
||||
PFNGLPROVOKINGVERTEXPROC glad_glProvokingVertex = NULL;
|
||||
PFNGLPUSHATTRIBPROC glad_glPushAttrib = NULL;
|
||||
PFNGLPUSHCLIENTATTRIBPROC glad_glPushClientAttrib = NULL;
|
||||
|
@ -1588,6 +1592,12 @@ static void glad_gl_load_GL_ARB_framebuffer_object( GLADuserptrloadfunc load, vo
|
|||
glad_glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC) load(userptr, "glRenderbufferStorage");
|
||||
glad_glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) load(userptr, "glRenderbufferStorageMultisample");
|
||||
}
|
||||
static void glad_gl_load_GL_ARB_get_program_binary( GLADuserptrloadfunc load, void* userptr) {
|
||||
if(!GLAD_GL_ARB_get_program_binary) return;
|
||||
glad_glGetProgramBinary = (PFNGLGETPROGRAMBINARYPROC) load(userptr, "glGetProgramBinary");
|
||||
glad_glProgramBinary = (PFNGLPROGRAMBINARYPROC) load(userptr, "glProgramBinary");
|
||||
glad_glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC) load(userptr, "glProgramParameteri");
|
||||
}
|
||||
static void glad_gl_load_GL_EXT_framebuffer_blit( GLADuserptrloadfunc load, void* userptr) {
|
||||
if(!GLAD_GL_EXT_framebuffer_blit) return;
|
||||
glad_glBlitFramebufferEXT = (PFNGLBLITFRAMEBUFFEREXTPROC) load(userptr, "glBlitFramebufferEXT");
|
||||
|
@ -1729,6 +1739,7 @@ static int glad_gl_find_extensions_gl( int version) {
|
|||
|
||||
GLAD_GL_ARB_debug_output = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_debug_output");
|
||||
GLAD_GL_ARB_framebuffer_object = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_framebuffer_object");
|
||||
GLAD_GL_ARB_get_program_binary = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_ARB_get_program_binary");
|
||||
GLAD_GL_EXT_framebuffer_blit = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_framebuffer_blit");
|
||||
GLAD_GL_EXT_framebuffer_multisample = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_framebuffer_multisample");
|
||||
GLAD_GL_EXT_framebuffer_object = glad_gl_has_extension(version, exts, num_exts_i, exts_i, "GL_EXT_framebuffer_object");
|
||||
|
@ -1804,6 +1815,7 @@ int gladLoadGLUserPtr( GLADuserptrloadfunc load, void *userptr) {
|
|||
if (!glad_gl_find_extensions_gl(version)) return 0;
|
||||
glad_gl_load_GL_ARB_debug_output(load, userptr);
|
||||
glad_gl_load_GL_ARB_framebuffer_object(load, userptr);
|
||||
glad_gl_load_GL_ARB_get_program_binary(load, userptr);
|
||||
glad_gl_load_GL_EXT_framebuffer_blit(load, userptr);
|
||||
glad_gl_load_GL_EXT_framebuffer_multisample(load, userptr);
|
||||
glad_gl_load_GL_EXT_framebuffer_object(load, userptr);
|
||||
|
|
25
thirdparty/glad/glad/gl.h
vendored
25
thirdparty/glad/glad/gl.h
vendored
|
@ -1,11 +1,11 @@
|
|||
/**
|
||||
* Loader generated by glad 2.0.2 on Mon Nov 7 12:17:15 2022
|
||||
* Loader generated by glad 2.0.4 on Sat Apr 29 13:24:27 2023
|
||||
*
|
||||
* SPDX-License-Identifier: (WTFPL OR CC0-1.0) AND Apache-2.0
|
||||
*
|
||||
* Generator: C/C++
|
||||
* Specification: gl
|
||||
* Extensions: 7
|
||||
* Extensions: 8
|
||||
*
|
||||
* APIs:
|
||||
* - gl:compatibility=3.3
|
||||
|
@ -19,10 +19,10 @@
|
|||
* - ON_DEMAND = False
|
||||
*
|
||||
* Commandline:
|
||||
* --api='gl:compatibility=3.3' --extensions='GL_ARB_debug_output,GL_ARB_framebuffer_object,GL_EXT_framebuffer_blit,GL_EXT_framebuffer_multisample,GL_EXT_framebuffer_object,GL_OVR_multiview,GL_OVR_multiview2' c --loader
|
||||
* --api='gl:compatibility=3.3' --extensions='GL_ARB_debug_output,GL_ARB_framebuffer_object,GL_ARB_get_program_binary,GL_EXT_framebuffer_blit,GL_EXT_framebuffer_multisample,GL_EXT_framebuffer_object,GL_OVR_multiview,GL_OVR_multiview2' c --loader
|
||||
*
|
||||
* Online:
|
||||
* http://glad.sh/#api=gl%3Acompatibility%3D3.3&extensions=GL_ARB_debug_output%2CGL_ARB_framebuffer_object%2CGL_EXT_framebuffer_blit%2CGL_EXT_framebuffer_multisample%2CGL_EXT_framebuffer_object%2CGL_OVR_multiview%2CGL_OVR_multiview2&generator=c&options=LOADER
|
||||
* http://glad.sh/#api=gl%3Acompatibility%3D3.3&extensions=GL_ARB_debug_output%2CGL_ARB_framebuffer_object%2CGL_ARB_get_program_binary%2CGL_EXT_framebuffer_blit%2CGL_EXT_framebuffer_multisample%2CGL_EXT_framebuffer_object%2CGL_OVR_multiview%2CGL_OVR_multiview2&generator=c&options=LOADER
|
||||
*
|
||||
*/
|
||||
|
||||
|
@ -164,7 +164,7 @@ extern "C" {
|
|||
#define GLAD_VERSION_MAJOR(version) (version / 10000)
|
||||
#define GLAD_VERSION_MINOR(version) (version % 10000)
|
||||
|
||||
#define GLAD_GENERATOR_VERSION "2.0.2"
|
||||
#define GLAD_GENERATOR_VERSION "2.0.4"
|
||||
|
||||
typedef void (*GLADapiproc)(void);
|
||||
|
||||
|
@ -889,6 +889,7 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro
|
|||
#define GL_NO_ERROR 0
|
||||
#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2
|
||||
#define GL_NUM_EXTENSIONS 0x821D
|
||||
#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE
|
||||
#define GL_OBJECT_LINEAR 0x2401
|
||||
#define GL_OBJECT_PLANE 0x2501
|
||||
#define GL_OBJECT_TYPE 0x9112
|
||||
|
@ -981,6 +982,9 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro
|
|||
#define GL_PRIMITIVES_GENERATED 0x8C87
|
||||
#define GL_PRIMITIVE_RESTART 0x8F9D
|
||||
#define GL_PRIMITIVE_RESTART_INDEX 0x8F9E
|
||||
#define GL_PROGRAM_BINARY_FORMATS 0x87FF
|
||||
#define GL_PROGRAM_BINARY_LENGTH 0x8741
|
||||
#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257
|
||||
#define GL_PROGRAM_POINT_SIZE 0x8642
|
||||
#define GL_PROJECTION 0x1701
|
||||
#define GL_PROJECTION_MATRIX 0x0BA7
|
||||
|
@ -1605,6 +1609,8 @@ GLAD_API_CALL int GLAD_GL_VERSION_3_3;
|
|||
GLAD_API_CALL int GLAD_GL_ARB_debug_output;
|
||||
#define GL_ARB_framebuffer_object 1
|
||||
GLAD_API_CALL int GLAD_GL_ARB_framebuffer_object;
|
||||
#define GL_ARB_get_program_binary 1
|
||||
GLAD_API_CALL int GLAD_GL_ARB_get_program_binary;
|
||||
#define GL_EXT_framebuffer_blit 1
|
||||
GLAD_API_CALL int GLAD_GL_EXT_framebuffer_blit;
|
||||
#define GL_EXT_framebuffer_multisample 1
|
||||
|
@ -1864,6 +1870,7 @@ typedef void (GLAD_API_PTR *PFNGLGETPIXELMAPUIVPROC)(GLenum map, GLuint * values
|
|||
typedef void (GLAD_API_PTR *PFNGLGETPIXELMAPUSVPROC)(GLenum map, GLushort * values);
|
||||
typedef void (GLAD_API_PTR *PFNGLGETPOINTERVPROC)(GLenum pname, void ** params);
|
||||
typedef void (GLAD_API_PTR *PFNGLGETPOLYGONSTIPPLEPROC)(GLubyte * mask);
|
||||
typedef void (GLAD_API_PTR *PFNGLGETPROGRAMBINARYPROC)(GLuint program, GLsizei bufSize, GLsizei * length, GLenum * binaryFormat, void * binary);
|
||||
typedef void (GLAD_API_PTR *PFNGLGETPROGRAMINFOLOGPROC)(GLuint program, GLsizei bufSize, GLsizei * length, GLchar * infoLog);
|
||||
typedef void (GLAD_API_PTR *PFNGLGETPROGRAMIVPROC)(GLuint program, GLenum pname, GLint * params);
|
||||
typedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTI64VPROC)(GLuint id, GLenum pname, GLint64 * params);
|
||||
|
@ -2057,6 +2064,8 @@ typedef void (GLAD_API_PTR *PFNGLPOPMATRIXPROC)(void);
|
|||
typedef void (GLAD_API_PTR *PFNGLPOPNAMEPROC)(void);
|
||||
typedef void (GLAD_API_PTR *PFNGLPRIMITIVERESTARTINDEXPROC)(GLuint index);
|
||||
typedef void (GLAD_API_PTR *PFNGLPRIORITIZETEXTURESPROC)(GLsizei n, const GLuint * textures, const GLfloat * priorities);
|
||||
typedef void (GLAD_API_PTR *PFNGLPROGRAMBINARYPROC)(GLuint program, GLenum binaryFormat, const void * binary, GLsizei length);
|
||||
typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETERIPROC)(GLuint program, GLenum pname, GLint value);
|
||||
typedef void (GLAD_API_PTR *PFNGLPROVOKINGVERTEXPROC)(GLenum mode);
|
||||
typedef void (GLAD_API_PTR *PFNGLPUSHATTRIBPROC)(GLbitfield mask);
|
||||
typedef void (GLAD_API_PTR *PFNGLPUSHCLIENTATTRIBPROC)(GLbitfield mask);
|
||||
|
@ -2860,6 +2869,8 @@ GLAD_API_CALL PFNGLGETPOINTERVPROC glad_glGetPointerv;
|
|||
#define glGetPointerv glad_glGetPointerv
|
||||
GLAD_API_CALL PFNGLGETPOLYGONSTIPPLEPROC glad_glGetPolygonStipple;
|
||||
#define glGetPolygonStipple glad_glGetPolygonStipple
|
||||
GLAD_API_CALL PFNGLGETPROGRAMBINARYPROC glad_glGetProgramBinary;
|
||||
#define glGetProgramBinary glad_glGetProgramBinary
|
||||
GLAD_API_CALL PFNGLGETPROGRAMINFOLOGPROC glad_glGetProgramInfoLog;
|
||||
#define glGetProgramInfoLog glad_glGetProgramInfoLog
|
||||
GLAD_API_CALL PFNGLGETPROGRAMIVPROC glad_glGetProgramiv;
|
||||
|
@ -3246,6 +3257,10 @@ GLAD_API_CALL PFNGLPRIMITIVERESTARTINDEXPROC glad_glPrimitiveRestartIndex;
|
|||
#define glPrimitiveRestartIndex glad_glPrimitiveRestartIndex
|
||||
GLAD_API_CALL PFNGLPRIORITIZETEXTURESPROC glad_glPrioritizeTextures;
|
||||
#define glPrioritizeTextures glad_glPrioritizeTextures
|
||||
GLAD_API_CALL PFNGLPROGRAMBINARYPROC glad_glProgramBinary;
|
||||
#define glProgramBinary glad_glProgramBinary
|
||||
GLAD_API_CALL PFNGLPROGRAMPARAMETERIPROC glad_glProgramParameteri;
|
||||
#define glProgramParameteri glad_glProgramParameteri
|
||||
GLAD_API_CALL PFNGLPROVOKINGVERTEXPROC glad_glProvokingVertex;
|
||||
#define glProvokingVertex glad_glProvokingVertex
|
||||
GLAD_API_CALL PFNGLPUSHATTRIBPROC glad_glPushAttrib;
|
||||
|
|
Loading…
Reference in a new issue