Skip to content

Commit 1b5fcae

Browse files
committed
GPU Display: add runtime switch between OpenGL core and compat profiles if available
1 parent 95014d5 commit 1b5fcae

File tree

3 files changed

+99
-70
lines changed

3 files changed

+99
-70
lines changed

GPU/GPUTracking/display/GPUDisplay.cxx

Lines changed: 88 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,7 @@
5050
#include "GPUTPCConvertImpl.h"
5151
#include "utils/qconfig.h"
5252

53-
#ifdef GPUCA_DISPLAY_OPENGL_CORE
5453
#include "GPUDisplayShaders.h"
55-
#endif
5654

5755
constexpr hmm_mat4 MY_HMM_IDENTITY = {{{1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}}};
5856
constexpr 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

9395
const GPUParam& GPUDisplay::param() { return mChain->GetParam(); }
9496
const 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()
285290
inline 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

294302
inline 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

669673
inline 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)
22122228
void 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

GPU/GPUTracking/display/GPUDisplay.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,7 @@ class GPUDisplay
294294
bool mCamLookOrigin = false;
295295
bool mCamYUp = false;
296296
int mCameraMode = 0;
297+
bool mOpenGLCore = false;
297298
float mFOV = 45.f;
298299

299300
float mAngleRollOrigin = -1e9;

GPU/GPUTracking/display/GPUDisplayKeys.cxx

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ const char* HelpText[] = {
5252
"[e] / [f] Rotate left / right",
5353
"[+] / [-] Increase / decrease point size (Hold SHIFT for lines)",
5454
"[b] Change FOV (field of view)",
55+
"['] Switch between OpenGL core / compat code path",
5556
"[MOUSE 1] Look around",
5657
"[MOUSE 2] Strafe camera",
5758
"[MOUSE 1+2] Zoom / Rotate",
@@ -61,7 +62,7 @@ const char* HelpText[] = {
6162
"[1] ... [8] / [N] Enable display of clusters, preseeds, seeds, starthits, tracklets, tracks, global tracks, merged tracks / Show assigned clusters in colors"
6263
"[F1] / [F2] Enable / disable drawing of TPC / TRD"
6364
// FREE: none
64-
// Test setting: # --> mHideUnmatchedClusters
65+
// Test setting: ^ --> mHideUnmatchedClusters
6566
};
6667

6768
void GPUDisplay::PrintHelp()
@@ -182,6 +183,13 @@ void GPUDisplay::HandleKeyRelease(unsigned char key)
182183
mFOV = 5;
183184
}
184185
SetInfo("Set FOV to %f", mFOV);
186+
} else if (key == 39) { // character = "'"
187+
#ifdef GPUCA_DISPLAY_OPENGL_CORE
188+
SetInfo("OpenGL compat profile not available, using core profile");
189+
#else
190+
mOpenGLCore ^= 1;
191+
SetInfo("Using renderer path for OpenGL %s profile", mOpenGLCore ? "core" : "compat");
192+
#endif
185193
} else if (key == 'B') {
186194
mMarkAdjacentClusters++;
187195
if (mMarkAdjacentClusters == 5) {
@@ -433,7 +441,7 @@ void GPUDisplay::HandleKeyRelease(unsigned char key)
433441
SetInfo("Showing help text", 1);
434442
}
435443
/*
436-
else if (key == '#')
444+
else if (key == '^')
437445
{
438446
mTestSetting++;
439447
SetInfo("Debug test variable set to %d", mTestSetting);

0 commit comments

Comments
 (0)