BsMacOSContext.mm 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "MacOS/BsMacOSContext.h"
  4. #include "MacOS/BsMacOSGLSupport.h"
  5. #define BS_COCOA_INTERNALS
  6. #include "Private/MacOS/BsMacOSWindow.h"
  7. #include "Private/MacOS/BsMacOSPlatform.h"
  8. #import <AppKit/AppKit.h>
  9. namespace bs::ct
  10. {
  11. struct MacOSContext::Pimpl
  12. {
  13. NSOpenGLContext* context = nil;
  14. std::atomic_bool dirty{true};
  15. };
  16. MacOSContext::MacOSContext(bool depthStencil, UINT32 msaaCount)
  17. { @autoreleasepool {
  18. NSOpenGLPixelFormatAttribute attributes[17];
  19. UINT32 attrIdx = 0;
  20. attributes[attrIdx++] = NSOpenGLPFAOpenGLProfile;
  21. attributes[attrIdx++] = NSOpenGLProfileVersion4_1Core;
  22. attributes[attrIdx++] = NSOpenGLPFADoubleBuffer;
  23. attributes[attrIdx++] = NSOpenGLPFAAccelerated;
  24. attributes[attrIdx++] = NSOpenGLPFAColorSize;
  25. attributes[attrIdx++] = 32;
  26. if(depthStencil)
  27. {
  28. attributes[attrIdx++] = NSOpenGLPFADepthSize;
  29. attributes[attrIdx++] = 24;
  30. attributes[attrIdx++] = NSOpenGLPFAStencilSize;
  31. attributes[attrIdx++] = 8;
  32. }
  33. if(msaaCount > 1)
  34. {
  35. attributes[attrIdx++] = NSOpenGLPFAMultisample;
  36. attributes[attrIdx++] = NSOpenGLPFASampleBuffers;
  37. attributes[attrIdx++] = 1;
  38. attributes[attrIdx++] = NSOpenGLPFASamples;
  39. attributes[attrIdx++] = msaaCount;
  40. attributes[attrIdx++] = NSOpenGLPFANoRecovery;
  41. }
  42. attributes[attrIdx] = 0;
  43. NSOpenGLPixelFormat* pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attributes];
  44. m = bs_new<Pimpl>();
  45. m->context = [[NSOpenGLContext alloc] initWithFormat:pixelFormat shareContext:nil];
  46. markAsDirty();
  47. }}
  48. MacOSContext::~MacOSContext()
  49. {
  50. bs_delete(m);
  51. }
  52. void MacOSContext::setCurrent(const RenderWindow& renderWindow)
  53. {
  54. UINT32 windowId;
  55. renderWindow.getCustomAttribute("WINDOW_ID", &windowId);
  56. MacOSPlatform::lockWindows();
  57. CocoaWindow* window = MacOSPlatform::getWindow(windowId);
  58. if(!window)
  59. return;
  60. NSWindow* nsWindow = window->_getPrivateData()->window;
  61. [m->context setView:[nsWindow contentView]];
  62. [m->context makeCurrentContext];
  63. [m->context update];
  64. m->dirty = false;
  65. MacOSPlatform::unlockWindows();
  66. }
  67. void MacOSContext::endCurrent()
  68. {
  69. [m->context setView:nil];
  70. [m->context clearDrawable];
  71. [NSOpenGLContext clearCurrentContext];
  72. }
  73. void MacOSContext::releaseContext()
  74. {
  75. m->context = nil;
  76. }
  77. void MacOSContext::markAsDirty()
  78. {
  79. m->dirty = true;
  80. }
  81. void MacOSContext::updateIfDirty()
  82. {
  83. if(m->dirty)
  84. {
  85. [m->context update];
  86. m->dirty = false;
  87. }
  88. }
  89. void MacOSContext::setVSync(int interval)
  90. {
  91. if(interval < 0)
  92. interval = 0;
  93. [m->context setValues:&interval forParameter:NSOpenGLCPSwapInterval];
  94. }
  95. void MacOSContext::swapBuffers()
  96. {
  97. [m->context flushBuffer];
  98. updateIfDirty();
  99. }
  100. }