OWL
Loading...
Searching...
No Matches
Buffer.h
1// ======================================================================== //
2// Copyright 2019-2021 Ingo Wald //
3// //
4// Licensed under the Apache License, Version 2.0 (the "License"); //
5// you may not use this file except in compliance with the License. //
6// You may obtain a copy of the License at //
7// //
8// http://www.apache.org/licenses/LICENSE-2.0 //
9// //
10// Unless required by applicable law or agreed to in writing, software //
11// distributed under the License is distributed on an "AS IS" BASIS, //
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //
13// See the License for the specific language governing permissions and //
14// limitations under the License. //
15// ======================================================================== //
16
17#pragma once
18
19#include "RegisteredObject.h"
20#include "Texture.h"
21
22namespace owl {
23
24 struct Group;
25
27 struct Buffer : public RegisteredObject
28 {
29 typedef std::shared_ptr<Buffer> SP;
30
33 struct DeviceData : public RegisteredObject::DeviceData {
34 typedef std::shared_ptr<DeviceData> SP;
35
37 DeviceData(const DeviceContext::SP &device);
38
41 void *d_pointer { 0 };
42 };
43
46 Buffer(Context *const context, OWLDataType type);
47
49 virtual ~Buffer();
50
52 std::string toString() const override;
53
55 inline Buffer::DeviceData &getDD(const DeviceContext::SP &device) const;
56
58 inline const void *getPointer(const DeviceContext::SP &device) const;
59
61 inline size_t getElementCount() const;
62
65 inline size_t sizeInBytes() const { return elementCount * sizeOf(type); }
66
68 virtual void clear() = 0;
69
71 virtual void resize(size_t newElementCount) = 0;
72
75 virtual void upload(const void *hostPtr, size_t offset, int64_t count) = 0;
76
78 virtual void upload(const int deviceID, const void *hostPtr, size_t offset, int64_t count) = 0;
79
81 RegisteredObject::DeviceData::SP createOn(const DeviceContext::SP &device) override;
82
87 void destroy();
88
90 const OWLDataType type;
91
93 size_t elementCount { 0 };
94 };
95
96
97
103 struct DeviceBuffer : public Buffer {
104 typedef std::shared_ptr<DeviceBuffer> SP;
105
110 typedef std::shared_ptr<DeviceData> SP;
111
114 DeviceData(DeviceBuffer *parent, const DeviceContext::SP &device);
115
117 virtual ~DeviceData();
118
122 virtual void executeResize() = 0;
123
131 virtual void uploadAsync(const void *hostDataPtr, size_t offset, int64_t count) = 0;
132
134 virtual void clear() = 0;
135
136 DeviceBuffer *const parent;
137 };
138
139
145 DeviceDataForTextures(DeviceBuffer *parent, const DeviceContext::SP &device)
146 : DeviceData(parent,device)
147 {}
148 void executeResize() override;
149 void uploadAsync(const void *hostDataPtr, size_t offset, int64_t count) override;
150
152 void clear() override;
153
158 std::vector<Texture::SP> hostHandles;
159 };
160
161
162
167 DeviceDataForBuffers(DeviceBuffer *parent, const DeviceContext::SP &device)
168 : DeviceData(parent,device)
169 {}
170
171 void executeResize() override;
172 void uploadAsync(const void *hostDataPtr, size_t offset, int64_t count) override;
173
175 void clear() override;
176
181 std::vector<Buffer::SP> hostHandles;
182 };
183
184
189 DeviceDataForGroups(DeviceBuffer *parent, const DeviceContext::SP &device)
190 : DeviceData(parent,device)
191 {}
192
193 void executeResize() override;
194 void uploadAsync(const void *hostDataPtr, size_t offset, int64_t count) override;
195
197 void clear() override;
198
203 std::vector<std::shared_ptr<Group>> hostHandles;
204 };
205
206
207
211 DeviceDataForCopyableData(DeviceBuffer *parent, const DeviceContext::SP &device)
212 : DeviceData(parent,device)
213 {}
214 void executeResize() override;
215 void uploadAsync(const void *hostDataPtr, size_t offset, int64_t count) override;
216
218 void clear() override;
219 };
220
222 DeviceBuffer(Context *const context,
223 OWLDataType type);
224
226 std::string toString() const override;
227
229 inline DeviceData &getDD(const DeviceContext::SP &device) const;
230
232 void resize(size_t newElementCount) override;
234 void upload(const void *hostPtr, size_t offset, int64_t count) override;
235
237 void upload(const int deviceID, const void *hostPtr, size_t offset, int64_t count) override;
238
240 void clear() override;
241
243 RegisteredObject::DeviceData::SP createOn(const DeviceContext::SP &device) override;
244 };
245
246
249 struct HostPinnedBuffer : public Buffer {
250 typedef std::shared_ptr<HostPinnedBuffer> SP;
251
252 HostPinnedBuffer(Context *const context,
253 OWLDataType type);
254
256 virtual ~HostPinnedBuffer();
257
259 std::string toString() const override;
260
261 void resize(size_t newElementCount) override;
262 void upload(const void *hostPtr, size_t offset, int64_t count) override;
263 void upload(const int deviceID, const void *hostPtr, size_t offset, int64_t count) override;
264
266 void clear() override;
267
270 void *cudaHostPinnedMem { 0 };
271 };
272
273
274
278 struct ManagedMemoryBuffer : public Buffer {
279 typedef std::shared_ptr<ManagedMemoryBuffer> SP;
280
281 ManagedMemoryBuffer(Context *const context,
282 OWLDataType type);
283
285 virtual ~ManagedMemoryBuffer();
286
287 void resize(size_t newElementCount) override;
288 void upload(const void *hostPtr, size_t offset, int64_t count) override;
289 void upload(const int deviceID, const void *hostPtr, size_t offset, int64_t count) override;
290
292 std::string toString() const override;
293
295 void clear() override;
296
299 void *cudaManagedMem { 0 };
300 };
301
302
305 struct GraphicsBuffer : public Buffer {
306 typedef std::shared_ptr<GraphicsBuffer> SP;
307
308 GraphicsBuffer(Context* const context,
309 OWLDataType type,
310 cudaGraphicsResource_t resource);
311
312 void map(const int deviceID=0, CUstream stream=0);
313 void unmap(const int deviceID=0, CUstream stream=0);
314
315 void resize(size_t newElementCount) override;
316 void upload(const void *hostPtr, size_t offset, int64_t count) override;
317 void upload(const int deviceID, const void *hostPtr, size_t offset, int64_t count) override;
318
320 void clear() override;
321
324 cudaGraphicsResource_t resource;
325
327 std::string toString() const override;
328 };
329
330
331
332 // ------------------------------------------------------------------
333 // implementation section
334 // ------------------------------------------------------------------
335
336
338 inline size_t Buffer::getElementCount() const
339 {
340 return elementCount;
341 }
342
344 const void *Buffer::getPointer(const DeviceContext::SP &device) const
345 {
346 assert(device);
347 return getDD(device).d_pointer;
348 }
349
351 inline Buffer::DeviceData &Buffer::getDD(const DeviceContext::SP &device) const
352 {
353 assert(device && device->ID >= 0 && device->ID < (int)deviceData.size());
354 return deviceData[device->ID]->as<Buffer::DeviceData>();
355 }
356
358 inline DeviceBuffer::DeviceData &DeviceBuffer::getDD(const DeviceContext::SP &device) const
359 {
360 assert(device && device->ID >= 0 && device->ID < (int)deviceData.size());
361 return deviceData[device->ID]->as<DeviceData>();
362 }
363
364} // ::owl
Definition: Buffer.h:33
void * d_pointer
Definition: Buffer.h:41
Definition: Buffer.h:28
virtual void clear()=0
std::string toString() const override
Definition: Buffer.cpp:50
size_t elementCount
Definition: Buffer.h:93
void destroy()
Definition: Buffer.cpp:58
virtual ~Buffer()
Definition: Buffer.cpp:44
size_t sizeInBytes() const
Definition: Buffer.h:65
size_t getElementCount() const
Definition: Buffer.h:338
virtual void upload(const int deviceID, const void *hostPtr, size_t offset, int64_t count)=0
virtual void upload(const void *hostPtr, size_t offset, int64_t count)=0
Buffer::DeviceData & getDD(const DeviceContext::SP &device) const
Definition: Buffer.h:351
const OWLDataType type
Definition: Buffer.h:90
virtual void resize(size_t newElementCount)=0
const void * getPointer(const DeviceContext::SP &device) const
Definition: Buffer.h:344
RegisteredObject::DeviceData::SP createOn(const DeviceContext::SP &device) override
Definition: Buffer.cpp:70
Definition: Context.h:32
std::vector< Buffer::SP > hostHandles
Definition: Buffer.h:181
void clear() override
Definition: Buffer.cpp:194
void uploadAsync(const void *hostDataPtr, size_t offset, int64_t count) override
Definition: Buffer.cpp:212
void executeResize() override
Definition: Buffer.cpp:199
void uploadAsync(const void *hostDataPtr, size_t offset, int64_t count) override
Definition: Buffer.cpp:316
void clear() override
Definition: Buffer.cpp:292
void executeResize() override
Definition: Buffer.cpp:303
void uploadAsync(const void *hostDataPtr, size_t offset, int64_t count) override
Definition: Buffer.cpp:261
void executeResize() override
Definition: Buffer.cpp:251
void clear() override
Definition: Buffer.cpp:245
std::vector< std::shared_ptr< Group > > hostHandles
Definition: Buffer.h:203
std::vector< Texture::SP > hostHandles
Definition: Buffer.h:158
void executeResize() override
Definition: Buffer.cpp:155
void clear() override
Definition: Buffer.cpp:166
void uploadAsync(const void *hostDataPtr, size_t offset, int64_t count) override
Definition: Buffer.cpp:171
Definition: Buffer.h:109
virtual ~DeviceData()
Definition: Buffer.cpp:91
virtual void uploadAsync(const void *hostDataPtr, size_t offset, int64_t count)=0
virtual void executeResize()=0
Definition: Buffer.h:103
void clear() override
Definition: Buffer.cpp:120
DeviceData & getDD(const DeviceContext::SP &device) const
Definition: Buffer.h:358
void upload(const void *hostPtr, size_t offset, int64_t count) override
Definition: Buffer.cpp:127
void resize(size_t newElementCount) override
Definition: Buffer.cpp:148
RegisteredObject::DeviceData::SP createOn(const DeviceContext::SP &device) override
Definition: Buffer.cpp:102
std::string toString() const override
Definition: Buffer.cpp:86
Definition: Buffer.h:305
std::string toString() const override
Definition: Buffer.cpp:494
cudaGraphicsResource_t resource
Definition: Buffer.h:324
void clear() override
Definition: Buffer.cpp:505
void resize(size_t newElementCount) override
Definition: Buffer.cpp:510
void upload(const void *hostPtr, size_t offset, int64_t count) override
Definition: Buffer.cpp:515
Definition: Buffer.h:249
void clear() override
Definition: Buffer.cpp:370
virtual ~HostPinnedBuffer()
Definition: Buffer.cpp:339
void upload(const void *hostPtr, size_t offset, int64_t count) override
Definition: Buffer.cpp:376
void resize(size_t newElementCount) override
Definition: Buffer.cpp:354
std::string toString() const override
Definition: Buffer.cpp:349
void * cudaHostPinnedMem
Definition: Buffer.h:270
Definition: Buffer.h:278
std::string toString() const override
Definition: Buffer.cpp:407
void resize(size_t newElementCount) override
Definition: Buffer.cpp:412
void clear() override
Definition: Buffer.cpp:469
void upload(const void *hostPtr, size_t offset, int64_t count) override
Definition: Buffer.cpp:475
virtual ~ManagedMemoryBuffer()
Definition: Buffer.cpp:398
void * cudaManagedMem
Definition: Buffer.h:299
std::vector< DeviceData::SP > deviceData
Definition: Object.h:86
Definition: RegisteredObject.h:30