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
64#ifdef GPUCA_DISPLAY_GL3W
75#ifdef GPUCA_DISPLAY_OPENGL_CORE
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"); \
101#ifndef GPUCA_DISPLAY_OPENGL_CORE
110 fb.
depth = withDepth;
112 GLint drawFboId = 0, readFboId = 0;
150 if (tex && fb.
msaa) {
159 GPUError(
"Error creating framebuffer (tex %d) - incomplete (%d)", (int32_t)tex, status);
189 auto first = std::get<0>(
v);
190 auto count = std::get<1>(
v);
191 auto iSector = std::get<2>(
v);
201#ifndef GPUCA_DISPLAY_OPENGL_CORE
215 for (uint32_t k = 0; k <
count; k++) {
227#ifndef GPUCA_DISPLAY_OPENGL_CORE
276 int32_t status, loglen;
279 printf(
"failed to compile shader\n");
281 std::vector<char>
buf(loglen + 1);
284 printf(
"%s\n",
buf.data());
292 int32_t status, loglen;
295 printf(
"failed to link program\n");
297 std::vector<char>
buf(loglen + 1);
300 printf(
"%s\n",
buf.data());
310 GPUInfo(
"Renderer: %s", (
const char*)renderer);
313 int32_t glVersion[2] = {0, 0};
325#ifndef GPUCA_DISPLAY_OPENGL_CORE
326 CHKERR(glShadeModel(GL_SMOOTH));
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"))) {
341 GPUInfo(
"Using SPIR-V shaders");
484 }
else if (toMixBuffer) {
492#ifndef GPUCA_DISPLAY_OPENGL_CORE
508#ifndef GPUCA_DISPLAY_OPENGL_CORE
520#ifndef GPUCA_DISPLAY_OPENGL_CORE
522 CHKERR(glMatrixMode(GL_PROJECTION));
524 CHKERR(glMatrixMode(GL_MODELVIEW));
529 const hmm_mat4 modelViewProj = proj * view;
545#ifndef GPUCA_DISPLAY_OPENGL_CORE
557 CHKERR(
glBlitNamedFramebuffer(
mOffscreenBufferMSAA.
fb_id, dstId, 0, 0,
mRenderWidth,
mRenderHeight, 0, 0,
mRenderWidth,
mRenderHeight,
GL_COLOR_BUFFER_BIT,
GL_LINEAR));
559 if (includeMixImage > 0) {
564 CHKERR(
glBlitNamedFramebuffer(
mOffscreenBuffer.
fb_id, 0, 0, 0,
mRenderWidth,
mRenderHeight, 0, 0,
mScreenWidth,
mScreenHeight,
GL_COLOR_BUFFER_BIT,
GL_LINEAR));
567 if (doScreenshot && !toMixBuffer) {
574 int32_t scaleFactor =
mDisplay->
cfgR().screenshotScaleFactor;
580 CHKERR(
glBlitNamedFramebuffer(
mOffscreenBuffer.
fb_id, tmpBuffer.
fb_id, 0, 0,
mRenderWidth,
mRenderHeight, 0, 0,
width,
height,
GL_COLOR_BUFFER_BIT,
GL_LINEAR));
600#ifndef GPUCA_DISPLAY_OPENGL_CORE
601 glMatrixMode(GL_MODELVIEW);
603 glMatrixMode(GL_PROJECTION);
604 glLoadMatrixf(&proj.
Elements[0][0]);
612 float color[4] = {1.0f, 1.0f, 1.0f, 1.0f};
630#ifndef GPUCA_DISPLAY_OPENGL_CORE
632 glMatrixMode(GL_MODELVIEW);
634 glMatrixMode(GL_PROJECTION);
635 glLoadMatrixf(&proj.
Elements[0][0]);
649#ifndef GPUCA_DISPLAY_OPENGL_CORE
651 glColor4f(1, 1, 1, mixSlaveImage);
662 glColor4f(1, 1, 1, 0);
691 throw std::runtime_error(
"Incorrect symbol ID");
695 std::vector<uint8_t> tmp;
697 tmp.resize(sizex * sizey);
699 for (int32_t
i = 0;
i < sizex * sizey;
i++) {
700 tmp[
i] =
src[
i] > 128 ? 255 : 0;
704 mFontSymbols.emplace_back(FontSymbolOpenGL{{{sizex, sizey}, {offsetx, offsety},
advance}, texId});
705 if (sizex == 0 || sizey == 0) {
740 for (
const char*
c = s; *
c;
c++) {
742 GPUError(
"Trying to draw unsupported symbol: %d > %d\n", (int32_t)*
c, (int32_t)
mFontSymbols.size());
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}};
764 x += (sym.advance >> 6) * scale;
791 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()
#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