diff options
| author | assiduous <assiduous@diligentgraphics.com> | 2020-10-01 01:24:40 +0000 |
|---|---|---|
| committer | assiduous <assiduous@diligentgraphics.com> | 2020-10-01 01:24:40 +0000 |
| commit | d8fa7f9dc4304973265461c076883053d87e52dd (patch) | |
| tree | 455c568dccc24f65d7bda2303a74b53519116bea /Graphics/GraphicsEngineOpenGL | |
| parent | A number of updates to support Metal backend (diff) | |
| download | DiligentCore-d8fa7f9dc4304973265461c076883053d87e52dd.tar.gz DiligentCore-d8fa7f9dc4304973265461c076883053d87e52dd.zip | |
Unified staging buffer offset processing in Vulkan and GL
Diffstat (limited to 'Graphics/GraphicsEngineOpenGL')
3 files changed, 15 insertions, 57 deletions
diff --git a/Graphics/GraphicsEngineOpenGL/include/TextureBaseGL.hpp b/Graphics/GraphicsEngineOpenGL/include/TextureBaseGL.hpp index 81dc8fc0..b5b0517d 100644 --- a/Graphics/GraphicsEngineOpenGL/include/TextureBaseGL.hpp +++ b/Graphics/GraphicsEngineOpenGL/include/TextureBaseGL.hpp @@ -114,7 +114,7 @@ public: const Box& DstBox, const TextureSubResData& SubresData) = 0; - static Uint32 GetPBODataOffset(const TextureDesc& TexDesc, Uint32 ArraySlice, Uint32 MipLevel); + static constexpr Uint32 PBOOffsetAlignment = 4; IBuffer* GetPBO() { diff --git a/Graphics/GraphicsEngineOpenGL/src/DeviceContextGLImpl.cpp b/Graphics/GraphicsEngineOpenGL/src/DeviceContextGLImpl.cpp index d1ef575e..f4ef1136 100644 --- a/Graphics/GraphicsEngineOpenGL/src/DeviceContextGLImpl.cpp +++ b/Graphics/GraphicsEngineOpenGL/src/DeviceContextGLImpl.cpp @@ -1500,20 +1500,15 @@ void DeviceContextGLImpl::CopyTexture(const CopyTextureAttribs& CopyAttribs) if (SrcTexDesc.Usage == USAGE_STAGING && DstTexDesc.Usage != USAGE_STAGING) { TextureSubResData SubresData; - SubresData.pData = nullptr; - SubresData.pSrcBuffer = pSrcTexGL->GetPBO(); - SubresData.SrcOffset = TextureBaseGL::GetPBODataOffset(SrcTexDesc, CopyAttribs.SrcSlice, CopyAttribs.SrcMipLevel); + SubresData.pData = nullptr; + SubresData.pSrcBuffer = pSrcTexGL->GetPBO(); + SubresData.SrcOffset = + GetStagingTextureLocationOffset(SrcTexDesc, CopyAttribs.SrcSlice, CopyAttribs.SrcMipLevel, + TextureBaseGL::PBOOffsetAlignment, + pSrcBox->MinX, pSrcBox->MinY, pSrcBox->MinZ); SubresData.Stride = SrcMipLevelAttribs.RowSize; SubresData.DepthStride = SrcMipLevelAttribs.DepthSliceSize; - const auto& SrcFmtAttribs = GetTextureFormatAttribs(SrcTexDesc.Format); - SubresData.SrcOffset += - // For compressed-block formats, RowSize is the size of one compressed row. - // For non-compressed formats, BlockHeight is 1. - (pSrcBox->MinZ * SrcMipLevelAttribs.StorageHeight + pSrcBox->MinY) / SrcFmtAttribs.BlockHeight * SrcMipLevelAttribs.RowSize + - // For non-compressed formats, BlockWidth is 1. - (pSrcBox->MinX / SrcFmtAttribs.BlockWidth) * SrcFmtAttribs.GetElementSize(); - Box DstBox; DstBox.MinX = CopyAttribs.DstX; DstBox.MinY = CopyAttribs.DstY; @@ -1561,17 +1556,12 @@ void DeviceContextGLImpl::CopyTexture(const CopyTextureAttribs& CopyAttribs) auto* pDstBuffer = ValidatedCast<BufferGLImpl>(pDstTexGL->GetPBO()); VERIFY(pDstBuffer != nullptr, "Internal staging buffer must not be null"); - auto DstOffset = TextureBaseGL::GetPBODataOffset(DstTexDesc, CopyAttribs.DstSlice, CopyAttribs.DstMipLevel); - - auto DstMipLevelAttribs = GetMipLevelProperties(DstTexDesc, CopyAttribs.DstMipLevel); - - const auto& DstFmtAttribs = GetTextureFormatAttribs(DstTexDesc.Format); - DstOffset += - // For compressed-block formats, RowSize is the size of one compressed row. - // For non-compressed formats, BlockHeight is 1. - (CopyAttribs.DstZ * DstMipLevelAttribs.StorageHeight + CopyAttribs.DstY) / DstFmtAttribs.BlockHeight * DstMipLevelAttribs.RowSize + - // For non-compressed formats, BlockWidth is 1. - (CopyAttribs.DstX / DstFmtAttribs.BlockWidth) * DstFmtAttribs.GetElementSize(); + // GetStagingTextureLocationOffset assumes pixels are tightly packed in every subresource - no padding + // except between subresources. + const auto DstOffset = + GetStagingTextureLocationOffset(DstTexDesc, CopyAttribs.DstSlice, CopyAttribs.DstMipLevel, + TextureBaseGL::PBOOffsetAlignment, + CopyAttribs.DstX, CopyAttribs.DstY, CopyAttribs.DstZ); m_ContextState.BindBuffer(GL_PIXEL_PACK_BUFFER, pDstBuffer->GetGLHandle(), true); @@ -1606,7 +1596,7 @@ void DeviceContextGLImpl::MapTextureSubresource(ITexture* pTextu const auto& TexDesc = pTexGL->GetDesc(); if (TexDesc.Usage == USAGE_STAGING) { - auto PBOOffset = TextureBaseGL::GetPBODataOffset(TexDesc, ArraySlice, MipLevel); + auto PBOOffset = GetStagingTextureSubresourceOffset(TexDesc, ArraySlice, MipLevel, TextureBaseGL::PBOOffsetAlignment); auto MipLevelAttribs = GetMipLevelProperties(TexDesc, MipLevel); auto pPBO = ValidatedCast<BufferGLImpl>(pTexGL->GetPBO()); pPBO->MapRange(m_ContextState, MapType, MapFlags, PBOOffset, MipLevelAttribs.MipSize, MappedData.pData); diff --git a/Graphics/GraphicsEngineOpenGL/src/TextureBaseGL.cpp b/Graphics/GraphicsEngineOpenGL/src/TextureBaseGL.cpp index af63e560..564d16cb 100644 --- a/Graphics/GraphicsEngineOpenGL/src/TextureBaseGL.cpp +++ b/Graphics/GraphicsEngineOpenGL/src/TextureBaseGL.cpp @@ -40,38 +40,6 @@ namespace Diligent { - -Uint32 TextureBaseGL::GetPBODataOffset(const TextureDesc& TexDesc, Uint32 ArraySlice, Uint32 MipLevel) -{ - VERIFY_EXPR(ArraySlice < TexDesc.ArraySize && MipLevel < TexDesc.MipLevels || ArraySlice == TexDesc.ArraySize && MipLevel == 0); - - Uint32 Offset = 0; - if (ArraySlice > 0) - { - Uint32 ArraySliceSize = 0; - for (Uint32 mip = 0; mip < TexDesc.MipLevels; ++mip) - { - auto MipInfo = GetMipLevelProperties(TexDesc, mip); - ArraySliceSize += Align(MipInfo.MipSize, Uint32{4}); - } - - Offset = ArraySliceSize; - if (TexDesc.Type == RESOURCE_DIM_TEX_1D_ARRAY || - TexDesc.Type == RESOURCE_DIM_TEX_2D_ARRAY || - TexDesc.Type == RESOURCE_DIM_TEX_CUBE || - TexDesc.Type == RESOURCE_DIM_TEX_CUBE_ARRAY) - Offset *= ArraySlice; - } - - for (Uint32 mip = 0; mip < MipLevel; ++mip) - { - auto MipInfo = GetMipLevelProperties(TexDesc, mip); - Offset += Align(MipInfo.MipSize, Uint32{4}); - } - - return Offset; -} - TextureBaseGL::TextureBaseGL(IReferenceCounters* pRefCounters, FixedBlockMemoryAllocator& TexViewObjAllocator, RenderDeviceGLImpl* pDeviceGL, @@ -106,7 +74,7 @@ TextureBaseGL::TextureBaseGL(IReferenceCounters* pRefCounters, StagingBuffName += '\''; StagingBufferDesc.Name = StagingBuffName.c_str(); - StagingBufferDesc.uiSizeInBytes = GetPBODataOffset(m_Desc, m_Desc.ArraySize, 0); + StagingBufferDesc.uiSizeInBytes = GetStagingTextureSubresourceOffset(m_Desc, m_Desc.ArraySize, 0, PBOOffsetAlignment); StagingBufferDesc.Usage = USAGE_STAGING; StagingBufferDesc.CPUAccessFlags = TexDesc.CPUAccessFlags; |
