@@ -322,7 +322,7 @@ uint32_t CreateShader(const char* fragmentShader)
322322
323323 char errorBuffer[1024 - 16 ];
324324 glGetShaderInfoLog (vertexShaderId, sizeof (errorBuffer), NULL , errorBuffer);
325- GetLogger ()->Error (errorBuffer);
325+ GetLogger ()->Error (" %s " , errorBuffer);
326326
327327 return 0 ;
328328 }
@@ -337,7 +337,7 @@ uint32_t CreateShader(const char* fragmentShader)
337337
338338 char errorBuffer[1024 - 16 ];
339339 glGetShaderInfoLog (fragmentShaderId, sizeof (errorBuffer), NULL , errorBuffer);
340- GetLogger ()->Error (errorBuffer);
340+ GetLogger ()->Error (" %s " , errorBuffer);
341341
342342 return 0 ;
343343 }
@@ -353,7 +353,7 @@ uint32_t CreateShader(const char* fragmentShader)
353353
354354 char errorBuffer[1024 - 16 ];
355355 glGetProgramInfoLog (shaderProgramId, sizeof (errorBuffer), NULL , errorBuffer);
356- GetLogger ()->Error (errorBuffer);
356+ GetLogger ()->Error (" %s " , errorBuffer);
357357
358358 return 0 ;
359359 }
@@ -445,6 +445,17 @@ void OpenGLRenderer::Run()
445445 glGenTextures (1 , &surfaceTextureId);
446446 glGenTextures (1 , &paletteTextureId);
447447
448+ glActiveTexture (GL_TEXTURE0 );
449+ glBindTexture (GL_TEXTURE_2D , surfaceTextureId);
450+ glTexParameteri (GL_TEXTURE_2D , GL_TEXTURE_MIN_FILTER , GL_NEAREST );
451+ glTexParameteri (GL_TEXTURE_2D , GL_TEXTURE_MAG_FILTER , GL_NEAREST );
452+
453+ glActiveTexture (GL_TEXTURE1 );
454+ glBindTexture (GL_TEXTURE_2D , paletteTextureId);
455+ glTexParameteri (GL_TEXTURE_2D , GL_TEXTURE_MIN_FILTER , GL_NEAREST );
456+ glTexParameteri (GL_TEXTURE_2D , GL_TEXTURE_MAG_FILTER , GL_NEAREST );
457+ glTexImage2D (GL_TEXTURE_2D , 0 , GL_RGBA8 , 256 , 1 , 0 , GL_BGRA , GL_UNSIGNED_BYTE , nullptr );
458+
448459 glViewport (0 , 0 , Global::MonitorWidth, Global::MonitorHeight);
449460
450461 uint32_t vboId = 0 ;
@@ -459,6 +470,9 @@ void OpenGLRenderer::Run()
459470 glEnableVertexAttribArray (0 );
460471 glEnableVertexAttribArray (1 );
461472
473+ glVertexAttribPointer (0 , 3 , GL_FLOAT , GL_FALSE , 0 , 0 );
474+ glVertexAttribPointer (1 , 2 , GL_FLOAT , GL_FALSE , 0 , (void *)(12 * sizeof (float )));
475+
462476 GetLogger ()->Informational (" %s %s\n " , __FUNCTION__, " is running" );
463477
464478 InitImGui ();
@@ -474,6 +488,7 @@ void OpenGLRenderer::Run()
474488 int32_t currentWidth = 0 ;
475489 int32_t currentHeight = 0 ;
476490 int32_t currentBitsPerPixel = 0 ;
491+ bool refreshGLTexture = false ;
477492
478493 Mutex.lock ();
479494 while (IsThreadRunning)
@@ -483,42 +498,39 @@ void OpenGLRenderer::Run()
483498 uint32_t drawTime = timeGetTime ();
484499
485500 // Clear
486- glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
501+ glClear (GL_COLOR_BUFFER_BIT );
487502
488503 if (surfaceBuffer)
489504 {
490- // Set images
505+ // Upload the surface. Re-allocate only when the resolution or bit depth changed
491506 if (currentBitsPerPixel == 8 && paletteBuffer)
492507 {
493508 glActiveTexture (GL_TEXTURE0 );
494509 glBindTexture (GL_TEXTURE_2D , surfaceTextureId);
495- glTexParameteri (GL_TEXTURE_2D , GL_TEXTURE_MIN_FILTER , GL_NEAREST );
496- glTexParameteri (GL_TEXTURE_2D , GL_TEXTURE_MAG_FILTER , GL_NEAREST );
497- glTexImage2D (GL_TEXTURE_2D , 0 , GL_R8UI , currentWidth, currentHeight, 0 , GL_RED_INTEGER , GL_UNSIGNED_BYTE , surfaceBuffer);
510+ if (refreshGLTexture)
511+ glTexImage2D (GL_TEXTURE_2D , 0 , GL_R8UI , currentWidth, currentHeight, 0 , GL_RED_INTEGER , GL_UNSIGNED_BYTE , surfaceBuffer);
512+ else
513+ glTexSubImage2D (GL_TEXTURE_2D , 0 , 0 , 0 , currentWidth, currentHeight, GL_RED_INTEGER , GL_UNSIGNED_BYTE , surfaceBuffer);
498514
499515 glActiveTexture (GL_TEXTURE1 );
500516 glBindTexture (GL_TEXTURE_2D , paletteTextureId);
501- glTexParameteri (GL_TEXTURE_2D , GL_TEXTURE_MIN_FILTER , GL_NEAREST );
502- glTexParameteri (GL_TEXTURE_2D , GL_TEXTURE_MAG_FILTER , GL_NEAREST );
503- glTexImage2D (GL_TEXTURE_2D , 0 , GL_RGBA8 , 256 , 1 , 0 , GL_BGRA , GL_UNSIGNED_BYTE , paletteBuffer);
517+ glTexSubImage2D (GL_TEXTURE_2D , 0 , 0 , 0 , 256 , 1 , GL_BGRA , GL_UNSIGNED_BYTE , paletteBuffer);
504518 }
505519 else if (currentBitsPerPixel == 32 )
506520 {
507521 glActiveTexture (GL_TEXTURE0 );
508522 glBindTexture (GL_TEXTURE_2D , surfaceTextureId);
509- glTexParameteri (GL_TEXTURE_2D , GL_TEXTURE_MIN_FILTER , GL_NEAREST );
510- glTexParameteri (GL_TEXTURE_2D , GL_TEXTURE_MAG_FILTER , GL_NEAREST );
511- glTexImage2D (GL_TEXTURE_2D , 0 , GL_RGBA8 , currentWidth, currentHeight, 0 , GL_BGRA , GL_UNSIGNED_BYTE , surfaceBuffer);
523+ if (refreshGLTexture)
524+ glTexImage2D (GL_TEXTURE_2D , 0 , GL_RGBA8 , currentWidth, currentHeight, 0 , GL_BGRA , GL_UNSIGNED_BYTE , surfaceBuffer);
525+ else
526+ glTexSubImage2D (GL_TEXTURE_2D , 0 , 0 , 0 , currentWidth, currentHeight, GL_BGRA , GL_UNSIGNED_BYTE , surfaceBuffer);
512527
513528 glActiveTexture (GL_TEXTURE1 );
514529 glBindTexture (GL_TEXTURE_2D , 0 );
515530 }
516531
517- glVertexAttribPointer (0 , 3 , GL_FLOAT , GL_FALSE , 0 , 0 );
518- glVertexAttribPointer (1 , 2 , GL_FLOAT , GL_FALSE , 0 , (void *)(12 * sizeof (float )));
519-
520- glBindBuffer (GL_ARRAY_BUFFER , vertexBufferId);
521532 glDrawArrays (GL_TRIANGLE_FAN , 0 , 4 );
533+ refreshGLTexture = false ;
522534 }
523535
524536#ifdef _IMGUI_ENABLED
@@ -552,7 +564,7 @@ void OpenGLRenderer::Run()
552564 continue ;
553565
554566 // Prevent flickering caused by palette changes
555- if (PrimarySurface->PrimaryInvalid )
567+ if (! PrimarySurface->IsPrimaryValid )
556568 continue ;
557569
558570 // Can't render without palette
@@ -567,6 +579,7 @@ void OpenGLRenderer::Run()
567579
568580 RecalculateGLSurface ();
569581 RecalculateSurface = false ;
582+ refreshGLTexture = true ;
570583 }
571584 else if (RecalculateSurface)
572585 {
@@ -580,6 +593,7 @@ void OpenGLRenderer::Run()
580593
581594 RecalculateGLSurface ();
582595 RecalculateSurface = false ;
596+ refreshGLTexture = true ;
583597 }
584598
585599 PrimarySurface->PrimaryDrawMutex .lock ();
@@ -597,9 +611,6 @@ void OpenGLRenderer::Run()
597611
598612 PrimarySurface->PrimaryDrawMutex .unlock ();
599613
600- currentWidth = PrimarySurface->Width ;
601- currentHeight = PrimarySurface->Height ;
602-
603614 if (currentBitsPerPixel != PrimarySurface->BitsPerPixel )
604615 {
605616 // BBP switched
@@ -616,8 +627,12 @@ void OpenGLRenderer::Run()
616627
617628 glUniform1i (glGetUniformLocation (shaderProgram32BitId, " surface" ), 0 );
618629 }
630+
631+ refreshGLTexture = true ;
619632 }
620633
634+ currentWidth = PrimarySurface->Width ;
635+ currentHeight = PrimarySurface->Height ;
621636 currentBitsPerPixel = PrimarySurface->BitsPerPixel ;
622637 }
623638 Mutex.unlock ();
0 commit comments