Mercurial > hg > orthanc-stone
annotate Applications/Sdl/SdlOpenGLWindow.cpp @ 876:580dd82e13f5 am-dev
added GetApproximateMemoryUsage
author | Alain Mazy <alain@mazy.be> |
---|---|
date | Wed, 03 Jul 2019 10:15:29 +0200 |
parents | 002d9562c8f5 |
children |
rev | line source |
---|---|
595
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1 /** |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2 * Stone of Orthanc |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
4 * Department, University Hospital of Liege, Belgium |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
5 * Copyright (C) 2017-2019 Osimis S.A., Belgium |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
6 * |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
7 * This program is free software: you can redistribute it and/or |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
8 * modify it under the terms of the GNU Affero General Public License |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
9 * as published by the Free Software Foundation, either version 3 of |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
10 * the License, or (at your option) any later version. |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
11 * |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
12 * This program is distributed in the hope that it will be useful, but |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
13 * WITHOUT ANY WARRANTY; without even the implied warranty of |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
15 * Affero General Public License for more details. |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
16 * |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
17 * You should have received a copy of the GNU Affero General Public License |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
18 * along with this program. If not, see <http://www.gnu.org/licenses/>. |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
19 **/ |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
20 |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
21 |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
22 #include "SdlOpenGLWindow.h" |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
23 |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
24 #if ORTHANC_ENABLE_SDL == 1 |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
25 |
613
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
26 #if !defined(ORTHANC_ENABLE_GLEW) |
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
27 # error Macro ORTHANC_ENABLE_GLEW must be defined |
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
28 #endif |
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
29 |
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
30 #if ORTHANC_ENABLE_GLEW == 1 |
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
31 # include <GL/glew.h> |
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
32 #endif |
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
33 |
595
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
34 #include <Core/OrthancException.h> |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
35 |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
36 namespace OrthancStone |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
37 { |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
38 SdlOpenGLWindow::SdlOpenGLWindow(const char* title, |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
39 unsigned int width, |
656
002d9562c8f5
Added support to DISABLE legacy scaling in SDL Windows (only in WIN32... this
Benjamin Golinvaux <bgo@osimis.io>
parents:
615
diff
changeset
|
40 unsigned int height, |
002d9562c8f5
Added support to DISABLE legacy scaling in SDL Windows (only in WIN32... this
Benjamin Golinvaux <bgo@osimis.io>
parents:
615
diff
changeset
|
41 bool allowDpiScaling) : |
002d9562c8f5
Added support to DISABLE legacy scaling in SDL Windows (only in WIN32... this
Benjamin Golinvaux <bgo@osimis.io>
parents:
615
diff
changeset
|
42 window_(title, width, height, true /* enable OpenGL */, allowDpiScaling) |
595
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
43 { |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
44 context_ = SDL_GL_CreateContext(window_.GetObject()); |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
45 |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
46 if (context_ == NULL) |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
47 { |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
48 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
49 "Cannot initialize OpenGL"); |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
50 } |
613
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
51 |
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
52 #if ORTHANC_ENABLE_GLEW == 1 |
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
53 // The initialization function of glew (i.e. "glewInit()") can |
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
54 // only be called once an OpenGL is setup. |
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
55 // https://stackoverflow.com/a/45033669/881731 |
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
56 { |
614 | 57 static boost::mutex mutex_; |
58 static bool isGlewInitialized_ = false; | |
59 | |
60 boost::mutex::scoped_lock lock(mutex_); | |
613
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
61 |
614 | 62 if (!isGlewInitialized_) |
613
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
63 { |
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
64 LOG(INFO) << "Initializing glew"; |
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
65 |
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
66 GLenum err = glewInit(); |
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
67 if (GLEW_OK != err) |
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
68 { |
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
69 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, |
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
70 "Cannot initialize glew"); |
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
71 } |
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
72 |
614 | 73 isGlewInitialized_ = true; |
613
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
74 } |
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
75 } |
412a2d01a189
automatic initialization of glew
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
595
diff
changeset
|
76 #endif |
595
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
77 } |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
78 |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
79 |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
80 SdlOpenGLWindow::~SdlOpenGLWindow() |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
81 { |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
82 SDL_GL_DeleteContext(context_); |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
83 } |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
84 |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
85 |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
86 void SdlOpenGLWindow::MakeCurrent() |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
87 { |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
88 if (SDL_GL_MakeCurrent(window_.GetObject(), context_) != 0) |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
89 { |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
90 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
91 "Cannot set current OpenGL context"); |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
92 } |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
93 |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
94 // This makes our buffer swap syncronized with the monitor's vertical refresh |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
95 SDL_GL_SetSwapInterval(1); |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
96 } |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
97 |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
98 |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
99 void SdlOpenGLWindow::SwapBuffer() |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
100 { |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
101 // Swap our buffer to display the current contents of buffer on screen |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
102 SDL_GL_SwapWindow(window_.GetObject()); |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
103 } |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
104 |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
105 |
615 | 106 unsigned int SdlOpenGLWindow::GetCanvasWidth() const |
595
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
107 { |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
108 int w = 0; |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
109 SDL_GL_GetDrawableSize(window_.GetObject(), &w, NULL); |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
110 return static_cast<unsigned int>(w); |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
111 } |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
112 |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
113 |
615 | 114 unsigned int SdlOpenGLWindow::GetCanvasHeight() const |
595
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
115 { |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
116 int h = 0; |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
117 SDL_GL_GetDrawableSize(window_.GetObject(), NULL, &h); |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
118 return static_cast<unsigned int>(h); |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
119 } |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
120 } |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
121 |
6e471e6cf09b
CairoPolylineRenderer, SdlOpenGLWindow
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
122 #endif |