mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-09-06 05:45:52 +00:00
Add renderbuffer support
This commit is contained in:
@@ -215,7 +215,10 @@ enum GLChunkType
|
||||
|
||||
GEN_FRAMEBUFFERS,
|
||||
FRAMEBUFFER_TEX,
|
||||
FRAMEBUFFER_TEX1D,
|
||||
FRAMEBUFFER_TEX2D,
|
||||
FRAMEBUFFER_TEX3D,
|
||||
FRAMEBUFFER_RENDBUF,
|
||||
FRAMEBUFFER_TEXLAYER,
|
||||
READ_BUFFER,
|
||||
BIND_FRAMEBUFFER,
|
||||
@@ -223,6 +226,10 @@ enum GLChunkType
|
||||
DRAW_BUFFERS,
|
||||
BLIT_FRAMEBUFFER,
|
||||
|
||||
GEN_RENDERBUFFERS,
|
||||
RENDERBUFFER_STORAGE,
|
||||
RENDERBUFFER_STORAGEMS,
|
||||
|
||||
GEN_SAMPLERS,
|
||||
SAMPLER_PARAMETERI,
|
||||
SAMPLER_PARAMETERF,
|
||||
|
||||
@@ -168,7 +168,10 @@ const char *GLChunkNames[] =
|
||||
|
||||
"glGenFramebuffers",
|
||||
"glFramebufferTexture",
|
||||
"glFramebufferTexture1D",
|
||||
"glFramebufferTexture2D",
|
||||
"glFramebufferTexture3D",
|
||||
"glFramebufferRenderbuffer",
|
||||
"glFramebufferTextureLayer",
|
||||
"glReadBuffer",
|
||||
"glBindFramebuffer",
|
||||
@@ -176,6 +179,10 @@ const char *GLChunkNames[] =
|
||||
"glDrawBuffers",
|
||||
"glBlitFramebuffer",
|
||||
|
||||
"glGenRenderbuffers",
|
||||
"glRenderbufferStorage",
|
||||
"glRenderbufferStorageMultisample",
|
||||
|
||||
"glGenSamplers",
|
||||
"glSamplerParameteri",
|
||||
"glSamplerParameterf",
|
||||
@@ -294,6 +301,7 @@ WrappedOpenGL::WrappedOpenGL(const wchar_t *logfile, const GLHookSet &funcs)
|
||||
m_VertexArrayRecord = NULL;
|
||||
m_DrawFramebufferRecord = NULL;
|
||||
m_ReadFramebufferRecord = NULL;
|
||||
m_Renderbuffer = ResourceId();
|
||||
m_TextureUnit = 0;
|
||||
m_Program = 0;
|
||||
|
||||
@@ -1784,9 +1792,18 @@ void WrappedOpenGL::ProcessChunk(uint64_t offset, GLChunkType context)
|
||||
case FRAMEBUFFER_TEX:
|
||||
Serialise_glNamedFramebufferTextureEXT(0, eGL_NONE, 0, 0);
|
||||
break;
|
||||
case FRAMEBUFFER_TEX1D:
|
||||
Serialise_glNamedFramebufferTexture1DEXT(0, eGL_NONE, eGL_NONE, 0, 0);
|
||||
break;
|
||||
case FRAMEBUFFER_TEX2D:
|
||||
Serialise_glNamedFramebufferTexture2DEXT(0, eGL_NONE, eGL_NONE, 0, 0);
|
||||
break;
|
||||
case FRAMEBUFFER_TEX3D:
|
||||
Serialise_glNamedFramebufferTexture3DEXT(0, eGL_NONE, eGL_NONE, 0, 0, 0);
|
||||
break;
|
||||
case FRAMEBUFFER_RENDBUF:
|
||||
Serialise_glNamedFramebufferRenderbufferEXT(0, eGL_NONE, eGL_NONE, 0);
|
||||
break;
|
||||
case FRAMEBUFFER_TEXLAYER:
|
||||
Serialise_glNamedFramebufferTextureLayerEXT(0, eGL_NONE, 0, 0, 0);
|
||||
break;
|
||||
@@ -1806,6 +1823,16 @@ void WrappedOpenGL::ProcessChunk(uint64_t offset, GLChunkType context)
|
||||
Serialise_glBlitFramebuffer(0, 0, 0, 0, 0, 0, 0, 0, 0, eGL_NONE);
|
||||
break;
|
||||
|
||||
case GEN_RENDERBUFFERS:
|
||||
Serialise_glGenRenderbuffers(0, NULL);
|
||||
break;
|
||||
case RENDERBUFFER_STORAGE:
|
||||
Serialise_glRenderbufferStorage(eGL_NONE, eGL_NONE, 0, 0);
|
||||
break;
|
||||
case RENDERBUFFER_STORAGEMS:
|
||||
Serialise_glRenderbufferStorageMultisample(eGL_NONE, 0, eGL_NONE, 0, 0);
|
||||
break;
|
||||
|
||||
case GEN_SAMPLERS:
|
||||
Serialise_glGenSamplers(0, NULL);
|
||||
break;
|
||||
|
||||
@@ -115,6 +115,7 @@ class WrappedOpenGL
|
||||
GLResourceRecord *m_VertexArrayRecord;
|
||||
GLResourceRecord *m_DrawFramebufferRecord;
|
||||
GLResourceRecord *m_ReadFramebufferRecord;
|
||||
ResourceId m_Renderbuffer;
|
||||
GLint m_TextureUnit;
|
||||
GLuint m_Program;
|
||||
|
||||
@@ -179,12 +180,13 @@ class WrappedOpenGL
|
||||
|
||||
struct TextureData
|
||||
{
|
||||
TextureData() : width(0), height(0), depth(0), creationFlags(0), internalFormat(eGL_NONE) {}
|
||||
TextureData() : width(0), height(0), depth(0), creationFlags(0), internalFormat(eGL_NONE), renderbuffer(false) {}
|
||||
GLResource resource;
|
||||
GLenum curType;
|
||||
GLint width, height, depth;
|
||||
uint32_t creationFlags;
|
||||
GLenum internalFormat;
|
||||
bool renderbuffer;
|
||||
};
|
||||
|
||||
map<ResourceId, TextureData> m_Textures;
|
||||
@@ -410,9 +412,17 @@ class WrappedOpenGL
|
||||
IMPLEMENT_FUNCTION_SERIALISED(void, glDrawBuffers(GLsizei n, const GLenum *bufs));
|
||||
IMPLEMENT_FUNCTION_SERIALISED(void, glBindFramebuffer(GLenum target, GLuint framebuffer));
|
||||
IMPLEMENT_FUNCTION_SERIALISED(void, glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level));
|
||||
IMPLEMENT_FUNCTION_SERIALISED(void, glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level));
|
||||
IMPLEMENT_FUNCTION_SERIALISED(void, glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level));
|
||||
IMPLEMENT_FUNCTION_SERIALISED(void, glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset));
|
||||
IMPLEMENT_FUNCTION_SERIALISED(void, glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer));
|
||||
IMPLEMENT_FUNCTION_SERIALISED(void, glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer));
|
||||
IMPLEMENT_FUNCTION_SERIALISED(void, glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers));
|
||||
IMPLEMENT_FUNCTION_SERIALISED(void, glGenRenderbuffers(GLsizei n, GLuint *renderbuffers));
|
||||
IMPLEMENT_FUNCTION_SERIALISED(void, glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height));
|
||||
IMPLEMENT_FUNCTION_SERIALISED(void, glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height));
|
||||
IMPLEMENT_FUNCTION_SERIALISED(void, glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers));
|
||||
IMPLEMENT_FUNCTION_SERIALISED(void, glBindRenderbuffer(GLenum target, GLuint renderbuffer));
|
||||
|
||||
GLenum glCheckFramebufferStatus(GLenum target);
|
||||
|
||||
@@ -947,7 +957,10 @@ class WrappedOpenGL
|
||||
IMPLEMENT_FUNCTION_SERIALISED(void, glNamedBufferSubDataEXT(GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data));
|
||||
IMPLEMENT_FUNCTION_SERIALISED(void, glNamedCopyBufferSubDataEXT(GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size));
|
||||
IMPLEMENT_FUNCTION_SERIALISED(void, glNamedFramebufferTextureEXT(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level));
|
||||
IMPLEMENT_FUNCTION_SERIALISED(void, glNamedFramebufferTexture1DEXT(GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level));
|
||||
IMPLEMENT_FUNCTION_SERIALISED(void, glNamedFramebufferTexture2DEXT(GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level));
|
||||
IMPLEMENT_FUNCTION_SERIALISED(void, glNamedFramebufferTexture3DEXT(GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset));
|
||||
IMPLEMENT_FUNCTION_SERIALISED(void, glNamedFramebufferRenderbufferEXT(GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer));
|
||||
IMPLEMENT_FUNCTION_SERIALISED(void, glNamedFramebufferTextureLayerEXT(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer));
|
||||
IMPLEMENT_FUNCTION_SERIALISED(void, glTextureBufferRangeEXT(GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size));
|
||||
IMPLEMENT_FUNCTION_SERIALISED(void, glTextureImage1DEXT(GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels));
|
||||
|
||||
@@ -283,9 +283,17 @@ struct GLHookSet
|
||||
PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers;
|
||||
PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer;
|
||||
PFNGLFRAMEBUFFERTEXTUREPROC glFramebufferTexture;
|
||||
PFNGLFRAMEBUFFERTEXTURE1DPROC glFramebufferTexture1D;
|
||||
PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D;
|
||||
PFNGLFRAMEBUFFERTEXTURE3DPROC glFramebufferTexture3D;
|
||||
PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer;
|
||||
PFNGLFRAMEBUFFERTEXTURELAYERPROC glFramebufferTextureLayer;
|
||||
PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers;
|
||||
PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers;
|
||||
PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage;
|
||||
PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glRenderbufferStorageMultisample;
|
||||
PFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers;
|
||||
PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer;
|
||||
PFNGLFENCESYNCPROC glFenceSync;
|
||||
PFNGLCLIENTWAITSYNCPROC glClientWaitSync;
|
||||
PFNGLWAITSYNCPROC glWaitSync;
|
||||
@@ -556,7 +564,10 @@ struct GLHookSet
|
||||
PFNGLNAMEDBUFFERSUBDATAEXTPROC glNamedBufferSubDataEXT;
|
||||
PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC glNamedCopyBufferSubDataEXT;
|
||||
PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC glNamedFramebufferTextureEXT;
|
||||
PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC glNamedFramebufferTexture1DEXT;
|
||||
PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC glNamedFramebufferTexture2DEXT;
|
||||
PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC glNamedFramebufferTexture3DEXT;
|
||||
PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC glNamedFramebufferRenderbufferEXT;
|
||||
PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC glNamedFramebufferTextureLayerEXT;
|
||||
PFNGLTEXTUREBUFFERRANGEEXTPROC glTextureBufferRangeEXT;
|
||||
PFNGLTEXTUREIMAGE1DEXTPROC glTextureImage1DEXT;
|
||||
|
||||
@@ -302,9 +302,17 @@
|
||||
HookExtension(PFNGLGENFRAMEBUFFERSPROC, glGenFramebuffers); \
|
||||
HookExtension(PFNGLBINDFRAMEBUFFERPROC, glBindFramebuffer); \
|
||||
HookExtension(PFNGLFRAMEBUFFERTEXTUREPROC, glFramebufferTexture); \
|
||||
HookExtension(PFNGLFRAMEBUFFERTEXTURE1DPROC, glFramebufferTexture1D); \
|
||||
HookExtension(PFNGLFRAMEBUFFERTEXTURE2DPROC, glFramebufferTexture2D); \
|
||||
HookExtension(PFNGLFRAMEBUFFERTEXTURE3DPROC, glFramebufferTexture3D); \
|
||||
HookExtension(PFNGLFRAMEBUFFERRENDERBUFFERPROC, glFramebufferRenderbuffer); \
|
||||
HookExtension(PFNGLFRAMEBUFFERTEXTURELAYERPROC, glFramebufferTextureLayer); \
|
||||
HookExtension(PFNGLDELETEFRAMEBUFFERSPROC, glDeleteFramebuffers); \
|
||||
HookExtension(PFNGLGENRENDERBUFFERSPROC, glGenRenderbuffers); \
|
||||
HookExtension(PFNGLRENDERBUFFERSTORAGEPROC, glRenderbufferStorage); \
|
||||
HookExtension(PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC, glRenderbufferStorageMultisample); \
|
||||
HookExtension(PFNGLDELETERENDERBUFFERSPROC, glDeleteRenderbuffers); \
|
||||
HookExtension(PFNGLBINDRENDERBUFFERPROC, glBindRenderbuffer); \
|
||||
HookExtension(PFNGLFENCESYNCPROC, glFenceSync); \
|
||||
HookExtension(PFNGLCLIENTWAITSYNCPROC, glClientWaitSync); \
|
||||
HookExtension(PFNGLWAITSYNCPROC, glWaitSync); \
|
||||
@@ -575,7 +583,10 @@
|
||||
HookExtension(PFNGLNAMEDBUFFERSUBDATAEXTPROC, glNamedBufferSubDataEXT); \
|
||||
HookExtension(PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC, glNamedCopyBufferSubDataEXT); \
|
||||
HookExtension(PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC, glNamedFramebufferTextureEXT); \
|
||||
HookExtension(PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC, glNamedFramebufferTexture1DEXT); \
|
||||
HookExtension(PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC, glNamedFramebufferTexture2DEXT); \
|
||||
HookExtension(PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC, glNamedFramebufferTexture3DEXT); \
|
||||
HookExtension(PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC, glNamedFramebufferRenderbufferEXT); \
|
||||
HookExtension(PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC, glNamedFramebufferTextureLayerEXT); \
|
||||
HookExtension(PFNGLTEXTUREBUFFERRANGEEXTPROC, glTextureBufferRangeEXT); \
|
||||
HookExtension(PFNGLTEXTUREIMAGE1DEXTPROC, glTextureImage1DEXT); \
|
||||
@@ -906,9 +917,17 @@
|
||||
HookWrapper2(void, glGenFramebuffers, GLsizei, n, GLuint *, framebuffers); \
|
||||
HookWrapper2(void, glBindFramebuffer, GLenum, target, GLuint, framebuffer); \
|
||||
HookWrapper4(void, glFramebufferTexture, GLenum, target, GLenum, attachment, GLuint, texture, GLint, level); \
|
||||
HookWrapper5(void, glFramebufferTexture1D, GLenum, target, GLenum, attachment, GLenum, textarget, GLuint, texture, GLint, level); \
|
||||
HookWrapper5(void, glFramebufferTexture2D, GLenum, target, GLenum, attachment, GLenum, textarget, GLuint, texture, GLint, level); \
|
||||
HookWrapper6(void, glFramebufferTexture3D, GLenum, target, GLenum, attachment, GLenum, textarget, GLuint, texture, GLint, level, GLint, zoffset); \
|
||||
HookWrapper4(void, glFramebufferRenderbuffer, GLenum, target, GLenum, attachment, GLenum, renderbuffertarget, GLuint, renderbuffer); \
|
||||
HookWrapper5(void, glFramebufferTextureLayer, GLenum, target, GLenum, attachment, GLuint, texture, GLint, level, GLint, layer); \
|
||||
HookWrapper2(void, glDeleteFramebuffers, GLsizei, n, const GLuint *, framebuffers); \
|
||||
HookWrapper2(void, glGenRenderbuffers, GLsizei, n, GLuint *, renderbuffers); \
|
||||
HookWrapper4(void, glRenderbufferStorage, GLenum, target, GLenum, internalformat, GLsizei, width, GLsizei, height); \
|
||||
HookWrapper5(void, glRenderbufferStorageMultisample, GLenum, target, GLsizei, samples, GLenum, internalformat, GLsizei, width, GLsizei, height); \
|
||||
HookWrapper2(void, glDeleteRenderbuffers, GLsizei, n, const GLuint *, renderbuffers); \
|
||||
HookWrapper2(void, glBindRenderbuffer, GLenum, target, GLuint, renderbuffer); \
|
||||
HookWrapper2(GLsync, glFenceSync, GLenum, condition, GLbitfield, flags); \
|
||||
HookWrapper3(GLenum, glClientWaitSync, GLsync, sync, GLbitfield, flags, GLuint64, timeout); \
|
||||
HookWrapper3(void, glWaitSync, GLsync, sync, GLbitfield, flags, GLuint64, timeout); \
|
||||
@@ -1179,7 +1198,10 @@
|
||||
HookWrapper4(void, glNamedBufferSubDataEXT, GLuint, buffer, GLintptr, offset, GLsizeiptr, size, const void *, data); \
|
||||
HookWrapper5(void, glNamedCopyBufferSubDataEXT, GLuint, readBuffer, GLuint, writeBuffer, GLintptr, readOffset, GLintptr, writeOffset, GLsizeiptr, size); \
|
||||
HookWrapper4(void, glNamedFramebufferTextureEXT, GLuint, framebuffer, GLenum, attachment, GLuint, texture, GLint, level); \
|
||||
HookWrapper5(void, glNamedFramebufferTexture1DEXT, GLuint, framebuffer, GLenum, attachment, GLenum, textarget, GLuint, texture, GLint, level); \
|
||||
HookWrapper5(void, glNamedFramebufferTexture2DEXT, GLuint, framebuffer, GLenum, attachment, GLenum, textarget, GLuint, texture, GLint, level); \
|
||||
HookWrapper6(void, glNamedFramebufferTexture3DEXT, GLuint, framebuffer, GLenum, attachment, GLenum, textarget, GLuint, texture, GLint, level, GLint, zoffset); \
|
||||
HookWrapper4(void, glNamedFramebufferRenderbufferEXT, GLuint, framebuffer, GLenum, attachment, GLenum, renderbuffertarget, GLuint, renderbuffer); \
|
||||
HookWrapper5(void, glNamedFramebufferTextureLayerEXT, GLuint, framebuffer, GLenum, attachment, GLuint, texture, GLint, level, GLint, layer); \
|
||||
HookWrapper6(void, glTextureBufferRangeEXT, GLuint, texture, GLenum, target, GLenum, internalformat, GLuint, buffer, GLintptr, offset, GLsizeiptr, size); \
|
||||
HookWrapper9(void, glTextureImage1DEXT, GLuint, texture, GLenum, target, GLint, level, GLint, internalformat, GLsizei, width, GLint, border, GLenum, format, GLenum, type, const void *, pixels); \
|
||||
|
||||
@@ -44,6 +44,7 @@ enum GLNamespace
|
||||
eResTexture,
|
||||
eResSampler,
|
||||
eResFramebuffer,
|
||||
eResRenderbuffer,
|
||||
eResBuffer,
|
||||
eResVertexArray,
|
||||
eResShader,
|
||||
@@ -93,16 +94,17 @@ struct GLResource
|
||||
// For correctness we'd need to check if the context is shared and if so move up to a 'parent'
|
||||
// so the context value ends up being identical for objects being shared, but can be different
|
||||
// for objects in non-shared contexts
|
||||
inline GLResource TextureRes(void *ctx, GLuint i) { (void)ctx; return GLResource(NULL, eResTexture, i); }
|
||||
inline GLResource SamplerRes(void *ctx, GLuint i) { (void)ctx; return GLResource(NULL, eResSampler, i); }
|
||||
inline GLResource FramebufferRes(void *ctx, GLuint i) { return GLResource(ctx, eResFramebuffer, i); }
|
||||
inline GLResource BufferRes(void *ctx, GLuint i) { (void)ctx; return GLResource(NULL, eResBuffer, i); }
|
||||
inline GLResource VertexArrayRes(void *ctx, GLuint i) { return GLResource(ctx, eResVertexArray, i); }
|
||||
inline GLResource ShaderRes(void *ctx, GLuint i) { (void)ctx; return GLResource(NULL, eResShader, i); }
|
||||
inline GLResource ProgramRes(void *ctx, GLuint i) { (void)ctx; return GLResource(NULL, eResProgram, i); }
|
||||
inline GLResource ProgramPipeRes(void *ctx, GLuint i) { return GLResource(ctx, eResProgramPipe, i); }
|
||||
inline GLResource QueryRes(void *ctx, GLuint i) { return GLResource(ctx, eResQuery, i); }
|
||||
inline GLResource SyncRes(void *ctx, GLuint i) { (void)ctx; return GLResource(NULL, eResSync, i); }
|
||||
inline GLResource TextureRes(void *ctx, GLuint i) { (void)ctx; return GLResource(NULL, eResTexture, i); }
|
||||
inline GLResource SamplerRes(void *ctx, GLuint i) { (void)ctx; return GLResource(NULL, eResSampler, i); }
|
||||
inline GLResource FramebufferRes(void *ctx, GLuint i) { return GLResource(ctx, eResFramebuffer, i); }
|
||||
inline GLResource RenderbufferRes(void *ctx, GLuint i) { (void)ctx; return GLResource(NULL, eResRenderbuffer, i); }
|
||||
inline GLResource BufferRes(void *ctx, GLuint i) { (void)ctx; return GLResource(NULL, eResBuffer, i); }
|
||||
inline GLResource VertexArrayRes(void *ctx, GLuint i) { return GLResource(ctx, eResVertexArray, i); }
|
||||
inline GLResource ShaderRes(void *ctx, GLuint i) { (void)ctx; return GLResource(NULL, eResShader, i); }
|
||||
inline GLResource ProgramRes(void *ctx, GLuint i) { (void)ctx; return GLResource(NULL, eResProgram, i); }
|
||||
inline GLResource ProgramPipeRes(void *ctx, GLuint i) { return GLResource(ctx, eResProgramPipe, i); }
|
||||
inline GLResource QueryRes(void *ctx, GLuint i) { return GLResource(ctx, eResQuery, i); }
|
||||
inline GLResource SyncRes(void *ctx, GLuint i) { (void)ctx; return GLResource(NULL, eResSync, i); }
|
||||
|
||||
struct GLResourceRecord : public ResourceRecord
|
||||
{
|
||||
|
||||
@@ -151,6 +151,82 @@ void WrappedOpenGL::glFramebufferTexture(GLenum target, GLenum attachment, GLuin
|
||||
}
|
||||
}
|
||||
|
||||
bool WrappedOpenGL::Serialise_glNamedFramebufferTexture1DEXT(GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
|
||||
{
|
||||
SERIALISE_ELEMENT(GLenum, Attach, attachment);
|
||||
SERIALISE_ELEMENT(ResourceId, id, GetResourceManager()->GetID(TextureRes(GetCtx(), texture)));
|
||||
SERIALISE_ELEMENT(GLenum, TexTarget, textarget);
|
||||
SERIALISE_ELEMENT(int32_t, Level, level);
|
||||
SERIALISE_ELEMENT(ResourceId, fbid, (framebuffer == 0 ? ResourceId() : GetResourceManager()->GetID(FramebufferRes(GetCtx(), framebuffer))));
|
||||
|
||||
if(m_State < WRITING)
|
||||
{
|
||||
GLResource res = GetResourceManager()->GetLiveResource(id);
|
||||
if(fbid == ResourceId())
|
||||
{
|
||||
glNamedFramebufferTexture1DEXT(0, Attach, TexTarget, res.name, Level);
|
||||
}
|
||||
else
|
||||
{
|
||||
GLResource fbres = GetResourceManager()->GetLiveResource(fbid);
|
||||
glNamedFramebufferTexture1DEXT(fbres.name, Attach, TexTarget, res.name, Level);
|
||||
}
|
||||
|
||||
if(m_State == READING)
|
||||
{
|
||||
m_Textures[GetResourceManager()->GetLiveID(id)].creationFlags |= eTextureCreate_RTV;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void WrappedOpenGL::glNamedFramebufferTexture1DEXT(GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
|
||||
{
|
||||
m_Real.glNamedFramebufferTexture1DEXT(framebuffer, attachment, textarget, texture, level);
|
||||
|
||||
if(m_State >= WRITING)
|
||||
{
|
||||
GLResourceRecord *record = GetResourceManager()->GetResourceRecord(FramebufferRes(GetCtx(), framebuffer));
|
||||
|
||||
SCOPED_SERIALISE_CONTEXT(FRAMEBUFFER_TEX1D);
|
||||
Serialise_glNamedFramebufferTexture1DEXT(framebuffer, attachment, textarget, texture, level);
|
||||
|
||||
if(m_State == WRITING_IDLE)
|
||||
record->AddChunk(scope.Get());
|
||||
else
|
||||
m_ContextRecord->AddChunk(scope.Get());
|
||||
}
|
||||
}
|
||||
|
||||
void WrappedOpenGL::glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
|
||||
{
|
||||
m_Real.glFramebufferTexture1D(target, attachment, textarget, texture, level);
|
||||
|
||||
if(m_State >= WRITING)
|
||||
{
|
||||
GLResourceRecord *record = m_DeviceRecord;
|
||||
|
||||
if(target == eGL_DRAW_FRAMEBUFFER || target == eGL_FRAMEBUFFER)
|
||||
{
|
||||
if(m_DrawFramebufferRecord) record = m_DrawFramebufferRecord;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(m_ReadFramebufferRecord) record = m_ReadFramebufferRecord;
|
||||
}
|
||||
|
||||
SCOPED_SERIALISE_CONTEXT(FRAMEBUFFER_TEX1D);
|
||||
Serialise_glNamedFramebufferTexture1DEXT(GetResourceManager()->GetCurrentResource(record->GetResourceID()).name,
|
||||
attachment, textarget, texture, level);
|
||||
|
||||
if(m_State == WRITING_IDLE)
|
||||
record->AddChunk(scope.Get());
|
||||
else
|
||||
m_ContextRecord->AddChunk(scope.Get());
|
||||
}
|
||||
}
|
||||
|
||||
bool WrappedOpenGL::Serialise_glNamedFramebufferTexture2DEXT(GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
|
||||
{
|
||||
SERIALISE_ELEMENT(GLenum, Attach, attachment);
|
||||
@@ -227,6 +303,158 @@ void WrappedOpenGL::glFramebufferTexture2D(GLenum target, GLenum attachment, GLe
|
||||
}
|
||||
}
|
||||
|
||||
bool WrappedOpenGL::Serialise_glNamedFramebufferTexture3DEXT(GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
|
||||
{
|
||||
SERIALISE_ELEMENT(GLenum, Attach, attachment);
|
||||
SERIALISE_ELEMENT(ResourceId, id, GetResourceManager()->GetID(TextureRes(GetCtx(), texture)));
|
||||
SERIALISE_ELEMENT(GLenum, TexTarget, textarget);
|
||||
SERIALISE_ELEMENT(int32_t, Level, level);
|
||||
SERIALISE_ELEMENT(int32_t, Zoffset, zoffset);
|
||||
SERIALISE_ELEMENT(ResourceId, fbid, (framebuffer == 0 ? ResourceId() : GetResourceManager()->GetID(FramebufferRes(GetCtx(), framebuffer))));
|
||||
|
||||
if(m_State < WRITING)
|
||||
{
|
||||
GLResource res = GetResourceManager()->GetLiveResource(id);
|
||||
if(fbid == ResourceId())
|
||||
{
|
||||
glNamedFramebufferTexture3DEXT(0, Attach, TexTarget, res.name, Level, Zoffset);
|
||||
}
|
||||
else
|
||||
{
|
||||
GLResource fbres = GetResourceManager()->GetLiveResource(fbid);
|
||||
glNamedFramebufferTexture3DEXT(fbres.name, Attach, TexTarget, res.name, Level, Zoffset);
|
||||
}
|
||||
|
||||
if(m_State == READING)
|
||||
{
|
||||
m_Textures[GetResourceManager()->GetLiveID(id)].creationFlags |= eTextureCreate_RTV;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void WrappedOpenGL::glNamedFramebufferTexture3DEXT(GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
|
||||
{
|
||||
m_Real.glNamedFramebufferTexture3DEXT(framebuffer, attachment, textarget, texture, level, zoffset);
|
||||
|
||||
if(m_State >= WRITING)
|
||||
{
|
||||
GLResourceRecord *record = GetResourceManager()->GetResourceRecord(FramebufferRes(GetCtx(), framebuffer));
|
||||
|
||||
SCOPED_SERIALISE_CONTEXT(FRAMEBUFFER_TEX3D);
|
||||
Serialise_glNamedFramebufferTexture3DEXT(framebuffer, attachment, textarget, texture, level, zoffset);
|
||||
|
||||
if(m_State == WRITING_IDLE)
|
||||
record->AddChunk(scope.Get());
|
||||
else
|
||||
m_ContextRecord->AddChunk(scope.Get());
|
||||
}
|
||||
}
|
||||
|
||||
void WrappedOpenGL::glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
|
||||
{
|
||||
m_Real.glFramebufferTexture3D(target, attachment, textarget, texture, level, zoffset);
|
||||
|
||||
if(m_State >= WRITING)
|
||||
{
|
||||
GLResourceRecord *record = m_DeviceRecord;
|
||||
|
||||
if(target == eGL_DRAW_FRAMEBUFFER || target == eGL_FRAMEBUFFER)
|
||||
{
|
||||
if(m_DrawFramebufferRecord) record = m_DrawFramebufferRecord;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(m_ReadFramebufferRecord) record = m_ReadFramebufferRecord;
|
||||
}
|
||||
|
||||
SCOPED_SERIALISE_CONTEXT(FRAMEBUFFER_TEX3D);
|
||||
Serialise_glNamedFramebufferTexture3DEXT(GetResourceManager()->GetCurrentResource(record->GetResourceID()).name,
|
||||
attachment, textarget, texture, level, zoffset);
|
||||
|
||||
if(m_State == WRITING_IDLE)
|
||||
record->AddChunk(scope.Get());
|
||||
else
|
||||
m_ContextRecord->AddChunk(scope.Get());
|
||||
}
|
||||
}
|
||||
bool WrappedOpenGL::Serialise_glNamedFramebufferRenderbufferEXT(GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
|
||||
{
|
||||
SERIALISE_ELEMENT(ResourceId, fbid, (framebuffer == 0 ? ResourceId() : GetResourceManager()->GetID(FramebufferRes(GetCtx(), framebuffer))));
|
||||
SERIALISE_ELEMENT(GLenum, Attach, attachment);
|
||||
SERIALISE_ELEMENT(GLenum, RendBufTarget, renderbuffertarget);
|
||||
SERIALISE_ELEMENT(ResourceId, id, GetResourceManager()->GetID(RenderbufferRes(GetCtx(), renderbuffer)));
|
||||
|
||||
if(m_State < WRITING)
|
||||
{
|
||||
GLResource res = GetResourceManager()->GetLiveResource(id);
|
||||
if(fbid == ResourceId())
|
||||
{
|
||||
glNamedFramebufferRenderbufferEXT(0, Attach, RendBufTarget, res.name);
|
||||
}
|
||||
else
|
||||
{
|
||||
GLResource fbres = GetResourceManager()->GetLiveResource(fbid);
|
||||
glNamedFramebufferRenderbufferEXT(fbres.name, Attach, RendBufTarget, res.name);
|
||||
}
|
||||
|
||||
if(m_State == READING)
|
||||
{
|
||||
m_Textures[GetResourceManager()->GetLiveID(id)].creationFlags |= eTextureCreate_RTV;
|
||||
m_Textures[GetResourceManager()->GetLiveID(id)].renderbuffer = true;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void WrappedOpenGL::glNamedFramebufferRenderbufferEXT(GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
|
||||
{
|
||||
m_Real.glNamedFramebufferRenderbufferEXT(framebuffer, attachment, renderbuffertarget, renderbuffer);
|
||||
|
||||
if(m_State >= WRITING)
|
||||
{
|
||||
GLResourceRecord *record = GetResourceManager()->GetResourceRecord(FramebufferRes(GetCtx(), framebuffer));
|
||||
|
||||
SCOPED_SERIALISE_CONTEXT(FRAMEBUFFER_RENDBUF);
|
||||
Serialise_glNamedFramebufferRenderbufferEXT(framebuffer, attachment, renderbuffertarget, renderbuffer);
|
||||
|
||||
if(m_State == WRITING_IDLE)
|
||||
record->AddChunk(scope.Get());
|
||||
else
|
||||
m_ContextRecord->AddChunk(scope.Get());
|
||||
}
|
||||
}
|
||||
|
||||
void WrappedOpenGL::glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
|
||||
{
|
||||
m_Real.glFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
|
||||
|
||||
if(m_State >= WRITING)
|
||||
{
|
||||
GLResourceRecord *record = m_DeviceRecord;
|
||||
|
||||
if(target == eGL_DRAW_FRAMEBUFFER || target == eGL_FRAMEBUFFER)
|
||||
{
|
||||
if(m_DrawFramebufferRecord) record = m_DrawFramebufferRecord;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(m_ReadFramebufferRecord) record = m_ReadFramebufferRecord;
|
||||
}
|
||||
|
||||
SCOPED_SERIALISE_CONTEXT(FRAMEBUFFER_RENDBUF);
|
||||
Serialise_glNamedFramebufferRenderbufferEXT(GetResourceManager()->GetCurrentResource(record->GetResourceID()).name,
|
||||
attachment, renderbuffertarget, renderbuffer);
|
||||
|
||||
if(m_State == WRITING_IDLE)
|
||||
record->AddChunk(scope.Get());
|
||||
else
|
||||
m_ContextRecord->AddChunk(scope.Get());
|
||||
}
|
||||
}
|
||||
|
||||
bool WrappedOpenGL::Serialise_glNamedFramebufferTextureLayerEXT(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer)
|
||||
{
|
||||
SERIALISE_ELEMENT(GLenum, Attach, attachment);
|
||||
@@ -531,3 +759,167 @@ void WrappedOpenGL::glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
|
||||
for(GLsizei i=0; i < n; i++)
|
||||
GetResourceManager()->UnregisterResource(FramebufferRes(GetCtx(), framebuffers[i]));
|
||||
}
|
||||
|
||||
bool WrappedOpenGL::Serialise_glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
|
||||
{
|
||||
SERIALISE_ELEMENT(ResourceId, id, GetResourceManager()->GetID(RenderbufferRes(GetCtx(), *renderbuffers)));
|
||||
|
||||
if(m_State == READING)
|
||||
{
|
||||
GLuint real = 0;
|
||||
m_Real.glGenRenderbuffers(1, &real);
|
||||
m_Real.glBindRenderbuffer(eGL_RENDERBUFFER, real);
|
||||
|
||||
GLResource res = RenderbufferRes(GetCtx(), real);
|
||||
|
||||
ResourceId live = m_ResourceManager->RegisterResource(res);
|
||||
GetResourceManager()->AddLiveResource(id, res);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void WrappedOpenGL::glGenRenderbuffers(GLsizei n, GLuint *renderbuffers)
|
||||
{
|
||||
m_Real.glGenRenderbuffers(n, renderbuffers);
|
||||
|
||||
for(GLsizei i=0; i < n; i++)
|
||||
{
|
||||
GLResource res = RenderbufferRes(GetCtx(), renderbuffers[i]);
|
||||
ResourceId id = GetResourceManager()->RegisterResource(res);
|
||||
|
||||
if(m_State >= WRITING)
|
||||
{
|
||||
Chunk *chunk = NULL;
|
||||
|
||||
{
|
||||
SCOPED_SERIALISE_CONTEXT(GEN_RENDERBUFFERS);
|
||||
Serialise_glGenRenderbuffers(1, renderbuffers+i);
|
||||
|
||||
chunk = scope.Get();
|
||||
}
|
||||
|
||||
GLResourceRecord *record = GetResourceManager()->AddResourceRecord(id);
|
||||
RDCASSERT(record);
|
||||
|
||||
record->AddChunk(chunk);
|
||||
}
|
||||
else
|
||||
{
|
||||
GetResourceManager()->AddLiveResource(id, res);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void WrappedOpenGL::glBindRenderbuffer(GLenum target, GLuint renderbuffer)
|
||||
{
|
||||
// don't need to serialise this, as the GL_RENDERBUFFER target does nothing
|
||||
// aside from create names (after glGen), and provide as a selector for glRenderbufferStorage*
|
||||
// which we do ourselves. We just need to know the current renderbuffer ID
|
||||
m_Renderbuffer = GetResourceManager()->GetID(RenderbufferRes(GetCtx(), renderbuffer));
|
||||
|
||||
m_Real.glBindRenderbuffer(target, renderbuffer);
|
||||
}
|
||||
|
||||
void WrappedOpenGL::glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
|
||||
{
|
||||
m_Real.glDeleteRenderbuffers(n, renderbuffers);
|
||||
|
||||
for(GLsizei i=0; i < n; i++)
|
||||
GetResourceManager()->UnregisterResource(RenderbufferRes(GetCtx(), renderbuffers[i]));
|
||||
}
|
||||
|
||||
bool WrappedOpenGL::Serialise_glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
|
||||
{
|
||||
SERIALISE_ELEMENT(ResourceId, id, m_Renderbuffer);
|
||||
SERIALISE_ELEMENT(GLenum, Format, internalformat);
|
||||
SERIALISE_ELEMENT(uint32_t, Width, width);
|
||||
SERIALISE_ELEMENT(uint32_t, Height, height);
|
||||
|
||||
if(m_State == READING)
|
||||
{
|
||||
ResourceId liveId = GetResourceManager()->GetLiveID(id);
|
||||
m_Textures[liveId].width = Width;
|
||||
m_Textures[liveId].height = Height;
|
||||
m_Textures[liveId].depth = 1;
|
||||
m_Textures[liveId].curType = eGL_RENDERBUFFER;
|
||||
m_Textures[liveId].internalFormat = Format;
|
||||
|
||||
m_Real.glBindRenderbuffer(eGL_RENDERBUFFER, GetResourceManager()->GetLiveResource(id).name);
|
||||
m_Real.glRenderbufferStorage(eGL_RENDERBUFFER, Format, Width, Height);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void WrappedOpenGL::glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
|
||||
{
|
||||
m_Real.glRenderbufferStorage(target, internalformat, width, height);
|
||||
|
||||
if(m_State >= WRITING)
|
||||
{
|
||||
GLResourceRecord *record = GetResourceManager()->GetResourceRecord(m_Renderbuffer);
|
||||
RDCASSERT(record);
|
||||
|
||||
SCOPED_SERIALISE_CONTEXT(RENDERBUFFER_STORAGE);
|
||||
Serialise_glRenderbufferStorage(eGL_RENDERBUFFER, internalformat, width, height);
|
||||
|
||||
record->AddChunk(scope.Get());
|
||||
}
|
||||
else
|
||||
{
|
||||
m_Textures[m_Renderbuffer].width = width;
|
||||
m_Textures[m_Renderbuffer].height = height;
|
||||
m_Textures[m_Renderbuffer].depth = 1;
|
||||
m_Textures[m_Renderbuffer].curType = eGL_RENDERBUFFER;
|
||||
m_Textures[m_Renderbuffer].internalFormat = internalformat;
|
||||
}
|
||||
}
|
||||
|
||||
bool WrappedOpenGL::Serialise_glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
|
||||
{
|
||||
SERIALISE_ELEMENT(GLenum, Format, internalformat);
|
||||
SERIALISE_ELEMENT(uint32_t, Samples, samples);
|
||||
SERIALISE_ELEMENT(uint32_t, Width, width);
|
||||
SERIALISE_ELEMENT(uint32_t, Height, height);
|
||||
SERIALISE_ELEMENT(ResourceId, id, m_Renderbuffer);
|
||||
|
||||
if(m_State == READING)
|
||||
{
|
||||
ResourceId liveId = GetResourceManager()->GetLiveID(id);
|
||||
m_Textures[liveId].width = Width;
|
||||
m_Textures[liveId].height = Height;
|
||||
m_Textures[liveId].depth = 1;
|
||||
m_Textures[liveId].curType = eGL_RENDERBUFFER;
|
||||
m_Textures[liveId].internalFormat = Format;
|
||||
|
||||
m_Real.glBindRenderbuffer(eGL_RENDERBUFFER, GetResourceManager()->GetLiveResource(id).name);
|
||||
m_Real.glRenderbufferStorageMultisample(eGL_RENDERBUFFER, Samples, Format, Width, Height);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void WrappedOpenGL::glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)
|
||||
{
|
||||
m_Real.glRenderbufferStorageMultisample(target, samples, internalformat, width, height);
|
||||
|
||||
if(m_State >= WRITING)
|
||||
{
|
||||
GLResourceRecord *record = GetResourceManager()->GetResourceRecord(m_Renderbuffer);
|
||||
RDCASSERT(record);
|
||||
|
||||
SCOPED_SERIALISE_CONTEXT(RENDERBUFFER_STORAGEMS);
|
||||
Serialise_glRenderbufferStorageMultisample(eGL_RENDERBUFFER, samples, internalformat, width, height);
|
||||
|
||||
record->AddChunk(scope.Get());
|
||||
}
|
||||
else
|
||||
{
|
||||
m_Textures[m_Renderbuffer].width = width;
|
||||
m_Textures[m_Renderbuffer].height = height;
|
||||
m_Textures[m_Renderbuffer].depth = 1;
|
||||
m_Textures[m_Renderbuffer].curType = eGL_RENDERBUFFER;
|
||||
m_Textures[m_Renderbuffer].internalFormat = internalformat;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user