Skip to content

Commit 9fbb8c1

Browse files
committed
createVertexBuffer in api-agnostic device
1 parent 167d8bf commit 9fbb8c1

7 files changed

Lines changed: 39 additions & 43 deletions

File tree

include/API/Device.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "API/Capabilities.h"
2020
#include "API/CommandBuffer.h"
2121
#include "API/Texture.h"
22+
#include "API/VertexBuffer.h"
2223
#include "Support/Pipeline.h"
2324
#include "llvm/ADT/StringRef.h"
2425
#include "llvm/ADT/iterator_range.h"
@@ -118,6 +119,10 @@ createRenderTargetFromCPUBuffer(Device &Dev, const CPUBuffer &Buf);
118119
llvm::Expected<std::shared_ptr<Texture>>
119120
createDefaultDepthStencilTarget(Device &Dev, uint32_t Width, uint32_t Height);
120121

122+
// Creates a VertexBuffer from a ParsedVertexBuffer.
123+
llvm::Expected<VertexBuffer>
124+
createVertexBuffer(Device &Dev, const ParsedVertexBuffer &PVB);
125+
121126
} // namespace offloadtest
122127

123128
#endif // OFFLOADTEST_API_DEVICE_H

include/API/VertexBuffer.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ struct VertexStream {
3232
struct VertexBufferDesc {
3333
llvm::SmallVector<VertexStream> Streams;
3434

35-
// Returns the stride in bytes (sum of all stream format sizes).
3635
uint32_t getStride() const {
3736
uint32_t Stride = 0;
3837
for (const auto &S : Streams)

include/Support/Pipeline.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -351,7 +351,7 @@ struct RuntimeSettings {
351351
struct VertexStreamData {
352352
std::string Name; // Semantic name (e.g. POSITION, COLOR).
353353
Format Fmt;
354-
llvm::SmallVector<double> Values; // One value per component.
354+
llvm::SmallVector<double> Values;
355355
};
356356

357357
// Parsed vertex buffer from the YAML VertexBuffers section. The parser

lib/API/DX/Device.cpp

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1613,19 +1613,10 @@ class DXDevice : public offloadtest::Device {
16131613
"No vertex buffer bound for graphics pipeline.");
16141614

16151615
const ParsedVertexBuffer &PVB = *P.Bindings.VertexBufferPtr;
1616-
1617-
BufferCreateDesc BufDesc = {};
1618-
BufDesc.Location = MemoryLocation::CpuToGpu;
1619-
BufDesc.Usage = BufferUsage::VertexBuffer;
1620-
auto BufOrErr = createBuffer("VertexBuffer", BufDesc, PVB.InterleavedSize);
1621-
if (!BufOrErr)
1622-
return BufOrErr.takeError();
1623-
1624-
VertexBufferDesc VBDesc;
1625-
for (const auto &S : PVB.Streams)
1626-
VBDesc.Streams.push_back({S.Name, S.Fmt});
1627-
1628-
IS.VB = offloadtest::VertexBuffer{VBDesc, *BufOrErr};
1616+
auto VBOrErr = offloadtest::createVertexBuffer(*this, PVB);
1617+
if (!VBOrErr)
1618+
return VBOrErr.takeError();
1619+
IS.VB = std::move(*VBOrErr);
16291620

16301621
// TODO: Currently uses a single CpuToGpu mapped buffer. For optimal GPU
16311622
// performance on discrete GPUs, use a staging buffer + copy to a GpuOnly

lib/API/Device.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
#include "API/Device.h"
1313
#include "API/FormatConversion.h"
14+
#include "API/VertexBuffer.h"
1415

1516
#include "Config.h"
1617

@@ -79,6 +80,26 @@ offloadtest::createRenderTargetFromCPUBuffer(Device &Dev,
7980
return Dev.createTexture("RenderTarget", Desc);
8081
}
8182

83+
llvm::Expected<VertexBuffer>
84+
offloadtest::createVertexBuffer(Device &Dev, const ParsedVertexBuffer &PVB) {
85+
BufferCreateDesc BufDesc = {};
86+
BufDesc.Location = MemoryLocation::CpuToGpu;
87+
BufDesc.Usage = BufferUsage::VertexBuffer;
88+
auto BufOrErr =
89+
Dev.createBuffer("VertexBuffer", BufDesc, PVB.InterleavedSize);
90+
if (!BufOrErr)
91+
return BufOrErr.takeError();
92+
93+
VertexBufferDesc VBDesc;
94+
for (const auto &S : PVB.Streams)
95+
VBDesc.Streams.push_back({S.Name, S.Fmt});
96+
97+
// TODO: Generalize VB data copy so that we can deduplicate that from each
98+
// backend.
99+
100+
return VertexBuffer{VBDesc, *BufOrErr};
101+
}
102+
82103
llvm::Expected<std::shared_ptr<Texture>>
83104
offloadtest::createDefaultDepthStencilTarget(Device &Dev, uint32_t Width,
84105
uint32_t Height) {

lib/API/MTL/MTLDevice.cpp

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -448,20 +448,10 @@ class MTLDevice : public offloadtest::Device {
448448
"No vertex buffer specified for graphics pipeline.");
449449

450450
const ParsedVertexBuffer &PVB = *P.Bindings.VertexBufferPtr;
451-
452-
BufferCreateDesc BufDesc = {};
453-
BufDesc.Location = MemoryLocation::CpuToGpu;
454-
BufDesc.Usage = BufferUsage::VertexBuffer;
455-
auto BufOrErr =
456-
createBuffer("VertexBuffer", BufDesc, PVB.InterleavedSize);
457-
if (!BufOrErr)
458-
return BufOrErr.takeError();
459-
460-
VertexBufferDesc VBDesc;
461-
for (const auto &S : PVB.Streams)
462-
VBDesc.Streams.push_back({S.Name, S.Fmt});
463-
464-
IS.VB = offloadtest::VertexBuffer{VBDesc, *BufOrErr};
451+
auto VBOrErr = offloadtest::createVertexBuffer(*this, PVB);
452+
if (!VBOrErr)
453+
return VBOrErr.takeError();
454+
IS.VB = std::move(*VBOrErr);
465455

466456
// TODO: Currently uses a single CpuToGpu mapped buffer. On discrete GPUs
467457
// (DX/VK), consider using a staging buffer + copy to a GpuOnly vertex

lib/API/VK/Device.cpp

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1283,20 +1283,10 @@ class VulkanDevice : public offloadtest::Device {
12831283
"No vertex buffer specified for graphics pipeline.");
12841284

12851285
const ParsedVertexBuffer &PVB = *P.Bindings.VertexBufferPtr;
1286-
1287-
BufferCreateDesc VBBufDesc = {};
1288-
VBBufDesc.Location = MemoryLocation::CpuToGpu;
1289-
VBBufDesc.Usage = BufferUsage::VertexBuffer;
1290-
auto BufOrErr =
1291-
createBuffer("VertexBuffer", VBBufDesc, PVB.InterleavedSize);
1292-
if (!BufOrErr)
1293-
return BufOrErr.takeError();
1294-
1295-
VertexBufferDesc VBDesc;
1296-
for (const auto &S : PVB.Streams)
1297-
VBDesc.Streams.push_back({S.Name, S.Fmt});
1298-
1299-
IS.VB = offloadtest::VertexBuffer{VBDesc, *BufOrErr};
1286+
auto VBOrErr = offloadtest::createVertexBuffer(*this, PVB);
1287+
if (!VBOrErr)
1288+
return VBOrErr.takeError();
1289+
IS.VB = std::move(*VBOrErr);
13001290

13011291
// TODO: Currently uses a single CpuToGpu mapped buffer. For optimal GPU
13021292
// performance on discrete GPUs, use a staging buffer + copy to a GpuOnly

0 commit comments

Comments
 (0)