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#include "HandMadeMath.h"
26
27#include "GPUCommonDef.h"
29#include "GPUDisplay.h"
30#include "GPULogging.h"
31#include "GPUParam.h"
32#include "GPUTPCGeometry.h"
33
34#define OPENGL_EMULATE_MULTI_DRAW 0
35
36using namespace o2::gpu;
37
38#define GPUCA_DISPLAY_SHADER_TYPE_OPENGL
39#include "GPUDisplayLoadShaders.h"
40
41uint32_t GPUDisplayBackendOpenGL::loadShader(uint32_t type, const char* spirv, size_t size)
42{
43 uint32_t shader = glCreateShader(type);
45 glSpecializeShader(shader, "main", 0, nullptr, nullptr);
46 return shader;
47}
48
54
56{
57#ifdef GPUCA_DISPLAY_GL3W
58 return gl3wInit();
59#else
60 return glewInit();
61#endif
62}
63
68
70{
71#ifdef GPUCA_DISPLAY_OPENGL_CORE
72 return true;
73#else
74 return false;
75#endif
76}
77
78// #define CHKERR(cmd) {cmd;}
79#define CHKERR(cmd) \
80 do { \
81 (cmd); \
82 GLenum err = glGetError(); \
83 while (err != GL_NO_ERROR) { \
84 GPUError("OpenGL Error %d: %s (%s: %d)", (int32_t)err, (const char*)gluErrorString(err), __FILE__, __LINE__); \
85 throw std::runtime_error("OpenGL Failure"); \
86 } \
87 } while (false)
88
90{
91 GLint depthBits = 0;
92#ifndef GPUCA_DISPLAY_OPENGL_CORE
93 glGetIntegerv(GL_DEPTH_BITS, &depthBits);
94#endif
95 return depthBits;
96}
97
98void GPUDisplayBackendOpenGL::createFB(GLfb& fb, bool tex, bool withDepth, bool msaa, uint32_t width, uint32_t height)
99{
100 fb.tex = tex;
101 fb.depth = withDepth;
102 fb.msaa = msaa;
103 GLint drawFboId = 0, readFboId = 0;
108
109 auto createFB_texture = [&](GLuint& id, GLenum storage, GLenum attachment) {
111 CHKERR(glGenTextures(1, &id));
112 CHKERR(glBindTexture(textureType, id));
113 if (fb.msaa) {
114 CHKERR(glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, mDisplay->cfgR().drawQualityMSAA, storage, width, height, false));
115 } else {
116 CHKERR(glTexImage2D(GL_TEXTURE_2D, 0, storage, width, height, 0, storage, GL_UNSIGNED_BYTE, nullptr));
119 }
121 };
122
123 auto createFB_renderbuffer = [&](GLuint& id, GLenum storage, GLenum attachment) {
124 CHKERR(glGenRenderbuffers(1, &id));
126 if (fb.msaa) {
128 } else {
130 }
132 };
133
134 if (tex) {
135 createFB_texture(fb.fbCol_id, GL_RGBA, GL_COLOR_ATTACHMENT0);
136 } else {
137 createFB_renderbuffer(fb.fbCol_id, GL_RGBA, GL_COLOR_ATTACHMENT0);
138 }
139
140 if (withDepth) {
141 if (tex && fb.msaa) {
143 } else {
144 createFB_renderbuffer(fb.fbDepth_id, GL_DEPTH_COMPONENT24, GL_DEPTH_ATTACHMENT);
145 }
146 }
147
149 if (status != GL_FRAMEBUFFER_COMPLETE) {
150 GPUError("Error creating framebuffer (tex %d) - incomplete (%d)", (int32_t)tex, status);
151 exit(1);
152 }
155 fb.created = true;
156}
157
159{
160 if (fb.tex) {
162 } else {
164 }
165 if (fb.depth) {
166 if (fb.tex && fb.msaa) {
168 } else {
170 }
171 }
173 fb.created = false;
174}
175
177{
178 static constexpr GLenum types[3] = {GL_POINTS, GL_LINES, GL_LINE_STRIP};
179 GLenum t = types[tt];
180 auto first = std::get<0>(v);
181 auto count = std::get<1>(v);
182 auto iSector = std::get<2>(v);
183 if (count == 0) {
184 return 0;
185 }
186
187 if (mDisplay->useMultiVBO()) {
188 if (!mDisplay->cfgR().rendererCompatSmoothing) { // TODO: Remove OpenGL compat profile completely
190 }
192#ifndef GPUCA_DISPLAY_OPENGL_CORE
193 if (mDisplay->cfgR().rendererCompatSmoothing) {
194 CHKERR(glVertexPointer(3, GL_FLOAT, 0, nullptr));
195 } else
196#endif
197 {
198 CHKERR(glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, nullptr));
200 }
201 }
202
204 if (smoothProgram) {
205 CHKERR(glUseProgram(smoothProgram));
206 }
207 if (mDisplay->cfgR().useGLIndirectDraw) {
209 } else if (OPENGL_EMULATE_MULTI_DRAW) {
210 for (uint32_t k = 0; k < count; k++) {
212 }
213 } else {
214 static_assert(sizeof(GLsizei) == sizeof(*mDisplay->vertexBufferCount()[iSector].data()), "Invalid counter size does not match GLsizei");
216 }
217 if (smoothProgram) {
219 }
220 return count;
221}
222
224{
225#ifndef GPUCA_DISPLAY_OPENGL_CORE
226 if (mDisplay->cfgR().rendererCompatSmoothing) {
227 glColor4f(color[0], color[1], color[2], color[3]);
228 } else
229#endif
230 {
234 }
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->GetProcessingSettings().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 }
319 GLint value = 0;
320 glGetIntegerv(limit, &value);
321 mMaxRenderSize = std::min<uint32_t>(mMaxRenderSize, value);
322 }
323 mVBOId.resize(GPUTPCGeometry::NSECTORS);
324 CHKERR(glCreateBuffers(mVBOId.size(), mVBOId.data()));
328#ifndef GPUCA_DISPLAY_OPENGL_CORE
329 CHKERR(glShadeModel(GL_SMOOTH)); // Enable Smooth Shading
330#endif
332 setQuality();
333 CHKERR(mVertexShader = loadShader(GL_VERTEX_SHADER, _binary_opengl_vertex_vert_spv_start, _binary_opengl_vertex_vert_spv_len));
334 CHKERR(mFragmentShader = loadShader(GL_FRAGMENT_SHADER, _binary_opengl_fragment_frag_spv_start, _binary_opengl_fragment_frag_spv_len));
335 CHKERR(mVertexShaderTexture = loadShader(GL_VERTEX_SHADER, _binary_opengl_vertexTexture_vert_spv_start, _binary_opengl_vertexTexture_vert_spv_len));
336 CHKERR(mFragmentShaderTexture = loadShader(GL_FRAGMENT_SHADER, _binary_opengl_fragmentTexture_frag_spv_start, _binary_opengl_fragmentTexture_frag_spv_len));
337 CHKERR(mFragmentShaderText = loadShader(GL_FRAGMENT_SHADER, _binary_opengl_fragmentText_frag_spv_start, _binary_opengl_fragmentText_frag_spv_len));
338 CHKERR(mVertexShaderFullscreen = loadShader(GL_VERTEX_SHADER, _binary_opengl_vertexFullscreen_vert_spv_start, _binary_opengl_vertexFullscreen_vert_spv_len));
339 CHKERR(mFragmentShaderDownsample = loadShader(GL_FRAGMENT_SHADER, _binary_opengl_fragmentDownsample_frag_spv_start, _binary_opengl_fragmentDownsample_frag_spv_len));
340 CHKERR(mVertexShaderSmoothPoint = loadShader(GL_VERTEX_SHADER, _binary_opengl_vertexSmoothPoint_vert_spv_start, _binary_opengl_vertexSmoothPoint_vert_spv_len));
341 CHKERR(mFragmentShaderSmoothPoint = loadShader(GL_FRAGMENT_SHADER, _binary_opengl_fragmentSmoothPoint_frag_spv_start, _binary_opengl_fragmentSmoothPoint_frag_spv_len));
342 CHKERR(mVertexShaderSmoothLine = loadShader(GL_VERTEX_SHADER, _binary_opengl_vertexSmoothLine_vert_spv_start, _binary_opengl_vertexSmoothLine_vert_spv_len));
343 CHKERR(mFragmentShaderSmoothLine = loadShader(GL_FRAGMENT_SHADER, _binary_opengl_fragmentSmoothLine_frag_spv_start, _binary_opengl_fragmentSmoothLine_frag_spv_len));
345 return 1;
346 }
352 return 1;
353 }
359 return 1;
360 }
366 return 1;
367 }
373 return 1;
374 }
380 return 1;
381 }
387 return 1;
388 }
390
395 CHKERR(glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 6 * 4, nullptr, GL_DYNAMIC_DRAW));
397 CHKERR(glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(float), nullptr));
399
401 return 0;
402}
403
405{
407 CHKERR(glDeleteBuffers(mVBOId.size(), mVBOId.data()));
426
428
431
435 for (auto& symbol : mFontSymbols) {
436 CHKERR(glDeleteTextures(1, &symbol.texId));
437 }
438 }
441 }
442}
443
445{
446 if (mDisplay->cfgL().invertColors && !alphaOnly) {
447 CHKERR(glClearColor(1.0f, 1.0f, 1.0f, 1.0f));
448 } else {
449 CHKERR(glClearColor(0.0f, 0.0f, 0.0f, 1.0f));
450 }
451 if (alphaOnly) {
452 glColorMask(false, false, false, true);
454 glColorMask(true, true, true, true);
455 } else {
456 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer
457 }
458}
459
461{
462 // TODO: Check if this can be parallelized
463 if (mDisplay->useMultiVBO()) {
464 for (uint32_t i = 0; i < GPUTPCGeometry::NSECTORS; i++) {
466 }
467 } else {
468 CHKERR(glBindBuffer(GL_ARRAY_BUFFER, mVBOId[0])); // Bind ahead of time, since it is not going to change
469 CHKERR(glNamedBufferData(mVBOId[0], totalVertizes * sizeof(mDisplay->vertexBuffer()[0][0]), mDisplay->vertexBuffer()[0].data(), GL_STATIC_DRAW));
470 }
471
472 if (mDisplay->cfgR().useGLIndirectDraw) {
475 mCmdBuffer.clear();
476 }
477}
478
479bool GPUDisplayBackendOpenGL::prepareDraw(const hmm_mat4& proj, const hmm_mat4& view, bool requestScreenshot, bool toMixBuffer, float includeMixImage)
480{
481 if (mDisplay->updateRenderPipeline() || mDownsampleFactor != getDownsampleFactor(requestScreenshot)) {
482 updateRenderer(requestScreenshot);
483 }
484 if (toMixBuffer && !mMixBuffer.created) { // Only allocated when mixing is used, freed with the other offscreen buffers
485 createFB(mMixBuffer, true, true, false, mRenderWidth, mRenderHeight);
486 }
489 } else if (toMixBuffer) {
491 } else if (mOffscreenBuffer.created) {
493 } else {
495 }
496 clearScreen();
497 mUseSmoothPointShader = mDisplay->cfgL().smoothPoints && !mDisplay->cfgR().rendererCompatSmoothing; // The compat profile uses GL_POINT_SMOOTH / GL_LINE_SMOOTH
498 mUseSmoothLineShader = mDisplay->cfgL().smoothLines && !mDisplay->cfgR().rendererCompatSmoothing;
499#ifndef GPUCA_DISPLAY_OPENGL_CORE
500 if (mUseSmoothPointShader) { // Compatibility context: gl_PointCoord is only defined with point sprites
501 CHKERR(glEnable(GL_POINT_SPRITE));
502 } else {
503 CHKERR(glDisable(GL_POINT_SPRITE));
504 }
505 if (mDisplay->cfgL().smoothPoints && mDisplay->cfgR().rendererCompatSmoothing) {
506 CHKERR(glEnable(GL_POINT_SMOOTH));
507 } else {
508 CHKERR(glDisable(GL_POINT_SMOOTH));
509 }
510 if (mDisplay->cfgL().smoothLines && mDisplay->cfgR().rendererCompatSmoothing) {
512 } else {
514 }
515#endif
518
520#ifndef GPUCA_DISPLAY_OPENGL_CORE
521 if (mDisplay->cfgR().rendererCompatSmoothing) {
522 CHKERR(glEnableClientState(GL_VERTEX_ARRAY));
523 CHKERR(glVertexPointer(3, GL_FLOAT, 0, nullptr));
524 } else
525#endif
526 {
529 CHKERR(glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, nullptr));
531 }
532#ifndef GPUCA_DISPLAY_OPENGL_CORE
533 if (mDisplay->cfgR().rendererCompatSmoothing) {
534 CHKERR(glMatrixMode(GL_PROJECTION));
535 CHKERR(glLoadMatrixf(&proj.Elements[0][0]));
536 CHKERR(glMatrixMode(GL_MODELVIEW));
537 CHKERR(glLoadMatrixf(&view.Elements[0][0]));
538 } else
539#endif
540 {
541 const hmm_mat4 modelViewProj = proj * view;
545 }
549 }
551 CHKERR(glNamedBufferSubData(mFieldModelViewBuffer, 0, sizeof(modelViewProj), &modelViewProj));
552 }
553 }
554 return true;
555}
556
557void GPUDisplayBackendOpenGL::finishDraw(bool doScreenshot, bool toMixBuffer, float includeMixImage)
558{
559#ifndef GPUCA_DISPLAY_OPENGL_CORE
560 if (mDisplay->cfgR().rendererCompatSmoothing) {
561 CHKERR(glDisableClientState(GL_VERTEX_ARRAY));
562 } else
563#endif
564 {
567 }
568
570 uint32_t dstId = toMixBuffer ? mMixBuffer.fb_id : (mDownsampleFactor != 1 ? mOffscreenBuffer.fb_id : 0);
572 }
573 if (includeMixImage > 0) {
575 mixImages(includeMixImage);
576 }
577 if (mDownsampleFactor == 2 && !toMixBuffer) { // The linear blit is only exact for factor 2
579 } else if (mDownsampleFactor != 1 && !toMixBuffer) {
581 }
582
583 if (doScreenshot && !toMixBuffer) {
585 }
586}
587
589{
590 int32_t scaleFactor = mDisplay->cfgR().screenshotScaleFactor;
591 uint32_t width = mScreenWidth * scaleFactor;
592 uint32_t height = mScreenHeight * scaleFactor;
593 GLfb tmpBuffer;
594 if (mDisplay->cfgR().drawQualityDownsampleFSAA && mDisplay->cfgR().screenshotScaleFactor != 1) {
595 createFB(tmpBuffer, false, true, false, width, height);
596 const int32_t factor = mRenderWidth / width;
597 if (factor > 2) {
599 } else {
601 }
602 }
603 setFrameBuffer(tmpBuffer.created ? tmpBuffer.fb_id : (scaleFactor != 1 ? mOffscreenBuffer.fb_id : 0));
605 CHKERR(glReadBuffer(scaleFactor != 1 ? GL_COLOR_ATTACHMENT0 : GL_BACK));
606 mScreenshotPixels.resize(width * height * 4);
608 if (tmpBuffer.created) {
609 deleteFB(tmpBuffer);
610 }
611}
612
613void GPUDisplayBackendOpenGL::finishFrame(bool doScreenshot, bool toMixBuffer, float includeMixImage) {}
614
616{
619 hmm_mat4 proj = HMM_Orthographic(0.f, mScreenWidth, 0.f, mScreenHeight, -1, 1);
621#ifndef GPUCA_DISPLAY_OPENGL_CORE
622 glMatrixMode(GL_MODELVIEW);
623 glLoadIdentity();
624 glMatrixMode(GL_PROJECTION);
625 glLoadMatrixf(&proj.Elements[0][0]);
627#endif
628 } else if (mFreetypeInitialized) {
633 float color[4] = {1.0f, 1.0f, 1.0f, 1.0f};
635 }
636}
637
646
647void GPUDisplayBackendOpenGL::drawDownsample(uint32_t srcTexture, uint32_t dstFramebuffer, uint32_t width, uint32_t height, int32_t factor)
648{
649 setFrameBuffer(dstFramebuffer);
650 CHKERR(glViewport(0, 0, width, height));
656 CHKERR(glBindTexture(GL_TEXTURE_2D, srcTexture));
657 CHKERR(glBindVertexArray(VAO_texture)); // Any VAO, the full-screen triangle has no vertex input
664}
665
666void GPUDisplayBackendOpenGL::mixImages(float mixSlaveImage)
667{
668 hmm_mat4 proj = HMM_Orthographic(0.f, mRenderWidth, 0.f, mRenderHeight, -1.f, 1.f);
670#ifndef GPUCA_DISPLAY_OPENGL_CORE
671 if (mDisplay->cfgR().rendererCompatSmoothing) {
672 glMatrixMode(GL_MODELVIEW);
673 glLoadIdentity();
674 glMatrixMode(GL_PROJECTION);
675 glLoadMatrixf(&proj.Elements[0][0]);
677 } else
678#endif
679 {
685 }
686
688
689#ifndef GPUCA_DISPLAY_OPENGL_CORE
690 if (mDisplay->cfgR().rendererCompatSmoothing) {
691 glColor4f(1, 1, 1, mixSlaveImage);
692 glBegin(GL_QUADS);
693 glTexCoord2f(0, 0);
694 glVertex3f(0, 0, 0);
695 glTexCoord2f(0, 1);
696 glVertex3f(0, mRenderHeight, 0);
697 glTexCoord2f(1, 1);
698 glVertex3f(mRenderWidth, mRenderHeight, 0);
699 glTexCoord2f(1, 0);
700 glVertex3f(mRenderWidth, 0, 0);
701 glEnd();
702 glColor4f(1, 1, 1, 0);
704 } else
705#endif
706 {
710 }
713}
714
723
725{
726 float width = mDisplay->cfgL().lineWidth * mDownsampleFactor * factor;
730 width *= 1.4143f; // Wide lines are parallelograms in OpenGL, widen so that the perpendicular width is covered
731 }
733}
734
735void GPUDisplayBackendOpenGL::addFontSymbol(int32_t symbol, int32_t sizex, int32_t sizey, int32_t offsetx, int32_t offsety, int32_t advance, void* data)
736{
737 int32_t oldAlign;
740 if (symbol != (int32_t)mFontSymbols.size()) {
741 throw std::runtime_error("Incorrect symbol ID");
742 }
743 uint32_t texId;
744 glGenTextures(1, &texId);
745 std::vector<uint8_t> tmp;
746 if (!smoothFont()) {
747 tmp.resize(sizex * sizey);
748 uint8_t* src = (uint8_t*)data;
749 for (int32_t i = 0; i < sizex * sizey; i++) {
750 tmp[i] = src[i] > 128 ? 255 : 0;
751 }
752 data = tmp.data();
753 }
754 mFontSymbols.emplace_back(FontSymbolOpenGL{{{sizex, sizey}, {offsetx, offsety}, advance}, texId});
755 if (sizex == 0 || sizey == 0) {
756 return;
757 }
765}
766
768{
771 for (auto& symbol : mFontSymbols) {
772 CHKERR(glDeleteTextures(1, &symbol.texId));
773 }
774 mFontSymbols.clear();
775}
776
789
790void GPUDisplayBackendOpenGL::OpenGLPrint(const char* s, float x, float y, float* color, float scale)
791{
793 return;
794 }
796
797 if (smoothFont()) {
798 scale *= 0.25f; // Font size is 48 to have nice bitmap, scale to size 12
799 }
800 for (const unsigned char* c = (const unsigned char*)s; *c; c++) {
801 if ((int32_t)*c >= (int32_t)mFontSymbols.size()) {
802 GPUError("Trying to draw unsupported symbol: %d > %d\n", (int32_t)*c, (int32_t)mFontSymbols.size());
803 continue;
804 }
806 if (sym.size[0] && sym.size[1]) {
807 float xpos = x + sym.offset[0] * scale;
808 float ypos = y - (sym.size[1] - sym.offset[1]) * scale;
809 float w = sym.size[0] * scale;
810 float h = sym.size[1] * scale;
811 float vertices[6][4] = {
812 {xpos, ypos + h, 0.0f, 0.0f},
813 {xpos, ypos, 0.0f, 1.0f},
814 {xpos + w, ypos, 1.0f, 1.0f},
815 {xpos, ypos + h, 0.0f, 0.0f},
816 {xpos + w, ypos, 1.0f, 1.0f},
817 {xpos + w, ypos + h, 1.0f, 0.0f}};
820 CHKERR(glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices));
823 }
824 x += (sym.advance >> 6) * scale; // shift is in 1/64th of a pixel
825 }
826 if (!mDisplay->useMultiVBO()) {
827 CHKERR(glBindBuffer(GL_ARRAY_BUFFER, mVBOId[0])); // If we don't use multiple buffers, we keep the default buffer bound
828 }
829}
830
843
845{
848
849 updateRenderer(false);
850}
851
853{
854 mDownsampleFactor = getDownsampleFactor(withScreenshot);
858 if (mDisplay->cfgR().drawQualityMSAA > 1) {
860 }
861 if (mDownsampleFactor != 1) {
862 createFB(mOffscreenBuffer, mDownsampleFactor != 2, true, false, mRenderWidth, mRenderHeight); // Texture for shader downsampling (factor != 2), screenshot downsampling uses the shader only if this factor is != 2 as well
863 }
864 setQuality();
865
866 float vertices[6][4] = {// Mix quad at render size
867 {0, (float)mRenderHeight, 0.0f, 1.0f},
868 {0, 0, 0.0f, 0.0f},
869 {(float)mRenderWidth, 0, 1.0f, 0.0f},
870 {0, (float)mRenderHeight, 0.0f, 1.0f},
871 {(float)mRenderWidth, 0, 1.0f, 0.0f},
872 {(float)mRenderWidth, (float)mRenderHeight, 1.0f, 1.0f}};
874 CHKERR(glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices));
875 CHKERR(glBindBuffer(GL_ARRAY_BUFFER, mDisplay->useMultiVBO() ? 0 : mVBOId[0])); // If we don't use multiple buffers, we keep the default buffer bound (also called from prepareDraw before the vertex pointers are set)
876}
int32_t i
#define CHKERR(cmd)
#define OPENGL_EMULATE_MULTI_DRAW
uint32_t iSector
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 lineWidthFactor(float factor) override
static constexpr int32_t UNIFORM_LOCATION_LINE_WIDTH
void resizeScene(uint32_t width, uint32_t height) override
void loadDataToGPU(size_t totalVertizes) override
bool prepareDraw(const hmm_mat4 &proj, const hmm_mat4 &view, bool requestScreenshot, bool toMixBuffer, float includeMixImage) override
static uint32_t loadShader(uint32_t type, const char *spirv, size_t size)
void OpenGLPrint(const char *s, float x, float y, float *color, float scale) override
void drawDownsample(uint32_t srcTexture, uint32_t dstFramebuffer, uint32_t width, uint32_t height, int32_t factor)
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)
static constexpr int32_t UNIFORM_LOCATION_POINT_SIZE
static constexpr int32_t UNIFORM_LOCATION_VIEWPORT
static constexpr int32_t UNIFORM_LOCATION_COLOR
std::vector< FontSymbolOpenGL > mFontSymbols
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
static constexpr int32_t UNIFORM_LOCATION_MATRIX
vecpod< DrawArraysIndirectCommand > mCmdBuffer
std::vector< int32_t > mIndirectSectorOffset
static constexpr float SMOOTH_LINE_EXTRA_WIDTH
std::vector< char > mScreenshotPixels
static constexpr float SMOOTH_POINT_EXTRA_SIZE
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:69
int32_t updateRenderPipeline() const
Definition GPUDisplay.h:74
const GPUSettingsDisplayRenderer & cfgR() const
Definition GPUDisplay.h:68
vecpod< vtx > * vertexBuffer()
Definition GPUDisplay.h:82
bool drawTextInCompatMode() const
Definition GPUDisplay.h:86
GPUDisplayFrontend * frontend()
Definition GPUDisplay.h:85
const vecpod< uint32_t > * vertexBufferCount() const
Definition GPUDisplay.h:77
bool useMultiVBO() const
Definition GPUDisplay.h:72
vecpod< int32_t > * vertexBufferStart()
Definition GPUDisplay.h:76
const GPUSettingsProcessing & GetProcessingSettings() const
Definition GPUDisplay.h:84
#define glNamedBufferData
Definition gl3w.h:1077
#define glAttachShader
Definition gl3w.h:727
#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 glProgramUniform2f
Definition gl3w.h:1118
#define glUniform4fv
Definition gl3w.h:1259
#define glPixelStorei
Definition gl3w.h:1095
#define glGetShaderInfoLog
Definition gl3w.h:985
#define glBindBuffer
Definition gl3w.h:733
#define glDrawBuffer
Definition gl3w.h:860
#define glEnable
Definition gl3w.h:875
#define glFramebufferTexture2D
Definition gl3w.h:893
#define glProgramUniform1f
Definition gl3w.h:1110
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 glProgramUniformMatrix4fv
Definition gl3w.h:1153
#define glPointSize
Definition gl3w.h:1100
#define glGenTextures
Definition gl3w.h:903
#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 glUniform1i
Definition gl3w.h:1236
#define glDeleteShader
Definition gl3w.h:838
#define glLineWidth
Definition gl3w.h:1060
#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 glProgramUniform4fv
Definition gl3w.h:1135
#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
#define GL_MAX_RENDERBUFFER_SIZE
Definition glcorearb.h:1117
GLint GLenum GLint x
Definition glcorearb.h:403
#define GL_MAX_TEXTURE_SIZE
Definition glcorearb.h:194
#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_TEXTURE_WRAP_S
Definition glcorearb.h:261
#define GL_MAX_FRAMEBUFFER_WIDTH
Definition glcorearb.h:2298
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
GLsizeiptr size
Definition glcorearb.h:659
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 first
Definition glcorearb.h:399
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
GLint y
Definition glcorearb.h:270
#define GL_VERTEX_ARRAY
Definition glcorearb.h:398
GLsizei const GLfloat * value
Definition glcorearb.h:819
#define GL_SHADER_BINARY_FORMAT_SPIR_V
Definition glcorearb.h:2863
#define GL_FRAMEBUFFER_COMPLETE
Definition glcorearb.h:1140
GLint GLint GLsizei GLint GLenum GLenum type
Definition glcorearb.h:275
#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
int GLint
Definition glcorearb.h:84
#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_MAX_FRAMEBUFFER_HEIGHT
Definition glcorearb.h:2299
#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
float Elements[4][4]