summaryrefslogtreecommitdiffstats
path: root/Graphics/GraphicsEngineOpenGL
diff options
context:
space:
mode:
authorassiduous <assiduous@diligentgraphics.com>2020-10-01 01:24:40 +0000
committerassiduous <assiduous@diligentgraphics.com>2020-10-01 01:24:40 +0000
commitd8fa7f9dc4304973265461c076883053d87e52dd (patch)
tree455c568dccc24f65d7bda2303a74b53519116bea /Graphics/GraphicsEngineOpenGL
parentA number of updates to support Metal backend (diff)
downloadDiligentCore-d8fa7f9dc4304973265461c076883053d87e52dd.tar.gz
DiligentCore-d8fa7f9dc4304973265461c076883053d87e52dd.zip
Unified staging buffer offset processing in Vulkan and GL
Diffstat (limited to 'Graphics/GraphicsEngineOpenGL')
-rw-r--r--Graphics/GraphicsEngineOpenGL/include/TextureBaseGL.hpp2
-rw-r--r--Graphics/GraphicsEngineOpenGL/src/DeviceContextGLImpl.cpp36
-rw-r--r--Graphics/GraphicsEngineOpenGL/src/TextureBaseGL.cpp34
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;