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
35using namespace o2::gpu;
36
37// Runtime minimum version defined in GPUDisplayFrontend.h, keep in sync!
38#define GPUCA_BUILD_EVENT_DISPLAY_OPENGL
39#if !defined(GL_VERSION_4_5) || GL_VERSION_4_5 != 1
40#ifdef GPUCA_STANDALONE
41// #error Unsupported OpenGL version < 4.5
42#elif defined(GPUCA_O2_LIB)
43#pragma message "Unsupported OpenGL version < 4.5, disabling standalone event display"
44#else
45#warning Unsupported OpenGL version < 4.5, disabling standalone event display
46#endif
47#undef GPUCA_BUILD_EVENT_DISPLAY_OPENGL
48#endif
49
50#ifdef GPUCA_BUILD_EVENT_DISPLAY_OPENGL
51
52#define CHKERR(cmd) \
53 do { \
54 (cmd); \
55 GLenum err = glGetError(); \
56 while (err != GL_NO_ERROR) { \
57 GPUError("OpenGL Error %d: %s (%s: %d)", (int32_t)err, (const char*)gluErrorString(err), __FILE__, __LINE__); \
58 throw std::runtime_error("OpenGL Failure"); \
59 } \
60 } while (false)
61
63{
64#ifndef GPUCA_NO_FMT
65 mMagneticFieldVisualization = std::make_unique<GPUDisplayMagneticField>();
66 mMagneticFieldVisualization->generateSeedPoints(mDisplay->cfgL().bFieldLinesCount);
67
70
73
74 const auto constantsExpanded = fmt::format(GPUDisplayShaders::fieldModelShaderConstants,
75 fmt::arg("dimensions", GPUDisplayMagneticField::DIMENSIONS),
88 fmt::arg("dipColumns", GPUDisplayMagneticField::MAX_DIPOLE_COLUMNS),
90 fmt::arg("maxChebOrder", GPUDisplayMagneticField::MAX_CHEBYSHEV_ORDER));
91
93
94 CHKERR(glShaderSource(mGeometryShader, geomShaderSource.size(), geomShaderSource.data(), nullptr));
96
98 return 1;
99 }
100
106
108 return 1;
109 }
110
111 const auto ATTRIB_ZERO = 0;
112 const auto BUFFER_IDX = 0;
113
117
120
122
123 CHKERR(glVertexArrayAttribBinding(VAO_field, ATTRIB_ZERO, BUFFER_IDX));
124
127
130
135
140#else
141 throw std::runtime_error("Magnetic field needs fmt");
142#endif
143
144 return 0;
145}
146
148{
150 return InitMagFieldVisualization(); // next frame will fill MVP matrix
151 }
152
153 if (mMagneticFieldVisualization->mFieldLineSeedPoints.size() != (uint32_t)mDisplay->cfgL().bFieldLinesCount) {
154 mMagneticFieldVisualization->generateSeedPoints(mDisplay->cfgL().bFieldLinesCount);
156 }
157
158 mMagneticFieldVisualization->mRenderConstantsUniform->StepSize = mDisplay->cfgL().bFieldStepSize;
159 mMagneticFieldVisualization->mRenderConstantsUniform->StepCount = mDisplay->cfgL().bFieldStepCount;
161
165 const std::array<float, 4> drawColor = {1.f, 0.f, 0.f, 1.f};
166 const auto color = glGetUniformLocation(mShaderProgramField, "color");
167 CHKERR(glUniform4fv(color, 1, drawColor.data()));
168
174
175 CHKERR(glDrawArrays(GL_POINTS, 0, mMagneticFieldVisualization->mFieldLineSeedPoints.size()));
176
179
180 return 0;
181}
182
184{
196}
197
198#else // GPUCA_BUILD_EVENT_DISPLAY_OPENGL
205#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:60
#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