summaryrefslogtreecommitdiff
path: root/Source/Core/Common/GL/GLContext.cpp
blob: b02e27778f3e1ae28a42c7c25600f58e9fc3891b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
// Copyright 2014 Dolphin Emulator Project
// Licensed under GPLv2+
// Refer to the license.txt file included.

#include <memory>

#include "Common/GL/GLContext.h"

#if defined(__APPLE__)
#include "Common/GL/GLInterface/AGL.h"
#endif
#if defined(WIN32)
#include "Common/GL/GLInterface/WGL.h"
#endif
#if HAVE_X11
#include "Common/GL/GLInterface/GLX.h"
#endif
#if HAVE_EGL
#include "Common/GL/GLInterface/EGL.h"
#if HAVE_X11
#include "Common/GL/GLInterface/EGLX11.h"
#endif
#if defined(ANDROID)
#include "Common/GL/GLInterface/EGLAndroid.h"
#endif
#endif

const std::array<std::pair<int, int>, 9> GLContext::s_desktop_opengl_versions = {
    {{4, 6}, {4, 5}, {4, 4}, {4, 3}, {4, 2}, {4, 1}, {4, 0}, {3, 3}, {3, 2}}};

GLContext::~GLContext() = default;

bool GLContext::Initialize(void* display_handle, void* window_handle, bool stereo, bool core)
{
  return false;
}

bool GLContext::IsHeadless() const
{
  return true;
}

std::unique_ptr<GLContext> GLContext::CreateSharedContext()
{
  return nullptr;
}

bool GLContext::MakeCurrent()
{
  return false;
}

bool GLContext::ClearCurrent()
{
  return false;
}

void GLContext::Update()
{
}

void GLContext::UpdateSurface(void* window_handle)
{
}

void GLContext::Swap()
{
}

void GLContext::SwapInterval(int interval)
{
}

void* GLContext::GetFuncAddress(const std::string& name)
{
  return nullptr;
}

std::unique_ptr<GLContext> GLContext::Create(const WindowSystemInfo& wsi, bool stereo, bool core,
                                             bool prefer_egl, bool prefer_gles)
{
  std::unique_ptr<GLContext> context;
#if defined(__APPLE__)
  if (wsi.type == WindowSystemType::MacOS || wsi.type == WindowSystemType::Headless)
    context = std::make_unique<GLContextAGL>();
#endif
#if defined(_WIN32)
  if (wsi.type == WindowSystemType::Windows)
    context = std::make_unique<GLContextWGL>();
#endif
#if defined(ANDROID)
  if (wsi.type == WindowSystemType::Android)
    context = std::make_unique<GLContextEGLAndroid>();
#endif
#if HAVE_X11
  if (wsi.type == WindowSystemType::X11)
  {
    // GLES 3 is not supported via GLX.
    const bool use_egl = prefer_egl || prefer_gles;
#if defined(HAVE_EGL)
    if (use_egl)
      context = std::make_unique<GLContextEGLX11>();
    else
      context = std::make_unique<GLContextGLX>();
#else
    context = std::make_unique<GLContextGLX>();
#endif
  }
#endif
#if HAVE_EGL
  if (wsi.type == WindowSystemType::Headless)
    context = std::make_unique<GLContextEGL>();
#endif

  if (!context)
    return nullptr;

  // Option to prefer GLES on desktop platforms, useful for testing.
  if (prefer_gles)
    context->m_opengl_mode = Mode::OpenGLES;

  if (!context->Initialize(wsi.display_connection, wsi.render_surface, stereo, core))
    return nullptr;

  return context;
}