@@ -180,12 +180,12 @@ uint32_t GPUDisplayBackendOpenGL::drawVertices(const vboList& v, const drawType
180180 }
181181
182182 if (mDisplay ->useMultiVBO ()) {
183- if (mDisplay ->cfgR ().openGLCore ) {
183+ if (! mDisplay ->cfgR ().rendererCompatSmoothing ) { // TODO: Remove OpenGL compat profile completely
184184 CHKERR (glBindVertexArray (mVertexArray ));
185185 }
186186 CHKERR (glBindBuffer (GL_ARRAY_BUFFER , mVBOId [iSector]));
187187#ifndef GPUCA_DISPLAY_OPENGL_CORE
188- if (! mDisplay ->cfgR ().openGLCore ) {
188+ if (mDisplay ->cfgR ().rendererCompatSmoothing ) {
189189 CHKERR (glVertexPointer (3 , GL_FLOAT , 0 , nullptr ));
190190 } else
191191#endif
@@ -195,6 +195,10 @@ uint32_t GPUDisplayBackendOpenGL::drawVertices(const vboList& v, const drawType
195195 }
196196 }
197197
198+ const uint32_t smoothProgram = tt == POINTS ? (mUseSmoothPointShader ? mShaderProgramSmoothPoint : 0 ) : (mUseSmoothLineShader ? mShaderProgramSmoothLine : 0 );
199+ if (smoothProgram) {
200+ CHKERR (glUseProgram (smoothProgram));
201+ }
198202 if (mDisplay ->cfgR ().useGLIndirectDraw ) {
199203 CHKERR (glMultiDrawArraysIndirect (t, (void *)(size_t )((mIndirectSectorOffset [iSector] + first) * sizeof (DrawArraysIndirectCommand)), count, 0 ));
200204 } else if (OPENGL_EMULATE_MULTI_DRAW ) {
@@ -205,18 +209,27 @@ uint32_t GPUDisplayBackendOpenGL::drawVertices(const vboList& v, const drawType
205209 static_assert (sizeof (GLsizei) == sizeof (*mDisplay ->vertexBufferCount ()[iSector].data ()), " Invalid counter size does not match GLsizei" );
206210 CHKERR (glMultiDrawArrays (t, mDisplay ->vertexBufferStart ()[iSector].data () + first, ((const GLsizei*)mDisplay ->vertexBufferCount ()[iSector].data ()) + first, count));
207211 }
212+ if (smoothProgram) {
213+ CHKERR (glUseProgram (mShaderProgram ));
214+ }
208215 return count;
209216}
210217
211218void GPUDisplayBackendOpenGL::ActivateColor (std::array<float , 4 >& color)
212219{
213220#ifndef GPUCA_DISPLAY_OPENGL_CORE
214- if (! mDisplay ->cfgR ().openGLCore ) {
221+ if (mDisplay ->cfgR ().rendererCompatSmoothing ) {
215222 glColor4f (color[0 ], color[1 ], color[2 ], color[3 ]);
216223 } else
217224#endif
218225 {
219226 CHKERR (glUniform4fv (UNIFORM_LOCATION_COLOR , 1 , &color[0 ]));
227+ if (mUseSmoothPointShader ) {
228+ CHKERR (glProgramUniform4fv (mShaderProgramSmoothPoint , UNIFORM_LOCATION_COLOR , 1 , &color[0 ]));
229+ }
230+ if (mUseSmoothLineShader ) {
231+ CHKERR (glProgramUniform4fv (mShaderProgramSmoothLine , UNIFORM_LOCATION_COLOR , 1 , &color[0 ]));
232+ }
220233 }
221234}
222235
@@ -312,7 +325,11 @@ int32_t GPUDisplayBackendOpenGL::InitBackendA()
312325 CHKERR (mVertexShaderTexture = loadShader (GL_VERTEX_SHADER , _binary_opengl_vertexTexture_vert_spv_start, _binary_opengl_vertexTexture_vert_spv_len));
313326 CHKERR (mFragmentShaderTexture = loadShader (GL_FRAGMENT_SHADER , _binary_opengl_fragmentTexture_frag_spv_start, _binary_opengl_fragmentTexture_frag_spv_len));
314327 CHKERR (mFragmentShaderText = loadShader (GL_FRAGMENT_SHADER , _binary_opengl_fragmentText_frag_spv_start, _binary_opengl_fragmentText_frag_spv_len));
315- if (checkShaderStatus (mVertexShader ) || checkShaderStatus (mFragmentShader ) || checkShaderStatus (mVertexShaderTexture ) || checkShaderStatus (mFragmentShaderTexture ) || checkShaderStatus (mFragmentShaderText )) {
328+ CHKERR (mVertexShaderSmoothPoint = loadShader (GL_VERTEX_SHADER , _binary_opengl_vertexSmoothPoint_vert_spv_start, _binary_opengl_vertexSmoothPoint_vert_spv_len));
329+ CHKERR (mFragmentShaderSmoothPoint = loadShader (GL_FRAGMENT_SHADER , _binary_opengl_fragmentSmoothPoint_frag_spv_start, _binary_opengl_fragmentSmoothPoint_frag_spv_len));
330+ CHKERR (mVertexShaderSmoothLine = loadShader (GL_VERTEX_SHADER , _binary_opengl_vertexSmoothLine_vert_spv_start, _binary_opengl_vertexSmoothLine_vert_spv_len));
331+ CHKERR (mFragmentShaderSmoothLine = loadShader (GL_FRAGMENT_SHADER , _binary_opengl_fragmentSmoothLine_frag_spv_start, _binary_opengl_fragmentSmoothLine_frag_spv_len));
332+ if (checkShaderStatus (mVertexShader ) || checkShaderStatus (mFragmentShader ) || checkShaderStatus (mVertexShaderSmoothPoint ) || checkShaderStatus (mFragmentShaderSmoothPoint ) || checkShaderStatus (mVertexShaderSmoothLine ) || checkShaderStatus (mFragmentShaderSmoothLine ) || checkShaderStatus (mVertexShaderTexture ) || checkShaderStatus (mFragmentShaderTexture ) || checkShaderStatus (mFragmentShaderText )) {
316333 return 1 ;
317334 }
318335 CHKERR (mShaderProgram = glCreateProgram ());
@@ -322,6 +339,20 @@ int32_t GPUDisplayBackendOpenGL::InitBackendA()
322339 if (checkProgramStatus (mShaderProgram )) {
323340 return 1 ;
324341 }
342+ CHKERR (mShaderProgramSmoothPoint = glCreateProgram ());
343+ CHKERR (glAttachShader (mShaderProgramSmoothPoint , mVertexShaderSmoothPoint ));
344+ CHKERR (glAttachShader (mShaderProgramSmoothPoint , mFragmentShaderSmoothPoint ));
345+ CHKERR (glLinkProgram (mShaderProgramSmoothPoint ));
346+ if (checkProgramStatus (mShaderProgramSmoothPoint )) {
347+ return 1 ;
348+ }
349+ CHKERR (mShaderProgramSmoothLine = glCreateProgram ());
350+ CHKERR (glAttachShader (mShaderProgramSmoothLine , mVertexShaderSmoothLine ));
351+ CHKERR (glAttachShader (mShaderProgramSmoothLine , mFragmentShaderSmoothLine ));
352+ CHKERR (glLinkProgram (mShaderProgramSmoothLine ));
353+ if (checkProgramStatus (mShaderProgramSmoothLine )) {
354+ return 1 ;
355+ }
325356 CHKERR (mShaderProgramText = glCreateProgram ());
326357 CHKERR (glAttachShader (mShaderProgramText , mVertexShaderTexture ));
327358 CHKERR (glAttachShader (mShaderProgramText , mFragmentShaderText ));
@@ -359,6 +390,12 @@ void GPUDisplayBackendOpenGL::ExitBackendA()
359390 CHKERR (glDeleteProgram (mShaderProgram ));
360391 CHKERR (glDeleteShader (mVertexShader ));
361392 CHKERR (glDeleteShader (mFragmentShader ));
393+ CHKERR (glDeleteProgram (mShaderProgramSmoothPoint ));
394+ CHKERR (glDeleteShader (mVertexShaderSmoothPoint ));
395+ CHKERR (glDeleteShader (mFragmentShaderSmoothPoint ));
396+ CHKERR (glDeleteProgram (mShaderProgramSmoothLine ));
397+ CHKERR (glDeleteShader (mVertexShaderSmoothLine ));
398+ CHKERR (glDeleteShader (mFragmentShaderSmoothLine ));
362399 CHKERR (glDeleteProgram (mShaderProgramText ));
363400 CHKERR (glDeleteShader (mFragmentShaderText ));
364401 CHKERR (glDeleteProgram (mShaderProgramTexture ));
@@ -432,13 +469,20 @@ void GPUDisplayBackendOpenGL::prepareDraw(const hmm_mat4& proj, const hmm_mat4&
432469 setFrameBuffer (0 );
433470 }
434471 clearScreen ();
472+ mUseSmoothPointShader = mDisplay ->cfgL ().smoothPoints && !mDisplay ->cfgR ().rendererCompatSmoothing ; // The compat profile uses GL_POINT_SMOOTH / GL_LINE_SMOOTH
473+ mUseSmoothLineShader = mDisplay ->cfgL ().smoothLines && !mDisplay ->cfgR ().rendererCompatSmoothing ;
435474#ifndef GPUCA_DISPLAY_OPENGL_CORE
436- if (mDisplay ->cfgL ().smoothPoints && !mDisplay ->cfgR ().openGLCore ) {
475+ if (mUseSmoothPointShader ) { // Compatibility context: gl_PointCoord is only defined with point sprites
476+ CHKERR (glEnable (GL_POINT_SPRITE ));
477+ } else {
478+ CHKERR (glDisable (GL_POINT_SPRITE ));
479+ }
480+ if (mDisplay ->cfgL ().smoothPoints && mDisplay ->cfgR ().rendererCompatSmoothing ) {
437481 CHKERR (glEnable (GL_POINT_SMOOTH ));
438482 } else {
439483 CHKERR (glDisable (GL_POINT_SMOOTH ));
440484 }
441- if (mDisplay ->cfgL ().smoothLines && ! mDisplay ->cfgR ().openGLCore ) {
485+ if (mDisplay ->cfgL ().smoothLines && mDisplay ->cfgR ().rendererCompatSmoothing ) {
442486 CHKERR (glEnable (GL_LINE_SMOOTH ));
443487 } else {
444488 CHKERR (glDisable (GL_LINE_SMOOTH ));
@@ -449,7 +493,7 @@ void GPUDisplayBackendOpenGL::prepareDraw(const hmm_mat4& proj, const hmm_mat4&
449493
450494 glViewport (0 , 0 , mRenderWidth , mRenderHeight );
451495#ifndef GPUCA_DISPLAY_OPENGL_CORE
452- if (! mDisplay ->cfgR ().openGLCore ) {
496+ if (mDisplay ->cfgR ().rendererCompatSmoothing ) {
453497 CHKERR (glEnableClientState (GL_VERTEX_ARRAY ));
454498 CHKERR (glVertexPointer (3 , GL_FLOAT , 0 , nullptr ));
455499 } else
@@ -461,7 +505,7 @@ void GPUDisplayBackendOpenGL::prepareDraw(const hmm_mat4& proj, const hmm_mat4&
461505 CHKERR (glEnableVertexAttribArray (0 ));
462506 }
463507#ifndef GPUCA_DISPLAY_OPENGL_CORE
464- if (! mDisplay ->cfgR ().openGLCore ) {
508+ if (mDisplay ->cfgR ().rendererCompatSmoothing ) {
465509 CHKERR (glMatrixMode (GL_PROJECTION ));
466510 CHKERR (glLoadMatrixf (&proj.Elements [0 ][0 ]));
467511 CHKERR (glMatrixMode (GL_MODELVIEW ));
@@ -471,6 +515,13 @@ void GPUDisplayBackendOpenGL::prepareDraw(const hmm_mat4& proj, const hmm_mat4&
471515 {
472516 const hmm_mat4 modelViewProj = proj * view;
473517 CHKERR (glUniformMatrix4fv (UNIFORM_LOCATION_MATRIX , 1 , GL_FALSE , &modelViewProj.Elements [0 ][0 ]));
518+ if (mUseSmoothPointShader ) {
519+ CHKERR (glProgramUniformMatrix4fv (mShaderProgramSmoothPoint , UNIFORM_LOCATION_MATRIX , 1 , GL_FALSE , &modelViewProj.Elements [0 ][0 ]));
520+ }
521+ if (mUseSmoothLineShader ) {
522+ CHKERR (glProgramUniformMatrix4fv (mShaderProgramSmoothLine , UNIFORM_LOCATION_MATRIX , 1 , GL_FALSE , &modelViewProj.Elements [0 ][0 ]));
523+ CHKERR (glProgramUniform2f (mShaderProgramSmoothLine , UNIFORM_LOCATION_VIEWPORT , mRenderWidth , mRenderHeight ));
524+ }
474525 if (mMagneticFieldVisualization ) {
475526 CHKERR (glNamedBufferSubData (mFieldModelViewBuffer , 0 , sizeof (modelViewProj), &modelViewProj));
476527 }
@@ -480,7 +531,7 @@ void GPUDisplayBackendOpenGL::prepareDraw(const hmm_mat4& proj, const hmm_mat4&
480531void GPUDisplayBackendOpenGL::finishDraw (bool doScreenshot, bool toMixBuffer, float includeMixImage)
481532{
482533#ifndef GPUCA_DISPLAY_OPENGL_CORE
483- if (! mDisplay ->cfgR ().openGLCore ) {
534+ if (mDisplay ->cfgR ().rendererCompatSmoothing ) {
484535 CHKERR (glDisableClientState (GL_VERTEX_ARRAY ));
485536 } else
486537#endif
@@ -565,7 +616,7 @@ void GPUDisplayBackendOpenGL::mixImages(float mixSlaveImage)
565616 hmm_mat4 proj = HMM_Orthographic (0 .f , mRenderWidth , 0 .f , mRenderHeight , -1 .f , 1 .f );
566617 glDisable (GL_DEPTH_TEST );
567618#ifndef GPUCA_DISPLAY_OPENGL_CORE
568- if (! mDisplay ->cfgR ().openGLCore ) {
619+ if (mDisplay ->cfgR ().rendererCompatSmoothing ) {
569620 glMatrixMode (GL_MODELVIEW );
570621 glLoadIdentity ();
571622 glMatrixMode (GL_PROJECTION );
@@ -584,7 +635,7 @@ void GPUDisplayBackendOpenGL::mixImages(float mixSlaveImage)
584635 CHKERR (glBindTexture (GL_TEXTURE_2D , mMixBuffer .fbCol_id ));
585636
586637#ifndef GPUCA_DISPLAY_OPENGL_CORE
587- if (! mDisplay ->cfgR ().openGLCore ) {
638+ if (mDisplay ->cfgR ().rendererCompatSmoothing ) {
588639 glColor4f (1 , 1 , 1 , mixSlaveImage);
589640 glBegin (GL_QUADS );
590641 glTexCoord2f (0 , 0 );
@@ -611,12 +662,22 @@ void GPUDisplayBackendOpenGL::mixImages(float mixSlaveImage)
611662
612663void GPUDisplayBackendOpenGL::pointSizeFactor (float factor)
613664{
614- CHKERR (glPointSize (mDisplay ->cfgL ().pointSize * mDownsampleFactor * factor));
665+ const float size = mDisplay ->cfgL ().pointSize * mDownsampleFactor * factor + (mUseSmoothPointShader ? SMOOTH_POINT_EXTRA_SIZE : 0 .f );
666+ if (mUseSmoothPointShader ) {
667+ CHKERR (glProgramUniform1f (mShaderProgramSmoothPoint , UNIFORM_LOCATION_POINT_SIZE , size));
668+ }
669+ CHKERR (glPointSize (size));
615670}
616671
617672void GPUDisplayBackendOpenGL::lineWidthFactor (float factor)
618673{
619- CHKERR (glLineWidth (mDisplay ->cfgL ().lineWidth * mDownsampleFactor * factor));
674+ float width = mDisplay ->cfgL ().lineWidth * mDownsampleFactor * factor;
675+ if (mUseSmoothLineShader ) {
676+ width += SMOOTH_LINE_EXTRA_WIDTH ;
677+ CHKERR (glProgramUniform1f (mShaderProgramSmoothLine , UNIFORM_LOCATION_LINE_WIDTH , width));
678+ width *= 1 .4143f ; // Wide lines are parallelograms in OpenGL, widen so that the perpendicular width is covered
679+ }
680+ CHKERR (glLineWidth (width));
620681}
621682
622683void GPUDisplayBackendOpenGL::addFontSymbol (int32_t symbol, int32_t sizex, int32_t sizey, int32_t offsetx, int32_t offsety, int32_t advance, void * data)
0 commit comments