diff --git a/libctru/include/3ds/gpu/shaderProgram.h b/libctru/include/3ds/gpu/shaderProgram.h index b6f0315..c69e14e 100644 --- a/libctru/include/3ds/gpu/shaderProgram.h +++ b/libctru/include/3ds/gpu/shaderProgram.h @@ -24,6 +24,7 @@ typedef struct { shaderInstance_s* vertexShader; shaderInstance_s* geometryShader; + u8 geometryShaderInputStride; }shaderProgram_s; Result shaderInstanceInit(shaderInstance_s* si, DVLE_s* dvle); @@ -34,5 +35,5 @@ Result shaderInstanceGetBool(shaderInstance_s* si, int id, bool* value); Result shaderProgramInit(shaderProgram_s* sp); Result shaderProgramFree(shaderProgram_s* sp); Result shaderProgramSetVsh(shaderProgram_s* sp, DVLE_s* dvle); -Result shaderProgramSetGsh(shaderProgram_s* sp, DVLE_s* dvle); +Result shaderProgramSetGsh(shaderProgram_s* sp, DVLE_s* dvle, u8 stride); Result shaderProgramUse(shaderProgram_s* sp); diff --git a/libctru/source/gpu/shaderProgram.c b/libctru/source/gpu/shaderProgram.c index 338c119..cb53476 100644 --- a/libctru/source/gpu/shaderProgram.c +++ b/libctru/source/gpu/shaderProgram.c @@ -87,7 +87,7 @@ Result shaderInstanceSetBool(shaderInstance_s* si, int id, bool value) if(id<0 || id>15)return -2; si->boolUniforms &= ~(1<boolUniforms |= (!value)<boolUniforms |= (value)<vertexShader, dvle); } -Result shaderProgramSetGsh(shaderProgram_s* sp, DVLE_s* dvle) +Result shaderProgramSetGsh(shaderProgram_s* sp, DVLE_s* dvle, u8 stride) { if(!sp || !dvle)return -1; if(dvle->type != GEOMETRY_SHDR)return -2; @@ -148,6 +148,8 @@ Result shaderProgramSetGsh(shaderProgram_s* sp, DVLE_s* dvle) sp->geometryShader = (shaderInstance_s*)malloc(sizeof(shaderInstance_s)); if(!sp->geometryShader)return -3; + sp->geometryShaderInputStride = stride; + return shaderInstanceInit(sp->geometryShader, dvle); } @@ -201,7 +203,7 @@ Result shaderProgramUse(shaderProgram_s* sp) GPU_SetShaderOutmap((u32*)gshDvle->outmapData); //GSH input attributes stuff - GPUCMD_AddWrite(GPUREG_GSH_INPUTBUFFER_CONFIG, 0x08000003); + GPUCMD_AddWrite(GPUREG_GSH_INPUTBUFFER_CONFIG, 0x08000000|(sp->geometryShaderInputStride-1)); GPUCMD_AddIncrementalWrites(GPUREG_GSH_ATTRIBUTES_PERMUTATION_LOW, ((u32[]){0x76543210, 0xFEDCBA98}), 2); GPUCMD_AddMaskedWrite(GPUREG_GEOSTAGE_CONFIG, 0x1, 0x00000002);