15#ifdef GPUCA_DISPLAY_GL3W
20#if __has_include(<GL/glu.h>)
23#define gluErrorString(err) ""
31#define OPENGL_EMULATE_MULTI_DRAW 0
35#ifdef GPUCA_BUILD_EVENT_DISPLAY_VULKAN
42#define GPUCA_BUILD_EVENT_DISPLAY_OPENGL
43#if !defined(GL_VERSION_4_5) || GL_VERSION_4_5 != 1
44#ifdef GPUCA_STANDALONE
46#elif defined(GPUCA_O2_LIB)
47#pragma message "Unsupported OpenGL version < 4.5, disabling standalone event display"
49#warning Unsupported OpenGL version < 4.5, disabling standalone event display
51#undef GPUCA_BUILD_EVENT_DISPLAY_OPENGL
54#ifdef GPUCA_BUILD_EVENT_DISPLAY_OPENGL
62#ifdef GPUCA_DISPLAY_GL3W
73#ifdef GPUCA_DISPLAY_OPENGL_CORE
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"); \
99#ifndef GPUCA_DISPLAY_OPENGL_CORE
108 fb.
depth = withDepth;
110 GLint drawFboId = 0, readFboId = 0;
148 if (tex && fb.
msaa) {
157 GPUError(
"Error creating framebuffer (tex %d) - incomplete (%d)", (int32_t)tex, status);
187 auto first = std::get<0>(
v);
188 auto count = std::get<1>(
v);
189 auto iSector = std::get<2>(
v);
199#ifndef GPUCA_DISPLAY_OPENGL_CORE
213 for (uint32_t k = 0; k <
count; k++) {
225#ifndef GPUCA_DISPLAY_OPENGL_CORE
274 int32_t status, loglen;
277 printf(
"failed to compile shader\n");
279 std::vector<char>
buf(loglen + 1);
282 printf(
"%s\n",
buf.data());
290 int32_t status, loglen;
293 printf(
"failed to link program\n");
295 std::vector<char>
buf(loglen + 1);
298 printf(
"%s\n",
buf.data());
308 GPUInfo(
"Renderer: %s", (
const char*)renderer);
311 int32_t glVersion[2] = {0, 0};
323#ifndef GPUCA_DISPLAY_OPENGL_CORE
324 CHKERR(glShadeModel(GL_SMOOTH));
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"))) {
339 GPUInfo(
"Using SPIR-V shaders");
482 }
else if (toMixBuffer) {
490#ifndef GPUCA_DISPLAY_OPENGL_CORE
506#ifndef GPUCA_DISPLAY_OPENGL_CORE
518#ifndef GPUCA_DISPLAY_OPENGL_CORE
520 CHKERR(glMatrixMode(GL_PROJECTION));
522 CHKERR(glMatrixMode(GL_MODELVIEW));
527 const hmm_mat4 modelViewProj = proj * view;
543#ifndef GPUCA_DISPLAY_OPENGL_CORE
555 CHKERR(
glBlitNamedFramebuffer(
mOffscreenBufferMSAA.
fb_id, dstId, 0, 0,
mRenderWidth,
mRenderHeight, 0, 0,
mRenderWidth,
mRenderHeight,
GL_COLOR_BUFFER_BIT,
GL_LINEAR));
557 if (includeMixImage > 0) {
562 CHKERR(
glBlitNamedFramebuffer(
mOffscreenBuffer.
fb_id, 0, 0, 0,
mRenderWidth,
mRenderHeight, 0, 0,
mScreenWidth,
mScreenHeight,
GL_COLOR_BUFFER_BIT,
GL_LINEAR));
565 if (doScreenshot && !toMixBuffer) {
572 int32_t scaleFactor =
mDisplay->
cfgR().screenshotScaleFactor;
578 CHKERR(
glBlitNamedFramebuffer(
mOffscreenBuffer.
fb_id, tmpBuffer.
fb_id, 0, 0,
mRenderWidth,
mRenderHeight, 0, 0,
width,
height,
GL_COLOR_BUFFER_BIT,
GL_LINEAR));
598#ifndef GPUCA_DISPLAY_OPENGL_CORE
599 glMatrixMode(GL_MODELVIEW);
601 glMatrixMode(GL_PROJECTION);
602 glLoadMatrixf(&proj.
Elements[0][0]);
610 float color[4] = {1.0f, 1.0f, 1.0f, 1.0f};
628#ifndef GPUCA_DISPLAY_OPENGL_CORE
630 glMatrixMode(GL_MODELVIEW);
632 glMatrixMode(GL_PROJECTION);
633 glLoadMatrixf(&proj.
Elements[0][0]);
647#ifndef GPUCA_DISPLAY_OPENGL_CORE
649 glColor4f(1, 1, 1, mixSlaveImage);
660 glColor4f(1, 1, 1, 0);
689 throw std::runtime_error(
"Incorrect symbol ID");
693 std::vector<uint8_t> tmp;
695 tmp.resize(sizex * sizey);
697 for (int32_t
i = 0;
i < sizex * sizey;
i++) {
698 tmp[
i] =
src[
i] > 128 ? 255 : 0;
702 mFontSymbols.emplace_back(FontSymbolOpenGL{{{sizex, sizey}, {offsetx, offsety},
advance}, texId});
703 if (sizex == 0 || sizey == 0) {
738 for (
const char*
c = s; *
c;
c++) {
740 GPUError(
"Trying to draw unsupported symbol: %d > %d\n", (int32_t)*
c, (int32_t)
mFontSymbols.size());
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}};
762 x += (sym.advance >> 6) * scale;
789 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