vtkTextureUnitManager.h 3.74 KB
Newer Older
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
/*=========================================================================

  Program:   Visualization Toolkit
  Module:    vtkTextureUnitManager.h

  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
  All rights reserved.
  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.

     This software is distributed WITHOUT ANY WARRANTY; without even
     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
     PURPOSE.  See the above copyright notice for more information.

=========================================================================*/
// .NAME vtkTextureUnitManager - allocate/free texture units.
// .SECTION Description
//
// vtkTextureUnitManager is a central place used by shaders to reserve a
// texture unit ( Allocate() ) or release it ( Free() ).
//
// Don't create a vtkTextureUnitManager, query it from the
// vtkOpenGLRenderWindow
//
// .SECTION See Also
// vtkOpenGLRenderWindow

27 28
#ifndef vtkTextureUnitManager_h
#define vtkTextureUnitManager_h
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

#include "vtkRenderingOpenGL2Module.h" // For export macro
#include "vtkObject.h"

class vtkOpenGLRenderWindow;

class VTKRENDERINGOPENGL2_EXPORT vtkTextureUnitManager : public vtkObject
{
public:
  vtkTypeMacro(vtkTextureUnitManager,vtkObject);

  void PrintSelf(ostream& os, vtkIndent indent);

  static vtkTextureUnitManager *New();

  // Description:
  // Get/Set the context. This does not increase the reference count of the
  // context to avoid reference loops.
  // SetContext() may raise an error is the OpenGL context does not support the
  // required OpenGL extensions.
  void SetContext(vtkOpenGLRenderWindow *context);
  vtkGetObjectMacro(Context,vtkOpenGLRenderWindow);

  // Description:
  // Number of texture units supported by the OpenGL context.
  int GetNumberOfTextureUnits();

  // Description:
  // Reserve a texture unit. It returns its number.
  // It returns -1 if the allocation failed (because there are no more
  // texture units left).
  // \post valid_result: result==-1 || result>=0 && result<this->GetNumberOfTextureUnits())
  // \post allocated: result==-1 || this->IsAllocated(result)
  virtual int Allocate();

  // Description:
Ken Martin's avatar
Ken Martin committed
65 66 67 68 69 70 71 72 73 74 75 76
  // Reserve a specific texture unit if not already in use.
  // This method should only be used when interacting with 3rd
  // party code that is allocating and using textures. It allows
  // someone to reserve a texture unit for that code and later release
  // it. VTK will not use that texture unit until it is released.
  // It returns -1 if the allocation failed (because there are no more
  // texture units left).
  // \post valid_result: result==-1 || result>=0 && result<this->GetNumberOfTextureUnits())
  // \post allocated: result==-1 || this->IsAllocated(result)
  virtual int Allocate(int unit);

  // Description:
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
  // Tell if texture unit `textureUnitId' is already allocated.
  // \pre valid_textureUnitId_range : textureUnitId>=0 && textureUnitId<this->GetNumberOfTextureUnits()
  bool IsAllocated(int textureUnitId);

  // Description:
  // Release a texture unit.
  // \pre valid_textureUnitId: textureUnitId>=0 && textureUnitId<this->GetNumberOfTextureUnits()
  // \pre allocated_textureUnitId: this->IsAllocated(textureUnitId)
  virtual void Free(int textureUnitId);

protected:
  // Description:
  // Default constructor.
  vtkTextureUnitManager();

  // Description:
  // Destructor.
  ~vtkTextureUnitManager();

  // Description:
  // Delete the allocation table and check if it is not called before
  // all the texture units have been released.
  void DeleteTable();

  vtkOpenGLRenderWindow *Context;

  int NumberOfTextureUnits;
104
  bool *TextureUnits;
105 106 107 108 109 110 111

private:
  vtkTextureUnitManager(const vtkTextureUnitManager&);  // Not implemented.
  void operator=(const vtkTextureUnitManager&);  // Not implemented.
};

#endif