Mercurial > hg > orthanc-stone
annotate OrthancStone/Sources/OpenGL/OpenGLTexture.cpp @ 2115:de049fd88697 deep-learning
integration mainline->deep-learning
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 24 Jan 2024 16:44:40 +0100 |
parents | fdb012c86a75 c23eef785569 |
children | 2e050ec85379 |
rev | line source |
---|---|
579
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
1 /** |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
2 * Stone of Orthanc |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
4 * Department, University Hospital of Liege, Belgium |
2114
c23eef785569
update year to 2024
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2113
diff
changeset
|
5 * Copyright (C) 2017-2024 Osimis S.A., Belgium |
c23eef785569
update year to 2024
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2113
diff
changeset
|
6 * Copyright (C) 2021-2024 Sebastien Jodogne, ICTEAM UCLouvain, Belgium |
579
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
7 * |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
8 * This program is free software: you can redistribute it and/or |
1598
8563ea5d8ae4
relicensing some files, cf. osimis bm26 and chu agreement on 2020-05-20
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1596
diff
changeset
|
9 * modify it under the terms of the GNU Lesser General Public License |
579
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
10 * as published by the Free Software Foundation, either version 3 of |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
11 * the License, or (at your option) any later version. |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
12 * |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
13 * This program is distributed in the hope that it will be useful, but |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
14 * WITHOUT ANY WARRANTY; without even the implied warranty of |
1598
8563ea5d8ae4
relicensing some files, cf. osimis bm26 and chu agreement on 2020-05-20
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1596
diff
changeset
|
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
8563ea5d8ae4
relicensing some files, cf. osimis bm26 and chu agreement on 2020-05-20
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1596
diff
changeset
|
16 * Lesser General Public License for more details. |
1596
4fb8fdf03314
removed annoying whitespace
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1564
diff
changeset
|
17 * |
1598
8563ea5d8ae4
relicensing some files, cf. osimis bm26 and chu agreement on 2020-05-20
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1596
diff
changeset
|
18 * You should have received a copy of the GNU Lesser General Public |
8563ea5d8ae4
relicensing some files, cf. osimis bm26 and chu agreement on 2020-05-20
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1596
diff
changeset
|
19 * License along with this program. If not, see |
8563ea5d8ae4
relicensing some files, cf. osimis bm26 and chu agreement on 2020-05-20
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1596
diff
changeset
|
20 * <http://www.gnu.org/licenses/>. |
579
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
21 **/ |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
22 |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
23 |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
24 #include "OpenGLTexture.h" |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
25 |
2048
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
26 #if defined(__EMSCRIPTEN__) |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
27 # if !defined(ORTHANC_WEBGL2_HEAP_COMPAT) |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
28 # error The macro ORTHANC_WEBGL2_HEAP_COMPAT must be defined |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
29 # endif |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
30 #endif |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
31 |
2060
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2058
diff
changeset
|
32 #include <Images/Image.h> |
1624 | 33 #include <Logging.h> |
1455
30deba7bc8e2
simplifying include_directories
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1270
diff
changeset
|
34 #include <OrthancException.h> |
579
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
35 |
2113
8ab2eb6ed354
fix for boost 1.84.0
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2077
diff
changeset
|
36 #include <cassert> |
8ab2eb6ed354
fix for boost 1.84.0
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2077
diff
changeset
|
37 |
579
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
38 namespace OrthancStone |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
39 { |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
40 namespace OpenGL |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
41 { |
2032
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
42 OpenGLTexture::OpenGLTexture(OpenGL::IOpenGLContext& context) : |
2060
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2058
diff
changeset
|
43 context_(context), |
2032
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
44 texture_(0), |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
45 width_(0), |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
46 height_(0), |
2047
0b596428e60c
added OpenGLTexture::GetFormat()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2046
diff
changeset
|
47 format_(Orthanc::PixelFormat_Grayscale8), |
2058
c0627145b441
added OpenGLTexture::IsLinearInterpolation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2056
diff
changeset
|
48 isLinearInterpolation_(false) |
579
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
49 { |
2061
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2060
diff
changeset
|
50 if (context.IsContextLost()) |
579
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
51 { |
2061
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2060
diff
changeset
|
52 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2060
diff
changeset
|
53 "OpenGL context has been lost"); |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2060
diff
changeset
|
54 } |
2045
e5c812a36746
added support of WebGL2 in WebAssemblyOpenGLContext
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2044
diff
changeset
|
55 |
2061
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2060
diff
changeset
|
56 // Generate a texture object |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2060
diff
changeset
|
57 glGenTextures(1, &texture_); |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2060
diff
changeset
|
58 ORTHANC_OPENGL_CHECK("glGenTextures()"); |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2060
diff
changeset
|
59 |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2060
diff
changeset
|
60 if (texture_ == 0) |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2060
diff
changeset
|
61 { |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2060
diff
changeset
|
62 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, |
6ea5f40ea0e9
added ImageProcessingProgram
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2060
diff
changeset
|
63 "Cannot create an OpenGL texture"); |
579
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
64 } |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
65 } |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
66 |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
67 OpenGLTexture::~OpenGLTexture() |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
68 { |
947
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
69 try |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
70 { |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
71 if (!context_.IsContextLost()) |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
72 { |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
73 assert(texture_ != 0); |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
74 ORTHANC_OPENGL_TRACE_CURRENT_CONTEXT("About to call glDeleteTextures"); |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
75 glDeleteTextures(1, &texture_); |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
76 } |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
77 } |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
78 catch (const Orthanc::OrthancException& e) |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
79 { |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
80 if (e.HasDetails()) |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
81 { |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
82 LOG(ERROR) << "OrthancException in ~OpenGLTexture: " << e.What() << " Details: " << e.GetDetails(); |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
83 } |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
84 else |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
85 { |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
86 LOG(ERROR) << "OrthancException in ~OpenGLTexture: " << e.What(); |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
87 } |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
88 } |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
89 catch (const std::exception& e) |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
90 { |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
91 LOG(ERROR) << "std::exception in ~OpenGLTexture: " << e.what(); |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
92 } |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
93 catch (...) |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
94 { |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
95 LOG(ERROR) << "Unknown exception in ~OpenGLTexture"; |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
96 } |
579
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
97 } |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
98 |
2034 | 99 void OpenGLTexture::Setup(Orthanc::PixelFormat format, |
100 unsigned int width, | |
101 unsigned int height, | |
102 bool isLinearInterpolation, | |
103 const void* data) | |
579
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
104 { |
2034 | 105 if (context_.IsContextLost()) |
106 { | |
107 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, | |
108 "OpenGL context has been lost"); | |
109 } | |
110 else | |
579
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
111 { |
947
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
112 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); // Disable byte-alignment restriction |
579
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
113 |
947
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
114 // Bind it |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
115 glActiveTexture(GL_TEXTURE0); |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
116 glBindTexture(GL_TEXTURE_2D, texture_); |
579
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
117 |
2032
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
118 GLenum sourceFormat, internalFormat, pixelType; |
2037
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
119 ConvertToOpenGLFormats(sourceFormat, internalFormat, pixelType, format); |
579
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
120 |
2047
0b596428e60c
added OpenGLTexture::GetFormat()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2046
diff
changeset
|
121 format_ = format; |
2034 | 122 width_ = width; |
123 height_ = height; | |
2058
c0627145b441
added OpenGLTexture::IsLinearInterpolation()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2056
diff
changeset
|
124 isLinearInterpolation_ = isLinearInterpolation; |
947
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
125 |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
126 GLint interpolation = (isLinearInterpolation ? GL_LINEAR : GL_NEAREST); |
579
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
127 |
947
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
128 // Load the texture from the image buffer |
2048
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
129 |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
130 #if defined(__EMSCRIPTEN__) && (ORTHANC_WEBGL2_HEAP_COMPAT == 1) |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
131 /** |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
132 * This compatibility implementation seems to be necessary |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
133 * with WebGL2, at least in Web workers. In such a situation, |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
134 * the calls that are referred to as the "new garbage-free |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
135 * entry points" in the Emscripten source file |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
136 * "upstream/emscripten/src/library_webgl.js" seem to fail, |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
137 * because the "Uint8Array" and "Float32Array" seem to be |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
138 * incorrectly created. This compatibility reverts to the |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
139 * WebGL1 behavior of "library_webgl.js", which requires the |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
140 * function "emscriptenWebGLGetTexPixelData" that is defined |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
141 * in "upstream/emscripten/src/library_webgl.js" to be |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
142 * exported in the linker using option |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
143 * "EXTRA_EXPORTED_RUNTIME_METHODS" or |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
144 * "EXPORTED_RUNTIME_METHODS". |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
145 **/ |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
146 EM_ASM({ |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
147 var ptr = $0 ? emscriptenWebGLGetTexPixelData($5, $4, $2, $3, $0, $1) : null; |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
148 GLctx.texImage2D(GLctx.TEXTURE_2D, 0, $1, $2, $3, 0, $4, $5, ptr); |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
149 }, |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
150 data, // $0 |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
151 internalFormat, // $1 |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
152 width, // $2 |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
153 height, // $3 |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
154 sourceFormat, // $4 |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
155 pixelType); // $5 |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
156 #else |
2034 | 157 glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, width, height, |
158 0, sourceFormat, pixelType, data); | |
2048
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
159 #endif |
a05b03f45289
added ORTHANC_WEBGL2_HEAP_COMPAT
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2047
diff
changeset
|
160 |
2046 | 161 ORTHANC_OPENGL_CHECK("glTexImage2D()"); |
2036
444527d34647
sanity check in textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2035
diff
changeset
|
162 |
2043 | 163 #if !defined(__EMSCRIPTEN__) |
2046 | 164 /** |
165 * glGetTexLevelParameteriv() was introduced in OpenGL ES 3.1, | |
166 * but WebGL 2 only supports OpenGL ES 3.0, so it is not | |
167 * available in WebAssembly: | |
168 * https://registry.khronos.org/OpenGL-Refpages/es3.1/html/glGetTexLevelParameter.xhtml | |
169 **/ | |
2036
444527d34647
sanity check in textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2035
diff
changeset
|
170 GLint w, h; |
444527d34647
sanity check in textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2035
diff
changeset
|
171 glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &w); |
444527d34647
sanity check in textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2035
diff
changeset
|
172 glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &h); |
444527d34647
sanity check in textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2035
diff
changeset
|
173 if (width != static_cast<unsigned int>(w) || |
444527d34647
sanity check in textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2035
diff
changeset
|
174 height != static_cast<unsigned int>(h)) |
444527d34647
sanity check in textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2035
diff
changeset
|
175 { |
444527d34647
sanity check in textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2035
diff
changeset
|
176 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, |
444527d34647
sanity check in textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2035
diff
changeset
|
177 "Your GPU cannot create a texture of size " + |
444527d34647
sanity check in textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2035
diff
changeset
|
178 boost::lexical_cast<std::string>(width) + " x " + |
444527d34647
sanity check in textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2035
diff
changeset
|
179 boost::lexical_cast<std::string>(height)); |
444527d34647
sanity check in textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2035
diff
changeset
|
180 } |
2043 | 181 #endif |
2036
444527d34647
sanity check in textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2035
diff
changeset
|
182 |
947
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
183 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, interpolation); |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
184 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, interpolation); |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
185 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
186 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
1091b2adeb5a
Fixed animation frame stopping when returning false + big work on the OpenGL
Benjamin Golinvaux <bgo@osimis.io>
parents:
616
diff
changeset
|
187 } |
579
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
188 } |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
189 |
2034 | 190 void OpenGLTexture::Load(const Orthanc::ImageAccessor& image, |
191 bool isLinearInterpolation) | |
192 { | |
193 if (image.GetPitch() != image.GetBytesPerPixel() * image.GetWidth()) | |
194 { | |
195 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented, | |
196 "Pitch is not the same as the row size"); | |
197 } | |
198 else | |
199 { | |
200 Setup(image.GetFormat(), image.GetWidth(), image.GetHeight(), | |
201 isLinearInterpolation, image.GetConstBuffer()); | |
202 } | |
203 } | |
579
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
204 |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
205 |
2039 | 206 void OpenGLTexture::Bind(GLint location) const |
579
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
207 { |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
208 glActiveTexture(GL_TEXTURE0); |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
209 glBindTexture(GL_TEXTURE_2D, texture_); |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
210 glUniform1i(location, 0 /* texture unit */); |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
211 } |
2032
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
212 |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
213 |
2042
0fa4c0ca429d
added OpenGLTexture::BindAsTextureUnit()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2039
diff
changeset
|
214 void OpenGLTexture::BindAsTextureUnit(GLint location, |
0fa4c0ca429d
added OpenGLTexture::BindAsTextureUnit()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2039
diff
changeset
|
215 unsigned int unit) const |
0fa4c0ca429d
added OpenGLTexture::BindAsTextureUnit()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2039
diff
changeset
|
216 { |
0fa4c0ca429d
added OpenGLTexture::BindAsTextureUnit()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2039
diff
changeset
|
217 if (unit >= 32) |
0fa4c0ca429d
added OpenGLTexture::BindAsTextureUnit()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2039
diff
changeset
|
218 { |
0fa4c0ca429d
added OpenGLTexture::BindAsTextureUnit()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2039
diff
changeset
|
219 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); |
0fa4c0ca429d
added OpenGLTexture::BindAsTextureUnit()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2039
diff
changeset
|
220 } |
0fa4c0ca429d
added OpenGLTexture::BindAsTextureUnit()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2039
diff
changeset
|
221 |
0fa4c0ca429d
added OpenGLTexture::BindAsTextureUnit()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2039
diff
changeset
|
222 assert(GL_TEXTURE0 + 1 == GL_TEXTURE1 && |
0fa4c0ca429d
added OpenGLTexture::BindAsTextureUnit()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2039
diff
changeset
|
223 GL_TEXTURE0 + 31 == GL_TEXTURE31); |
0fa4c0ca429d
added OpenGLTexture::BindAsTextureUnit()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2039
diff
changeset
|
224 |
0fa4c0ca429d
added OpenGLTexture::BindAsTextureUnit()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2039
diff
changeset
|
225 glActiveTexture(GL_TEXTURE0 + unit); |
0fa4c0ca429d
added OpenGLTexture::BindAsTextureUnit()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2039
diff
changeset
|
226 glBindTexture(GL_TEXTURE_2D, texture_); |
0fa4c0ca429d
added OpenGLTexture::BindAsTextureUnit()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2039
diff
changeset
|
227 glUniform1i(location, unit /* texture unit */); |
0fa4c0ca429d
added OpenGLTexture::BindAsTextureUnit()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2039
diff
changeset
|
228 } |
0fa4c0ca429d
added OpenGLTexture::BindAsTextureUnit()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2039
diff
changeset
|
229 |
0fa4c0ca429d
added OpenGLTexture::BindAsTextureUnit()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2039
diff
changeset
|
230 |
2039 | 231 Orthanc::ImageAccessor* OpenGLTexture::Download(Orthanc::PixelFormat format) const |
2032
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
232 { |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
233 if (context_.IsContextLost()) |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
234 { |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
235 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
236 "OpenGL context is lost"); |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
237 } |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
238 |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
239 std::unique_ptr<Orthanc::ImageAccessor> target(new Orthanc::Image(format, width_, height_, true)); |
2033
23b0a42eea85
added support for floating-point images in OpenGLTexture
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2032
diff
changeset
|
240 assert(target->GetPitch() == width_ * Orthanc::GetBytesPerPixel(format)); |
2032
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
241 |
2044 | 242 #if defined(__EMSCRIPTEN__) |
243 /** | |
244 * The "glGetTexImage()" is unavailable in WebGL, it is | |
245 * necessary to use a framebuffer: | |
246 * https://stackoverflow.com/a/15064957 | |
247 **/ | |
248 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); | |
249 | |
250 #else | |
2032
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
251 glBindTexture(GL_TEXTURE_2D, texture_); |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
252 |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
253 switch (format) |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
254 { |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
255 case Orthanc::PixelFormat_Grayscale8: |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
256 glGetTexImage(GL_TEXTURE_2D, 0 /* base level */, GL_RED, GL_UNSIGNED_BYTE, target->GetBuffer()); |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
257 break; |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
258 |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
259 case Orthanc::PixelFormat_RGB24: |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
260 glGetTexImage(GL_TEXTURE_2D, 0 /* base level */, GL_RGB, GL_UNSIGNED_BYTE, target->GetBuffer()); |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
261 break; |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
262 |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
263 case Orthanc::PixelFormat_RGBA32: |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
264 glGetTexImage(GL_TEXTURE_2D, 0 /* base level */, GL_RGBA, GL_UNSIGNED_BYTE, target->GetBuffer()); |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
265 break; |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
266 |
2033
23b0a42eea85
added support for floating-point images in OpenGLTexture
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2032
diff
changeset
|
267 case Orthanc::PixelFormat_Float32: |
23b0a42eea85
added support for floating-point images in OpenGLTexture
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2032
diff
changeset
|
268 glGetTexImage(GL_TEXTURE_2D, 0 /* base level */, GL_RED, GL_FLOAT, target->GetBuffer()); |
23b0a42eea85
added support for floating-point images in OpenGLTexture
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2032
diff
changeset
|
269 break; |
23b0a42eea85
added support for floating-point images in OpenGLTexture
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2032
diff
changeset
|
270 |
2032
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
271 default: |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
272 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented); |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
273 } |
2044 | 274 #endif |
2032
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
275 |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
276 return target.release(); |
d10bab7cc396
added OpenGLTexture::Download()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
1871
diff
changeset
|
277 } |
2035
a73a8415780f
added OpenGLTexture::SetClampingToZero()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2034
diff
changeset
|
278 |
a73a8415780f
added OpenGLTexture::SetClampingToZero()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2034
diff
changeset
|
279 |
a73a8415780f
added OpenGLTexture::SetClampingToZero()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2034
diff
changeset
|
280 void OpenGLTexture::SetClampingToZero() |
a73a8415780f
added OpenGLTexture::SetClampingToZero()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2034
diff
changeset
|
281 { |
2056
66c130af0d3c
OpenGLTexture::SetClampingToZero() is not available in wasm
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2048
diff
changeset
|
282 #if defined(__EMSCRIPTEN__) |
66c130af0d3c
OpenGLTexture::SetClampingToZero() is not available in wasm
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2048
diff
changeset
|
283 /** |
66c130af0d3c
OpenGLTexture::SetClampingToZero() is not available in wasm
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2048
diff
changeset
|
284 * This is because WebGL 2 derives from OpenGL ES 3.0, which |
66c130af0d3c
OpenGLTexture::SetClampingToZero() is not available in wasm
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2048
diff
changeset
|
285 * doesn't support GL_CLAMP_TO_BORDER, as can be seen here: |
66c130af0d3c
OpenGLTexture::SetClampingToZero() is not available in wasm
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2048
diff
changeset
|
286 * https://registry.khronos.org/OpenGL-Refpages/es3.0/html/glTexParameter.xhtml |
66c130af0d3c
OpenGLTexture::SetClampingToZero() is not available in wasm
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2048
diff
changeset
|
287 **/ |
2060
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2058
diff
changeset
|
288 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2058
diff
changeset
|
289 "OpenGLTextureArray::SetClampingToZero() is not available in WebGL 2"); |
2056
66c130af0d3c
OpenGLTexture::SetClampingToZero() is not available in wasm
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2048
diff
changeset
|
290 #else |
2060
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2058
diff
changeset
|
291 ORTHANC_OPENGL_CHECK("Entering OpenGLTexture::SetClampingToZero()"); |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2058
diff
changeset
|
292 |
2035
a73a8415780f
added OpenGLTexture::SetClampingToZero()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2034
diff
changeset
|
293 glBindTexture(GL_TEXTURE_2D, texture_); |
a73a8415780f
added OpenGLTexture::SetClampingToZero()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2034
diff
changeset
|
294 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); |
a73a8415780f
added OpenGLTexture::SetClampingToZero()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2034
diff
changeset
|
295 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); |
a73a8415780f
added OpenGLTexture::SetClampingToZero()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2034
diff
changeset
|
296 |
a73a8415780f
added OpenGLTexture::SetClampingToZero()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2034
diff
changeset
|
297 GLfloat colorfv[4] = { 0, 0, 0, 0 }; |
a73a8415780f
added OpenGLTexture::SetClampingToZero()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2034
diff
changeset
|
298 glTextureParameterfv(texture_, GL_TEXTURE_BORDER_COLOR, colorfv); |
2060
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2058
diff
changeset
|
299 |
86e0e92a2e0d
added OpenGLTextureArray and OpenGLFramebuffer
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2058
diff
changeset
|
300 ORTHANC_OPENGL_CHECK("Exiting OpenGLTexture::SetClampingToZero()"); |
2056
66c130af0d3c
OpenGLTexture::SetClampingToZero() is not available in wasm
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2048
diff
changeset
|
301 #endif |
2035
a73a8415780f
added OpenGLTexture::SetClampingToZero()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2034
diff
changeset
|
302 } |
2037
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
303 |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
304 |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
305 void OpenGLTexture::ConvertToOpenGLFormats(GLenum& sourceFormat, |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
306 GLenum& internalFormat, |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
307 GLenum& pixelType, |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
308 Orthanc::PixelFormat format) |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
309 { |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
310 switch (format) |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
311 { |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
312 case Orthanc::PixelFormat_Grayscale8: |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
313 sourceFormat = GL_RED; |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
314 internalFormat = GL_RED; |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
315 pixelType = GL_UNSIGNED_BYTE; |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
316 break; |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
317 |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
318 case Orthanc::PixelFormat_RGB24: |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
319 sourceFormat = GL_RGB; |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
320 internalFormat = GL_RGB; |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
321 pixelType = GL_UNSIGNED_BYTE; |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
322 break; |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
323 |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
324 case Orthanc::PixelFormat_RGBA32: |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
325 sourceFormat = GL_RGBA; |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
326 internalFormat = GL_RGBA; |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
327 pixelType = GL_UNSIGNED_BYTE; |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
328 break; |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
329 |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
330 case Orthanc::PixelFormat_Float32: |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
331 sourceFormat = GL_RED; |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
332 internalFormat = GL_R32F; // Don't use "GL_RED" here, as it clamps to [0,1] |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
333 pixelType = GL_FLOAT; |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
334 break; |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
335 |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
336 default: |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
337 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented, |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
338 "No support for this format in OpenGL textures: " + |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
339 std::string(EnumerationToString(format))); |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
340 } |
d81a7157a846
added OpenGLTexture::ConvertToOpenGLFormats()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
2036
diff
changeset
|
341 } |
579
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
342 } |
fadacfbf5538
OpenGL programs and textures
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff
changeset
|
343 } |