diff --git a/renderdoc/driver/gl/gl_replay.cpp b/renderdoc/driver/gl/gl_replay.cpp index 264b739bc..890595119 100644 --- a/renderdoc/driver/gl/gl_replay.cpp +++ b/renderdoc/driver/gl/gl_replay.cpp @@ -457,8 +457,30 @@ FetchTexture GLReplay::GetTexture(ResourceId id) if(res.resource.name == gl.m_FakeBB_Color || res.resource.name == gl.m_FakeBB_DepthStencil) tex.creationFlags |= eTextureCreate_SwapBuffer; + GLint compressed; + gl.glGetTexLevelParameteriv(levelQueryType, 0, eGL_TEXTURE_COMPRESSED, &compressed); tex.byteSize = 0; - GLNOTIMP("Not calculating bytesize"); + for(uint32_t a=0; a < tex.arraysize; a++) + { + for(uint32_t m=0; m < tex.mips; m++) + { + if(compressed) + { + gl.glGetTexLevelParameteriv(levelQueryType, m, eGL_TEXTURE_COMPRESSED_IMAGE_SIZE, &compressed); + tex.byteSize += compressed; + } + else if(tex.format.special) + { + tex.byteSize += GetByteSize(RDCMAX(1U, tex.width>>m), RDCMAX(1U, tex.height>>m), RDCMAX(1U, tex.depth>>m), + (GLenum)fmt, (GLenum)fmt, 1); + } + else + { + tex.byteSize += RDCMAX(1U, tex.width>>m)*RDCMAX(1U, tex.height>>m)*RDCMAX(1U, tex.depth>>m)* + tex.format.compByteWidth*tex.format.compCount; + } + } + } return tex; } @@ -495,7 +517,6 @@ FetchBuffer GLReplay::GetBuffer(ResourceId id) gl.glBindBuffer(res.curType, res.resource.name); ret.structureSize = 0; - GLNOTIMP("Not fetching structure size (if there's an equivalent)"); ret.creationFlags = 0; switch(res.curType) diff --git a/renderdoc/driver/gl/gl_resources.cpp b/renderdoc/driver/gl/gl_resources.cpp index c1e07b6f7..8758f5c74 100644 --- a/renderdoc/driver/gl/gl_resources.cpp +++ b/renderdoc/driver/gl/gl_resources.cpp @@ -25,10 +25,31 @@ #include "gl_resources.h" -size_t GetByteSize(GLsizei w, GLsizei h, GLsizei d, GLenum format, GLenum type, int level, int align) +size_t GetByteSize(GLsizei w, GLsizei h, GLsizei d, GLenum format, GLenum type, int align) { size_t elemSize = 0; + GLsizei alignMask = ~0x0; + GLsizei alignAdd = 0; + switch(align) + { + default: + case 1: + break; + case 2: + alignMask = ~0x1; + alignAdd = 1; + break; + case 4: + alignMask = ~0x3; + alignAdd = 3; + break; + case 8: + alignMask = ~0x7; + alignAdd = 7; + break; + } + switch(type) { case eGL_UNSIGNED_BYTE: @@ -47,19 +68,28 @@ size_t GetByteSize(GLsizei w, GLsizei h, GLsizei d, GLenum format, GLenum type, break; case eGL_UNSIGNED_BYTE_3_3_2: case eGL_UNSIGNED_BYTE_2_3_3_REV: - return w*h*d; + return ((w + alignAdd) & alignMask)*h*d; case eGL_UNSIGNED_SHORT_5_6_5: case eGL_UNSIGNED_SHORT_5_6_5_REV: case eGL_UNSIGNED_SHORT_4_4_4_4: case eGL_UNSIGNED_SHORT_4_4_4_4_REV: case eGL_UNSIGNED_SHORT_5_5_5_1: case eGL_UNSIGNED_SHORT_1_5_5_5_REV: - return w*h*d*2; + return ((w*2 + alignAdd) & alignMask)*h*d; case eGL_UNSIGNED_INT_8_8_8_8: case eGL_UNSIGNED_INT_8_8_8_8_REV: case eGL_UNSIGNED_INT_10_10_10_2: case eGL_UNSIGNED_INT_2_10_10_10_REV: - return w*h*d*4; + return ((w*4 + alignAdd) & alignMask)*h*d; + case eGL_DEPTH_COMPONENT16: + return ((w*2 + alignAdd) & alignMask)*h*d; + case eGL_DEPTH_COMPONENT24: + case eGL_DEPTH24_STENCIL8: + case eGL_DEPTH_COMPONENT32: + case eGL_DEPTH_COMPONENT32F: + return ((w*4 + alignAdd) & alignMask)*h*d; + case eGL_DEPTH32F_STENCIL8: + return ((w*5 + alignAdd) & alignMask)*h*d; default: RDCERR("Unhandled Byte Size type %d!", type); break; @@ -73,20 +103,20 @@ size_t GetByteSize(GLsizei w, GLsizei h, GLsizei d, GLenum format, GLenum type, case eGL_GREEN_INTEGER: case eGL_BLUE: case eGL_BLUE_INTEGER: - return w*h*d*elemSize; + return ((w*elemSize + alignAdd) & alignMask)*h*d; case eGL_RG: case eGL_RG_INTEGER: - return w*h*d*elemSize*2; + return ((w*elemSize*2 + alignAdd) & alignMask)*h*d; case eGL_RGB: case eGL_RGB_INTEGER: case eGL_BGR: case eGL_BGR_INTEGER: - return w*h*d*elemSize*3; + return ((w*elemSize*3 + alignAdd) & alignMask)*h*d; case eGL_RGBA: case eGL_RGBA_INTEGER: case eGL_BGRA: case eGL_BGRA_INTEGER: - return w*h*d*elemSize*4; + return ((w*elemSize*4 + alignAdd) & alignMask)*h*d; default: RDCERR("Unhandled Byte Size format %d!", format); break; diff --git a/renderdoc/driver/gl/gl_resources.h b/renderdoc/driver/gl/gl_resources.h index 67159c8a5..9d1a656dc 100644 --- a/renderdoc/driver/gl/gl_resources.h +++ b/renderdoc/driver/gl/gl_resources.h @@ -29,7 +29,7 @@ #include "driver/gl/gl_common.h" -size_t GetByteSize(GLsizei w, GLsizei h, GLsizei d, GLenum format, GLenum type, int level, int align); +size_t GetByteSize(GLsizei w, GLsizei h, GLsizei d, GLenum format, GLenum type, int align); enum GLNamespace { diff --git a/renderdoc/driver/gl/wrappers/gl_texture_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_texture_funcs.cpp index ac872e91e..025bc44ef 100644 --- a/renderdoc/driver/gl/wrappers/gl_texture_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_texture_funcs.cpp @@ -938,7 +938,7 @@ bool WrappedOpenGL::Serialise_glTextureSubImage1DEXT(GLuint texture, GLenum targ GLint rowlen = 0; m_Real.glGetIntegerv(eGL_UNPACK_ROW_LENGTH, &rowlen); - size_t subimageSize = GetByteSize(rowlen > 0 ? rowlen : Width, 1, 1, Format, Type, Level, align); + size_t subimageSize = GetByteSize(rowlen > 0 ? rowlen : Width, 1, 1, Format, Type, align); SERIALISE_ELEMENT_BUF(byte *, buf, pixels, subimageSize); @@ -1012,7 +1012,7 @@ bool WrappedOpenGL::Serialise_glTextureSubImage2DEXT(GLuint texture, GLenum targ GLint imgheight = 0; m_Real.glGetIntegerv(eGL_UNPACK_IMAGE_HEIGHT, &imgheight); - size_t subimageSize = GetByteSize(rowlen > 0 ? rowlen : Width, imgheight > 0 ? imgheight : Height, 1, Format, Type, Level, align); + size_t subimageSize = GetByteSize(rowlen > 0 ? rowlen : Width, imgheight > 0 ? imgheight : Height, 1, Format, Type, align); SERIALISE_ELEMENT_BUF(byte *, buf, pixels, subimageSize); @@ -1088,7 +1088,7 @@ bool WrappedOpenGL::Serialise_glTextureSubImage3DEXT(GLuint texture, GLenum targ GLint imgheight = 0; m_Real.glGetIntegerv(eGL_UNPACK_IMAGE_HEIGHT, &imgheight); - size_t subimageSize = GetByteSize(rowlen > 0 ? rowlen : Width, imgheight > 0 ? imgheight : Height, Depth, Format, Type, Level, align); + size_t subimageSize = GetByteSize(rowlen > 0 ? rowlen : Width, imgheight > 0 ? imgheight : Height, Depth, Format, Type, align); SERIALISE_ELEMENT_BUF(byte *, buf, pixels, subimageSize);