forked from ingowald/optix7course
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCUDABuffer.h
85 lines (73 loc) · 2.72 KB
/
CUDABuffer.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
// ======================================================================== //
// Copyright 2018-2019 Ingo Wald //
// //
// Licensed under the Apache License, Version 2.0 (the "License"); //
// you may not use this file except in compliance with the License. //
// You may obtain a copy of the License at //
// //
// http://www.apache.org/licenses/LICENSE-2.0 //
// //
// Unless required by applicable law or agreed to in writing, software //
// distributed under the License is distributed on an "AS IS" BASIS, //
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //
// See the License for the specific language governing permissions and //
// limitations under the License. //
// ======================================================================== //
#pragma once
#include "optix7.h"
// common std stuff
#include <vector>
#include <assert.h>
/*! \namespace osc - Optix Siggraph Course */
namespace osc {
/*! simple wrapper for creating, and managing a device-side CUDA
buffer */
struct CUDABuffer {
inline CUdeviceptr d_pointer() const
{ return (CUdeviceptr)d_ptr; }
//! re-size buffer to given number of bytes
void resize(size_t size)
{
if (d_ptr) free();
alloc(size);
}
//! allocate to given number of bytes
void alloc(size_t size)
{
assert(d_ptr == nullptr);
this->sizeInBytes = size;
CUDA_CHECK(Malloc( (void**)&d_ptr, sizeInBytes));
}
//! free allocated memory
void free()
{
CUDA_CHECK(Free(d_ptr));
d_ptr = nullptr;
sizeInBytes = 0;
}
template<typename T>
void alloc_and_upload(const std::vector<T> &vt)
{
alloc(vt.size()*sizeof(T));
upload((const T*)vt.data(),vt.size());
}
template<typename T>
void upload(const T *t, size_t count)
{
assert(d_ptr != nullptr);
assert(sizeInBytes == count*sizeof(T));
CUDA_CHECK(Memcpy(d_ptr, (void *)t,
count*sizeof(T), cudaMemcpyHostToDevice));
}
template<typename T>
void download(T *t, size_t count)
{
assert(d_ptr != nullptr);
assert(sizeInBytes == count*sizeof(T));
CUDA_CHECK(Memcpy((void *)t, d_ptr,
count*sizeof(T), cudaMemcpyDeviceToHost));
}
size_t sizeInBytes { 0 };
void *d_ptr { nullptr };
};
} // ::osc