diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index ac84c22ed..7b57461b1 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -1834,19 +1834,19 @@ void WrappedOpenGL::ProcessChunk(uint64_t offset, GLChunkType context) Serialise_glCopyImageSubData(0, eGL_NONE, 0, 0, 0, 0, 0, eGL_NONE, 0, 0, 0, 0, 0, 0, 0); break; case COPY_IMAGE1D: - Serialise_glCopyTexImage1D(eGL_NONE, 0, eGL_NONE, 0, 0, 0, 0); + Serialise_glCopyTextureImage1DEXT(0, eGL_NONE, 0, eGL_NONE, 0, 0, 0, 0); break; case COPY_IMAGE2D: - Serialise_glCopyTexImage2D(eGL_NONE, 0, eGL_NONE, 0, 0, 0, 0, 0); + Serialise_glCopyTextureImage2DEXT(0, eGL_NONE, 0, eGL_NONE, 0, 0, 0, 0, 0); break; case COPY_SUBIMAGE1D: - Serialise_glCopyTexSubImage1D(eGL_NONE, 0, 0, 0, 0, 0); + Serialise_glCopyTextureSubImage1DEXT(0, eGL_NONE, 0, 0, 0, 0, 0); break; case COPY_SUBIMAGE2D: - Serialise_glCopyTexSubImage2D(eGL_NONE, 0, 0, 0, 0, 0, 0, 0); + Serialise_glCopyTextureSubImage2DEXT(0, eGL_NONE, 0, 0, 0, 0, 0, 0, 0); break; case COPY_SUBIMAGE3D: - Serialise_glCopyTexSubImage3D(eGL_NONE, 0, 0, 0, 0, 0, 0, 0, 0); + Serialise_glCopyTextureSubImage3DEXT(0, eGL_NONE, 0, 0, 0, 0, 0, 0, 0, 0); break; case TEXTURE_VIEW: Serialise_glTextureView(0, eGL_NONE, 0, eGL_NONE, 0, 0, 0, 0); @@ -1999,16 +1999,16 @@ void WrappedOpenGL::ProcessChunk(uint64_t offset, GLChunkType context) Serialise_glClearBufferfi(eGL_NONE, 0, 0, 0); break; case CLEARBUFFERDATA: - Serialise_glClearBufferData(eGL_NONE, eGL_NONE, eGL_NONE, eGL_NONE, NULL); + Serialise_glClearNamedBufferDataEXT(0, eGL_NONE, eGL_NONE, eGL_NONE, NULL); break; case CLEARBUFFERSUBDATA: - Serialise_glClearBufferSubData(eGL_NONE, eGL_NONE, 0, 0, eGL_NONE, eGL_NONE, NULL); + Serialise_glClearNamedBufferSubDataEXT(0, eGL_NONE, 0, 0, eGL_NONE, eGL_NONE, NULL); break; case CLEARTEXIMAGE: Serialise_glClearTexImage(0, 0, eGL_NONE, eGL_NONE, NULL); break; case CLEARTEXSUBIMAGE: - Serialise_glClearBufferSubData(eGL_NONE, eGL_NONE, 0, 0, eGL_NONE, eGL_NONE, NULL); + Serialise_glClearTexSubImage(0, 0, 0, 0, 0, 0, 0, 0, eGL_NONE, eGL_NONE, NULL); break; case POLYGON_MODE: Serialise_glPolygonMode(eGL_NONE, eGL_NONE); @@ -2170,13 +2170,13 @@ void WrappedOpenGL::ProcessChunk(uint64_t offset, GLChunkType context) Serialise_glScissorArrayv(0, 0, 0); break; case BIND_VERTEXBUFFER: - Serialise_glBindVertexBuffer(0, 0, 0, 0); + Serialise_glVertexArrayBindVertexBufferEXT(0, 0, 0, 0, 0); break; case BIND_VERTEXBUFFERS: Serialise_glBindVertexBuffers(0, 0, NULL, NULL, NULL); break; case VERTEXBINDINGDIVISOR: - Serialise_glVertexBindingDivisor(0, 0); + Serialise_glVertexArrayVertexBindingDivisorEXT(0, 0, 0); break; case DISPATCH_COMPUTE: Serialise_glDispatchCompute(0, 0, 0); @@ -2285,13 +2285,13 @@ void WrappedOpenGL::ProcessChunk(uint64_t offset, GLChunkType context) Serialise_glNamedFramebufferParameteriEXT(0, eGL_NONE, 0); break; case READ_BUFFER: - Serialise_glReadBuffer(eGL_NONE); + Serialise_glFramebufferReadBufferEXT(0, eGL_NONE); break; case BIND_FRAMEBUFFER: Serialise_glBindFramebuffer(eGL_NONE, 0); break; case DRAW_BUFFER: - Serialise_glDrawBuffer(eGL_NONE); + Serialise_glFramebufferDrawBufferEXT(0, eGL_NONE); break; case DRAW_BUFFERS: Serialise_glFramebufferDrawBuffersEXT(0, 0, NULL); @@ -2304,10 +2304,10 @@ void WrappedOpenGL::ProcessChunk(uint64_t offset, GLChunkType context) Serialise_glGenRenderbuffers(0, NULL); break; case RENDERBUFFER_STORAGE: - Serialise_glRenderbufferStorage(eGL_NONE, eGL_NONE, 0, 0); + Serialise_glNamedRenderbufferStorageEXT(0, eGL_NONE, 0, 0); break; case RENDERBUFFER_STORAGEMS: - Serialise_glRenderbufferStorageMultisample(eGL_NONE, 0, eGL_NONE, 0, 0); + Serialise_glNamedRenderbufferStorageMultisampleEXT(0, 0, eGL_NONE, 0, 0); break; case GEN_SAMPLERS: @@ -2372,7 +2372,7 @@ void WrappedOpenGL::ProcessChunk(uint64_t offset, GLChunkType context) Serialise_glUnmapNamedBufferEXT(eGL_NONE); break; case FLUSHMAP: - Serialise_glFlushMappedBufferRange(eGL_NONE, 0, 0); + Serialise_glFlushMappedNamedBufferRangeEXT(0, 0, 0); break; case GEN_VERTEXARRAY: Serialise_glGenVertexArrays(0, NULL); @@ -2381,37 +2381,37 @@ void WrappedOpenGL::ProcessChunk(uint64_t offset, GLChunkType context) Serialise_glBindVertexArray(0); break; case VERTEXATTRIBPOINTER: - Serialise_glVertexAttribPointer(0, 0, eGL_NONE, 0, 0, NULL); + Serialise_glVertexArrayVertexAttribOffsetEXT(0, 0, 0, 0, eGL_NONE, 0, 0, NULL); break; case VERTEXATTRIBIPOINTER: - Serialise_glVertexAttribIPointer(0, 0, eGL_NONE, 0, NULL); + Serialise_glVertexArrayVertexAttribIOffsetEXT(0, 0, 0, 0, eGL_NONE, 0, NULL); break; case VERTEXATTRIBLPOINTER: - Serialise_glVertexAttribLPointer(0, 0, eGL_NONE, 0, NULL); + Serialise_glVertexArrayVertexAttribLOffsetEXT(0, 0, 0, 0, eGL_NONE, 0, NULL); break; case ENABLEVERTEXATTRIBARRAY: - Serialise_glEnableVertexAttribArray(0); + Serialise_glEnableVertexArrayAttribEXT(0, 0); break; case DISABLEVERTEXATTRIBARRAY: - Serialise_glDisableVertexAttribArray(0); + Serialise_glDisableVertexArrayAttribEXT(0, 0); break; case VERTEXATTRIB_GENERIC: Serialise_glVertexAttrib(0, 0, eGL_NONE, GL_FALSE, NULL, Attrib_packed); break; case VERTEXATTRIBFORMAT: - Serialise_glVertexAttribFormat(0, 0, eGL_NONE, 0, 0); + Serialise_glVertexArrayVertexAttribFormatEXT(0, 0, 0, eGL_NONE, 0, 0); break; case VERTEXATTRIBIFORMAT: - Serialise_glVertexAttribIFormat(0, 0, eGL_NONE, 0); + Serialise_glVertexArrayVertexAttribIFormatEXT(0, 0, 0, eGL_NONE, 0); break; case VERTEXATTRIBLFORMAT: - Serialise_glVertexAttribLFormat(0, 0, eGL_NONE, 0); + Serialise_glVertexArrayVertexAttribLFormatEXT(0, 0, 0, eGL_NONE, 0); break; case VERTEXATTRIBDIVISOR: - Serialise_glVertexAttribDivisor(0, 0); + Serialise_glVertexArrayVertexAttribDivisorEXT(0, 0, 0); break; case VERTEXATTRIBBINDING: - Serialise_glVertexAttribBinding(0, 0); + Serialise_glVertexArrayVertexAttribBindingEXT(0, 0, 0); break; case VAO_ELEMENT_BUFFER: diff --git a/renderdoc/driver/gl/gl_driver.h b/renderdoc/driver/gl/gl_driver.h index 392b4cc79..4e0393626 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -857,9 +857,6 @@ class WrappedOpenGL IMPLEMENT_FUNCTION_SERIALISED(void, glGetNamedBufferParameteriv(GLuint buffer, GLenum pname, GLint *params)); IMPLEMENT_FUNCTION_SERIALISED(void, glGetNamedBufferPointerv(GLuint buffer, GLenum pname, void **params)); IMPLEMENT_FUNCTION_SERIALISED(void, glGetNamedBufferSubData(GLuint buffer, GLintptr offset, GLsizei size, void *data)); - IMPLEMENT_FUNCTION_SERIALISED(void, glGetNamedFramebufferAttachmentParameteriv(GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params)); - IMPLEMENT_FUNCTION_SERIALISED(void, glGetNamedFramebufferParameteriv(GLuint framebuffer, GLenum pname, GLint *param)); - IMPLEMENT_FUNCTION_SERIALISED(void, glGetNamedRenderbufferParameteriv(GLuint renderbuffer, GLenum pname, GLint *params)); enum UniformType { @@ -1049,16 +1046,45 @@ class WrappedOpenGL IMPLEMENT_FUNCTION_SERIALISED(void, glCompressedTextureSubImage3DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *bits)); IMPLEMENT_FUNCTION_SERIALISED(void, glFramebufferDrawBuffersEXT(GLuint framebuffer, GLsizei n, const GLenum *bufs)); IMPLEMENT_FUNCTION_SERIALISED(void, glGenerateTextureMipmapEXT(GLuint texture, GLenum target)); - IMPLEMENT_FUNCTION_SERIALISED(void, glGetCompressedTextureImageEXT(GLuint texture, GLenum target, GLint lod, void *img)); - IMPLEMENT_FUNCTION_SERIALISED(void, glGetNamedBufferSubDataEXT(GLuint buffer, GLintptr offset, GLsizeiptr size, void *data)); - IMPLEMENT_FUNCTION_SERIALISED(void, glGetNamedBufferParameterivEXT(GLuint buffer, GLenum pname, GLint *params)); + IMPLEMENT_FUNCTION_SERIALISED(void, glGetPointeri_vEXT(GLenum pname, GLuint index, void **params)); + IMPLEMENT_FUNCTION_SERIALISED(void, glGetDoubleIndexedvEXT(GLenum target, GLuint index, GLdouble *data)); + IMPLEMENT_FUNCTION_SERIALISED(void, glGetPointerIndexedvEXT(GLenum target, GLuint index, void **data)); + IMPLEMENT_FUNCTION_SERIALISED(void, glGetIntegerIndexedvEXT(GLenum target, GLuint index, GLint *data)); + IMPLEMENT_FUNCTION_SERIALISED(void, glGetBooleanIndexedvEXT(GLenum target, GLuint index, GLboolean *data)); + IMPLEMENT_FUNCTION_SERIALISED(void, glGetFloatIndexedvEXT(GLenum target, GLuint index, GLfloat *data)); + IMPLEMENT_FUNCTION_SERIALISED(void, glGetMultiTexImageEXT(GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void *pixels)); + IMPLEMENT_FUNCTION_SERIALISED(void, glGetMultiTexParameterfvEXT(GLenum texunit, GLenum target, GLenum pname, GLfloat *params)); + IMPLEMENT_FUNCTION_SERIALISED(void, glGetMultiTexParameterivEXT(GLenum texunit, GLenum target, GLenum pname, GLint *params)); + IMPLEMENT_FUNCTION_SERIALISED(void, glGetMultiTexParameterIivEXT(GLenum texunit, GLenum target, GLenum pname, GLint *params)); + IMPLEMENT_FUNCTION_SERIALISED(void, glGetMultiTexParameterIuivEXT(GLenum texunit, GLenum target, GLenum pname, GLuint *params)); + IMPLEMENT_FUNCTION_SERIALISED(void, glGetMultiTexLevelParameterfvEXT(GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat *params)); + IMPLEMENT_FUNCTION_SERIALISED(void, glGetMultiTexLevelParameterivEXT(GLenum texunit, GLenum target, GLint level, GLenum pname, GLint *params)); + IMPLEMENT_FUNCTION_SERIALISED(void, glGetCompressedMultiTexImageEXT(GLenum texunit, GLenum target, GLint lod, void *img)); + IMPLEMENT_FUNCTION_SERIALISED(void, glGetNamedBufferPointervEXT(GLuint buffer, GLenum pname, void **params)); + IMPLEMENT_FUNCTION_SERIALISED(void, glGetNamedProgramivEXT(GLuint program, GLenum target, GLenum pname, GLint *params)); IMPLEMENT_FUNCTION_SERIALISED(void, glGetNamedFramebufferAttachmentParameterivEXT(GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params)); + IMPLEMENT_FUNCTION_SERIALISED(void, glGetNamedBufferParameterivEXT(GLuint buffer, GLenum pname, GLint *params)); + IMPLEMENT_FUNCTION_SERIALISED(void, glGetNamedBufferSubDataEXT(GLuint buffer, GLintptr offset, GLsizeiptr size, void *data)); + IMPLEMENT_FUNCTION_SERIALISED(void, glGetNamedFramebufferParameterivEXT(GLuint framebuffer, GLenum pname, GLint *params)); + IMPLEMENT_FUNCTION_SERIALISED(void, glGetNamedRenderbufferParameterivEXT(GLuint renderbuffer, GLenum pname, GLint *params)); + IMPLEMENT_FUNCTION_SERIALISED(void, glGetVertexArrayIntegervEXT(GLuint vaobj, GLenum pname, GLint *param)); + IMPLEMENT_FUNCTION_SERIALISED(void, glGetVertexArrayPointervEXT(GLuint vaobj, GLenum pname, void **param)); + IMPLEMENT_FUNCTION_SERIALISED(void, glGetVertexArrayIntegeri_vEXT(GLuint vaobj, GLuint index, GLenum pname, GLint *param)); + IMPLEMENT_FUNCTION_SERIALISED(void, glGetVertexArrayPointeri_vEXT(GLuint vaobj, GLuint index, GLenum pname, void **param)); + IMPLEMENT_FUNCTION_SERIALISED(void, glGetCompressedTextureImageEXT(GLuint texture, GLenum target, GLint lod, void *img)); IMPLEMENT_FUNCTION_SERIALISED(void, glGetTextureImageEXT(GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void *pixels)); IMPLEMENT_FUNCTION_SERIALISED(void, glGetTextureParameterivEXT(GLuint texture, GLenum target, GLenum pname, GLint *params)); IMPLEMENT_FUNCTION_SERIALISED(void, glGetTextureParameterfvEXT(GLuint texture, GLenum target, GLenum pname, GLfloat *params)); + IMPLEMENT_FUNCTION_SERIALISED(void, glGetTextureParameterIivEXT(GLuint texture, GLenum target, GLenum pname, GLint *params)); + IMPLEMENT_FUNCTION_SERIALISED(void, glGetTextureParameterIuivEXT(GLuint texture, GLenum target, GLenum pname, GLuint *params)); IMPLEMENT_FUNCTION_SERIALISED(void, glGetTextureLevelParameterivEXT(GLuint texture, GLenum target, GLint level, GLenum pname, GLint *params)); + IMPLEMENT_FUNCTION_SERIALISED(void, glGetTextureLevelParameterfvEXT(GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat *params)); IMPLEMENT_FUNCTION_SERIALISED(void *, glMapNamedBufferEXT(GLuint buffer, GLenum access)); IMPLEMENT_FUNCTION_SERIALISED(void *, glMapNamedBufferRangeEXT(GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access)); + IMPLEMENT_FUNCTION_SERIALISED(void, glFlushMappedNamedBufferRangeEXT(GLuint buffer, GLintptr offset, GLsizeiptr length)); + IMPLEMENT_FUNCTION_SERIALISED(GLboolean, glUnmapNamedBufferEXT(GLuint buffer)); + IMPLEMENT_FUNCTION_SERIALISED(void, glClearNamedBufferDataEXT(GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data)); + IMPLEMENT_FUNCTION_SERIALISED(void, glClearNamedBufferSubDataEXT(GLuint buffer, GLenum internalformat, GLsizeiptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data)); IMPLEMENT_FUNCTION_SERIALISED(void, glNamedBufferDataEXT(GLuint buffer, GLsizeiptr size, const void *data, GLenum usage)); IMPLEMENT_FUNCTION_SERIALISED(void, glNamedBufferStorageEXT(GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags)); IMPLEMENT_FUNCTION_SERIALISED(void, glNamedBufferSubDataEXT(GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data)); @@ -1070,7 +1096,41 @@ class WrappedOpenGL 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, glNamedFramebufferParameteriEXT(GLuint framebuffer, GLenum pname, GLint param)); + IMPLEMENT_FUNCTION_SERIALISED(void, glFramebufferDrawBufferEXT(GLuint framebuffer, GLenum mode)); + IMPLEMENT_FUNCTION_SERIALISED(void, glFramebufferReadBufferEXT(GLuint framebuffer, GLenum mode)); + IMPLEMENT_FUNCTION_SERIALISED(void, glNamedRenderbufferStorageEXT(GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height)); + IMPLEMENT_FUNCTION_SERIALISED(void, glNamedRenderbufferStorageMultisampleEXT(GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)); + IMPLEMENT_FUNCTION_SERIALISED(void, glCopyTextureImage1DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)); + IMPLEMENT_FUNCTION_SERIALISED(void, glCopyTextureImage2DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)); + IMPLEMENT_FUNCTION_SERIALISED(void, glCopyTextureSubImage1DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)); + IMPLEMENT_FUNCTION_SERIALISED(void, glCopyTextureSubImage2DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)); + IMPLEMENT_FUNCTION_SERIALISED(void, glCopyTextureSubImage3DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)); IMPLEMENT_FUNCTION_SERIALISED(void, glBindMultiTextureEXT(GLenum texunit, GLenum target, GLuint texture)); + IMPLEMENT_FUNCTION_SERIALISED(void, glMultiTexParameteriEXT(GLenum texunit, GLenum target, GLenum pname, GLint param)); + IMPLEMENT_FUNCTION_SERIALISED(void, glMultiTexParameterivEXT(GLenum texunit, GLenum target, GLenum pname, const GLint *params)); + IMPLEMENT_FUNCTION_SERIALISED(void, glMultiTexParameterfEXT(GLenum texunit, GLenum target, GLenum pname, GLfloat param)); + IMPLEMENT_FUNCTION_SERIALISED(void, glMultiTexParameterfvEXT(GLenum texunit, GLenum target, GLenum pname, const GLfloat *params)); + IMPLEMENT_FUNCTION_SERIALISED(void, glMultiTexImage1DEXT(GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels)); + IMPLEMENT_FUNCTION_SERIALISED(void, glMultiTexImage2DEXT(GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels)); + IMPLEMENT_FUNCTION_SERIALISED(void, glMultiTexSubImage1DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels)); + IMPLEMENT_FUNCTION_SERIALISED(void, glMultiTexSubImage2DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels)); + IMPLEMENT_FUNCTION_SERIALISED(void, glCopyMultiTexImage1DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border)); + IMPLEMENT_FUNCTION_SERIALISED(void, glCopyMultiTexImage2DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)); + IMPLEMENT_FUNCTION_SERIALISED(void, glCopyMultiTexSubImage1DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)); + IMPLEMENT_FUNCTION_SERIALISED(void, glCopyMultiTexSubImage2DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)); + IMPLEMENT_FUNCTION_SERIALISED(void, glMultiTexImage3DEXT(GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels)); + IMPLEMENT_FUNCTION_SERIALISED(void, glMultiTexSubImage3DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels)); + IMPLEMENT_FUNCTION_SERIALISED(void, glCopyMultiTexSubImage3DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height)); + IMPLEMENT_FUNCTION_SERIALISED(void, glCompressedMultiTexImage3DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits)); + IMPLEMENT_FUNCTION_SERIALISED(void, glCompressedMultiTexImage2DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits)); + IMPLEMENT_FUNCTION_SERIALISED(void, glCompressedMultiTexImage1DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits)); + IMPLEMENT_FUNCTION_SERIALISED(void, glCompressedMultiTexSubImage3DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *bits)); + IMPLEMENT_FUNCTION_SERIALISED(void, glCompressedMultiTexSubImage2DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits)); + IMPLEMENT_FUNCTION_SERIALISED(void, glCompressedMultiTexSubImage1DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits)); + IMPLEMENT_FUNCTION_SERIALISED(void, glMultiTexBufferEXT(GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer)); + IMPLEMENT_FUNCTION_SERIALISED(void, glMultiTexParameterIivEXT(GLenum texunit, GLenum target, GLenum pname, const GLint *params)); + IMPLEMENT_FUNCTION_SERIALISED(void, glMultiTexParameterIuivEXT(GLenum texunit, GLenum target, GLenum pname, const GLuint *params)); + IMPLEMENT_FUNCTION_SERIALISED(void, glGenerateMultiTexMipmapEXT(GLenum texunit, GLenum target)); IMPLEMENT_FUNCTION_SERIALISED(void, glTextureBufferEXT(GLuint texture, GLenum target, GLenum internalformat, GLuint buffer)); 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)); @@ -1090,5 +1150,18 @@ class WrappedOpenGL IMPLEMENT_FUNCTION_SERIALISED(void, glTextureSubImage1DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels)); IMPLEMENT_FUNCTION_SERIALISED(void, glTextureSubImage2DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels)); IMPLEMENT_FUNCTION_SERIALISED(void, glTextureSubImage3DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels)); - IMPLEMENT_FUNCTION_SERIALISED(GLboolean, glUnmapNamedBufferEXT(GLuint buffer)); + IMPLEMENT_FUNCTION_SERIALISED(void, glVertexArrayVertexAttribOffsetEXT(GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset)); + IMPLEMENT_FUNCTION_SERIALISED(void, glVertexArrayVertexAttribIOffsetEXT(GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset)); + IMPLEMENT_FUNCTION_SERIALISED(void, glEnableVertexArrayEXT(GLuint vaobj, GLenum array)); + IMPLEMENT_FUNCTION_SERIALISED(void, glDisableVertexArrayEXT(GLuint vaobj, GLenum array)); + IMPLEMENT_FUNCTION_SERIALISED(void, glEnableVertexArrayAttribEXT(GLuint vaobj, GLuint index)); + IMPLEMENT_FUNCTION_SERIALISED(void, glDisableVertexArrayAttribEXT(GLuint vaobj, GLuint index)); + IMPLEMENT_FUNCTION_SERIALISED(void, glVertexArrayBindVertexBufferEXT(GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride)); + IMPLEMENT_FUNCTION_SERIALISED(void, glVertexArrayVertexAttribFormatEXT(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset)); + IMPLEMENT_FUNCTION_SERIALISED(void, glVertexArrayVertexAttribIFormatEXT(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)); + IMPLEMENT_FUNCTION_SERIALISED(void, glVertexArrayVertexAttribLFormatEXT(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset)); + IMPLEMENT_FUNCTION_SERIALISED(void, glVertexArrayVertexAttribBindingEXT(GLuint vaobj, GLuint attribindex, GLuint bindingindex)); + IMPLEMENT_FUNCTION_SERIALISED(void, glVertexArrayVertexBindingDivisorEXT(GLuint vaobj, GLuint bindingindex, GLuint divisor)); + IMPLEMENT_FUNCTION_SERIALISED(void, glVertexArrayVertexAttribLOffsetEXT(GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset)); + IMPLEMENT_FUNCTION_SERIALISED(void, glVertexArrayVertexAttribDivisorEXT(GLuint vaobj, GLuint index, GLuint divisor)); }; diff --git a/renderdoc/driver/gl/gl_hookset.h b/renderdoc/driver/gl/gl_hookset.h index a37f72eb1..74ff95774 100644 --- a/renderdoc/driver/gl/gl_hookset.h +++ b/renderdoc/driver/gl/gl_hookset.h @@ -129,8 +129,8 @@ struct GLHookSet PFNGLGETSTRINGIPROC glGetStringi; PFNGLGETBOOLEANI_VPROC glGetBooleani_v; PFNGLGETINTEGERI_VPROC glGetIntegeri_v; - PFNGLGETFLOATI_VPROC glGetFloati_v; - PFNGLGETDOUBLEI_VPROC glGetDoublei_v; + PFNGLGETFLOATI_VPROC glGetFloati_v; // aliases glGetFloati_vEXT + PFNGLGETDOUBLEI_VPROC glGetDoublei_v; // aliases glGetDoublei_vEXT PFNGLGETINTEGER64I_VPROC glGetInteger64i_v; PFNGLGETINTEGER64VPROC glGetInteger64v; PFNGLGETSHADERIVPROC glGetShaderiv; @@ -227,12 +227,7 @@ struct GLHookSet PFNGLGETVERTEXATTRIBDVPROC glGetVertexAttribdv; PFNGLGETVERTEXATTRIBFVPROC glGetVertexAttribfv; PFNGLGETNAMEDBUFFERPARAMETERI64VPROC glGetNamedBufferParameteri64v; - PFNGLGETNAMEDBUFFERPARAMETERIVPROC glGetNamedBufferParameteriv; PFNGLGETNAMEDBUFFERPOINTERVPROC glGetNamedBufferPointerv; - PFNGLGETNAMEDBUFFERSUBDATAPROC glGetNamedBufferSubData; - PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC glGetNamedFramebufferAttachmentParameteriv; - PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC glGetNamedFramebufferParameteriv; - PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC glGetNamedRenderbufferParameteriv; PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus; PFNGLBLENDCOLORPROC glBlendColor; PFNGLBLENDFUNCIPROC glBlendFunci; // aliases glBlendFunciARB @@ -285,9 +280,9 @@ struct GLHookSet PFNGLPOPDEBUGGROUPPROC glPopDebugGroup; PFNGLOBJECTLABELPROC glObjectLabel; PFNGLOBJECTPTRLABELPROC glObjectPtrLabel; - PFNGLENABLEIPROC glEnablei; - PFNGLDISABLEIPROC glDisablei; - PFNGLISENABLEDIPROC glIsEnabledi; + PFNGLENABLEIPROC glEnablei; // aliases glEnableIndexedEXT + PFNGLDISABLEIPROC glDisablei; // aliases glDisableIndexedEXT + PFNGLISENABLEDIPROC glIsEnabledi; // aliases glIsEnabledIndexedEXT PFNGLISBUFFERPROC glIsBuffer; // aliases glIsBufferARB PFNGLISFRAMEBUFFERPROC glIsFramebuffer; PFNGLISPROGRAMPROC glIsProgram; @@ -620,17 +615,46 @@ struct GLHookSet PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC glCompressedTextureSubImage3DEXT; PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC glFramebufferDrawBuffersEXT; PFNGLGENERATETEXTUREMIPMAPEXTPROC glGenerateTextureMipmapEXT; + PFNGLGETPOINTERI_VEXTPROC glGetPointeri_vEXT; + PFNGLGETDOUBLEINDEXEDVEXTPROC glGetDoubleIndexedvEXT; + PFNGLGETPOINTERINDEXEDVEXTPROC glGetPointerIndexedvEXT; + PFNGLGETINTEGERINDEXEDVEXTPROC glGetIntegerIndexedvEXT; + PFNGLGETBOOLEANINDEXEDVEXTPROC glGetBooleanIndexedvEXT; + PFNGLGETFLOATINDEXEDVEXTPROC glGetFloatIndexedvEXT; + PFNGLGETMULTITEXIMAGEEXTPROC glGetMultiTexImageEXT; + PFNGLGETMULTITEXPARAMETERFVEXTPROC glGetMultiTexParameterfvEXT; + PFNGLGETMULTITEXPARAMETERIVEXTPROC glGetMultiTexParameterivEXT; + PFNGLGETMULTITEXPARAMETERIIVEXTPROC glGetMultiTexParameterIivEXT; + PFNGLGETMULTITEXPARAMETERIUIVEXTPROC glGetMultiTexParameterIuivEXT; + PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC glGetMultiTexLevelParameterfvEXT; + PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC glGetMultiTexLevelParameterivEXT; + PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC glGetCompressedMultiTexImageEXT; + PFNGLGETNAMEDBUFFERPOINTERVEXTPROC glGetNamedBufferPointervEXT; + PFNGLGETNAMEDPROGRAMIVEXTPROC glGetNamedProgramivEXT; + PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC glGetNamedFramebufferAttachmentParameterivEXT; // aliases glGetNamedFramebufferAttachmentParameteriv + PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC glGetNamedBufferParameterivEXT; // aliases glGetNamedBufferParameteriv + PFNGLGETNAMEDBUFFERSUBDATAEXTPROC glGetNamedBufferSubDataEXT; // aliases glGetNamedBufferSubData + PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC glGetNamedFramebufferParameterivEXT; // aliases glGetFramebufferParameterivEXT, glGetNamedFramebufferParameteriv + PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC glGetNamedRenderbufferParameterivEXT; // aliases glGetNamedRenderbufferParameteriv + PFNGLGETVERTEXARRAYINTEGERVEXTPROC glGetVertexArrayIntegervEXT; + PFNGLGETVERTEXARRAYPOINTERVEXTPROC glGetVertexArrayPointervEXT; + PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC glGetVertexArrayIntegeri_vEXT; + PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC glGetVertexArrayPointeri_vEXT; PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC glGetCompressedTextureImageEXT; - PFNGLGETNAMEDBUFFERSUBDATAEXTPROC glGetNamedBufferSubDataEXT; - PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC glGetNamedBufferParameterivEXT; - PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC glGetNamedFramebufferAttachmentParameterivEXT; PFNGLGETTEXTUREIMAGEEXTPROC glGetTextureImageEXT; PFNGLGETTEXTUREPARAMETERIVEXTPROC glGetTextureParameterivEXT; PFNGLGETTEXTUREPARAMETERFVEXTPROC glGetTextureParameterfvEXT; + PFNGLGETTEXTUREPARAMETERIIVEXTPROC glGetTextureParameterIivEXT; + PFNGLGETTEXTUREPARAMETERIUIVEXTPROC glGetTextureParameterIuivEXT; PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC glGetTextureLevelParameterivEXT; + PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC glGetTextureLevelParameterfvEXT; PFNGLBINDMULTITEXTUREEXTPROC glBindMultiTextureEXT; PFNGLMAPNAMEDBUFFEREXTPROC glMapNamedBufferEXT; PFNGLMAPNAMEDBUFFERRANGEEXTPROC glMapNamedBufferRangeEXT; + PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC glFlushMappedNamedBufferRangeEXT; + PFNGLUNMAPNAMEDBUFFEREXTPROC glUnmapNamedBufferEXT; + PFNGLCLEARNAMEDBUFFERDATAEXTPROC glClearNamedBufferDataEXT; + PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC glClearNamedBufferSubDataEXT; PFNGLNAMEDBUFFERDATAEXTPROC glNamedBufferDataEXT; PFNGLNAMEDBUFFERSTORAGEEXTPROC glNamedBufferStorageEXT; PFNGLNAMEDBUFFERSUBDATAEXTPROC glNamedBufferSubDataEXT; @@ -642,6 +666,10 @@ struct GLHookSet PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC glNamedFramebufferRenderbufferEXT; PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC glNamedFramebufferTextureLayerEXT; PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC glNamedFramebufferParameteriEXT; + PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC glNamedRenderbufferStorageEXT; + PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC glNamedRenderbufferStorageMultisampleEXT; + PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC glFramebufferDrawBufferEXT; + PFNGLFRAMEBUFFERREADBUFFEREXTPROC glFramebufferReadBufferEXT; PFNGLTEXTUREBUFFEREXTPROC glTextureBufferEXT; PFNGLTEXTUREBUFFERRANGEEXTPROC glTextureBufferRangeEXT; PFNGLTEXTUREIMAGE1DEXTPROC glTextureImage1DEXT; @@ -661,7 +689,48 @@ struct GLHookSet PFNGLTEXTURESUBIMAGE1DEXTPROC glTextureSubImage1DEXT; PFNGLTEXTURESUBIMAGE2DEXTPROC glTextureSubImage2DEXT; PFNGLTEXTURESUBIMAGE3DEXTPROC glTextureSubImage3DEXT; - PFNGLUNMAPNAMEDBUFFEREXTPROC glUnmapNamedBufferEXT; + PFNGLCOPYTEXTUREIMAGE1DEXTPROC glCopyTextureImage1DEXT; + PFNGLCOPYTEXTUREIMAGE2DEXTPROC glCopyTextureImage2DEXT; + PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC glCopyTextureSubImage1DEXT; + PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC glCopyTextureSubImage2DEXT; + PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC glCopyTextureSubImage3DEXT; + PFNGLMULTITEXPARAMETERIEXTPROC glMultiTexParameteriEXT; + PFNGLMULTITEXPARAMETERIVEXTPROC glMultiTexParameterivEXT; + PFNGLMULTITEXPARAMETERFEXTPROC glMultiTexParameterfEXT; + PFNGLMULTITEXPARAMETERFVEXTPROC glMultiTexParameterfvEXT; + PFNGLMULTITEXIMAGE1DEXTPROC glMultiTexImage1DEXT; + PFNGLMULTITEXIMAGE2DEXTPROC glMultiTexImage2DEXT; + PFNGLMULTITEXSUBIMAGE1DEXTPROC glMultiTexSubImage1DEXT; + PFNGLMULTITEXSUBIMAGE2DEXTPROC glMultiTexSubImage2DEXT; + PFNGLCOPYMULTITEXIMAGE1DEXTPROC glCopyMultiTexImage1DEXT; + PFNGLCOPYMULTITEXIMAGE2DEXTPROC glCopyMultiTexImage2DEXT; + PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC glCopyMultiTexSubImage1DEXT; + PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC glCopyMultiTexSubImage2DEXT; + PFNGLMULTITEXIMAGE3DEXTPROC glMultiTexImage3DEXT; + PFNGLMULTITEXSUBIMAGE3DEXTPROC glMultiTexSubImage3DEXT; + PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC glCopyMultiTexSubImage3DEXT; + PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC glCompressedMultiTexImage3DEXT; + PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC glCompressedMultiTexImage2DEXT; + PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC glCompressedMultiTexImage1DEXT; + PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC glCompressedMultiTexSubImage3DEXT; + PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC glCompressedMultiTexSubImage2DEXT; + PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC glCompressedMultiTexSubImage1DEXT; + PFNGLMULTITEXBUFFEREXTPROC glMultiTexBufferEXT; + PFNGLMULTITEXPARAMETERIIVEXTPROC glMultiTexParameterIivEXT; + PFNGLMULTITEXPARAMETERIUIVEXTPROC glMultiTexParameterIuivEXT; + PFNGLGENERATEMULTITEXMIPMAPEXTPROC glGenerateMultiTexMipmapEXT; + PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC glVertexArrayVertexAttribOffsetEXT; + PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC glVertexArrayVertexAttribIOffsetEXT; + PFNGLENABLEVERTEXARRAYATTRIBEXTPROC glEnableVertexArrayAttribEXT; + PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC glDisableVertexArrayAttribEXT; + PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC glVertexArrayBindVertexBufferEXT; + PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC glVertexArrayVertexAttribFormatEXT; + PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC glVertexArrayVertexAttribIFormatEXT; + PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC glVertexArrayVertexAttribLFormatEXT; + PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC glVertexArrayVertexAttribBindingEXT; + PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC glVertexArrayVertexBindingDivisorEXT; + PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC glVertexArrayVertexAttribLOffsetEXT; + PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC glVertexArrayVertexAttribDivisorEXT; // -- }; diff --git a/renderdoc/driver/gl/gl_hookset_defs.h b/renderdoc/driver/gl/gl_hookset_defs.h index bfca94770..4de477bee 100644 --- a/renderdoc/driver/gl/gl_hookset_defs.h +++ b/renderdoc/driver/gl/gl_hookset_defs.h @@ -142,7 +142,9 @@ HookExtension(PFNGLGETBOOLEANI_VPROC, glGetBooleani_v); \ HookExtension(PFNGLGETINTEGERI_VPROC, glGetIntegeri_v); \ HookExtension(PFNGLGETFLOATI_VPROC, glGetFloati_v); \ + HookExtensionAlias(PFNGLGETFLOATI_VPROC, glGetFloati_v, glGetFloati_vEXT); \ HookExtension(PFNGLGETDOUBLEI_VPROC, glGetDoublei_v); \ + HookExtensionAlias(PFNGLGETDOUBLEI_VPROC, glGetDoublei_v, glGetDoublei_vEXT); \ HookExtension(PFNGLGETINTEGER64I_VPROC, glGetInteger64i_v); \ HookExtension(PFNGLGETINTEGER64VPROC, glGetInteger64v); \ HookExtension(PFNGLGETSHADERIVPROC, glGetShaderiv); \ @@ -256,12 +258,7 @@ HookExtension(PFNGLGETVERTEXATTRIBDVPROC, glGetVertexAttribdv); \ HookExtension(PFNGLGETVERTEXATTRIBFVPROC, glGetVertexAttribfv); \ HookExtension(PFNGLGETNAMEDBUFFERPARAMETERI64VPROC, glGetNamedBufferParameteri64v); \ - HookExtension(PFNGLGETNAMEDBUFFERPARAMETERIVPROC, glGetNamedBufferParameteriv); \ HookExtension(PFNGLGETNAMEDBUFFERPOINTERVPROC, glGetNamedBufferPointerv); \ - HookExtension(PFNGLGETNAMEDBUFFERSUBDATAPROC, glGetNamedBufferSubData); \ - HookExtension(PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC, glGetNamedFramebufferAttachmentParameteriv); \ - HookExtension(PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC, glGetNamedFramebufferParameteriv); \ - HookExtension(PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC, glGetNamedRenderbufferParameteriv); \ HookExtension(PFNGLCHECKFRAMEBUFFERSTATUSPROC, glCheckFramebufferStatus); \ HookExtension(PFNGLBLENDCOLORPROC, glBlendColor); \ HookExtension(PFNGLBLENDFUNCIPROC, glBlendFunci); \ @@ -325,8 +322,11 @@ HookExtension(PFNGLOBJECTLABELPROC, glObjectLabel); \ HookExtension(PFNGLOBJECTPTRLABELPROC, glObjectPtrLabel); \ HookExtension(PFNGLENABLEIPROC, glEnablei); \ + HookExtensionAlias(PFNGLENABLEIPROC, glEnablei, glEnableIndexedEXT); \ HookExtension(PFNGLDISABLEIPROC, glDisablei); \ + HookExtensionAlias(PFNGLDISABLEIPROC, glDisablei, glDisableIndexedEXT); \ HookExtension(PFNGLISENABLEDIPROC, glIsEnabledi); \ + HookExtensionAlias(PFNGLISENABLEDIPROC, glIsEnabledi, glIsEnabledIndexedEXT); \ HookExtension(PFNGLISBUFFERPROC, glIsBuffer); \ HookExtensionAlias(PFNGLISBUFFERPROC, glIsBuffer, glIsBufferARB); \ HookExtension(PFNGLISFRAMEBUFFERPROC, glIsFramebuffer); \ @@ -674,17 +674,52 @@ HookExtension(PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC, glCompressedTextureSubImage3DEXT); \ HookExtension(PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC, glFramebufferDrawBuffersEXT); \ HookExtension(PFNGLGENERATETEXTUREMIPMAPEXTPROC, glGenerateTextureMipmapEXT); \ - HookExtension(PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC, glGetCompressedTextureImageEXT); \ - HookExtension(PFNGLGETNAMEDBUFFERSUBDATAEXTPROC, glGetNamedBufferSubDataEXT); \ - HookExtension(PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC, glGetNamedBufferParameterivEXT); \ + HookExtension(PFNGLGETPOINTERI_VEXTPROC, glGetPointeri_vEXT); \ + HookExtension(PFNGLGETDOUBLEINDEXEDVEXTPROC, glGetDoubleIndexedvEXT); \ + HookExtension(PFNGLGETPOINTERINDEXEDVEXTPROC, glGetPointerIndexedvEXT); \ + HookExtension(PFNGLGETINTEGERINDEXEDVEXTPROC, glGetIntegerIndexedvEXT); \ + HookExtension(PFNGLGETBOOLEANINDEXEDVEXTPROC, glGetBooleanIndexedvEXT); \ + HookExtension(PFNGLGETFLOATINDEXEDVEXTPROC, glGetFloatIndexedvEXT); \ + HookExtension(PFNGLGETMULTITEXIMAGEEXTPROC, glGetMultiTexImageEXT); \ + HookExtension(PFNGLGETMULTITEXPARAMETERFVEXTPROC, glGetMultiTexParameterfvEXT); \ + HookExtension(PFNGLGETMULTITEXPARAMETERIVEXTPROC, glGetMultiTexParameterivEXT); \ + HookExtension(PFNGLGETMULTITEXPARAMETERIIVEXTPROC, glGetMultiTexParameterIivEXT); \ + HookExtension(PFNGLGETMULTITEXPARAMETERIUIVEXTPROC, glGetMultiTexParameterIuivEXT); \ + HookExtension(PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC, glGetMultiTexLevelParameterfvEXT); \ + HookExtension(PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC, glGetMultiTexLevelParameterivEXT); \ + HookExtension(PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC, glGetCompressedMultiTexImageEXT); \ + HookExtension(PFNGLGETNAMEDBUFFERPOINTERVEXTPROC, glGetNamedBufferPointervEXT); \ + HookExtension(PFNGLGETNAMEDPROGRAMIVEXTPROC, glGetNamedProgramivEXT); \ HookExtension(PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC, glGetNamedFramebufferAttachmentParameterivEXT); \ + HookExtensionAlias(PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC, glGetNamedFramebufferAttachmentParameterivEXT, glGetNamedFramebufferAttachmentParameteriv); \ + HookExtension(PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC, glGetNamedBufferParameterivEXT); \ + HookExtensionAlias(PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC, glGetNamedBufferParameterivEXT, glGetNamedBufferParameteriv); \ + HookExtension(PFNGLGETNAMEDBUFFERSUBDATAEXTPROC, glGetNamedBufferSubDataEXT); \ + HookExtensionAlias(PFNGLGETNAMEDBUFFERSUBDATAEXTPROC, glGetNamedBufferSubDataEXT, glGetNamedBufferSubData); \ + HookExtension(PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC, glGetNamedFramebufferParameterivEXT); \ + HookExtensionAlias(PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC, glGetNamedFramebufferParameterivEXT, glGetFramebufferParameterivEXT); \ + HookExtensionAlias(PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC, glGetNamedFramebufferParameterivEXT, glGetNamedFramebufferParameteriv); \ + HookExtension(PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC, glGetNamedRenderbufferParameterivEXT); \ + HookExtensionAlias(PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC, glGetNamedRenderbufferParameterivEXT, glGetNamedRenderbufferParameteriv); \ + HookExtension(PFNGLGETVERTEXARRAYINTEGERVEXTPROC, glGetVertexArrayIntegervEXT); \ + HookExtension(PFNGLGETVERTEXARRAYPOINTERVEXTPROC, glGetVertexArrayPointervEXT); \ + HookExtension(PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC, glGetVertexArrayIntegeri_vEXT); \ + HookExtension(PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC, glGetVertexArrayPointeri_vEXT); \ + HookExtension(PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC, glGetCompressedTextureImageEXT); \ HookExtension(PFNGLGETTEXTUREIMAGEEXTPROC, glGetTextureImageEXT); \ HookExtension(PFNGLGETTEXTUREPARAMETERIVEXTPROC, glGetTextureParameterivEXT); \ HookExtension(PFNGLGETTEXTUREPARAMETERFVEXTPROC, glGetTextureParameterfvEXT); \ + HookExtension(PFNGLGETTEXTUREPARAMETERIIVEXTPROC, glGetTextureParameterIivEXT); \ + HookExtension(PFNGLGETTEXTUREPARAMETERIUIVEXTPROC, glGetTextureParameterIuivEXT); \ HookExtension(PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC, glGetTextureLevelParameterivEXT); \ + HookExtension(PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC, glGetTextureLevelParameterfvEXT); \ HookExtension(PFNGLBINDMULTITEXTUREEXTPROC, glBindMultiTextureEXT); \ HookExtension(PFNGLMAPNAMEDBUFFEREXTPROC, glMapNamedBufferEXT); \ HookExtension(PFNGLMAPNAMEDBUFFERRANGEEXTPROC, glMapNamedBufferRangeEXT); \ + HookExtension(PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC, glFlushMappedNamedBufferRangeEXT); \ + HookExtension(PFNGLUNMAPNAMEDBUFFEREXTPROC, glUnmapNamedBufferEXT); \ + HookExtension(PFNGLCLEARNAMEDBUFFERDATAEXTPROC, glClearNamedBufferDataEXT); \ + HookExtension(PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC, glClearNamedBufferSubDataEXT); \ HookExtension(PFNGLNAMEDBUFFERDATAEXTPROC, glNamedBufferDataEXT); \ HookExtension(PFNGLNAMEDBUFFERSTORAGEEXTPROC, glNamedBufferStorageEXT); \ HookExtension(PFNGLNAMEDBUFFERSUBDATAEXTPROC, glNamedBufferSubDataEXT); \ @@ -696,6 +731,10 @@ HookExtension(PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC, glNamedFramebufferRenderbufferEXT); \ HookExtension(PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC, glNamedFramebufferTextureLayerEXT); \ HookExtension(PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC, glNamedFramebufferParameteriEXT); \ + HookExtension(PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC, glNamedRenderbufferStorageEXT); \ + HookExtension(PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC, glNamedRenderbufferStorageMultisampleEXT); \ + HookExtension(PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC, glFramebufferDrawBufferEXT); \ + HookExtension(PFNGLFRAMEBUFFERREADBUFFEREXTPROC, glFramebufferReadBufferEXT); \ HookExtension(PFNGLTEXTUREBUFFEREXTPROC, glTextureBufferEXT); \ HookExtension(PFNGLTEXTUREBUFFERRANGEEXTPROC, glTextureBufferRangeEXT); \ HookExtension(PFNGLTEXTUREIMAGE1DEXTPROC, glTextureImage1DEXT); \ @@ -715,7 +754,48 @@ HookExtension(PFNGLTEXTURESUBIMAGE1DEXTPROC, glTextureSubImage1DEXT); \ HookExtension(PFNGLTEXTURESUBIMAGE2DEXTPROC, glTextureSubImage2DEXT); \ HookExtension(PFNGLTEXTURESUBIMAGE3DEXTPROC, glTextureSubImage3DEXT); \ - HookExtension(PFNGLUNMAPNAMEDBUFFEREXTPROC, glUnmapNamedBufferEXT); \ + HookExtension(PFNGLCOPYTEXTUREIMAGE1DEXTPROC, glCopyTextureImage1DEXT); \ + HookExtension(PFNGLCOPYTEXTUREIMAGE2DEXTPROC, glCopyTextureImage2DEXT); \ + HookExtension(PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC, glCopyTextureSubImage1DEXT); \ + HookExtension(PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC, glCopyTextureSubImage2DEXT); \ + HookExtension(PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC, glCopyTextureSubImage3DEXT); \ + HookExtension(PFNGLMULTITEXPARAMETERIEXTPROC, glMultiTexParameteriEXT); \ + HookExtension(PFNGLMULTITEXPARAMETERIVEXTPROC, glMultiTexParameterivEXT); \ + HookExtension(PFNGLMULTITEXPARAMETERFEXTPROC, glMultiTexParameterfEXT); \ + HookExtension(PFNGLMULTITEXPARAMETERFVEXTPROC, glMultiTexParameterfvEXT); \ + HookExtension(PFNGLMULTITEXIMAGE1DEXTPROC, glMultiTexImage1DEXT); \ + HookExtension(PFNGLMULTITEXIMAGE2DEXTPROC, glMultiTexImage2DEXT); \ + HookExtension(PFNGLMULTITEXSUBIMAGE1DEXTPROC, glMultiTexSubImage1DEXT); \ + HookExtension(PFNGLMULTITEXSUBIMAGE2DEXTPROC, glMultiTexSubImage2DEXT); \ + HookExtension(PFNGLCOPYMULTITEXIMAGE1DEXTPROC, glCopyMultiTexImage1DEXT); \ + HookExtension(PFNGLCOPYMULTITEXIMAGE2DEXTPROC, glCopyMultiTexImage2DEXT); \ + HookExtension(PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC, glCopyMultiTexSubImage1DEXT); \ + HookExtension(PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC, glCopyMultiTexSubImage2DEXT); \ + HookExtension(PFNGLMULTITEXIMAGE3DEXTPROC, glMultiTexImage3DEXT); \ + HookExtension(PFNGLMULTITEXSUBIMAGE3DEXTPROC, glMultiTexSubImage3DEXT); \ + HookExtension(PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC, glCopyMultiTexSubImage3DEXT); \ + HookExtension(PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC, glCompressedMultiTexImage3DEXT); \ + HookExtension(PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC, glCompressedMultiTexImage2DEXT); \ + HookExtension(PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC, glCompressedMultiTexImage1DEXT); \ + HookExtension(PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC, glCompressedMultiTexSubImage3DEXT); \ + HookExtension(PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC, glCompressedMultiTexSubImage2DEXT); \ + HookExtension(PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC, glCompressedMultiTexSubImage1DEXT); \ + HookExtension(PFNGLMULTITEXBUFFEREXTPROC, glMultiTexBufferEXT); \ + HookExtension(PFNGLMULTITEXPARAMETERIIVEXTPROC, glMultiTexParameterIivEXT); \ + HookExtension(PFNGLMULTITEXPARAMETERIUIVEXTPROC, glMultiTexParameterIuivEXT); \ + HookExtension(PFNGLGENERATEMULTITEXMIPMAPEXTPROC, glGenerateMultiTexMipmapEXT); \ + HookExtension(PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC, glVertexArrayVertexAttribOffsetEXT); \ + HookExtension(PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC, glVertexArrayVertexAttribIOffsetEXT); \ + HookExtension(PFNGLENABLEVERTEXARRAYATTRIBEXTPROC, glEnableVertexArrayAttribEXT); \ + HookExtension(PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC, glDisableVertexArrayAttribEXT); \ + HookExtension(PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC, glVertexArrayBindVertexBufferEXT); \ + HookExtension(PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC, glVertexArrayVertexAttribFormatEXT); \ + HookExtension(PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC, glVertexArrayVertexAttribIFormatEXT); \ + HookExtension(PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC, glVertexArrayVertexAttribLFormatEXT); \ + HookExtension(PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC, glVertexArrayVertexAttribBindingEXT); \ + HookExtension(PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC, glVertexArrayVertexBindingDivisorEXT); \ + HookExtension(PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC, glVertexArrayVertexAttribLOffsetEXT); \ + HookExtension(PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC, glVertexArrayVertexAttribDivisorEXT); \ HookExtension(PFNGLBINDTEXTUREPROC, glBindTexture); \ HookExtension(PFNGLBLENDFUNCPROC, glBlendFunc); \ HookExtension(PFNGLCLEARPROC, glClear); \ @@ -726,6 +806,7 @@ HookExtension(PFNGLCULLFACEPROC, glCullFace); \ HookExtension(PFNGLDEPTHFUNCPROC, glDepthFunc); \ HookExtension(PFNGLDEPTHMASKPROC, glDepthMask); \ + HookExtension(PFNGLDEPTHRANGEPROC, glDepthRange); \ HookExtension(PFNGLSTENCILFUNCPROC, glStencilFunc); \ HookExtension(PFNGLSTENCILMASKPROC, glStencilMask); \ HookExtension(PFNGLSTENCILOPPROC, glStencilOp); \ @@ -978,12 +1059,7 @@ HookWrapper3(void, glGetVertexAttribdv, GLuint, index, GLenum, pname, GLdouble *, params); \ HookWrapper3(void, glGetVertexAttribfv, GLuint, index, GLenum, pname, GLfloat *, params); \ HookWrapper3(void, glGetNamedBufferParameteri64v, GLuint, buffer, GLenum, pname, GLint64 *, params); \ - HookWrapper3(void, glGetNamedBufferParameteriv, GLuint, buffer, GLenum, pname, GLint *, params); \ HookWrapper3(void, glGetNamedBufferPointerv, GLuint, buffer, GLenum, pname, void **, params); \ - HookWrapper4(void, glGetNamedBufferSubData, GLuint, buffer, GLintptr, offset, GLsizei, size, void *, data); \ - HookWrapper4(void, glGetNamedFramebufferAttachmentParameteriv, GLuint, framebuffer, GLenum, attachment, GLenum, pname, GLint *, params); \ - HookWrapper3(void, glGetNamedFramebufferParameteriv, GLuint, framebuffer, GLenum, pname, GLint *, param); \ - HookWrapper3(void, glGetNamedRenderbufferParameteriv, GLuint, renderbuffer, GLenum, pname, GLint *, params); \ HookWrapper1(GLenum, glCheckFramebufferStatus, GLenum, target); \ HookWrapper4(void, glBlendColor, GLfloat, red, GLfloat, green, GLfloat, blue, GLfloat, alpha); \ HookWrapper3(void, glBlendFunci, GLuint, buf, GLenum, src, GLenum, dst); \ @@ -1371,17 +1447,46 @@ HookWrapper12(void, glCompressedTextureSubImage3DEXT, GLuint, texture, GLenum, target, GLint, level, GLint, xoffset, GLint, yoffset, GLint, zoffset, GLsizei, width, GLsizei, height, GLsizei, depth, GLenum, format, GLsizei, imageSize, const void *, bits); \ HookWrapper3(void, glFramebufferDrawBuffersEXT, GLuint, framebuffer, GLsizei, n, const GLenum *, bufs); \ HookWrapper2(void, glGenerateTextureMipmapEXT, GLuint, texture, GLenum, target); \ - HookWrapper4(void, glGetCompressedTextureImageEXT, GLuint, texture, GLenum, target, GLint, lod, void *, img); \ - HookWrapper4(void, glGetNamedBufferSubDataEXT, GLuint, buffer, GLintptr, offset, GLsizeiptr, size, void *, data); \ - HookWrapper3(void, glGetNamedBufferParameterivEXT, GLuint, buffer, GLenum, pname, GLint *, params); \ + HookWrapper3(void, glGetPointeri_vEXT, GLenum, pname, GLuint, index, void **, params); \ + HookWrapper3(void, glGetDoubleIndexedvEXT, GLenum, target, GLuint, index, GLdouble *, data); \ + HookWrapper3(void, glGetPointerIndexedvEXT, GLenum, target, GLuint, index, void **, data); \ + HookWrapper3(void, glGetIntegerIndexedvEXT, GLenum, target, GLuint, index, GLint *, data); \ + HookWrapper3(void, glGetBooleanIndexedvEXT, GLenum, target, GLuint, index, GLboolean *, data); \ + HookWrapper3(void, glGetFloatIndexedvEXT, GLenum, target, GLuint, index, GLfloat *, data); \ + HookWrapper6(void, glGetMultiTexImageEXT, GLenum, texunit, GLenum, target, GLint, level, GLenum, format, GLenum, type, void *, pixels); \ + HookWrapper4(void, glGetMultiTexParameterfvEXT, GLenum, texunit, GLenum, target, GLenum, pname, GLfloat *, params); \ + HookWrapper4(void, glGetMultiTexParameterivEXT, GLenum, texunit, GLenum, target, GLenum, pname, GLint *, params); \ + HookWrapper4(void, glGetMultiTexParameterIivEXT, GLenum, texunit, GLenum, target, GLenum, pname, GLint *, params); \ + HookWrapper4(void, glGetMultiTexParameterIuivEXT, GLenum, texunit, GLenum, target, GLenum, pname, GLuint *, params); \ + HookWrapper5(void, glGetMultiTexLevelParameterfvEXT, GLenum, texunit, GLenum, target, GLint, level, GLenum, pname, GLfloat *, params); \ + HookWrapper5(void, glGetMultiTexLevelParameterivEXT, GLenum, texunit, GLenum, target, GLint, level, GLenum, pname, GLint *, params); \ + HookWrapper4(void, glGetCompressedMultiTexImageEXT, GLenum, texunit, GLenum, target, GLint, lod, void *, img); \ + HookWrapper3(void, glGetNamedBufferPointervEXT, GLuint, buffer, GLenum, pname, void **, params); \ + HookWrapper4(void, glGetNamedProgramivEXT, GLuint, program, GLenum, target, GLenum, pname, GLint *, params); \ HookWrapper4(void, glGetNamedFramebufferAttachmentParameterivEXT, GLuint, framebuffer, GLenum, attachment, GLenum, pname, GLint *, params); \ + HookWrapper3(void, glGetNamedBufferParameterivEXT, GLuint, buffer, GLenum, pname, GLint *, params); \ + HookWrapper4(void, glGetNamedBufferSubDataEXT, GLuint, buffer, GLintptr, offset, GLsizeiptr, size, void *, data); \ + HookWrapper3(void, glGetNamedFramebufferParameterivEXT, GLuint, framebuffer, GLenum, pname, GLint *, params); \ + HookWrapper3(void, glGetNamedRenderbufferParameterivEXT, GLuint, renderbuffer, GLenum, pname, GLint *, params); \ + HookWrapper3(void, glGetVertexArrayIntegervEXT, GLuint, vaobj, GLenum, pname, GLint *, param); \ + HookWrapper3(void, glGetVertexArrayPointervEXT, GLuint, vaobj, GLenum, pname, void **, param); \ + HookWrapper4(void, glGetVertexArrayIntegeri_vEXT, GLuint, vaobj, GLuint, index, GLenum, pname, GLint *, param); \ + HookWrapper4(void, glGetVertexArrayPointeri_vEXT, GLuint, vaobj, GLuint, index, GLenum, pname, void **, param); \ + HookWrapper4(void, glGetCompressedTextureImageEXT, GLuint, texture, GLenum, target, GLint, lod, void *, img); \ HookWrapper6(void, glGetTextureImageEXT, GLuint, texture, GLenum, target, GLint, level, GLenum, format, GLenum, type, void *, pixels); \ HookWrapper4(void, glGetTextureParameterivEXT, GLuint, texture, GLenum, target, GLenum, pname, GLint *, params); \ HookWrapper4(void, glGetTextureParameterfvEXT, GLuint, texture, GLenum, target, GLenum, pname, GLfloat *, params); \ + HookWrapper4(void, glGetTextureParameterIivEXT, GLuint, texture, GLenum, target, GLenum, pname, GLint *, params); \ + HookWrapper4(void, glGetTextureParameterIuivEXT, GLuint, texture, GLenum, target, GLenum, pname, GLuint *, params); \ HookWrapper5(void, glGetTextureLevelParameterivEXT, GLuint, texture, GLenum, target, GLint, level, GLenum, pname, GLint *, params); \ + HookWrapper5(void, glGetTextureLevelParameterfvEXT, GLuint, texture, GLenum, target, GLint, level, GLenum, pname, GLfloat *, params); \ HookWrapper3(void, glBindMultiTextureEXT, GLenum, texunit, GLenum, target, GLuint, texture); \ HookWrapper2(void *, glMapNamedBufferEXT, GLuint, buffer, GLenum, access); \ HookWrapper4(void *, glMapNamedBufferRangeEXT, GLuint, buffer, GLintptr, offset, GLsizeiptr, length, GLbitfield, access); \ + HookWrapper3(void, glFlushMappedNamedBufferRangeEXT, GLuint, buffer, GLintptr, offset, GLsizeiptr, length); \ + HookWrapper1(GLboolean, glUnmapNamedBufferEXT, GLuint, buffer); \ + HookWrapper5(void, glClearNamedBufferDataEXT, GLuint, buffer, GLenum, internalformat, GLenum, format, GLenum, type, const void *, data); \ + HookWrapper7(void, glClearNamedBufferSubDataEXT, GLuint, buffer, GLenum, internalformat, GLsizeiptr, offset, GLsizeiptr, size, GLenum, format, GLenum, type, const void *, data); \ HookWrapper4(void, glNamedBufferDataEXT, GLuint, buffer, GLsizeiptr, size, const void *, data, GLenum, usage); \ HookWrapper4(void, glNamedBufferStorageEXT, GLuint, buffer, GLsizeiptr, size, const void *, data, GLbitfield, flags); \ HookWrapper4(void, glNamedBufferSubDataEXT, GLuint, buffer, GLintptr, offset, GLsizeiptr, size, const void *, data); \ @@ -1393,6 +1498,10 @@ HookWrapper4(void, glNamedFramebufferRenderbufferEXT, GLuint, framebuffer, GLenum, attachment, GLenum, renderbuffertarget, GLuint, renderbuffer); \ HookWrapper5(void, glNamedFramebufferTextureLayerEXT, GLuint, framebuffer, GLenum, attachment, GLuint, texture, GLint, level, GLint, layer); \ HookWrapper3(void, glNamedFramebufferParameteriEXT, GLuint, framebuffer, GLenum, pname, GLint, param); \ + HookWrapper4(void, glNamedRenderbufferStorageEXT, GLuint, renderbuffer, GLenum, internalformat, GLsizei, width, GLsizei, height); \ + HookWrapper5(void, glNamedRenderbufferStorageMultisampleEXT, GLuint, renderbuffer, GLsizei, samples, GLenum, internalformat, GLsizei, width, GLsizei, height); \ + HookWrapper2(void, glFramebufferDrawBufferEXT, GLuint, framebuffer, GLenum, mode); \ + HookWrapper2(void, glFramebufferReadBufferEXT, GLuint, framebuffer, GLenum, mode); \ HookWrapper4(void, glTextureBufferEXT, GLuint, texture, GLenum, target, GLenum, internalformat, GLuint, buffer); \ 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); \ @@ -1412,7 +1521,48 @@ HookWrapper8(void, glTextureSubImage1DEXT, GLuint, texture, GLenum, target, GLint, level, GLint, xoffset, GLsizei, width, GLenum, format, GLenum, type, const void *, pixels); \ HookWrapper10(void, glTextureSubImage2DEXT, GLuint, texture, GLenum, target, GLint, level, GLint, xoffset, GLint, yoffset, GLsizei, width, GLsizei, height, GLenum, format, GLenum, type, const void *, pixels); \ HookWrapper12(void, glTextureSubImage3DEXT, GLuint, texture, GLenum, target, GLint, level, GLint, xoffset, GLint, yoffset, GLint, zoffset, GLsizei, width, GLsizei, height, GLsizei, depth, GLenum, format, GLenum, type, const void *, pixels); \ - HookWrapper1(GLboolean, glUnmapNamedBufferEXT, GLuint, buffer); \ + HookWrapper8(void, glCopyTextureImage1DEXT, GLuint, texture, GLenum, target, GLint, level, GLenum, internalformat, GLint, x, GLint, y, GLsizei, width, GLint, border); \ + HookWrapper9(void, glCopyTextureImage2DEXT, GLuint, texture, GLenum, target, GLint, level, GLenum, internalformat, GLint, x, GLint, y, GLsizei, width, GLsizei, height, GLint, border); \ + HookWrapper7(void, glCopyTextureSubImage1DEXT, GLuint, texture, GLenum, target, GLint, level, GLint, xoffset, GLint, x, GLint, y, GLsizei, width); \ + HookWrapper9(void, glCopyTextureSubImage2DEXT, GLuint, texture, GLenum, target, GLint, level, GLint, xoffset, GLint, yoffset, GLint, x, GLint, y, GLsizei, width, GLsizei, height); \ + HookWrapper10(void, glCopyTextureSubImage3DEXT, GLuint, texture, GLenum, target, GLint, level, GLint, xoffset, GLint, yoffset, GLint, zoffset, GLint, x, GLint, y, GLsizei, width, GLsizei, height); \ + HookWrapper4(void, glMultiTexParameteriEXT, GLenum, texunit, GLenum, target, GLenum, pname, GLint, param); \ + HookWrapper4(void, glMultiTexParameterivEXT, GLenum, texunit, GLenum, target, GLenum, pname, const GLint *, params); \ + HookWrapper4(void, glMultiTexParameterfEXT, GLenum, texunit, GLenum, target, GLenum, pname, GLfloat, param); \ + HookWrapper4(void, glMultiTexParameterfvEXT, GLenum, texunit, GLenum, target, GLenum, pname, const GLfloat *, params); \ + HookWrapper9(void, glMultiTexImage1DEXT, GLenum, texunit, GLenum, target, GLint, level, GLint, internalformat, GLsizei, width, GLint, border, GLenum, format, GLenum, type, const void *, pixels); \ + HookWrapper10(void, glMultiTexImage2DEXT, GLenum, texunit, GLenum, target, GLint, level, GLint, internalformat, GLsizei, width, GLsizei, height, GLint, border, GLenum, format, GLenum, type, const void *, pixels); \ + HookWrapper8(void, glMultiTexSubImage1DEXT, GLenum, texunit, GLenum, target, GLint, level, GLint, xoffset, GLsizei, width, GLenum, format, GLenum, type, const void *, pixels); \ + HookWrapper10(void, glMultiTexSubImage2DEXT, GLenum, texunit, GLenum, target, GLint, level, GLint, xoffset, GLint, yoffset, GLsizei, width, GLsizei, height, GLenum, format, GLenum, type, const void *, pixels); \ + HookWrapper8(void, glCopyMultiTexImage1DEXT, GLenum, texunit, GLenum, target, GLint, level, GLenum, internalformat, GLint, x, GLint, y, GLsizei, width, GLint, border); \ + HookWrapper9(void, glCopyMultiTexImage2DEXT, GLenum, texunit, GLenum, target, GLint, level, GLenum, internalformat, GLint, x, GLint, y, GLsizei, width, GLsizei, height, GLint, border); \ + HookWrapper7(void, glCopyMultiTexSubImage1DEXT, GLenum, texunit, GLenum, target, GLint, level, GLint, xoffset, GLint, x, GLint, y, GLsizei, width); \ + HookWrapper9(void, glCopyMultiTexSubImage2DEXT, GLenum, texunit, GLenum, target, GLint, level, GLint, xoffset, GLint, yoffset, GLint, x, GLint, y, GLsizei, width, GLsizei, height); \ + HookWrapper11(void, glMultiTexImage3DEXT, GLenum, texunit, GLenum, target, GLint, level, GLint, internalformat, GLsizei, width, GLsizei, height, GLsizei, depth, GLint, border, GLenum, format, GLenum, type, const void *, pixels); \ + HookWrapper12(void, glMultiTexSubImage3DEXT, GLenum, texunit, GLenum, target, GLint, level, GLint, xoffset, GLint, yoffset, GLint, zoffset, GLsizei, width, GLsizei, height, GLsizei, depth, GLenum, format, GLenum, type, const void *, pixels); \ + HookWrapper10(void, glCopyMultiTexSubImage3DEXT, GLenum, texunit, GLenum, target, GLint, level, GLint, xoffset, GLint, yoffset, GLint, zoffset, GLint, x, GLint, y, GLsizei, width, GLsizei, height); \ + HookWrapper10(void, glCompressedMultiTexImage3DEXT, GLenum, texunit, GLenum, target, GLint, level, GLenum, internalformat, GLsizei, width, GLsizei, height, GLsizei, depth, GLint, border, GLsizei, imageSize, const void *, bits); \ + HookWrapper9(void, glCompressedMultiTexImage2DEXT, GLenum, texunit, GLenum, target, GLint, level, GLenum, internalformat, GLsizei, width, GLsizei, height, GLint, border, GLsizei, imageSize, const void *, bits); \ + HookWrapper8(void, glCompressedMultiTexImage1DEXT, GLenum, texunit, GLenum, target, GLint, level, GLenum, internalformat, GLsizei, width, GLint, border, GLsizei, imageSize, const void *, bits); \ + HookWrapper12(void, glCompressedMultiTexSubImage3DEXT, GLenum, texunit, GLenum, target, GLint, level, GLint, xoffset, GLint, yoffset, GLint, zoffset, GLsizei, width, GLsizei, height, GLsizei, depth, GLenum, format, GLsizei, imageSize, const void *, bits); \ + HookWrapper10(void, glCompressedMultiTexSubImage2DEXT, GLenum, texunit, GLenum, target, GLint, level, GLint, xoffset, GLint, yoffset, GLsizei, width, GLsizei, height, GLenum, format, GLsizei, imageSize, const void *, bits); \ + HookWrapper8(void, glCompressedMultiTexSubImage1DEXT, GLenum, texunit, GLenum, target, GLint, level, GLint, xoffset, GLsizei, width, GLenum, format, GLsizei, imageSize, const void *, bits); \ + HookWrapper4(void, glMultiTexBufferEXT, GLenum, texunit, GLenum, target, GLenum, internalformat, GLuint, buffer); \ + HookWrapper4(void, glMultiTexParameterIivEXT, GLenum, texunit, GLenum, target, GLenum, pname, const GLint *, params); \ + HookWrapper4(void, glMultiTexParameterIuivEXT, GLenum, texunit, GLenum, target, GLenum, pname, const GLuint *, params); \ + HookWrapper2(void, glGenerateMultiTexMipmapEXT, GLenum, texunit, GLenum, target); \ + HookWrapper8(void, glVertexArrayVertexAttribOffsetEXT, GLuint, vaobj, GLuint, buffer, GLuint, index, GLint, size, GLenum, type, GLboolean, normalized, GLsizei, stride, GLintptr, offset); \ + HookWrapper7(void, glVertexArrayVertexAttribIOffsetEXT, GLuint, vaobj, GLuint, buffer, GLuint, index, GLint, size, GLenum, type, GLsizei, stride, GLintptr, offset); \ + HookWrapper2(void, glEnableVertexArrayAttribEXT, GLuint, vaobj, GLuint, index); \ + HookWrapper2(void, glDisableVertexArrayAttribEXT, GLuint, vaobj, GLuint, index); \ + HookWrapper5(void, glVertexArrayBindVertexBufferEXT, GLuint, vaobj, GLuint, bindingindex, GLuint, buffer, GLintptr, offset, GLsizei, stride); \ + HookWrapper6(void, glVertexArrayVertexAttribFormatEXT, GLuint, vaobj, GLuint, attribindex, GLint, size, GLenum, type, GLboolean, normalized, GLuint, relativeoffset); \ + HookWrapper5(void, glVertexArrayVertexAttribIFormatEXT, GLuint, vaobj, GLuint, attribindex, GLint, size, GLenum, type, GLuint, relativeoffset); \ + HookWrapper5(void, glVertexArrayVertexAttribLFormatEXT, GLuint, vaobj, GLuint, attribindex, GLint, size, GLenum, type, GLuint, relativeoffset); \ + HookWrapper3(void, glVertexArrayVertexAttribBindingEXT, GLuint, vaobj, GLuint, attribindex, GLuint, bindingindex); \ + HookWrapper3(void, glVertexArrayVertexBindingDivisorEXT, GLuint, vaobj, GLuint, bindingindex, GLuint, divisor); \ + HookWrapper7(void, glVertexArrayVertexAttribLOffsetEXT, GLuint, vaobj, GLuint, buffer, GLuint, index, GLint, size, GLenum, type, GLsizei, stride, GLintptr, offset); \ + HookWrapper3(void, glVertexArrayVertexAttribDivisorEXT, GLuint, vaobj, GLuint, index, GLuint, divisor); \ diff --git a/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp index 49f40b0bb..5fcb11fce 100644 --- a/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_buffer_funcs.cpp @@ -28,9 +28,9 @@ #pragma region Buffers -bool WrappedOpenGL::Serialise_glGenBuffers(GLsizei n, GLuint* textures) +bool WrappedOpenGL::Serialise_glGenBuffers(GLsizei n, GLuint* buffers) { - SERIALISE_ELEMENT(ResourceId, id, GetResourceManager()->GetID(BufferRes(GetCtx(), *textures))); + SERIALISE_ELEMENT(ResourceId, id, GetResourceManager()->GetID(BufferRes(GetCtx(), *buffers))); if(m_State == READING) { @@ -1499,12 +1499,12 @@ GLboolean WrappedOpenGL::glUnmapBuffer(GLenum target) return m_Real.glUnmapBuffer(target); } -bool WrappedOpenGL::Serialise_glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length) +bool WrappedOpenGL::Serialise_glFlushMappedNamedBufferRangeEXT(GLuint buffer, GLintptr offset, GLsizeiptr length) { GLResourceRecord *record = NULL; if(m_State >= WRITING) - record = GetCtxData().m_BufferRecord[BufferIdx(target)]; + record = GetResourceManager()->GetResourceRecord(BufferRes(GetCtx(), buffer)); SERIALISE_ELEMENT(ResourceId, ID, record->GetResourceID()); SERIALISE_ELEMENT(uint64_t, offs, offset); @@ -1538,9 +1538,9 @@ bool WrappedOpenGL::Serialise_glFlushMappedBufferRange(GLenum target, GLintptr o return true; } -void WrappedOpenGL::glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length) +void WrappedOpenGL::glFlushMappedNamedBufferRangeEXT(GLuint buffer, GLintptr offset, GLsizeiptr length) { - GLResourceRecord *record = GetCtxData().m_BufferRecord[BufferIdx(target)]; + GLResourceRecord *record = GetResourceManager()->GetResourceRecord(BufferRes(GetCtx(), buffer)); RDCASSERT(record); // only need to pay attention to flushes when in capframe. Otherwise (see above) we @@ -1551,7 +1551,7 @@ void WrappedOpenGL::glFlushMappedBufferRange(GLenum target, GLintptr offset, GLs // note that when we're idle, we only want to flush the range with GL if we've actually // mapped it. Otherwise the map is 'virtual' and just pointing to our backing store data if(m_State != WRITING_IDLE || (record && record->Map.status == GLResourceRecord::Mapped_Write_Real)) - m_Real.glFlushMappedBufferRange(target, offset, length); + m_Real.glFlushMappedNamedBufferRangeEXT(buffer, offset, length); if(m_State == WRITING_CAPFRAME) { @@ -1588,7 +1588,7 @@ void WrappedOpenGL::glFlushMappedBufferRange(GLenum target, GLintptr offset, GLs } SCOPED_SERIALISE_CONTEXT(FLUSHMAP); - Serialise_glFlushMappedBufferRange(target, offset, length); + Serialise_glFlushMappedNamedBufferRangeEXT(buffer, offset, length); m_ContextRecord->AddChunk(scope.Get()); } // other statuses are reading @@ -1596,6 +1596,22 @@ void WrappedOpenGL::glFlushMappedBufferRange(GLenum target, GLintptr offset, GLs } } +void WrappedOpenGL::glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length) +{ + if(m_State >= WRITING) + { + GLResourceRecord *record = GetCtxData().m_BufferRecord[BufferIdx(target)]; + RDCASSERT(record); + + if(record) + return glFlushMappedNamedBufferRangeEXT(record->Resource.name, offset, length); + + RDCERR("glFlushMappedBufferRange: Couldn't get resource record for target %x - no buffer bound?", target); + } + + return m_Real.glFlushMappedBufferRange(target, offset, length); +} + #pragma endregion #pragma region Transform Feedback @@ -1852,55 +1868,58 @@ void WrappedOpenGL::glEndTransformFeedback() #pragma region Vertex Arrays -bool WrappedOpenGL::Serialise_glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer) +bool WrappedOpenGL::Serialise_glVertexArrayVertexAttribOffsetEXT(GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset) { - size_t bufidx = BufferIdx(eGL_ARRAY_BUFFER); - - ContextData &cd = GetCtxData(); - SERIALISE_ELEMENT(uint32_t, Index, index); SERIALISE_ELEMENT(int32_t, Size, size); SERIALISE_ELEMENT(GLenum, Type, type); SERIALISE_ELEMENT(uint8_t, Norm, normalized); SERIALISE_ELEMENT(uint32_t, Stride, stride); - SERIALISE_ELEMENT(uint64_t, Offset, (uint64_t)pointer); - SERIALISE_ELEMENT(ResourceId, id, cd.m_VertexArrayRecord ? cd.m_VertexArrayRecord->GetResourceID() : ResourceId()); - SERIALISE_ELEMENT(ResourceId, bid, cd.m_BufferRecord[bufidx] ? cd.m_BufferRecord[bufidx]->GetResourceID() : ResourceId()); + SERIALISE_ELEMENT(uint64_t, Offset, (uint64_t)offset); + SERIALISE_ELEMENT(ResourceId, id, vaobj ? GetResourceManager()->GetID(VertexArrayRes(GetCtx(), vaobj)) : ResourceId()); + SERIALISE_ELEMENT(ResourceId, bid, buffer ? GetResourceManager()->GetID(BufferRes(GetCtx(), buffer)) : ResourceId()); if(m_State < WRITING) { - // if we're reading, we won't have serialised the glBindVertexArray commands before the captured frame, - // need to apply it here (and the current state doesn't matter, will be completely set at start of the - // frame). - if(m_State == READING) - { - if(id != ResourceId()) - { - GLResource res = GetResourceManager()->GetLiveResource(id); - m_Real.glBindVertexArray(res.name); - } - else - { - m_Real.glBindVertexArray(m_FakeVAO); - } - - if(bid != ResourceId()) - { - GLResource res = GetResourceManager()->GetLiveResource(bid); - m_Real.glBindBuffer(eGL_ARRAY_BUFFER, res.name); - } - else - { - m_Real.glBindBuffer(eGL_ARRAY_BUFFER, 0); - } - } + vaobj = (id != ResourceId()) ? GetResourceManager()->GetLiveResource(id).name : m_FakeVAO; + buffer = (bid != ResourceId()) ? GetResourceManager()->GetLiveResource(bid).name : 0; - m_Real.glVertexAttribPointer(Index, Size, Type, Norm, Stride, (const void *)Offset); + m_Real.glVertexArrayVertexAttribOffsetEXT(vaobj, buffer, Index, Size, Type, Norm, Stride, (GLintptr)Offset); } return true; } +void WrappedOpenGL::glVertexArrayVertexAttribOffsetEXT(GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset) +{ + m_Real.glVertexArrayVertexAttribOffsetEXT(vaobj, buffer, index, size, type, normalized, stride, offset); + + if(m_State >= WRITING) + { + ContextData &cd = GetCtxData(); + GLResourceRecord *bufrecord = GetResourceManager()->GetResourceRecord(BufferRes(GetCtx(), buffer)); + GLResourceRecord *varecord = GetResourceManager()->GetResourceRecord(VertexArrayRes(GetCtx(), vaobj)); + GLResourceRecord *r = m_State == WRITING_CAPFRAME ? m_ContextRecord : varecord; + + if(r) + { + if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord)) + return; + if(m_State == WRITING_CAPFRAME && varecord) + GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_Write); + + { + SCOPED_SERIALISE_CONTEXT(VERTEXATTRIBPOINTER); + Serialise_glVertexArrayVertexAttribOffsetEXT(vaobj, buffer, index, size, type, normalized, stride, offset); + + r->AddChunk(scope.Get()); + } + + if(bufrecord) r->AddParent(bufrecord); + } + } +} + void WrappedOpenGL::glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer) { m_Real.glVertexAttribPointer(index, size, type, normalized, stride, pointer); @@ -1921,7 +1940,7 @@ void WrappedOpenGL::glVertexAttribPointer(GLuint index, GLint size, GLenum type, { SCOPED_SERIALISE_CONTEXT(VERTEXATTRIBPOINTER); - Serialise_glVertexAttribPointer(index, size, type, normalized, stride, pointer); + Serialise_glVertexArrayVertexAttribOffsetEXT(varecord->Resource.name, bufrecord->Resource.name, index, size, type, normalized, stride, (GLintptr)pointer); r->AddChunk(scope.Get()); } @@ -1931,54 +1950,57 @@ void WrappedOpenGL::glVertexAttribPointer(GLuint index, GLint size, GLenum type, } } -bool WrappedOpenGL::Serialise_glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer) +bool WrappedOpenGL::Serialise_glVertexArrayVertexAttribIOffsetEXT(GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset) { - size_t bufidx = BufferIdx(eGL_ARRAY_BUFFER); - - ContextData &cd = GetCtxData(); - SERIALISE_ELEMENT(uint32_t, Index, index); SERIALISE_ELEMENT(int32_t, Size, size); SERIALISE_ELEMENT(GLenum, Type, type); SERIALISE_ELEMENT(uint32_t, Stride, stride); - SERIALISE_ELEMENT(uint64_t, Offset, (uint64_t)pointer); - SERIALISE_ELEMENT(ResourceId, id, cd.m_VertexArrayRecord ? cd.m_VertexArrayRecord->GetResourceID() : ResourceId()); - SERIALISE_ELEMENT(ResourceId, bid, cd.m_BufferRecord[bufidx] ? cd.m_BufferRecord[bufidx]->GetResourceID() : ResourceId()); + SERIALISE_ELEMENT(uint64_t, Offset, (uint64_t)offset); + SERIALISE_ELEMENT(ResourceId, id, vaobj ? GetResourceManager()->GetID(VertexArrayRes(GetCtx(), vaobj)) : ResourceId()); + SERIALISE_ELEMENT(ResourceId, bid, buffer ? GetResourceManager()->GetID(BufferRes(GetCtx(), buffer)) : ResourceId()); if(m_State < WRITING) { - // if we're reading, we won't have serialised the glBindVertexArray commands before the captured frame, - // need to apply it here (and the current state doesn't matter, will be completely set at start of the - // frame). - if(m_State == READING) - { - if(id != ResourceId()) - { - GLResource res = GetResourceManager()->GetLiveResource(id); - m_Real.glBindVertexArray(res.name); - } - else - { - m_Real.glBindVertexArray(m_FakeVAO); - } - - if(bid != ResourceId()) - { - GLResource res = GetResourceManager()->GetLiveResource(bid); - m_Real.glBindBuffer(eGL_ARRAY_BUFFER, res.name); - } - else - { - m_Real.glBindBuffer(eGL_ARRAY_BUFFER, 0); - } - } + vaobj = (id != ResourceId()) ? GetResourceManager()->GetLiveResource(id).name : m_FakeVAO; + buffer = (bid != ResourceId()) ? GetResourceManager()->GetLiveResource(bid).name : 0; - m_Real.glVertexAttribIPointer(Index, Size, Type, Stride, (const void *)Offset); + m_Real.glVertexArrayVertexAttribIOffsetEXT(vaobj, buffer, Index, Size, Type, Stride, (GLintptr)Offset); } return true; } +void WrappedOpenGL::glVertexArrayVertexAttribIOffsetEXT(GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset) +{ + m_Real.glVertexArrayVertexAttribIOffsetEXT(vaobj, buffer, index, size, type, stride, offset); + + if(m_State >= WRITING) + { + ContextData &cd = GetCtxData(); + GLResourceRecord *bufrecord = GetResourceManager()->GetResourceRecord(BufferRes(GetCtx(), buffer)); + GLResourceRecord *varecord = GetResourceManager()->GetResourceRecord(VertexArrayRes(GetCtx(), vaobj)); + GLResourceRecord *r = m_State == WRITING_CAPFRAME ? m_ContextRecord : varecord; + + if(r) + { + if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord)) + return; + if(m_State == WRITING_CAPFRAME && varecord) + GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_Write); + + { + SCOPED_SERIALISE_CONTEXT(VERTEXATTRIBIPOINTER); + Serialise_glVertexArrayVertexAttribIOffsetEXT(vaobj, buffer, index, size, type, stride, offset); + + r->AddChunk(scope.Get()); + } + + if(bufrecord) r->AddParent(bufrecord); + } + } +} + void WrappedOpenGL::glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer) { m_Real.glVertexAttribIPointer(index, size, type, stride, pointer); @@ -1999,7 +2021,7 @@ void WrappedOpenGL::glVertexAttribIPointer(GLuint index, GLint size, GLenum type { SCOPED_SERIALISE_CONTEXT(VERTEXATTRIBIPOINTER); - Serialise_glVertexAttribIPointer(index, size, type, stride, pointer); + Serialise_glVertexArrayVertexAttribIOffsetEXT(varecord->Resource.name, bufrecord->Resource.name, index, size, type, stride, (GLintptr)pointer); r->AddChunk(scope.Get()); } @@ -2009,54 +2031,57 @@ void WrappedOpenGL::glVertexAttribIPointer(GLuint index, GLint size, GLenum type } } -bool WrappedOpenGL::Serialise_glVertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer) +bool WrappedOpenGL::Serialise_glVertexArrayVertexAttribLOffsetEXT(GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr pointer) { - size_t bufidx = BufferIdx(eGL_ARRAY_BUFFER); - - ContextData &cd = GetCtxData(); - SERIALISE_ELEMENT(uint32_t, Index, index); SERIALISE_ELEMENT(int32_t, Size, size); SERIALISE_ELEMENT(GLenum, Type, type); SERIALISE_ELEMENT(uint32_t, Stride, stride); SERIALISE_ELEMENT(uint64_t, Offset, (uint64_t)pointer); - SERIALISE_ELEMENT(ResourceId, id, cd.m_VertexArrayRecord ? cd.m_VertexArrayRecord->GetResourceID() : ResourceId()); - SERIALISE_ELEMENT(ResourceId, bid, cd.m_BufferRecord[bufidx] ? cd.m_BufferRecord[bufidx]->GetResourceID() : ResourceId()); + SERIALISE_ELEMENT(ResourceId, id, vaobj ? GetResourceManager()->GetID(VertexArrayRes(GetCtx(), vaobj)) : ResourceId()); + SERIALISE_ELEMENT(ResourceId, bid, buffer ? GetResourceManager()->GetID(BufferRes(GetCtx(), buffer)) : ResourceId()); if(m_State < WRITING) { - // if we're reading, we won't have serialised the glBindVertexArray commands before the captured frame, - // need to apply it here (and the current state doesn't matter, will be completely set at start of the - // frame). - if(m_State == READING) - { - if(id != ResourceId()) - { - GLResource res = GetResourceManager()->GetLiveResource(id); - m_Real.glBindVertexArray(res.name); - } - else - { - m_Real.glBindVertexArray(m_FakeVAO); - } - - if(bid != ResourceId()) - { - GLResource res = GetResourceManager()->GetLiveResource(bid); - m_Real.glBindBuffer(eGL_ARRAY_BUFFER, res.name); - } - else - { - m_Real.glBindBuffer(eGL_ARRAY_BUFFER, 0); - } - } + vaobj = (id != ResourceId()) ? GetResourceManager()->GetLiveResource(id).name : m_FakeVAO; + buffer = (bid != ResourceId()) ? GetResourceManager()->GetLiveResource(bid).name : 0; - m_Real.glVertexAttribLPointer(Index, Size, Type, Stride, (const void *)Offset); + m_Real.glVertexArrayVertexAttribLOffsetEXT(vaobj, buffer, Index, Size, Type, Stride, (GLintptr)Offset); } return true; } +void WrappedOpenGL::glVertexArrayVertexAttribLOffsetEXT(GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr pointer) +{ + m_Real.glVertexArrayVertexAttribLOffsetEXT(vaobj, buffer, index, size, type, stride, pointer); + + if(m_State >= WRITING) + { + ContextData &cd = GetCtxData(); + GLResourceRecord *bufrecord = GetResourceManager()->GetResourceRecord(BufferRes(GetCtx(), buffer)); + GLResourceRecord *varecord = GetResourceManager()->GetResourceRecord(VertexArrayRes(GetCtx(), vaobj)); + GLResourceRecord *r = m_State == WRITING_CAPFRAME ? m_ContextRecord : varecord; + + if(r) + { + if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord)) + return; + if(m_State == WRITING_CAPFRAME && varecord) + GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_Write); + + { + SCOPED_SERIALISE_CONTEXT(VERTEXATTRIBLPOINTER); + Serialise_glVertexArrayVertexAttribLOffsetEXT(vaobj, buffer, index, size, type, stride, pointer); + + r->AddChunk(scope.Get()); + } + + if(bufrecord) r->AddParent(bufrecord); + } + } +} + void WrappedOpenGL::glVertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer) { m_Real.glVertexAttribLPointer(index, size, type, stride, pointer); @@ -2077,7 +2102,7 @@ void WrappedOpenGL::glVertexAttribLPointer(GLuint index, GLint size, GLenum type { SCOPED_SERIALISE_CONTEXT(VERTEXATTRIBLPOINTER); - Serialise_glVertexAttribLPointer(index, size, type, stride, pointer); + Serialise_glVertexArrayVertexAttribLOffsetEXT(varecord->Resource.name, bufrecord->Resource.name, index, size, type, stride, (GLintptr)pointer); r->AddChunk(scope.Get()); } @@ -2087,32 +2112,46 @@ void WrappedOpenGL::glVertexAttribLPointer(GLuint index, GLint size, GLenum type } } -bool WrappedOpenGL::Serialise_glVertexAttribBinding(GLuint attribindex, GLuint bindingindex) +bool WrappedOpenGL::Serialise_glVertexArrayVertexAttribBindingEXT(GLuint vaobj, GLuint attribindex, GLuint bindingindex) { SERIALISE_ELEMENT(uint32_t, aidx, attribindex); SERIALISE_ELEMENT(uint32_t, bidx, bindingindex); - SERIALISE_ELEMENT(ResourceId, id, GetCtxData().m_VertexArrayRecord ? GetCtxData().m_VertexArrayRecord->GetResourceID() : ResourceId()); + SERIALISE_ELEMENT(ResourceId, id, vaobj ? GetResourceManager()->GetID(VertexArrayRes(GetCtx(), vaobj)) : ResourceId()); if(m_State < WRITING) { - if(m_State == READING) - { - if(id != ResourceId()) - { - GLResource res = GetResourceManager()->GetLiveResource(id); - m_Real.glBindVertexArray(res.name); - } - else - { - m_Real.glBindVertexArray(m_FakeVAO); - } - } - - m_Real.glVertexAttribBinding(aidx, bidx); + m_Real.glVertexArrayVertexAttribBindingEXT((id != ResourceId()) ? GetResourceManager()->GetLiveResource(id).name : m_FakeVAO, aidx, bidx); } return true; } +void WrappedOpenGL::glVertexArrayVertexAttribBindingEXT(GLuint vaobj, GLuint attribindex, GLuint bindingindex) +{ + m_Real.glVertexArrayVertexAttribBindingEXT(vaobj, attribindex, bindingindex); + + if(m_State >= WRITING) + { + GLResourceRecord *varecord = GetResourceManager()->GetResourceRecord(VertexArrayRes(GetCtx(), vaobj)); + + GLResourceRecord *r = m_State == WRITING_CAPFRAME ? m_ContextRecord : varecord; + + if(r) + { + if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord)) + return; + if(m_State == WRITING_CAPFRAME && varecord) + GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_Write); + + { + SCOPED_SERIALISE_CONTEXT(VERTEXATTRIBBINDING); + Serialise_glVertexArrayVertexAttribBindingEXT(varecord->Resource.name, attribindex, bindingindex); + + r->AddChunk(scope.Get()); + } + } + } +} + void WrappedOpenGL::glVertexAttribBinding(GLuint attribindex, GLuint bindingindex) { m_Real.glVertexAttribBinding(attribindex, bindingindex); @@ -2132,7 +2171,7 @@ void WrappedOpenGL::glVertexAttribBinding(GLuint attribindex, GLuint bindinginde { SCOPED_SERIALISE_CONTEXT(VERTEXATTRIBBINDING); - Serialise_glVertexAttribBinding(attribindex, bindingindex); + Serialise_glVertexArrayVertexAttribBindingEXT(varecord->Resource.name, attribindex, bindingindex); r->AddChunk(scope.Get()); } @@ -2140,36 +2179,52 @@ void WrappedOpenGL::glVertexAttribBinding(GLuint attribindex, GLuint bindinginde } } -bool WrappedOpenGL::Serialise_glVertexAttribFormat(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset) +bool WrappedOpenGL::Serialise_glVertexArrayVertexAttribFormatEXT(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset) { SERIALISE_ELEMENT(uint32_t, Index, attribindex); SERIALISE_ELEMENT(int32_t, Size, size); SERIALISE_ELEMENT(bool, Norm, normalized ? true : false); SERIALISE_ELEMENT(GLenum, Type, type); SERIALISE_ELEMENT(uint32_t, Offset, relativeoffset); - SERIALISE_ELEMENT(ResourceId, id, GetCtxData().m_VertexArrayRecord ? GetCtxData().m_VertexArrayRecord->GetResourceID() : ResourceId()); + SERIALISE_ELEMENT(ResourceId, id, vaobj ? GetResourceManager()->GetID(VertexArrayRes(GetCtx(), vaobj)) : ResourceId()); if(m_State < WRITING) { - if(m_State == READING) - { - if(id != ResourceId()) - { - GLResource res = GetResourceManager()->GetLiveResource(id); - m_Real.glBindVertexArray(res.name); - } - else - { - m_Real.glBindVertexArray(m_FakeVAO); - } - } + vaobj = (id != ResourceId()) ? GetResourceManager()->GetLiveResource(id).name : m_FakeVAO; - m_Real.glVertexAttribFormat(Index, Size, Type, Norm, Offset); + m_Real.glVertexArrayVertexAttribFormatEXT(vaobj, Index, Size, Type, Norm, Offset); } return true; } +void WrappedOpenGL::glVertexArrayVertexAttribFormatEXT(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset) +{ + m_Real.glVertexArrayVertexAttribFormatEXT(vaobj, attribindex, size, type, normalized, relativeoffset); + + if(m_State >= WRITING) + { + GLResourceRecord *varecord = GetResourceManager()->GetResourceRecord(VertexArrayRes(GetCtx(), vaobj)); + + GLResourceRecord *r = m_State == WRITING_CAPFRAME ? m_ContextRecord : varecord; + + if(r) + { + if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord)) + return; + if(m_State == WRITING_CAPFRAME && varecord) + GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_Write); + + { + SCOPED_SERIALISE_CONTEXT(VERTEXATTRIBFORMAT); + Serialise_glVertexArrayVertexAttribFormatEXT(vaobj, attribindex, size, type, normalized, relativeoffset); + + r->AddChunk(scope.Get()); + } + } + } +} + void WrappedOpenGL::glVertexAttribFormat(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset) { m_Real.glVertexAttribFormat(attribindex, size, type, normalized, relativeoffset); @@ -2189,7 +2244,7 @@ void WrappedOpenGL::glVertexAttribFormat(GLuint attribindex, GLint size, GLenum { SCOPED_SERIALISE_CONTEXT(VERTEXATTRIBFORMAT); - Serialise_glVertexAttribFormat(attribindex, size, type, normalized, relativeoffset); + Serialise_glVertexArrayVertexAttribFormatEXT(varecord->Resource.name, attribindex, size, type, normalized, relativeoffset); r->AddChunk(scope.Get()); } @@ -2197,35 +2252,51 @@ void WrappedOpenGL::glVertexAttribFormat(GLuint attribindex, GLint size, GLenum } } -bool WrappedOpenGL::Serialise_glVertexAttribIFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset) +bool WrappedOpenGL::Serialise_glVertexArrayVertexAttribIFormatEXT(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset) { SERIALISE_ELEMENT(uint32_t, Index, attribindex); SERIALISE_ELEMENT(int32_t, Size, size); SERIALISE_ELEMENT(GLenum, Type, type); SERIALISE_ELEMENT(uint32_t, Offset, relativeoffset); - SERIALISE_ELEMENT(ResourceId, id, GetCtxData().m_VertexArrayRecord ? GetCtxData().m_VertexArrayRecord->GetResourceID() : ResourceId()); + SERIALISE_ELEMENT(ResourceId, id, vaobj ? GetResourceManager()->GetID(VertexArrayRes(GetCtx(), vaobj)) : ResourceId()); if(m_State < WRITING) { - if(m_State == READING) - { - if(id != ResourceId()) - { - GLResource res = GetResourceManager()->GetLiveResource(id); - m_Real.glBindVertexArray(res.name); - } - else - { - m_Real.glBindVertexArray(m_FakeVAO); - } - } + vaobj = (id != ResourceId()) ? GetResourceManager()->GetLiveResource(id).name : m_FakeVAO; - m_Real.glVertexAttribIFormat(Index, Size, Type, Offset); + m_Real.glVertexArrayVertexAttribIFormatEXT(vaobj, Index, Size, Type, Offset); } return true; } +void WrappedOpenGL::glVertexArrayVertexAttribIFormatEXT(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset) +{ + m_Real.glVertexArrayVertexAttribIFormatEXT(vaobj, attribindex, size, type, relativeoffset); + + if(m_State >= WRITING) + { + GLResourceRecord *varecord = GetResourceManager()->GetResourceRecord(VertexArrayRes(GetCtx(), vaobj)); + + GLResourceRecord *r = m_State == WRITING_CAPFRAME ? m_ContextRecord : varecord; + + if(r) + { + if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord)) + return; + if(m_State == WRITING_CAPFRAME && varecord) + GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_Write); + + { + SCOPED_SERIALISE_CONTEXT(VERTEXATTRIBIFORMAT); + Serialise_glVertexArrayVertexAttribIFormatEXT(vaobj, attribindex, size, type, relativeoffset); + + r->AddChunk(scope.Get()); + } + } + } +} + void WrappedOpenGL::glVertexAttribIFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset) { m_Real.glVertexAttribIFormat(attribindex, size, type, relativeoffset); @@ -2245,7 +2316,7 @@ void WrappedOpenGL::glVertexAttribIFormat(GLuint attribindex, GLint size, GLenum { SCOPED_SERIALISE_CONTEXT(VERTEXATTRIBIFORMAT); - Serialise_glVertexAttribIFormat(attribindex, size, type, relativeoffset); + Serialise_glVertexArrayVertexAttribIFormatEXT(varecord->Resource.name, attribindex, size, type, relativeoffset); r->AddChunk(scope.Get()); } @@ -2253,35 +2324,51 @@ void WrappedOpenGL::glVertexAttribIFormat(GLuint attribindex, GLint size, GLenum } } -bool WrappedOpenGL::Serialise_glVertexAttribLFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset) +bool WrappedOpenGL::Serialise_glVertexArrayVertexAttribLFormatEXT(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset) { SERIALISE_ELEMENT(uint32_t, Index, attribindex); SERIALISE_ELEMENT(int32_t, Size, size); SERIALISE_ELEMENT(GLenum, Type, type); SERIALISE_ELEMENT(uint32_t, Offset, relativeoffset); - SERIALISE_ELEMENT(ResourceId, id, GetCtxData().m_VertexArrayRecord ? GetCtxData().m_VertexArrayRecord->GetResourceID() : ResourceId()); + SERIALISE_ELEMENT(ResourceId, id, vaobj ? GetResourceManager()->GetID(VertexArrayRes(GetCtx(), vaobj)) : ResourceId()); if(m_State < WRITING) { - if(m_State == READING) - { - if(id != ResourceId()) - { - GLResource res = GetResourceManager()->GetLiveResource(id); - m_Real.glBindVertexArray(res.name); - } - else - { - m_Real.glBindVertexArray(m_FakeVAO); - } - } + vaobj = (id != ResourceId()) ? GetResourceManager()->GetLiveResource(id).name : m_FakeVAO; - m_Real.glVertexAttribLFormat(Index, Size, Type, Offset); + m_Real.glVertexArrayVertexAttribLFormatEXT(vaobj, Index, Size, Type, Offset); } return true; } +void WrappedOpenGL::glVertexArrayVertexAttribLFormatEXT(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset) +{ + m_Real.glVertexArrayVertexAttribLFormatEXT(vaobj, attribindex, size, type, relativeoffset); + + if(m_State >= WRITING) + { + GLResourceRecord *varecord = GetResourceManager()->GetResourceRecord(VertexArrayRes(GetCtx(), vaobj)); + + GLResourceRecord *r = m_State == WRITING_CAPFRAME ? m_ContextRecord : varecord; + + if(r) + { + if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord)) + return; + if(m_State == WRITING_CAPFRAME && varecord) + GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_Write); + + { + SCOPED_SERIALISE_CONTEXT(VERTEXATTRIBLFORMAT); + Serialise_glVertexArrayVertexAttribLFormatEXT(vaobj, attribindex, size, type, relativeoffset); + + r->AddChunk(scope.Get()); + } + } + } +} + void WrappedOpenGL::glVertexAttribLFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset) { m_Real.glVertexAttribLFormat(attribindex, size, type, relativeoffset); @@ -2301,7 +2388,7 @@ void WrappedOpenGL::glVertexAttribLFormat(GLuint attribindex, GLint size, GLenum { SCOPED_SERIALISE_CONTEXT(VERTEXATTRIBLFORMAT); - Serialise_glVertexAttribLFormat(attribindex, size, type, relativeoffset); + Serialise_glVertexArrayVertexAttribLFormatEXT(varecord->Resource.name, attribindex, size, type, relativeoffset); r->AddChunk(scope.Get()); } @@ -2309,33 +2396,49 @@ void WrappedOpenGL::glVertexAttribLFormat(GLuint attribindex, GLint size, GLenum } } -bool WrappedOpenGL::Serialise_glVertexAttribDivisor(GLuint index, GLuint divisor) +bool WrappedOpenGL::Serialise_glVertexArrayVertexAttribDivisorEXT(GLuint vaobj, GLuint index, GLuint divisor) { SERIALISE_ELEMENT(uint32_t, Index, index); SERIALISE_ELEMENT(uint32_t, Divisor, divisor); - SERIALISE_ELEMENT(ResourceId, id, GetCtxData().m_VertexArrayRecord ? GetCtxData().m_VertexArrayRecord->GetResourceID() : ResourceId()); + SERIALISE_ELEMENT(ResourceId, id, vaobj ? GetResourceManager()->GetID(VertexArrayRes(GetCtx(), vaobj)) : ResourceId()); if(m_State < WRITING) { - if(m_State == READING) - { - if(id != ResourceId()) - { - GLResource res = GetResourceManager()->GetLiveResource(id); - m_Real.glBindVertexArray(res.name); - } - else - { - m_Real.glBindVertexArray(m_FakeVAO); - } - } + vaobj = (id != ResourceId()) ? GetResourceManager()->GetLiveResource(id).name : m_FakeVAO; - m_Real.glVertexAttribDivisor(Index, Divisor); + m_Real.glVertexArrayVertexAttribDivisorEXT(vaobj, Index, Divisor); } return true; } +void WrappedOpenGL::glVertexArrayVertexAttribDivisorEXT(GLuint vaobj, GLuint index, GLuint divisor) +{ + m_Real.glVertexArrayVertexAttribDivisorEXT(vaobj, index, divisor); + + if(m_State >= WRITING) + { + GLResourceRecord *varecord = GetResourceManager()->GetResourceRecord(VertexArrayRes(GetCtx(), vaobj)); + + GLResourceRecord *r = m_State == WRITING_CAPFRAME ? m_ContextRecord : varecord; + + if(r) + { + if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord)) + return; + if(m_State == WRITING_CAPFRAME && varecord) + GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_Write); + + { + SCOPED_SERIALISE_CONTEXT(VERTEXATTRIBDIVISOR); + Serialise_glVertexArrayVertexAttribDivisorEXT(vaobj, index, divisor); + + r->AddChunk(scope.Get()); + } + } + } +} + void WrappedOpenGL::glVertexAttribDivisor(GLuint index, GLuint divisor) { m_Real.glVertexAttribDivisor(index, divisor); @@ -2355,7 +2458,7 @@ void WrappedOpenGL::glVertexAttribDivisor(GLuint index, GLuint divisor) { SCOPED_SERIALISE_CONTEXT(VERTEXATTRIBDIVISOR); - Serialise_glVertexAttribDivisor(index, divisor); + Serialise_glVertexArrayVertexAttribDivisorEXT(varecord->Resource.name, index, divisor); r->AddChunk(scope.Get()); } @@ -2363,10 +2466,10 @@ void WrappedOpenGL::glVertexAttribDivisor(GLuint index, GLuint divisor) } } -bool WrappedOpenGL::Serialise_glEnableVertexAttribArray(GLuint index) +bool WrappedOpenGL::Serialise_glEnableVertexArrayAttribEXT(GLuint vaobj, GLuint index) { SERIALISE_ELEMENT(uint32_t, Index, index); - SERIALISE_ELEMENT(ResourceId, id, GetCtxData().m_VertexArrayRecord ? GetCtxData().m_VertexArrayRecord->GetResourceID() : ResourceId()); + SERIALISE_ELEMENT(ResourceId, id, vaobj ? GetResourceManager()->GetID(VertexArrayRes(GetCtx(), vaobj)) : ResourceId()); if(m_State < WRITING) { @@ -2388,6 +2491,33 @@ bool WrappedOpenGL::Serialise_glEnableVertexAttribArray(GLuint index) return true; } +void WrappedOpenGL::glEnableVertexArrayAttribEXT(GLuint vaobj, GLuint index) +{ + m_Real.glEnableVertexArrayAttribEXT(vaobj, index); + + if(m_State >= WRITING) + { + GLResourceRecord *varecord = GetResourceManager()->GetResourceRecord(VertexArrayRes(GetCtx(), vaobj)); + + GLResourceRecord *r = m_State == WRITING_CAPFRAME ? m_ContextRecord : varecord; + + if(r) + { + if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord)) + return; + if(m_State == WRITING_CAPFRAME && varecord) + GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_Write); + + { + SCOPED_SERIALISE_CONTEXT(ENABLEVERTEXATTRIBARRAY); + Serialise_glEnableVertexArrayAttribEXT(varecord->Resource.name, index); + + r->AddChunk(scope.Get()); + } + } + } +} + void WrappedOpenGL::glEnableVertexAttribArray(GLuint index) { m_Real.glEnableVertexAttribArray(index); @@ -2407,7 +2537,7 @@ void WrappedOpenGL::glEnableVertexAttribArray(GLuint index) { SCOPED_SERIALISE_CONTEXT(ENABLEVERTEXATTRIBARRAY); - Serialise_glEnableVertexAttribArray(index); + Serialise_glEnableVertexArrayAttribEXT(varecord->Resource.name, index); r->AddChunk(scope.Get()); } @@ -2415,10 +2545,10 @@ void WrappedOpenGL::glEnableVertexAttribArray(GLuint index) } } -bool WrappedOpenGL::Serialise_glDisableVertexAttribArray(GLuint index) +bool WrappedOpenGL::Serialise_glDisableVertexArrayAttribEXT(GLuint vaobj, GLuint index) { SERIALISE_ELEMENT(uint32_t, Index, index); - SERIALISE_ELEMENT(ResourceId, id, GetCtxData().m_VertexArrayRecord ? GetCtxData().m_VertexArrayRecord->GetResourceID() : ResourceId()); + SERIALISE_ELEMENT(ResourceId, id, vaobj ? GetResourceManager()->GetID(VertexArrayRes(GetCtx(), vaobj)) : ResourceId()); if(m_State < WRITING) { @@ -2440,6 +2570,33 @@ bool WrappedOpenGL::Serialise_glDisableVertexAttribArray(GLuint index) return true; } +void WrappedOpenGL::glDisableVertexArrayAttribEXT(GLuint vaobj, GLuint index) +{ + m_Real.glDisableVertexArrayAttribEXT(vaobj, index); + + if(m_State >= WRITING) + { + GLResourceRecord *varecord = GetResourceManager()->GetResourceRecord(VertexArrayRes(GetCtx(), vaobj)); + + GLResourceRecord *r = m_State == WRITING_CAPFRAME ? m_ContextRecord : varecord; + + if(r) + { + if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord)) + return; + if(m_State == WRITING_CAPFRAME && varecord) + GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_Write); + + { + SCOPED_SERIALISE_CONTEXT(DISABLEVERTEXATTRIBARRAY); + Serialise_glDisableVertexArrayAttribEXT(varecord->Resource.name, index); + + r->AddChunk(scope.Get()); + } + } + } +} + void WrappedOpenGL::glDisableVertexAttribArray(GLuint index) { m_Real.glDisableVertexAttribArray(index); @@ -2459,7 +2616,7 @@ void WrappedOpenGL::glDisableVertexAttribArray(GLuint index) { SCOPED_SERIALISE_CONTEXT(DISABLEVERTEXATTRIBARRAY); - Serialise_glDisableVertexAttribArray(index); + Serialise_glDisableVertexArrayAttribEXT(varecord->Resource.name, index); r->AddChunk(scope.Get()); } @@ -2584,39 +2741,58 @@ bool WrappedOpenGL::Serialise_glVertexArrayElementBuffer(GLuint vaobj, GLuint bu return true; } -bool WrappedOpenGL::Serialise_glBindVertexBuffer(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride) +bool WrappedOpenGL::Serialise_glVertexArrayBindVertexBufferEXT(GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride) { SERIALISE_ELEMENT(uint32_t, idx, bindingindex); SERIALISE_ELEMENT(ResourceId, id, (buffer ? GetResourceManager()->GetID(BufferRes(GetCtx(), buffer)) : ResourceId())); SERIALISE_ELEMENT(uint64_t, offs, offset); SERIALISE_ELEMENT(uint64_t, str, stride); - SERIALISE_ELEMENT(ResourceId, vid, GetCtxData().m_VertexArrayRecord ? GetCtxData().m_VertexArrayRecord->GetResourceID() : ResourceId()); + SERIALISE_ELEMENT(ResourceId, vid, vaobj ? GetResourceManager()->GetID(VertexArrayRes(GetCtx(), vaobj)) : ResourceId()); if(m_State <= EXECUTING) { - if(m_State == READING) - { - if(vid != ResourceId()) - { - GLResource res = GetResourceManager()->GetLiveResource(vid); - m_Real.glBindVertexArray(res.name); - } - else - { - m_Real.glBindVertexArray(m_FakeVAO); - } - } + vaobj = (vid != ResourceId()) ? GetResourceManager()->GetLiveResource(vid).name : m_FakeVAO; GLuint live = 0; if(id != ResourceId()) live = GetResourceManager()->GetLiveResource(id).name; - m_Real.glBindVertexBuffer(idx, live, (GLintptr)offs, (GLsizei)str); + m_Real.glVertexArrayBindVertexBufferEXT(vaobj, idx, live, (GLintptr)offs, (GLsizei)str); } return true; } +void WrappedOpenGL::glVertexArrayBindVertexBufferEXT(GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride) +{ + m_Real.glVertexArrayBindVertexBufferEXT(vaobj, bindingindex, buffer, offset, stride); + + if(m_State >= WRITING) + { + GLResourceRecord *varecord = GetResourceManager()->GetResourceRecord(VertexArrayRes(GetCtx(), vaobj)); + + GLResourceRecord *r = m_State == WRITING_CAPFRAME ? m_ContextRecord : varecord; + + if(r) + { + if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord)) + return; + if(m_State == WRITING_CAPFRAME && varecord) + GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_Write); + + { + SCOPED_SERIALISE_CONTEXT(BIND_VERTEXBUFFER); + Serialise_glVertexArrayBindVertexBufferEXT(vaobj, bindingindex, buffer, offset, stride); + + r->AddChunk(scope.Get()); + } + + if(buffer != 0) + r->AddParent(GetResourceManager()->GetResourceRecord(BufferRes(GetCtx(), buffer))); + } + } +} + void WrappedOpenGL::glBindVertexBuffer(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride) { m_Real.glBindVertexBuffer(bindingindex, buffer, offset, stride); @@ -2636,7 +2812,7 @@ void WrappedOpenGL::glBindVertexBuffer(GLuint bindingindex, GLuint buffer, GLint { SCOPED_SERIALISE_CONTEXT(BIND_VERTEXBUFFER); - Serialise_glBindVertexBuffer(bindingindex, buffer, offset, stride); + Serialise_glVertexArrayBindVertexBufferEXT(varecord->Resource.name, bindingindex, buffer, offset, stride); r->AddChunk(scope.Get()); } @@ -2739,33 +2915,49 @@ void WrappedOpenGL::glBindVertexBuffers(GLuint first, GLsizei count, const GLuin } } -bool WrappedOpenGL::Serialise_glVertexBindingDivisor(GLuint bindingindex, GLuint divisor) +bool WrappedOpenGL::Serialise_glVertexArrayVertexBindingDivisorEXT(GLuint vaobj, GLuint bindingindex, GLuint divisor) { SERIALISE_ELEMENT(uint32_t, idx, bindingindex); SERIALISE_ELEMENT(uint32_t, d, divisor); - SERIALISE_ELEMENT(ResourceId, vid, GetCtxData().m_VertexArrayRecord ? GetCtxData().m_VertexArrayRecord->GetResourceID() : ResourceId()); + SERIALISE_ELEMENT(ResourceId, vid, (vaobj ? GetResourceManager()->GetID(VertexArrayRes(GetCtx(), vaobj)) : ResourceId())); if(m_State <= EXECUTING) { - if(m_State == READING) - { - if(vid != ResourceId()) - { - GLResource res = GetResourceManager()->GetLiveResource(vid); - m_Real.glBindVertexArray(res.name); - } - else - { - m_Real.glBindVertexArray(m_FakeVAO); - } - } + vaobj = (vid != ResourceId()) ? GetResourceManager()->GetLiveResource(vid).name : m_FakeVAO; - m_Real.glVertexBindingDivisor(idx, d); + m_Real.glVertexArrayVertexBindingDivisorEXT(vaobj, idx, d); } return true; } +void WrappedOpenGL::glVertexArrayVertexBindingDivisorEXT(GLuint vaobj, GLuint bindingindex, GLuint divisor) +{ + m_Real.glVertexArrayVertexBindingDivisorEXT(vaobj, bindingindex, divisor); + + if(m_State >= WRITING) + { + GLResourceRecord *varecord = GetResourceManager()->GetResourceRecord(VertexArrayRes(GetCtx(), vaobj)); + + GLResourceRecord *r = m_State == WRITING_CAPFRAME ? m_ContextRecord : varecord; + + if(r) + { + if(m_State == WRITING_IDLE && !RecordUpdateCheck(varecord)) + return; + if(m_State == WRITING_CAPFRAME && varecord) + GetResourceManager()->MarkResourceFrameReferenced(varecord->GetResourceID(), eFrameRef_Write); + + { + SCOPED_SERIALISE_CONTEXT(VERTEXBINDINGDIVISOR); + Serialise_glVertexArrayVertexBindingDivisorEXT(vaobj, bindingindex, divisor); + + r->AddChunk(scope.Get()); + } + } + } +} + void WrappedOpenGL::glVertexBindingDivisor(GLuint bindingindex, GLuint divisor) { m_Real.glVertexBindingDivisor(bindingindex, divisor); @@ -2785,7 +2977,7 @@ void WrappedOpenGL::glVertexBindingDivisor(GLuint bindingindex, GLuint divisor) { SCOPED_SERIALISE_CONTEXT(VERTEXBINDINGDIVISOR); - Serialise_glVertexBindingDivisor(bindingindex, divisor); + Serialise_glVertexArrayVertexBindingDivisorEXT(varecord->Resource.name, bindingindex, divisor); r->AddChunk(scope.Get()); } diff --git a/renderdoc/driver/gl/wrappers/gl_draw_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_draw_funcs.cpp index 79e53ddd9..b9c3bb3e2 100644 --- a/renderdoc/driver/gl/wrappers/gl_draw_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_draw_funcs.cpp @@ -1816,9 +1816,9 @@ void WrappedOpenGL::glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat dep } } -bool WrappedOpenGL::Serialise_glClearBufferData(GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data) +bool WrappedOpenGL::Serialise_glClearNamedBufferDataEXT(GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data) { - SERIALISE_ELEMENT(GLenum, Target, target); + SERIALISE_ELEMENT(ResourceId, id, GetResourceManager()->GetID(BufferRes(GetCtx(), buffer))); SERIALISE_ELEMENT(GLenum, InternalFormat, internalformat); SERIALISE_ELEMENT(GLenum, Format, format); SERIALISE_ELEMENT(GLenum, Type, type); @@ -1882,28 +1882,44 @@ bool WrappedOpenGL::Serialise_glClearBufferData(GLenum target, GLenum internalfo if(m_State <= EXECUTING) { - m_Real.glClearBufferData(Target, InternalFormat, Format, Type, (const void *)&val[0]); + m_Real.glClearNamedBufferDataEXT(GetResourceManager()->GetLiveResource(id).name, InternalFormat, Format, Type, (const void *)&val[0]); } return true; } +void WrappedOpenGL::glClearNamedBufferDataEXT(GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data) +{ + m_Real.glClearNamedBufferDataEXT(buffer, internalformat, format, type, data); + + if(m_State == WRITING_CAPFRAME) + { + SCOPED_SERIALISE_CONTEXT(CLEARBUFFERDATA); + Serialise_glClearNamedBufferDataEXT(buffer, internalformat, format, type, data); + + m_ContextRecord->AddChunk(scope.Get()); + } +} + void WrappedOpenGL::glClearBufferData(GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data) { m_Real.glClearBufferData(target, internalformat, format, type, data); if(m_State == WRITING_CAPFRAME) { + GLResourceRecord *record = GetCtxData().m_BufferRecord[BufferIdx(target)]; + RDCASSERT(record); + SCOPED_SERIALISE_CONTEXT(CLEARBUFFERDATA); - Serialise_glClearBufferData(target, internalformat, format, type, data); + Serialise_glClearNamedBufferDataEXT(record->Resource.name, internalformat, format, type, data); m_ContextRecord->AddChunk(scope.Get()); } } -bool WrappedOpenGL::Serialise_glClearBufferSubData(GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data) +bool WrappedOpenGL::Serialise_glClearNamedBufferSubDataEXT(GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data) { - SERIALISE_ELEMENT(GLenum, Target, target); + SERIALISE_ELEMENT(ResourceId, id, GetResourceManager()->GetID(BufferRes(GetCtx(), buffer))); SERIALISE_ELEMENT(GLenum, InternalFormat, internalformat); SERIALISE_ELEMENT(uint64_t, Offset, (uint64_t)offset); SERIALISE_ELEMENT(uint64_t, Size, (uint64_t)size); @@ -1969,20 +1985,36 @@ bool WrappedOpenGL::Serialise_glClearBufferSubData(GLenum target, GLenum interna if(m_State <= EXECUTING) { - m_Real.glClearBufferSubData(Target, InternalFormat, (GLintptr)Offset, (GLsizeiptr)Size, Format, Type, (const void *)&val[0]); + m_Real.glClearNamedBufferSubDataEXT(GetResourceManager()->GetLiveResource(id).name, InternalFormat, (GLintptr)Offset, (GLsizeiptr)Size, Format, Type, (const void *)&val[0]); } return true; } +void WrappedOpenGL::glClearNamedBufferSubDataEXT(GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data) +{ + m_Real.glClearNamedBufferSubDataEXT(buffer, internalformat, offset, size, format, type, data); + + if(m_State == WRITING_CAPFRAME) + { + SCOPED_SERIALISE_CONTEXT(CLEARBUFFERSUBDATA); + Serialise_glClearNamedBufferSubDataEXT(buffer, internalformat, offset, size, format, type, data); + + m_ContextRecord->AddChunk(scope.Get()); + } +} + void WrappedOpenGL::glClearBufferSubData(GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data) { m_Real.glClearBufferSubData(target, internalformat, offset, size, format, type, data); if(m_State == WRITING_CAPFRAME) { + GLResourceRecord *record = GetCtxData().m_BufferRecord[BufferIdx(target)]; + RDCASSERT(record); + SCOPED_SERIALISE_CONTEXT(CLEARBUFFERSUBDATA); - Serialise_glClearBufferSubData(target, internalformat, offset, size, format, type, data); + Serialise_glClearNamedBufferSubDataEXT(record->Resource.name, internalformat, offset, size, format, type, data); m_ContextRecord->AddChunk(scope.Get()); } diff --git a/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp index 75e57208f..30b012362 100644 --- a/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp @@ -699,49 +699,74 @@ void WrappedOpenGL::glFramebufferParameteri(GLenum target, GLenum pname, GLint p } } -bool WrappedOpenGL::Serialise_glReadBuffer(GLenum mode) +bool WrappedOpenGL::Serialise_glFramebufferReadBufferEXT(GLuint framebuffer, GLenum mode) { - SERIALISE_ELEMENT(GLenum, m, mode); - SERIALISE_ELEMENT(ResourceId, id, GetCtxData().m_ReadFramebufferRecord ? GetCtxData().m_ReadFramebufferRecord->GetResourceID() : ResourceId()); + SERIALISE_ELEMENT(ResourceId, Id, (framebuffer ? GetResourceManager()->GetID(FramebufferRes(GetCtx(), framebuffer)) : ResourceId())); + SERIALISE_ELEMENT(GLenum, b, mode); if(m_State < WRITING) { - if(id != ResourceId()) + if(Id == ResourceId()) { - GLResource res = GetResourceManager()->GetLiveResource(id); - m_Real.glBindFramebuffer(eGL_READ_FRAMEBUFFER, res.name); + // since we are faking the default framebuffer with our own + // to see the results, replace back/front/left/right with color attachment 0 + if(b == eGL_BACK_LEFT || b == eGL_BACK_RIGHT || b == eGL_BACK || + b == eGL_FRONT_LEFT || b == eGL_FRONT_RIGHT || b == eGL_FRONT) + b = eGL_COLOR_ATTACHMENT0; + + m_Real.glFramebufferReadBufferEXT(m_FakeBB_FBO, b); } else { - m_Real.glBindFramebuffer(eGL_READ_FRAMEBUFFER, m_FakeBB_FBO); + GLResource res = GetResourceManager()->GetLiveResource(Id); + m_Real.glFramebufferReadBufferEXT(res.name, b); } - - m_Real.glReadBuffer(m); } - + return true; } +void WrappedOpenGL::glFramebufferReadBufferEXT(GLuint framebuffer, GLenum buf) +{ + m_Real.glFramebufferReadBufferEXT(framebuffer, buf); + + if(m_State == WRITING_CAPFRAME) + { + SCOPED_SERIALISE_CONTEXT(READ_BUFFER); + Serialise_glFramebufferReadBufferEXT(framebuffer, buf); + + m_ContextRecord->AddChunk(scope.Get()); + } + else if(m_State == WRITING_IDLE && framebuffer != 0) + { + SCOPED_SERIALISE_CONTEXT(READ_BUFFER); + Serialise_glFramebufferReadBufferEXT(framebuffer, buf); + + ResourceRecord *record = GetResourceManager()->GetResourceRecord(FramebufferRes(GetCtx(), framebuffer)); + record->AddChunk(scope.Get()); + } +} + void WrappedOpenGL::glReadBuffer(GLenum mode) { - m_Real.glReadBuffer(mode); - if(m_State >= WRITING) { + GLResourceRecord *drawrecord = GetCtxData().m_DrawFramebufferRecord; if(m_State == WRITING_CAPFRAME) { SCOPED_SERIALISE_CONTEXT(READ_BUFFER); - Serialise_glReadBuffer(mode); + Serialise_glFramebufferReadBufferEXT(drawrecord ? drawrecord->Resource.name : 0, mode); m_ContextRecord->AddChunk(scope.Get()); } else { - GLResourceRecord *readrecord = GetCtxData().m_ReadFramebufferRecord; - if(readrecord) - GetResourceManager()->MarkDirtyResource(readrecord->GetResourceID()); + if(drawrecord) + GetResourceManager()->MarkDirtyResource(drawrecord->GetResourceID()); } } + + m_Real.glReadBuffer(mode); } bool WrappedOpenGL::Serialise_glBindFramebuffer(GLenum target, GLuint framebuffer) @@ -786,38 +811,68 @@ void WrappedOpenGL::glBindFramebuffer(GLenum target, GLuint framebuffer) m_Real.glBindFramebuffer(target, framebuffer); } -bool WrappedOpenGL::Serialise_glDrawBuffer(GLenum buf) +bool WrappedOpenGL::Serialise_glFramebufferDrawBufferEXT(GLuint framebuffer, GLenum buf) { + SERIALISE_ELEMENT(ResourceId, Id, (framebuffer ? GetResourceManager()->GetID(FramebufferRes(GetCtx(), framebuffer)) : ResourceId())); SERIALISE_ELEMENT(GLenum, b, buf); if(m_State < WRITING) { - // since we are faking the default framebuffer with our own - // to see the results, replace back/front/left/right with color attachment 0 - if(b == eGL_BACK_LEFT || b == eGL_BACK_RIGHT || b == eGL_BACK || - b == eGL_FRONT_LEFT || b == eGL_FRONT_RIGHT || b == eGL_FRONT) - b = eGL_COLOR_ATTACHMENT0; - - m_Real.glDrawBuffer(b); + if(Id == ResourceId()) + { + // since we are faking the default framebuffer with our own + // to see the results, replace back/front/left/right with color attachment 0 + if(b == eGL_BACK_LEFT || b == eGL_BACK_RIGHT || b == eGL_BACK || + b == eGL_FRONT_LEFT || b == eGL_FRONT_RIGHT || b == eGL_FRONT) + b = eGL_COLOR_ATTACHMENT0; + + m_Real.glFramebufferDrawBufferEXT(m_FakeBB_FBO, b); + } + else + { + GLResource res = GetResourceManager()->GetLiveResource(Id); + m_Real.glFramebufferDrawBufferEXT(res.name, b); + } } return true; } +void WrappedOpenGL::glFramebufferDrawBufferEXT(GLuint framebuffer, GLenum buf) +{ + m_Real.glFramebufferDrawBufferEXT(framebuffer, buf); + + if(m_State == WRITING_CAPFRAME) + { + SCOPED_SERIALISE_CONTEXT(DRAW_BUFFER); + Serialise_glFramebufferDrawBufferEXT(framebuffer, buf); + + m_ContextRecord->AddChunk(scope.Get()); + } + else if(m_State == WRITING_IDLE && framebuffer != 0) + { + SCOPED_SERIALISE_CONTEXT(DRAW_BUFFER); + Serialise_glFramebufferDrawBufferEXT(framebuffer, buf); + + ResourceRecord *record = GetResourceManager()->GetResourceRecord(FramebufferRes(GetCtx(), framebuffer)); + record->AddChunk(scope.Get()); + } +} + void WrappedOpenGL::glDrawBuffer(GLenum buf) { if(m_State >= WRITING) { + GLResourceRecord *drawrecord = GetCtxData().m_DrawFramebufferRecord; if(m_State == WRITING_CAPFRAME) { SCOPED_SERIALISE_CONTEXT(DRAW_BUFFER); - Serialise_glDrawBuffer(buf); + Serialise_glFramebufferDrawBufferEXT(drawrecord ? drawrecord->Resource.name : 0, buf); m_ContextRecord->AddChunk(scope.Get()); } else { - GLResourceRecord *drawrecord = GetCtxData().m_DrawFramebufferRecord; if(drawrecord) GetResourceManager()->MarkDirtyResource(drawrecord->GetResourceID()); } @@ -1075,9 +1130,9 @@ void WrappedOpenGL::glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers m_Real.glDeleteRenderbuffers(n, renderbuffers); } -bool WrappedOpenGL::Serialise_glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height) +bool WrappedOpenGL::Serialise_glNamedRenderbufferStorageEXT(GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height) { - SERIALISE_ELEMENT(ResourceId, id, GetCtxData().m_Renderbuffer); + SERIALISE_ELEMENT(ResourceId, id, (renderbuffer ? GetResourceManager()->GetID(RenderbufferRes(GetCtx(), renderbuffer)) : ResourceId())); SERIALISE_ELEMENT(GLenum, Format, internalformat); SERIALISE_ELEMENT(uint32_t, Width, width); SERIALISE_ELEMENT(uint32_t, Height, height); @@ -1096,8 +1151,7 @@ bool WrappedOpenGL::Serialise_glRenderbufferStorage(GLenum target, GLenum intern GLuint real = GetResourceManager()->GetLiveResource(id).name; - m_Real.glBindRenderbuffer(eGL_RENDERBUFFER, real); - m_Real.glRenderbufferStorage(eGL_RENDERBUFFER, Format, Width, Height); + m_Real.glNamedRenderbufferStorageEXT(real, Format, Width, Height); // create read-from texture for displaying this render buffer m_Real.glGenTextures(1, &texDetails.renderbufferReadTex); @@ -1121,23 +1175,24 @@ bool WrappedOpenGL::Serialise_glRenderbufferStorage(GLenum target, GLenum intern return true; } -void WrappedOpenGL::glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height) +void WrappedOpenGL::glNamedRenderbufferStorageEXT(GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height) { - m_Real.glRenderbufferStorage(target, internalformat, width, height); + m_Real.glNamedRenderbufferStorageEXT(renderbuffer, internalformat, width, height); + ResourceId rb = GetResourceManager()->GetID(RenderbufferRes(GetCtx(), renderbuffer)); + if(m_State >= WRITING) { - GLResourceRecord *record = GetResourceManager()->GetResourceRecord(GetCtxData().m_Renderbuffer); + GLResourceRecord *record = GetResourceManager()->GetResourceRecord(rb); RDCASSERT(record); SCOPED_SERIALISE_CONTEXT(RENDERBUFFER_STORAGE); - Serialise_glRenderbufferStorage(eGL_RENDERBUFFER, internalformat, width, height); + Serialise_glNamedRenderbufferStorageEXT(record->Resource.name, internalformat, width, height); record->AddChunk(scope.Get()); } { - ResourceId rb = GetCtxData().m_Renderbuffer; m_Textures[rb].width = width; m_Textures[rb].height = height; m_Textures[rb].depth = 1; @@ -1148,13 +1203,41 @@ void WrappedOpenGL::glRenderbufferStorage(GLenum target, GLenum internalformat, } } -bool WrappedOpenGL::Serialise_glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) +void WrappedOpenGL::glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height) +{ + m_Real.glRenderbufferStorage(target, internalformat, width, height); + + ResourceId rb = GetCtxData().m_Renderbuffer; + + if(m_State >= WRITING) + { + GLResourceRecord *record = GetResourceManager()->GetResourceRecord(rb); + RDCASSERT(record); + + SCOPED_SERIALISE_CONTEXT(RENDERBUFFER_STORAGE); + Serialise_glNamedRenderbufferStorageEXT(record->Resource.name, internalformat, width, height); + + record->AddChunk(scope.Get()); + } + + { + m_Textures[rb].width = width; + m_Textures[rb].height = height; + m_Textures[rb].depth = 1; + m_Textures[rb].samples = 1; + m_Textures[rb].curType = eGL_RENDERBUFFER; + m_Textures[rb].dimension = 2; + m_Textures[rb].internalFormat = internalformat; + } +} + +bool WrappedOpenGL::Serialise_glNamedRenderbufferStorageMultisampleEXT(GLuint renderbuffer, 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, GetCtxData().m_Renderbuffer); + SERIALISE_ELEMENT(ResourceId, id, (renderbuffer ? GetResourceManager()->GetID(RenderbufferRes(GetCtx(), renderbuffer)) : ResourceId())); if(m_State == READING) { @@ -1170,8 +1253,7 @@ bool WrappedOpenGL::Serialise_glRenderbufferStorageMultisample(GLenum target, GL GLuint real = GetResourceManager()->GetLiveResource(id).name; - m_Real.glBindRenderbuffer(eGL_RENDERBUFFER, GetResourceManager()->GetLiveResource(id).name); - m_Real.glRenderbufferStorageMultisample(eGL_RENDERBUFFER, Samples, Format, Width, Height); + m_Real.glNamedRenderbufferStorageMultisampleEXT(real, Samples, Format, Width, Height); // create read-from texture for displaying this render buffer m_Real.glGenTextures(1, &texDetails.renderbufferReadTex); @@ -1195,23 +1277,52 @@ bool WrappedOpenGL::Serialise_glRenderbufferStorageMultisample(GLenum target, GL return true; } -void WrappedOpenGL::glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) +void WrappedOpenGL::glNamedRenderbufferStorageMultisampleEXT(GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) { - m_Real.glRenderbufferStorageMultisample(target, samples, internalformat, width, height); + m_Real.glNamedRenderbufferStorageMultisampleEXT(renderbuffer, samples, internalformat, width, height); + ResourceId rb = GetResourceManager()->GetID(RenderbufferRes(GetCtx(), renderbuffer)); + if(m_State >= WRITING) { - GLResourceRecord *record = GetResourceManager()->GetResourceRecord(GetCtxData().m_Renderbuffer); + GLResourceRecord *record = GetResourceManager()->GetResourceRecord(rb); RDCASSERT(record); SCOPED_SERIALISE_CONTEXT(RENDERBUFFER_STORAGEMS); - Serialise_glRenderbufferStorageMultisample(eGL_RENDERBUFFER, samples, internalformat, width, height); + Serialise_glNamedRenderbufferStorageMultisampleEXT(record->Resource.name, samples, internalformat, width, height); + + record->AddChunk(scope.Get()); + } + + { + m_Textures[rb].width = width; + m_Textures[rb].height = height; + m_Textures[rb].depth = 1; + m_Textures[rb].samples = samples; + m_Textures[rb].curType = eGL_RENDERBUFFER; + m_Textures[rb].dimension = 2; + m_Textures[rb].internalFormat = internalformat; + } +} + +void WrappedOpenGL::glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) +{ + m_Real.glRenderbufferStorageMultisample(target, samples, internalformat, width, height); + + ResourceId rb = GetCtxData().m_Renderbuffer; + + if(m_State >= WRITING) + { + GLResourceRecord *record = GetResourceManager()->GetResourceRecord(rb); + RDCASSERT(record); + + SCOPED_SERIALISE_CONTEXT(RENDERBUFFER_STORAGEMS); + Serialise_glNamedRenderbufferStorageMultisampleEXT(record->Resource.name, samples, internalformat, width, height); record->AddChunk(scope.Get()); } { - ResourceId rb = GetCtxData().m_Renderbuffer; m_Textures[rb].width = width; m_Textures[rb].height = height; m_Textures[rb].depth = 1; diff --git a/renderdoc/driver/gl/wrappers/gl_get_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_get_funcs.cpp index 93d5d6eee..afb931ba5 100644 --- a/renderdoc/driver/gl/wrappers/gl_get_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_get_funcs.cpp @@ -190,21 +190,6 @@ void WrappedOpenGL::glGetTexLevelParameteriv(GLenum target, GLint level, GLenum m_Real.glGetTexLevelParameteriv(target, level, pname, params); } -void WrappedOpenGL::glGetTextureParameterivEXT(GLuint texture, GLenum target, GLenum pname, GLint *params) -{ - m_Real.glGetTextureParameterivEXT(texture, target, pname, params); -} - -void WrappedOpenGL::glGetTextureParameterfvEXT(GLuint texture, GLenum target, GLenum pname, GLfloat *params) -{ - m_Real.glGetTextureParameterfvEXT(texture, target, pname, params); -} - -void WrappedOpenGL::glGetTextureLevelParameterivEXT(GLuint texture, GLenum target, GLint level, GLenum pname, GLint *params) -{ - m_Real.glGetTextureLevelParameterivEXT(texture, target, level, pname, params); -} - void WrappedOpenGL::glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params) { m_Real.glGetTexLevelParameterfv(target, level, pname, params); @@ -265,11 +250,6 @@ void WrappedOpenGL::glGetTexImage(GLenum target, GLint level, GLenum format, GLe m_Real.glGetTexImage(target, level, format, type, pixels); } -void WrappedOpenGL::glGetTextureImageEXT(GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void *pixels) -{ - m_Real.glGetTextureImageEXT(texture, target, level, format, type, pixels); -} - void WrappedOpenGL::glGetCompressedTexImage(GLenum target, GLint level, void *img) { m_Real.glGetCompressedTexImage(target, level, img); @@ -305,11 +285,6 @@ void WrappedOpenGL::glGetTextureSubImage(GLuint texture, GLint level, GLint xoff m_Real.glGetTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, bufSize, pixels); } -void WrappedOpenGL::glGetCompressedTextureImageEXT(GLuint texture, GLenum target, GLint level, void *img) -{ - m_Real.glGetCompressedTextureImageEXT(texture, target, level, img); -} - void WrappedOpenGL::glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint *params) { m_Real.glGetInternalformativ(target, internalformat, pname, bufSize, params); @@ -426,11 +401,6 @@ GLenum WrappedOpenGL::glCheckFramebufferStatus(GLenum target) return m_Real.glCheckFramebufferStatus(target); } -GLenum WrappedOpenGL::glCheckNamedFramebufferStatusEXT(GLuint framebuffer, GLenum target) -{ - return m_Real.glCheckNamedFramebufferStatusEXT(framebuffer, target); -} - void WrappedOpenGL::glGetVertexAttribiv(GLuint index, GLenum pname, GLint *params) { m_Real.glGetVertexAttribiv(index, pname, params); @@ -771,29 +741,34 @@ void WrappedOpenGL::glGetNamedBufferPointerv(GLuint buffer, GLenum pname, void * m_Real.glGetNamedBufferPointerv(buffer, pname, params); } -void WrappedOpenGL::glGetNamedFramebufferParameteriv(GLuint framebuffer, GLenum pname, GLint *param) +void WrappedOpenGL::glGetNamedFramebufferParameterivEXT(GLuint framebuffer, GLenum pname, GLint *param) { - m_Real.glGetNamedFramebufferParameteriv(framebuffer, pname, param); + m_Real.glGetNamedFramebufferParameterivEXT(framebuffer, pname, param); } -void WrappedOpenGL::glGetNamedFramebufferAttachmentParameteriv(GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params) +void WrappedOpenGL::glGetNamedFramebufferAttachmentParameterivEXT(GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params) { - m_Real.glGetNamedFramebufferAttachmentParameteriv(framebuffer, attachment, pname, params); + m_Real.glGetNamedFramebufferAttachmentParameterivEXT(framebuffer, attachment, pname, params); } -void WrappedOpenGL::glGetNamedRenderbufferParameteriv(GLuint renderbuffer, GLenum pname, GLint *params) +void WrappedOpenGL::glGetNamedRenderbufferParameterivEXT(GLuint renderbuffer, GLenum pname, GLint *params) { - m_Real.glGetNamedRenderbufferParameteriv(renderbuffer, pname, params); + m_Real.glGetNamedRenderbufferParameterivEXT(renderbuffer, pname, params); } -void WrappedOpenGL::glGetNamedBufferParameteriv(GLuint buffer, GLenum pname, GLint *params) +void WrappedOpenGL::glGetTextureImageEXT(GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void *pixels) { - m_Real.glGetNamedBufferParameterivEXT(buffer, pname, params); + m_Real.glGetTextureImageEXT(texture, target, level, format, type, pixels); } -void WrappedOpenGL::glGetNamedBufferSubData(GLuint buffer, GLintptr offset, GLsizei size, void *data) +void WrappedOpenGL::glGetCompressedTextureImageEXT(GLuint texture, GLenum target, GLint level, void *img) { - m_Real.glGetNamedBufferSubDataEXT(buffer, offset, size, data); + m_Real.glGetCompressedTextureImageEXT(texture, target, level, img); +} + +GLenum WrappedOpenGL::glCheckNamedFramebufferStatusEXT(GLuint framebuffer, GLenum target) +{ + return m_Real.glCheckNamedFramebufferStatusEXT(framebuffer, target); } void WrappedOpenGL::glGetNamedBufferParameterivEXT(GLuint buffer, GLenum pname, GLint *params) @@ -806,7 +781,133 @@ void WrappedOpenGL::glGetNamedBufferSubDataEXT(GLuint buffer, GLintptr offset, G m_Real.glGetNamedBufferSubDataEXT(buffer, offset, size, data); } -void WrappedOpenGL::glGetNamedFramebufferAttachmentParameterivEXT(GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params) +void WrappedOpenGL::glGetTextureParameterivEXT(GLuint texture, GLenum target, GLenum pname, GLint *params) { - m_Real.glGetNamedFramebufferAttachmentParameterivEXT(framebuffer, attachment, pname, params); + m_Real.glGetTextureParameterivEXT(texture, target, pname, params); } + +void WrappedOpenGL::glGetTextureParameterfvEXT(GLuint texture, GLenum target, GLenum pname, GLfloat *params) +{ + m_Real.glGetTextureParameterfvEXT(texture, target, pname, params); +} + +void WrappedOpenGL::glGetTextureParameterIivEXT(GLuint texture, GLenum target, GLenum pname, GLint *params) +{ + m_Real.glGetTextureParameterIivEXT(texture, target, pname, params); +} + +void WrappedOpenGL::glGetTextureParameterIuivEXT(GLuint texture, GLenum target, GLenum pname, GLuint *params) +{ + m_Real.glGetTextureParameterIuivEXT(texture, target, pname, params); +} + +void WrappedOpenGL::glGetTextureLevelParameterivEXT(GLuint texture, GLenum target, GLint level, GLenum pname, GLint *params) +{ + m_Real.glGetTextureLevelParameterivEXT(texture, target, level, pname, params); +} + +void WrappedOpenGL::glGetTextureLevelParameterfvEXT(GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat *params) +{ + m_Real.glGetTextureLevelParameterfvEXT(texture, target, level, pname, params); +} + +void WrappedOpenGL::glGetPointeri_vEXT(GLenum pname, GLuint index, void **params) +{ + m_Real.glGetPointeri_vEXT(pname, index, params); +} + +void WrappedOpenGL::glGetDoubleIndexedvEXT(GLenum target, GLuint index, GLdouble *data) +{ + m_Real.glGetDoubleIndexedvEXT(target, index, data); +} + +void WrappedOpenGL::glGetPointerIndexedvEXT(GLenum target, GLuint index, void **data) +{ + m_Real.glGetPointerIndexedvEXT(target, index, data); +} + +void WrappedOpenGL::glGetIntegerIndexedvEXT(GLenum target, GLuint index, GLint *data) +{ + m_Real.glGetIntegerIndexedvEXT(target, index, data); +} + +void WrappedOpenGL::glGetBooleanIndexedvEXT(GLenum target, GLuint index, GLboolean *data) +{ + m_Real.glGetBooleanIndexedvEXT(target, index, data); +} + +void WrappedOpenGL::glGetFloatIndexedvEXT(GLenum target, GLuint index, GLfloat *data) +{ + m_Real.glGetFloatIndexedvEXT(target, index, data); +} + +void WrappedOpenGL::glGetMultiTexImageEXT(GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void *pixels) +{ + m_Real.glGetMultiTexImageEXT(texunit, target, level, format, type, pixels); +} + +void WrappedOpenGL::glGetMultiTexParameterfvEXT(GLenum texunit, GLenum target, GLenum pname, GLfloat *params) +{ + m_Real.glGetMultiTexParameterfvEXT(texunit, target, pname, params); +} + +void WrappedOpenGL::glGetMultiTexParameterivEXT(GLenum texunit, GLenum target, GLenum pname, GLint *params) +{ + m_Real.glGetMultiTexParameterivEXT(texunit, target, pname, params); +} + +void WrappedOpenGL::glGetMultiTexParameterIivEXT(GLenum texunit, GLenum target, GLenum pname, GLint *params) +{ + m_Real.glGetMultiTexParameterIivEXT(texunit, target, pname, params); +} + +void WrappedOpenGL::glGetMultiTexParameterIuivEXT(GLenum texunit, GLenum target, GLenum pname, GLuint *params) +{ + m_Real.glGetMultiTexParameterIuivEXT(texunit, target, pname, params); +} + +void WrappedOpenGL::glGetMultiTexLevelParameterfvEXT(GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat *params) +{ + m_Real.glGetMultiTexLevelParameterfvEXT(texunit, target, level, pname, params); +} + +void WrappedOpenGL::glGetMultiTexLevelParameterivEXT(GLenum texunit, GLenum target, GLint level, GLenum pname, GLint *params) +{ + m_Real.glGetMultiTexLevelParameterivEXT(texunit, target, level, pname, params); +} + +void WrappedOpenGL::glGetCompressedMultiTexImageEXT(GLenum texunit, GLenum target, GLint lod, void *img) +{ + m_Real.glGetCompressedMultiTexImageEXT(texunit, target, lod, img); +} + +void WrappedOpenGL::glGetNamedBufferPointervEXT(GLuint buffer, GLenum pname, void **params) +{ + m_Real.glGetNamedBufferPointervEXT(buffer, pname, params); +} + +void WrappedOpenGL::glGetNamedProgramivEXT(GLuint program, GLenum target, GLenum pname, GLint *params) +{ + m_Real.glGetNamedProgramivEXT(program, target, pname, params); +} + +void WrappedOpenGL::glGetVertexArrayIntegervEXT(GLuint vaobj, GLenum pname, GLint *param) +{ + m_Real.glGetVertexArrayIntegervEXT(vaobj, pname, param); +} + +void WrappedOpenGL::glGetVertexArrayPointervEXT(GLuint vaobj, GLenum pname, void **param) +{ + m_Real.glGetVertexArrayPointervEXT(vaobj, pname, param); +} + +void WrappedOpenGL::glGetVertexArrayIntegeri_vEXT(GLuint vaobj, GLuint index, GLenum pname, GLint *param) +{ + m_Real.glGetVertexArrayIntegeri_vEXT(vaobj, index, pname, param); +} + +void WrappedOpenGL::glGetVertexArrayPointeri_vEXT(GLuint vaobj, GLuint index, GLenum pname, void **param) +{ + m_Real.glGetVertexArrayPointeri_vEXT(vaobj, index, pname, param); +} + diff --git a/renderdoc/driver/gl/wrappers/gl_texture_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_texture_funcs.cpp index ee412dd0b..5e9b98101 100644 --- a/renderdoc/driver/gl/wrappers/gl_texture_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_texture_funcs.cpp @@ -560,6 +560,35 @@ void WrappedOpenGL::glGenerateMipmap(GLenum target) } } +void WrappedOpenGL::glGenerateMultiTexMipmapEXT(GLenum texunit, GLenum target) +{ + m_Real.glGenerateMultiTexMipmapEXT(texunit, target); + + GLResourceRecord *record = GetCtxData().m_TextureRecord[texunit-eGL_TEXTURE0]; + + RDCASSERT(record); + if(!record) return; + + GLuint texture = record->Resource.name; + + if(m_State == WRITING_CAPFRAME) + { + SCOPED_SERIALISE_CONTEXT(GENERATE_MIPMAP); + Serialise_glGenerateTextureMipmapEXT(texture, target); + + m_ContextRecord->AddChunk(scope.Get()); + } + else if(m_State == WRITING_IDLE) + { + SCOPED_SERIALISE_CONTEXT(GENERATE_MIPMAP); + Serialise_glGenerateTextureMipmapEXT(texture, target); + + RDCASSERT(record); + if(record) + record->AddChunk(scope.Get()); + } +} + void WrappedOpenGL::glInvalidateTexImage(GLuint texture, GLint level) { m_Real.glInvalidateTexImage(texture, level); @@ -634,8 +663,9 @@ void WrappedOpenGL::glCopyImageSubData(GLuint srcName, GLenum srcTarget, GLint s } } -bool WrappedOpenGL::Serialise_glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border) +bool WrappedOpenGL::Serialise_glCopyTextureImage1DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border) { + SERIALISE_ELEMENT(ResourceId, id, GetResourceManager()->GetID(TextureRes(GetCtx(), texture))); SERIALISE_ELEMENT(GLenum, Target, target); SERIALISE_ELEMENT(int32_t, Level, level); SERIALISE_ELEMENT(GLenum, Format, internalformat); @@ -645,10 +675,46 @@ bool WrappedOpenGL::Serialise_glCopyTexImage1D(GLenum target, GLint level, GLenu SERIALISE_ELEMENT(int32_t, Border, border); if(m_State < WRITING) - m_Real.glCopyTexImage1D(Target, Level, Format, X, Y, Width, Border); + m_Real.glCopyTextureImage1DEXT(GetResourceManager()->GetLiveResource(id).name, Target, Level, Format, X, Y, Width, Border); return true; } +void WrappedOpenGL::glCopyTextureImage1DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border) +{ + m_Real.glCopyTextureImage1DEXT(texture, target, level, internalformat, x, y, width, border); + + if(m_State == WRITING_IDLE) + { + if(GetCtxData().GetActiveTexRecord()) + GetResourceManager()->MarkDirtyResource(GetResourceManager()->GetID(TextureRes(GetCtx(), texture))); + } + else if(m_State == WRITING_CAPFRAME) + { + SCOPED_SERIALISE_CONTEXT(COPY_IMAGE1D); + Serialise_glCopyTextureImage1DEXT(texture, target, level, internalformat, x, y, width, border); + + m_ContextRecord->AddChunk(scope.Get()); + } +} + +void WrappedOpenGL::glCopyMultiTexImage1DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border) +{ + m_Real.glCopyMultiTexImage1DEXT(texunit, target, level, internalformat, x, y, width, border); + + if(m_State == WRITING_IDLE) + { + if(GetCtxData().GetActiveTexRecord()) + GetResourceManager()->MarkDirtyResource(GetCtxData().m_TextureRecord[texunit-eGL_TEXTURE0]->GetResourceID()); + } + else if(m_State == WRITING_CAPFRAME) + { + SCOPED_SERIALISE_CONTEXT(COPY_IMAGE1D); + Serialise_glCopyTextureImage1DEXT(GetCtxData().m_TextureRecord[texunit-eGL_TEXTURE0]->Resource.name, target, level, internalformat, x, y, width, border); + + m_ContextRecord->AddChunk(scope.Get()); + } +} + void WrappedOpenGL::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border) { m_Real.glCopyTexImage1D(target, level, internalformat, x, y, width, border); @@ -661,14 +727,15 @@ void WrappedOpenGL::glCopyTexImage1D(GLenum target, GLint level, GLenum internal else if(m_State == WRITING_CAPFRAME) { SCOPED_SERIALISE_CONTEXT(COPY_IMAGE1D); - Serialise_glCopyTexImage1D(target, level, internalformat, x, y, width, border); + Serialise_glCopyTextureImage1DEXT(GetCtxData().GetActiveTexRecord()->Resource.name, target, level, internalformat, x, y, width, border); m_ContextRecord->AddChunk(scope.Get()); } } -bool WrappedOpenGL::Serialise_glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) +bool WrappedOpenGL::Serialise_glCopyTextureImage2DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) { + SERIALISE_ELEMENT(ResourceId, id, GetResourceManager()->GetID(TextureRes(GetCtx(), texture))); SERIALISE_ELEMENT(GLenum, Target, target); SERIALISE_ELEMENT(int32_t, Level, level); SERIALISE_ELEMENT(GLenum, Format, internalformat); @@ -679,10 +746,46 @@ bool WrappedOpenGL::Serialise_glCopyTexImage2D(GLenum target, GLint level, GLenu SERIALISE_ELEMENT(int32_t, Border, border); if(m_State < WRITING) - m_Real.glCopyTexImage2D(Target, Level, Format, X, Y, Width, Height, Border); + m_Real.glCopyTextureImage2DEXT(GetResourceManager()->GetLiveResource(id).name, Target, Level, Format, X, Y, Width, Height, Border); return true; } +void WrappedOpenGL::glCopyTextureImage2DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) +{ + m_Real.glCopyTextureImage2DEXT(texture, target, level, internalformat, x, y, width, height, border); + + if(m_State == WRITING_IDLE) + { + if(GetCtxData().GetActiveTexRecord()) + GetResourceManager()->MarkDirtyResource(GetResourceManager()->GetID(TextureRes(GetCtx(), texture))); + } + else if(m_State == WRITING_CAPFRAME) + { + SCOPED_SERIALISE_CONTEXT(COPY_IMAGE2D); + Serialise_glCopyTextureImage2DEXT(texture, target, level, internalformat, x, y, width, height, border); + + m_ContextRecord->AddChunk(scope.Get()); + } +} + +void WrappedOpenGL::glCopyMultiTexImage2DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) +{ + m_Real.glCopyMultiTexImage2DEXT(texunit, target, level, internalformat, x, y, width, height, border); + + if(m_State == WRITING_IDLE) + { + if(GetCtxData().GetActiveTexRecord()) + GetResourceManager()->MarkDirtyResource(GetCtxData().m_TextureRecord[texunit-eGL_TEXTURE0]->GetResourceID()); + } + else if(m_State == WRITING_CAPFRAME) + { + SCOPED_SERIALISE_CONTEXT(COPY_IMAGE2D); + Serialise_glCopyTextureImage2DEXT(GetCtxData().m_TextureRecord[texunit-eGL_TEXTURE0]->Resource.name, target, level, internalformat, x, y, width, height, border); + + m_ContextRecord->AddChunk(scope.Get()); + } +} + void WrappedOpenGL::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) { m_Real.glCopyTexImage2D(target, level, internalformat, x, y, width, height, border); @@ -695,14 +798,15 @@ void WrappedOpenGL::glCopyTexImage2D(GLenum target, GLint level, GLenum internal else if(m_State == WRITING_CAPFRAME) { SCOPED_SERIALISE_CONTEXT(COPY_IMAGE2D); - Serialise_glCopyTexImage2D(target, level, internalformat, x, y, width, height, border); + Serialise_glCopyTextureImage2DEXT(GetCtxData().GetActiveTexRecord()->Resource.name, target, level, internalformat, x, y, width, height, border); m_ContextRecord->AddChunk(scope.Get()); } } -bool WrappedOpenGL::Serialise_glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width) +bool WrappedOpenGL::Serialise_glCopyTextureSubImage1DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width) { + SERIALISE_ELEMENT(ResourceId, id, GetResourceManager()->GetID(TextureRes(GetCtx(), texture))); SERIALISE_ELEMENT(GLenum, Target, target); SERIALISE_ELEMENT(int32_t, Level, level); SERIALISE_ELEMENT(int32_t, Xoffset, xoffset); @@ -711,10 +815,46 @@ bool WrappedOpenGL::Serialise_glCopyTexSubImage1D(GLenum target, GLint level, GL SERIALISE_ELEMENT(int32_t, Width, width); if(m_State < WRITING) - m_Real.glCopyTexSubImage1D(Target, Level, Xoffset, X, Y, Width); + m_Real.glCopyTextureSubImage1DEXT(GetResourceManager()->GetLiveResource(id).name, Target, Level, Xoffset, X, Y, Width); return true; } +void WrappedOpenGL::glCopyTextureSubImage1DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width) +{ + m_Real.glCopyTextureSubImage1DEXT(texture, target, level, xoffset, x, y, width); + + if(m_State == WRITING_IDLE) + { + if(GetCtxData().GetActiveTexRecord()) + GetResourceManager()->MarkDirtyResource(GetResourceManager()->GetID(TextureRes(GetCtx(), texture))); + } + else if(m_State == WRITING_CAPFRAME) + { + SCOPED_SERIALISE_CONTEXT(COPY_SUBIMAGE1D); + Serialise_glCopyTextureSubImage1DEXT(texture, target, level, xoffset, x, y, width); + + m_ContextRecord->AddChunk(scope.Get()); + } +} + +void WrappedOpenGL::glCopyMultiTexSubImage1DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width) +{ + m_Real.glCopyMultiTexSubImage1DEXT(texunit, target, level, xoffset, x, y, width); + + if(m_State == WRITING_IDLE) + { + if(GetCtxData().GetActiveTexRecord()) + GetResourceManager()->MarkDirtyResource(GetCtxData().m_TextureRecord[texunit-eGL_TEXTURE0]->GetResourceID()); + } + else if(m_State == WRITING_CAPFRAME) + { + SCOPED_SERIALISE_CONTEXT(COPY_SUBIMAGE1D); + Serialise_glCopyTextureSubImage1DEXT(GetCtxData().m_TextureRecord[texunit-eGL_TEXTURE0]->Resource.name, target, level, xoffset, x, y, width); + + m_ContextRecord->AddChunk(scope.Get()); + } +} + void WrappedOpenGL::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width) { m_Real.glCopyTexSubImage1D(target, level, xoffset, x, y, width); @@ -727,14 +867,15 @@ void WrappedOpenGL::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffse else if(m_State == WRITING_CAPFRAME) { SCOPED_SERIALISE_CONTEXT(COPY_SUBIMAGE1D); - Serialise_glCopyTexSubImage1D(target, level, xoffset, x, y, width); + Serialise_glCopyTextureSubImage1DEXT(GetCtxData().GetActiveTexRecord()->Resource.name, target, level, xoffset, x, y, width); m_ContextRecord->AddChunk(scope.Get()); } } -bool WrappedOpenGL::Serialise_glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) +bool WrappedOpenGL::Serialise_glCopyTextureSubImage2DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) { + SERIALISE_ELEMENT(ResourceId, id, GetResourceManager()->GetID(TextureRes(GetCtx(), texture))); SERIALISE_ELEMENT(GLenum, Target, target); SERIALISE_ELEMENT(int32_t, Level, level); SERIALISE_ELEMENT(int32_t, Xoffset, xoffset); @@ -745,10 +886,46 @@ bool WrappedOpenGL::Serialise_glCopyTexSubImage2D(GLenum target, GLint level, GL SERIALISE_ELEMENT(int32_t, Height, height); if(m_State < WRITING) - m_Real.glCopyTexSubImage2D(Target, Level, Xoffset, Yoffset, X, Y, Width, Height); + m_Real.glCopyTextureSubImage2DEXT(GetResourceManager()->GetLiveResource(id).name, Target, Level, Xoffset, Yoffset, X, Y, Width, Height); return true; } +void WrappedOpenGL::glCopyTextureSubImage2DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) +{ + m_Real.glCopyTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, x, y, width, height); + + if(m_State == WRITING_IDLE) + { + if(GetCtxData().GetActiveTexRecord()) + GetResourceManager()->MarkDirtyResource(GetResourceManager()->GetID(TextureRes(GetCtx(), texture))); + } + else if(m_State == WRITING_CAPFRAME) + { + SCOPED_SERIALISE_CONTEXT(COPY_SUBIMAGE2D); + Serialise_glCopyTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, x, y, width, height); + + m_ContextRecord->AddChunk(scope.Get()); + } +} + +void WrappedOpenGL::glCopyMultiTexSubImage2DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) +{ + m_Real.glCopyMultiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, x, y, width, height); + + if(m_State == WRITING_IDLE) + { + if(GetCtxData().GetActiveTexRecord()) + GetResourceManager()->MarkDirtyResource(GetCtxData().m_TextureRecord[texunit-eGL_TEXTURE0]->GetResourceID()); + } + else if(m_State == WRITING_CAPFRAME) + { + SCOPED_SERIALISE_CONTEXT(COPY_SUBIMAGE2D); + Serialise_glCopyTextureSubImage2DEXT(GetCtxData().m_TextureRecord[texunit-eGL_TEXTURE0]->Resource.name, target, level, xoffset, yoffset, x, y, width, height); + + m_ContextRecord->AddChunk(scope.Get()); + } +} + void WrappedOpenGL::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) { m_Real.glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height); @@ -761,14 +938,15 @@ void WrappedOpenGL::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffse else if(m_State == WRITING_CAPFRAME) { SCOPED_SERIALISE_CONTEXT(COPY_SUBIMAGE2D); - Serialise_glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height); + Serialise_glCopyTextureSubImage2DEXT(GetCtxData().GetActiveTexRecord()->Resource.name, target, level, xoffset, yoffset, x, y, width, height); m_ContextRecord->AddChunk(scope.Get()); } } -bool WrappedOpenGL::Serialise_glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) +bool WrappedOpenGL::Serialise_glCopyTextureSubImage3DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) { + SERIALISE_ELEMENT(ResourceId, id, GetResourceManager()->GetID(TextureRes(GetCtx(), texture))); SERIALISE_ELEMENT(GLenum, Target, target); SERIALISE_ELEMENT(int32_t, Level, level); SERIALISE_ELEMENT(int32_t, Xoffset, xoffset); @@ -780,10 +958,46 @@ bool WrappedOpenGL::Serialise_glCopyTexSubImage3D(GLenum target, GLint level, GL SERIALISE_ELEMENT(int32_t, Height, height); if(m_State < WRITING) - m_Real.glCopyTexSubImage3D(Target, Level, Xoffset, Yoffset, Zoffset, X, Y, Width, Height); + m_Real.glCopyTextureSubImage3DEXT(GetResourceManager()->GetLiveResource(id).name, Target, Level, Xoffset, Yoffset, Zoffset, X, Y, Width, Height); return true; } +void WrappedOpenGL::glCopyTextureSubImage3DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) +{ + m_Real.glCopyTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, x, y, width, height); + + if(m_State == WRITING_IDLE) + { + if(GetCtxData().GetActiveTexRecord()) + GetResourceManager()->MarkDirtyResource(GetResourceManager()->GetID(TextureRes(GetCtx(), texture))); + } + else if(m_State == WRITING_CAPFRAME) + { + SCOPED_SERIALISE_CONTEXT(COPY_SUBIMAGE3D); + Serialise_glCopyTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, x, y, width, height); + + m_ContextRecord->AddChunk(scope.Get()); + } +} + +void WrappedOpenGL::glCopyMultiTexSubImage3DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) +{ + m_Real.glCopyMultiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, x, y, width, height); + + if(m_State == WRITING_IDLE) + { + if(GetCtxData().GetActiveTexRecord()) + GetResourceManager()->MarkDirtyResource(GetCtxData().m_TextureRecord[texunit-eGL_TEXTURE0]->GetResourceID()); + } + else if(m_State == WRITING_CAPFRAME) + { + SCOPED_SERIALISE_CONTEXT(COPY_SUBIMAGE3D); + Serialise_glCopyTextureSubImage3DEXT(GetCtxData().m_TextureRecord[texunit-eGL_TEXTURE0]->Resource.name, target, level, xoffset, yoffset, zoffset, x, y, width, height); + + m_ContextRecord->AddChunk(scope.Get()); + } +} + void WrappedOpenGL::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) { m_Real.glCopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height); @@ -796,7 +1010,7 @@ void WrappedOpenGL::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffse else if(m_State == WRITING_CAPFRAME) { SCOPED_SERIALISE_CONTEXT(COPY_SUBIMAGE3D); - Serialise_glCopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height); + Serialise_glCopyTextureSubImage3DEXT(GetCtxData().GetActiveTexRecord()->Resource.name, target, level, xoffset, yoffset, zoffset, x, y, width, height); m_ContextRecord->AddChunk(scope.Get()); } @@ -885,6 +1099,41 @@ void WrappedOpenGL::glTexParameteri(GLenum target, GLenum pname, GLint param) } } +void WrappedOpenGL::glMultiTexParameteriEXT(GLenum texunit, GLenum target, GLenum pname, GLint param) +{ + m_Real.glMultiTexParameteriEXT(texunit, target, pname, param); + + if(m_State >= WRITING) + { + GLResourceRecord *record = GetCtxData().m_TextureRecord[texunit-eGL_TEXTURE0]; + RDCASSERT(record); + + GLResource res = record->Resource; + + if(m_HighTrafficResources.find(record->GetResourceID()) != m_HighTrafficResources.end() && m_State != WRITING_CAPFRAME) + return; + + SCOPED_SERIALISE_CONTEXT(TEXPARAMETERI); + Serialise_glTextureParameteriEXT(res.name, target, pname, param); + + if(m_State == WRITING_CAPFRAME) + { + m_ContextRecord->AddChunk(scope.Get()); + } + else + { + record->AddChunk(scope.Get()); + record->UpdateCount++; + + if(record->UpdateCount > 12) + { + m_HighTrafficResources.insert(record->GetResourceID()); + GetResourceManager()->MarkDirtyResource(record->GetResourceID()); + } + } + } +} + bool WrappedOpenGL::Serialise_glTextureParameterivEXT(GLuint texture, GLenum target, GLenum pname, const GLint *params) { SERIALISE_ELEMENT(GLenum, Target, target); @@ -971,6 +1220,41 @@ void WrappedOpenGL::glTexParameteriv(GLenum target, GLenum pname, const GLint *p } } +void WrappedOpenGL::glMultiTexParameterivEXT(GLenum texunit, GLenum target, GLenum pname, const GLint *params) +{ + m_Real.glMultiTexParameterivEXT(texunit, target, pname, params); + + if(m_State >= WRITING) + { + GLResourceRecord *record = GetCtxData().m_TextureRecord[texunit-eGL_TEXTURE0]; + RDCASSERT(record); + + GLResource res = record->Resource; + + if(m_HighTrafficResources.find(record->GetResourceID()) != m_HighTrafficResources.end() && m_State != WRITING_CAPFRAME) + return; + + SCOPED_SERIALISE_CONTEXT(TEXPARAMETERIV); + Serialise_glTextureParameterivEXT(res.name, target, pname, params); + + if(m_State == WRITING_CAPFRAME) + { + m_ContextRecord->AddChunk(scope.Get()); + } + else + { + record->AddChunk(scope.Get()); + record->UpdateCount++; + + if(record->UpdateCount > 12) + { + m_HighTrafficResources.insert(record->GetResourceID()); + GetResourceManager()->MarkDirtyResource(record->GetResourceID()); + } + } + } +} + bool WrappedOpenGL::Serialise_glTextureParameterIivEXT(GLuint texture, GLenum target, GLenum pname, const GLint *params) { SERIALISE_ELEMENT(GLenum, Target, target); @@ -1057,6 +1341,41 @@ void WrappedOpenGL::glTexParameterIiv(GLenum target, GLenum pname, const GLint * } } +void WrappedOpenGL::glMultiTexParameterIivEXT(GLenum texunit, GLenum target, GLenum pname, const GLint *params) +{ + m_Real.glMultiTexParameterIivEXT(texunit, target, pname, params); + + if(m_State >= WRITING) + { + GLResourceRecord *record = GetCtxData().m_TextureRecord[texunit-eGL_TEXTURE0]; + RDCASSERT(record); + + GLResource res = record->Resource; + + if(m_HighTrafficResources.find(record->GetResourceID()) != m_HighTrafficResources.end() && m_State != WRITING_CAPFRAME) + return; + + SCOPED_SERIALISE_CONTEXT(TEXPARAMETERIIV); + Serialise_glTextureParameterIivEXT(res.name, target, pname, params); + + if(m_State == WRITING_CAPFRAME) + { + m_ContextRecord->AddChunk(scope.Get()); + } + else + { + record->AddChunk(scope.Get()); + record->UpdateCount++; + + if(record->UpdateCount > 12) + { + m_HighTrafficResources.insert(record->GetResourceID()); + GetResourceManager()->MarkDirtyResource(record->GetResourceID()); + } + } + } +} + bool WrappedOpenGL::Serialise_glTextureParameterIuivEXT(GLuint texture, GLenum target, GLenum pname, const GLuint *params) { SERIALISE_ELEMENT(GLenum, Target, target); @@ -1143,6 +1462,41 @@ void WrappedOpenGL::glTexParameterIuiv(GLenum target, GLenum pname, const GLuint } } +void WrappedOpenGL::glMultiTexParameterIuivEXT(GLenum texunit, GLenum target, GLenum pname, const GLuint *params) +{ + m_Real.glMultiTexParameterIuivEXT(texunit, target, pname, params); + + if(m_State >= WRITING) + { + GLResourceRecord *record = GetCtxData().m_TextureRecord[texunit-eGL_TEXTURE0]; + RDCASSERT(record); + + GLResource res = record->Resource; + + if(m_HighTrafficResources.find(record->GetResourceID()) != m_HighTrafficResources.end() && m_State != WRITING_CAPFRAME) + return; + + SCOPED_SERIALISE_CONTEXT(TEXPARAMETERIUIV); + Serialise_glTextureParameterIuivEXT(res.name, target, pname, params); + + if(m_State == WRITING_CAPFRAME) + { + m_ContextRecord->AddChunk(scope.Get()); + } + else + { + record->AddChunk(scope.Get()); + record->UpdateCount++; + + if(record->UpdateCount > 12) + { + m_HighTrafficResources.insert(record->GetResourceID()); + GetResourceManager()->MarkDirtyResource(record->GetResourceID()); + } + } + } +} + bool WrappedOpenGL::Serialise_glTextureParameterfEXT(GLuint texture, GLenum target, GLenum pname, GLfloat param) { SERIALISE_ELEMENT(GLenum, Target, target); @@ -1226,6 +1580,41 @@ void WrappedOpenGL::glTexParameterf(GLenum target, GLenum pname, GLfloat param) } } +void WrappedOpenGL::glMultiTexParameterfEXT(GLenum texunit, GLenum target, GLenum pname, GLfloat param) +{ + m_Real.glMultiTexParameterfEXT(texunit, target, pname, param); + + if(m_State >= WRITING) + { + GLResourceRecord *record = GetCtxData().m_TextureRecord[texunit-eGL_TEXTURE0]; + RDCASSERT(record); + + GLResource res = record->Resource; + + if(m_HighTrafficResources.find(record->GetResourceID()) != m_HighTrafficResources.end() && m_State != WRITING_CAPFRAME) + return; + + SCOPED_SERIALISE_CONTEXT(TEXPARAMETERF); + Serialise_glTextureParameterfEXT(res.name, target, pname, param); + + if(m_State == WRITING_CAPFRAME) + { + m_ContextRecord->AddChunk(scope.Get()); + } + else + { + record->AddChunk(scope.Get()); + record->UpdateCount++; + + if(record->UpdateCount > 12) + { + m_HighTrafficResources.insert(record->GetResourceID()); + GetResourceManager()->MarkDirtyResource(record->GetResourceID()); + } + } + } +} + bool WrappedOpenGL::Serialise_glTextureParameterfvEXT(GLuint texture, GLenum target, GLenum pname, const GLfloat *params) { SERIALISE_ELEMENT(GLenum, Target, target); @@ -1312,6 +1701,41 @@ void WrappedOpenGL::glTexParameterfv(GLenum target, GLenum pname, const GLfloat } } +void WrappedOpenGL::glMultiTexParameterfvEXT(GLenum texunit, GLenum target, GLenum pname, const GLfloat *params) +{ + m_Real.glMultiTexParameterfvEXT(texunit, target, pname, params); + + if(m_State >= WRITING) + { + GLResourceRecord *record = GetCtxData().m_TextureRecord[texunit-eGL_TEXTURE0]; + RDCASSERT(record); + + GLResource res = record->Resource; + + if(m_HighTrafficResources.find(record->GetResourceID()) != m_HighTrafficResources.end() && m_State != WRITING_CAPFRAME) + return; + + SCOPED_SERIALISE_CONTEXT(TEXPARAMETERFV); + Serialise_glTextureParameterfvEXT(res.name, target, pname, params); + + if(m_State == WRITING_CAPFRAME) + { + m_ContextRecord->AddChunk(scope.Get()); + } + else + { + record->AddChunk(scope.Get()); + record->UpdateCount++; + + if(record->UpdateCount > 12) + { + m_HighTrafficResources.insert(record->GetResourceID()); + GetResourceManager()->MarkDirtyResource(record->GetResourceID()); + } + } + } +} + bool WrappedOpenGL::Serialise_glPixelStorei(GLenum pname, GLint param) { SERIALISE_ELEMENT(GLenum, PName, pname); @@ -1535,6 +1959,56 @@ void WrappedOpenGL::glTexImage1D(GLenum target, GLint level, GLint internalforma } } +void WrappedOpenGL::glMultiTexImage1DEXT(GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels) +{ + // proxy formats are used for querying texture capabilities, don't serialise these + if(IsProxyTarget((GLenum)internalformat)) return; + + internalformat = GetSizedFormat(m_Real, target, (GLenum)internalformat); + + m_Real.glMultiTexImage1DEXT(texunit, target, level, internalformat, width, border, format, type, pixels); + + bool fromunpackbuf = false; + { + GLint unpackbuf = 0; + m_Real.glGetIntegerv(eGL_PIXEL_UNPACK_BUFFER_BINDING, &unpackbuf); + fromunpackbuf = (unpackbuf != 0); + } + + GLuint texture = 0; + + if(m_State >= WRITING) + { + GLResourceRecord *record = GetCtxData().m_TextureRecord[texunit-eGL_TEXTURE0]; + RDCASSERT(record); + + texture = record->Resource.name; + + SCOPED_SERIALISE_CONTEXT(TEXIMAGE1D); + Serialise_glTextureImage1DEXT(texture, target, level, internalformat, width, border, format, type, fromunpackbuf ? NULL : pixels); + + record->AddChunk(scope.Get()); + + // illegal to re-type textures + record->VerifyDataType(target); + + if(fromunpackbuf) + GetResourceManager()->MarkDirtyResource(record->GetResourceID()); + } + + if(level == 0) + { + ResourceId texId = GetResourceManager()->GetID(TextureRes(GetCtx(), texture)); + + m_Textures[texId].width = width; + m_Textures[texId].height = 1; + m_Textures[texId].depth = 1; + m_Textures[texId].curType = TextureTarget(target); + m_Textures[texId].dimension = 1; + m_Textures[texId].internalFormat = (GLenum)internalformat; + } +} + bool WrappedOpenGL::Serialise_glTextureImage2DEXT(GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels) { SERIALISE_ELEMENT(ResourceId, id, GetResourceManager()->GetID(TextureRes(GetCtx(), texture))); @@ -1686,6 +2160,56 @@ void WrappedOpenGL::glTexImage2D(GLenum target, GLint level, GLint internalforma } } +void WrappedOpenGL::glMultiTexImage2DEXT(GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid * pixels) +{ + // proxy formats are used for querying texture capabilities, don't serialise these + if(IsProxyTarget((GLenum)internalformat)) return; + + internalformat = GetSizedFormat(m_Real, target, (GLenum)internalformat); + + m_Real.glMultiTexImage2DEXT(texunit, target, level, internalformat, width, height, border, format, type, pixels); + + bool fromunpackbuf = false; + { + GLint unpackbuf = 0; + m_Real.glGetIntegerv(eGL_PIXEL_UNPACK_BUFFER_BINDING, &unpackbuf); + fromunpackbuf = (unpackbuf != 0); + } + + GLuint texture = 0; + + if(m_State >= WRITING) + { + GLResourceRecord *record = GetCtxData().m_TextureRecord[texunit-eGL_TEXTURE0]; + RDCASSERT(record); + + texture = record->Resource.name; + + SCOPED_SERIALISE_CONTEXT(TEXIMAGE2D); + Serialise_glTextureImage2DEXT(texture, target, level, internalformat, width, height, border, format, type, fromunpackbuf ? NULL : pixels); + + record->AddChunk(scope.Get()); + + // illegal to re-type textures + record->VerifyDataType(target); + + if(fromunpackbuf) + GetResourceManager()->MarkDirtyResource(record->GetResourceID()); + } + + if(level == 0) + { + ResourceId texId = GetResourceManager()->GetID(TextureRes(GetCtx(), texture)); + + m_Textures[texId].width = width; + m_Textures[texId].height = height; + m_Textures[texId].depth = 1; + m_Textures[texId].curType = TextureTarget(target); + m_Textures[texId].dimension = 2; + m_Textures[texId].internalFormat = (GLenum)internalformat; + } +} + bool WrappedOpenGL::Serialise_glTextureImage3DEXT(GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels) { SERIALISE_ELEMENT(ResourceId, id, GetResourceManager()->GetID(TextureRes(GetCtx(), texture))); @@ -1838,6 +2362,56 @@ void WrappedOpenGL::glTexImage3D(GLenum target, GLint level, GLint internalforma } } +void WrappedOpenGL::glMultiTexImage3DEXT(GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid * pixels) +{ + // proxy formats are used for querying texture capabilities, don't serialise these + if(IsProxyTarget((GLenum)internalformat)) return; + + internalformat = GetSizedFormat(m_Real, target, (GLenum)internalformat); + + m_Real.glMultiTexImage3DEXT(texunit, target, level, internalformat, width, height, depth, border, format, type, pixels); + + bool fromunpackbuf = false; + { + GLint unpackbuf = 0; + m_Real.glGetIntegerv(eGL_PIXEL_UNPACK_BUFFER_BINDING, &unpackbuf); + fromunpackbuf = (unpackbuf != 0); + } + + GLuint texture = 0; + + if(m_State >= WRITING) + { + GLResourceRecord *record = GetCtxData().m_TextureRecord[texunit-eGL_TEXTURE0]; + RDCASSERT(record); + + texture = record->Resource.name; + + SCOPED_SERIALISE_CONTEXT(TEXIMAGE3D); + Serialise_glTextureImage3DEXT(texture, target, level, internalformat, width, height, depth, border, format, type, fromunpackbuf ? NULL : pixels); + + record->AddChunk(scope.Get()); + + // illegal to re-type textures + record->VerifyDataType(target); + + if(fromunpackbuf) + GetResourceManager()->MarkDirtyResource(record->GetResourceID()); + } + + if(level == 0) + { + ResourceId texId = GetResourceManager()->GetID(TextureRes(GetCtx(), texture)); + + m_Textures[texId].width = width; + m_Textures[texId].height = height; + m_Textures[texId].depth = depth; + m_Textures[texId].curType = TextureTarget(target); + m_Textures[texId].dimension = 3; + m_Textures[texId].internalFormat = (GLenum)internalformat; + } +} + bool WrappedOpenGL::Serialise_glCompressedTextureImage1DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *pixels) { SERIALISE_ELEMENT(ResourceId, id, GetResourceManager()->GetID(TextureRes(GetCtx(), texture))); @@ -1991,6 +2565,56 @@ void WrappedOpenGL::glCompressedTexImage1D(GLenum target, GLint level, GLenum in } } +void WrappedOpenGL::glCompressedMultiTexImage1DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *pixels) +{ + // proxy formats are used for querying texture capabilities, don't serialise these + if(IsProxyTarget(internalformat)) return; + + internalformat = GetSizedFormat(m_Real, target, internalformat); + + m_Real.glCompressedMultiTexImage1DEXT(texunit, target, level, internalformat, width, border, imageSize, pixels); + + bool fromunpackbuf = false; + { + GLint unpackbuf = 0; + m_Real.glGetIntegerv(eGL_PIXEL_UNPACK_BUFFER_BINDING, &unpackbuf); + fromunpackbuf = (unpackbuf != 0); + } + + GLuint texture = 0; + + if(m_State >= WRITING) + { + GLResourceRecord *record = GetCtxData().m_TextureRecord[texunit-eGL_TEXTURE0]; + RDCASSERT(record); + + texture = record->Resource.name; + + SCOPED_SERIALISE_CONTEXT(TEXIMAGE1D_COMPRESSED); + Serialise_glCompressedTextureImage1DEXT(texture, target, level, internalformat, width, border, imageSize, fromunpackbuf ? NULL : pixels); + + record->AddChunk(scope.Get()); + + // illegal to re-type textures + record->VerifyDataType(target); + + if(fromunpackbuf) + GetResourceManager()->MarkDirtyResource(record->GetResourceID()); + } + + if(level == 0) + { + ResourceId texId = GetResourceManager()->GetID(TextureRes(GetCtx(), texture)); + + m_Textures[texId].width = width; + m_Textures[texId].height = 1; + m_Textures[texId].depth = 1; + m_Textures[texId].curType = TextureTarget(target); + m_Textures[texId].dimension = 1; + m_Textures[texId].internalFormat = internalformat; + } +} + bool WrappedOpenGL::Serialise_glCompressedTextureImage2DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid * pixels) { SERIALISE_ELEMENT(ResourceId, id, GetResourceManager()->GetID(TextureRes(GetCtx(), texture))); @@ -2145,6 +2769,54 @@ void WrappedOpenGL::glCompressedTexImage2D(GLenum target, GLint level, GLenum in } } +void WrappedOpenGL::glCompressedMultiTexImage2DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid * pixels) +{ + // proxy formats are used for querying texture capabilities, don't serialise these + if(IsProxyTarget(internalformat)) return; + + internalformat = GetSizedFormat(m_Real, target, internalformat); + + m_Real.glCompressedMultiTexImage2DEXT(texunit, target, level, internalformat, width, height, border, imageSize, pixels); + + bool fromunpackbuf = false; + { + GLint unpackbuf = 0; + m_Real.glGetIntegerv(eGL_PIXEL_UNPACK_BUFFER_BINDING, &unpackbuf); + fromunpackbuf = (unpackbuf != 0); + } + + GLuint texture = 0; + + if(m_State >= WRITING) + { + GLResourceRecord *record = GetCtxData().m_TextureRecord[texunit-eGL_TEXTURE0]; + RDCASSERT(record); + + SCOPED_SERIALISE_CONTEXT(TEXIMAGE2D_COMPRESSED); + Serialise_glCompressedTextureImage2DEXT(texture, target, level, internalformat, width, height, border, imageSize, fromunpackbuf ? NULL : pixels); + + record->AddChunk(scope.Get()); + + // illegal to re-type textures + record->VerifyDataType(target); + + if(fromunpackbuf) + GetResourceManager()->MarkDirtyResource(record->GetResourceID()); + } + + if(level == 0) + { + ResourceId texId = GetResourceManager()->GetID(TextureRes(GetCtx(), texture)); + + m_Textures[texId].width = width; + m_Textures[texId].height = height; + m_Textures[texId].depth = 1; + m_Textures[texId].curType = TextureTarget(target); + m_Textures[texId].dimension = 2; + m_Textures[texId].internalFormat = internalformat; + } +} + bool WrappedOpenGL::Serialise_glCompressedTextureImage3DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * pixels) { SERIALISE_ELEMENT(ResourceId, id, GetResourceManager()->GetID(TextureRes(GetCtx(), texture))); @@ -2300,6 +2972,56 @@ void WrappedOpenGL::glCompressedTexImage3D(GLenum target, GLint level, GLenum in } } +void WrappedOpenGL::glCompressedMultiTexImage3DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid * pixels) +{ + // proxy formats are used for querying texture capabilities, don't serialise these + if(IsProxyTarget(internalformat)) return; + + internalformat = GetSizedFormat(m_Real, target, internalformat); + + m_Real.glCompressedMultiTexImage3DEXT(texunit, target, level, internalformat, width, height, depth, border, imageSize, pixels); + + bool fromunpackbuf = false; + { + GLint unpackbuf = 0; + m_Real.glGetIntegerv(eGL_PIXEL_UNPACK_BUFFER_BINDING, &unpackbuf); + fromunpackbuf = (unpackbuf != 0); + } + + GLuint texture = 0; + + if(m_State >= WRITING) + { + GLResourceRecord *record = GetCtxData().m_TextureRecord[texunit-eGL_TEXTURE0]; + RDCASSERT(record); + + texture = record->Resource.name; + + SCOPED_SERIALISE_CONTEXT(TEXIMAGE3D_COMPRESSED); + Serialise_glCompressedTextureImage3DEXT(texture, target, level, internalformat, width, height, depth, border, imageSize, fromunpackbuf ? NULL : pixels); + + record->AddChunk(scope.Get()); + + // illegal to re-type textures + record->VerifyDataType(target); + + if(fromunpackbuf) + GetResourceManager()->MarkDirtyResource(record->GetResourceID()); + } + + if(level == 0) + { + ResourceId texId = GetResourceManager()->GetID(TextureRes(GetCtx(), texture)); + + m_Textures[texId].width = width; + m_Textures[texId].height = height; + m_Textures[texId].depth = depth; + m_Textures[texId].curType = TextureTarget(target); + m_Textures[texId].dimension = 3; + m_Textures[texId].internalFormat = internalformat; + } +} + #pragma endregion #pragma region Texture Creation (glTexStorage*) @@ -3006,6 +3728,53 @@ void WrappedOpenGL::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, G } } +void WrappedOpenGL::glMultiTexSubImage1DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels) +{ + m_Real.glMultiTexSubImage1DEXT(texunit, target, level, xoffset, width, format, type, pixels); + + // proxy formats are used for querying texture capabilities, don't serialise these + if(IsProxyTarget(format)) return; + + GLint unpackbuf = 0; + m_Real.glGetIntegerv(eGL_PIXEL_UNPACK_BUFFER_BINDING, &unpackbuf); + + if(m_State >= WRITING) + { + if(m_State == WRITING_IDLE && unpackbuf != 0) + { + GetResourceManager()->MarkDirtyResource(GetCtxData().GetActiveTexRecord()->GetResourceID()); + } + else + { + GLResourceRecord *record = GetCtxData().m_TextureRecord[texunit-eGL_TEXTURE0]; + RDCASSERT(record); + + if(m_HighTrafficResources.find(record->GetResourceID()) != m_HighTrafficResources.end() && m_State == WRITING_IDLE) + return; + + SCOPED_SERIALISE_CONTEXT(TEXSUBIMAGE1D); + Serialise_glTextureSubImage1DEXT(record->Resource.name, + target, level, xoffset, width, format, type, pixels); + + if(m_State == WRITING_CAPFRAME) + { + m_ContextRecord->AddChunk(scope.Get()); + } + else + { + record->AddChunk(scope.Get()); + record->UpdateCount++; + + if(record->UpdateCount > 60) + { + m_HighTrafficResources.insert(record->GetResourceID()); + GetResourceManager()->MarkDirtyResource(record->GetResourceID()); + } + } + } + } +} + bool WrappedOpenGL::Serialise_glTextureSubImage2DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels) { SERIALISE_ELEMENT(GLenum, Target, target); @@ -3146,6 +3915,53 @@ void WrappedOpenGL::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, G } } +void WrappedOpenGL::glMultiTexSubImage2DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels) +{ + m_Real.glMultiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, width, height, format, type, pixels); + + // proxy formats are used for querying texture capabilities, don't serialise these + if(IsProxyTarget(format)) return; + + GLint unpackbuf = 0; + m_Real.glGetIntegerv(eGL_PIXEL_UNPACK_BUFFER_BINDING, &unpackbuf); + + if(m_State >= WRITING) + { + if(m_State == WRITING_IDLE && unpackbuf != 0) + { + GetResourceManager()->MarkDirtyResource(GetCtxData().GetActiveTexRecord()->GetResourceID()); + } + else + { + GLResourceRecord *record = GetCtxData().m_TextureRecord[texunit-eGL_TEXTURE0]; + RDCASSERT(record); + + if(m_HighTrafficResources.find(record->GetResourceID()) != m_HighTrafficResources.end() && m_State == WRITING_IDLE) + return; + + SCOPED_SERIALISE_CONTEXT(TEXSUBIMAGE2D); + Serialise_glTextureSubImage2DEXT(record->Resource.name, + target, level, xoffset, yoffset, width, height, format, type, pixels); + + if(m_State == WRITING_CAPFRAME) + { + m_ContextRecord->AddChunk(scope.Get()); + } + else + { + record->AddChunk(scope.Get()); + record->UpdateCount++; + + if(record->UpdateCount > 60) + { + m_HighTrafficResources.insert(record->GetResourceID()); + GetResourceManager()->MarkDirtyResource(record->GetResourceID()); + } + } + } + } +} + bool WrappedOpenGL::Serialise_glTextureSubImage3DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels) { SERIALISE_ELEMENT(GLenum, Target, target); @@ -3288,6 +4104,53 @@ void WrappedOpenGL::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, G } } +void WrappedOpenGL::glMultiTexSubImage3DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels) +{ + m_Real.glMultiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + + // proxy formats are used for querying texture capabilities, don't serialise these + if(IsProxyTarget(format)) return; + + GLint unpackbuf = 0; + m_Real.glGetIntegerv(eGL_PIXEL_UNPACK_BUFFER_BINDING, &unpackbuf); + + if(m_State >= WRITING) + { + if(m_State == WRITING_IDLE && unpackbuf != 0) + { + GetResourceManager()->MarkDirtyResource(GetCtxData().GetActiveTexRecord()->GetResourceID()); + } + else + { + GLResourceRecord *record = GetCtxData().m_TextureRecord[texunit-eGL_TEXTURE0]; + RDCASSERT(record); + + if(m_HighTrafficResources.find(record->GetResourceID()) != m_HighTrafficResources.end() && m_State == WRITING_IDLE) + return; + + SCOPED_SERIALISE_CONTEXT(TEXSUBIMAGE3D); + Serialise_glTextureSubImage3DEXT(record->Resource.name, + target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + + if(m_State == WRITING_CAPFRAME) + { + m_ContextRecord->AddChunk(scope.Get()); + } + else + { + record->AddChunk(scope.Get()); + record->UpdateCount++; + + if(record->UpdateCount > 60) + { + m_HighTrafficResources.insert(record->GetResourceID()); + GetResourceManager()->MarkDirtyResource(record->GetResourceID()); + } + } + } + } +} + bool WrappedOpenGL::Serialise_glCompressedTextureSubImage1DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *pixels) { SERIALISE_ELEMENT(GLenum, Target, target); @@ -3415,6 +4278,53 @@ void WrappedOpenGL::glCompressedTexSubImage1D(GLenum target, GLint level, GLint } } +void WrappedOpenGL::glCompressedMultiTexSubImage1DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *pixels) +{ + m_Real.glCompressedMultiTexSubImage1DEXT(texunit, target, level, xoffset, width, format, imageSize, pixels); + + // proxy formats are used for querying texture capabilities, don't serialise these + if(IsProxyTarget(format)) return; + + GLint unpackbuf = 0; + m_Real.glGetIntegerv(eGL_PIXEL_UNPACK_BUFFER_BINDING, &unpackbuf); + + if(m_State >= WRITING) + { + if(m_State == WRITING_IDLE && unpackbuf != 0) + { + GetResourceManager()->MarkDirtyResource(GetCtxData().GetActiveTexRecord()->GetResourceID()); + } + else + { + GLResourceRecord *record = GetCtxData().m_TextureRecord[texunit-eGL_TEXTURE0]; + RDCASSERT(record); + + if(m_HighTrafficResources.find(record->GetResourceID()) != m_HighTrafficResources.end() && m_State == WRITING_IDLE) + return; + + SCOPED_SERIALISE_CONTEXT(TEXSUBIMAGE1D_COMPRESSED); + Serialise_glCompressedTextureSubImage1DEXT(record->Resource.name, + target, level, xoffset, width, format, imageSize, pixels); + + if(m_State == WRITING_CAPFRAME) + { + m_ContextRecord->AddChunk(scope.Get()); + } + else + { + record->AddChunk(scope.Get()); + record->UpdateCount++; + + if(record->UpdateCount > 60) + { + m_HighTrafficResources.insert(record->GetResourceID()); + GetResourceManager()->MarkDirtyResource(record->GetResourceID()); + } + } + } + } +} + bool WrappedOpenGL::Serialise_glCompressedTextureSubImage2DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels) { SERIALISE_ELEMENT(GLenum, Target, target); @@ -3544,6 +4454,53 @@ void WrappedOpenGL::glCompressedTexSubImage2D(GLenum target, GLint level, GLint } } +void WrappedOpenGL::glCompressedMultiTexSubImage2DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels) +{ + m_Real.glCompressedMultiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, width, height, format, imageSize, pixels); + + // proxy formats are used for querying texture capabilities, don't serialise these + if(IsProxyTarget(format)) return; + + GLint unpackbuf = 0; + m_Real.glGetIntegerv(eGL_PIXEL_UNPACK_BUFFER_BINDING, &unpackbuf); + + if(m_State >= WRITING) + { + if(m_State == WRITING_IDLE && unpackbuf != 0) + { + GetResourceManager()->MarkDirtyResource(GetCtxData().GetActiveTexRecord()->GetResourceID()); + } + else + { + GLResourceRecord *record = GetCtxData().m_TextureRecord[texunit-eGL_TEXTURE0]; + RDCASSERT(record); + + if(m_HighTrafficResources.find(record->GetResourceID()) != m_HighTrafficResources.end() && m_State == WRITING_IDLE) + return; + + SCOPED_SERIALISE_CONTEXT(TEXSUBIMAGE2D_COMPRESSED); + Serialise_glCompressedTextureSubImage2DEXT(record->Resource.name, + target, level, xoffset, yoffset, width, height, format, imageSize, pixels); + + if(m_State == WRITING_CAPFRAME) + { + m_ContextRecord->AddChunk(scope.Get()); + } + else + { + record->AddChunk(scope.Get()); + record->UpdateCount++; + + if(record->UpdateCount > 60) + { + m_HighTrafficResources.insert(record->GetResourceID()); + GetResourceManager()->MarkDirtyResource(record->GetResourceID()); + } + } + } + } +} + bool WrappedOpenGL::Serialise_glCompressedTextureSubImage3DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *pixels) { SERIALISE_ELEMENT(GLenum, Target, target); @@ -3675,6 +4632,53 @@ void WrappedOpenGL::glCompressedTexSubImage3D(GLenum target, GLint level, GLint } } +void WrappedOpenGL::glCompressedMultiTexSubImage3DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *pixels) +{ + m_Real.glCompressedMultiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, pixels); + + // proxy formats are used for querying texture capabilities, don't serialise these + if(IsProxyTarget(format)) return; + + GLint unpackbuf = 0; + m_Real.glGetIntegerv(eGL_PIXEL_UNPACK_BUFFER_BINDING, &unpackbuf); + + if(m_State >= WRITING) + { + if(m_State == WRITING_IDLE && unpackbuf != 0) + { + GetResourceManager()->MarkDirtyResource(GetCtxData().GetActiveTexRecord()->GetResourceID()); + } + else + { + GLResourceRecord *record = GetCtxData().m_TextureRecord[texunit-eGL_TEXTURE0]; + RDCASSERT(record); + + if(m_HighTrafficResources.find(record->GetResourceID()) != m_HighTrafficResources.end() && m_State == WRITING_IDLE) + return; + + SCOPED_SERIALISE_CONTEXT(TEXSUBIMAGE3D_COMPRESSED); + Serialise_glCompressedTextureSubImage3DEXT(record->Resource.name, + target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, pixels); + + if(m_State == WRITING_CAPFRAME) + { + m_ContextRecord->AddChunk(scope.Get()); + } + else + { + record->AddChunk(scope.Get()); + record->UpdateCount++; + + if(record->UpdateCount > 60) + { + m_HighTrafficResources.insert(record->GetResourceID()); + GetResourceManager()->MarkDirtyResource(record->GetResourceID()); + } + } + } + } +} + #pragma endregion #pragma region Tex Buffer @@ -3804,4 +4808,22 @@ void WrappedOpenGL::glTexBuffer(GLenum target, GLenum internalformat, GLuint buf } } +void WrappedOpenGL::glMultiTexBufferEXT(GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer) +{ + m_Real.glMultiTexBufferEXT(texunit, target, internalformat, buffer); + + if(m_State >= WRITING) + { + GLResourceRecord *record = GetCtxData().m_TextureRecord[texunit-eGL_TEXTURE0]; + RDCASSERT(record); + + SCOPED_SERIALISE_CONTEXT(TEXBUFFER); + Serialise_glTextureBufferEXT(record->Resource.name, + target, internalformat, buffer); + + record->AddChunk(scope.Get()); + record->AddParent(GetResourceManager()->GetResourceRecord(BufferRes(GetCtx(), buffer))); + } +} + #pragma endregion