gfxGLTextureArray.cpp 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #include "gfxGLTextureArray.h"
  2. #include "gfxGLTextureObject.h"
  3. #include "gfxGLUtils.h"
  4. #include "core/util/tVector.h"
  5. GFXGLTextureArray::GFXGLTextureArray()
  6. {
  7. mTextureArray = 0;
  8. }
  9. void GFXGLTextureArray::init()
  10. {
  11. PRESERVE_2D_TEXTURE_ARRAY();
  12. glGenTextures(1, &mTextureArray);
  13. glBindTexture(GL_TEXTURE_2D_ARRAY, mTextureArray);
  14. glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, mMin(mMipLevels - 1, 1));
  15. glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  16. glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  17. glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  18. glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  19. glTexStorage3D(GL_TEXTURE_2D_ARRAY, mMipLevels, GFXGLTextureInternalFormat[mFormat], mWidth, mHeight, mArraySize);
  20. }
  21. void GFXGLTextureArray::_setTexture(const GFXTexHandle& texture, U32 slot)
  22. {
  23. PRESERVE_2D_TEXTURE_ARRAY();
  24. glBindTexture(GL_TEXTURE_2D_ARRAY, mTextureArray);
  25. GFXGLTextureObject* texObj = dynamic_cast<GFXGLTextureObject*>(texture.getPointer());
  26. for (U32 mip = 0; mip < mMipLevels; ++mip)
  27. {
  28. U8* buf = texObj->getTextureData(mip);
  29. const U32 mipWidth = getMax(U32(1), mWidth >> mip);
  30. const U32 mipHeight = getMax(U32(1), mHeight >> mip);
  31. if (mIsCompressed)
  32. {
  33. glCompressedTexSubImage3D(
  34. GL_TEXTURE_2D_ARRAY,
  35. mip, 0, 0,
  36. slot, mipWidth, mipHeight, 1,
  37. GFXGLTextureFormat[mFormat], GFXGLTextureType[mFormat], buf
  38. );
  39. }
  40. else
  41. {
  42. glTexSubImage3D(
  43. GL_TEXTURE_2D_ARRAY,
  44. mip, 0, 0,
  45. slot, mipWidth, mipHeight, 1,
  46. GFXGLTextureFormat[mFormat], GFXGLTextureType[mFormat], buf
  47. );
  48. }
  49. delete[] buf;
  50. }
  51. }
  52. void GFXGLTextureArray::setToTexUnit(U32 tuNum)
  53. {
  54. dynamic_cast<GFXGLDevice*>(getOwningDevice())->setTextureArrayInternal(tuNum, this);
  55. }
  56. void GFXGLTextureArray::Release()
  57. {
  58. glDeleteTextures(1, &mTextureArray);
  59. mTextureArray = 0;
  60. GFXTextureArray::Release();
  61. }
  62. void GFXGLTextureArray::bind(U32 textureUnit) const
  63. {
  64. glActiveTexture(GL_TEXTURE0 + textureUnit);
  65. glBindTexture(GL_TEXTURE_2D_ARRAY, mTextureArray);
  66. dynamic_cast<GFXGLDevice*>(getOwningDevice())->getOpenglCache()->setCacheBindedTex(textureUnit, GL_TEXTURE_2D_ARRAY, mTextureArray);
  67. GFXGLStateBlockRef sb = dynamic_cast<GFXGLDevice*>(GFX)->getCurrentStateBlock();
  68. AssertFatal(sb, "GFXGLTextureArray::bind - No active stateblock!");
  69. if (!sb)
  70. return;
  71. const GFXSamplerStateDesc& ssd = sb->getDesc().samplers[textureUnit];
  72. glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, minificationFilter(ssd.minFilter, ssd.mipFilter, 0));
  73. glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GFXGLTextureFilter[ssd.magFilter]);
  74. glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, mMin(mMipLevels - 1, 1));
  75. glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GFXGLTextureAddress[ssd.addressModeU]);
  76. glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GFXGLTextureAddress[ssd.addressModeV]);
  77. }
  78. void GFXGLTextureArray::zombify()
  79. {
  80. }
  81. void GFXGLTextureArray::resurrect()
  82. {
  83. }