-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy patharray_texture.h
111 lines (93 loc) · 2.61 KB
/
array_texture.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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/*
* Copyright (C) 2015-2018, Nils Moehrle
* All rights reserved.
*
* This software may be modified and distributed under the terms
* of the BSD 3-Clause license. See the LICENSE.txt file for details.
*/
#ifndef CACC_ARRAYTEXTURE_HEADER
#define CACC_ARRAYTEXTURE_HEADER
#include "defines.h"
#include "graphics_resource.h"
#include <cuda_runtime_api.h>
CACC_NAMESPACE_BEGIN
template<typename T>
class ArrayTexture {
public:
class YAccessor {
private:
cudaTextureObject_t tex;
int x;
public:
__device__ __forceinline__
YAccessor(cudaTextureObject_t tex, int x) : tex(tex), x(x) {}
__device__ __forceinline__
T operator[](int y) const {
return tex2D<T>(tex, x, y);
}
};
class Accessor {
private:
cudaTextureObject_t tex;
public:
Accessor(cudaTextureObject_t tex) : tex(tex) {}
__device__ __forceinline__
YAccessor operator[](int x) const {
return YAccessor(tex, x);
}
};
private:
cudaTextureObject_t tex;
protected:
void initialize(cudaArray_t array);
ArrayTexture() {}
public:
ArrayTexture(cudaArray_t array);
~ArrayTexture();
Accessor accessor() { return Accessor(tex); };
};
template<typename T>
class MappedArrayTexture : public ArrayTexture<T> {
private:
cudaGraphicsResource_t &res;
cudaStream_t stream;
public:
MappedArrayTexture(GraphicsResource *resource,
cudaStream_t = cudaStreamLegacy);
~MappedArrayTexture();
};
template<typename T>
MappedArrayTexture<T>::MappedArrayTexture(GraphicsResource *resource,
cudaStream_t stream) : res(resource->ptr()), stream(stream)
{
CHECK(cudaGraphicsMapResources(1, &res, stream));
cudaArray_t array;
CHECK(cudaGraphicsSubResourceGetMappedArray(&array, res, 0, 0));
this->initialize(array);
}
template<typename T>
ArrayTexture<T>::ArrayTexture(cudaArray *array) {
initialize(array);
}
template<typename T>
ArrayTexture<T>::~ArrayTexture() {
CHECK(cudaDestroyTextureObject(tex));
}
template<typename T>
MappedArrayTexture<T>::~MappedArrayTexture() {
CHECK(cudaGraphicsUnmapResources(1, &res, stream));
}
template<typename T>
void
ArrayTexture<T>::initialize(cudaArray *array) {
cudaResourceDesc resDesc;
memset(&resDesc, 0, sizeof(resDesc));
resDesc.resType = cudaResourceTypeArray;
resDesc.res.array.array = array;
cudaTextureDesc texDesc;
memset(&texDesc, 0, sizeof(texDesc));
texDesc.readMode = cudaReadModeElementType;
CHECK(cudaCreateTextureObject(&tex, &resDesc, &texDesc, NULL));
}
CACC_NAMESPACE_END
#endif /* CACC_ARRAYTEXTURE_HEADER */