*/}}
瀏覽代碼

Shader adaptation for intel

YimingWu 2 周之前
父節點
當前提交
a76c95cb02
共有 2 個文件被更改,包括 11 次插入8 次删除
  1. 10 8
      ouroperations.c
  2. 1 0
      ourpaint.h

+ 10 - 8
ouroperations.c

@@ -2721,8 +2721,7 @@ STRUCTURE(OurSmudgeSegement){
 };
 void our_PaintDoDabsWithSmudgeSegments(OurLayer* l,int tl, int tr, int tu, int tb){
     laListHandle Segments={0}; int from=0,to=Our->NextDab; if(!Our->NextDab) return;
-    OurSmudgeSegement* oss; unsigned int uniforms[2];
-    oss=lstAppendPointerSized(&Segments, 0,sizeof(OurSmudgeSegement));
+    OurSmudgeSegement* oss=lstAppendPointerSized(&Segments, 0,sizeof(OurSmudgeSegement));
     for(int i=1;i<to;i++){
         if(Our->Dabs[i].ResampleSmudge){ oss->Start=from; oss->End=i; from=i;
             oss=lstAppendPointerSized(&Segments, 0,sizeof(OurSmudgeSegement));  oss->Resample=1;
@@ -2731,19 +2730,20 @@ void our_PaintDoDabsWithSmudgeSegments(OurLayer* l,int tl, int tr, int tu, int t
     oss->Start=from; oss->End=to;
     if(Our->Dabs[0].ResampleSmudge){ ((OurSmudgeSegement*)Segments.pFirst)->Resample=1; }
 
-    int subroutine_count;
     if(Our->PigmentMode){
         glUseProgram(Our->CanvasPigmentProgram);
-        Our->u=&Our->uPigment; subroutine_count=1;
+        Our->u=&Our->uPigment;
     }else{
         if(Our->AlphaMode){
             glUseProgram(Our->CanvasStraightProgram);
         }else{
             glUseProgram(Our->CanvasProgram);
         }
-        Our->u=&Our->uRGBA; subroutine_count=2;
+        Our->u=&Our->uRGBA;
     }
 
+    unsigned int *uniforms=alloca(sizeof(unsigned int)*OURU->MaxSubroutineUniformLocations);
+
     glUniform1i(OURU->uBrushErasing,Our->Erasing);
     glUniform1i(OURU->uBrushMix,Our->Erasing?0:Our->BrushMix);
 #ifdef LA_USE_GLES
@@ -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,subroutine_count,uniforms);
+    glUniformSubroutinesuiv(GL_COMPUTE_SHADER,OURU->MaxSubroutineUniformLocations,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,subroutine_count,uniforms);
+            glUniformSubroutinesuiv(GL_COMPUTE_SHADER,OURU->MaxSubroutineUniformLocations,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,subroutine_count,uniforms);
+            glUniformSubroutinesuiv(GL_COMPUTE_SHADER,OURU->MaxSubroutineUniformLocations,uniforms);
 #endif
             glUniform1i(OURU->uBrushErasing,Our->Erasing);
         }
@@ -4943,6 +4943,8 @@ void ourGetUniforms(int CanvasProgram, int CompositionProgram){
     OURU->uBlendMode=glGetUniformLocation(CompositionProgram,"uBlendMode");
     OURU->uAlphaTop=glGetUniformLocation(CompositionProgram,"uAlphaTop");
     OURU->uAlphaBottom=glGetUniformLocation(CompositionProgram,"uAlphaBottom");
+
+    glGetIntegerv(GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS, &OURU->MaxSubroutineUniformLocations);
 }
 
 int ourInit(){

+ 1 - 0
ourpaint.h

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