diff options
| -rw-r--r-- | slang-gfx.h | 79 | ||||
| -rw-r--r-- | tools/gfx/cuda/render-cuda.cpp | 8 | ||||
| -rw-r--r-- | tools/gfx/d3d11/render-d3d11.cpp | 17 | ||||
| -rw-r--r-- | tools/gfx/d3d12/render-d3d12.cpp | 31 | ||||
| -rw-r--r-- | tools/gfx/open-gl/render-gl.cpp | 21 | ||||
| -rw-r--r-- | tools/gfx/vulkan/render-vk.cpp | 33 | ||||
| -rw-r--r-- | tools/platform/gui.cpp | 11 | ||||
| -rw-r--r-- | tools/platform/model.cpp | 30 | ||||
| -rw-r--r-- | tools/render-test/shader-renderer-util.cpp | 44 |
9 files changed, 164 insertions, 110 deletions
diff --git a/slang-gfx.h b/slang-gfx.h index 7e486734a..cb4fcf984 100644 --- a/slang-gfx.h +++ b/slang-gfx.h @@ -519,14 +519,9 @@ public: { case IResource::Type::Texture1D: case IResource::Type::Texture2D: - { - return numMipMaps * arrSize; - } case IResource::Type::Texture3D: { - // can't have arrays of 3d textures - assert(this->arraySize <= 1); - return numMipMaps * this->size.depth; + return numMipMaps * arrSize; } case IResource::Type::TextureCube: { @@ -616,16 +611,49 @@ public: Usage initialUsage; }; - /// The ordering of the subResources is - /// forall (effectiveArraySize) - /// forall (mip levels) - /// forall (depth levels) - struct Data - { - ptrdiff_t* mipRowStrides; ///< The row stride for a mip map - int numMips; ///< The number of mip maps - const void*const* subResources; ///< Pointers to each full mip subResource - int numSubResources; ///< The total amount of subResources. Typically = numMips * depth * arraySize + /// Data for a single subresource of a texture. + /// + /// Each subresource is a tensor with `1 <= rank <= 3`, + /// where the rank is deterined by the base shape of the + /// texture (Buffer, 1D, 2D, 3D, or Cube). For the common + /// case of a 2D texture, `rank == 2` and each subresource + /// is a 2D image. + /// + /// Subresource tensors must be stored in a row-major layout, + /// so that the X axis strides over texels, the Y axis strides + /// over 1D rows of texels, and the Z axis strides over 2D + /// "layers" of texels. + /// + /// For a texture with multiple mip levels or array elements, + /// each mip level and array element is stores as a distinct + /// subresource. When indexing into an array of subresources, + /// the index of a subresoruce for mip level `m` and array + /// index `a` is `m + a*mipLevelCount`. + /// + struct SubresourceData + { + /// Pointer to texel data for the subresource tensor. + void const* data; + + /// Stride in bytes between rows of the subresource tensor. + /// + /// This is the number of bytes to add to a pointer to a texel + /// at (X,Y,Z) to get to a texel at (X,Y+1,Z). + /// + /// Devices may not support all possible values for `strideY`. + /// In particular, they may only support strictly positive strides. + /// + int64_t strideY; + + /// Stride in bytes between layers of the subresource tensor. + /// + /// This is the number of bytes to add to a pointer to a texel + /// at (X,Y,Z) to get to a texel at (X,Y,Z+1). + /// + /// Devices may not support all possible values for `strideZ`. + /// In particular, they may only support strictly positive strides. + /// + int64_t strideZ; }; virtual SLANG_NO_THROW Desc* SLANG_MCALL getDesc() = 0; @@ -1512,18 +1540,31 @@ public: getSlangSession(result.writeRef()); return result; } - /// Create a texture resource. initData holds the initialize data to set the contents of the texture when constructed. + /// Create a texture resource. + /// + /// If `initData` is non-null, then it must point to an array of + /// `ITextureResource::SubresourceData` with one element for each + /// subresource of the texture being created. + /// + /// The number of subresources in a texture is: + /// + /// effectiveElementCount * mipLevelCount + /// + /// where the effective element count is computed as: + /// + /// effectiveElementCount = (isArray ? arrayElementCount : 1) * (isCube ? 6 : 1); + /// 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) = 0; /// Create a texture resource. initData holds the initialize data to set the contents of the texture when constructed. inline SLANG_NO_THROW ComPtr<ITextureResource> createTextureResource( IResource::Usage initialUsage, const ITextureResource::Desc& desc, - const ITextureResource::Data* initData = nullptr) + const ITextureResource::SubresourceData* initData = nullptr) { ComPtr<ITextureResource> resource; SLANG_RETURN_NULL_ON_FAIL(createTextureResource(initialUsage, desc, initData, resource.writeRef())); 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; } } diff --git a/tools/platform/gui.cpp b/tools/platform/gui.cpp index f2f9561d5..8e455cd12 100644 --- a/tools/platform/gui.cpp +++ b/tools/platform/gui.cpp @@ -217,14 +217,9 @@ GUI::GUI( desc.init2D(IResource::Type::Texture2D, Format::RGBA_Unorm_UInt8, width, height, 1); desc.setDefaults(IResource::Usage::PixelShaderResource); - - ptrdiff_t mipRowStrides[] = { ptrdiff_t(width * 4 * sizeof(unsigned char)) }; - void* subResourceData[] = { pixels }; - ITextureResource::Data initData; - initData.mipRowStrides = mipRowStrides; - initData.numMips = 1; - initData.numSubResources = 1; - initData.subResources = subResourceData; + ITextureResource::SubresourceData initData = {}; + initData.data = pixels; + initData.strideY = width * 4 * sizeof(unsigned char); auto texture = device->createTextureResource(IResource::Usage::PixelShaderResource, desc, &initData); diff --git a/tools/platform/model.cpp b/tools/platform/model.cpp index 287f80958..54c171e54 100644 --- a/tools/platform/model.cpp +++ b/tools/platform/model.cpp @@ -128,13 +128,16 @@ ComPtr<ITextureResource> loadTextureImage( // results when loading the image with stb_image. } - std::vector<void*> subresourceInitData; - std::vector<ptrdiff_t> mipRowStrides; + std::vector<ITextureResource::SubresourceData> subresourceInitData; ptrdiff_t stride = extentX * channelCount * sizeof(stbi_uc); - subresourceInitData.push_back(data); - mipRowStrides.push_back(stride); + ITextureResource::SubresourceData baseInitData; + baseInitData.data = data; + baseInitData.strideY = stride; + baseInitData.strideZ = 0; + + subresourceInitData.push_back(baseInitData); // create down-sampled images for the different mip levels bool generateMips = true; @@ -166,8 +169,13 @@ ComPtr<ITextureResource> loadTextureImage( STBIR_ALPHA_CHANNEL_NONE, STBIR_FLAG_ALPHA_PREMULTIPLIED); - subresourceInitData.push_back(newData); - mipRowStrides.push_back(newStride); + + ITextureResource::SubresourceData mipInitData; + mipInitData.data = newData; + mipInitData.strideY = newStride; + mipInitData.strideZ = 0; + + subresourceInitData.push_back(mipInitData); prevExtentX = newExtentX; prevExtentY = newExtentY; @@ -176,19 +184,13 @@ ComPtr<ITextureResource> loadTextureImage( } } - int mipCount = (int) mipRowStrides.size(); + int mipCount = (int) subresourceInitData.size(); ITextureResource::Desc desc; desc.init2D(IResource::Type::Texture2D, format, extentX, extentY, mipCount); - ITextureResource::Data initData; - initData.numSubResources = mipCount; - initData.numMips = mipCount; - initData.subResources = &subresourceInitData[0]; - initData.mipRowStrides = &mipRowStrides[0]; - auto texture = - device->createTextureResource(IResource::Usage::PixelShaderResource, desc, &initData); + device->createTextureResource(IResource::Usage::PixelShaderResource, desc, subresourceInitData.data()); free(data); diff --git a/tools/render-test/shader-renderer-util.cpp b/tools/render-test/shader-renderer-util.cpp index 57187fc44..903164567 100644 --- a/tools/render-test/shader-renderer-util.cpp +++ b/tools/render-test/shader-renderer-util.cpp @@ -87,38 +87,30 @@ void BindingStateImpl::apply(ICommandEncoder* encoder, PipelineType pipelineType const int numSubResources = textureResourceDesc.calcNumSubResources(); IResource::Usage initialUsage = IResource::Usage::GenericRead; - ITextureResource::Data initData; - List<ptrdiff_t> mipRowStrides; - mipRowStrides.setCount(textureResourceDesc.numMipLevels); - List<const void*> subResources; - subResources.setCount(numSubResources); - - // Set up the src row strides - for (int i = 0; i < textureResourceDesc.numMipLevels; i++) - { - const int mipWidth = ITextureResource::Size::calcMipSize(textureResourceDesc.size.width, i); - mipRowStrides[i] = mipWidth * sizeof(uint32_t); - } - - // Set up pointers the the data + List<ITextureResource::SubresourceData> initSubresources; + int subResourceCounter = 0; + for( int a = 0; a < effectiveArraySize; ++a ) { - int subResourceIndex = 0; - const int numGen = int(texData.dataBuffer.getCount()); - for (int i = 0; i < numSubResources; i++) + for( int m = 0; m < textureResourceDesc.numMipLevels; ++m ) { - subResources[i] = texData.dataBuffer[subResourceIndex].getBuffer(); - // Wrap around - subResourceIndex = (subResourceIndex + 1 >= numGen) ? 0 : (subResourceIndex + 1); + int subResourceIndex = subResourceCounter++; + const int mipWidth = ITextureResource::Size::calcMipSize(textureResourceDesc.size.width, m); + const int mipHeight = ITextureResource::Size::calcMipSize(textureResourceDesc.size.width, m); + + auto strideY = mipWidth * sizeof(uint32_t); + auto strideZ = mipHeight * strideY; + + ITextureResource::SubresourceData subresourceData; + subresourceData.data = texData.dataBuffer[subResourceIndex].getBuffer(); + subresourceData.strideY = strideY; + subresourceData.strideZ = strideZ; + + initSubresources.add(subresourceData); } } - initData.mipRowStrides = mipRowStrides.getBuffer(); - initData.numMips = textureResourceDesc.numMipLevels; - initData.numSubResources = numSubResources; - initData.subResources = subResources.getBuffer(); - - textureOut = device->createTextureResource(IResource::Usage::GenericRead, textureResourceDesc, &initData); + textureOut = device->createTextureResource(IResource::Usage::GenericRead, textureResourceDesc, initSubresources.getBuffer()); return textureOut ? SLANG_OK : SLANG_FAIL; } |
