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
64#ifdef GPUCA_DISPLAY_GL3W
66{
67 return gl3wInit();
68}
69#else
71{
72 return glewInit();
73}
74#endif
75#ifdef GPUCA_DISPLAY_OPENGL_CORE
77{
78 return true;
79}
80#else
82{
83 return false;
84}
85#endif
86
87// #define CHKERR(cmd) {cmd;}
88#define CHKERR(cmd) \
89 do { \
90 (cmd); \
91 GLenum err = glGetError(); \
92 while (err != GL_NO_ERROR) { \
93 GPUError("OpenGL Error %d: %s (%s: %d)", (int32_t)err, (const char*)gluErrorString(err), __FILE__, __LINE__); \
94 throw std::runtime_error("OpenGL Failure"); \
95 } \
96 } while (false)
97
99{
100 GLint depthBits = 0;
101#ifndef GPUCA_DISPLAY_OPENGL_CORE
102 glGetIntegerv(GL_DEPTH_BITS, &depthBits);
103#endif
104 return depthBits;
105}
106
107void GPUDisplayBackendOpenGL::createFB(GLfb& fb, bool tex, bool withDepth, bool msaa, uint32_t width, uint32_t height)
108{
109 fb.tex = tex;
110 fb.depth = withDepth;
111 fb.msaa = msaa;
112 GLint drawFboId = 0, readFboId = 0;
117
118 auto createFB_texture = [&](GLuint& id, GLenum storage, GLenum attachment) {
120 CHKERR(glGenTextures(1, &id));
121 CHKERR(glBindTexture(textureType, id));
122 if (fb.msaa) {
123 CHKERR(glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, mDisplay->cfgR().drawQualityMSAA, storage, width, height, false));
124 } else {
125 CHKERR(glTexImage2D(GL_TEXTURE_2D, 0, storage, width, height, 0, storage, GL_UNSIGNED_BYTE, nullptr));
128 }
130 };
131
132 auto createFB_renderbuffer = [&](GLuint& id, GLenum storage, GLenum attachment) {
133 CHKERR(glGenRenderbuffers(1, &id));
135 if (fb.msaa) {
137 } else {
139 }
141 };
142
143 if (tex) {
144 createFB_texture(fb.fbCol_id, GL_RGBA, GL_COLOR_ATTACHMENT0);
145 } else {
146 createFB_renderbuffer(fb.fbCol_id, GL_RGBA, GL_COLOR_ATTACHMENT0);
147 }
148
149 if (withDepth) {
150 if (tex && fb.msaa) {
152 } else {
153 createFB_renderbuffer(fb.fbDepth_id, GL_DEPTH_COMPONENT24, GL_DEPTH_ATTACHMENT);
154 }
155 }
156
158 if (status != GL_FRAMEBUFFER_COMPLETE) {
159 GPUError("Error creating framebuffer (tex %d) - incomplete (%d)", (int32_t)tex, status);
160 exit(1);
161 }
164 fb.created = true;
165}
166
168{
169 if (fb.tex) {
171 } else {
173 }
174 if (fb.depth) {
175 if (fb.tex && fb.msaa) {
177 } else {
179 }
180 }
182 fb.created = false;
183}
184
185uint32_t GPUDisplayBackendOpenGL::drawVertices(const vboList& v, const drawType tt)
186{
187 static constexpr GLenum types[3] = {GL_POINTS, GL_LINES, GL_LINE_STRIP};
188 GLenum t = types[tt];
189 auto first = std::get<0>(v);
190 auto count = std::get<1>(v);
191 auto iSector = std::get<2>(v);
192 if (count == 0) {
193 return 0;
194 }
195
196 if (mDisplay->useMultiVBO()) {
197 if (mDisplay->cfgR().openGLCore) {
199 }
201#ifndef GPUCA_DISPLAY_OPENGL_CORE
202 if (!mDisplay->cfgR().openGLCore) {
203 CHKERR(glVertexPointer(3, GL_FLOAT, 0, nullptr));
204 } else
205#endif
206 {
207 CHKERR(glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, nullptr));
209 }
210 }
211
212 if (mDisplay->cfgR().useGLIndirectDraw) {
213 CHKERR(glMultiDrawArraysIndirect(t, (void*)(size_t)((mIndirectSectorOffset[iSector] + first) * sizeof(DrawArraysIndirectCommand)), count, 0));
214 } else if (OPENGL_EMULATE_MULTI_DRAW) {
215 for (uint32_t k = 0; k < count; k++) {
216 CHKERR(glDrawArrays(t, mDisplay->vertexBufferStart()[iSector][first + k], mDisplay->vertexBufferCount()[iSector][first + k]));
217 }
218 } else {
219 static_assert(sizeof(GLsizei) == sizeof(*mDisplay->vertexBufferCount()[iSector].data()), "Invalid counter size does not match GLsizei");
220 CHKERR(glMultiDrawArrays(t, mDisplay->vertexBufferStart()[iSector].data() + first, ((const GLsizei*)mDisplay->vertexBufferCount()[iSector].data()) + first, count));
221 }
222 return count;
223}
224
225void GPUDisplayBackendOpenGL::ActivateColor(std::array<float, 4>& color)
226{
227#ifndef GPUCA_DISPLAY_OPENGL_CORE
228 if (!mDisplay->cfgR().openGLCore) {
229 glColor4f(color[0], color[1], color[2], color[3]);
230 } else
231#endif
232 {
233 if (mSPIRVShaders) {
237 } else {
239 }
240 }
241}
242
244{
245 if (mDisplay->cfgR().drawQualityMSAA > 1) {
247 } else {
249 }
250}
251
253{
254 if (mDisplay->cfgL().depthBuffer) {
255 CHKERR(glEnable(GL_DEPTH_TEST)); // Enables Depth Testing
256 CHKERR(glDepthFunc(GL_LEQUAL)); // The Type Of Depth Testing To Do
257 } else {
259 }
260}
261
263{
264 if (newID == 0) {
267 } else {
269 GLenum drawBuffer = GL_COLOR_ATTACHMENT0;
270 glDrawBuffers(1, &drawBuffer);
271 }
272}
273
275{
276 int32_t status, loglen;
278 if (!status) {
279 printf("failed to compile shader\n");
281 std::vector<char> buf(loglen + 1);
282 glGetShaderInfoLog(shader, loglen, nullptr, buf.data());
283 buf[loglen] = 0;
284 printf("%s\n", buf.data());
285 return 1;
286 }
287 return 0;
288}
289
291{
292 int32_t status, loglen;
294 if (!status) {
295 printf("failed to link program\n");
297 std::vector<char> buf(loglen + 1);
298 glGetProgramInfoLog(program, loglen, nullptr, buf.data());
299 buf[loglen] = 0;
300 printf("%s\n", buf.data());
301 return 1;
302 }
303 return 0;
304}
305
307{
308 if (mDisplay->param()->par.debugLevel >= 2) {
309 auto renderer = glGetString(GL_RENDERER);
310 GPUInfo("Renderer: %s", (const char*)renderer);
311 }
312
313 int32_t glVersion[2] = {0, 0};
314 glGetIntegerv(GL_MAJOR_VERSION, &glVersion[0]);
315 glGetIntegerv(GL_MINOR_VERSION, &glVersion[1]);
317 GPUError("Unsupported OpenGL runtime %d.%d < %d.%d", glVersion[0], glVersion[1], GPUDisplayFrontend::GL_MIN_VERSION_MAJOR, GPUDisplayFrontend::GL_MIN_VERSION_MINOR);
318 return (1);
319 }
320 mVBOId.resize(GPUCA_NSECTORS);
321 CHKERR(glCreateBuffers(mVBOId.size(), mVBOId.data()));
325#ifndef GPUCA_DISPLAY_OPENGL_CORE
326 CHKERR(glShadeModel(GL_SMOOTH)); // Enable Smooth Shading
327#endif
329 setQuality();
335#if defined(GL_VERSION_4_6) && GL_VERSION_4_6 == 1 && defined(GPUCA_BUILD_EVENT_DISPLAY_VULKAN)
336 if (getenv("USE_SPIRV_SHADERS") && atoi(getenv("USE_SPIRV_SHADERS"))) {
337 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));
338 CHKERR(glSpecializeShader(mVertexShader, "main", 0, 0, 0));
339 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));
340 CHKERR(glSpecializeShader(mFragmentShader, "main", 0, 0, 0));
341 GPUInfo("Using SPIR-V shaders");
342 mSPIRVShaders = true;
343 } else
344#endif
345 {
350 }
358 return 1;
359 }
365 return 1;
366 }
367 if (mSPIRVShaders) {
370 } else {
373 }
379 return 1;
380 }
388 return 1;
389 }
393
398 CHKERR(glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 6 * 4, nullptr, GL_DYNAMIC_DRAW));
400 CHKERR(glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(float), nullptr));
402
404 return 0;
405}
406
408{
410 CHKERR(glDeleteBuffers(mVBOId.size(), mVBOId.data()));
420
422
425
429 for (auto& symbol : mFontSymbols) {
430 CHKERR(glDeleteTextures(1, &symbol.texId));
431 }
432 }
433 if (mSPIRVShaders) {
436 }
439 }
440}
441
442void GPUDisplayBackendOpenGL::clearScreen(bool alphaOnly)
443{
444 if (mDisplay->cfgL().invertColors && !alphaOnly) {
445 CHKERR(glClearColor(1.0f, 1.0f, 1.0f, 1.0f));
446 } else {
447 CHKERR(glClearColor(0.0f, 0.0f, 0.0f, 1.0f));
448 }
449 if (alphaOnly) {
450 glColorMask(false, false, false, true);
452 glColorMask(true, true, true, true);
453 } else {
454 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer
455 }
456}
457
458void GPUDisplayBackendOpenGL::loadDataToGPU(size_t totalVertizes)
459{
460 // TODO: Check if this can be parallelized
461 if (mDisplay->useMultiVBO()) {
462 for (int32_t i = 0; i < GPUCA_NSECTORS; i++) {
464 }
465 } else {
466 CHKERR(glBindBuffer(GL_ARRAY_BUFFER, mVBOId[0])); // Bind ahead of time, since it is not going to change
467 CHKERR(glNamedBufferData(mVBOId[0], totalVertizes * sizeof(mDisplay->vertexBuffer()[0][0]), mDisplay->vertexBuffer()[0].data(), GL_STATIC_DRAW));
468 }
469
470 if (mDisplay->cfgR().useGLIndirectDraw) {
473 mCmdBuffer.clear();
474 }
475}
476
477void GPUDisplayBackendOpenGL::prepareDraw(const hmm_mat4& proj, const hmm_mat4& view, bool requestScreenshot, bool toMixBuffer, float includeMixImage)
478{
479 if (mDisplay->updateRenderPipeline() || mDownsampleFactor != getDownsampleFactor(requestScreenshot)) {
480 updateRenderer(requestScreenshot);
481 }
484 } else if (toMixBuffer) {
486 } else if (mOffscreenBuffer.created) {
488 } else {
490 }
491 clearScreen();
492#ifndef GPUCA_DISPLAY_OPENGL_CORE
493 if (mDisplay->cfgL().smoothPoints && !mDisplay->cfgR().openGLCore) {
494 CHKERR(glEnable(GL_POINT_SMOOTH));
495 } else {
496 CHKERR(glDisable(GL_POINT_SMOOTH));
497 }
498 if (mDisplay->cfgL().smoothLines && !mDisplay->cfgR().openGLCore) {
500 } else {
502 }
503#endif
506
508#ifndef GPUCA_DISPLAY_OPENGL_CORE
509 if (!mDisplay->cfgR().openGLCore) {
510 CHKERR(glEnableClientState(GL_VERTEX_ARRAY));
511 CHKERR(glVertexPointer(3, GL_FLOAT, 0, nullptr));
512 } else
513#endif
514 {
517 CHKERR(glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, nullptr));
519 }
520#ifndef GPUCA_DISPLAY_OPENGL_CORE
521 if (!mDisplay->cfgR().openGLCore) {
522 CHKERR(glMatrixMode(GL_PROJECTION));
523 CHKERR(glLoadMatrixf(&proj.Elements[0][0]));
524 CHKERR(glMatrixMode(GL_MODELVIEW));
525 CHKERR(glLoadMatrixf(&view.Elements[0][0]));
526 } else
527#endif
528 {
529 const hmm_mat4 modelViewProj = proj * view;
530 if (mSPIRVShaders) {
532 glBufferData(GL_UNIFORM_BUFFER, sizeof(modelViewProj), &modelViewProj, GL_STATIC_DRAW);
534 } else {
535 CHKERR(glUniformMatrix4fv(mModelViewProjId, 1, GL_FALSE, &modelViewProj.Elements[0][0]));
536 }
538 CHKERR(glNamedBufferSubData(mFieldModelViewBuffer, 0, sizeof(modelViewProj), &modelViewProj));
539 }
540 }
541}
542
543void GPUDisplayBackendOpenGL::finishDraw(bool doScreenshot, bool toMixBuffer, float includeMixImage)
544{
545#ifndef GPUCA_DISPLAY_OPENGL_CORE
546 if (!mDisplay->cfgR().openGLCore) {
547 CHKERR(glDisableClientState(GL_VERTEX_ARRAY));
548 } else
549#endif
550 {
553 }
554
555 if (mDisplay->cfgR().drawQualityMSAA) {
556 uint32_t dstId = toMixBuffer ? mMixBuffer.fb_id : (mDownsampleFactor != 1 ? mOffscreenBuffer.fb_id : 0);
558 }
559 if (includeMixImage > 0) {
561 mixImages(includeMixImage);
562 }
563 if (mDownsampleFactor != 1 && !toMixBuffer) {
565 }
566
567 if (doScreenshot && !toMixBuffer) {
569 }
570}
571
573{
574 int32_t scaleFactor = mDisplay->cfgR().screenshotScaleFactor;
575 uint32_t width = mScreenWidth * scaleFactor;
576 uint32_t height = mScreenHeight * scaleFactor;
577 GLfb tmpBuffer;
578 if (mDisplay->cfgR().drawQualityDownsampleFSAA && mDisplay->cfgR().screenshotScaleFactor != 1) {
579 createFB(tmpBuffer, false, true, false, width, height);
581 }
582 setFrameBuffer(tmpBuffer.created ? tmpBuffer.fb_id : (scaleFactor != 1 ? mOffscreenBuffer.fb_id : 0));
584 CHKERR(glReadBuffer(scaleFactor != 1 ? GL_COLOR_ATTACHMENT0 : GL_BACK));
585 mScreenshotPixels.resize(width * height * 4);
587 if (tmpBuffer.created) {
588 deleteFB(tmpBuffer);
589 }
590}
591
592void GPUDisplayBackendOpenGL::finishFrame(bool doScreenshot, bool toMixBuffer, float includeMixImage) {}
593
595{
598 hmm_mat4 proj = HMM_Orthographic(0.f, mScreenWidth, 0.f, mScreenHeight, -1, 1);
600#ifndef GPUCA_DISPLAY_OPENGL_CORE
601 glMatrixMode(GL_MODELVIEW);
602 glLoadIdentity();
603 glMatrixMode(GL_PROJECTION);
604 glLoadMatrixf(&proj.Elements[0][0]);
606#endif
607 } else if (mFreetypeInitialized) {
612 float color[4] = {1.0f, 1.0f, 1.0f, 1.0f};
614 }
615}
616
618{
623 }
624}
625
626void GPUDisplayBackendOpenGL::mixImages(float mixSlaveImage)
627{
628 hmm_mat4 proj = HMM_Orthographic(0.f, mRenderWidth, 0.f, mRenderHeight, -1.f, 1.f);
630#ifndef GPUCA_DISPLAY_OPENGL_CORE
631 if (!mDisplay->cfgR().openGLCore) {
632 glMatrixMode(GL_MODELVIEW);
633 glLoadIdentity();
634 glMatrixMode(GL_PROJECTION);
635 glLoadMatrixf(&proj.Elements[0][0]);
637 } else
638#endif
639 {
644 CHKERR(glUniform1f(mAlphaIdTexture, mixSlaveImage));
645 }
646
648
649#ifndef GPUCA_DISPLAY_OPENGL_CORE
650 if (!mDisplay->cfgR().openGLCore) {
651 glColor4f(1, 1, 1, mixSlaveImage);
652 glBegin(GL_QUADS);
653 glTexCoord2f(0, 0);
654 glVertex3f(0, 0, 0);
655 glTexCoord2f(0, 1);
656 glVertex3f(0, mRenderHeight, 0);
657 glTexCoord2f(1, 1);
658 glVertex3f(mRenderWidth, mRenderHeight, 0);
659 glTexCoord2f(1, 0);
660 glVertex3f(mRenderWidth, 0, 0);
661 glEnd();
662 glColor4f(1, 1, 1, 0);
664 } else
665#endif
666 {
670 }
673}
674
676{
677 CHKERR(glPointSize(mDisplay->cfgL().pointSize * mDownsampleFactor * factor));
678}
679
681{
682 CHKERR(glLineWidth(mDisplay->cfgL().lineWidth * mDownsampleFactor * factor));
683}
684
685void GPUDisplayBackendOpenGL::addFontSymbol(int32_t symbol, int32_t sizex, int32_t sizey, int32_t offsetx, int32_t offsety, int32_t advance, void* data)
686{
687 int32_t oldAlign;
690 if (symbol != (int32_t)mFontSymbols.size()) {
691 throw std::runtime_error("Incorrect symbol ID");
692 }
693 uint32_t texId;
694 glGenTextures(1, &texId);
695 std::vector<uint8_t> tmp;
696 if (!smoothFont()) {
697 tmp.resize(sizex * sizey);
698 uint8_t* src = (uint8_t*)data;
699 for (int32_t i = 0; i < sizex * sizey; i++) {
700 tmp[i] = src[i] > 128 ? 255 : 0;
701 }
702 data = tmp.data();
703 }
704 mFontSymbols.emplace_back(FontSymbolOpenGL{{{sizex, sizey}, {offsetx, offsety}, advance}, texId});
705 if (sizex == 0 || sizey == 0) {
706 return;
707 }
715}
716
718{
723 CHKERR(glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 6 * 4, nullptr, GL_DYNAMIC_DRAW));
725 CHKERR(glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(float), nullptr));
728}
729
730void GPUDisplayBackendOpenGL::OpenGLPrint(const char* s, float x, float y, float* color, float scale)
731{
733 return;
734 }
736
737 if (smoothFont()) {
738 scale *= 0.25f; // Font size is 48 to have nice bitmap, scale to size 12
739 }
740 for (const char* c = s; *c; c++) {
741 if ((int32_t)*c > (int32_t)mFontSymbols.size()) {
742 GPUError("Trying to draw unsupported symbol: %d > %d\n", (int32_t)*c, (int32_t)mFontSymbols.size());
743 continue;
744 }
745 FontSymbolOpenGL sym = mFontSymbols[*c];
746 if (sym.size[0] && sym.size[1]) {
747 float xpos = x + sym.offset[0] * scale;
748 float ypos = y - (sym.size[1] - sym.offset[1]) * scale;
749 float w = sym.size[0] * scale;
750 float h = sym.size[1] * scale;
751 float vertices[6][4] = {
752 {xpos, ypos + h, 0.0f, 0.0f},
753 {xpos, ypos, 0.0f, 1.0f},
754 {xpos + w, ypos, 1.0f, 1.0f},
755 {xpos, ypos + h, 0.0f, 0.0f},
756 {xpos + w, ypos, 1.0f, 1.0f},
757 {xpos + w, ypos + h, 1.0f, 0.0f}};
760 CHKERR(glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices));
763 }
764 x += (sym.advance >> 6) * scale; // shift is in 1/64th of a pixel
765 }
766 if (!mDisplay->useMultiVBO()) {
767 CHKERR(glBindBuffer(GL_ARRAY_BUFFER, mVBOId[0])); // If we don't use multiple buffers, we keep the default buffer bound
768 }
769}
770
772{
773 if (mMixBuffer.created) {
775 }
778 }
781 }
782}
783
785{
788
789 updateRenderer(false);
790
791 float vertices[6][4] = {
792 {0, (float)mRenderHeight, 0.0f, 1.0f},
793 {0, 0, 0.0f, 0.0f},
794 {(float)mRenderWidth, 0, 1.0f, 0.0f},
795 {0, (float)mRenderHeight, 0.0f, 1.0f},
796 {(float)mRenderWidth, 0, 1.0f, 0.0f},
797 {(float)mRenderWidth, (float)mRenderHeight, 1.0f, 1.0f}};
799 CHKERR(glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices));
801 if (!mDisplay->useMultiVBO()) {
802 CHKERR(glBindBuffer(GL_ARRAY_BUFFER, mVBOId[0])); // If we don't use multiple buffers, we keep the default buffer bound
803 }
804}
805
806void GPUDisplayBackendOpenGL::updateRenderer(bool withScreenshot)
807{
808 mDownsampleFactor = getDownsampleFactor(withScreenshot);
812 if (mDisplay->cfgR().drawQualityMSAA > 1) {
814 }
815 if (mDownsampleFactor != 1) {
817 }
818 createFB(mMixBuffer, true, true, false, mRenderWidth, mRenderHeight);
819 setQuality();
820}
821
822#else // GPUCA_BUILD_EVENT_DISPLAY_OPENGL
828int32_t GPUDisplayBackendOpenGL::ExtInit() { throw std::runtime_error("Insufficnet OpenGL version"); }
831uint32_t GPUDisplayBackendOpenGL::drawVertices(const vboList& v, const drawType t) { return 0; }
832void GPUDisplayBackendOpenGL::ActivateColor(std::array<float, 4>& color) {}
835int32_t GPUDisplayBackendOpenGL::InitBackendA() { throw std::runtime_error("Insufficnet OpenGL version"); }
837void GPUDisplayBackendOpenGL::loadDataToGPU(size_t totalVertizes) {}
838void GPUDisplayBackendOpenGL::prepareDraw(const hmm_mat4& proj, const hmm_mat4& view, bool requestScreenshot, bool toMixBuffer, float includeMixImage) {}
840void GPUDisplayBackendOpenGL::finishDraw(bool doScreenshot, bool toMixBuffer, float includeMixImage) {}
841void GPUDisplayBackendOpenGL::finishFrame(bool doScreenshot, bool toMixBuffer, float includeMixImage) {}
846void GPUDisplayBackendOpenGL::addFontSymbol(int32_t symbol, int32_t sizex, int32_t sizey, int32_t offsetx, int32_t offsety, int32_t advance, void* data) {}
848void GPUDisplayBackendOpenGL::OpenGLPrint(const char* s, float x, float y, float* color, float scale) {}
849#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:59
const GPUParam * param()
Definition GPUDisplay.h:73
int32_t updateRenderPipeline() const
Definition GPUDisplay.h:64
const GPUSettingsDisplayRenderer & cfgR() const
Definition GPUDisplay.h:58
vecpod< vtx > * vertexBuffer()
Definition GPUDisplay.h:72
bool drawTextInCompatMode() const
Definition GPUDisplay.h:75
const vecpod< uint32_t > * vertexBufferCount() const
Definition GPUDisplay.h:67
bool useMultiVBO() const
Definition GPUDisplay.h:62
vecpod< int32_t > * vertexBufferStart()
Definition GPUDisplay.h:66
#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]