OGLRenderSurface.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. // Copyright (c) 2008-2022 the Urho3D project
  2. // License: MIT
  3. #include "../../Precompiled.h"
  4. #include "../../Graphics/Camera.h"
  5. #include "../../Graphics/Graphics.h"
  6. #include "../../Graphics/Renderer.h"
  7. #include "../../GraphicsAPI/GraphicsImpl.h"
  8. #include "../../GraphicsAPI/RenderSurface.h"
  9. #include "../../GraphicsAPI/Texture.h"
  10. #include "../../DebugNew.h"
  11. #ifdef GL_ES_VERSION_2_0
  12. #define GL_RENDERBUFFER_EXT GL_RENDERBUFFER
  13. #define glGenRenderbuffersEXT glGenRenderbuffers
  14. #define glBindRenderbufferEXT glBindRenderbuffer
  15. #define glRenderbufferStorageEXT glRenderbufferStorage
  16. #define glDeleteRenderbuffersEXT glDeleteRenderbuffers
  17. #endif
  18. namespace Urho3D
  19. {
  20. void RenderSurface::Constructor_OGL(Texture* parentTexture)
  21. {
  22. parentTexture_ = parentTexture;
  23. target_ = GL_TEXTURE_2D;
  24. renderBuffer_ = 0;
  25. }
  26. bool RenderSurface::CreateRenderBuffer_OGL(unsigned width, unsigned height, unsigned format, int multiSample)
  27. {
  28. Graphics* graphics = parentTexture_->GetGraphics();
  29. if (!graphics)
  30. return false;
  31. Release_OGL();
  32. #ifndef GL_ES_VERSION_2_0
  33. if (Graphics::GetGL3Support())
  34. {
  35. glGenRenderbuffers(1, &renderBuffer_);
  36. glBindRenderbuffer(GL_RENDERBUFFER, renderBuffer_);
  37. if (multiSample > 1)
  38. glRenderbufferStorageMultisample(GL_RENDERBUFFER, multiSample, format, width, height);
  39. else
  40. glRenderbufferStorage(GL_RENDERBUFFER, format, width, height);
  41. glBindRenderbuffer(GL_RENDERBUFFER, 0);
  42. }
  43. else
  44. #endif
  45. {
  46. glGenRenderbuffersEXT(1, &renderBuffer_);
  47. glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, renderBuffer_);
  48. #ifndef GL_ES_VERSION_2_0
  49. if (multiSample > 1)
  50. glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, multiSample, format, width, height);
  51. else
  52. #endif
  53. glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, format, width, height);
  54. glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);
  55. }
  56. return true;
  57. }
  58. void RenderSurface::OnDeviceLost_OGL()
  59. {
  60. Graphics* graphics = parentTexture_->GetGraphics();
  61. if (!graphics)
  62. return;
  63. for (unsigned i = 0; i < MAX_RENDERTARGETS; ++i)
  64. {
  65. if (graphics->GetRenderTarget(i) == this)
  66. graphics->ResetRenderTarget(i);
  67. }
  68. if (graphics->GetDepthStencil() == this)
  69. graphics->ResetDepthStencil();
  70. // Clean up also from non-active FBOs
  71. graphics->CleanupRenderSurface_OGL(this);
  72. if (renderBuffer_ && !graphics->IsDeviceLost())
  73. glDeleteRenderbuffersEXT(1, &renderBuffer_);
  74. renderBuffer_ = 0;
  75. }
  76. void RenderSurface::Release_OGL()
  77. {
  78. Graphics* graphics = parentTexture_->GetGraphics();
  79. if (!graphics)
  80. return;
  81. if (!graphics->IsDeviceLost())
  82. {
  83. for (unsigned i = 0; i < MAX_RENDERTARGETS; ++i)
  84. {
  85. if (graphics->GetRenderTarget(i) == this)
  86. graphics->ResetRenderTarget(i);
  87. }
  88. if (graphics->GetDepthStencil() == this)
  89. graphics->ResetDepthStencil();
  90. // Clean up also from non-active FBOs
  91. graphics->CleanupRenderSurface_OGL(this);
  92. if (renderBuffer_)
  93. glDeleteRenderbuffersEXT(1, &renderBuffer_);
  94. }
  95. renderBuffer_ = 0;
  96. }
  97. }