15#ifdef GPUCA_DISPLAY_GL3W
20#if __has_include(<GL/glu.h>)
23#define gluErrorString(err) ""
34#define OPENGL_EMULATE_MULTI_DRAW 0
38#define GPUCA_DISPLAY_SHADER_TYPE_OPENGL
39#include "GPUDisplayLoadShaders.h"
57#ifdef GPUCA_DISPLAY_GL3W
71#ifdef GPUCA_DISPLAY_OPENGL_CORE
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"); \
92#ifndef GPUCA_DISPLAY_OPENGL_CORE
101 fb.
depth = withDepth;
103 GLint drawFboId = 0, readFboId = 0;
141 if (tex && fb.
msaa) {
150 GPUError(
"Error creating framebuffer (tex %d) - incomplete (%d)", (int32_t)tex, status);
180 auto first = std::get<0>(
v);
181 auto count = std::get<1>(
v);
192#ifndef GPUCA_DISPLAY_OPENGL_CORE
210 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 mVBOId.resize(GPUTPCGeometry::NSECTORS);
328#ifndef GPUCA_DISPLAY_OPENGL_CORE
329 CHKERR(glShadeModel(GL_SMOOTH));
464 for (uint32_t
i = 0;
i < GPUTPCGeometry::NSECTORS;
i++) {
489 }
else if (toMixBuffer) {
499#ifndef GPUCA_DISPLAY_OPENGL_CORE
520#ifndef GPUCA_DISPLAY_OPENGL_CORE
532#ifndef GPUCA_DISPLAY_OPENGL_CORE
534 CHKERR(glMatrixMode(GL_PROJECTION));
536 CHKERR(glMatrixMode(GL_MODELVIEW));
541 const hmm_mat4 modelViewProj = proj * view;
559#ifndef GPUCA_DISPLAY_OPENGL_CORE
571 CHKERR(
glBlitNamedFramebuffer(
mOffscreenBufferMSAA.
fb_id, dstId, 0, 0,
mRenderWidth,
mRenderHeight, 0, 0,
mRenderWidth,
mRenderHeight,
GL_COLOR_BUFFER_BIT,
GL_LINEAR));
573 if (includeMixImage > 0) {
578 CHKERR(
glBlitNamedFramebuffer(
mOffscreenBuffer.
fb_id, 0, 0, 0,
mRenderWidth,
mRenderHeight, 0, 0,
mScreenWidth,
mScreenHeight,
GL_COLOR_BUFFER_BIT,
GL_LINEAR));
583 if (doScreenshot && !toMixBuffer) {
590 int32_t scaleFactor =
mDisplay->
cfgR().screenshotScaleFactor;
600 CHKERR(
glBlitNamedFramebuffer(
mOffscreenBuffer.
fb_id, tmpBuffer.
fb_id, 0, 0,
mRenderWidth,
mRenderHeight, 0, 0,
width,
height,
GL_COLOR_BUFFER_BIT,
GL_LINEAR));
621#ifndef GPUCA_DISPLAY_OPENGL_CORE
622 glMatrixMode(GL_MODELVIEW);
624 glMatrixMode(GL_PROJECTION);
625 glLoadMatrixf(&proj.
Elements[0][0]);
633 float color[4] = {1.0f, 1.0f, 1.0f, 1.0f};
670#ifndef GPUCA_DISPLAY_OPENGL_CORE
672 glMatrixMode(GL_MODELVIEW);
674 glMatrixMode(GL_PROJECTION);
675 glLoadMatrixf(&proj.
Elements[0][0]);
689#ifndef GPUCA_DISPLAY_OPENGL_CORE
691 glColor4f(1, 1, 1, mixSlaveImage);
702 glColor4f(1, 1, 1, 0);
741 throw std::runtime_error(
"Incorrect symbol ID");
745 std::vector<uint8_t> tmp;
747 tmp.resize(sizex * sizey);
749 for (int32_t
i = 0;
i < sizex * sizey;
i++) {
750 tmp[
i] =
src[
i] > 128 ? 255 : 0;
755 if (sizex == 0 || sizey == 0) {
800 for (
const unsigned char*
c = (
const unsigned char*)s; *
c;
c++) {
802 GPUError(
"Trying to draw unsupported symbol: %d > %d\n", (int32_t)*
c, (int32_t)
mFontSymbols.size());
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}};
866 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.
uint32_t mFragmentShaderDownsample
void lineWidthFactor(float factor) override
void clearScreen(bool alphaOnly=false)
static constexpr int32_t UNIFORM_LOCATION_LINE_WIDTH
void resizeScene(uint32_t width, uint32_t height) override
GPUDisplayBackendOpenGL()
void loadDataToGPU(size_t totalVertizes) override
void setQuality() override
bool mUseSmoothLineShader
GLfb mOffscreenBufferMSAA
uint32_t mVertexShaderSmoothLine
bool prepareDraw(const hmm_mat4 &proj, const hmm_mat4 &view, bool requestScreenshot, bool toMixBuffer, float includeMixImage) override
bool canLimitToVSync() const override
uint32_t mShaderProgramSmoothLine
void setFrameBuffer(uint32_t newID=0)
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)
uint32_t mFragmentShaderSmoothPoint
uint32_t mShaderProgramDownsample
void finishDraw(bool doScreenshot, bool toMixBuffer, float includeMixImage) override
uint32_t mVertexShaderFullscreen
uint32_t mShaderProgramTexture
uint32_t drawVertices(const vboList &v, const drawType t) override
uint32_t mVertexShaderSmoothPoint
int32_t InitBackendA() override
uint32_t mFragmentShaderText
static int32_t checkProgramStatus(uint32_t program)
int32_t ExtInit() override
void createFB(GLfb &fb, bool tex, bool withDepth, bool msaa, uint32_t width, uint32_t height)
uint32_t mShaderProgramSmoothPoint
void pointSizeFactor(float factor) override
void prepareText() override
void clearFontSymbols() override
bool CoreProfile() override
static int32_t checkShaderStatus(uint32_t shader)
void initializeTextDrawing() override
void ClearOffscreenBuffers()
void ExitMagFieldVisualization()
uint32_t mFragmentShaderSmoothLine
bool mUseSmoothPointShader
uint32_t mShaderProgramText
std::vector< uint32_t > mVBOId
uint32_t DepthBits() override
uint32_t mVertexShaderTexture
static constexpr int32_t UNIFORM_LOCATION_POINT_SIZE
static constexpr int32_t UNIFORM_LOCATION_VIEWPORT
static constexpr int32_t UNIFORM_LOCATION_COLOR
void mixImages(float mixSlaveImage)
void updateRenderer(bool withScreenshot)
void finishText() override
std::vector< FontSymbolOpenGL > mFontSymbols
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
static constexpr int32_t UNIFORM_LOCATION_MATRIX
void setDepthBuffer() override
void ExitBackendA() override
vecpod< DrawArraysIndirectCommand > mCmdBuffer
std::vector< int32_t > mIndirectSectorOffset
void fillIndirectCmdBuffer()
static constexpr float SMOOTH_LINE_EXTRA_WIDTH
bool mFreetypeInitialized
std::vector< char > mScreenshotPixels
static constexpr float SMOOTH_POINT_EXTRA_SIZE
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
virtual bool canSetVSync()
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
GPUDisplayFrontend * frontend()
const vecpod< uint32_t > * vertexBufferCount() const
vecpod< int32_t > * vertexBufferStart()
const GPUSettingsProcessing & GetProcessingSettings() const
#define glNamedBufferData
#define glUniformMatrix4fv
#define glSpecializeShader
#define glCheckFramebufferStatus
#define glDeleteVertexArrays
#define glProgramUniform2f
#define glGetShaderInfoLog
#define glFramebufferTexture2D
#define glProgramUniform1f
#define glBindVertexArray
#define glRenderbufferStorageMultisample
#define glMultiDrawArrays
#define glEnableVertexAttribArray
#define glGenVertexArrays
#define glBindFramebuffer
#define glProgramUniformMatrix4fv
#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 glProgramUniform4fv
#define glGenFramebuffers
#define GL_MAX_RENDERBUFFER_SIZE
#define GL_MAX_TEXTURE_SIZE
#define GL_TEXTURE_MIN_FILTER
#define GL_FRAGMENT_SHADER
#define GL_TEXTURE_WRAP_S
#define GL_MAX_FRAMEBUFFER_WIDTH
#define GL_PACK_ALIGNMENT
GLsizei GLenum GLenum * types
#define GL_COLOR_ATTACHMENT0
GLbitfield GLuint program
GLint GLsizei GLsizei height
GLsizei const GLfloat * value
#define GL_SHADER_BINARY_FORMAT_SPIR_V
#define GL_FRAMEBUFFER_COMPLETE
GLint GLint GLsizei GLint GLenum GLenum type
#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_MAX_FRAMEBUFFER_HEIGHT
#define GL_DEPTH_BUFFER_BIT
#define GL_DRAW_INDIRECT_BUFFER