summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2021-12-13 12:40:52 -0800
committerGitHub <noreply@github.com>2021-12-13 12:40:52 -0800
commitf024d7299831c0312877e315e8d78b920aaafbaf (patch)
tree51bf3b01e98a8a3d351a2ed313f15a614a2a5c78
parent7c1ca35c96096cb0059f0ef23a799bf5952810c5 (diff)
Fixes to `uploadTextureData`. (#2058)
* Fixes to `uploadTextureData`. * Fix, Co-authored-by: Yong He <yhe@nvidia.com>
-rw-r--r--slang-gfx.h4
-rw-r--r--source/core/slang-math.h5
-rw-r--r--tools/gfx/cuda/render-cuda.cpp2
-rw-r--r--tools/gfx/d3d12/render-d3d12.cpp26
-rw-r--r--tools/gfx/debug-layer.cpp2
-rw-r--r--tools/gfx/debug-layer.h2
-rw-r--r--tools/gfx/immediate-renderer-base.cpp2
-rw-r--r--tools/gfx/vulkan/render-vk.cpp2
8 files changed, 25 insertions, 20 deletions
diff --git a/slang-gfx.h b/slang-gfx.h
index 4d414fa7f..2eb0a6772 100644
--- a/slang-gfx.h
+++ b/slang-gfx.h
@@ -550,7 +550,7 @@ class ITextureResource: public IResource
{
public:
static const uint32_t kTexturePitchAlignment = 256;
-
+ static const uint32_t kRemainingTextureSize = 0xFFFFFFFF;
struct Offset3D
{
uint32_t x = 0;
@@ -1551,7 +1551,7 @@ public:
ITextureResource* dst,
SubresourceRange subResourceRange,
ITextureResource::Offset3D offset,
- ITextureResource::Offset3D extent,
+ ITextureResource::Size extent,
ITextureResource::SubresourceData* subResourceData,
size_t subResourceDataCount) = 0;
virtual SLANG_NO_THROW void SLANG_MCALL
diff --git a/source/core/slang-math.h b/source/core/slang-math.h
index 3d229ded8..231e59007 100644
--- a/source/core/slang-math.h
+++ b/source/core/slang-math.h
@@ -163,6 +163,11 @@ namespace Slang
}
}
+ template <typename T>
+ static T getLowestBit(T val)
+ {
+ return val & (-val);
+ }
};
inline int FloatAsInt(float val)
{
diff --git a/tools/gfx/cuda/render-cuda.cpp b/tools/gfx/cuda/render-cuda.cpp
index 4cd460358..a0e0e8761 100644
--- a/tools/gfx/cuda/render-cuda.cpp
+++ b/tools/gfx/cuda/render-cuda.cpp
@@ -1067,7 +1067,7 @@ public:
ITextureResource* dst,
SubresourceRange subResourceRange,
ITextureResource::Offset3D offset,
- ITextureResource::Offset3D extent,
+ ITextureResource::Size extent,
ITextureResource::SubresourceData* subResourceData,
size_t subResourceDataCount) override
{
diff --git a/tools/gfx/d3d12/render-d3d12.cpp b/tools/gfx/d3d12/render-d3d12.cpp
index 25caa84a2..3daddc73f 100644
--- a/tools/gfx/d3d12/render-d3d12.cpp
+++ b/tools/gfx/d3d12/render-d3d12.cpp
@@ -3717,7 +3717,7 @@ public:
aspectMask = (int32_t)TextureAspect::Color;
while (aspectMask)
{
- auto aspect = (int32_t)aspectMask & (-(int32_t)aspectMask); // get lowest bit of aspectMask.
+ auto aspect = Math::getLowestBit((int32_t)aspectMask);
aspectMask &= ~aspect;
auto planeIndex = D3DUtil::getPlaneSlice(d3dFormat, (TextureAspect)aspect);
for (uint32_t layer = 0; layer < dstSubresource.layerCount; layer++)
@@ -3770,7 +3770,7 @@ public:
ITextureResource* dst,
SubresourceRange subResourceRange,
ITextureResource::Offset3D offset,
- ITextureResource::Offset3D extent,
+ ITextureResource::Size extent,
ITextureResource::SubresourceData* subResourceData,
size_t subResourceDataCount) override
{
@@ -3804,35 +3804,36 @@ public:
footprint.Footprint.Format = texDesc.Format;
uint32_t mipLevel = D3DUtil::getSubresourceMipLevel(
subresourceIndex, dstTexture->getDesc()->numMipLevels);
- if (extent.x != 0xFFFFFFFF)
+ if (extent.width != ITextureResource::kRemainingTextureSize)
{
- footprint.Footprint.Width = extent.x;
+ footprint.Footprint.Width = extent.width;
}
else
{
footprint.Footprint.Width = Math::Max(1, (textureSize.width >> mipLevel)) - offset.x;
}
- if (extent.y != 0xFFFFFFFF)
+ if (extent.height != ITextureResource::kRemainingTextureSize)
{
- footprint.Footprint.Height = extent.y;
+ footprint.Footprint.Height = extent.height;
}
else
{
footprint.Footprint.Height =
Math::Max(1, (textureSize.height >> mipLevel)) - offset.y;
}
- if (extent.z != 0xFFFFFFFF)
+ if (extent.depth != ITextureResource::kRemainingTextureSize)
{
- footprint.Footprint.Depth = extent.z;
+ footprint.Footprint.Depth = extent.depth;
}
else
{
footprint.Footprint.Depth =
Math::Max(1, (textureSize.depth >> mipLevel)) - offset.z;
}
+ auto rowSize = (footprint.Footprint.Width + formatInfo.blockWidth - 1) /
+ formatInfo.blockWidth * formatInfo.blockSizeInBytes;
footprint.Footprint.RowPitch = (UINT)D3DUtil::calcAligned(
- footprint.Footprint.Width * (UInt)formatInfo.blockSizeInBytes,
- (uint32_t)D3D12_TEXTURE_DATA_PITCH_ALIGNMENT);
+ rowSize, (uint32_t)D3D12_TEXTURE_DATA_PITCH_ALIGNMENT);
auto bufferSize = footprint.Footprint.RowPitch * footprint.Footprint.Height *
footprint.Footprint.Depth;
@@ -3856,7 +3857,7 @@ public:
memcpy(
imageStart + row * (size_t)footprint.Footprint.RowPitch,
srcData + subResourceData->strideY * row,
- subResourceData->strideY);
+ rowSize);
}
}
bufferImpl->m_resource.getResource()->Unmap(0, nullptr);
@@ -4104,8 +4105,7 @@ public:
aspectMask = (int32_t)TextureAspect::Color;
while (aspectMask)
{
- auto aspect = (int32_t)aspectMask &
- (-(int32_t)aspectMask); // get lowest bit of aspectMask.
+ auto aspect = Math::getLowestBit((int32_t)aspectMask);
aspectMask &= ~aspect;
auto planeIndex = D3DUtil::getPlaneSlice(d3dFormat, (TextureAspect)aspect);
for (uint32_t layer = 0; layer < subresourceRange.baseArrayLayer; layer++)
diff --git a/tools/gfx/debug-layer.cpp b/tools/gfx/debug-layer.cpp
index fa7064b89..be76f8ade 100644
--- a/tools/gfx/debug-layer.cpp
+++ b/tools/gfx/debug-layer.cpp
@@ -1280,7 +1280,7 @@ void DebugResourceCommandEncoder::uploadTextureData(
ITextureResource* dst,
SubresourceRange subResourceRange,
ITextureResource::Offset3D offset,
- ITextureResource::Offset3D extent,
+ ITextureResource::Size extent,
ITextureResource::SubresourceData* subResourceData,
size_t subResourceDataCount)
{
diff --git a/tools/gfx/debug-layer.h b/tools/gfx/debug-layer.h
index df38fa512..881d90341 100644
--- a/tools/gfx/debug-layer.h
+++ b/tools/gfx/debug-layer.h
@@ -428,7 +428,7 @@ public:
ITextureResource* dst,
SubresourceRange subResourceRange,
ITextureResource::Offset3D offset,
- ITextureResource::Offset3D extent,
+ ITextureResource::Size extent,
ITextureResource::SubresourceData* subResourceData,
size_t subResourceDataCount) override;
diff --git a/tools/gfx/immediate-renderer-base.cpp b/tools/gfx/immediate-renderer-base.cpp
index f302a1d89..aadc9c1dd 100644
--- a/tools/gfx/immediate-renderer-base.cpp
+++ b/tools/gfx/immediate-renderer-base.cpp
@@ -363,7 +363,7 @@ public:
ITextureResource* dst,
SubresourceRange subResourceRange,
ITextureResource::Offset3D offset,
- ITextureResource::Offset3D extend,
+ ITextureResource::Size extend,
ITextureResource::SubresourceData* subResourceData,
size_t subResourceDataCount) override
{
diff --git a/tools/gfx/vulkan/render-vk.cpp b/tools/gfx/vulkan/render-vk.cpp
index 654911d4d..232f18f01 100644
--- a/tools/gfx/vulkan/render-vk.cpp
+++ b/tools/gfx/vulkan/render-vk.cpp
@@ -4565,7 +4565,7 @@ public:
ITextureResource* dst,
SubresourceRange subResourceRange,
ITextureResource::Offset3D offset,
- ITextureResource::Offset3D extend,
+ ITextureResource::Size extend,
ITextureResource::SubresourceData* subResourceData,
size_t subResourceDataCount) override
{