OGLRenderSurface.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  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. #define glRenderbufferStorageMultisampleEXT glRenderbufferStorageMultisample
  18. #endif
  19. namespace Urho3D
  20. {
  21. void RenderSurface::Constructor_OGL(Texture* parentTexture)
  22. {
  23. parentTexture_ = parentTexture;
  24. target_ = GL_TEXTURE_2D;
  25. renderBuffer_ = 0;
  26. }
  27. bool RenderSurface::CreateRenderBuffer_OGL(unsigned width, unsigned height, unsigned format, int multiSample)
  28. {
  29. Graphics* graphics = parentTexture_->GetGraphics();
  30. if (!graphics)
  31. return false;
  32. Release_OGL();
  33. #ifndef GL_ES_VERSION_2_0
  34. if (Graphics::GetGL3Support())
  35. {
  36. glGenRenderbuffers(1, &renderBuffer_);
  37. glBindRenderbuffer(GL_RENDERBUFFER, renderBuffer_);
  38. if (multiSample > 1)
  39. glRenderbufferStorageMultisample(GL_RENDERBUFFER, multiSample, format, width, height);
  40. else
  41. glRenderbufferStorage(GL_RENDERBUFFER, format, width, height);
  42. glBindRenderbuffer(GL_RENDERBUFFER, 0);
  43. }
  44. else
  45. #endif
  46. {
  47. glGenRenderbuffersEXT(1, &renderBuffer_);
  48. glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, renderBuffer_);
  49. #ifndef URHO3D_GLES2
  50. if (multiSample > 1)
  51. glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, multiSample, format, width, height);
  52. else
  53. #endif
  54. glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, format, width, height);
  55. glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);
  56. }
  57. return true;
  58. }
  59. void RenderSurface::OnDeviceLost_OGL()
  60. {
  61. Graphics* graphics = parentTexture_->GetGraphics();
  62. if (!graphics)
  63. return;
  64. for (unsigned i = 0; i < MAX_RENDERTARGETS; ++i)
  65. {
  66. if (graphics->GetRenderTarget(i) == this)
  67. graphics->ResetRenderTarget(i);
  68. }
  69. if (graphics->GetDepthStencil() == this)
  70. graphics->ResetDepthStencil();
  71. // Clean up also from non-active FBOs
  72. graphics->CleanupRenderSurface_OGL(this);
  73. if (renderBuffer_ && !graphics->IsDeviceLost())
  74. glDeleteRenderbuffersEXT(1, &renderBuffer_);
  75. renderBuffer_ = 0;
  76. }
  77. void RenderSurface::Release_OGL()
  78. {
  79. Graphics* graphics = parentTexture_->GetGraphics();
  80. if (!graphics)
  81. return;
  82. if (!graphics->IsDeviceLost())
  83. {
  84. for (unsigned i = 0; i < MAX_RENDERTARGETS; ++i)
  85. {
  86. if (graphics->GetRenderTarget(i) == this)
  87. graphics->ResetRenderTarget(i);
  88. }
  89. if (graphics->GetDepthStencil() == this)
  90. graphics->ResetDepthStencil();
  91. // Clean up also from non-active FBOs
  92. graphics->CleanupRenderSurface_OGL(this);
  93. if (renderBuffer_)
  94. glDeleteRenderbuffersEXT(1, &renderBuffer_);
  95. }
  96. renderBuffer_ = 0;
  97. }
  98. }