15#ifdef GPUCA_DISPLAY_GL3W
20#if __has_include(<GL/glu.h>)
23#define gluErrorString(err) ""
33#define OPENGL_EMULATE_MULTI_DRAW 0
37#ifdef GPUCA_BUILD_EVENT_DISPLAY_VULKAN
44#define GPUCA_BUILD_EVENT_DISPLAY_OPENGL
45#if !defined(GL_VERSION_4_5) || GL_VERSION_4_5 != 1
46#ifdef GPUCA_STANDALONE
48#elif defined(GPUCA_O2_LIB)
49#pragma message "Unsupported OpenGL version < 4.5, disabling standalone event display"
51#warning Unsupported OpenGL version < 4.5, disabling standalone event display
53#undef GPUCA_BUILD_EVENT_DISPLAY_OPENGL
56#ifdef GPUCA_BUILD_EVENT_DISPLAY_OPENGL
66#ifdef GPUCA_DISPLAY_GL3W
75#ifdef GPUCA_DISPLAY_OPENGL_CORE
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"); \
96#ifndef GPUCA_DISPLAY_OPENGL_CORE
105 fb.
depth = withDepth;
107 GLint drawFboId = 0, readFboId = 0;
145 if (tex && fb.
msaa) {
154 GPUError(
"Error creating framebuffer (tex %d) - incomplete (%d)", (int32_t)tex, status);
184 auto first = std::get<0>(
v);
185 auto count = std::get<1>(
v);
186 auto iSector = std::get<2>(
v);
196#ifndef GPUCA_DISPLAY_OPENGL_CORE
210 for (uint32_t k = 0; k <
count; k++) {
222#ifndef GPUCA_DISPLAY_OPENGL_CORE
271 int32_t status, loglen;
274 printf(
"failed to compile shader\n");
276 std::vector<char>
buf(loglen + 1);
279 printf(
"%s\n",
buf.data());
287 int32_t status, loglen;
290 printf(
"failed to link program\n");
292 std::vector<char>
buf(loglen + 1);
295 printf(
"%s\n",
buf.data());
305 GPUInfo(
"Renderer: %s", (
const char*)renderer);
308 int32_t glVersion[2] = {0, 0};
320#ifndef GPUCA_DISPLAY_OPENGL_CORE
321 CHKERR(glShadeModel(GL_SMOOTH));
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"))) {
336 GPUInfo(
"Using SPIR-V shaders");
479 }
else if (toMixBuffer) {
487#ifndef GPUCA_DISPLAY_OPENGL_CORE
503#ifndef GPUCA_DISPLAY_OPENGL_CORE
515#ifndef GPUCA_DISPLAY_OPENGL_CORE
517 CHKERR(glMatrixMode(GL_PROJECTION));
519 CHKERR(glMatrixMode(GL_MODELVIEW));
524 const hmm_mat4 modelViewProj = proj * view;
540#ifndef GPUCA_DISPLAY_OPENGL_CORE
552 CHKERR(
glBlitNamedFramebuffer(
mOffscreenBufferMSAA.
fb_id, dstId, 0, 0,
mRenderWidth,
mRenderHeight, 0, 0,
mRenderWidth,
mRenderHeight,
GL_COLOR_BUFFER_BIT,
GL_LINEAR));
554 if (includeMixImage > 0) {
559 CHKERR(
glBlitNamedFramebuffer(
mOffscreenBuffer.
fb_id, 0, 0, 0,
mRenderWidth,
mRenderHeight, 0, 0,
mScreenWidth,
mScreenHeight,
GL_COLOR_BUFFER_BIT,
GL_LINEAR));
562 if (doScreenshot && !toMixBuffer) {
569 int32_t scaleFactor =
mDisplay->
cfgR().screenshotScaleFactor;
575 CHKERR(
glBlitNamedFramebuffer(
mOffscreenBuffer.
fb_id, tmpBuffer.
fb_id, 0, 0,
mRenderWidth,
mRenderHeight, 0, 0,
width,
height,
GL_COLOR_BUFFER_BIT,
GL_LINEAR));
595#ifndef GPUCA_DISPLAY_OPENGL_CORE
596 glMatrixMode(GL_MODELVIEW);
598 glMatrixMode(GL_PROJECTION);
599 glLoadMatrixf(&proj.
Elements[0][0]);
607 float color[4] = {1.0f, 1.0f, 1.0f, 1.0f};
625#ifndef GPUCA_DISPLAY_OPENGL_CORE
627 glMatrixMode(GL_MODELVIEW);
629 glMatrixMode(GL_PROJECTION);
630 glLoadMatrixf(&proj.
Elements[0][0]);
644#ifndef GPUCA_DISPLAY_OPENGL_CORE
646 glColor4f(1, 1, 1, mixSlaveImage);
657 glColor4f(1, 1, 1, 0);
686 throw std::runtime_error(
"Incorrect symbol ID");
690 std::vector<uint8_t> tmp;
692 tmp.resize(sizex * sizey);
694 for (int32_t
i = 0;
i < sizex * sizey;
i++) {
695 tmp[
i] =
src[
i] > 128 ? 255 : 0;
699 mFontSymbols.emplace_back(FontSymbolOpenGL{{{sizex, sizey}, {offsetx, offsety},
advance}, texId});
700 if (sizex == 0 || sizey == 0) {
735 for (
const char*
c = s; *
c;
c++) {
737 GPUError(
"Trying to draw unsupported symbol: %d > %d\n", (int32_t)*
c, (int32_t)
mFontSymbols.size());
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}};
759 x += (sym.advance >> 6) * scale;
786 float vertices[6][4] = {
#define OPENGL_EMULATE_MULTI_DRAW
HMM_INLINE hmm_mat4 HMM_Orthographic(float Left, float Right, float Bottom, float Top, float Near, float Far)
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
GPUDisplayBackendOpenGL()
void loadDataToGPU(size_t totalVertizes) override
void setQuality() override
GLfb mOffscreenBufferMSAA
uint32_t mSPIRVModelViewBuffer
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 mShaderProgramTexture
uint32_t drawVertices(const vboList &v, const drawType t) override
int32_t InitBackendA() override
uint32_t mFragmentShaderText
static int32_t checkProgramStatus(uint32_t program)
void createFB(GLfb &fb, bool tex, bool withDepth, bool msaa, uint32_t width, uint32_t height)
int32_t ExtInit() override
void pointSizeFactor(float factor) override
void prepareText() override
bool CoreProfile() override
static int32_t checkShaderStatus(uint32_t shader)
void initializeTextDrawing() override
void ExitMagFieldVisualization()
int32_t mModelViewProjIdText
void ClearOffscreenBuffers()
uint32_t mShaderProgramText
std::vector< uint32_t > mVBOId
uint32_t DepthBits() override
uint32_t mVertexShaderTexture
void mixImages(float mixSlaveImage)
void finishText() override
std::vector< FontSymbolOpenGL > mFontSymbols
void updateRenderer(bool withScreenshot)
uint32_t mFragmentShaderTexture
uint32_t mFieldModelViewBuffer
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
uint32_t mSPIRVColorBuffer
int32_t mModelViewProjIdTexture
void setDepthBuffer() override
void ExitBackendA() override
vecpod< DrawArraysIndirectCommand > mCmdBuffer
std::vector< int32_t > mIndirectSectorOffset
void fillIndirectCmdBuffer()
bool mFreetypeInitialized
std::vector< char > mScreenshotPixels
backendTypes mBackendType
std::unique_ptr< GPUDisplayMagneticField > mMagneticFieldVisualization
const char * mBackendName
float getDownsampleFactor(bool screenshot=false)
int32_t mDownsampleFactor
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
int32_t updateRenderPipeline() const
const GPUSettingsDisplayRenderer & cfgR() const
vecpod< vtx > * vertexBuffer()
bool drawTextInCompatMode() const
const vecpod< uint32_t > * vertexBufferCount() const
vecpod< int32_t > * vertexBufferStart()
const GPUSettingsProcessing & GetProcessingSettings() const
#define glNamedBufferData
#define glGetUniformLocation
#define glUniformMatrix4fv
#define glSpecializeShader
#define glCheckFramebufferStatus
#define glDeleteVertexArrays
#define glGetShaderInfoLog
#define glFramebufferTexture2D
#define glBindVertexArray
#define glRenderbufferStorageMultisample
#define glMultiDrawArrays
#define glEnableVertexAttribArray
#define glGenVertexArrays
#define glBindFramebuffer
#define glVertexAttribPointer
#define glGenRenderbuffers
#define glBindRenderbuffer
#define glBlitNamedFramebuffer
#define glDeleteFramebuffers
#define glFramebufferRenderbuffer
#define glMultiDrawArraysIndirect
#define glTexImage2DMultisample
#define glNamedBufferSubData
#define glGetProgramInfoLog
#define glDeleteRenderbuffers
#define glRenderbufferStorage
#define glGenFramebuffers
#define GL_TEXTURE_MIN_FILTER
#define GL_FRAGMENT_SHADER
#define GL_UNIFORM_BUFFER
#define GL_TEXTURE_WRAP_S
#define GL_PACK_ALIGNMENT
GLsizei GLenum GLenum * types
#define GL_COLOR_ATTACHMENT0
GLbitfield GLuint program
GLint GLsizei GLsizei height
#define GL_FRAMEBUFFER_COMPLETE
#define GL_DRAW_FRAMEBUFFER
#define GL_COMPILE_STATUS
#define GL_UNPACK_ALIGNMENT
#define GL_COLOR_BUFFER_BIT
#define GL_ONE_MINUS_SRC_ALPHA
#define GL_TEXTURE_2D_MULTISAMPLE
#define GL_DRAW_FRAMEBUFFER_BINDING
#define GL_READ_FRAMEBUFFER
#define GL_TEXTURE_WRAP_T
#define GL_DEPTH_ATTACHMENT
#define GL_TEXTURE_MAG_FILTER
#define GL_DEPTH_COMPONENT24
GLenum GLuint GLenum GLsizei const GLchar * buf
GLubyte GLubyte GLubyte GLubyte w
#define GL_READ_FRAMEBUFFER_BINDING
#define GL_INFO_LOG_LENGTH
#define GL_DEPTH_BUFFER_BIT
#define GL_DRAW_INDIRECT_BUFFER
#define GL_SHADER_BINARY_FORMAT_SPIR_V_ARB
uint8_t itsSharedClusterMap uint8_t
int advance(std::istream &in, size_t itemByteSize, const char *itemName)
#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