]> Chaos Git - corbenik/ctrulib.git/commitdiff
shaderProgram: manage GPUREG_SH_OUTATTR_MODE/CLOCK
authorfincs <fincs.alt1@gmail.com>
Tue, 1 Dec 2015 12:22:34 +0000 (13:22 +0100)
committerfincs <fincs.alt1@gmail.com>
Tue, 1 Dec 2015 12:22:34 +0000 (13:22 +0100)
libctru/include/3ds/gpu/shbin.h
libctru/source/gpu/shaderProgram.c
libctru/source/gpu/shbin.c

index d518fc9cc085e0eb100451155bbfcee433f1d920..c53b2728e7f9e44ee35d4808449279aa95188612 100644 (file)
@@ -76,6 +76,8 @@ typedef struct{
        char* symbolTableData;                 ///< Symbol table data.
        u8 outmapMask;                         ///< Output map mask.
        u32 outmapData[8];                     ///< Output map data.
+       u32 outmapMode;                        ///< Output map mode.
+       u32 outmapClock;                       ///< Output map attribute clock.
 }DVLE_s;
 
 /// DVLB data.
index 876332b7a3ec26d65c151c9aa120f8ed10a70446..a891dcbe8649132eda4add6d0af21fb4afc2cb45 100644 (file)
@@ -220,8 +220,8 @@ Result shaderProgramConfigure(shaderProgram_s* sp, bool sendVshCode, bool sendGs
                // finish setting up vertex shader alone\r
                GPU_SetShaderOutmap((u32*)vshDvle->outmapData);\r
 \r
-               GPUCMD_AddWrite(GPUREG_SH_OUTATTR_MODE, 0x00000001); // ?\r
-               GPUCMD_AddWrite(GPUREG_SH_OUTATTR_CLOCK, 0x00000703); // ?\r
+               GPUCMD_AddWrite(GPUREG_SH_OUTATTR_MODE, vshDvle->outmapMode);\r
+               GPUCMD_AddWrite(GPUREG_SH_OUTATTR_CLOCK, vshDvle->outmapClock);\r
        }else{\r
                // setup both vertex and geometry shader\r
                const DVLE_s* gshDvle = sp->geometryShader->dvle;\r
@@ -240,8 +240,8 @@ Result shaderProgramConfigure(shaderProgram_s* sp, bool sendVshCode, bool sendGs
                GPUCMD_AddWrite(GPUREG_GSH_INPUTBUFFER_CONFIG, 0x08000000|(sp->geoShaderInputStride-1));\r
                GPUCMD_AddIncrementalWrites(GPUREG_GSH_ATTRIBUTES_PERMUTATION_LOW, sp->geoShaderInputPermutation, 2);\r
 \r
-               GPUCMD_AddWrite(GPUREG_SH_OUTATTR_MODE, 0x00000001); // ?\r
-               GPUCMD_AddWrite(GPUREG_SH_OUTATTR_CLOCK, 0x01030703); // ?\r
+               GPUCMD_AddWrite(GPUREG_SH_OUTATTR_MODE, gshDvle->outmapMode);\r
+               GPUCMD_AddWrite(GPUREG_SH_OUTATTR_CLOCK, gshDvle->outmapClock);\r
        }\r
 \r
        return 0;\r
index d6f66dca43d017e897d7600db727d1064c3bff7b..5209c3c55131509c468bcf9f5b75b848bbf80bae 100644 (file)
@@ -97,6 +97,8 @@ void DVLE_GenerateOutmap(DVLE_s* dvle)
        u8 numAttr=0;
        u8 maxAttr=0;
        u8 attrMask=0;
+       u32 attrMode=0;
+       u32 attrClock=0;
 
        for(i=0;i<dvle->outTableSize;i++)
        {
@@ -124,10 +126,43 @@ void DVLE_GenerateOutmap(DVLE_s* dvle)
                }
                *out=((*out)&~mask)|(val&mask);
 
+               switch(dvle->outTableData[i].type)
+               {
+                       case RESULT_POSITION:
+                               if ((*out & 0xFF0000)==0x020000)
+                                       attrClock |= BIT(0);
+                               break;
+                       case RESULT_COLOR:
+                               attrClock |= BIT(1);
+                               break;
+                       case RESULT_TEXCOORD0:
+                               attrMode = 1;
+                               attrClock |= BIT(8);
+                               break;
+                       case RESULT_TEXCOORD1:
+                               attrMode = 1;
+                               attrClock |= BIT(9);
+                               break;
+                       case RESULT_TEXCOORD2:
+                               attrMode = 1;
+                               attrClock |= BIT(10);
+                               break;
+                       case RESULT_TEXCOORD0W:
+                               attrMode = 1;
+                               attrClock |= BIT(16);
+                               break;
+                       case RESULT_NORMALQUAT:
+                       case RESULT_VIEW:
+                               attrClock |= BIT(24);
+                               break;
+               }
+
                attrMask|=1<<dvle->outTableData[i].regID;
                if(dvle->outTableData[i].regID+1>maxAttr)maxAttr=dvle->outTableData[i].regID+1;
        }
 
        dvle->outmapData[0]=numAttr;
        dvle->outmapMask=attrMask;
+       dvle->outmapMode=attrMode;
+       dvle->outmapClock=attrClock;
 }