39 #include <vtkImageData.h> 40 #include <vtkPointData.h> 41 #include <vtkUnsignedCharArray.h> 42 #include <vtkUnsignedShortArray.h> 43 #include <boost/cstdint.hpp> 49 #define GL_GLEXT_PROTOTYPES //Needed to compile on Linux? 53 #include <OpenGL/glu.h> 99 std::cout <<
"error: bad buffer initialization: null image" << std::endl;
121 std::cout <<
"error: bad volume buffer initialization" << std::endl;
132 glGenTextures(1, &textureId);
144 if (mMTime == mTexture->GetMTime())
148 mMTime = mTexture->GetMTime();
150 GLenum size,internalType;
151 boost::uint32_t dimx = mTexture ->GetDimensions( )[0];
152 boost::uint32_t dimy = mTexture ->GetDimensions( )[1];
153 boost::uint32_t dimz = mTexture ->GetDimensions( )[2];
154 mMemorySize = dimx * dimy * dimz;
160 glBindTexture(GL_TEXTURE_3D, textureId);
161 glTexParameteri( GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER );
162 glTexParameteri( GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER );
163 glTexParameteri( GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_BORDER );
164 glTexParameteri( GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
165 glTexParameteri( GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
167 switch (mTexture->GetScalarType())
169 case VTK_UNSIGNED_CHAR:
171 size = GL_UNSIGNED_BYTE;
172 internalType = GL_RED;
175 case VTK_UNSIGNED_SHORT:
177 size = GL_UNSIGNED_SHORT;
178 internalType = GL_RED;
185 std::cout <<
"Bit size not supported!" << std::endl;
186 QString dataType(mTexture->GetScalarTypeAsString());
187 CX_LOG_ERROR() << QString(
"Attempt to update 3D GL texture from type %1 failed. Only unsigned types supported").arg(dataType);
192 if (mTexture->GetNumberOfScalarComponents()==1)
194 void* data = mTexture->GetPointData()->GetScalars()->GetVoidPointer(0);
195 glTexImage3D(GL_TEXTURE_3D, 0, internalType, dimx, dimy, dimz, 0, GL_RED, size, data);
197 else if (mTexture->GetNumberOfScalarComponents()==3)
199 internalType = GL_RGB;
200 void* data = mTexture->GetPointData()->GetScalars()->GetVoidPointer(0);
201 glTexImage3D(GL_TEXTURE_3D, 0, internalType, dimx, dimy, dimz, 0, GL_RGB, size, data);
206 std::cout <<
"unsupported number of image components" << std::endl;
218 virtual void bind(
int textureUnitIndex)
224 std::cout <<
"error: called bind() on unallocated volume buffer" << std::endl;
227 glBindTexture(GL_TEXTURE_3D, textureId);
233 glDeleteTextures(1, &textureId);
238 switch (textureUnitIndex)
240 case 0:
return GL_TEXTURE0;
241 case 1:
return GL_TEXTURE2;
242 case 2:
return GL_TEXTURE4;
243 case 3:
return GL_TEXTURE6;
244 case 4:
return GL_TEXTURE8;
278 return mTable->GetNumberOfTuples() * mTable->GetNumberOfComponents() *
sizeof(float);
297 std::cout <<
"error: bad lut buffer initialization" << std::endl;
303 glActiveTexture(GL_TEXTURE6);
304 glGenTextures(1, &textureId);
312 if (mMTime == mTable->GetMTime())
316 mMTime = mTable->GetMTime();
318 glActiveTexture(GL_TEXTURE6);
319 this->sendDataToGL();
325 std::vector<float> lut;
326 int lutSize = mTable->GetNumberOfTuples();
327 int lutDataSize = lutSize * mTable->GetNumberOfComponents();
328 lut.resize(lutDataSize);
329 unsigned char* ptr = mTable->GetPointer(0);
331 for (
int i = 0; i < lut.size(); ++i)
333 lut[i] = ((float) *ptr) / 255.0;
337 glBindTexture(GL_TEXTURE_1D, textureId);
338 glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
339 glTexParameteri( GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
340 glTexParameteri( GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
343 glTexImage1D(GL_TEXTURE_1D, 0, GL_RGBA,
345 GL_RGBA, GL_FLOAT, &(*lut.begin()));
349 virtual void bind(
int textureUnitIndex)
354 std::cout <<
"error: called bind() on unallocated lut buffer" << std::endl;
357 glActiveTexture(getGLTextureForLut(textureUnitIndex));
358 this->bindDataToGL();
364 glBindTexture(GL_TEXTURE_1D, textureId);
369 return mTable->GetNumberOfTuples();
377 glDeleteTextures(1, &textureId);
382 switch (textureUnitIndex)
384 case 0:
return GL_TEXTURE1;
385 case 1:
return GL_TEXTURE3;
386 case 2:
return GL_TEXTURE5;
387 case 3:
return GL_TEXTURE7;
388 case 4:
return GL_TEXTURE9;
397 retval->SetImage(volume);
404 retval->SetColorMap(lut);
408 template<
class BUFFER,
class DATA_PTR>
432 template<
class DATA_PTR,
class BUFFER>
441 BufferStore(DATA_PTR data, BufferPtr buffer) : mData(data), mBuffer(buffer) {}
464 BufferPtr
get(DATA_PTR data)
467 for (
typename BufferMap::iterator iter=mRemovedData.begin(); iter!=mRemovedData.end(); )
469 if (!iter->second.lock())
471 typename BufferMap::iterator temp = iter;
473 mRemovedData.erase(temp);
482 if (mRemovedData.count(data))
484 BufferPtr
object = mRemovedData[data].lock();
487 mData.push_front(BufferStore(data,
object));
488 mRemovedData.erase(data);
494 for (
typename std::list<BufferStore>::iterator iter=mData.begin(); iter!=mData.end(); ++iter)
496 if (iter->mData==data)
498 retval = iter->mBuffer;
499 mData.push_front(*iter);
508 retval = createGPUImageBuffer<BUFFER>(data);
509 mData.push_front(BufferStore(data, retval));
513 while (mData.size()>mMaxBuffers)
515 mRemovedData[mData.back().mData] = mData.back().mBuffer;
526 *textures = mData.size();
528 for (
typename std::list<BufferStore>::iterator iter=mData.begin(); iter!=mData.end(); ++iter)
530 mem += iter->mBuffer->getMemorySize();
535 typedef std::map<DATA_PTR, BufferWeakPtr> BufferMap;
536 BufferMap mRemovedData;
537 std::list<BufferStore> mData;
538 unsigned mMaxBuffers;
547 mVolumeBuffer.setName(
"Volume");
548 mLutBuffer.setName(
"Lut");
550 mVolumeBuffer.setMaxBuffers(12);
551 mLutBuffer.setMaxBuffers(15);
557 GPUImageBufferRepository::GPUImageBufferRepository()
562 GPUImageBufferRepository::~GPUImageBufferRepository()
592 void GPUImageBufferRepository::tearDown()
600 return mInternal->mVolumeBuffer.getMemoryUsage(textures);
605 return mInternal->mVolumeBuffer.get(volume);
610 return mInternal->mLutBuffer.get(lut);
624 void GPUImageBufferRepository::tearDown() {;}
virtual ~GPUImageDataBufferImpl()
Helper class for sharing GPU memory over several Views (GL contexts).
boost::shared_ptr< BUFFER > createGPUImageBuffer(DATA_PTR val)
BufferQueue< vtkImageDataPtr, GPUImageDataBuffer > mVolumeBuffer
boost::shared_ptr< GPUImageDataBuffer > createGPUImageBuffer< GPUImageDataBuffer, vtkImageDataPtr >(vtkImageDataPtr val)
GPUImageDataBufferPtr createGPUImageDataBuffer(vtkImageDataPtr volume)
virtual int getMemorySize()
vtkUnsignedCharArrayPtr mTable
virtual void SetColorMap(vtkUnsignedCharArrayPtr table)
virtual unsigned int getTextureUid() const
void setName(const QString &name)
BufferQueue< vtkUnsignedCharArrayPtr, GPUImageLutBuffer > mLutBuffer
Repository for GPU buffers.
virtual void allocate(int textureUnitIndex)
vtkSmartPointer< class vtkUnsignedCharArray > vtkUnsignedCharArrayPtr
boost::shared_ptr< GPUImageDataBuffer > createGPUImageBuffer< GPUImageDataBuffer >(vtkImageDataPtr val)
virtual void bind(int textureUnitIndex)
GPUImageLutBufferPtr getGPUImageLutBuffer(vtkUnsignedCharArrayPtr lut)
virtual void updateTexture()
void setMaxBuffers(unsigned val)
virtual ~GPUImageLutBufferImpl()
virtual void SetImage(vtkImageDataPtr texture)
int getGLTextureForLut(int textureUnitIndex)
GPUImageLutBufferPtr createGPUImageLutBuffer(vtkUnsignedCharArrayPtr lut)
boost::shared_ptr< class GPUImageDataBuffer > GPUImageDataBufferPtr
boost::weak_ptr< BUFFER > BufferWeakPtr
virtual void updateTexture()
boost::shared_ptr< class GPUImageLutBuffer > GPUImageLutBufferPtr
int getGLTextureForVolume(int textureUnitIndex)
GPUImageDataBufferPtr getGPUImageDataBuffer(vtkImageDataPtr volume)
int getMemoryUsage(int *textures)
Helper class for sharing GPU memory over several Views (GL contexts).
virtual int getMemorySize()
static GPUImageBufferRepository * getInstance()
virtual void bind(int textureUnitIndex)
BufferStore(DATA_PTR data, BufferPtr buffer)
boost::shared_ptr< GPUImageLutBuffer > createGPUImageBuffer< GPUImageLutBuffer >(vtkUnsignedCharArrayPtr val)
boost::shared_ptr< BUFFER > BufferPtr
GPUImageBufferRepositoryInternal()
#define report_gl_error()
int getMemoryUsage(int *textures)
GPUImageBufferRepository * getGPUImageBufferRepository()
Namespace for all CustusX production code.