5050#include " GPUTPCConvertImpl.h"
5151#include " utils/qconfig.h"
5252
53- #ifdef GPUCA_DISPLAY_OPENGL_CORE
5453#include " GPUDisplayShaders.h"
55- #endif
5654
5755constexpr hmm_mat4 MY_HMM_IDENTITY = {{{1 , 0 , 0 , 0 }, {0 , 1 , 0 , 0 }, {0 , 0 , 1 , 0 }, {0 , 0 , 0 , 1 }}};
5856constexpr hmm_mat4 MY_HMM_FROM (float (&v)[16]) { return {{{v[0 ], v[1 ], v[2 ], v[3 ]}, {v[4 ], v[5 ], v[6 ], v[7 ]}, {v[8 ], v[9 ], v[10 ], v[11 ]}, {v[12 ], v[13 ], v[14 ], v[15 ]}}}; }
@@ -88,7 +86,11 @@ static const GPUSettingsDisplay& GPUDisplay_GetConfig(GPUChainTracking* chain)
8886 }
8987}
9088
91- GPUDisplay::GPUDisplay (GPUDisplayBackend* backend, GPUChainTracking* chain, GPUQA* qa) : mBackend(backend), mChain(chain), mConfig(GPUDisplay_GetConfig(chain)), mQA(qa), mMerger(chain->GetTPCMerger ()) { backend->mDisplay = this ; }
89+ GPUDisplay::GPUDisplay (GPUDisplayBackend* backend, GPUChainTracking* chain, GPUQA* qa) : mBackend(backend), mChain(chain), mConfig(GPUDisplay_GetConfig(chain)), mQA(qa), mMerger(chain->GetTPCMerger ())
90+ {
91+ backend->mDisplay = this ;
92+ mOpenGLCore = GPUCA_DISPLAY_OPENGL_CORE_FLAGS;
93+ }
9294
9395const GPUParam& GPUDisplay::param () { return mChain ->GetParam (); }
9496const GPUTPCTracker& GPUDisplay::sliceTracker (int iSlice) { return mChain ->GetTPCSliceTrackers ()[iSlice]; }
@@ -106,16 +108,19 @@ inline void GPUDisplay::drawVertices(const vboList& v, const GLenum t)
106108 mNDrawCalls += count;
107109
108110 if (mUseMultiVBO ) {
109- # ifdef GPUCA_DISPLAY_OPENGL_CORE
110- CHKERR (glBindVertexArray (mVertexArray ));
111- # endif
111+ if ( mOpenGLCore ) {
112+ CHKERR (glBindVertexArray (mVertexArray ));
113+ }
112114 CHKERR (glBindBuffer (GL_ARRAY_BUFFER, mVBOId [iSlice]));
113115#ifndef GPUCA_DISPLAY_OPENGL_CORE
114- CHKERR (glVertexPointer (3 , GL_FLOAT, 0 , nullptr ));
115- #else
116- CHKERR (glVertexAttribPointer (0 , 3 , GL_FLOAT, GL_FALSE, 0 , nullptr ));
117- glEnableVertexAttribArray (0 );
116+ if (!mOpenGLCore ) {
117+ CHKERR (glVertexPointer (3 , GL_FLOAT, 0 , nullptr ));
118+ } else
118119#endif
120+ {
121+ CHKERR (glVertexAttribPointer (0 , 3 , GL_FLOAT, GL_FALSE, 0 , nullptr ));
122+ glEnableVertexAttribArray (0 );
123+ }
119124 }
120125
121126 if (mUseGLIndirectDraw ) {
@@ -285,10 +290,13 @@ void GPUDisplay::startAnimation()
285290inline void GPUDisplay::ActivateColor ()
286291{
287292#ifndef GPUCA_DISPLAY_OPENGL_CORE
288- glColor3f ( mDrawColor [ 0 ], mDrawColor [ 1 ], mDrawColor [ 2 ]);
289- # else
290- glUniform3fv ( mColorId , 1 , & mDrawColor [ 0 ]);
293+ if (! mOpenGLCore ) {
294+ glColor3f ( mDrawColor [ 0 ], mDrawColor [ 1 ], mDrawColor [ 2 ]);
295+ } else
291296#endif
297+ {
298+ glUniform3fv (mColorId , 1 , &mDrawColor [0 ]);
299+ }
292300}
293301
294302inline void GPUDisplay::SetColorClusters ()
@@ -636,7 +644,6 @@ int GPUDisplay::InitGL_internal()
636644 ReSizeGLScene (GPUDisplayBackend::INIT_WIDTH, GPUDisplayBackend::INIT_HEIGHT, true );
637645 mThreadBuffers .resize (mChain ->GetProcessingSettings ().ompThreads );
638646 mThreadTracks .resize (mChain ->GetProcessingSettings ().ompThreads );
639- #ifdef GPUCA_DISPLAY_OPENGL_CORE
640647 CHKERR (mVertexShader = glCreateShader (GL_VERTEX_SHADER));
641648 CHKERR (glShaderSource (mVertexShader , 1 , &GPUDisplayShaders::vertexShader, nullptr ));
642649 CHKERR (glCompileShader (mVertexShader ));
@@ -650,7 +657,6 @@ int GPUDisplay::InitGL_internal()
650657 CHKERR (glGenVertexArrays (1 , &mVertexArray ));
651658 CHKERR (mModelViewProjId = glGetUniformLocation (mShaderProgram , " ModelViewProj" ));
652659 CHKERR (mColorId = glGetUniformLocation (mShaderProgram , " color" ));
653- #endif
654660 return (0 ); // Initialization Went OK
655661}
656662
@@ -659,11 +665,9 @@ void GPUDisplay::ExitGL()
659665 UpdateOffscreenBuffers (true );
660666 CHKERR (glDeleteBuffers (GPUChainTracking::NSLICES, mVBOId ));
661667 CHKERR (glDeleteBuffers (1 , &mIndirectId ));
662- #ifdef GPUCA_DISPLAY_OPENGL_CORE
663668 CHKERR (glDeleteProgram (mShaderProgram ));
664669 CHKERR (glDeleteShader (mVertexShader ));
665670 CHKERR (glDeleteShader (mFragmentShader ));
666- #endif
667671}
668672
669673inline void GPUDisplay::drawPointLinestrip (int iSlice, int cid, int id, int id_limit)
@@ -1618,12 +1622,12 @@ int GPUDisplay::DrawGLScene_internal(bool mixAnimation, float mAnimateTime)
16181622 mBackend ->mMouseDnY = mBackend ->mouseMvY ;
16191623 }
16201624#ifndef GPUCA_DISPLAY_OPENGL_CORE
1621- if (mCfg .smoothPoints ) {
1625+ if (mCfg .smoothPoints && ! mOpenGLCore ) {
16221626 CHKERR (glEnable (GL_POINT_SMOOTH));
16231627 } else {
16241628 CHKERR (glDisable (GL_POINT_SMOOTH));
16251629 }
1626- if (mCfg .smoothLines ) {
1630+ if (mCfg .smoothLines && ! mOpenGLCore ) {
16271631 CHKERR (glEnable (GL_LINE_SMOOTH));
16281632 } else {
16291633 CHKERR (glDisable (GL_LINE_SMOOTH));
@@ -1843,28 +1847,34 @@ int GPUDisplay::DrawGLScene_internal(bool mixAnimation, float mAnimateTime)
18431847 // Draw Event
18441848 mNDrawCalls = 0 ;
18451849#ifndef GPUCA_DISPLAY_OPENGL_CORE
1846- CHKERR (glEnableClientState (GL_VERTEX_ARRAY));
1847- CHKERR (glVertexPointer (3 , GL_FLOAT, 0 , nullptr ));
1848- #else
1849- CHKERR (glBindVertexArray (mVertexArray ));
1850- CHKERR (glUseProgram (mShaderProgram ));
1851- CHKERR (glVertexAttribPointer (0 , 3 , GL_FLOAT, GL_FALSE, 0 , nullptr ));
1852- CHKERR (glEnableVertexAttribArray (0 ));
1850+ if (!mOpenGLCore ) {
1851+ CHKERR (glEnableClientState (GL_VERTEX_ARRAY));
1852+ CHKERR (glVertexPointer (3 , GL_FLOAT, 0 , nullptr ));
1853+ } else
18531854#endif
1855+ {
1856+ CHKERR (glBindVertexArray (mVertexArray ));
1857+ CHKERR (glUseProgram (mShaderProgram ));
1858+ CHKERR (glVertexAttribPointer (0 , 3 , GL_FLOAT, GL_FALSE, 0 , nullptr ));
1859+ CHKERR (glEnableVertexAttribArray (0 ));
1860+ }
18541861
18551862 {
18561863 const float zFar = ((param ().par .ContinuousTracking ? (mMaxClusterZ / GL_SCALE_FACTOR) : 8 .f ) + 50 .f ) * 2 .f ;
18571864 const hmm_mat4 proj = HMM_Perspective (mFOV , (GLfloat)mScreenwidth / (GLfloat)mScreenheight , 0 .1f , zFar);
18581865 nextViewMatrix = nextViewMatrix * mModelMatrix ;
18591866#ifndef GPUCA_DISPLAY_OPENGL_CORE
1860- CHKERR (glMatrixMode (GL_PROJECTION));
1861- CHKERR (glLoadMatrixf (&proj.Elements [0 ][0 ]));
1862- CHKERR (glMatrixMode (GL_MODELVIEW));
1863- CHKERR (glLoadMatrixf (&nextViewMatrix.Elements [0 ][0 ]));
1864- #else
1865- const hmm_mat4 modelViewProj = proj * nextViewMatrix;
1866- CHKERR (glUniformMatrix4fv (mModelViewProjId , 1 , GL_FALSE, &modelViewProj.Elements [0 ][0 ]));
1867+ if (!mOpenGLCore ) {
1868+ CHKERR (glMatrixMode (GL_PROJECTION));
1869+ CHKERR (glLoadMatrixf (&proj.Elements [0 ][0 ]));
1870+ CHKERR (glMatrixMode (GL_MODELVIEW));
1871+ CHKERR (glLoadMatrixf (&nextViewMatrix.Elements [0 ][0 ]));
1872+ } else
18671873#endif
1874+ {
1875+ const hmm_mat4 modelViewProj = proj * nextViewMatrix;
1876+ CHKERR (glUniformMatrix4fv (mModelViewProjId , 1 , GL_FALSE, &modelViewProj.Elements [0 ][0 ]));
1877+ }
18681878 }
18691879
18701880#define LOOP_SLICE for (int iSlice = (mCfg .drawSlice == -1 ? 0 : mCfg .drawRelatedSlices ? (mCfg .drawSlice % (NSLICES / 4 )) : mCfg .drawSlice); iSlice < NSLICES; iSlice += (mCfg .drawSlice == -1 ? 1 : mCfg .drawRelatedSlices ? (NSLICES / 4 ) : NSLICES))
@@ -2044,39 +2054,45 @@ int GPUDisplay::DrawGLScene_internal(bool mixAnimation, float mAnimateTime)
20442054 }
20452055 }
20462056#ifndef GPUCA_DISPLAY_OPENGL_CORE
2047- CHKERR (glDisableClientState (GL_VERTEX_ARRAY));
2048- #else
2049- CHKERR (glDisableVertexAttribArray (0 ));
2050- CHKERR (glUseProgram (0 ));
2057+ if (!mOpenGLCore ) {
2058+ CHKERR (glDisableClientState (GL_VERTEX_ARRAY));
2059+ } else
20512060#endif
2061+ {
2062+ CHKERR (glDisableVertexAttribArray (0 ));
2063+ CHKERR (glUseProgram (0 ));
2064+ }
20522065
20532066 if (mixSlaveImage > 0 ) {
20542067#ifndef GPUCA_DISPLAY_OPENGL_CORE
2055- glMatrixMode (GL_MODELVIEW);
2056- glLoadIdentity ( );
2057- glMatrixMode (GL_PROJECTION );
2058- hmm_mat4 proj = HMM_Orthographic ( 0 . f , mRenderwidth , 0 . f , mRenderheight , - 1 . f , 1 . f );
2059- glLoadMatrixf (& proj. Elements [ 0 ][ 0 ] );
2060- CHKERR ( glEnable (GL_TEXTURE_2D) );
2061- glDisable (GL_DEPTH_TEST );
2062- CHKERR ( glBindTexture (GL_TEXTURE_2D, mMixBuffer . fbCol_id ) );
2063- glColor4f ( 1 , 1 , 1 , mixSlaveImage );
2064- glBegin (GL_QUADS );
2065- glTexCoord2f ( 0 , 0 );
2066- glVertex3f ( 0 , 0 , 0 );
2067- glTexCoord2f (0 , 1 );
2068- glVertex3f (0 , mRenderheight , 0 );
2069- glTexCoord2f ( 1 , 1 );
2070- glVertex3f ( mRenderwidth , mRenderheight , 0 );
2071- glTexCoord2f ( 1 , 0 );
2072- glVertex3f ( mRenderwidth , 0 , 0 );
2073- glEnd ( );
2074- glColor4f ( 1 , 1 , 1 , 0 );
2075- CHKERR ( glDisable (GL_TEXTURE_2D) );
2076- setDepthBuffer ( );
2077- # else
2078- GPUWarning ( " Image mixing unsupported in OpenGL CORE profile " );
2068+ if (! mOpenGLCore ) {
2069+ glMatrixMode (GL_MODELVIEW );
2070+ glLoadIdentity ( );
2071+ glMatrixMode (GL_PROJECTION );
2072+ hmm_mat4 proj = HMM_Orthographic ( 0 . f , mRenderwidth , 0 . f , mRenderheight , - 1 . f , 1 . f );
2073+ glLoadMatrixf (&proj. Elements [ 0 ][ 0 ] );
2074+ CHKERR ( glEnable (GL_TEXTURE_2D) );
2075+ glDisable (GL_DEPTH_TEST );
2076+ CHKERR ( glBindTexture (GL_TEXTURE_2D, mMixBuffer . fbCol_id ) );
2077+ glColor4f ( 1 , 1 , 1 , mixSlaveImage );
2078+ glBegin (GL_QUADS );
2079+ glTexCoord2f ( 0 , 0 );
2080+ glVertex3f (0 , 0 , 0 );
2081+ glTexCoord2f (0 , 1 );
2082+ glVertex3f ( 0 , mRenderheight , 0 );
2083+ glTexCoord2f ( 1 , 1 );
2084+ glVertex3f ( mRenderwidth , mRenderheight , 0 );
2085+ glTexCoord2f ( 1 , 0 );
2086+ glVertex3f ( mRenderwidth , 0 , 0 );
2087+ glEnd ( );
2088+ glColor4f ( 1 , 1 , 1 , 0 );
2089+ CHKERR ( glDisable (GL_TEXTURE_2D) );
2090+ setDepthBuffer ();
2091+ } else
20792092#endif
2093+ {
2094+ GPUWarning (" Image mixing unsupported in OpenGL CORE profile" );
2095+ }
20802096 }
20812097
20822098 if (mixAnimation) {
@@ -2212,12 +2228,14 @@ void GPUDisplay::DoScreenshot(char* filename, float mAnimateTime)
22122228void GPUDisplay::showInfo (const char * info)
22132229{
22142230#ifndef GPUCA_DISPLAY_OPENGL_CORE
2215- glMatrixMode (GL_MODELVIEW);
2216- glLoadIdentity ();
2217- glMatrixMode (GL_PROJECTION);
2218- hmm_mat4 proj = HMM_Orthographic (0 .f , mScreenwidth , 0 .f , mScreenheight , -1 , 1 );
2219- glLoadMatrixf (&proj.Elements [0 ][0 ]);
2220- glViewport (0 , 0 , mScreenwidth , mScreenheight );
2231+ if (!mOpenGLCore ) {
2232+ glMatrixMode (GL_MODELVIEW);
2233+ glLoadIdentity ();
2234+ glMatrixMode (GL_PROJECTION);
2235+ hmm_mat4 proj = HMM_Orthographic (0 .f , mScreenwidth , 0 .f , mScreenheight , -1 , 1 );
2236+ glLoadMatrixf (&proj.Elements [0 ][0 ]);
2237+ glViewport (0 , 0 , mScreenwidth , mScreenheight );
2238+ }
22212239#endif
22222240 float colorValue = mInvertColors ? 0 .f : 1 .f ;
22232241 mBackend ->OpenGLPrint (info, 40 .f , 40 .f , colorValue, colorValue, colorValue, 1 );
@@ -2236,7 +2254,9 @@ void GPUDisplay::showInfo(const char* info)
22362254 }
22372255 }
22382256#ifndef GPUCA_DISPLAY_OPENGL_CORE
2239- glViewport (0 , 0 , mRenderwidth , mRenderheight );
2257+ if (!mOpenGLCore ) {
2258+ glViewport (0 , 0 , mRenderwidth , mRenderheight );
2259+ }
22402260#endif
22412261}
22422262
0 commit comments