2525
2626#include " GPUCommonDef.h"
2727#include " GPUDisplayBackendOpenGL.h"
28- #include " shaders/GPUDisplayShaders.h"
2928#include " GPUDisplay.h"
3029#include " GPULogging.h"
3130#include " GPUParam.h"
3534
3635using namespace o2 ::gpu;
3736
38- #ifdef GPUCA_BUILD_EVENT_DISPLAY_VULKAN
39- #include " utils/qGetLdBinarySymbols.h"
40- QGET_LD_BINARY_SYMBOLS (shaders_shaders_vertex_vert_spv);
41- QGET_LD_BINARY_SYMBOLS (shaders_shaders_fragmentUniform_frag_spv);
42- #endif
43-
44- // Runtime minimum version defined in GPUDisplayFrontend.h, keep in sync!
45- #define GPUCA_BUILD_EVENT_DISPLAY_OPENGL
46- #if !defined(GL_VERSION_4_5) || GL_VERSION_4_5 != 1
47- #ifdef GPUCA_STANDALONE
48- #warning Unsupported OpenGL version < 4.5, disabling standalone event display
49- #error Unsupported OpenGL version < 4.5
50- #else
51- #pragma message "Unsupported OpenGL version < 4.5, disabling standalone event display"
52- #endif
53- #undef GPUCA_BUILD_EVENT_DISPLAY_OPENGL
54- #endif
37+ #ifdef GPUCA_BUILD_EVENT_DISPLAY_OPENGL // Set by CMake if OpenGL 4.6 headers and glslc are available, runtime minimum version in GPUDisplayFrontend.h
38+ #define GPUCA_DISPLAY_SHADER_TYPE_OPENGL
39+ #include " GPUDisplayLoadShaders.h"
5540
56- #ifdef GPUCA_BUILD_EVENT_DISPLAY_OPENGL
41+ uint32_t GPUDisplayBackendOpenGL::loadShader (uint32_t type, const char * spirv, size_t size)
42+ {
43+ uint32_t shader = glCreateShader (type);
44+ glShaderBinary (1 , &shader, GL_SHADER_BINARY_FORMAT_SPIR_V , spirv, size);
45+ glSpecializeShader (shader, " main" , 0 , nullptr , nullptr );
46+ return shader;
47+ }
5748
5849GPUDisplayBackendOpenGL::GPUDisplayBackendOpenGL ()
5950{
@@ -225,13 +216,7 @@ void GPUDisplayBackendOpenGL::ActivateColor(std::array<float, 4>& color)
225216 } else
226217#endif
227218 {
228- if (mSPIRVShaders ) {
229- CHKERR (glBindBuffer (GL_UNIFORM_BUFFER , mSPIRVColorBuffer ));
230- CHKERR (glBufferData (GL_UNIFORM_BUFFER , sizeof (color), &color[0 ], GL_STATIC_DRAW ));
231- CHKERR (glBindBufferBase (GL_UNIFORM_BUFFER , 1 , mSPIRVColorBuffer ));
232- } else {
233- CHKERR (glUniform4fv (mColorId , 1 , &color[0 ]));
234- }
219+ CHKERR (glUniform4fv (UNIFORM_LOCATION_COLOR , 1 , &color[0 ]));
235220 }
236221}
237222
@@ -322,33 +307,11 @@ int32_t GPUDisplayBackendOpenGL::InitBackendA()
322307#endif
323308 setDepthBuffer ();
324309 setQuality ();
325- CHKERR (mVertexShader = glCreateShader (GL_VERTEX_SHADER ));
326- CHKERR (mFragmentShader = glCreateShader (GL_FRAGMENT_SHADER ));
327- CHKERR (mVertexShaderTexture = glCreateShader (GL_VERTEX_SHADER ));
328- CHKERR (mFragmentShaderTexture = glCreateShader (GL_FRAGMENT_SHADER ));
329- CHKERR (mFragmentShaderText = glCreateShader (GL_FRAGMENT_SHADER ));
330- #if defined(GL_VERSION_4_6) && GL_VERSION_4_6 == 1 && defined(GPUCA_BUILD_EVENT_DISPLAY_VULKAN)
331- if (getenv (" USE_SPIRV_SHADERS" ) && atoi (getenv (" USE_SPIRV_SHADERS" ))) {
332- CHKERR (glShaderBinary (1 , &mVertexShader , GL_SHADER_BINARY_FORMAT_SPIR_V_ARB , _binary_shaders_shaders_vertex_vert_spv_start, _binary_shaders_shaders_vertex_vert_spv_len));
333- CHKERR (glSpecializeShader (mVertexShader , " main" , 0 , nullptr , nullptr ));
334- CHKERR (glShaderBinary (1 , &mFragmentShader , GL_SHADER_BINARY_FORMAT_SPIR_V_ARB , _binary_shaders_shaders_fragmentUniform_frag_spv_start, _binary_shaders_shaders_fragmentUniform_frag_spv_len));
335- CHKERR (glSpecializeShader (mFragmentShader , " main" , 0 , nullptr , nullptr ));
336- GPUInfo (" Using SPIR-V shaders" );
337- mSPIRVShaders = true ;
338- } else
339- #endif
340- {
341- CHKERR (glShaderSource (mVertexShader , 1 , &GPUDisplayShaders::vertexShader, nullptr ));
342- CHKERR (glCompileShader (mVertexShader ));
343- CHKERR (glShaderSource (mFragmentShader , 1 , &GPUDisplayShaders::fragmentShader, nullptr ));
344- CHKERR (glCompileShader (mFragmentShader ));
345- }
346- CHKERR (glShaderSource (mVertexShaderTexture , 1 , &GPUDisplayShaders::vertexShaderTexture, nullptr ));
347- CHKERR (glCompileShader (mVertexShaderTexture ));
348- CHKERR (glShaderSource (mFragmentShaderTexture , 1 , &GPUDisplayShaders::fragmentShaderTexture, nullptr ));
349- CHKERR (glCompileShader (mFragmentShaderTexture ));
350- CHKERR (glShaderSource (mFragmentShaderText , 1 , &GPUDisplayShaders::fragmentShaderText, nullptr ));
351- CHKERR (glCompileShader (mFragmentShaderText ));
310+ CHKERR (mVertexShader = loadShader (GL_VERTEX_SHADER , _binary_opengl_vertex_vert_spv_start, _binary_opengl_vertex_vert_spv_len));
311+ CHKERR (mFragmentShader = loadShader (GL_FRAGMENT_SHADER , _binary_opengl_fragment_frag_spv_start, _binary_opengl_fragment_frag_spv_len));
312+ CHKERR (mVertexShaderTexture = loadShader (GL_VERTEX_SHADER , _binary_opengl_vertexTexture_vert_spv_start, _binary_opengl_vertexTexture_vert_spv_len));
313+ CHKERR (mFragmentShaderTexture = loadShader (GL_FRAGMENT_SHADER , _binary_opengl_fragmentTexture_frag_spv_start, _binary_opengl_fragmentTexture_frag_spv_len));
314+ CHKERR (mFragmentShaderText = loadShader (GL_FRAGMENT_SHADER , _binary_opengl_fragmentText_frag_spv_start, _binary_opengl_fragmentText_frag_spv_len));
352315 if (checkShaderStatus (mVertexShader ) || checkShaderStatus (mFragmentShader ) || checkShaderStatus (mVertexShaderTexture ) || checkShaderStatus (mFragmentShaderTexture ) || checkShaderStatus (mFragmentShaderText )) {
353316 return 1 ;
354317 }
@@ -359,31 +322,20 @@ int32_t GPUDisplayBackendOpenGL::InitBackendA()
359322 if (checkProgramStatus (mShaderProgram )) {
360323 return 1 ;
361324 }
362- if (mSPIRVShaders ) {
363- CHKERR (glGenBuffers (1 , &mSPIRVModelViewBuffer ));
364- CHKERR (glGenBuffers (1 , &mSPIRVColorBuffer ));
365- } else {
366- CHKERR (mModelViewProjId = glGetUniformLocation (mShaderProgram , " ModelViewProj" ));
367- CHKERR (mColorId = glGetUniformLocation (mShaderProgram , " color" ));
368- }
369325 CHKERR (mShaderProgramText = glCreateProgram ());
370326 CHKERR (glAttachShader (mShaderProgramText , mVertexShaderTexture ));
371327 CHKERR (glAttachShader (mShaderProgramText , mFragmentShaderText ));
372328 CHKERR (glLinkProgram (mShaderProgramText ));
373329 if (checkProgramStatus (mShaderProgramText )) {
374330 return 1 ;
375331 }
376- CHKERR (mModelViewProjIdText = glGetUniformLocation (mShaderProgramText , " projection" ));
377- CHKERR (mColorIdText = glGetUniformLocation (mShaderProgramText , " textColor" ));
378332 CHKERR (mShaderProgramTexture = glCreateProgram ());
379333 CHKERR (glAttachShader (mShaderProgramTexture , mVertexShaderTexture ));
380334 CHKERR (glAttachShader (mShaderProgramTexture , mFragmentShaderTexture ));
381335 CHKERR (glLinkProgram (mShaderProgramTexture ));
382336 if (checkProgramStatus (mShaderProgramTexture )) {
383337 return 1 ;
384338 }
385- CHKERR (mModelViewProjIdTexture = glGetUniformLocation (mShaderProgramTexture , " projection" ));
386- CHKERR (mAlphaIdTexture = glGetUniformLocation (mShaderProgramTexture , " alpha" ));
387339 CHKERR (glGenVertexArrays (1 , &mVertexArray ));
388340
389341 CHKERR (glGenVertexArrays (1 , &VAO_texture));
@@ -425,10 +377,6 @@ void GPUDisplayBackendOpenGL::ExitBackendA()
425377 CHKERR (glDeleteTextures (1 , &symbol.texId ));
426378 }
427379 }
428- if (mSPIRVShaders ) {
429- CHKERR (glDeleteBuffers (1 , &mSPIRVModelViewBuffer ));
430- CHKERR (glDeleteBuffers (1 , &mSPIRVColorBuffer ));
431- }
432380 if (mMagneticFieldVisualization ) {
433381 ExitMagFieldVisualization ();
434382 }
@@ -522,13 +470,7 @@ void GPUDisplayBackendOpenGL::prepareDraw(const hmm_mat4& proj, const hmm_mat4&
522470#endif
523471 {
524472 const hmm_mat4 modelViewProj = proj * view;
525- if (mSPIRVShaders ) {
526- glBindBuffer (GL_UNIFORM_BUFFER , mSPIRVModelViewBuffer );
527- glBufferData (GL_UNIFORM_BUFFER , sizeof (modelViewProj), &modelViewProj, GL_STATIC_DRAW );
528- glBindBufferBase (GL_UNIFORM_BUFFER , 0 , mSPIRVModelViewBuffer );
529- } else {
530- CHKERR (glUniformMatrix4fv (mModelViewProjId , 1 , GL_FALSE , &modelViewProj.Elements [0 ][0 ]));
531- }
473+ CHKERR (glUniformMatrix4fv (UNIFORM_LOCATION_MATRIX , 1 , GL_FALSE , &modelViewProj.Elements [0 ][0 ]));
532474 if (mMagneticFieldVisualization ) {
533475 CHKERR (glNamedBufferSubData (mFieldModelViewBuffer , 0 , sizeof (modelViewProj), &modelViewProj));
534476 }
@@ -603,9 +545,9 @@ void GPUDisplayBackendOpenGL::prepareText()
603545 CHKERR (glUseProgram (mShaderProgramText ));
604546 CHKERR (glActiveTexture (GL_TEXTURE0 ));
605547 CHKERR (glBindVertexArray (VAO_text));
606- CHKERR (glUniformMatrix4fv (mModelViewProjIdText , 1 , GL_FALSE , &proj.Elements [0 ][0 ]));
548+ CHKERR (glUniformMatrix4fv (UNIFORM_LOCATION_MATRIX , 1 , GL_FALSE , &proj.Elements [0 ][0 ]));
607549 float color[4 ] = {1 .0f , 1 .0f , 1 .0f , 1 .0f };
608- CHKERR (glUniform4fv (mColorIdText , 1 , &color[0 ]));
550+ CHKERR (glUniform4fv (UNIFORM_LOCATION_COLOR , 1 , &color[0 ]));
609551 }
610552}
611553
@@ -635,8 +577,8 @@ void GPUDisplayBackendOpenGL::mixImages(float mixSlaveImage)
635577 CHKERR (glUseProgram (mShaderProgramTexture ));
636578 CHKERR (glActiveTexture (GL_TEXTURE0 ));
637579 CHKERR (glBindVertexArray (VAO_texture));
638- CHKERR (glUniformMatrix4fv (mModelViewProjIdTexture , 1 , GL_FALSE , &proj.Elements [0 ][0 ]));
639- CHKERR (glUniform1f (mAlphaIdTexture , mixSlaveImage));
580+ CHKERR (glUniformMatrix4fv (UNIFORM_LOCATION_MATRIX , 1 , GL_FALSE , &proj.Elements [0 ][0 ]));
581+ CHKERR (glUniform1f (UNIFORM_LOCATION_COLOR , mixSlaveImage));
640582 }
641583
642584 CHKERR (glBindTexture (GL_TEXTURE_2D , mMixBuffer .fbCol_id ));
@@ -737,7 +679,7 @@ void GPUDisplayBackendOpenGL::OpenGLPrint(const char* s, float x, float y, float
737679 if (!mFreetypeInitialized || mDisplay ->drawTextInCompatMode ()) {
738680 return ;
739681 }
740- CHKERR (glUniform4fv (mColorIdText , 1 , color));
682+ CHKERR (glUniform4fv (UNIFORM_LOCATION_COLOR , 1 , color));
741683
742684 if (smoothFont ()) {
743685 scale *= 0 .25f ; // Font size is 48 to have nice bitmap, scale to size 12
0 commit comments