From cc9490c977b0b75d07e2e9572f287e5ea6d0f42f Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 5 Jan 2015 20:55:26 +0000 Subject: [PATCH] Implement GL_ARB_shading_language_include (untested) --- renderdoc/driver/gl/gl_common.h | 4 + renderdoc/driver/gl/gl_driver.cpp | 16 +- renderdoc/driver/gl/gl_driver.h | 7 + renderdoc/driver/gl/gl_hookset.h | 6 + renderdoc/driver/gl/gl_hookset_defs.h | 24 +-- renderdoc/driver/gl/gl_shader_refl.cpp | 53 +++++- renderdoc/driver/gl/gl_shader_refl.h | 2 +- renderdoc/driver/gl/wrappers/gl_get_funcs.cpp | 15 ++ .../driver/gl/wrappers/gl_shader_funcs.cpp | 155 +++++++++++++++++- 9 files changed, 262 insertions(+), 20 deletions(-) diff --git a/renderdoc/driver/gl/gl_common.h b/renderdoc/driver/gl/gl_common.h index 744ec7c80..026cb1e49 100644 --- a/renderdoc/driver/gl/gl_common.h +++ b/renderdoc/driver/gl/gl_common.h @@ -213,6 +213,10 @@ enum GLChunkType PROGRAMUNIFORM_MATRIX, LINKPROGRAM, + NAMEDSTRING, + DELETENAMEDSTRING, + COMPILESHADERINCLUDE, + GEN_FEEDBACK, BIND_FEEDBACK, BEGIN_FEEDBACK, diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index 3ec0ed509..4d84a7ae9 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -105,6 +105,10 @@ const char *GLChunkNames[] = "glProgramUniformMatrix*", "glLinkProgram", + "glNamedStringARB", + "glDeleteNamedStringARB", + "glCompileShaderIncludeARB", + "glGenTransformFeedbacks", "glBindTransformFeedback", "glBeginTransformFeedback", @@ -426,6 +430,7 @@ WrappedOpenGL::WrappedOpenGL(const char *logfile, const GLHookSet &funcs) globalExts.push_back("GL_ARB_shader_texture_lod"); globalExts.push_back("GL_ARB_shading_language_100"); globalExts.push_back("GL_ARB_shading_language_420pack"); + globalExts.push_back("GL_ARB_shading_language_include"); globalExts.push_back("GL_ARB_shading_language_packing"); globalExts.push_back("GL_ARB_shadow"); globalExts.push_back("GL_ARB_shadow_ambient"); @@ -551,7 +556,6 @@ WrappedOpenGL::WrappedOpenGL(const char *logfile, const GLHookSet &funcs) * GL_ARB_bindless_texture * GL_ARB_cl_event * GL_ARB_direct_state_access - * GL_ARB_shading_language_include * GL_ARB_sparse_buffer * GL_ARB_sparse_texture * GL_EXT_sparse_texture2 @@ -2234,6 +2238,16 @@ void WrappedOpenGL::ProcessChunk(uint64_t offset, GLChunkType context) Serialise_glLinkProgram(0); break; + case NAMEDSTRING: + Serialise_glNamedStringARB(eGL_NONE, 0, NULL, 0, NULL); + break; + case DELETENAMEDSTRING: + Serialise_glDeleteNamedStringARB(0, NULL); + break; + case COMPILESHADERINCLUDE: + Serialise_glCompileShaderIncludeARB(0, 0, NULL, NULL); + break; + case GEN_FEEDBACK: Serialise_glGenTransformFeedbacks(0, NULL); break; diff --git a/renderdoc/driver/gl/gl_driver.h b/renderdoc/driver/gl/gl_driver.h index 9c772ae3f..cfb290d4e 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -209,6 +209,7 @@ class WrappedOpenGL { GLenum type; vector sources; + vector includepaths; ShaderReflection reflection; GLuint prog; }; @@ -576,6 +577,9 @@ class WrappedOpenGL IMPLEMENT_FUNCTION_SERIALISED(void, glDeleteProgram(GLuint program)); IMPLEMENT_FUNCTION_SERIALISED(void, glLinkProgram(GLuint program)); IMPLEMENT_FUNCTION_SERIALISED(void, glProgramParameteri(GLuint program, GLenum pname, GLint value)); + IMPLEMENT_FUNCTION_SERIALISED(void, glNamedStringARB(GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *str)); + IMPLEMENT_FUNCTION_SERIALISED(void, glDeleteNamedStringARB(GLint namelen, const GLchar *name)); + IMPLEMENT_FUNCTION_SERIALISED(void, glCompileShaderIncludeARB(GLuint shader, GLsizei count, const GLchar *const*path, const GLint *length)); IMPLEMENT_FUNCTION_SERIALISED(void, glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)); IMPLEMENT_FUNCTION_SERIALISED(void, glShaderStorageBlockBinding(GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding)); IMPLEMENT_FUNCTION_SERIALISED(void, glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint *indices)); @@ -769,6 +773,7 @@ class WrappedOpenGL IMPLEMENT_FUNCTION_SERIALISED(GLboolean, glIsSync(GLsync sync)); IMPLEMENT_FUNCTION_SERIALISED(GLboolean, glIsTransformFeedback(GLuint id)); IMPLEMENT_FUNCTION_SERIALISED(GLboolean, glIsVertexArray(GLuint array)); + IMPLEMENT_FUNCTION_SERIALISED(GLboolean, glIsNamedStringARB(GLint namelen, const GLchar *name)); IMPLEMENT_FUNCTION_SERIALISED(GLenum, glGetError()); IMPLEMENT_FUNCTION_SERIALISED(void, glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)); @@ -813,6 +818,8 @@ class WrappedOpenGL IMPLEMENT_FUNCTION_SERIALISED(GLint, glGetProgramResourceLocation(GLuint program, GLenum programInterface, const GLchar *name)); IMPLEMENT_FUNCTION_SERIALISED(GLint, glGetProgramResourceLocationIndex(GLuint program, GLenum programInterface, const GLchar *name)); IMPLEMENT_FUNCTION_SERIALISED(void, glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint *values)); + IMPLEMENT_FUNCTION_SERIALISED(void, glGetNamedStringARB(GLint namelen, const GLchar *name, GLsizei bufSize, GLint *stringlen, GLchar *string)); + IMPLEMENT_FUNCTION_SERIALISED(void, glGetNamedStringivARB(GLint namelen, const GLchar *name, GLenum pname, GLint *params)); IMPLEMENT_FUNCTION_SERIALISED(GLenum, glGetGraphicsResetStatus()); IMPLEMENT_FUNCTION_SERIALISED(void, glGetObjectLabel(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label)); IMPLEMENT_FUNCTION_SERIALISED(void, glGetObjectPtrLabel(const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label)); diff --git a/renderdoc/driver/gl/gl_hookset.h b/renderdoc/driver/gl/gl_hookset.h index 88ca37121..b03a023d7 100644 --- a/renderdoc/driver/gl/gl_hookset.h +++ b/renderdoc/driver/gl/gl_hookset.h @@ -138,6 +138,8 @@ struct GLHookSet PFNGLGETSHADERPRECISIONFORMATPROC glGetShaderPrecisionFormat; PFNGLGETSHADERSOURCEPROC glGetShaderSource; PFNGLGETATTACHEDSHADERSPROC glGetAttachedShaders; + PFNGLGETNAMEDSTRINGARBPROC glGetNamedStringARB; + PFNGLGETNAMEDSTRINGIVARBPROC glGetNamedStringivARB; PFNGLGETPROGRAMIVPROC glGetProgramiv; PFNGLGETPROGRAMINFOLOGPROC glGetProgramInfoLog; PFNGLGETPROGRAMINTERFACEIVPROC glGetProgramInterfaceiv; @@ -269,6 +271,9 @@ struct GLHookSet PFNGLUSEPROGRAMPROC glUseProgram; PFNGLSHADERBINARYPROC glShaderBinary; PFNGLPROGRAMBINARYPROC glProgramBinary; + PFNGLNAMEDSTRINGARBPROC glNamedStringARB; + PFNGLDELETENAMEDSTRINGARBPROC glDeleteNamedStringARB; + PFNGLCOMPILESHADERINCLUDEARBPROC glCompileShaderIncludeARB; PFNGLUSEPROGRAMSTAGESPROC glUseProgramStages; PFNGLVALIDATEPROGRAMPROC glValidateProgram; PFNGLGENPROGRAMPIPELINESPROC glGenProgramPipelines; @@ -300,6 +305,7 @@ struct GLHookSet PFNGLISSYNCPROC glIsSync; PFNGLISTRANSFORMFEEDBACKPROC glIsTransformFeedback; PFNGLISVERTEXARRAYPROC glIsVertexArray; + PFNGLISNAMEDSTRINGARBPROC glIsNamedStringARB; PFNGLGENBUFFERSPROC glGenBuffers; // aliases glGenBuffersARB PFNGLBINDBUFFERPROC glBindBuffer; // aliases glBindBufferARB PFNGLDRAWBUFFERSPROC glDrawBuffers; // aliases glDrawBuffersARB diff --git a/renderdoc/driver/gl/gl_hookset_defs.h b/renderdoc/driver/gl/gl_hookset_defs.h index 36f1ea2af..5b2aea430 100644 --- a/renderdoc/driver/gl/gl_hookset_defs.h +++ b/renderdoc/driver/gl/gl_hookset_defs.h @@ -818,6 +818,12 @@ HookExtension(PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC, glDispatchComputeGroupSizeARB); \ HookExtension(PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC, glMultiDrawArraysIndirectCountARB); \ HookExtension(PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC, glMultiDrawElementsIndirectCountARB); \ + HookExtension(PFNGLNAMEDSTRINGARBPROC, glNamedStringARB); \ + HookExtension(PFNGLDELETENAMEDSTRINGARBPROC, glDeleteNamedStringARB); \ + HookExtension(PFNGLCOMPILESHADERINCLUDEARBPROC, glCompileShaderIncludeARB); \ + HookExtension(PFNGLISNAMEDSTRINGARBPROC, glIsNamedStringARB); \ + HookExtension(PFNGLGETNAMEDSTRINGARBPROC, glGetNamedStringARB); \ + HookExtension(PFNGLGETNAMEDSTRINGIVARBPROC, glGetNamedStringivARB); \ HookExtension(PFNGLBLENDBARRIERKHRPROC, glBlendBarrierKHR); \ HookExtension(PFNGLINSERTEVENTMARKEREXTPROC, glInsertEventMarkerEXT); \ HookExtension(PFNGLPUSHGROUPMARKEREXTPROC, glPushGroupMarkerEXT); \ @@ -1600,6 +1606,12 @@ HookWrapper6(void, glDispatchComputeGroupSizeARB, GLuint, num_groups_x, GLuint, num_groups_y, GLuint, num_groups_z, GLuint, group_size_x, GLuint, group_size_y, GLuint, group_size_z); \ HookWrapper5(void, glMultiDrawArraysIndirectCountARB, GLenum, mode, GLintptr, indirect, GLintptr, drawcount, GLsizei, maxdrawcount, GLsizei, stride); \ HookWrapper6(void, glMultiDrawElementsIndirectCountARB, GLenum, mode, GLenum, type, GLintptr, indirect, GLintptr, drawcount, GLsizei, maxdrawcount, GLsizei, stride); \ + HookWrapper5(void, glNamedStringARB, GLenum, type, GLint, namelen, const GLchar *, name, GLint, stringlen, const GLchar *, string); \ + HookWrapper2(void, glDeleteNamedStringARB, GLint, namelen, const GLchar *, name); \ + HookWrapper4(void, glCompileShaderIncludeARB, GLuint, shader, GLsizei, count, const GLchar *const*, path, const GLint *, length); \ + HookWrapper2(GLboolean, glIsNamedStringARB, GLint, namelen, const GLchar *, name); \ + HookWrapper5(void, glGetNamedStringARB, GLint, namelen, const GLchar *, name, GLsizei, bufSize, GLint *, stringlen, GLchar *, string); \ + HookWrapper4(void, glGetNamedStringivARB, GLint, namelen, const GLchar *, name, GLenum, pname, GLint *, params); \ HookWrapper0(void, glBlendBarrierKHR); \ HookWrapper2(void, glInsertEventMarkerEXT, GLsizei, length, const GLchar *, marker); \ HookWrapper2(void, glPushGroupMarkerEXT, GLsizei, length, const GLchar *, marker); \ @@ -1828,12 +1840,6 @@ HookWrapper2(void, glvertexattribl1ui64varb, GLuint, index, const GLuint64EXT *, v); \ HookWrapper3(void, glgetvertexattriblui64varb, GLuint, index, GLenum, pname, GLuint64EXT *, params); \ HookWrapper3(GLsync, glcreatesyncfromcleventarb, struct _cl_context *, context, struct _cl_event *, event, GLbitfield, flags); \ - HookWrapper5(void, glnamedstringarb, GLenum, type, GLint, namelen, const GLchar *, name, GLint, stringlen, const GLchar *, string); \ - HookWrapper2(void, gldeletenamedstringarb, GLint, namelen, const GLchar *, name); \ - HookWrapper4(void, glcompileshaderincludearb, GLuint, shader, GLsizei, count, const GLchar *const*, path, const GLint *, length); \ - HookWrapper2(GLboolean, glisnamedstringarb, GLint, namelen, const GLchar *, name); \ - HookWrapper5(void, glgetnamedstringarb, GLint, namelen, const GLchar *, name, GLsizei, bufSize, GLint *, stringlen, GLchar *, string); \ - HookWrapper4(void, glgetnamedstringivarb, GLint, namelen, const GLchar *, name, GLenum, pname, GLint *, params); \ HookWrapper4(void, glbufferpagecommitmentarb, GLenum, target, GLintptr, offset, GLsizeiptr, size, GLboolean, commit); \ HookWrapper4(void, glnamedbufferpagecommitmentext, GLuint, buffer, GLintptr, offset, GLsizeiptr, size, GLboolean, commit); \ HookWrapper4(void, glnamedbufferpagecommitmentarb, GLuint, buffer, GLintptr, offset, GLsizeiptr, size, GLboolean, commit); \ @@ -3441,12 +3447,6 @@ HandleUnsupported(PFNGLVERTEXATTRIBL1UI64VARBPROC, glvertexattribl1ui64varb); \ HandleUnsupported(PFNGLGETVERTEXATTRIBLUI64VARBPROC, glgetvertexattriblui64varb); \ HandleUnsupported(PFNGLCREATESYNCFROMCLEVENTARBPROC, glcreatesyncfromcleventarb); \ - HandleUnsupported(PFNGLNAMEDSTRINGARBPROC, glnamedstringarb); \ - HandleUnsupported(PFNGLDELETENAMEDSTRINGARBPROC, gldeletenamedstringarb); \ - HandleUnsupported(PFNGLCOMPILESHADERINCLUDEARBPROC, glcompileshaderincludearb); \ - HandleUnsupported(PFNGLISNAMEDSTRINGARBPROC, glisnamedstringarb); \ - HandleUnsupported(PFNGLGETNAMEDSTRINGARBPROC, glgetnamedstringarb); \ - HandleUnsupported(PFNGLGETNAMEDSTRINGIVARBPROC, glgetnamedstringivarb); \ HandleUnsupported(PFNGLBUFFERPAGECOMMITMENTARBPROC, glbufferpagecommitmentarb); \ HandleUnsupported(PFNGLNAMEDBUFFERPAGECOMMITMENTEXTPROC, glnamedbufferpagecommitmentext); \ HandleUnsupported(PFNGLNAMEDBUFFERPAGECOMMITMENTARBPROC, glnamedbufferpagecommitmentarb); \ diff --git a/renderdoc/driver/gl/gl_shader_refl.cpp b/renderdoc/driver/gl/gl_shader_refl.cpp index 467681ee8..864158a52 100644 --- a/renderdoc/driver/gl/gl_shader_refl.cpp +++ b/renderdoc/driver/gl/gl_shader_refl.cpp @@ -96,15 +96,61 @@ void copy(rdctype::array &outvars, const vector sources) +// little utility function that if necessary emulates glCreateShaderProgramv functionality but using glCompileShaderIncludeARB +static GLuint CreateSepProgram(const GLHookSet &gl, GLenum type, GLsizei numSources, const char **sources, GLsizei numPaths, const char **paths) +{ + if(paths == NULL) + return gl.glCreateShaderProgramv(type, numSources, sources); + + // definition of glCreateShaderProgramv from the spec + GLuint shader = gl.glCreateShader(type); + if(shader) + { + gl.glShaderSource(shader, numSources, sources, NULL); + gl.glCompileShaderIncludeARB(shader, numPaths, paths, NULL); + + GLuint program = gl.glCreateProgram(); + if(program) + { + GLint compiled = 0; + + gl.glGetShaderiv(shader, eGL_COMPILE_STATUS, &compiled); + gl.glProgramParameteri(program, eGL_PROGRAM_SEPARABLE, GL_TRUE); + + if(compiled) + { + gl.glAttachShader(program, shader); + gl.glLinkProgram(program); + gl.glDetachShader(program, shader); + } + } + gl.glDeleteShader(shader); + return program; + } + + return 0; +} + +GLuint MakeSeparableShaderProgram(const GLHookSet &gl, GLenum type, vector sources, vector *includepaths) { const string block = "\nout gl_PerVertex { vec4 gl_Position; float gl_PointSize; float gl_ClipDistance[]; };"; const char **strings = new const char*[sources.size()]; for(size_t i=0; i < sources.size(); i++) strings[i] = sources[i].c_str(); + + const char **paths = NULL; + GLsizei numPaths = 0; + if(includepaths) + { + numPaths = (GLsizei)includepaths->size(); - GLuint sepProg = gl.glCreateShaderProgramv(type, (GLsizei)sources.size(), strings); + paths = new const char*[includepaths->size()]; + for(size_t i=0; i < includepaths->size(); i++) + paths[i] = (*includepaths)[i].c_str(); + } + + GLuint sepProg = CreateSepProgram(gl, type, (GLsizei)sources.size(), strings, numPaths, paths); GLint status; gl.glGetProgramiv(sepProg, eGL_LINK_STATUS, &status); @@ -158,7 +204,7 @@ GLuint MakeSeparableShaderProgram(const GLHookSet &gl, GLenum type, vector sources); +GLuint MakeSeparableShaderProgram(const GLHookSet &gl, GLenum type, std::vector sources, vector *includepaths); diff --git a/renderdoc/driver/gl/wrappers/gl_get_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_get_funcs.cpp index cdff0090f..a57af7324 100644 --- a/renderdoc/driver/gl/wrappers/gl_get_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_get_funcs.cpp @@ -123,6 +123,11 @@ GLboolean WrappedOpenGL::glIsVertexArray(GLuint array) return m_Real.glIsVertexArray(array); } +GLboolean WrappedOpenGL::glIsNamedStringARB(GLint namelen, const GLchar *name) +{ + return m_Real.glIsNamedStringARB(namelen, name); +} + void WrappedOpenGL::glGetFloatv(GLenum pname, GLfloat *params) { m_Real.glGetFloatv(pname, params); @@ -550,6 +555,16 @@ GLint WrappedOpenGL::glGetProgramResourceLocationIndex(GLuint program, GLenum pr return m_Real.glGetProgramResourceLocationIndex(program, programInterface, name); } +void WrappedOpenGL::glGetNamedStringARB(GLint namelen, const GLchar *name, GLsizei bufSize, GLint *stringlen, GLchar *string) +{ + return m_Real.glGetNamedStringARB(namelen, name, bufSize, stringlen, string); +} + +void WrappedOpenGL::glGetNamedStringivARB(GLint namelen, const GLchar *name, GLenum pname, GLint *params) +{ + return m_Real.glGetNamedStringivARB(namelen, name, pname, params); +} + GLint WrappedOpenGL::glGetUniformLocation(GLuint program, const GLchar *name) { return m_Real.glGetUniformLocation(program, name); diff --git a/renderdoc/driver/gl/wrappers/gl_shader_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_shader_funcs.cpp index a17b2f5e9..ba09bcfff 100644 --- a/renderdoc/driver/gl/wrappers/gl_shader_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_shader_funcs.cpp @@ -92,8 +92,8 @@ bool WrappedOpenGL::Serialise_glShaderSource(GLuint shader, GLsizei count, const for(uint32_t i=0; i < Count; i++) { string s; - if(source) - s = length ? string(source[i], source[i] + length[i]) : string(source[i]); + if(source && source[i]) + s = length > 0 ? string(source[i], source[i] + length[i]) : string(source[i]); m_pSerialiser->SerialiseString("source", s); @@ -118,6 +118,8 @@ bool WrappedOpenGL::Serialise_glShaderSource(GLuint shader, GLsizei count, const m_Shaders[liveId].sources.push_back(strings[i]); m_Real.glShaderSource(GetResourceManager()->GetLiveResource(id).name, Count, strings, NULL); + + delete[] strings; } return true; @@ -150,7 +152,7 @@ bool WrappedOpenGL::Serialise_glCompileShader(GLuint shader) auto &shadDetails = m_Shaders[liveId]; - GLuint sepProg = MakeSeparableShaderProgram(m_Real, shadDetails.type, shadDetails.sources); + GLuint sepProg = MakeSeparableShaderProgram(m_Real, shadDetails.type, shadDetails.sources, NULL); if(sepProg == 0) { @@ -1021,3 +1023,150 @@ void WrappedOpenGL::glDeleteProgramPipelines(GLsizei n, const GLuint *pipelines) } #pragma endregion + +#pragma region ARB_shading_language_include + +bool WrappedOpenGL::Serialise_glCompileShaderIncludeARB(GLuint shader, GLsizei count, const GLchar *const*path, const GLint *length) +{ + SERIALISE_ELEMENT(ResourceId, id, GetResourceManager()->GetID(ShaderRes(GetCtx(), shader))); + SERIALISE_ELEMENT(int32_t, Count, count); + + vector paths; + + for(int32_t i=0; i < Count; i++) + { + string s; + if(path && path[i]) + s = length > 0 ? string(path[i], path[i] + length[i]) : string(path[i]); + + m_pSerialiser->SerialiseString("path", s); + + if(m_State == READING) + paths.push_back(s); + } + + if(m_State == READING) + { + size_t numStrings = paths.size(); + + const char **pathstrings = new const char*[numStrings]; + for(size_t i=0; i < numStrings; i++) + pathstrings[i] = paths[i].c_str(); + + ResourceId liveId = GetResourceManager()->GetLiveID(id); + + auto &shadDetails = m_Shaders[liveId]; + + shadDetails.includepaths.clear(); + shadDetails.includepaths.reserve(Count); + + for(int32_t i=0; i < Count; i++) + shadDetails.includepaths.push_back(pathstrings[i]); + + GLuint sepProg = MakeSeparableShaderProgram(m_Real, shadDetails.type, shadDetails.sources, &paths); + + if(sepProg == 0) + { + RDCERR("Couldn't make separable program for shader via patching - functionality will be broken."); + } + else + { + shadDetails.prog = sepProg; + MakeShaderReflection(m_Real, shadDetails.type, sepProg, shadDetails.reflection); + + create_array_uninit(shadDetails.reflection.DebugInfo.files, shadDetails.sources.size()); + for(size_t i=0; i < shadDetails.sources.size(); i++) + { + shadDetails.reflection.DebugInfo.files[i].first = StringFormat::Fmt("source%u.glsl", (uint32_t)i); + shadDetails.reflection.DebugInfo.files[i].second = shadDetails.sources[i]; + } + } + + m_Real.glCompileShaderIncludeARB(GetResourceManager()->GetLiveResource(id).name, Count, pathstrings, NULL); + + delete[] pathstrings; + } + + return true; +} + +void WrappedOpenGL::glCompileShaderIncludeARB(GLuint shader, GLsizei count, const GLchar *const*path, const GLint *length) +{ + m_Real.glCompileShaderIncludeARB(shader, count, path, length); + + if(m_State >= WRITING) + { + GLResourceRecord *record = GetResourceManager()->GetResourceRecord(ShaderRes(GetCtx(), shader)); + RDCASSERT(record); + { + SCOPED_SERIALISE_CONTEXT(COMPILESHADERINCLUDE); + Serialise_glCompileShaderIncludeARB(shader, count, path, length); + + record->AddChunk(scope.Get()); + } + } +} + +bool WrappedOpenGL::Serialise_glNamedStringARB(GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *str) +{ + SERIALISE_ELEMENT(GLenum, Type, type); + + string namestr = name ? string(name, name + (namelen > 0 ? namelen : strlen(name))) : ""; + string valstr = str ? string(str, str + (stringlen > 0 ? stringlen : strlen(str))) : ""; + + m_pSerialiser->Serialise("Name", namestr); + m_pSerialiser->Serialise("String", valstr); + + if(m_State == READING) + { + m_Real.glNamedStringARB(Type, (GLint)namestr.length(), namestr.c_str(), (GLint)valstr.length(), valstr.c_str()); + } + + return true; +} + +void WrappedOpenGL::glNamedStringARB(GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *str) +{ + m_Real.glNamedStringARB(type, namelen, name, stringlen, str); + + if(m_State >= WRITING) + { + SCOPED_SERIALISE_CONTEXT(NAMEDSTRING); + Serialise_glNamedStringARB(type, namelen, name, stringlen, str); + + // if a program repeatedly created/destroyed named strings this will fill up with useless strings, + // but chances are that won't be the case - a few will be created at init time and that's it + m_DeviceRecord->AddChunk(scope.Get()); + } +} + +bool WrappedOpenGL::Serialise_glDeleteNamedStringARB(GLint namelen, const GLchar *name) +{ + string namestr = name ? string(name, name + (namelen > 0 ? namelen : strlen(name))) : ""; + + m_pSerialiser->Serialise("Name", namestr); + + if(m_State == READING) + { + m_Real.glDeleteNamedStringARB((GLint)namestr.length(), namestr.c_str()); + } + + return true; +} + +void WrappedOpenGL::glDeleteNamedStringARB(GLint namelen, const GLchar *name) +{ + m_Real.glDeleteNamedStringARB(namelen, name); + + if(m_State >= WRITING) + { + SCOPED_SERIALISE_CONTEXT(DELETENAMEDSTRING); + Serialise_glDeleteNamedStringARB(namelen, name); + + // if a program repeatedly created/destroyed named strings this will fill up with useless strings, + // but chances are that won't be the case - a few will be created at init time and that's it + m_DeviceRecord->AddChunk(scope.Get()); + } +} + +#pragma endregion \ No newline at end of file