Context.cpp 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. /*
  2. * Copyright (c) 2023, Aliaksandr Kalenik <kalenik.aliaksandr@gmail.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibAccelGfx/Context.h>
  7. namespace AccelGfx {
  8. Context& Context::the()
  9. {
  10. static OwnPtr<Context> s_the;
  11. if (!s_the)
  12. s_the = Context::create();
  13. return *s_the;
  14. }
  15. OwnPtr<Context> Context::create()
  16. {
  17. EGLDisplay egl_display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
  18. EGLint major;
  19. EGLint minor;
  20. eglInitialize(egl_display, &major, &minor);
  21. EGLBoolean ok = eglBindAPI(EGL_OPENGL_API);
  22. if (ok == EGL_FALSE) {
  23. dbgln("eglBindAPI failed");
  24. VERIFY_NOT_REACHED();
  25. }
  26. static EGLint const config_attributes[] = {
  27. EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
  28. EGL_BLUE_SIZE, 8,
  29. EGL_GREEN_SIZE, 8,
  30. EGL_RED_SIZE, 8,
  31. EGL_DEPTH_SIZE, 8,
  32. EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT,
  33. EGL_NONE
  34. };
  35. EGLConfig egl_config;
  36. EGLint num_configs;
  37. eglChooseConfig(egl_display, config_attributes, &egl_config, 1, &num_configs);
  38. static EGLint const context_attributes[] = {
  39. EGL_CONTEXT_MAJOR_VERSION, 3,
  40. EGL_CONTEXT_MINOR_VERSION, 3,
  41. EGL_NONE
  42. };
  43. EGLContext egl_context = eglCreateContext(egl_display, egl_config, EGL_NO_CONTEXT, context_attributes);
  44. if (egl_context == EGL_FALSE) {
  45. dbgln("eglCreateContext failed");
  46. VERIFY_NOT_REACHED();
  47. }
  48. EGLBoolean result = eglMakeCurrent(egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE, egl_context);
  49. if (result == EGL_FALSE) {
  50. dbgln("eglMakeCurrent failed");
  51. VERIFY_NOT_REACHED();
  52. }
  53. return make<Context>(egl_display, egl_context, egl_config);
  54. }
  55. }