Project
Loading...
Searching...
No Matches
GPUDisplayBackendOpenGLMagneticField.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
14
15#ifdef GPUCA_DISPLAY_GL3W
16#include "GL/gl3w.h"
17#else
18#include <GL/glew.h>
19#endif
20#if __has_include(<GL/glu.h>)
21#include <GL/glu.h>
22#else
23#define gluErrorString(err) ""
24#endif
25#ifndef GPUCA_NO_FMT
26#include <fmt/printf.h>
27#endif
28
29#include "GPUCommonDef.h"
33#include "GPUDisplay.h"
34#include "GPULogging.h"
35
36using namespace o2::gpu;
37
38// Runtime minimum version defined in GPUDisplayFrontend.h, keep in sync!
39#define GPUCA_BUILD_EVENT_DISPLAY_OPENGL
40#if !defined(GL_VERSION_4_5) || GL_VERSION_4_5 != 1
41#undef GPUCA_BUILD_EVENT_DISPLAY_OPENGL
42#endif
43
44#ifdef GPUCA_BUILD_EVENT_DISPLAY_OPENGL
45
46#define CHKERR(cmd) \
47 do { \
48 (cmd); \
49 GLenum err = glGetError(); \
50 while (err != GL_NO_ERROR) { \
51 GPUError("OpenGL Error %d: %s (%s: %d)", (int32_t)err, (const char*)gluErrorString(err), __FILE__, __LINE__); \
52 throw std::runtime_error("OpenGL Failure"); \
53 } \
54 } while (false)
55
57{
58#ifndef GPUCA_NO_FMT
59 mMagneticFieldVisualization = std::make_unique<GPUDisplayMagneticField>();
60 mMagneticFieldVisualization->generateSeedPoints(mDisplay->cfgL().bFieldLinesCount);
61
64
67
68 const auto constantsExpanded = fmt::format(GPUDisplayShaders::fieldModelShaderConstants,
69 fmt::arg("dimensions", GPUDisplayMagneticField::DIMENSIONS),
82 fmt::arg("dipColumns", GPUDisplayMagneticField::MAX_DIPOLE_COLUMNS),
84 fmt::arg("maxChebOrder", GPUDisplayMagneticField::MAX_CHEBYSHEV_ORDER));
85
87
88 CHKERR(glShaderSource(mGeometryShader, geomShaderSource.size(), geomShaderSource.data(), nullptr));
90
92 return 1;
93 }
94
100
102 return 1;
103 }
104
105 const auto ATTRIB_ZERO = 0;
106 const auto BUFFER_IDX = 0;
107
111
114
116
117 CHKERR(glVertexArrayAttribBinding(VAO_field, ATTRIB_ZERO, BUFFER_IDX));
118
121
124
129
134#else
135 throw std::runtime_error("Magnetic field needs fmt");
136#endif
137
138 return 0;
139}
140
142{
144 return InitMagFieldVisualization(); // next frame will fill MVP matrix
145 }
146
147 if (mMagneticFieldVisualization->mFieldLineSeedPoints.size() != (uint32_t)mDisplay->cfgL().bFieldLinesCount) {
148 mMagneticFieldVisualization->generateSeedPoints(mDisplay->cfgL().bFieldLinesCount);
150 }
151
152 mMagneticFieldVisualization->mRenderConstantsUniform->StepSize = mDisplay->cfgL().bFieldStepSize;
153 mMagneticFieldVisualization->mRenderConstantsUniform->StepCount = mDisplay->cfgL().bFieldStepCount;
155
159 const std::array<float, 4> drawColor = {1.f, 0.f, 0.f, 1.f};
160 const auto color = glGetUniformLocation(mShaderProgramField, "color");
161 CHKERR(glUniform4fv(color, 1, drawColor.data()));
162
168
169 CHKERR(glDrawArrays(GL_POINTS, 0, mMagneticFieldVisualization->mFieldLineSeedPoints.size()));
170
173
174 return 0;
175}
176
178{
190}
191
192#else // GPUCA_BUILD_EVENT_DISPLAY_OPENGL
199#endif // GPUCA_BUILD_EVENT_DISPLAY_OPENGL
#define CHKERR(cmd)
static int32_t checkProgramStatus(uint32_t program)
static int32_t checkShaderStatus(uint32_t shader)
std::unique_ptr< GPUDisplayMagneticField > mMagneticFieldVisualization
static constexpr std::size_t MAX_SOLENOID_R_SEGMENTS
static constexpr std::size_t MAX_DIPOLE_ROWS
static constexpr std::size_t MAX_CHEBYSHEV_ORDER
static constexpr std::size_t MAX_SOLENOID_COEFFICIENTS
static constexpr std::size_t MAX_DIPOLE_Y_SEGMENTS
static constexpr std::size_t MAX_DIPOLE_PARAMETERIZATIONS
static constexpr std::size_t MAX_DIPOLE_X_SEGMENTS
static constexpr std::size_t DIMENSIONS
static constexpr std::size_t MAX_DIPOLE_Z_SEGMENTS
static constexpr std::size_t MAX_DIPOLE_COLUMNS
static constexpr std::size_t MAX_SOLENOID_COLUMNS
static constexpr std::size_t MAX_SOLENOID_P_SEGMENTS
static constexpr std::size_t MAX_SOLENOID_Z_SEGMENTS
static constexpr std::size_t MAX_SOLENOID_PARAMETERIZATIONS
static constexpr std::size_t MAX_DIPOLE_COEFFICIENTS
static constexpr std::size_t MAX_SOLENOID_ROWS
const GPUSettingsDisplayLight & cfgL() const
Definition GPUDisplay.h:65
#define glVertexArrayAttribBinding
Definition gl3w.h:1290
#define glNamedBufferData
Definition gl3w.h:1077
#define glAttachShader
Definition gl3w.h:727
#define glGetUniformLocation
Definition gl3w.h:1015
#define glDeleteVertexArrays
Definition gl3w.h:842
#define glCreateBuffers
Definition gl3w.h:815
#define glUniform4fv
Definition gl3w.h:1259
#define glShaderSource
Definition gl3w.h:1181
#define glBindVertexArray
Definition gl3w.h:751
#define glCreateShader
Definition gl3w.h:822
#define glDeleteBuffers
Definition gl3w.h:831
#define glCreateVertexArrays
Definition gl3w.h:826
#define glBindBufferBase
Definition gl3w.h:734
#define glDrawArrays
Definition gl3w.h:856
#define glDeleteProgram
Definition gl3w.h:833
#define glNamedBufferSubData
Definition gl3w.h:1079
#define glDeleteShader
Definition gl3w.h:838
#define glVertexArrayVertexBuffer
Definition gl3w.h:1296
#define glCompileShader
Definition gl3w.h:794
#define glCreateProgram
Definition gl3w.h:817
#define glLinkProgram
Definition gl3w.h:1061
#define glVertexArrayAttribFormat
Definition gl3w.h:1291
#define glUseProgram
Definition gl3w.h:1286
#define glEnableVertexArrayAttrib
Definition gl3w.h:876
#define GL_UNIFORM_BUFFER
Definition glcorearb.h:1435
#define GL_GEOMETRY_SHADER
Definition glcorearb.h:1511
GLuint color
Definition glcorearb.h:1272
#define GL_SHADER_STORAGE_BUFFER
Definition glcorearb.h:2447
#define GL_FLOAT
Definition glcorearb.h:211
#define GL_POINTS
Definition glcorearb.h:96
#define GL_STREAM_DRAW
Definition glcorearb.h:636
#define GL_STATIC_DRAW
Definition glcorearb.h:639
#define GL_FALSE
Definition glcorearb.h:94
#define GL_VERTEX_SHADER
Definition glcorearb.h:729
static constexpr const char * vertexShaderPassthrough
static constexpr const char * geometryShaderP2
static constexpr const char * fieldModelShaderConstants
static constexpr const char * geometryShaderP1
static constexpr const char * fieldModelShaderCode