Project
Loading...
Searching...
No Matches
GPUDisplayBackendOpenGL.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
26#include "GPUCommonDef.h"
29#include "GPUDisplay.h"
30#include "GPULogging.h"
31#include "GPUParam.h"
32
33#define OPENGL_EMULATE_MULTI_DRAW 0
34
35using namespace o2::gpu;
36
37#ifdef GPUCA_BUILD_EVENT_DISPLAY_VULKAN
39QGET_LD_BINARY_SYMBOLS(shaders_shaders_vertex_vert_spv);
40QGET_LD_BINARY_SYMBOLS(shaders_shaders_fragmentUniform_frag_spv);
41#endif
42
43// Runtime minimum version defined in GPUDisplayFrontend.h, keep in sync!
44#define GPUCA_BUILD_EVENT_DISPLAY_OPENGL
45#if !defined(GL_VERSION_4_5) || GL_VERSION_4_5 != 1
46#ifdef GPUCA_STANDALONE
47// #error Unsupported OpenGL version < 4.5
48#elif defined(GPUCA_O2_LIB)
49#pragma message "Unsupported OpenGL version < 4.5, disabling standalone event display"
50#else
51#warning Unsupported OpenGL version < 4.5, disabling standalone event display
52#endif
53#undef GPUCA_BUILD_EVENT_DISPLAY_OPENGL
54#endif
55
56#ifdef GPUCA_BUILD_EVENT_DISPLAY_OPENGL
57
59{
61 mBackendName = "OpenGL";
62}
63
65{
66#ifdef GPUCA_DISPLAY_GL3W
67 return gl3wInit();
68#else
69 return glewInit();
70#endif
71}
72
74{
75#ifdef GPUCA_DISPLAY_OPENGL_CORE
76 return true;
77#else
78 return false;
79#endif
80}
81
82// #define CHKERR(cmd) {cmd;}
83#define CHKERR(cmd) \
84 do { \
85 (cmd); \
86 GLenum err = glGetError(); \
87 while (err != GL_NO_ERROR) { \
88 GPUError("OpenGL Error %d: %s (%s: %d)", (int32_t)err, (const char*)gluErrorString(err), __FILE__, __LINE__); \
89 throw std::runtime_error("OpenGL Failure"); \
90 } \
91 } while (false)
92
94{
95 GLint depthBits = 0;
96#ifndef GPUCA_DISPLAY_OPENGL_CORE
97 glGetIntegerv(GL_DEPTH_BITS, &depthBits);
98#endif
99 return depthBits;
100}
101
102void GPUDisplayBackendOpenGL::createFB(GLfb& fb, bool tex, bool withDepth, bool msaa, uint32_t width, uint32_t height)
103{
104 fb.tex = tex;
105 fb.depth = withDepth;
106 fb.msaa = msaa;
107 GLint drawFboId = 0, readFboId = 0;
112
113 auto createFB_texture = [&](GLuint& id, GLenum storage, GLenum attachment) {
115 CHKERR(glGenTextures(1, &id));
116 CHKERR(glBindTexture(textureType, id));
117 if (fb.msaa) {
118 CHKERR(glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, mDisplay->cfgR().drawQualityMSAA, storage, width, height, false));
119 } else {
120 CHKERR(glTexImage2D(GL_TEXTURE_2D, 0, storage, width, height, 0, storage, GL_UNSIGNED_BYTE, nullptr));
123 }
125 };
126
127 auto createFB_renderbuffer = [&](GLuint& id, GLenum storage, GLenum attachment) {
128 CHKERR(glGenRenderbuffers(1, &id));
130 if (fb.msaa) {
132 } else {
134 }
136 };
137
138 if (tex) {
139 createFB_texture(fb.fbCol_id, GL_RGBA, GL_COLOR_ATTACHMENT0);
140 } else {
141 createFB_renderbuffer(fb.fbCol_id, GL_RGBA, GL_COLOR_ATTACHMENT0);
142 }
143
144 if (withDepth) {
145 if (tex && fb.msaa) {
147 } else {
148 createFB_renderbuffer(fb.fbDepth_id, GL_DEPTH_COMPONENT24, GL_DEPTH_ATTACHMENT);
149 }
150 }
151
153 if (status != GL_FRAMEBUFFER_COMPLETE) {
154 GPUError("Error creating framebuffer (tex %d) - incomplete (%d)", (int32_t)tex, status);
155 exit(1);
156 }
159 fb.created = true;
160}
161
163{
164 if (fb.tex) {
166 } else {
168 }
169 if (fb.depth) {
170 if (fb.tex && fb.msaa) {
172 } else {
174 }
175 }
177 fb.created = false;
178}
179
180uint32_t GPUDisplayBackendOpenGL::drawVertices(const vboList& v, const drawType tt)
181{
182 static constexpr GLenum types[3] = {GL_POINTS, GL_LINES, GL_LINE_STRIP};
183 GLenum t = types[tt];
184 auto first = std::get<0>(v);
185 auto count = std::get<1>(v);
186 auto iSector = std::get<2>(v);
187 if (count == 0) {
188 return 0;
189 }
190
191 if (mDisplay->useMultiVBO()) {
192 if (mDisplay->cfgR().openGLCore) {
194 }
196#ifndef GPUCA_DISPLAY_OPENGL_CORE
197 if (!mDisplay->cfgR().openGLCore) {
198 CHKERR(glVertexPointer(3, GL_FLOAT, 0, nullptr));
199 } else
200#endif
201 {
202 CHKERR(glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, nullptr));
204 }
205 }
206
207 if (mDisplay->cfgR().useGLIndirectDraw) {
208 CHKERR(glMultiDrawArraysIndirect(t, (void*)(size_t)((mIndirectSectorOffset[iSector] + first) * sizeof(DrawArraysIndirectCommand)), count, 0));
209 } else if (OPENGL_EMULATE_MULTI_DRAW) {
210 for (uint32_t k = 0; k < count; k++) {
211 CHKERR(glDrawArrays(t, mDisplay->vertexBufferStart()[iSector][first + k], mDisplay->vertexBufferCount()[iSector][first + k]));
212 }
213 } else {
214 static_assert(sizeof(GLsizei) == sizeof(*mDisplay->vertexBufferCount()[iSector].data()), "Invalid counter size does not match GLsizei");
215 CHKERR(glMultiDrawArrays(t, mDisplay->vertexBufferStart()[iSector].data() + first, ((const GLsizei*)mDisplay->vertexBufferCount()[iSector].data()) + first, count));
216 }
217 return count;
218}
219
220void GPUDisplayBackendOpenGL::ActivateColor(std::array<float, 4>& color)
221{
222#ifndef GPUCA_DISPLAY_OPENGL_CORE
223 if (!mDisplay->cfgR().openGLCore) {
224 glColor4f(color[0], color[1], color[2], color[3]);
225 } else
226#endif
227 {
228 if (mSPIRVShaders) {
232 } else {
234 }
235 }
236}
237
239{
240 if (mDisplay->cfgR().drawQualityMSAA > 1) {
242 } else {
244 }
245}
246
248{
249 if (mDisplay->cfgL().depthBuffer) {
250 CHKERR(glEnable(GL_DEPTH_TEST)); // Enables Depth Testing
251 CHKERR(glDepthFunc(GL_LEQUAL)); // The Type Of Depth Testing To Do
252 } else {
254 }
255}
256
258{
259 if (newID == 0) {
262 } else {
264 GLenum drawBuffer = GL_COLOR_ATTACHMENT0;
265 glDrawBuffers(1, &drawBuffer);
266 }
267}
268
270{
271 int32_t status, loglen;
273 if (!status) {
274 printf("failed to compile shader\n");
276 std::vector<char> buf(loglen + 1);
277 glGetShaderInfoLog(shader, loglen, nullptr, buf.data());
278 buf[loglen] = 0;
279 printf("%s\n", buf.data());
280 return 1;
281 }
282 return 0;
283}
284
286{
287 int32_t status, loglen;
289 if (!status) {
290 printf("failed to link program\n");
292 std::vector<char> buf(loglen + 1);
293 glGetProgramInfoLog(program, loglen, nullptr, buf.data());
294 buf[loglen] = 0;
295 printf("%s\n", buf.data());
296 return 1;
297 }
298 return 0;
299}
300
302{
303 if (mDisplay->GetProcessingSettings().debugLevel >= 2) {
304 auto renderer = glGetString(GL_RENDERER);
305 GPUInfo("Renderer: %s", (const char*)renderer);
306 }
307
308 int32_t glVersion[2] = {0, 0};
309 glGetIntegerv(GL_MAJOR_VERSION, &glVersion[0]);
310 glGetIntegerv(GL_MINOR_VERSION, &glVersion[1]);
312 GPUError("Unsupported OpenGL runtime %d.%d < %d.%d", glVersion[0], glVersion[1], GPUDisplayFrontend::GL_MIN_VERSION_MAJOR, GPUDisplayFrontend::GL_MIN_VERSION_MINOR);
313 return (1);
314 }
315 mVBOId.resize(GPUCA_NSECTORS);
316 CHKERR(glCreateBuffers(mVBOId.size(), mVBOId.data()));
320#ifndef GPUCA_DISPLAY_OPENGL_CORE
321 CHKERR(glShadeModel(GL_SMOOTH)); // Enable Smooth Shading
322#endif
324 setQuality();
330#if defined(GL_VERSION_4_6) && GL_VERSION_4_6 == 1 && defined(GPUCA_BUILD_EVENT_DISPLAY_VULKAN)
331 if (getenv("USE_SPIRV_SHADERS") && atoi(getenv("USE_SPIRV_SHADERS"))) {
332 CHKERR(glShaderBinary(1, &mVertexShader, GL_SHADER_BINARY_FORMAT_SPIR_V_ARB, _binary_shaders_shaders_vertex_vert_spv_start, _binary_shaders_shaders_vertex_vert_spv_len));
333 CHKERR(glSpecializeShader(mVertexShader, "main", 0, 0, 0));
334 CHKERR(glShaderBinary(1, &mFragmentShader, GL_SHADER_BINARY_FORMAT_SPIR_V_ARB, _binary_shaders_shaders_fragmentUniform_frag_spv_start, _binary_shaders_shaders_fragmentUniform_frag_spv_len));
335 CHKERR(glSpecializeShader(mFragmentShader, "main", 0, 0, 0));
336 GPUInfo("Using SPIR-V shaders");
337 mSPIRVShaders = true;
338 } else
339#endif
340 {
345 }
353 return 1;
354 }
360 return 1;
361 }
362 if (mSPIRVShaders) {
365 } else {
368 }
374 return 1;
375 }
383 return 1;
384 }
388
393 CHKERR(glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 6 * 4, nullptr, GL_DYNAMIC_DRAW));
395 CHKERR(glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(float), nullptr));
397
399 return 0;
400}
401
403{
405 CHKERR(glDeleteBuffers(mVBOId.size(), mVBOId.data()));
415
417
420
424 for (auto& symbol : mFontSymbols) {
425 CHKERR(glDeleteTextures(1, &symbol.texId));
426 }
427 }
428 if (mSPIRVShaders) {
431 }
434 }
435}
436
437void GPUDisplayBackendOpenGL::clearScreen(bool alphaOnly)
438{
439 if (mDisplay->cfgL().invertColors && !alphaOnly) {
440 CHKERR(glClearColor(1.0f, 1.0f, 1.0f, 1.0f));
441 } else {
442 CHKERR(glClearColor(0.0f, 0.0f, 0.0f, 1.0f));
443 }
444 if (alphaOnly) {
445 glColorMask(false, false, false, true);
447 glColorMask(true, true, true, true);
448 } else {
449 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer
450 }
451}
452
453void GPUDisplayBackendOpenGL::loadDataToGPU(size_t totalVertizes)
454{
455 // TODO: Check if this can be parallelized
456 if (mDisplay->useMultiVBO()) {
457 for (int32_t i = 0; i < GPUCA_NSECTORS; i++) {
459 }
460 } else {
461 CHKERR(glBindBuffer(GL_ARRAY_BUFFER, mVBOId[0])); // Bind ahead of time, since it is not going to change
462 CHKERR(glNamedBufferData(mVBOId[0], totalVertizes * sizeof(mDisplay->vertexBuffer()[0][0]), mDisplay->vertexBuffer()[0].data(), GL_STATIC_DRAW));
463 }
464
465 if (mDisplay->cfgR().useGLIndirectDraw) {
468 mCmdBuffer.clear();
469 }
470}
471
472void GPUDisplayBackendOpenGL::prepareDraw(const hmm_mat4& proj, const hmm_mat4& view, bool requestScreenshot, bool toMixBuffer, float includeMixImage)
473{
474 if (mDisplay->updateRenderPipeline() || mDownsampleFactor != getDownsampleFactor(requestScreenshot)) {
475 updateRenderer(requestScreenshot);
476 }
479 } else if (toMixBuffer) {
481 } else if (mOffscreenBuffer.created) {
483 } else {
485 }
486 clearScreen();
487#ifndef GPUCA_DISPLAY_OPENGL_CORE
488 if (mDisplay->cfgL().smoothPoints && !mDisplay->cfgR().openGLCore) {
489 CHKERR(glEnable(GL_POINT_SMOOTH));
490 } else {
491 CHKERR(glDisable(GL_POINT_SMOOTH));
492 }
493 if (mDisplay->cfgL().smoothLines && !mDisplay->cfgR().openGLCore) {
495 } else {
497 }
498#endif
501
503#ifndef GPUCA_DISPLAY_OPENGL_CORE
504 if (!mDisplay->cfgR().openGLCore) {
505 CHKERR(glEnableClientState(GL_VERTEX_ARRAY));
506 CHKERR(glVertexPointer(3, GL_FLOAT, 0, nullptr));
507 } else
508#endif
509 {
512 CHKERR(glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, nullptr));
514 }
515#ifndef GPUCA_DISPLAY_OPENGL_CORE
516 if (!mDisplay->cfgR().openGLCore) {
517 CHKERR(glMatrixMode(GL_PROJECTION));
518 CHKERR(glLoadMatrixf(&proj.Elements[0][0]));
519 CHKERR(glMatrixMode(GL_MODELVIEW));
520 CHKERR(glLoadMatrixf(&view.Elements[0][0]));
521 } else
522#endif
523 {
524 const hmm_mat4 modelViewProj = proj * view;
525 if (mSPIRVShaders) {
527 glBufferData(GL_UNIFORM_BUFFER, sizeof(modelViewProj), &modelViewProj, GL_STATIC_DRAW);
529 } else {
530 CHKERR(glUniformMatrix4fv(mModelViewProjId, 1, GL_FALSE, &modelViewProj.Elements[0][0]));
531 }
533 CHKERR(glNamedBufferSubData(mFieldModelViewBuffer, 0, sizeof(modelViewProj), &modelViewProj));
534 }
535 }
536}
537
538void GPUDisplayBackendOpenGL::finishDraw(bool doScreenshot, bool toMixBuffer, float includeMixImage)
539{
540#ifndef GPUCA_DISPLAY_OPENGL_CORE
541 if (!mDisplay->cfgR().openGLCore) {
542 CHKERR(glDisableClientState(GL_VERTEX_ARRAY));
543 } else
544#endif
545 {
548 }
549
550 if (mDisplay->cfgR().drawQualityMSAA) {
551 uint32_t dstId = toMixBuffer ? mMixBuffer.fb_id : (mDownsampleFactor != 1 ? mOffscreenBuffer.fb_id : 0);
553 }
554 if (includeMixImage > 0) {
556 mixImages(includeMixImage);
557 }
558 if (mDownsampleFactor != 1 && !toMixBuffer) {
560 }
561
562 if (doScreenshot && !toMixBuffer) {
564 }
565}
566
568{
569 int32_t scaleFactor = mDisplay->cfgR().screenshotScaleFactor;
570 uint32_t width = mScreenWidth * scaleFactor;
571 uint32_t height = mScreenHeight * scaleFactor;
572 GLfb tmpBuffer;
573 if (mDisplay->cfgR().drawQualityDownsampleFSAA && mDisplay->cfgR().screenshotScaleFactor != 1) {
574 createFB(tmpBuffer, false, true, false, width, height);
576 }
577 setFrameBuffer(tmpBuffer.created ? tmpBuffer.fb_id : (scaleFactor != 1 ? mOffscreenBuffer.fb_id : 0));
579 CHKERR(glReadBuffer(scaleFactor != 1 ? GL_COLOR_ATTACHMENT0 : GL_BACK));
580 mScreenshotPixels.resize(width * height * 4);
582 if (tmpBuffer.created) {
583 deleteFB(tmpBuffer);
584 }
585}
586
587void GPUDisplayBackendOpenGL::finishFrame(bool doScreenshot, bool toMixBuffer, float includeMixImage) {}
588
590{
593 hmm_mat4 proj = HMM_Orthographic(0.f, mScreenWidth, 0.f, mScreenHeight, -1, 1);
595#ifndef GPUCA_DISPLAY_OPENGL_CORE
596 glMatrixMode(GL_MODELVIEW);
597 glLoadIdentity();
598 glMatrixMode(GL_PROJECTION);
599 glLoadMatrixf(&proj.Elements[0][0]);
601#endif
602 } else if (mFreetypeInitialized) {
607 float color[4] = {1.0f, 1.0f, 1.0f, 1.0f};
609 }
610}
611
613{
618 }
619}
620
621void GPUDisplayBackendOpenGL::mixImages(float mixSlaveImage)
622{
623 hmm_mat4 proj = HMM_Orthographic(0.f, mRenderWidth, 0.f, mRenderHeight, -1.f, 1.f);
625#ifndef GPUCA_DISPLAY_OPENGL_CORE
626 if (!mDisplay->cfgR().openGLCore) {
627 glMatrixMode(GL_MODELVIEW);
628 glLoadIdentity();
629 glMatrixMode(GL_PROJECTION);
630 glLoadMatrixf(&proj.Elements[0][0]);
632 } else
633#endif
634 {
639 CHKERR(glUniform1f(mAlphaIdTexture, mixSlaveImage));
640 }
641
643
644#ifndef GPUCA_DISPLAY_OPENGL_CORE
645 if (!mDisplay->cfgR().openGLCore) {
646 glColor4f(1, 1, 1, mixSlaveImage);
647 glBegin(GL_QUADS);
648 glTexCoord2f(0, 0);
649 glVertex3f(0, 0, 0);
650 glTexCoord2f(0, 1);
651 glVertex3f(0, mRenderHeight, 0);
652 glTexCoord2f(1, 1);
653 glVertex3f(mRenderWidth, mRenderHeight, 0);
654 glTexCoord2f(1, 0);
655 glVertex3f(mRenderWidth, 0, 0);
656 glEnd();
657 glColor4f(1, 1, 1, 0);
659 } else
660#endif
661 {
665 }
668}
669
671{
672 CHKERR(glPointSize(mDisplay->cfgL().pointSize * mDownsampleFactor * factor));
673}
674
676{
677 CHKERR(glLineWidth(mDisplay->cfgL().lineWidth * mDownsampleFactor * factor));
678}
679
680void GPUDisplayBackendOpenGL::addFontSymbol(int32_t symbol, int32_t sizex, int32_t sizey, int32_t offsetx, int32_t offsety, int32_t advance, void* data)
681{
682 int32_t oldAlign;
685 if (symbol != (int32_t)mFontSymbols.size()) {
686 throw std::runtime_error("Incorrect symbol ID");
687 }
688 uint32_t texId;
689 glGenTextures(1, &texId);
690 std::vector<uint8_t> tmp;
691 if (!smoothFont()) {
692 tmp.resize(sizex * sizey);
693 uint8_t* src = (uint8_t*)data;
694 for (int32_t i = 0; i < sizex * sizey; i++) {
695 tmp[i] = src[i] > 128 ? 255 : 0;
696 }
697 data = tmp.data();
698 }
699 mFontSymbols.emplace_back(FontSymbolOpenGL{{{sizex, sizey}, {offsetx, offsety}, advance}, texId});
700 if (sizex == 0 || sizey == 0) {
701 return;
702 }
710}
711
713{
718 CHKERR(glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 6 * 4, nullptr, GL_DYNAMIC_DRAW));
720 CHKERR(glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(float), nullptr));
723}
724
725void GPUDisplayBackendOpenGL::OpenGLPrint(const char* s, float x, float y, float* color, float scale)
726{
728 return;
729 }
731
732 if (smoothFont()) {
733 scale *= 0.25f; // Font size is 48 to have nice bitmap, scale to size 12
734 }
735 for (const char* c = s; *c; c++) {
736 if ((int32_t)*c > (int32_t)mFontSymbols.size()) {
737 GPUError("Trying to draw unsupported symbol: %d > %d\n", (int32_t)*c, (int32_t)mFontSymbols.size());
738 continue;
739 }
740 FontSymbolOpenGL sym = mFontSymbols[*c];
741 if (sym.size[0] && sym.size[1]) {
742 float xpos = x + sym.offset[0] * scale;
743 float ypos = y - (sym.size[1] - sym.offset[1]) * scale;
744 float w = sym.size[0] * scale;
745 float h = sym.size[1] * scale;
746 float vertices[6][4] = {
747 {xpos, ypos + h, 0.0f, 0.0f},
748 {xpos, ypos, 0.0f, 1.0f},
749 {xpos + w, ypos, 1.0f, 1.0f},
750 {xpos, ypos + h, 0.0f, 0.0f},
751 {xpos + w, ypos, 1.0f, 1.0f},
752 {xpos + w, ypos + h, 1.0f, 0.0f}};
755 CHKERR(glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices));
758 }
759 x += (sym.advance >> 6) * scale; // shift is in 1/64th of a pixel
760 }
761 if (!mDisplay->useMultiVBO()) {
762 CHKERR(glBindBuffer(GL_ARRAY_BUFFER, mVBOId[0])); // If we don't use multiple buffers, we keep the default buffer bound
763 }
764}
765
767{
768 if (mMixBuffer.created) {
770 }
773 }
776 }
777}
778
780{
783
784 updateRenderer(false);
785
786 float vertices[6][4] = {
787 {0, (float)mRenderHeight, 0.0f, 1.0f},
788 {0, 0, 0.0f, 0.0f},
789 {(float)mRenderWidth, 0, 1.0f, 0.0f},
790 {0, (float)mRenderHeight, 0.0f, 1.0f},
791 {(float)mRenderWidth, 0, 1.0f, 0.0f},
792 {(float)mRenderWidth, (float)mRenderHeight, 1.0f, 1.0f}};
794 CHKERR(glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices));
796 if (!mDisplay->useMultiVBO()) {
797 CHKERR(glBindBuffer(GL_ARRAY_BUFFER, mVBOId[0])); // If we don't use multiple buffers, we keep the default buffer bound
798 }
799}
800
801void GPUDisplayBackendOpenGL::updateRenderer(bool withScreenshot)
802{
803 mDownsampleFactor = getDownsampleFactor(withScreenshot);
807 if (mDisplay->cfgR().drawQualityMSAA > 1) {
809 }
810 if (mDownsampleFactor != 1) {
812 }
813 createFB(mMixBuffer, true, true, false, mRenderWidth, mRenderHeight);
814 setQuality();
815}
816
817#else // GPUCA_BUILD_EVENT_DISPLAY_OPENGL
823int32_t GPUDisplayBackendOpenGL::ExtInit() { throw std::runtime_error("Insufficnet OpenGL version"); }
826uint32_t GPUDisplayBackendOpenGL::drawVertices(const vboList& v, const drawType t) { return 0; }
827void GPUDisplayBackendOpenGL::ActivateColor(std::array<float, 4>& color) {}
830int32_t GPUDisplayBackendOpenGL::InitBackendA() { throw std::runtime_error("Insufficnet OpenGL version"); }
832void GPUDisplayBackendOpenGL::loadDataToGPU(size_t totalVertizes) {}
833void GPUDisplayBackendOpenGL::prepareDraw(const hmm_mat4& proj, const hmm_mat4& view, bool requestScreenshot, bool toMixBuffer, float includeMixImage) {}
835void GPUDisplayBackendOpenGL::finishDraw(bool doScreenshot, bool toMixBuffer, float includeMixImage) {}
836void GPUDisplayBackendOpenGL::finishFrame(bool doScreenshot, bool toMixBuffer, float includeMixImage) {}
841void GPUDisplayBackendOpenGL::addFontSymbol(int32_t symbol, int32_t sizex, int32_t sizey, int32_t offsetx, int32_t offsety, int32_t advance, void* data) {}
843void GPUDisplayBackendOpenGL::OpenGLPrint(const char* s, float x, float y, float* color, float scale) {}
844#endif // GPUCA_BUILD_EVENT_DISPLAY_OPENGL
int32_t i
#define OPENGL_EMULATE_MULTI_DRAW
#define CHKERR(cmd)
#define GPUCA_NSECTORS
HMM_INLINE hmm_mat4 HMM_Orthographic(float Left, float Right, float Bottom, float Top, float Near, float Far)
uint32_t c
Definition RawData.h:2
Class for time synchronization of RawReader instances.
void setFrameBuffer(uint32_t newID=0)
void lineWidthFactor(float factor) override
void clearScreen(bool alphaOnly=false)
void resizeScene(uint32_t width, uint32_t height) override
void loadDataToGPU(size_t totalVertizes) override
void prepareDraw(const hmm_mat4 &proj, const hmm_mat4 &view, bool requestScreenshot, bool toMixBuffer, float includeMixImage) override
void OpenGLPrint(const char *s, float x, float y, float *color, float scale) override
void finishDraw(bool doScreenshot, bool toMixBuffer, float includeMixImage) override
uint32_t drawVertices(const vboList &v, const drawType t) override
static int32_t checkProgramStatus(uint32_t program)
void createFB(GLfb &fb, bool tex, bool withDepth, bool msaa, uint32_t width, uint32_t height)
void pointSizeFactor(float factor) override
static int32_t checkShaderStatus(uint32_t shader)
void mixImages(float mixSlaveImage)
std::vector< FontSymbolOpenGL > mFontSymbols
void updateRenderer(bool withScreenshot)
void finishFrame(bool doScreenshot, bool toMixBuffer, float includeMixImage) override
void addFontSymbol(int32_t symbol, int32_t sizex, int32_t sizey, int32_t offsetx, int32_t offsety, int32_t advance, void *data) override
void ActivateColor(std::array< float, 4 > &color) override
vecpod< DrawArraysIndirectCommand > mCmdBuffer
std::vector< int32_t > mIndirectSectorOffset
std::vector< char > mScreenshotPixels
std::unique_ptr< GPUDisplayMagneticField > mMagneticFieldVisualization
float getDownsampleFactor(bool screenshot=false)
std::tuple< uint32_t, uint32_t, int32_t > vboList
static constexpr int32_t GL_MIN_VERSION_MAJOR
static constexpr int32_t GL_MIN_VERSION_MINOR
const GPUSettingsDisplayLight & cfgL() const
Definition GPUDisplay.h:60
int32_t updateRenderPipeline() const
Definition GPUDisplay.h:65
const GPUSettingsDisplayRenderer & cfgR() const
Definition GPUDisplay.h:59
vecpod< vtx > * vertexBuffer()
Definition GPUDisplay.h:73
bool drawTextInCompatMode() const
Definition GPUDisplay.h:77
const vecpod< uint32_t > * vertexBufferCount() const
Definition GPUDisplay.h:68
bool useMultiVBO() const
Definition GPUDisplay.h:63
vecpod< int32_t > * vertexBufferStart()
Definition GPUDisplay.h:67
const GPUSettingsProcessing & GetProcessingSettings() const
Definition GPUDisplay.h:75
#define glNamedBufferData
Definition gl3w.h:1077
#define glAttachShader
Definition gl3w.h:727
#define glGetUniformLocation
Definition gl3w.h:1015
#define glClearColor
Definition gl3w.h:778
#define glGenBuffers
Definition gl3w.h:897
#define glUniformMatrix4fv
Definition gl3w.h:1278
#define glSpecializeShader
Definition gl3w.h:1183
#define glCheckFramebufferStatus
Definition gl3w.h:768
#define glUniform1f
Definition gl3w.h:1234
#define glDeleteVertexArrays
Definition gl3w.h:842
#define glCreateBuffers
Definition gl3w.h:815
#define glUniform4fv
Definition gl3w.h:1259
#define glPixelStorei
Definition gl3w.h:1095
#define glGetShaderInfoLog
Definition gl3w.h:985
#define glShaderSource
Definition gl3w.h:1181
#define glBindBuffer
Definition gl3w.h:733
#define glDrawBuffer
Definition gl3w.h:860
#define glEnable
Definition gl3w.h:875
#define glFramebufferTexture2D
Definition gl3w.h:893
int gl3wInit(void)
#define glBindVertexArray
Definition gl3w.h:751
#define glCreateShader
Definition gl3w.h:822
#define glGetProgramiv
Definition gl3w.h:969
#define glRenderbufferStorageMultisample
Definition gl3w.h:1166
#define glMultiDrawArrays
Definition gl3w.h:1070
#define glDepthFunc
Definition gl3w.h:843
#define glDeleteBuffers
Definition gl3w.h:831
#define glReadBuffer
Definition gl3w.h:1161
#define glTexParameteri
Definition gl3w.h:1201
#define glReadPixels
Definition gl3w.h:1162
#define glEnableVertexAttribArray
Definition gl3w.h:877
#define glGetIntegerv
Definition gl3w.h:944
#define glGenVertexArrays
Definition gl3w.h:905
#define glShaderBinary
Definition gl3w.h:1180
#define glGetString
Definition gl3w.h:989
#define glColorMask
Definition gl3w.h:792
#define glTexImage2D
Definition gl3w.h:1193
#define glBindFramebuffer
Definition gl3w.h:740
#define glPointSize
Definition gl3w.h:1100
#define glGenTextures
Definition gl3w.h:903
#define glBindBufferBase
Definition gl3w.h:734
#define glDrawArrays
Definition gl3w.h:856
#define glVertexAttribPointer
Definition gl3w.h:1377
#define glGenRenderbuffers
Definition gl3w.h:901
#define glBufferData
Definition gl3w.h:765
#define glDeleteProgram
Definition gl3w.h:833
#define glBindTexture
Definition gl3w.h:747
#define glBindRenderbuffer
Definition gl3w.h:744
#define glBlitNamedFramebuffer
Definition gl3w.h:764
#define glDeleteFramebuffers
Definition gl3w.h:832
#define glFramebufferRenderbuffer
Definition gl3w.h:890
#define glMultiDrawArraysIndirect
Definition gl3w.h:1071
#define glTexImage2DMultisample
Definition gl3w.h:1194
#define glBufferSubData
Definition gl3w.h:767
#define glViewport
Definition gl3w.h:1379
#define glNamedBufferSubData
Definition gl3w.h:1079
#define glDeleteShader
Definition gl3w.h:838
#define glLineWidth
Definition gl3w.h:1060
#define glCompileShader
Definition gl3w.h:794
#define glCreateProgram
Definition gl3w.h:817
#define glGetProgramInfoLog
Definition gl3w.h:959
#define glLinkProgram
Definition gl3w.h:1061
#define glDeleteRenderbuffers
Definition gl3w.h:836
#define glUseProgram
Definition gl3w.h:1286
#define glRenderbufferStorage
Definition gl3w.h:1165
#define glDisable
Definition gl3w.h:850
#define glDrawBuffers
Definition gl3w.h:861
#define glGetShaderiv
Definition gl3w.h:988
#define glDeleteTextures
Definition gl3w.h:840
#define glActiveTexture
Definition gl3w.h:726
#define glGenFramebuffers
Definition gl3w.h:898
#define glBlendFunc
Definition gl3w.h:759
#define glClear
Definition gl3w.h:771
GLint GLenum GLint x
Definition glcorearb.h:403
#define GL_TEXTURE0
Definition glcorearb.h:483
#define GL_TEXTURE_MIN_FILTER
Definition glcorearb.h:260
#define GL_FRAGMENT_SHADER
Definition glcorearb.h:728
#define GL_UNIFORM_BUFFER
Definition glcorearb.h:1435
#define GL_TEXTURE_WRAP_S
Definition glcorearb.h:261
GLenum src
Definition glcorearb.h:1767
#define GL_MAJOR_VERSION
Definition glcorearb.h:1012
GLint GLsizei count
Definition glcorearb.h:399
#define GL_QUADS
Definition glcorearb.h:103
GLuint color
Definition glcorearb.h:1272
const GLdouble * v
Definition glcorearb.h:832
#define GL_PACK_ALIGNMENT
Definition glcorearb.h:193
GLsizei GLenum GLenum * types
Definition glcorearb.h:2516
#define GL_DEPTH_TEST
Definition glcorearb.h:153
#define GL_LINEAR
Definition glcorearb.h:254
#define GL_LINE_STRIP
Definition glcorearb.h:99
#define GL_COLOR_ATTACHMENT0
Definition glcorearb.h:1147
#define GL_SRC_ALPHA
Definition glcorearb.h:116
#define GL_LINES
Definition glcorearb.h:97
#define GL_BGRA
Definition glcorearb.h:456
GLuint shader
Definition glcorearb.h:780
GLbitfield GLuint program
Definition glcorearb.h:1905
unsigned int GLenum
Definition glcorearb.h:81
GLint GLsizei GLsizei height
Definition glcorearb.h:270
#define GL_TRIANGLES
Definition glcorearb.h:100
GLint GLsizei width
Definition glcorearb.h:270
#define GL_BACK
Definition glcorearb.h:129
unsigned int GLuint
Definition glcorearb.h:88
#define GL_FLOAT
Definition glcorearb.h:211
#define GL_ARRAY_BUFFER
Definition glcorearb.h:625
#define GL_VERTEX_ARRAY
Definition glcorearb.h:398
#define GL_FRAMEBUFFER_COMPLETE
Definition glcorearb.h:1140
#define GL_RED
Definition glcorearb.h:236
#define GL_DRAW_FRAMEBUFFER
Definition glcorearb.h:1132
#define GL_UNSIGNED_BYTE
Definition glcorearb.h:206
GLboolean * data
Definition glcorearb.h:298
#define GL_RENDERBUFFER
Definition glcorearb.h:1182
#define GL_COMPILE_STATUS
Definition glcorearb.h:756
#define GL_LEQUAL
Definition glcorearb.h:107
#define GL_POINTS
Definition glcorearb.h:96
#define GL_UNPACK_ALIGNMENT
Definition glcorearb.h:187
int GLsizei
Definition glcorearb.h:85
#define GL_COLOR_BUFFER_BIT
Definition glcorearb.h:93
#define GL_FRAMEBUFFER
Definition glcorearb.h:1181
#define GL_RGBA
Definition glcorearb.h:241
#define GL_BLEND
Definition glcorearb.h:170
#define GL_MULTISAMPLE
Definition glcorearb.h:516
#define GL_ONE_MINUS_SRC_ALPHA
Definition glcorearb.h:117
#define GL_TEXTURE_2D_MULTISAMPLE
Definition glcorearb.h:1548
#define GL_DRAW_FRAMEBUFFER_BINDING
Definition glcorearb.h:1129
#define GL_READ_FRAMEBUFFER
Definition glcorearb.h:1131
#define GL_STATIC_DRAW
Definition glcorearb.h:639
#define GL_FALSE
Definition glcorearb.h:94
#define GL_DYNAMIC_DRAW
Definition glcorearb.h:642
#define GL_TEXTURE_WRAP_T
Definition glcorearb.h:262
#define GL_DEPTH_ATTACHMENT
Definition glcorearb.h:1179
#define GL_TEXTURE_MAG_FILTER
Definition glcorearb.h:259
#define GL_VERTEX_SHADER
Definition glcorearb.h:729
#define GL_MINOR_VERSION
Definition glcorearb.h:1013
#define GL_TEXTURE_2D
Definition glcorearb.h:198
#define GL_DEPTH_COMPONENT24
Definition glcorearb.h:572
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition glcorearb.h:2514
GLenum attachment
Definition glcorearb.h:1302
#define GL_RENDERER
Definition glcorearb.h:250
GLubyte GLubyte GLubyte GLubyte w
Definition glcorearb.h:852
GLuint id
Definition glcorearb.h:650
#define GL_LINK_STATUS
Definition glcorearb.h:757
#define GL_READ_FRAMEBUFFER_BINDING
Definition glcorearb.h:1133
#define GL_INFO_LOG_LENGTH
Definition glcorearb.h:759
#define GL_CLAMP_TO_EDGE
Definition glcorearb.h:459
#define GL_DEPTH_BUFFER_BIT
Definition glcorearb.h:91
#define GL_LINE_SMOOTH
Definition glcorearb.h:143
#define GL_DRAW_INDIRECT_BUFFER
Definition glcorearb.h:1698
#define GL_SHADER_BINARY_FORMAT_SPIR_V_ARB
Definition glcorearb.h:3203
uint8_t itsSharedClusterMap uint8_t
int advance(std::istream &in, size_t itemByteSize, const char *itemName)
Definition IO.cxx:35
#define QGET_LD_BINARY_SYMBOLS(filename)
static constexpr const char * vertexShaderTexture
static constexpr const char * vertexShader
static constexpr const char * fragmentShaderText
static constexpr const char * fragmentShader
static constexpr const char * fragmentShaderTexture
float Elements[4][4]