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
31#define OPENGL_EMULATE_MULTI_DRAW 0
32
33using namespace o2::gpu;
34
35#ifdef GPUCA_BUILD_EVENT_DISPLAY_VULKAN
37QGET_LD_BINARY_SYMBOLS(shaders_shaders_vertex_vert_spv);
38QGET_LD_BINARY_SYMBOLS(shaders_shaders_fragmentUniform_frag_spv);
39#endif
40
41// Runtime minimum version defined in GPUDisplayFrontend.h, keep in sync!
42#define GPUCA_BUILD_EVENT_DISPLAY_OPENGL
43#if !defined(GL_VERSION_4_5) || GL_VERSION_4_5 != 1
44#ifdef GPUCA_STANDALONE
45// #error Unsupported OpenGL version < 4.5
46#elif defined(GPUCA_O2_LIB)
47#pragma message "Unsupported OpenGL version < 4.5, disabling standalone event display"
48#else
49#warning Unsupported OpenGL version < 4.5, disabling standalone event display
50#endif
51#undef GPUCA_BUILD_EVENT_DISPLAY_OPENGL
52#endif
53
54#ifdef GPUCA_BUILD_EVENT_DISPLAY_OPENGL
55
57{
59 mBackendName = "OpenGL";
60}
61
62#ifdef GPUCA_DISPLAY_GL3W
64{
65 return gl3wInit();
66}
67#else
69{
70 return glewInit();
71}
72#endif
73#ifdef GPUCA_DISPLAY_OPENGL_CORE
75{
76 return true;
77}
78#else
80{
81 return false;
82}
83#endif
84
85// #define CHKERR(cmd) {cmd;}
86#define CHKERR(cmd) \
87 do { \
88 (cmd); \
89 GLenum err = glGetError(); \
90 while (err != GL_NO_ERROR) { \
91 GPUError("OpenGL Error %d: %s (%s: %d)", (int32_t)err, (const char*)gluErrorString(err), __FILE__, __LINE__); \
92 throw std::runtime_error("OpenGL Failure"); \
93 } \
94 } while (false)
95
97{
98 GLint depthBits = 0;
99#ifndef GPUCA_DISPLAY_OPENGL_CORE
100 glGetIntegerv(GL_DEPTH_BITS, &depthBits);
101#endif
102 return depthBits;
103}
104
105void GPUDisplayBackendOpenGL::createFB(GLfb& fb, bool tex, bool withDepth, bool msaa, uint32_t width, uint32_t height)
106{
107 fb.tex = tex;
108 fb.depth = withDepth;
109 fb.msaa = msaa;
110 GLint drawFboId = 0, readFboId = 0;
115
116 auto createFB_texture = [&](GLuint& id, GLenum storage, GLenum attachment) {
118 CHKERR(glGenTextures(1, &id));
119 CHKERR(glBindTexture(textureType, id));
120 if (fb.msaa) {
121 CHKERR(glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, mDisplay->cfgR().drawQualityMSAA, storage, width, height, false));
122 } else {
123 CHKERR(glTexImage2D(GL_TEXTURE_2D, 0, storage, width, height, 0, storage, GL_UNSIGNED_BYTE, nullptr));
126 }
128 };
129
130 auto createFB_renderbuffer = [&](GLuint& id, GLenum storage, GLenum attachment) {
131 CHKERR(glGenRenderbuffers(1, &id));
133 if (fb.msaa) {
135 } else {
137 }
139 };
140
141 if (tex) {
142 createFB_texture(fb.fbCol_id, GL_RGBA, GL_COLOR_ATTACHMENT0);
143 } else {
144 createFB_renderbuffer(fb.fbCol_id, GL_RGBA, GL_COLOR_ATTACHMENT0);
145 }
146
147 if (withDepth) {
148 if (tex && fb.msaa) {
150 } else {
151 createFB_renderbuffer(fb.fbDepth_id, GL_DEPTH_COMPONENT24, GL_DEPTH_ATTACHMENT);
152 }
153 }
154
156 if (status != GL_FRAMEBUFFER_COMPLETE) {
157 GPUError("Error creating framebuffer (tex %d) - incomplete (%d)", (int32_t)tex, status);
158 exit(1);
159 }
162 fb.created = true;
163}
164
166{
167 if (fb.tex) {
169 } else {
171 }
172 if (fb.depth) {
173 if (fb.tex && fb.msaa) {
175 } else {
177 }
178 }
180 fb.created = false;
181}
182
183uint32_t GPUDisplayBackendOpenGL::drawVertices(const vboList& v, const drawType tt)
184{
185 static constexpr GLenum types[3] = {GL_POINTS, GL_LINES, GL_LINE_STRIP};
186 GLenum t = types[tt];
187 auto first = std::get<0>(v);
188 auto count = std::get<1>(v);
189 auto iSector = std::get<2>(v);
190 if (count == 0) {
191 return 0;
192 }
193
194 if (mDisplay->useMultiVBO()) {
195 if (mDisplay->cfgR().openGLCore) {
197 }
199#ifndef GPUCA_DISPLAY_OPENGL_CORE
200 if (!mDisplay->cfgR().openGLCore) {
201 CHKERR(glVertexPointer(3, GL_FLOAT, 0, nullptr));
202 } else
203#endif
204 {
205 CHKERR(glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, nullptr));
207 }
208 }
209
210 if (mDisplay->cfgR().useGLIndirectDraw) {
211 CHKERR(glMultiDrawArraysIndirect(t, (void*)(size_t)((mIndirectSectorOffset[iSector] + first) * sizeof(DrawArraysIndirectCommand)), count, 0));
212 } else if (OPENGL_EMULATE_MULTI_DRAW) {
213 for (uint32_t k = 0; k < count; k++) {
214 CHKERR(glDrawArrays(t, mDisplay->vertexBufferStart()[iSector][first + k], mDisplay->vertexBufferCount()[iSector][first + k]));
215 }
216 } else {
217 static_assert(sizeof(GLsizei) == sizeof(*mDisplay->vertexBufferCount()[iSector].data()), "Invalid counter size does not match GLsizei");
218 CHKERR(glMultiDrawArrays(t, mDisplay->vertexBufferStart()[iSector].data() + first, ((const GLsizei*)mDisplay->vertexBufferCount()[iSector].data()) + first, count));
219 }
220 return count;
221}
222
223void GPUDisplayBackendOpenGL::ActivateColor(std::array<float, 4>& color)
224{
225#ifndef GPUCA_DISPLAY_OPENGL_CORE
226 if (!mDisplay->cfgR().openGLCore) {
227 glColor4f(color[0], color[1], color[2], color[3]);
228 } else
229#endif
230 {
231 if (mSPIRVShaders) {
235 } else {
237 }
238 }
239}
240
242{
243 if (mDisplay->cfgR().drawQualityMSAA > 1) {
245 } else {
247 }
248}
249
251{
252 if (mDisplay->cfgL().depthBuffer) {
253 CHKERR(glEnable(GL_DEPTH_TEST)); // Enables Depth Testing
254 CHKERR(glDepthFunc(GL_LEQUAL)); // The Type Of Depth Testing To Do
255 } else {
257 }
258}
259
261{
262 if (newID == 0) {
265 } else {
267 GLenum drawBuffer = GL_COLOR_ATTACHMENT0;
268 glDrawBuffers(1, &drawBuffer);
269 }
270}
271
273{
274 int32_t status, loglen;
276 if (!status) {
277 printf("failed to compile shader\n");
279 std::vector<char> buf(loglen + 1);
280 glGetShaderInfoLog(shader, loglen, nullptr, buf.data());
281 buf[loglen] = 0;
282 printf("%s\n", buf.data());
283 return 1;
284 }
285 return 0;
286}
287
289{
290 int32_t status, loglen;
292 if (!status) {
293 printf("failed to link program\n");
295 std::vector<char> buf(loglen + 1);
296 glGetProgramInfoLog(program, loglen, nullptr, buf.data());
297 buf[loglen] = 0;
298 printf("%s\n", buf.data());
299 return 1;
300 }
301 return 0;
302}
303
305{
306 if (mDisplay->param()->par.debugLevel >= 2) {
307 auto renderer = glGetString(GL_RENDERER);
308 GPUInfo("Renderer: %s", (const char*)renderer);
309 }
310
311 int32_t glVersion[2] = {0, 0};
312 glGetIntegerv(GL_MAJOR_VERSION, &glVersion[0]);
313 glGetIntegerv(GL_MINOR_VERSION, &glVersion[1]);
315 GPUError("Unsupported OpenGL runtime %d.%d < %d.%d", glVersion[0], glVersion[1], GPUDisplayFrontend::GL_MIN_VERSION_MAJOR, GPUDisplayFrontend::GL_MIN_VERSION_MINOR);
316 return (1);
317 }
318 mVBOId.resize(GPUCA_NSECTORS);
319 CHKERR(glCreateBuffers(mVBOId.size(), mVBOId.data()));
323#ifndef GPUCA_DISPLAY_OPENGL_CORE
324 CHKERR(glShadeModel(GL_SMOOTH)); // Enable Smooth Shading
325#endif
327 setQuality();
333#if defined(GL_VERSION_4_6) && GL_VERSION_4_6 == 1 && defined(GPUCA_BUILD_EVENT_DISPLAY_VULKAN)
334 if (getenv("USE_SPIRV_SHADERS") && atoi(getenv("USE_SPIRV_SHADERS"))) {
335 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));
336 CHKERR(glSpecializeShader(mVertexShader, "main", 0, 0, 0));
337 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));
338 CHKERR(glSpecializeShader(mFragmentShader, "main", 0, 0, 0));
339 GPUInfo("Using SPIR-V shaders");
340 mSPIRVShaders = true;
341 } else
342#endif
343 {
348 }
356 return 1;
357 }
363 return 1;
364 }
365 if (mSPIRVShaders) {
368 } else {
371 }
377 return 1;
378 }
386 return 1;
387 }
391
396 CHKERR(glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 6 * 4, nullptr, GL_DYNAMIC_DRAW));
398 CHKERR(glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(float), nullptr));
400
402 return 0;
403}
404
406{
408 CHKERR(glDeleteBuffers(mVBOId.size(), mVBOId.data()));
418
420
423
427 for (auto& symbol : mFontSymbols) {
428 CHKERR(glDeleteTextures(1, &symbol.texId));
429 }
430 }
431 if (mSPIRVShaders) {
434 }
437 }
438}
439
440void GPUDisplayBackendOpenGL::clearScreen(bool alphaOnly)
441{
442 if (mDisplay->cfgL().invertColors && !alphaOnly) {
443 CHKERR(glClearColor(1.0f, 1.0f, 1.0f, 1.0f));
444 } else {
445 CHKERR(glClearColor(0.0f, 0.0f, 0.0f, 1.0f));
446 }
447 if (alphaOnly) {
448 glColorMask(false, false, false, true);
450 glColorMask(true, true, true, true);
451 } else {
452 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer
453 }
454}
455
456void GPUDisplayBackendOpenGL::loadDataToGPU(size_t totalVertizes)
457{
458 // TODO: Check if this can be parallelized
459 if (mDisplay->useMultiVBO()) {
460 for (int32_t i = 0; i < GPUCA_NSECTORS; i++) {
462 }
463 } else {
464 CHKERR(glBindBuffer(GL_ARRAY_BUFFER, mVBOId[0])); // Bind ahead of time, since it is not going to change
465 CHKERR(glNamedBufferData(mVBOId[0], totalVertizes * sizeof(mDisplay->vertexBuffer()[0][0]), mDisplay->vertexBuffer()[0].data(), GL_STATIC_DRAW));
466 }
467
468 if (mDisplay->cfgR().useGLIndirectDraw) {
471 mCmdBuffer.clear();
472 }
473}
474
475void GPUDisplayBackendOpenGL::prepareDraw(const hmm_mat4& proj, const hmm_mat4& view, bool requestScreenshot, bool toMixBuffer, float includeMixImage)
476{
477 if (mDisplay->updateRenderPipeline() || mDownsampleFactor != getDownsampleFactor(requestScreenshot)) {
478 updateRenderer(requestScreenshot);
479 }
482 } else if (toMixBuffer) {
484 } else if (mOffscreenBuffer.created) {
486 } else {
488 }
489 clearScreen();
490#ifndef GPUCA_DISPLAY_OPENGL_CORE
491 if (mDisplay->cfgL().smoothPoints && !mDisplay->cfgR().openGLCore) {
492 CHKERR(glEnable(GL_POINT_SMOOTH));
493 } else {
494 CHKERR(glDisable(GL_POINT_SMOOTH));
495 }
496 if (mDisplay->cfgL().smoothLines && !mDisplay->cfgR().openGLCore) {
498 } else {
500 }
501#endif
504
506#ifndef GPUCA_DISPLAY_OPENGL_CORE
507 if (!mDisplay->cfgR().openGLCore) {
508 CHKERR(glEnableClientState(GL_VERTEX_ARRAY));
509 CHKERR(glVertexPointer(3, GL_FLOAT, 0, nullptr));
510 } else
511#endif
512 {
515 CHKERR(glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, nullptr));
517 }
518#ifndef GPUCA_DISPLAY_OPENGL_CORE
519 if (!mDisplay->cfgR().openGLCore) {
520 CHKERR(glMatrixMode(GL_PROJECTION));
521 CHKERR(glLoadMatrixf(&proj.Elements[0][0]));
522 CHKERR(glMatrixMode(GL_MODELVIEW));
523 CHKERR(glLoadMatrixf(&view.Elements[0][0]));
524 } else
525#endif
526 {
527 const hmm_mat4 modelViewProj = proj * view;
528 if (mSPIRVShaders) {
530 glBufferData(GL_UNIFORM_BUFFER, sizeof(modelViewProj), &modelViewProj, GL_STATIC_DRAW);
532 } else {
533 CHKERR(glUniformMatrix4fv(mModelViewProjId, 1, GL_FALSE, &modelViewProj.Elements[0][0]));
534 }
536 CHKERR(glNamedBufferSubData(mFieldModelViewBuffer, 0, sizeof(modelViewProj), &modelViewProj));
537 }
538 }
539}
540
541void GPUDisplayBackendOpenGL::finishDraw(bool doScreenshot, bool toMixBuffer, float includeMixImage)
542{
543#ifndef GPUCA_DISPLAY_OPENGL_CORE
544 if (!mDisplay->cfgR().openGLCore) {
545 CHKERR(glDisableClientState(GL_VERTEX_ARRAY));
546 } else
547#endif
548 {
551 }
552
553 if (mDisplay->cfgR().drawQualityMSAA) {
554 uint32_t dstId = toMixBuffer ? mMixBuffer.fb_id : (mDownsampleFactor != 1 ? mOffscreenBuffer.fb_id : 0);
556 }
557 if (includeMixImage > 0) {
559 mixImages(includeMixImage);
560 }
561 if (mDownsampleFactor != 1 && !toMixBuffer) {
563 }
564
565 if (doScreenshot && !toMixBuffer) {
567 }
568}
569
571{
572 int32_t scaleFactor = mDisplay->cfgR().screenshotScaleFactor;
573 uint32_t width = mScreenWidth * scaleFactor;
574 uint32_t height = mScreenHeight * scaleFactor;
575 GLfb tmpBuffer;
576 if (mDisplay->cfgR().drawQualityDownsampleFSAA && mDisplay->cfgR().screenshotScaleFactor != 1) {
577 createFB(tmpBuffer, false, true, false, width, height);
579 }
580 setFrameBuffer(tmpBuffer.created ? tmpBuffer.fb_id : (scaleFactor != 1 ? mOffscreenBuffer.fb_id : 0));
582 CHKERR(glReadBuffer(scaleFactor != 1 ? GL_COLOR_ATTACHMENT0 : GL_BACK));
583 mScreenshotPixels.resize(width * height * 4);
585 if (tmpBuffer.created) {
586 deleteFB(tmpBuffer);
587 }
588}
589
590void GPUDisplayBackendOpenGL::finishFrame(bool doScreenshot, bool toMixBuffer, float includeMixImage) {}
591
593{
596 hmm_mat4 proj = HMM_Orthographic(0.f, mScreenWidth, 0.f, mScreenHeight, -1, 1);
598#ifndef GPUCA_DISPLAY_OPENGL_CORE
599 glMatrixMode(GL_MODELVIEW);
600 glLoadIdentity();
601 glMatrixMode(GL_PROJECTION);
602 glLoadMatrixf(&proj.Elements[0][0]);
604#endif
605 } else if (mFreetypeInitialized) {
610 float color[4] = {1.0f, 1.0f, 1.0f, 1.0f};
612 }
613}
614
616{
621 }
622}
623
624void GPUDisplayBackendOpenGL::mixImages(float mixSlaveImage)
625{
626 hmm_mat4 proj = HMM_Orthographic(0.f, mRenderWidth, 0.f, mRenderHeight, -1.f, 1.f);
628#ifndef GPUCA_DISPLAY_OPENGL_CORE
629 if (!mDisplay->cfgR().openGLCore) {
630 glMatrixMode(GL_MODELVIEW);
631 glLoadIdentity();
632 glMatrixMode(GL_PROJECTION);
633 glLoadMatrixf(&proj.Elements[0][0]);
635 } else
636#endif
637 {
642 CHKERR(glUniform1f(mAlphaIdTexture, mixSlaveImage));
643 }
644
646
647#ifndef GPUCA_DISPLAY_OPENGL_CORE
648 if (!mDisplay->cfgR().openGLCore) {
649 glColor4f(1, 1, 1, mixSlaveImage);
650 glBegin(GL_QUADS);
651 glTexCoord2f(0, 0);
652 glVertex3f(0, 0, 0);
653 glTexCoord2f(0, 1);
654 glVertex3f(0, mRenderHeight, 0);
655 glTexCoord2f(1, 1);
656 glVertex3f(mRenderWidth, mRenderHeight, 0);
657 glTexCoord2f(1, 0);
658 glVertex3f(mRenderWidth, 0, 0);
659 glEnd();
660 glColor4f(1, 1, 1, 0);
662 } else
663#endif
664 {
668 }
671}
672
674{
675 CHKERR(glPointSize(mDisplay->cfgL().pointSize * mDownsampleFactor * factor));
676}
677
679{
680 CHKERR(glLineWidth(mDisplay->cfgL().lineWidth * mDownsampleFactor * factor));
681}
682
683void GPUDisplayBackendOpenGL::addFontSymbol(int32_t symbol, int32_t sizex, int32_t sizey, int32_t offsetx, int32_t offsety, int32_t advance, void* data)
684{
685 int32_t oldAlign;
688 if (symbol != (int32_t)mFontSymbols.size()) {
689 throw std::runtime_error("Incorrect symbol ID");
690 }
691 uint32_t texId;
692 glGenTextures(1, &texId);
693 std::vector<uint8_t> tmp;
694 if (!smoothFont()) {
695 tmp.resize(sizex * sizey);
696 uint8_t* src = (uint8_t*)data;
697 for (int32_t i = 0; i < sizex * sizey; i++) {
698 tmp[i] = src[i] > 128 ? 255 : 0;
699 }
700 data = tmp.data();
701 }
702 mFontSymbols.emplace_back(FontSymbolOpenGL{{{sizex, sizey}, {offsetx, offsety}, advance}, texId});
703 if (sizex == 0 || sizey == 0) {
704 return;
705 }
713}
714
716{
721 CHKERR(glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 6 * 4, nullptr, GL_DYNAMIC_DRAW));
723 CHKERR(glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(float), nullptr));
726}
727
728void GPUDisplayBackendOpenGL::OpenGLPrint(const char* s, float x, float y, float* color, float scale)
729{
731 return;
732 }
734
735 if (smoothFont()) {
736 scale *= 0.25f; // Font size is 48 to have nice bitmap, scale to size 12
737 }
738 for (const char* c = s; *c; c++) {
739 if ((int32_t)*c > (int32_t)mFontSymbols.size()) {
740 GPUError("Trying to draw unsupported symbol: %d > %d\n", (int32_t)*c, (int32_t)mFontSymbols.size());
741 continue;
742 }
743 FontSymbolOpenGL sym = mFontSymbols[*c];
744 if (sym.size[0] && sym.size[1]) {
745 float xpos = x + sym.offset[0] * scale;
746 float ypos = y - (sym.size[1] - sym.offset[1]) * scale;
747 float w = sym.size[0] * scale;
748 float h = sym.size[1] * scale;
749 float vertices[6][4] = {
750 {xpos, ypos + h, 0.0f, 0.0f},
751 {xpos, ypos, 0.0f, 1.0f},
752 {xpos + w, ypos, 1.0f, 1.0f},
753 {xpos, ypos + h, 0.0f, 0.0f},
754 {xpos + w, ypos, 1.0f, 1.0f},
755 {xpos + w, ypos + h, 1.0f, 0.0f}};
758 CHKERR(glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices));
761 }
762 x += (sym.advance >> 6) * scale; // shift is in 1/64th of a pixel
763 }
764 if (!mDisplay->useMultiVBO()) {
765 CHKERR(glBindBuffer(GL_ARRAY_BUFFER, mVBOId[0])); // If we don't use multiple buffers, we keep the default buffer bound
766 }
767}
768
770{
771 if (mMixBuffer.created) {
773 }
776 }
779 }
780}
781
783{
786
787 updateRenderer(false);
788
789 float vertices[6][4] = {
790 {0, (float)mRenderHeight, 0.0f, 1.0f},
791 {0, 0, 0.0f, 0.0f},
792 {(float)mRenderWidth, 0, 1.0f, 0.0f},
793 {0, (float)mRenderHeight, 0.0f, 1.0f},
794 {(float)mRenderWidth, 0, 1.0f, 0.0f},
795 {(float)mRenderWidth, (float)mRenderHeight, 1.0f, 1.0f}};
797 CHKERR(glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices));
799 if (!mDisplay->useMultiVBO()) {
800 CHKERR(glBindBuffer(GL_ARRAY_BUFFER, mVBOId[0])); // If we don't use multiple buffers, we keep the default buffer bound
801 }
802}
803
804void GPUDisplayBackendOpenGL::updateRenderer(bool withScreenshot)
805{
806 mDownsampleFactor = getDownsampleFactor(withScreenshot);
810 if (mDisplay->cfgR().drawQualityMSAA > 1) {
812 }
813 if (mDownsampleFactor != 1) {
815 }
816 createFB(mMixBuffer, true, true, false, mRenderWidth, mRenderHeight);
817 setQuality();
818}
819
820#else // GPUCA_BUILD_EVENT_DISPLAY_OPENGL
826int32_t GPUDisplayBackendOpenGL::ExtInit() { throw std::runtime_error("Insufficnet OpenGL version"); }
829uint32_t GPUDisplayBackendOpenGL::drawVertices(const vboList& v, const drawType t) { return 0; }
830void GPUDisplayBackendOpenGL::ActivateColor(std::array<float, 4>& color) {}
833int32_t GPUDisplayBackendOpenGL::InitBackendA() { throw std::runtime_error("Insufficnet OpenGL version"); }
835void GPUDisplayBackendOpenGL::loadDataToGPU(size_t totalVertizes) {}
836void GPUDisplayBackendOpenGL::prepareDraw(const hmm_mat4& proj, const hmm_mat4& view, bool requestScreenshot, bool toMixBuffer, float includeMixImage) {}
838void GPUDisplayBackendOpenGL::finishDraw(bool doScreenshot, bool toMixBuffer, float includeMixImage) {}
839void GPUDisplayBackendOpenGL::finishFrame(bool doScreenshot, bool toMixBuffer, float includeMixImage) {}
844void GPUDisplayBackendOpenGL::addFontSymbol(int32_t symbol, int32_t sizex, int32_t sizey, int32_t offsetx, int32_t offsety, int32_t advance, void* data) {}
846void GPUDisplayBackendOpenGL::OpenGLPrint(const char* s, float x, float y, float* color, float scale) {}
847#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
const GPUParam * param()
Definition GPUDisplay.h:74
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:76
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
#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]