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#include "HandMadeMath.h"
26
27#include "GPUCommonDef.h"
30#include "GPUDisplay.h"
31#include "GPULogging.h"
32
33using namespace o2::gpu;
34
35#define GPUCA_DISPLAY_SHADER_TYPE_OPENGL
36#include "GPUDisplayLoadShaders.h"
37
38#define CHKERR(cmd) \
39 do { \
40 (cmd); \
41 GLenum err = glGetError(); \
42 while (err != GL_NO_ERROR) { \
43 GPUError("OpenGL Error %d: %s (%s: %d)", (int32_t)err, (const char*)gluErrorString(err), __FILE__, __LINE__); \
44 throw std::runtime_error("OpenGL Failure"); \
45 } \
46 } while (false)
47
49{
50 mMagneticFieldVisualization = std::make_unique<GPUDisplayMagneticField>();
51 if (!mMagneticFieldVisualization->mValid) {
52 GPUError("Magnetic field data not available, field drawing disabled");
54 return 1;
55 }
56 mMagneticFieldVisualization->generateSeedPoints(mDisplay->cfgL().bFieldLinesCount);
57
58 CHKERR(mVertexShaderPassthrough = loadShader(GL_VERTEX_SHADER, _binary_opengl_vertexPassthrough_vert_spv_start, _binary_opengl_vertexPassthrough_vert_spv_len));
59 CHKERR(mGeometryShader = loadShader(GL_GEOMETRY_SHADER, _binary_opengl_field_geom_spv_start, _binary_opengl_field_geom_spv_len));
60
63 return 1;
64 }
65
71
74 return 1;
75 }
76
77 const auto ATTRIB_ZERO = 0;
78 const auto BUFFER_IDX = 0;
79
83
86
88
89 CHKERR(glVertexArrayAttribBinding(VAO_field, ATTRIB_ZERO, BUFFER_IDX));
90
93
96
101
106
107 return 0;
108}
109
111{
115 }
116 return 0; // next frame will fill MVP matrix
117 }
118
119 if (mMagneticFieldVisualization->mFieldLineSeedPoints.size() != (uint32_t)mDisplay->cfgL().bFieldLinesCount) {
120 mMagneticFieldVisualization->generateSeedPoints(mDisplay->cfgL().bFieldLinesCount);
122 }
123
124 mMagneticFieldVisualization->mRenderConstantsUniform->StepSize = mDisplay->cfgL().bFieldStepSize;
125 mMagneticFieldVisualization->mRenderConstantsUniform->StepCount = mDisplay->cfgL().bFieldStepCount;
127
131 const std::array<float, 4> drawColor = {1.f, 0.f, 0.f, 1.f};
132 CHKERR(glUniform4fv(UNIFORM_LOCATION_COLOR, 1, drawColor.data()));
133
139
140 CHKERR(glDrawArrays(GL_POINTS, 0, mMagneticFieldVisualization->mFieldLineSeedPoints.size()));
141
144
145 return 0;
146}
147
#define CHKERR(cmd)
static uint32_t loadShader(uint32_t type, const char *spirv, size_t size)
static int32_t checkProgramStatus(uint32_t program)
static int32_t checkShaderStatus(uint32_t shader)
static constexpr int32_t UNIFORM_LOCATION_COLOR
std::unique_ptr< GPUDisplayMagneticField > mMagneticFieldVisualization
const GPUSettingsDisplayLight & cfgL() const
Definition GPUDisplay.h:69
#define glVertexArrayAttribBinding
Definition gl3w.h:1290
#define glNamedBufferData
Definition gl3w.h:1077
#define glAttachShader
Definition gl3w.h:727
#define glDeleteVertexArrays
Definition gl3w.h:842
#define glCreateBuffers
Definition gl3w.h:815
#define glUniform4fv
Definition gl3w.h:1259
#define glBindVertexArray
Definition gl3w.h:751
#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 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
#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