summaryrefslogtreecommitdiff
path: root/tools/gfx
diff options
context:
space:
mode:
Diffstat (limited to 'tools/gfx')
-rw-r--r--tools/gfx/cuda/render-cuda.cpp8
-rw-r--r--tools/gfx/d3d11/render-d3d11.cpp17
-rw-r--r--tools/gfx/d3d12/render-d3d12.cpp31
-rw-r--r--tools/gfx/open-gl/render-gl.cpp21
-rw-r--r--tools/gfx/vulkan/render-vk.cpp33
5 files changed, 67 insertions, 43 deletions
diff --git a/tools/gfx/cuda/render-cuda.cpp b/tools/gfx/cuda/render-cuda.cpp
index ec7edf00a..d13045359 100644
--- a/tools/gfx/cuda/render-cuda.cpp
+++ b/tools/gfx/cuda/render-cuda.cpp
@@ -1365,7 +1365,7 @@ public:
virtual SLANG_NO_THROW Result SLANG_MCALL createTextureResource(
IResource::Usage initialUsage,
const ITextureResource::Desc& desc,
- const ITextureResource::Data* initData,
+ const ITextureResource::SubresourceData* initData,
ITextureResource** outResource) override
{
RefPtr<TextureCUDAResource> tex = new TextureCUDAResource(desc);
@@ -1611,7 +1611,7 @@ public:
{
for (Index j = 0; j < faceCount; j++)
{
- const auto srcData = initData->subResources[mipLevel + j * desc.numMipLevels];
+ const auto srcData = initData[mipLevel + j * desc.numMipLevels].data;
// Copy over to the workspace to make contiguous
::memcpy(
workspace.begin() + faceSizeInBytes * j, srcData,
@@ -1633,7 +1633,7 @@ public:
for (Index j = 0; j < 6; j++)
{
const auto srcData =
- initData->subResources[mipLevel + j * desc.numMipLevels];
+ initData[mipLevel + j * desc.numMipLevels].data;
::memcpy(
workspace.getBuffer() + faceSizeInBytes * j, srcData,
faceSizeInBytes);
@@ -1643,7 +1643,7 @@ public:
}
else
{
- const auto srcData = initData->subResources[mipLevel];
+ const auto srcData = initData[mipLevel].data;
srcDataPtr = srcData;
}
}
diff --git a/tools/gfx/d3d11/render-d3d11.cpp b/tools/gfx/d3d11/render-d3d11.cpp
index b41169df2..1310e99ae 100644
--- a/tools/gfx/d3d11/render-d3d11.cpp
+++ b/tools/gfx/d3d11/render-d3d11.cpp
@@ -78,7 +78,7 @@ public:
virtual SLANG_NO_THROW Result SLANG_MCALL createTextureResource(
IResource::Usage initialUsage,
const ITextureResource::Desc& desc,
- const ITextureResource::Data* initData,
+ const ITextureResource::SubresourceData* initData,
ITextureResource** outResource) override;
virtual SLANG_NO_THROW Result SLANG_MCALL createBufferResource(
IResource::Usage initialUsage,
@@ -1057,18 +1057,13 @@ static int _calcResourceAccessFlags(int accessFlags)
}
}
-Result D3D11Device::createTextureResource(IResource::Usage initialUsage, const ITextureResource::Desc& descIn, const ITextureResource::Data* initData, ITextureResource** outResource)
+Result D3D11Device::createTextureResource(IResource::Usage initialUsage, const ITextureResource::Desc& descIn, const ITextureResource::SubresourceData* initData, ITextureResource** outResource)
{
TextureResource::Desc srcDesc(descIn);
srcDesc.setDefaults(initialUsage);
const int effectiveArraySize = srcDesc.calcEffectiveArraySize();
- if(initData)
- {
- assert(initData->numSubResources == srcDesc.numMipLevels * effectiveArraySize * srcDesc.size.depth);
- }
-
const DXGI_FORMAT format = D3DUtil::getMapFormat(srcDesc.format);
if (format == DXGI_FORMAT_UNKNOWN)
{
@@ -1092,11 +1087,11 @@ Result D3D11Device::createTextureResource(IResource::Usage initialUsage, const I
const int mipHeight = ITextureResource::Size::calcMipSize(srcDesc.size.height, j);
D3D11_SUBRESOURCE_DATA& data = subRes[subResourceIndex];
+ auto& srcData = initData[subResourceIndex];
- data.pSysMem = initData->subResources[subResourceIndex];
-
- data.SysMemPitch = UINT(initData->mipRowStrides[j]);
- data.SysMemSlicePitch = UINT(initData->mipRowStrides[j] * mipHeight);
+ data.pSysMem = srcData.data;
+ data.SysMemPitch = UINT(srcData.strideY);
+ data.SysMemSlicePitch = UINT(srcData.strideZ);
subResourceIndex++;
}
diff --git a/tools/gfx/d3d12/render-d3d12.cpp b/tools/gfx/d3d12/render-d3d12.cpp
index f39baf4cc..3225ed208 100644
--- a/tools/gfx/d3d12/render-d3d12.cpp
+++ b/tools/gfx/d3d12/render-d3d12.cpp
@@ -81,7 +81,7 @@ public:
virtual SLANG_NO_THROW Result SLANG_MCALL createTextureResource(
IResource::Usage initialUsage,
const ITextureResource::Desc& desc,
- const ITextureResource::Data* initData,
+ const ITextureResource::SubresourceData* initData,
ITextureResource** outResource) override;
virtual SLANG_NO_THROW Result SLANG_MCALL createBufferResource(
IResource::Usage initialUsage,
@@ -2402,7 +2402,7 @@ static D3D12_RESOURCE_DIMENSION _calcResourceDimension(IResource::Type type)
}
}
-Result D3D12Device::createTextureResource(IResource::Usage initialUsage, const ITextureResource::Desc& descIn, const ITextureResource::Data* initData, ITextureResource** outResource)
+Result D3D12Device::createTextureResource(IResource::Usage initialUsage, const ITextureResource::Desc& descIn, const ITextureResource::SubresourceData* initData, ITextureResource** outResource)
{
// Description of uploading on Dx12
// https://msdn.microsoft.com/en-us/library/windows/desktop/dn899215%28v=vs.85%29.aspx
@@ -2550,6 +2550,8 @@ Result D3D12Device::createTextureResource(IResource::Usage initialUsage, const I
for (int j = 0; j < numMipMaps; ++j)
{
+ auto srcSubresource = initData[j];
+
const D3D12_PLACED_SUBRESOURCE_FOOTPRINT& layout = layouts[j];
const D3D12_SUBRESOURCE_FOOTPRINT& footprint = layout.Footprint;
@@ -2557,25 +2559,34 @@ Result D3D12Device::createTextureResource(IResource::Usage initialUsage, const I
assert(footprint.Width == mipSize.width && footprint.Height == mipSize.height && footprint.Depth == mipSize.depth);
- const ptrdiff_t dstMipRowPitch = ptrdiff_t(layouts[j].Footprint.RowPitch);
- const ptrdiff_t srcMipRowPitch = ptrdiff_t(initData->mipRowStrides[j]);
+ auto mipRowSize = mipRowSizeInBytes[j];
- assert(dstMipRowPitch >= srcMipRowPitch);
+ const ptrdiff_t dstMipRowPitch = ptrdiff_t(footprint.RowPitch);
+ const ptrdiff_t srcMipRowPitch = ptrdiff_t(srcSubresource.strideY);
- const uint8_t* srcRow = (const uint8_t*)initData->subResources[subResourceIndex];
- uint8_t* dstRow = p + layouts[j].Offset;
+ const ptrdiff_t dstMipLayerPitch = ptrdiff_t(footprint.RowPitch*footprint.Height);
+ const ptrdiff_t srcMipLayerPitch = ptrdiff_t(srcSubresource.strideZ);
- // Copy the depth each mip
+ // Our outer loop will copy the depth layers one at a time.
+ //
+ const uint8_t* srcLayer = (const uint8_t*) srcSubresource.data;
+ uint8_t* dstLayer = p + layouts[j].Offset;
for (int l = 0; l < mipSize.depth; l++)
{
- // Copy rows
+ // Our inner loop will copy the rows one at a time.
+ //
+ const uint8_t* srcRow = srcLayer;
+ uint8_t* dstRow = dstLayer;
for (int k = 0; k < mipSize.height; ++k)
{
- ::memcpy(dstRow, srcRow, srcMipRowPitch);
+ ::memcpy(dstRow, srcRow, mipRowSize);
srcRow += srcMipRowPitch;
dstRow += dstMipRowPitch;
}
+
+ srcLayer += srcMipLayerPitch;
+ dstLayer += dstMipLayerPitch;
}
//assert(srcRow == (const uint8_t*)(srcMip.getBuffer() + srcMip.getCount()));
diff --git a/tools/gfx/open-gl/render-gl.cpp b/tools/gfx/open-gl/render-gl.cpp
index cd17aee78..2f2071a42 100644
--- a/tools/gfx/open-gl/render-gl.cpp
+++ b/tools/gfx/open-gl/render-gl.cpp
@@ -106,7 +106,7 @@ public:
virtual SLANG_NO_THROW Result SLANG_MCALL createTextureResource(
IResource::Usage initialUsage,
const ITextureResource::Desc& desc,
- const ITextureResource::Data* initData,
+ const ITextureResource::SubresourceData* initData,
ITextureResource** outResource) override;
virtual SLANG_NO_THROW Result SLANG_MCALL createBufferResource(
IResource::Usage initialUsage,
@@ -1450,7 +1450,7 @@ SLANG_NO_THROW Result SLANG_MCALL GLDevice::readTextureResource(
SLANG_NO_THROW Result SLANG_MCALL GLDevice::createTextureResource(
IResource::Usage initialUsage,
const ITextureResource::Desc& descIn,
- const ITextureResource::Data* initData,
+ const ITextureResource::SubresourceData* initData,
ITextureResource** outResource)
{
TextureResource::Desc srcDesc(descIn);
@@ -1479,6 +1479,10 @@ SLANG_NO_THROW Result SLANG_MCALL GLDevice::createTextureResource(
// Set on texture so will be freed if failure
texture->m_handle = handle;
+ // TODO: The logic below seems to be ignoring the row/layer stride of
+ // the subresources that have been passed in, despite OpenGL having
+ // the ability to set the image unpack stride, etc.
+
switch (srcDesc.type)
{
case IResource::Type::Texture1D:
@@ -1493,6 +1497,7 @@ SLANG_NO_THROW Result SLANG_MCALL GLDevice::createTextureResource(
{
for (int j = 0; j < srcDesc.numMipLevels; j++)
{
+ // TODO: Double-check this logic - we are passing in `i` as the height?
glTexImage2D(
target,
j,
@@ -1502,7 +1507,7 @@ SLANG_NO_THROW Result SLANG_MCALL GLDevice::createTextureResource(
0,
format,
formatType,
- initData ? initData->subResources[slice++] : nullptr);
+ initData ? initData[slice++].data : nullptr);
}
}
}
@@ -1520,7 +1525,7 @@ SLANG_NO_THROW Result SLANG_MCALL GLDevice::createTextureResource(
0,
format,
formatType,
- initData ? initData->subResources[i] : nullptr);
+ initData ? initData[i].data : nullptr);
}
}
break;
@@ -1556,7 +1561,7 @@ SLANG_NO_THROW Result SLANG_MCALL GLDevice::createTextureResource(
0,
format,
formatType,
- initData ? initData->subResources[slice++] : nullptr);
+ initData ? initData[slice++].data : nullptr);
}
}
}
@@ -1581,7 +1586,7 @@ SLANG_NO_THROW Result SLANG_MCALL GLDevice::createTextureResource(
0,
format,
formatType,
- initData ? initData->subResources[slice++] : nullptr);
+ initData ? initData[slice++].data : nullptr);
}
}
}
@@ -1600,7 +1605,7 @@ SLANG_NO_THROW Result SLANG_MCALL GLDevice::createTextureResource(
0,
format,
formatType,
- initData ? initData->subResources[i] : nullptr);
+ initData ? initData[i].data : nullptr);
}
}
}
@@ -1622,7 +1627,7 @@ SLANG_NO_THROW Result SLANG_MCALL GLDevice::createTextureResource(
0,
format,
formatType,
- initData ? initData->subResources[i] : nullptr);
+ initData ? initData[i].data : nullptr);
}
break;
}
diff --git a/tools/gfx/vulkan/render-vk.cpp b/tools/gfx/vulkan/render-vk.cpp
index ee494d4c8..1c263d505 100644
--- a/tools/gfx/vulkan/render-vk.cpp
+++ b/tools/gfx/vulkan/render-vk.cpp
@@ -65,7 +65,7 @@ public:
virtual SLANG_NO_THROW Result SLANG_MCALL createTextureResource(
IResource::Usage initialUsage,
const ITextureResource::Desc& desc,
- const ITextureResource::Data* initData,
+ const ITextureResource::SubresourceData* initData,
ITextureResource** outResource) override;
virtual SLANG_NO_THROW Result SLANG_MCALL createBufferResource(
IResource::Usage initialUsage,
@@ -3011,7 +3011,7 @@ size_t calcNumRows(Format format, int height)
return (size_t)height;
}
-Result VKDevice::createTextureResource(IResource::Usage initialUsage, const ITextureResource::Desc& descIn, const ITextureResource::Data* initData, ITextureResource** outResource)
+Result VKDevice::createTextureResource(IResource::Usage initialUsage, const ITextureResource::Desc& descIn, const ITextureResource::SubresourceData* initData, ITextureResource** outResource)
{
TextureResource::Desc desc(descIn);
desc.setDefaults(initialUsage);
@@ -3113,7 +3113,6 @@ Result VKDevice::createTextureResource(IResource::Usage initialUsage, const ITex
VkCommandBuffer commandBuffer = m_deviceQueue.getCommandBuffer();
const int numMipMaps = desc.numMipLevels;
- assert(initData->numMips == numMipMaps);
// Calculate how large the buffer has to be
size_t bufferSize = 0;
@@ -3140,35 +3139,49 @@ Result VKDevice::createTextureResource(IResource::Usage initialUsage, const ITex
// Copy into upload buffer
{
- int subResourceIndex = 0;
+ int subResourceCounter = 0;
uint8_t* dstData;
m_api.vkMapMemory(m_device, uploadBuffer.m_memory, 0, bufferSize, 0, (void**)&dstData);
+ size_t dstSubresourceOffset = 0;
for (int i = 0; i < arraySize; ++i)
{
for (Index j = 0; j < mipSizes.getCount(); ++j)
{
const auto& mipSize = mipSizes[j];
- const ptrdiff_t srcRowStride = initData->mipRowStrides[j];
+ int subResourceIndex = subResourceCounter++;
+ auto initSubresource = initData[subResourceIndex];
+
+ const ptrdiff_t srcRowStride = initSubresource.strideY;
+ const ptrdiff_t srcLayerStride = initSubresource.strideZ;
+
auto dstRowSizeInBytes = calcRowSize(desc.format, mipSize.width);
auto numRows = calcNumRows(desc.format, mipSize.height);
+ auto dstLayerSizeInBytes = dstRowSizeInBytes * numRows;
+
+ const uint8_t* srcLayer = (const uint8_t*) initSubresource.data;
+ uint8_t* dstLayer = dstData + dstSubresourceOffset;
for (int k = 0; k < mipSize.depth; k++)
{
- const uint8_t* srcData = (const uint8_t*)(initData->subResources[subResourceIndex]);
+ const uint8_t* srcRow = srcLayer;
+ uint8_t* dstRow = dstLayer;
for (uint32_t l = 0; l < numRows; l++)
{
- ::memcpy(dstData, srcData, dstRowSizeInBytes);
+ ::memcpy(dstRow, srcRow, dstRowSizeInBytes);
- dstData += dstRowSizeInBytes;
- srcData += srcRowStride;
+ dstRow += dstRowSizeInBytes;
+ srcRow += srcRowStride;
}
- subResourceIndex++;
+ dstLayer += dstLayerSizeInBytes;
+ srcLayer += srcLayerStride;
}
+
+ dstSubresourceOffset += dstLayerSizeInBytes * mipSize.depth;
}
}