mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-08-26 00:16:45 +00:00
Implement GL_ARB_shading_language_include (untested)
This commit is contained in:
@@ -213,6 +213,10 @@ enum GLChunkType
|
||||
PROGRAMUNIFORM_MATRIX,
|
||||
LINKPROGRAM,
|
||||
|
||||
NAMEDSTRING,
|
||||
DELETENAMEDSTRING,
|
||||
COMPILESHADERINCLUDE,
|
||||
|
||||
GEN_FEEDBACK,
|
||||
BIND_FEEDBACK,
|
||||
BEGIN_FEEDBACK,
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -209,6 +209,7 @@ class WrappedOpenGL
|
||||
{
|
||||
GLenum type;
|
||||
vector<string> sources;
|
||||
vector<string> 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));
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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); \
|
||||
|
||||
@@ -96,15 +96,61 @@ void copy(rdctype::array<ShaderConstant> &outvars, const vector<DynShaderConstan
|
||||
}
|
||||
}
|
||||
|
||||
GLuint MakeSeparableShaderProgram(const GLHookSet &gl, GLenum type, vector<string> 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<string> sources, vector<string> *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<strin
|
||||
break;
|
||||
}
|
||||
|
||||
sepProg = gl.glCreateShaderProgramv(type, (GLsizei)sources.size(), strings);
|
||||
sepProg = CreateSepProgram(gl, type, (GLsizei)sources.size(), strings, numPaths, paths);
|
||||
|
||||
gl.glGetProgramiv(sepProg, eGL_LINK_STATUS, &status);
|
||||
if(status == 0)
|
||||
@@ -169,6 +215,7 @@ GLuint MakeSeparableShaderProgram(const GLHookSet &gl, GLenum type, vector<strin
|
||||
}
|
||||
|
||||
delete[] strings;
|
||||
if(paths) delete[] paths;
|
||||
|
||||
return sepProg;
|
||||
}
|
||||
|
||||
@@ -27,4 +27,4 @@
|
||||
#include "replay/replay_driver.h"
|
||||
|
||||
void MakeShaderReflection(const GLHookSet &gl, GLenum shadType, GLuint sepProg, ShaderReflection &refl);
|
||||
GLuint MakeSeparableShaderProgram(const GLHookSet &gl, GLenum type, std::vector<std::string> sources);
|
||||
GLuint MakeSeparableShaderProgram(const GLHookSet &gl, GLenum type, std::vector<std::string> sources, vector<string> *includepaths);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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<string> 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
|
||||
Reference in New Issue
Block a user