Kinetic Visualization
 All Classes Functions Variables Pages
CudaTexture.h
1 #pragma once
2 #include "common.hpp"
3 #include "Cuda.h"
4 #include "Texture.h"
5 
6 #include <shrUtils.h>
7 #include <cutil_inline.h>
8 #include <cutil_gl_inline.h>
9 #include <channel_descriptor.h>
10 
11 #include <vector_types.h>
12 #include <vector_functions.h>
13 #include <driver_functions.h>
14 #include <cuda_gl_interop.h>
15 
16 //1 Dimensionale Texturen werden von Cuda aus irgendeinen Grund nicht unterstützt!!!!
17 template <class T, unsigned int N>
18 class CudaTexture : public Cuda
19 {
20 public:
21  enum CudaTextureType
22  {
23  CTT_CUDA,
24  CTT_CUDA_RW,
25  CTT_CUDA_READ_OGL_TEXTURE,
26  CTT_READ_WRITE_CUDA_AND_OGL
27  };
28 
29 public:
34  {
35 
36  };
37 
44  CudaTexture(unsigned int width, unsigned int height, unsigned int depth) : m_type(CTT_CUDA)
45  {
46  res = make_cudaExtent(width, height, depth);
47  Create();
48  };
49 
57  CudaTexture(unsigned int width, unsigned int height, unsigned int depth, bool write) : m_type(CTT_CUDA_RW)
58  {
59  res = make_cudaExtent(width, height, depth);
60  Create();
61  };
62 
67  CudaTexture(Texture::TexturePtr tex) : m_type(CTT_CUDA_READ_OGL_TEXTURE)
68  {
69  m_tex = tex;
70  res.width = tex->m_width;
71  res.height = tex->m_height;
72  res.depth = tex->m_depth;
73 
74  Create();
75  };
76 
82  CudaTexture(Texture::TexturePtr tex, bool write) : m_type(CTT_READ_WRITE_CUDA_AND_OGL)
83  {
84  m_tex = tex;
85  res.width = tex->m_width;
86  if(N > 1) res.height = tex->m_height;
87  if(N > 2) res.depth = tex->m_depth;
88 
89  Create();
90  };
91 
96  {
97  cudaFree( m_device );
98  cudaFreeArray( m_volumeArray );
99  };
100 
104  void Create()
105  {
106  if(m_type == CTT_CUDA_READ_OGL_TEXTURE || m_type == CTT_READ_WRITE_CUDA_AND_OGL)
107  {
108  switch(N)
109  {
110  case 2:
111  cutilSafeCall(cudaGraphicsGLRegisterImage(&cudaRes, m_tex->GetTexName(), GL_TEXTURE_2D, cudaGraphicsMapFlagsReadOnly));
112  cudaGLRegisterBufferObject(m_tex->GetTexName());
113  break;
114  case 3:
115  cutilSafeCall(cudaGraphicsGLRegisterImage(&cudaRes, m_tex->GetTexName(), GL_TEXTURE_3D, cudaGraphicsMapFlagsReadOnly));
116  cudaGLRegisterBufferObject(m_tex->GetTexName());
117  break;
118  }
119  }
120 
121  if(m_type == CTT_CUDA || m_type == CTT_CUDA_RW || m_type == CTT_READ_WRITE_CUDA_AND_OGL)
122  {
123  CreateCuda();
124  }
125  };
126 
130  void Map()
131  {
132  cutilSafeCall(cudaGraphicsMapResources(1, &cudaRes, 0));
133  cutilSafeCall(cudaGraphicsSubResourceGetMappedArray(&m_volumeArray, cudaRes, 0, 0));
134  };
135 
139  void Unmap()
140  {
141  cutilSafeCall(cudaGraphicsUnmapResources(1, &cudaRes, 0));
142  };
143 
147  void Reset()
148  {
149  cutilSafeCall(cudaMemset(m_device,0, sizeof(T) * dim[0] * max(1, dim[1]) * max(1, dim[2])));
150  };
151 
155  cudaArray* GetCudaTexture()
156  {
157  return m_volumeArray;
158  };
159 
164  {
165  return m_device;
166  };
167 
171  cudaExtent GetCudaExtend()
172  {
173  return res;
174  };
175 
176 private:
177  void CreateCuda()
178  {
179  desc = cudaCreateChannelDesc<T>();
180 
181  switch(N)
182  {
183  case 1:
184  std::cout << "Create Array" << std::endl;
185  if(m_type == CTT_CUDA_RW) cutilSafeCall(cudaMalloc((void**)&m_device, sizeof(T)*res.width));
186  cutilSafeCall(cudaMallocArray(&m_volumeArray, &desc, res.width,1));
187  break;
188  case 2:
189  cutilSafeCall(cudaMalloc((void**)&m_device, sizeof(T)*res.width * res.height));
190  cutilSafeCall(cudaMallocArray(&m_volumeArray, &desc, res.width, res.height));
191  break;
192  case 3:
193  cutilSafeCall(cudaMalloc((void**)&m_device, sizeof(T)*res.width * res.height * res.depth));
194  cutilSafeCall(cudaMalloc3DArray(&m_volumeArray, &desc, res));
195  break;
196  }
197 
198  // copy data to array
199  switch(N)
200  {
201  case 1:
202  break;
203  case 2:
204  break;
205  case 3:
206  ArrayCopy((void*)(m_device), m_volumeArray, (size_t)(sizeof(T)), res);
207  break;
208  }
209  };
210 
211 private:
212  unsigned int m_type;
213 
214  T* m_device;
215  cudaArray* m_volumeArray;
216  struct cudaGraphicsResource* cudaRes;
217  Texture::TexturePtr m_tex;
218 
219  cudaChannelFormatDesc desc;
220  cudaExtent res;
221 };
222