*/}}
Ver código fonte

intel igpu adaptations

YimingWu 1 semana atrás
pai
commit
3a90323ba0
3 arquivos alterados com 13 adições e 9 exclusões
  1. 6 6
      ouroperations.c
  2. 1 1
      ourpaint.h
  3. 6 2
      ourshader.cpp

+ 6 - 6
ouroperations.c

@@ -1194,7 +1194,7 @@ void our_CanvasDrawCanvas(laBoxedTheme *bt, OurPaint *unused_c, laUiItem* ui){
     
     if(Our->PigmentMode){
         uint32_t val[4]={0};
-        glClearBufferuiv(GL_COLOR, 0,&val);
+        glClearBufferuiv(GL_COLOR, 0,val);
         tnsEnableShaderv(Our->PigmentLayeringProgramT);
     }else{
         tnsClearColor(LA_COLOR3(Our->BackgroundColor),1); tnsClearAll();
@@ -2742,7 +2742,7 @@ void our_PaintDoDabsWithSmudgeSegments(OurLayer* l,int tl, int tr, int tu, int t
         Our->u=&Our->uRGBA;
     }
 
-    unsigned int *uniforms=alloca(sizeof(unsigned int)*OURU->MaxSubroutineUniformLocations);
+    unsigned int *uniforms=alloca(sizeof(unsigned int)*OURU->SubroutineUniformLocations);
 
     glUniform1i(OURU->uBrushErasing,Our->Erasing);
     glUniform1i(OURU->uBrushMix,Our->Erasing?0:Our->BrushMix);
@@ -2754,7 +2754,7 @@ void our_PaintDoDabsWithSmudgeSegments(OurLayer* l,int tl, int tr, int tu, int t
     if(OURU->uMixRoutineSelection>=0){
         uniforms[OURU->uMixRoutineSelection]=Our->SpectralMode?OURU->RoutineDoMixSpectral:OURU->RoutineDoMixNormal;
     }
-    glUniformSubroutinesuiv(GL_COMPUTE_SHADER,OURU->MaxSubroutineUniformLocations,uniforms);
+    glUniformSubroutinesuiv(GL_COMPUTE_SHADER,OURU->SubroutineUniformLocations,uniforms);
 #endif
     glUniform1i(OURU->uCanvasType,Our->BackgroundType);
     glUniform1i(OURU->uCanvasRandom,Our->BackgroundRandom);
@@ -2766,7 +2766,7 @@ void our_PaintDoDabsWithSmudgeSegments(OurLayer* l,int tl, int tr, int tu, int t
 #ifdef LA_USE_GLES
             glUniform1i(OURU->uBrushRoutineSelectionES,1);
 #else
-            glUniformSubroutinesuiv(GL_COMPUTE_SHADER,OURU->MaxSubroutineUniformLocations,uniforms);
+            glUniformSubroutinesuiv(GL_COMPUTE_SHADER,OURU->SubroutineUniformLocations,uniforms);
 #endif
             int x=Our->Dabs[oss->Start].X, y=Our->Dabs[oss->Start].Y; float usize=Our->Dabs[oss->Start].Size;
             float ssize=(usize>15)?(usize+1.5):(usize*1.1); if(ssize<3) ssize=3;
@@ -2787,7 +2787,7 @@ void our_PaintDoDabsWithSmudgeSegments(OurLayer* l,int tl, int tr, int tu, int t
 #ifdef LA_USE_GLES
             glUniform1i(OURU->uBrushRoutineSelectionES,0);
 #else
-            glUniformSubroutinesuiv(GL_COMPUTE_SHADER,OURU->MaxSubroutineUniformLocations,uniforms);
+            glUniformSubroutinesuiv(GL_COMPUTE_SHADER,OURU->SubroutineUniformLocations,uniforms);
 #endif
             glUniform1i(OURU->uBrushErasing,Our->Erasing);
         }
@@ -4944,7 +4944,7 @@ void ourGetUniforms(int CanvasProgram, int CompositionProgram){
     OURU->uAlphaTop=glGetUniformLocation(CompositionProgram,"uAlphaTop");
     OURU->uAlphaBottom=glGetUniformLocation(CompositionProgram,"uAlphaBottom");
 
-    glGetIntegerv(GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS, &OURU->MaxSubroutineUniformLocations);
+    glGetProgramStageiv(CanvasProgram,GL_COMPUTE_SHADER,GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS, &OURU->SubroutineUniformLocations);
 }
 
 int ourInit(){

+ 1 - 1
ourpaint.h

@@ -461,7 +461,7 @@ STRUCTURE(BrushUniforms){
     GLint uBlendMode;
     GLint uAlphaTop;
     GLint uAlphaBottom;
-    GLsizei MaxSubroutineUniformLocations;
+    GLsizei SubroutineUniformLocations;
 };
 
 STRUCTURE(OurPaint){

+ 6 - 2
ourshader.cpp

@@ -561,7 +561,7 @@ void main() {
 )";
 
 const char OUR_PIGMENT_COMMON[]=R"(
-#define POW_EPS (1e-9)
+#define POW_EPS (1.0e-9)
 #define USE_SAFE_POW 1
 
 #if USE_SAFE_POW
@@ -863,7 +863,11 @@ vec3 Spectral2XYZ(float spec[OUR_SPECTRAL_SLICES]){
 vec3 PigmentToRGB(PigmentData pd, PigmentData light){
     float slices[OUR_SPECTRAL_SLICES];
     for(int i=0;i<OUR_SPECTRAL_SLICES-1;i++){
-        float absfac=1.0f-pd.a[i]*pow(pd.a[15],1.); if(absfac<0.)absfac=0.; slices[i]=pd.r[i]*absfac;
+        if(pd.a[15]!=0.0){ // apparently intel iGPUs need this
+            float absfac=1.0f-pd.a[i]*pow(pd.a[15],1.); if(absfac<0.)absfac=0.; slices[i]=pd.r[i]*absfac;
+        }else{
+            slices[i]=pd.r[i];
+        }
         slices[i]*=light.r[i];
     }
     vec3 xyz=Spectral2XYZ(slices); vec3 rgb=XYZ2sRGB(xyz); return rgb;