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#ifdef GPUCA_STANDALONE
42// #error Unsupported OpenGL version < 4.5
43#elif defined(GPUCA_O2_LIB)
44#pragma message "Unsupported OpenGL version < 4.5, disabling standalone event display"
45#else
46#warning Unsupported OpenGL version < 4.5, disabling standalone event display
47#endif
48#undef GPUCA_BUILD_EVENT_DISPLAY_OPENGL
49#endif
50
51#ifdef GPUCA_BUILD_EVENT_DISPLAY_OPENGL
52
53#define CHKERR(cmd) \
54 do { \
55 (cmd); \
56 GLenum err = glGetError(); \
57 while (err != GL_NO_ERROR) { \
58 GPUError("OpenGL Error %d: %s (%s: %d)", (int32_t)err, (const char*)gluErrorString(err), __FILE__, __LINE__); \
59 throw std::runtime_error("OpenGL Failure"); \
60 } \
61 } while (false)
62
64{
65#ifndef GPUCA_NO_FMT
66 mMagneticFieldVisualization = std::make_unique<GPUDisplayMagneticField>();
67 mMagneticFieldVisualization->generateSeedPoints(mDisplay->cfgL().bFieldLinesCount);
68
71
74
75 const auto constantsExpanded = fmt::format(GPUDisplayShaders::fieldModelShaderConstants,
76 fmt::arg("dimensions", GPUDisplayMagneticField::DIMENSIONS),
89 fmt::arg("dipColumns", GPUDisplayMagneticField::MAX_DIPOLE_COLUMNS),
91 fmt::arg("maxChebOrder", GPUDisplayMagneticField::MAX_CHEBYSHEV_ORDER));
92
94
95 CHKERR(glShaderSource(mGeometryShader, geomShaderSource.size(), geomShaderSource.data(), nullptr));
97
99 return 1;
100 }
101
107
109 return 1;
110 }
111
112 const auto ATTRIB_ZERO = 0;
113 const auto BUFFER_IDX = 0;
114
118
121
123
124 CHKERR(glVertexArrayAttribBinding(VAO_field, ATTRIB_ZERO, BUFFER_IDX));
125
128
131
136
141#else
142 throw std::runtime_error("Magnetic field needs fmt");
143#endif
144
145 return 0;
146}
147
149{
151 return InitMagFieldVisualization(); // next frame will fill MVP matrix
152 }
153
154 if (mMagneticFieldVisualization->mFieldLineSeedPoints.size() != (uint32_t)mDisplay->cfgL().bFieldLinesCount) {
155 mMagneticFieldVisualization->generateSeedPoints(mDisplay->cfgL().bFieldLinesCount);
157 }
158
159 mMagneticFieldVisualization->mRenderConstantsUniform->StepSize = mDisplay->cfgL().bFieldStepSize;
160 mMagneticFieldVisualization->mRenderConstantsUniform->StepCount = mDisplay->cfgL().bFieldStepCount;
162
166 const std::array<float, 4> drawColor = {1.f, 0.f, 0.f, 1.f};
167 const auto color = glGetUniformLocation(mShaderProgramField, "color");
168 CHKERR(glUniform4fv(color, 1, drawColor.data()));
169
175
176 CHKERR(glDrawArrays(GL_POINTS, 0, mMagneticFieldVisualization->mFieldLineSeedPoints.size()));
177
180
181 return 0;
182}
183
185{
197}
198
199#else // GPUCA_BUILD_EVENT_DISPLAY_OPENGL
206#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:59
#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