@@ -105,6 +105,33 @@ offloadtest::createDefaultDepthStencilTarget(Device &Dev, uint32_t Width,
105105 return Dev.createTexture (" DepthStencil" , Desc);
106106}
107107
108+ // This is a separate function because recursion is not allowed in this code
109+ // base.
110+ static llvm::Expected<std::unique_ptr<offloadtest::Buffer>>
111+ createUploadBufferWithData (Device &Dev, std::string Name, const void *Data,
112+ size_t SizeInBytes) {
113+
114+ // Create Upload buffer
115+ const BufferCreateDesc UploadDesc = BufferCreateDesc::uploadBuffer ();
116+ const std::string UploadBufferName = Name + " (Upload Buffer)" ;
117+
118+ auto UploadBufferOrErr =
119+ Dev.createBuffer (UploadBufferName, UploadDesc, SizeInBytes);
120+ if (!UploadBufferOrErr)
121+ return UploadBufferOrErr.takeError ();
122+ auto UploadBuffer = std::move (*UploadBufferOrErr);
123+
124+ // Copy data over
125+ auto MappedPtrOrErr = UploadBuffer->map ();
126+ if (!MappedPtrOrErr)
127+ return MappedPtrOrErr.takeError ();
128+ void *MappedPtr = *MappedPtrOrErr;
129+ memcpy (MappedPtr, Data, SizeInBytes);
130+ UploadBuffer->unmap ();
131+
132+ return std::move (UploadBuffer);
133+ }
134+
108135llvm::Expected<std::unique_ptr<offloadtest::Buffer>>
109136offloadtest::createBufferWithData (
110137 Device &Dev, std::string Name, const BufferCreateDesc &Desc,
@@ -121,10 +148,8 @@ offloadtest::createBufferWithData(
121148 " An upload buffer is required to create a GpuOnly buffer with data." );
122149
123150 // Create Upload buffer
124- const BufferCreateDesc UploadDesc = BufferCreateDesc::uploadBuffer ();
125- const std::string UploadBufferName = Name + " (Upload Buffer)" ;
126- auto UploadBufferOrErr = createBufferWithData (
127- Dev, UploadBufferName, UploadDesc, Data, SizeInBytes, nullptr , nullptr );
151+ auto UploadBufferOrErr =
152+ createUploadBufferWithData (Dev, Name, Data, SizeInBytes);
128153 if (!UploadBufferOrErr)
129154 return UploadBufferOrErr.takeError ();
130155 *OutUploadBuffer = std::move (*UploadBufferOrErr);
0 commit comments