BsMacOSContext.mm 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  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. bool dirty = true;
  15. };
  16. MacOSContext::MacOSContext(bool depthStencil, UINT32 msaaCount)
  17. { @autoreleasepool {
  18. NSOpenGLPixelFormatAttribute attributes[] =
  19. {
  20. NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion4_1Core,
  21. NSOpenGLPFADoubleBuffer,
  22. NSOpenGLPFAAccelerated,
  23. NSOpenGLPFADepthSize, depthStencil ? 24U : 0U,
  24. NSOpenGLPFAStencilSize, depthStencil ? 8U : 0U,
  25. NSOpenGLPFASampleBuffers, msaaCount > 1 ? 1U : 0U,
  26. };
  27. UINT32 attrIdx = 0;
  28. attributes[attrIdx++] = NSOpenGLPFAOpenGLProfile;
  29. attributes[attrIdx++] = NSOpenGLProfileVersion4_1Core;
  30. attributes[attrIdx++] = NSOpenGLPFADoubleBuffer;
  31. attributes[attrIdx++] = NSOpenGLPFAAccelerated;
  32. attributes[attrIdx++] = NSOpenGLPFAColorSize;
  33. attributes[attrIdx++] = 32;
  34. if(depthStencil)
  35. {
  36. attributes[attrIdx++] = NSOpenGLPFADepthSize;
  37. attributes[attrIdx++] = 24;
  38. attributes[attrIdx++] = NSOpenGLPFAStencilSize;
  39. attributes[attrIdx++] = 8;
  40. }
  41. if(msaaCount > 1)
  42. {
  43. attributes[attrIdx++] = NSOpenGLPFAMultisample;
  44. attributes[attrIdx++] = NSOpenGLPFASampleBuffers;
  45. attributes[attrIdx++] = 1;
  46. attributes[attrIdx++] = NSOpenGLPFASamples;
  47. attributes[attrIdx++] = msaaCount;
  48. attributes[attrIdx++] = NSOpenGLPFANoRecovery;
  49. }
  50. attributes[attrIdx] = 0;
  51. NSOpenGLPixelFormat* pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attributes];
  52. m = bs_new<Pimpl>();
  53. m->context = [[NSOpenGLContext alloc] initWithFormat:pixelFormat shareContext:nil];
  54. markAsDirty();
  55. }}
  56. MacOSContext::~MacOSContext()
  57. {
  58. bs_delete(m);
  59. }
  60. void MacOSContext::setCurrent(const RenderWindow& renderWindow)
  61. {
  62. UINT32 windowId;
  63. renderWindow.getCustomAttribute("WINDOW_ID", &windowId);
  64. MacOSPlatform::lockWindows();
  65. CocoaWindow* window = MacOSPlatform::getWindow(windowId);
  66. if(!window)
  67. return;
  68. NSWindow* nsWindow = window->_getPrivateData()->window;
  69. [m->context setView:[nsWindow contentView]];
  70. [m->context makeCurrentContext];
  71. [m->context update];
  72. m->dirty = false;
  73. MacOSPlatform::unlockWindows();
  74. }
  75. void MacOSContext::endCurrent()
  76. {
  77. [m->context setView:nil];
  78. [m->context clearDrawable];
  79. [NSOpenGLContext clearCurrentContext];
  80. }
  81. void MacOSContext::releaseContext()
  82. {
  83. m->context = nil;
  84. }
  85. void MacOSContext::markAsDirty()
  86. {
  87. m->dirty = true;
  88. }
  89. void MacOSContext::updateIfDirty()
  90. {
  91. if(m->dirty)
  92. {
  93. [m->context update];
  94. m->dirty = false;
  95. }
  96. }
  97. void MacOSContext::setVSync(int interval)
  98. {
  99. if(interval < 0)
  100. interval = 0;
  101. [m->context setValues:&interval forParameter:NSOpenGLCPSwapInterval];
  102. }
  103. void MacOSContext::swapBuffers()
  104. {
  105. [m->context flushBuffer];
  106. updateIfDirty();
  107. }
  108. }