*/}}
소스 검색

Shader cleanups

YimingWu 2 주 전
부모
커밋
fb9a981d1e
5개의 변경된 파일100개의 추가작업 그리고 55개의 파일을 삭제
  1. 3 1
      la_kernel.c
  2. 2 0
      la_tns.h
  3. 30 27
      la_tns_kernel.c
  4. 2 2
      resources/la_tns_shaders.cpp
  5. 63 25
      resources/la_widgets.c

+ 3 - 1
la_kernel.c

@@ -1619,12 +1619,14 @@ void laEnsureUserPreferences(){
 void laAddExtraExtension(int FileType, ...){
     va_list list; va_start(list,FileType);
     char* ext;
+    logPrint("Enabling extra extensions: ");
     while(ext=va_arg(list,char*)){ if(!ext) break;
         laExtensionType* et=memAcquireSimple(sizeof(laExtensionType));
         et->FileType=FileType; et->Extension=ext;
         lstAppendItem(&MAIN.ExtraExtensions, et);
-        logPrintNew("add ext %s",ext);
+        logPrint("%s ",ext);
     }
+    logPrint("\n");
     va_end(list);
 }
 void laAddExtraPreferencePath(const char* path){

+ 2 - 0
la_tns.h

@@ -949,6 +949,8 @@ int tnsNewFragmentShader(const char *Content);
 int tnsNewFragmentShaderMaterial(const char *Content, const char* Library, const char* Material);
 int tnsNewVertexShader(const char *Content);
 void tnsDeleteShaderProgram(tnsShader* s);
+int tnsCheckShaderCompileStatus(GLuint shader_object, char* name);
+int tnsCheckProgramLinkStatus(GLuint program_object, char* name);
 
 int tnsNextPowOf2(int i);
 

+ 30 - 27
la_tns_kernel.c

@@ -427,6 +427,28 @@ char* tnsEnsureShaderCommoms(const char* Content, const char* Library, const cha
     c1=strSub(c,"#with TNS_GLES_UINT_TEXTURE",uint_texture_selection); free(c);
     return c1;
 }
+int tnsCheckShaderCompileStatus(GLuint shader_object, char* name){
+    int status=0; char error[8192]={0};
+    glGetShaderiv(shader_object, GL_COMPILE_STATUS, &status);
+    if (status == GL_FALSE){
+        glGetShaderInfoLog(shader_object, sizeof(error), 0, error); logPrint("%s shader error:\n%s",name?name:"(unnamed)",error);
+        glDeleteShader(shader_object); return 0;
+    } else {
+        glGetShaderInfoLog(shader_object, sizeof(error), 0, error); if(error[0]) logPrint("%s shader info:\n%s",name?name:"(unnamed)",error);
+    }
+    return 1;
+}
+int tnsCheckProgramLinkStatus(GLuint program_object, char* name){
+    int status=0; char error[8192]={0};
+    glGetProgramiv(program_object, GL_LINK_STATUS, &status);
+    if (status == GL_FALSE){
+        glGetProgramInfoLog(program_object, sizeof(error), 0, error); logPrintNew("%s program Linking error:\n%s",name?name:"(unnamed)",error); return 0;
+        glDeleteProgram(program_object); return 0;
+    } else {
+        glGetProgramInfoLog(program_object, sizeof(error), 0, error); if (error[0]) logPrintNew("%s program Linking info:\n%s",name?name:"(unnamed)",error);
+    }
+    return 1;
+}
 int tnsNewVertexShader(const char *Content){
     int status = 0;
     char error[8192]={0};
@@ -440,14 +462,7 @@ int tnsNewVertexShader(const char *Content){
     char* UseContent=tnsEnsureShaderCommoms(Content,0,0);
     glShaderSource(VertexShaderObject, 1, &UseContent, 0);
     glCompileShader(VertexShaderObject);
-    glGetShaderiv(VertexShaderObject, GL_COMPILE_STATUS, &status);
-    if (status == GL_FALSE){
-        glGetShaderInfoLog(VertexShaderObject, sizeof(error), 0, error); logPrint("Vertex shader error:\n%s", error);
-        glDeleteShader(VertexShaderObject); free(UseContent);
-        return -1;
-    } else {
-        glGetShaderInfoLog(VertexShaderObject, sizeof(error), 0, error); if(error[0]) logPrint("Vertex shader info:\n%s", error);
-    }
+    if(!tnsCheckShaderCompileStatus(VertexShaderObject,"Vertex")){ free(UseContent); return -1; }
     free(UseContent);
 
     return VertexShaderObject;
@@ -465,14 +480,7 @@ int tnsNewFragmentShaderMaterial(const char *Content, const char* Library, const
     char* UseContent=tnsEnsureShaderCommoms(Content,Library,Material);
     glShaderSource(FragmentShaderObject, 1, &UseContent, 0);
     glCompileShader(FragmentShaderObject);
-    glGetShaderiv(FragmentShaderObject, GL_COMPILE_STATUS, &status);
-    if (status == GL_FALSE){
-        glGetShaderInfoLog(FragmentShaderObject, sizeof(error), 0, error); printf("Fragment shader error:\n%s", error);
-        glDeleteShader(FragmentShaderObject); free(UseContent);
-        return -1;
-    } else {
-        glGetShaderInfoLog(FragmentShaderObject, sizeof(error), 0, error); if (error[0]) logPrint("Fragment shader info:\n%s", error);
-    }
+    if(!tnsCheckShaderCompileStatus(FragmentShaderObject,"Vertex")){ free(UseContent); return -1; }
     free(UseContent);
 
     return FragmentShaderObject;
@@ -494,14 +502,7 @@ int tnsNewGeometryShader(const char *Content){
     char* UseContent=tnsEnsureShaderCommoms(Content,0,0);
     glShaderSource(GeometryShaderObject, 1, &UseContent, 0);
     glCompileShader(GeometryShaderObject);
-    glGetShaderiv(GeometryShaderObject, GL_COMPILE_STATUS, &status);
-    if (status == GL_FALSE){
-        glGetShaderInfoLog(GeometryShaderObject, sizeof(error), 0, error); logPrint("Geometry shader error:\n%s", error);
-        glDeleteShader(GeometryShaderObject); free(UseContent);
-        return -1;
-    } else {
-        glGetShaderInfoLog(GeometryShaderObject, sizeof(error), 0, error); if(error[0]) logPrint("Geometry shader info:\n%s", error);
-    }
+    if(!tnsCheckShaderCompileStatus(GeometryShaderObject,"Geometry")){ free(UseContent); return -1; }
     free(UseContent);
     
     return GeometryShaderObject;
@@ -2005,18 +2006,20 @@ void tnsUnbindTexture(){
 }
 void tnsBindTexture2(tnsTexture *t){
     if ((!t) || T->TexColor2==t) return;
+    if(t->IsUIntTexture){ tnsActiveTexture(GL_TEXTURE5); glBindTexture(t->GLTexType, t->GLTexHandle); T->TexColor2=t; return; }
     if(t->GLTexType == GL_TEXTURE_2D){ tnsActiveTexture(GL_TEXTURE4); glBindTexture(t->GLTexType, t->GLTexHandle); T->TexColor2=t;}
 }
 void tnsUnbindTexture2(){
     if(T->TexColor2){
-        tnsActiveTexture(GL_TEXTURE4); glBindTexture(T->TexColor2->GLTexType, 0); T->TexColor2=0;
+        if(T->TexColor2->IsUIntTexture){ tnsActiveTexture(GL_TEXTURE5); glBindTexture(T->TexColor2->GLTexType, 0); T->TexColor2=0; }
+        else{ tnsActiveTexture(GL_TEXTURE4); glBindTexture(T->TexColor2->GLTexType, 0); T->TexColor2=0; }
     }
 }
 void tnsUniformUseTexture(tnsShader* s, int mode, int sample, int TexIsUInt, int Tex2IsUInt){
     if(s->StateTextureMode != mode){ s->StateTextureMode=mode; glUniform1i(s->iTextureMode,mode); }
     if(mode==3 && s->StateSampleAmount != sample){ s->StateSampleAmount=sample, glUniform1i(s->iSampleAmount,sample); }
     if(s->StateTexIsUI != TexIsUInt){ s->StateTexIsUI=TexIsUInt; glUniform1i(s->iTexIsUI,TexIsUInt); }
-    if(s->StateTex2IsUI != Tex2IsUInt){ s->StateTex2IsUI=Tex2IsUInt; glUniform1i(s->iTex2IsUI,TexIsUInt); }
+    if(s->StateTex2IsUI != Tex2IsUInt){ s->StateTex2IsUI=Tex2IsUInt; glUniform1i(s->iTex2IsUI,Tex2IsUInt); }
 }
 void tnsUniformUseMultiplyColor(tnsShader* s, int enable){
     int mode=enable?1:0;
@@ -2563,7 +2566,7 @@ void tnsFlush(){
             }
         }
 
-        if (c->TextureMode && c->ColorTexture && cs->iTexColor!=-1){
+        if (c->TextureMode && c->ColorTexture){
             tnsBindTexture(c->ColorTexture);
             if(c->ColorTexture2) tnsBindTexture2(c->ColorTexture2);
             tnsUniformUseTexture(cs, c->TextureMode, c->ColorTexture->Multisample,

+ 2 - 2
resources/la_tns_shaders.cpp

@@ -686,7 +686,7 @@ layout (binding=1) uniform highp sampler2DMS TexColorMS;
 layout (binding=2) uniform highp usampler2D TexColorUI;
 layout (binding=3) uniform highp sampler3D TexLut;
 layout (binding=4) uniform highp sampler2D TexColor2;
-layout (binding=5) uniform highp sampler2D TexColorUI2;
+layout (binding=5) uniform highp usampler2D TexColorUI2;
 uniform int TexIsUI;
 uniform int Tex2IsUI;
 uniform int UseLut;
@@ -771,7 +771,7 @@ vec4 texture1(vec2 uv){
 	return texture(TexColor,uv);
 }
 vec4 texture2(){
-	if(Tex2IsUI!=0){ vec4 c=texelFetch(TexColorUI2,ivec2(gl_FragCoord.xy),0); return c; }
+	if(Tex2IsUI!=0){ vec4 c=textureUI(TexColorUI2,gl_FragCoord.xy); return c; }
 	return texelFetch(TexColor2,ivec2(gl_FragCoord.xy),0);
 }
 

+ 63 - 25
resources/la_widgets.c

@@ -2426,7 +2426,7 @@ int OPMOD_IntArrayHorizon(laOperator *a, laEvent *e){
         uit->LastY = e->y;
         ui->Extra->On = (IsVertical ? la_DetectRow(ui, e->y) : la_DetectColumn(ui, e->x, Len)) + 1;
         if (ui->Extra->On > Len) return LA_RUNNING;
-        laGetIntArray(&ui->PP, &TmpArr);
+        laGetIntArray(&ui->PP, TmpArr);
         uit->TargetIndexValf = TmpArr[ui->Extra->On - 1];
         laRedrawCurrentPanel();
         return LA_RUNNING;
@@ -2464,7 +2464,7 @@ int OPMOD_IntArrayHorizon(laOperator *a, laEvent *e){
             if ((!uit->Edit) || (uit->Edit && (SelectOn != ui->Extra->On))){
                 char buf[32] = {0};
                 uit->On=SelectOn;
-                laGetIntArray(&ui->PP, &TmpArr);
+                laGetIntArray(&ui->PP, TmpArr);
                 uit->TargetIndexVali = TmpArr[ui->Extra->On - 1];
                 strPrintIntAfter(buf, 32, uit->TargetIndexVali);
                 strBeginEdit(&uit->Edit,buf);
@@ -2477,16 +2477,35 @@ int OPMOD_IntArrayHorizon(laOperator *a, laEvent *e){
     }
 
     if(e->type ==LA_KEY_DOWN){
-        if (e->key == LA_KEY_ENTER && uit->Edit){
-            char* buf=strEndEdit(&uit->Edit, 0);
-            int Result; sscanf(buf, "%d", &Result); free(buf);
-            laSetIntArraySingle(&ui->PP, ui->Extra->On - 1, Result);
-            laRecordAndPushProp(&ui->PP,0); laMarkPropChanged(&ui->PP);
-            ui->State = LA_UI_NORMAL;
-            uit->Dragging = 0;
-            uit->On = 0;
-            laRedrawCurrentPanel(); la_DisplayKeyboard(0);
-            return LA_FINISHED_PASS;
+        if(uit->Edit){
+            if (e->key == LA_KEY_ENTER){
+                char* buf=strEndEdit(&uit->Edit, 0);
+                int Result; sscanf(buf, "%d", &Result); free(buf);
+                laSetIntArraySingle(&ui->PP, uit->On - 1, Result);
+                laRecordAndPushProp(&ui->PP,0); laMarkPropChanged(&ui->PP);
+                ui->State = LA_UI_NORMAL;
+                uit->Dragging = 0;
+                uit->On = 0;
+                laRedrawCurrentPanel(); la_DisplayKeyboard(0);
+                return LA_FINISHED_PASS;
+            }elif (e->key==LA_KEY_TAB){
+                char* buf=strEndEdit(&uit->Edit, 0);
+                int Result; sscanf(buf, "%d", &Result); free(buf);
+                laSetIntArraySingle(&ui->PP, uit->On - 1, Result);
+                int dir=(e->SpecialKeyBit&LA_KEY_SHIFT)?-1:1;
+                if((dir>0 && uit->On<Len) || (dir<0 && uit->On>1)){ uit->On+=dir; char bufa[32]={0};
+                    laGetIntArray(&ui->PP, &TmpArr); strPrintIntAfter(bufa, 32, TmpArr[uit->On-1]);
+                    strBeginEdit(&uit->Edit,bufa); strSelectLineAll(uit->Edit); la_DisplayKeyboard(1);
+                }else{
+                    ui->State = LA_UI_NORMAL; uit->Dragging = 0; uit->On = 0;
+                    la_DisplayKeyboard(0);
+                }
+                laRecordAndPushProp(&ui->PP,0); laMarkPropChanged(&ui->PP);
+                laRedrawCurrentPanel();
+            }elif(e->key==LA_KEY_ESCAPE){
+                ui->State = LA_UI_NORMAL; uit->Dragging = 0; uit->On = 0;
+                la_DisplayKeyboard(0);
+            }
         }
     }
     
@@ -2554,7 +2573,7 @@ int OPMOD_FloatArrayHorizon(laOperator *a, laEvent *e){
         uit->LastY = e->y;
         ui->Extra->On = (IsVertical ? la_DetectRow(ui, e->y) : la_DetectColumn(ui, e->x, Len)) + 1;
         if (ui->Extra->On > Len) return LA_RUNNING;
-        laGetFloatArray(&ui->PP, &TmpArr);
+        laGetFloatArray(&ui->PP, TmpArr);
         uit->TargetIndexValf = TmpArr[ui->Extra->On - 1];
         laRedrawCurrentPanel();
 
@@ -2567,7 +2586,7 @@ int OPMOD_FloatArrayHorizon(laOperator *a, laEvent *e){
             real min,max; int Ranged = laGetFloatRange(&ui->PP, &min, &max); 
             int UseRange = (Ranged&&!IsKnob); real step=fp->Step; if(UseRange){ step=(max-min)/(ui->R-ui->L); }
             if(Ranged){ TNS_CLAMP(step,(max-min)/500,INT_MAX); }
-            laGetFloatArray(&ui->PP, &TmpArr);
+            laGetFloatArray(&ui->PP, TmpArr);
             uit->TargetIndexValf = TmpArr[ui->Extra->On - 1];
             int delta=e->x-uit->LastX; if(IsKnob){ int dy=uit->LastY-e->y; delta=delta+dy; }
             if(UseRange || (abs(delta) > MAIN.ValuatorThreshold)){
@@ -2595,7 +2614,7 @@ int OPMOD_FloatArrayHorizon(laOperator *a, laEvent *e){
             if ((!uit->Edit) || (uit->Edit && (SelectOn != ui->Extra->On))){
                 char buf[32] = {0};
                 uit->On=SelectOn;
-                laGetFloatArray(&ui->PP, &TmpArr);
+                laGetFloatArray(&ui->PP, TmpArr);
                 uit->TargetIndexValf = TmpArr[ui->Extra->On - 1];
                 strPrintFloatAfter(buf, 32, 5, IsRad?deg(uit->TargetIndexValf):uit->TargetIndexValf);
                 strBeginEdit(&uit->Edit,buf);
@@ -2608,16 +2627,35 @@ int OPMOD_FloatArrayHorizon(laOperator *a, laEvent *e){
     }
 
     if(e->type ==LA_KEY_DOWN){
-        if (e->key == LA_KEY_ENTER && uit->Edit){
-            char* buf=strEndEdit(&uit->Edit, 0);
-            real Result; sscanf(buf, "%lf", &Result); free(buf);
-            if(IsRad) Result=rad(Result);
-            laSetFloatArraySingle(&ui->PP, ui->Extra->On - 1, Result);
-            laRecordAndPushProp(&ui->PP,0); laMarkPropChanged(&ui->PP);
-            uit->Dragging = 0;
-            uit->On = 0;
-            laRedrawCurrentPanel(); la_DisplayKeyboard(0);
-            return LA_FINISHED_PASS;
+        if(uit->Edit){
+            if (e->key == LA_KEY_ENTER){
+                char* buf=strEndEdit(&uit->Edit, 0);
+                real Result; sscanf(buf, "%lf", &Result); free(buf);
+                if(IsRad) Result=rad(Result);
+                laSetFloatArraySingle(&ui->PP, ui->Extra->On - 1, Result);
+                laRecordAndPushProp(&ui->PP,0); laMarkPropChanged(&ui->PP);
+                uit->Dragging = 0;
+                uit->On = 0;
+                laRedrawCurrentPanel(); la_DisplayKeyboard(0);
+                return LA_FINISHED_PASS;
+            }elif (e->key==LA_KEY_TAB){
+                char* buf=strEndEdit(&uit->Edit, 0);
+                real Result; sscanf(buf, "%lf", &Result); free(buf);
+                laSetFloatArraySingle(&ui->PP, uit->On - 1, Result);
+                int dir=(e->SpecialKeyBit&LA_KEY_SHIFT)?-1:1;
+                if((dir>0 && uit->On<Len) || (dir<0 && uit->On>1)){ uit->On+=dir; char bufa[32]={0}; 
+                    laGetFloatArray(&ui->PP, TmpArr); strPrintFloatAfter(bufa, 32, 5, TmpArr[uit->On-1]);
+                    strBeginEdit(&uit->Edit,bufa); strSelectLineAll(uit->Edit); la_DisplayKeyboard(1);
+                }else{
+                    ui->State = LA_UI_NORMAL; uit->Dragging = 0; uit->On = 0;
+                    la_DisplayKeyboard(0);
+                }
+                laRecordAndPushProp(&ui->PP,0); laMarkPropChanged(&ui->PP);
+                laRedrawCurrentPanel();
+            }elif(e->key==LA_KEY_ESCAPE){
+                ui->State = LA_UI_NORMAL; uit->Dragging = 0; uit->On = 0;
+                la_DisplayKeyboard(0);
+            }
         }
     }