From 346d01b17a8c229a07fbf95adf5a9c31b6dea251 Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 2 May 2019 11:05:16 +0100 Subject: [PATCH] Shadow texture state by type, not just by unit * When you do glTexImage2D(GL_TEXTURE_2D) it should refer to the last 2D texture bound to the currently active unit, even if a 3D or other type of texture was bound in between. Previously we only tracked per-unit and ignored the type. --- renderdoc/driver/gl/gl_common.cpp | 49 +++++ renderdoc/driver/gl/gl_common.h | 3 + renderdoc/driver/gl/gl_driver.h | 33 ++- .../driver/gl/wrappers/gl_interop_funcs.cpp | 10 +- .../driver/gl/wrappers/gl_texture_funcs.cpp | 207 ++++++++++-------- 5 files changed, 201 insertions(+), 101 deletions(-) diff --git a/renderdoc/driver/gl/gl_common.cpp b/renderdoc/driver/gl/gl_common.cpp index 8cffefa8e..a36ec3442 100644 --- a/renderdoc/driver/gl/gl_common.cpp +++ b/renderdoc/driver/gl/gl_common.cpp @@ -1207,6 +1207,55 @@ GLenum BufferEnum(size_t idx) return eGL_NONE; } +size_t TextureIdx(GLenum buf) +{ + switch(buf) + { + case eGL_TEXTURE_1D: return 0; + case eGL_TEXTURE_1D_ARRAY: return 1; + case eGL_TEXTURE_2D: return 2; + case eGL_TEXTURE_2D_ARRAY: return 3; + case eGL_TEXTURE_2D_MULTISAMPLE: return 4; + case eGL_TEXTURE_2D_MULTISAMPLE_ARRAY: return 5; + case eGL_TEXTURE_RECTANGLE: return 6; + case eGL_TEXTURE_3D: return 7; + case eGL_TEXTURE_CUBE_MAP: + case eGL_TEXTURE_CUBE_MAP_POSITIVE_X: + case eGL_TEXTURE_CUBE_MAP_NEGATIVE_X: + case eGL_TEXTURE_CUBE_MAP_POSITIVE_Y: + case eGL_TEXTURE_CUBE_MAP_NEGATIVE_Y: + case eGL_TEXTURE_CUBE_MAP_POSITIVE_Z: + case eGL_TEXTURE_CUBE_MAP_NEGATIVE_Z: return 8; + case eGL_TEXTURE_CUBE_MAP_ARRAY: return 9; + case eGL_TEXTURE_BUFFER: return 10; + default: RDCERR("Unexpected enum as texture target: %s", ToStr(buf).c_str()); + } + + return 0; +} + +GLenum TextureEnum(size_t idx) +{ + GLenum enums[] = { + eGL_TEXTURE_1D, + eGL_TEXTURE_1D_ARRAY, + eGL_TEXTURE_2D, + eGL_TEXTURE_2D_ARRAY, + eGL_TEXTURE_2D_MULTISAMPLE, + eGL_TEXTURE_2D_MULTISAMPLE_ARRAY, + eGL_TEXTURE_RECTANGLE, + eGL_TEXTURE_3D, + eGL_TEXTURE_CUBE_MAP, + eGL_TEXTURE_CUBE_MAP_ARRAY, + eGL_TEXTURE_BUFFER, + }; + + if(idx < ARRAY_COUNT(enums)) + return enums[idx]; + + return eGL_NONE; +} + size_t QueryIdx(GLenum query) { size_t idx = 0; diff --git a/renderdoc/driver/gl/gl_common.h b/renderdoc/driver/gl/gl_common.h index 3d9474ea8..da8b1d4a8 100644 --- a/renderdoc/driver/gl/gl_common.h +++ b/renderdoc/driver/gl/gl_common.h @@ -548,6 +548,9 @@ size_t GLTypeSize(GLenum type); size_t BufferIdx(GLenum buf); GLenum BufferEnum(size_t idx); +size_t TextureIdx(GLenum buf); +GLenum TextureEnum(size_t idx); + size_t QueryIdx(GLenum query); GLenum QueryEnum(size_t idx); diff --git a/renderdoc/driver/gl/gl_driver.h b/renderdoc/driver/gl/gl_driver.h index 67833c1d6..1b0c39852 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -384,7 +384,6 @@ private: string glExtsString; // state - GLResourceRecord *m_TextureRecord[256]; // TODO this needs on per texture type :( GLResourceRecord *m_BufferRecord[16]; GLResourceRecord *m_VertexArrayRecord; GLResourceRecord *m_FeedbackRecord; @@ -395,7 +394,33 @@ private: GLuint m_ProgramPipeline; GLuint m_Program; - GLResourceRecord *GetActiveTexRecord() { return m_TextureRecord[m_TextureUnit]; } + GLResourceRecord *GetActiveTexRecord(GLenum target) + { + return m_TextureRecord[TextureIdx(target)][m_TextureUnit]; + } + void SetActiveTexRecord(GLenum target, GLResourceRecord *record) + { + m_TextureRecord[TextureIdx(target)][m_TextureUnit] = record; + } + GLResourceRecord *GetTexUnitRecord(GLenum target, GLenum texunit) + { + return m_TextureRecord[TextureIdx(target)][texunit - eGL_TEXTURE0]; + } + void SetTexUnitRecord(GLenum target, GLenum texunit, GLResourceRecord *record) + { + SetTexUnitRecordIndexed(target, texunit - eGL_TEXTURE0, record); + } + void ClearAllTexUnitRecordsIndexed(uint32_t unitidx) + { + for(size_t i = 0; i < ARRAY_COUNT(m_TextureRecord); i++) + m_TextureRecord[i][unitidx] = NULL; + } + // modern DSA bindings set by index, not enum + void SetTexUnitRecordIndexed(GLenum target, uint32_t unitidx, GLResourceRecord *record) + { + m_TextureRecord[TextureIdx(target)][unitidx] = record; + } + // GLES allows drawing from client memory, in which case we will copy to // temporary VBOs so that input mesh data is recorded. See struct ClientMemoryData GLuint m_ClientMemoryVBOs[16]; @@ -405,6 +430,10 @@ private: GLResourceRecord *m_ContextDataRecord; ResourceId m_ContextFBOID; + + private: + // kept private to force everyone through accessors above + GLResourceRecord *m_TextureRecord[11][256]; }; struct ClientMemoryData diff --git a/renderdoc/driver/gl/wrappers/gl_interop_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_interop_funcs.cpp index 658906cae..d4bb288f8 100644 --- a/renderdoc/driver/gl/wrappers/gl_interop_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_interop_funcs.cpp @@ -1480,7 +1480,7 @@ void WrappedOpenGL::glTexStorageMem1DEXT(GLenum target, GLsizei levels, GLenum i if(IsCaptureMode(m_State)) { - GLResourceRecord *record = GetCtxData().GetActiveTexRecord(); + GLResourceRecord *record = GetCtxData().GetActiveTexRecord(target); if(!record) { @@ -1594,7 +1594,7 @@ void WrappedOpenGL::glTexStorageMem2DEXT(GLenum target, GLsizei levels, GLenum i if(IsCaptureMode(m_State)) { - GLResourceRecord *record = GetCtxData().GetActiveTexRecord(); + GLResourceRecord *record = GetCtxData().GetActiveTexRecord(target); if(!record) { @@ -1717,7 +1717,7 @@ void WrappedOpenGL::glTexStorageMem2DMultisampleEXT(GLenum target, GLsizei sampl if(IsCaptureMode(m_State)) { - GLResourceRecord *record = GetCtxData().GetActiveTexRecord(); + GLResourceRecord *record = GetCtxData().GetActiveTexRecord(target); if(!record) { @@ -1832,7 +1832,7 @@ void WrappedOpenGL::glTexStorageMem3DEXT(GLenum target, GLsizei levels, GLenum i if(IsCaptureMode(m_State)) { - GLResourceRecord *record = GetCtxData().GetActiveTexRecord(); + GLResourceRecord *record = GetCtxData().GetActiveTexRecord(target); if(!record) { @@ -1953,7 +1953,7 @@ void WrappedOpenGL::glTexStorageMem3DMultisampleEXT(GLenum target, GLsizei sampl if(IsCaptureMode(m_State)) { - GLResourceRecord *record = GetCtxData().GetActiveTexRecord(); + GLResourceRecord *record = GetCtxData().GetActiveTexRecord(target); if(!record) { diff --git a/renderdoc/driver/gl/wrappers/gl_texture_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_texture_funcs.cpp index 1f76d41dc..f35edb0a8 100644 --- a/renderdoc/driver/gl/wrappers/gl_texture_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_texture_funcs.cpp @@ -293,14 +293,14 @@ void WrappedOpenGL::glBindTexture(GLenum target, GLuint texture) if(texture == 0) { - cd.m_TextureRecord[cd.m_TextureUnit] = NULL; + cd.SetActiveTexRecord(target, NULL); return; } if(IsCaptureMode(m_State)) { - GLResourceRecord *r = cd.m_TextureRecord[cd.m_TextureUnit] = - GetResourceManager()->GetResourceRecord(TextureRes(GetCtx(), texture)); + GLResourceRecord *r = GetResourceManager()->GetResourceRecord(TextureRes(GetCtx(), texture)); + cd.SetActiveTexRecord(target, r); if(r->datatype) { @@ -389,13 +389,23 @@ void WrappedOpenGL::glBindTextures(GLuint first, GLsizei count, const GLuint *te if(IsCaptureMode(m_State)) { + ContextData &cd = GetCtxData(); + for(GLsizei i = 0; i < count; i++) { if(textures == NULL || textures[i] == 0) - GetCtxData().m_TextureRecord[first + i] = 0; + { + // NULLs all targets + cd.ClearAllTexUnitRecordsIndexed(first + i); + } else - GetCtxData().m_TextureRecord[first + i] = + { + GLResourceRecord *texrecord = GetResourceManager()->GetResourceRecord(TextureRes(GetCtx(), textures[i])); + GLenum target = TextureTarget(texrecord->datatype); + + cd.SetTexUnitRecordIndexed(target, first + i, texrecord); + } } } } @@ -454,14 +464,14 @@ void WrappedOpenGL::glBindMultiTextureEXT(GLenum texunit, GLenum target, GLuint if(texture == 0) { - cd.m_TextureRecord[texunit - eGL_TEXTURE0] = NULL; + cd.SetTexUnitRecord(target, texunit, NULL); return; } if(IsCaptureMode(m_State)) { - GLResourceRecord *r = cd.m_TextureRecord[texunit - eGL_TEXTURE0] = - GetResourceManager()->GetResourceRecord(TextureRes(GetCtx(), texture)); + GLResourceRecord *r = GetResourceManager()->GetResourceRecord(TextureRes(GetCtx(), texture)); + cd.SetTexUnitRecord(target, texunit, r); if(r->datatype) { @@ -527,10 +537,18 @@ void WrappedOpenGL::glBindTextureUnit(GLuint unit, GLuint texture) ContextData &cd = GetCtxData(); if(texture == 0) - cd.m_TextureRecord[unit] = NULL; + { + // NULLs all targets + cd.ClearAllTexUnitRecordsIndexed(unit); + } else - cd.m_TextureRecord[unit] = + { + GLResourceRecord *texrecord = GetResourceManager()->GetResourceRecord(TextureRes(GetCtx(), texture)); + GLenum target = TextureTarget(texrecord->datatype); + + cd.SetTexUnitRecordIndexed(target, unit, texrecord); + } } } @@ -856,7 +874,7 @@ void WrappedOpenGL::glGenerateMipmap(GLenum target) SERIALISE_TIME_CALL(GL.glGenerateMipmap(target)); if(IsCaptureMode(m_State)) - Common_glGenerateTextureMipmapEXT(GetCtxData().GetActiveTexRecord(), target); + Common_glGenerateTextureMipmapEXT(GetCtxData().GetActiveTexRecord(target), target); } void WrappedOpenGL::glGenerateMultiTexMipmapEXT(GLenum texunit, GLenum target) @@ -864,7 +882,7 @@ void WrappedOpenGL::glGenerateMultiTexMipmapEXT(GLenum texunit, GLenum target) SERIALISE_TIME_CALL(GL.glGenerateMultiTexMipmapEXT(texunit, target)); if(IsCaptureMode(m_State)) - Common_glGenerateTextureMipmapEXT(GetCtxData().m_TextureRecord[texunit - eGL_TEXTURE0], target); + Common_glGenerateTextureMipmapEXT(GetCtxData().GetTexUnitRecord(target, texunit), target); } void WrappedOpenGL::glInvalidateTexImage(GLuint texture, GLint level) @@ -1119,8 +1137,8 @@ void WrappedOpenGL::glCopyMultiTexSubImage1DEXT(GLenum texunit, GLenum target, G SERIALISE_TIME_CALL(GL.glCopyMultiTexSubImage1DEXT(texunit, target, level, xoffset, x, y, width)); if(IsCaptureMode(m_State)) - Common_glCopyTextureSubImage1DEXT(GetCtxData().m_TextureRecord[texunit - eGL_TEXTURE0], target, - level, xoffset, x, y, width); + Common_glCopyTextureSubImage1DEXT(GetCtxData().GetTexUnitRecord(target, texunit), target, level, + xoffset, x, y, width); } void WrappedOpenGL::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, @@ -1129,8 +1147,8 @@ void WrappedOpenGL::glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffse SERIALISE_TIME_CALL(GL.glCopyTexSubImage1D(target, level, xoffset, x, y, width)); if(IsCaptureMode(m_State)) - Common_glCopyTextureSubImage1DEXT(GetCtxData().GetActiveTexRecord(), eGL_NONE, level, xoffset, - x, y, width); + Common_glCopyTextureSubImage1DEXT(GetCtxData().GetActiveTexRecord(target), eGL_NONE, level, + xoffset, x, y, width); } template @@ -1228,8 +1246,8 @@ void WrappedOpenGL::glCopyMultiTexSubImage2DEXT(GLenum texunit, GLenum target, G width, height)); if(IsCaptureMode(m_State)) - Common_glCopyTextureSubImage2DEXT(GetCtxData().m_TextureRecord[texunit - eGL_TEXTURE0], target, - level, xoffset, yoffset, x, y, width, height); + Common_glCopyTextureSubImage2DEXT(GetCtxData().GetTexUnitRecord(target, texunit), target, level, + xoffset, yoffset, x, y, width, height); } void WrappedOpenGL::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, @@ -1238,8 +1256,8 @@ void WrappedOpenGL::glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffse SERIALISE_TIME_CALL(GL.glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height)); if(IsCaptureMode(m_State)) - Common_glCopyTextureSubImage2DEXT(GetCtxData().GetActiveTexRecord(), target, level, xoffset, - yoffset, x, y, width, height); + Common_glCopyTextureSubImage2DEXT(GetCtxData().GetActiveTexRecord(target), target, level, + xoffset, yoffset, x, y, width, height); } template @@ -1341,8 +1359,8 @@ void WrappedOpenGL::glCopyMultiTexSubImage3DEXT(GLenum texunit, GLenum target, G zoffset, x, y, width, height)); if(IsCaptureMode(m_State)) - Common_glCopyTextureSubImage3DEXT(GetCtxData().m_TextureRecord[texunit - eGL_TEXTURE0], target, - level, xoffset, yoffset, zoffset, x, y, width, height); + Common_glCopyTextureSubImage3DEXT(GetCtxData().GetTexUnitRecord(target, texunit), target, level, + xoffset, yoffset, zoffset, x, y, width, height); } void WrappedOpenGL::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, @@ -1353,8 +1371,8 @@ void WrappedOpenGL::glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffse GL.glCopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height)); if(IsCaptureMode(m_State)) - Common_glCopyTextureSubImage3DEXT(GetCtxData().GetActiveTexRecord(), target, level, xoffset, - yoffset, zoffset, x, y, width, height); + Common_glCopyTextureSubImage3DEXT(GetCtxData().GetActiveTexRecord(target), target, level, + xoffset, yoffset, zoffset, x, y, width, height); } template @@ -1462,7 +1480,7 @@ void WrappedOpenGL::glTexParameteri(GLenum target, GLenum pname, GLint param) SERIALISE_TIME_CALL(GL.glTexParameteri(target, pname, param)); if(IsCaptureMode(m_State)) - Common_glTextureParameteriEXT(GetCtxData().GetActiveTexRecord(), target, pname, param); + Common_glTextureParameteriEXT(GetCtxData().GetActiveTexRecord(target), target, pname, param); } void WrappedOpenGL::glMultiTexParameteriEXT(GLenum texunit, GLenum target, GLenum pname, GLint param) @@ -1470,8 +1488,8 @@ void WrappedOpenGL::glMultiTexParameteriEXT(GLenum texunit, GLenum target, GLenu SERIALISE_TIME_CALL(GL.glMultiTexParameteriEXT(texunit, target, pname, param)); if(IsCaptureMode(m_State)) - Common_glTextureParameteriEXT(GetCtxData().m_TextureRecord[texunit - eGL_TEXTURE0], target, - pname, param); + Common_glTextureParameteriEXT(GetCtxData().GetTexUnitRecord(target, texunit), target, pname, + param); } template @@ -1568,7 +1586,7 @@ void WrappedOpenGL::glTexParameteriv(GLenum target, GLenum pname, const GLint *p SERIALISE_TIME_CALL(GL.glTexParameteriv(target, pname, params)); if(IsCaptureMode(m_State)) - Common_glTextureParameterivEXT(GetCtxData().GetActiveTexRecord(), target, pname, params); + Common_glTextureParameterivEXT(GetCtxData().GetActiveTexRecord(target), target, pname, params); } void WrappedOpenGL::glMultiTexParameterivEXT(GLenum texunit, GLenum target, GLenum pname, @@ -1577,8 +1595,8 @@ void WrappedOpenGL::glMultiTexParameterivEXT(GLenum texunit, GLenum target, GLen SERIALISE_TIME_CALL(GL.glMultiTexParameterivEXT(texunit, target, pname, params)); if(IsCaptureMode(m_State)) - Common_glTextureParameterivEXT(GetCtxData().m_TextureRecord[texunit - eGL_TEXTURE0], target, - pname, params); + Common_glTextureParameterivEXT(GetCtxData().GetTexUnitRecord(target, texunit), target, pname, + params); } template @@ -1675,7 +1693,7 @@ void WrappedOpenGL::glTexParameterIiv(GLenum target, GLenum pname, const GLint * SERIALISE_TIME_CALL(GL.glTexParameterIiv(target, pname, params)); if(IsCaptureMode(m_State)) - Common_glTextureParameterIivEXT(GetCtxData().GetActiveTexRecord(), target, pname, params); + Common_glTextureParameterIivEXT(GetCtxData().GetActiveTexRecord(target), target, pname, params); } void WrappedOpenGL::glMultiTexParameterIivEXT(GLenum texunit, GLenum target, GLenum pname, @@ -1684,8 +1702,8 @@ void WrappedOpenGL::glMultiTexParameterIivEXT(GLenum texunit, GLenum target, GLe SERIALISE_TIME_CALL(GL.glMultiTexParameterIivEXT(texunit, target, pname, params)); if(IsCaptureMode(m_State)) - Common_glTextureParameterIivEXT(GetCtxData().m_TextureRecord[texunit - eGL_TEXTURE0], target, - pname, params); + Common_glTextureParameterIivEXT(GetCtxData().GetTexUnitRecord(target, texunit), target, pname, + params); } template @@ -1782,7 +1800,7 @@ void WrappedOpenGL::glTexParameterIuiv(GLenum target, GLenum pname, const GLuint SERIALISE_TIME_CALL(GL.glTexParameterIuiv(target, pname, params)); if(IsCaptureMode(m_State)) - Common_glTextureParameterIuivEXT(GetCtxData().GetActiveTexRecord(), target, pname, params); + Common_glTextureParameterIuivEXT(GetCtxData().GetActiveTexRecord(target), target, pname, params); } void WrappedOpenGL::glMultiTexParameterIuivEXT(GLenum texunit, GLenum target, GLenum pname, @@ -1791,8 +1809,8 @@ void WrappedOpenGL::glMultiTexParameterIuivEXT(GLenum texunit, GLenum target, GL SERIALISE_TIME_CALL(GL.glMultiTexParameterIuivEXT(texunit, target, pname, params)); if(IsCaptureMode(m_State)) - Common_glTextureParameterIuivEXT(GetCtxData().m_TextureRecord[texunit - eGL_TEXTURE0], target, - pname, params); + Common_glTextureParameterIuivEXT(GetCtxData().GetTexUnitRecord(target, texunit), target, pname, + params); } template @@ -1885,7 +1903,7 @@ void WrappedOpenGL::glTexParameterf(GLenum target, GLenum pname, GLfloat param) SERIALISE_TIME_CALL(GL.glTexParameterf(target, pname, param)); if(IsCaptureMode(m_State)) - Common_glTextureParameterfEXT(GetCtxData().GetActiveTexRecord(), target, pname, param); + Common_glTextureParameterfEXT(GetCtxData().GetActiveTexRecord(target), target, pname, param); } void WrappedOpenGL::glMultiTexParameterfEXT(GLenum texunit, GLenum target, GLenum pname, GLfloat param) @@ -1893,8 +1911,8 @@ void WrappedOpenGL::glMultiTexParameterfEXT(GLenum texunit, GLenum target, GLenu SERIALISE_TIME_CALL(GL.glMultiTexParameterfEXT(texunit, target, pname, param)); if(IsCaptureMode(m_State)) - Common_glTextureParameterfEXT(GetCtxData().m_TextureRecord[texunit - eGL_TEXTURE0], target, - pname, param); + Common_glTextureParameterfEXT(GetCtxData().GetTexUnitRecord(target, texunit), target, pname, + param); } template @@ -1991,7 +2009,7 @@ void WrappedOpenGL::glTexParameterfv(GLenum target, GLenum pname, const GLfloat SERIALISE_TIME_CALL(GL.glTexParameterfv(target, pname, params)); if(IsCaptureMode(m_State)) - Common_glTextureParameterfvEXT(GetCtxData().GetActiveTexRecord(), target, pname, params); + Common_glTextureParameterfvEXT(GetCtxData().GetActiveTexRecord(target), target, pname, params); } void WrappedOpenGL::glMultiTexParameterfvEXT(GLenum texunit, GLenum target, GLenum pname, @@ -2000,8 +2018,8 @@ void WrappedOpenGL::glMultiTexParameterfvEXT(GLenum texunit, GLenum target, GLen SERIALISE_TIME_CALL(GL.glMultiTexParameterfvEXT(texunit, target, pname, params)); if(IsCaptureMode(m_State)) - Common_glTextureParameterfvEXT(GetCtxData().m_TextureRecord[texunit - eGL_TEXTURE0], target, - pname, params); + Common_glTextureParameterfvEXT(GetCtxData().GetTexUnitRecord(target, texunit), target, pname, + params); } template @@ -2275,7 +2293,7 @@ void WrappedOpenGL::glTexImage1D(GLenum target, GLint level, GLint internalforma } else { - GLResourceRecord *record = GetCtxData().GetActiveTexRecord(); + GLResourceRecord *record = GetCtxData().GetActiveTexRecord(target); if(record != NULL) Common_glTextureImage1DEXT(record->GetResourceID(), target, level, internalformat, width, border, format, type, pixels); @@ -2301,7 +2319,7 @@ void WrappedOpenGL::glMultiTexImage1DEXT(GLenum texunit, GLenum target, GLint le } else { - GLResourceRecord *record = GetCtxData().m_TextureRecord[texunit - eGL_TEXTURE0]; + GLResourceRecord *record = GetCtxData().GetTexUnitRecord(target, texunit); if(record != NULL) Common_glTextureImage1DEXT(record->GetResourceID(), target, level, internalformat, width, border, format, type, pixels); @@ -2523,7 +2541,7 @@ void WrappedOpenGL::glTexImage2D(GLenum target, GLint level, GLint internalforma } else { - GLResourceRecord *record = GetCtxData().GetActiveTexRecord(); + GLResourceRecord *record = GetCtxData().GetActiveTexRecord(target); if(record != NULL) Common_glTextureImage2DEXT(record->GetResourceID(), target, level, internalformat, width, height, border, format, type, pixels); @@ -2550,7 +2568,7 @@ void WrappedOpenGL::glMultiTexImage2DEXT(GLenum texunit, GLenum target, GLint le } else { - GLResourceRecord *record = GetCtxData().m_TextureRecord[texunit - eGL_TEXTURE0]; + GLResourceRecord *record = GetCtxData().GetTexUnitRecord(target, texunit); if(record != NULL) Common_glTextureImage2DEXT(record->GetResourceID(), target, level, internalformat, width, height, border, format, type, pixels); @@ -2754,7 +2772,7 @@ void WrappedOpenGL::glTexImage3D(GLenum target, GLint level, GLint internalforma } else { - GLResourceRecord *record = GetCtxData().GetActiveTexRecord(); + GLResourceRecord *record = GetCtxData().GetActiveTexRecord(target); if(record != NULL) Common_glTextureImage3DEXT(record->GetResourceID(), target, level, internalformat, width, height, depth, border, format, type, pixels); @@ -2781,7 +2799,7 @@ void WrappedOpenGL::glMultiTexImage3DEXT(GLenum texunit, GLenum target, GLint le } else { - GLResourceRecord *record = GetCtxData().m_TextureRecord[texunit - eGL_TEXTURE0]; + GLResourceRecord *record = GetCtxData().GetTexUnitRecord(target, texunit); if(record != NULL) Common_glTextureImage3DEXT(record->GetResourceID(), target, level, internalformat, width, height, depth, border, format, type, pixels); @@ -2978,7 +2996,7 @@ void WrappedOpenGL::glCompressedTexImage1D(GLenum target, GLint level, GLenum in } else { - GLResourceRecord *record = GetCtxData().GetActiveTexRecord(); + GLResourceRecord *record = GetCtxData().GetActiveTexRecord(target); if(record != NULL) Common_glCompressedTextureImage1DEXT(record->GetResourceID(), target, level, internalformat, width, border, imageSize, pixels); @@ -3002,7 +3020,7 @@ void WrappedOpenGL::glCompressedMultiTexImage1DEXT(GLenum texunit, GLenum target } else { - GLResourceRecord *record = GetCtxData().m_TextureRecord[texunit - eGL_TEXTURE0]; + GLResourceRecord *record = GetCtxData().GetTexUnitRecord(target, texunit); if(record != NULL) Common_glCompressedTextureImage1DEXT(record->GetResourceID(), target, level, internalformat, width, border, imageSize, pixels); @@ -3332,7 +3350,7 @@ void WrappedOpenGL::glCompressedTexImage2D(GLenum target, GLint level, GLenum in } else { - GLResourceRecord *record = GetCtxData().GetActiveTexRecord(); + GLResourceRecord *record = GetCtxData().GetActiveTexRecord(target); if(record != NULL) Common_glCompressedTextureImage2DEXT(record->GetResourceID(), target, level, internalformat, width, height, border, imageSize, pixels); @@ -3357,7 +3375,7 @@ void WrappedOpenGL::glCompressedMultiTexImage2DEXT(GLenum texunit, GLenum target } else { - GLResourceRecord *record = GetCtxData().m_TextureRecord[texunit - eGL_TEXTURE0]; + GLResourceRecord *record = GetCtxData().GetTexUnitRecord(target, texunit); if(record != NULL) Common_glCompressedTextureImage2DEXT(record->GetResourceID(), target, level, internalformat, width, height, border, imageSize, pixels); @@ -3569,7 +3587,7 @@ void WrappedOpenGL::glCompressedTexImage3D(GLenum target, GLint level, GLenum in } else { - GLResourceRecord *record = GetCtxData().GetActiveTexRecord(); + GLResourceRecord *record = GetCtxData().GetActiveTexRecord(target); if(record != NULL) Common_glCompressedTextureImage3DEXT(record->GetResourceID(), target, level, internalformat, width, height, depth, border, imageSize, pixels); @@ -3594,7 +3612,7 @@ void WrappedOpenGL::glCompressedMultiTexImage3DEXT(GLenum texunit, GLenum target } else { - GLResourceRecord *record = GetCtxData().m_TextureRecord[texunit - eGL_TEXTURE0]; + GLResourceRecord *record = GetCtxData().GetTexUnitRecord(target, texunit); if(record != NULL) Common_glCompressedTextureImage3DEXT(record->GetResourceID(), target, level, internalformat, width, height, depth, border, imageSize, pixels); @@ -3741,8 +3759,8 @@ void WrappedOpenGL::glCopyMultiTexImage1DEXT(GLenum texunit, GLenum target, GLin if(IsReplayMode(m_State)) RDCERR("Internal textures should be allocated via dsa interfaces"); else - Common_glCopyTextureImage1DEXT(GetCtxData().m_TextureRecord[texunit - eGL_TEXTURE0], target, - level, internalformat, x, y, width, border); + Common_glCopyTextureImage1DEXT(GetCtxData().GetTexUnitRecord(target, texunit), target, level, + internalformat, x, y, width, border); } void WrappedOpenGL::glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, @@ -3755,8 +3773,8 @@ void WrappedOpenGL::glCopyTexImage1D(GLenum target, GLint level, GLenum internal if(IsReplayMode(m_State)) RDCERR("Internal textures should be allocated via dsa interfaces"); else - Common_glCopyTextureImage1DEXT(GetCtxData().GetActiveTexRecord(), target, level, internalformat, - x, y, width, border); + Common_glCopyTextureImage1DEXT(GetCtxData().GetActiveTexRecord(target), target, level, + internalformat, x, y, width, border); } template @@ -3894,8 +3912,8 @@ void WrappedOpenGL::glCopyMultiTexImage2DEXT(GLenum texunit, GLenum target, GLin if(IsReplayMode(m_State)) RDCERR("Internal textures should be allocated via dsa interfaces"); else - Common_glCopyTextureImage2DEXT(GetCtxData().m_TextureRecord[texunit - eGL_TEXTURE0], target, - level, internalformat, x, y, width, height, border); + Common_glCopyTextureImage2DEXT(GetCtxData().GetTexUnitRecord(target, texunit), target, level, + internalformat, x, y, width, height, border); } void WrappedOpenGL::glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, @@ -3908,8 +3926,8 @@ void WrappedOpenGL::glCopyTexImage2D(GLenum target, GLint level, GLenum internal if(IsReplayMode(m_State)) RDCERR("Internal textures should be allocated via dsa interfaces"); else - Common_glCopyTextureImage2DEXT(GetCtxData().GetActiveTexRecord(), target, level, internalformat, - x, y, width, height, border); + Common_glCopyTextureImage2DEXT(GetCtxData().GetActiveTexRecord(target), target, level, + internalformat, x, y, width, height, border); } #pragma endregion @@ -4033,7 +4051,7 @@ void WrappedOpenGL::glTexStorage1D(GLenum target, GLsizei levels, GLenum interna } else { - GLResourceRecord *record = GetCtxData().GetActiveTexRecord(); + GLResourceRecord *record = GetCtxData().GetActiveTexRecord(target); if(record != NULL) Common_glTextureStorage1DEXT(record->GetResourceID(), target, levels, internalformat, width); else @@ -4162,7 +4180,7 @@ void WrappedOpenGL::glTexStorage2D(GLenum target, GLsizei levels, GLenum interna } else { - GLResourceRecord *record = GetCtxData().GetActiveTexRecord(); + GLResourceRecord *record = GetCtxData().GetActiveTexRecord(target); if(record != NULL) Common_glTextureStorage2DEXT(record->GetResourceID(), target, levels, internalformat, width, height); @@ -4295,7 +4313,7 @@ void WrappedOpenGL::glTexStorage3D(GLenum target, GLsizei levels, GLenum interna } else { - GLResourceRecord *record = GetCtxData().GetActiveTexRecord(); + GLResourceRecord *record = GetCtxData().GetActiveTexRecord(target); if(record != NULL) Common_glTextureStorage3DEXT(record->GetResourceID(), target, levels, internalformat, width, height, depth); @@ -4440,7 +4458,7 @@ void WrappedOpenGL::glTexStorage2DMultisample(GLenum target, GLsizei samples, GL } else { - GLResourceRecord *record = GetCtxData().GetActiveTexRecord(); + GLResourceRecord *record = GetCtxData().GetActiveTexRecord(target); if(record != NULL) Common_glTextureStorage2DMultisampleEXT(record->GetResourceID(), target, samples, internalformat, width, height, fixedsamplelocations); @@ -4466,7 +4484,7 @@ void WrappedOpenGL::glTexImage2DMultisample(GLenum target, GLsizei samples, GLen { // assuming texstorage is equivalent to teximage (this is not true in the case where someone // tries to re-size an image by re-calling teximage). - GLResourceRecord *record = GetCtxData().GetActiveTexRecord(); + GLResourceRecord *record = GetCtxData().GetActiveTexRecord(target); if(record != NULL) Common_glTextureStorage2DMultisampleEXT(record->GetResourceID(), target, samples, internalformat, width, height, fixedsamplelocations); @@ -4617,7 +4635,7 @@ void WrappedOpenGL::glTexStorage3DMultisample(GLenum target, GLsizei samples, GL } else { - GLResourceRecord *record = GetCtxData().GetActiveTexRecord(); + GLResourceRecord *record = GetCtxData().GetActiveTexRecord(target); if(record != NULL) Common_glTextureStorage3DMultisampleEXT(record->GetResourceID(), target, samples, internalformat, width, height, depth, @@ -4644,7 +4662,7 @@ void WrappedOpenGL::glTexImage3DMultisample(GLenum target, GLsizei samples, GLen { // assuming texstorage is equivalent to teximage (this is not true in the case where someone // tries to re-size an image by re-calling teximage). - GLResourceRecord *record = GetCtxData().GetActiveTexRecord(); + GLResourceRecord *record = GetCtxData().GetActiveTexRecord(target); if(record != NULL) Common_glTextureStorage3DMultisampleEXT(record->GetResourceID(), target, samples, internalformat, width, height, depth, @@ -4851,8 +4869,8 @@ void WrappedOpenGL::glTexSubImage1D(GLenum target, GLint level, GLint xoffset, G SERIALISE_TIME_CALL(GL.glTexSubImage1D(target, level, xoffset, width, format, type, pixels)); if(IsCaptureMode(m_State)) - Common_glTextureSubImage1DEXT(GetCtxData().GetActiveTexRecord(), target, level, xoffset, width, - format, type, pixels); + Common_glTextureSubImage1DEXT(GetCtxData().GetActiveTexRecord(target), target, level, xoffset, + width, format, type, pixels); } void WrappedOpenGL::glMultiTexSubImage1DEXT(GLenum texunit, GLenum target, GLint level, @@ -4863,8 +4881,8 @@ void WrappedOpenGL::glMultiTexSubImage1DEXT(GLenum texunit, GLenum target, GLint GL.glMultiTexSubImage1DEXT(texunit, target, level, xoffset, width, format, type, pixels)); if(IsCaptureMode(m_State)) - Common_glTextureSubImage1DEXT(GetCtxData().m_TextureRecord[texunit - eGL_TEXTURE0], target, - level, xoffset, width, format, type, pixels); + Common_glTextureSubImage1DEXT(GetCtxData().GetTexUnitRecord(target, texunit), target, level, + xoffset, width, format, type, pixels); } template @@ -5067,7 +5085,7 @@ void WrappedOpenGL::glTexSubImage2D(GLenum target, GLint level, GLint xoffset, G GL.glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels)); if(IsCaptureMode(m_State)) - Common_glTextureSubImage2DEXT(GetCtxData().GetActiveTexRecord(), target, level, xoffset, + Common_glTextureSubImage2DEXT(GetCtxData().GetActiveTexRecord(target), target, level, xoffset, yoffset, width, height, format, type, pixels); } @@ -5079,8 +5097,8 @@ void WrappedOpenGL::glMultiTexSubImage2DEXT(GLenum texunit, GLenum target, GLint height, format, type, pixels)); if(IsCaptureMode(m_State)) - Common_glTextureSubImage2DEXT(GetCtxData().m_TextureRecord[texunit - eGL_TEXTURE0], target, - level, xoffset, yoffset, width, height, format, type, pixels); + Common_glTextureSubImage2DEXT(GetCtxData().GetTexUnitRecord(target, texunit), target, level, + xoffset, yoffset, width, height, format, type, pixels); } template @@ -5288,7 +5306,7 @@ void WrappedOpenGL::glTexSubImage3D(GLenum target, GLint level, GLint xoffset, G depth, format, type, pixels)); if(IsCaptureMode(m_State)) - Common_glTextureSubImage3DEXT(GetCtxData().GetActiveTexRecord(), target, level, xoffset, + Common_glTextureSubImage3DEXT(GetCtxData().GetActiveTexRecord(target), target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); } @@ -5301,9 +5319,9 @@ void WrappedOpenGL::glMultiTexSubImage3DEXT(GLenum texunit, GLenum target, GLint width, height, depth, format, type, pixels)); if(IsCaptureMode(m_State)) - Common_glTextureSubImage3DEXT(GetCtxData().m_TextureRecord[texunit - eGL_TEXTURE0], target, - level, xoffset, yoffset, zoffset, width, height, depth, format, - type, pixels); + Common_glTextureSubImage3DEXT(GetCtxData().GetTexUnitRecord(target, texunit), target, level, + xoffset, yoffset, zoffset, width, height, depth, format, type, + pixels); } template @@ -5488,7 +5506,7 @@ void WrappedOpenGL::glCompressedTexSubImage1D(GLenum target, GLint level, GLint GL.glCompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, pixels)); if(IsCaptureMode(m_State)) - Common_glCompressedTextureSubImage1DEXT(GetCtxData().GetActiveTexRecord(), target, level, + Common_glCompressedTextureSubImage1DEXT(GetCtxData().GetActiveTexRecord(target), target, level, xoffset, width, format, imageSize, pixels); } @@ -5500,8 +5518,8 @@ void WrappedOpenGL::glCompressedMultiTexSubImage1DEXT(GLenum texunit, GLenum tar format, imageSize, pixels)); if(IsCaptureMode(m_State)) - Common_glCompressedTextureSubImage1DEXT(GetCtxData().m_TextureRecord[texunit - eGL_TEXTURE0], - target, level, xoffset, width, format, imageSize, pixels); + Common_glCompressedTextureSubImage1DEXT(GetCtxData().GetTexUnitRecord(target, texunit), target, + level, xoffset, width, format, imageSize, pixels); } template @@ -5703,8 +5721,9 @@ void WrappedOpenGL::glCompressedTexSubImage2D(GLenum target, GLint level, GLint format, imageSize, pixels)); if(IsCaptureMode(m_State)) - Common_glCompressedTextureSubImage2DEXT(GetCtxData().GetActiveTexRecord(), target, level, xoffset, - yoffset, width, height, format, imageSize, pixels); + Common_glCompressedTextureSubImage2DEXT(GetCtxData().GetActiveTexRecord(target), target, level, + xoffset, yoffset, width, height, format, imageSize, + pixels); } void WrappedOpenGL::glCompressedMultiTexSubImage2DEXT(GLenum texunit, GLenum target, GLint level, @@ -5716,8 +5735,8 @@ void WrappedOpenGL::glCompressedMultiTexSubImage2DEXT(GLenum texunit, GLenum tar texunit, target, level, xoffset, yoffset, width, height, format, imageSize, pixels)); if(IsCaptureMode(m_State)) - Common_glCompressedTextureSubImage2DEXT(GetCtxData().m_TextureRecord[texunit - eGL_TEXTURE0], - target, level, xoffset, yoffset, width, height, format, + Common_glCompressedTextureSubImage2DEXT(GetCtxData().GetTexUnitRecord(target, texunit), target, + level, xoffset, yoffset, width, height, format, imageSize, pixels); } @@ -5924,7 +5943,7 @@ void WrappedOpenGL::glCompressedTexSubImage3D(GLenum target, GLint level, GLint height, depth, format, imageSize, pixels)); if(IsCaptureMode(m_State)) - Common_glCompressedTextureSubImage3DEXT(GetCtxData().GetActiveTexRecord(), target, level, + Common_glCompressedTextureSubImage3DEXT(GetCtxData().GetActiveTexRecord(target), target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, pixels); } @@ -5940,9 +5959,9 @@ void WrappedOpenGL::glCompressedMultiTexSubImage3DEXT(GLenum texunit, GLenum tar imageSize, pixels)); if(IsCaptureMode(m_State)) - Common_glCompressedTextureSubImage3DEXT(GetCtxData().m_TextureRecord[texunit - eGL_TEXTURE0], - target, level, xoffset, yoffset, zoffset, width, height, - depth, format, imageSize, pixels); + Common_glCompressedTextureSubImage3DEXT(GetCtxData().GetTexUnitRecord(target, texunit), target, + level, xoffset, yoffset, zoffset, width, height, depth, + format, imageSize, pixels); } #pragma endregion @@ -6120,7 +6139,7 @@ void WrappedOpenGL::glTexBufferRange(GLenum target, GLenum internalformat, GLuin } else { - GLResourceRecord *record = GetCtxData().GetActiveTexRecord(); + GLResourceRecord *record = GetCtxData().GetActiveTexRecord(target); if(record != NULL) Common_glTextureBufferRangeEXT(record->GetResourceID(), target, internalformat, buffer, offset, size); @@ -6303,7 +6322,7 @@ void WrappedOpenGL::glTexBuffer(GLenum target, GLenum internalformat, GLuint buf } else { - GLResourceRecord *record = GetCtxData().GetActiveTexRecord(); + GLResourceRecord *record = GetCtxData().GetActiveTexRecord(target); if(record != NULL) Common_glTextureBufferEXT(record->GetResourceID(), target, internalformat, buffer); else @@ -6324,7 +6343,7 @@ void WrappedOpenGL::glMultiTexBufferEXT(GLenum texunit, GLenum target, GLenum in } else { - GLResourceRecord *record = GetCtxData().m_TextureRecord[texunit - eGL_TEXTURE0]; + GLResourceRecord *record = GetCtxData().GetTexUnitRecord(target, texunit); if(record != NULL) Common_glTextureBufferEXT(record->GetResourceID(), target, internalformat, buffer); else