bool ctrInitGpu() { // Load vertex shader binary uiShader = DVLB_ParseFile((u32*) uishader, uishader_size); if (uiShader == NULL) { return false; } // Create shader shaderProgramInit(&uiProgram); Result res = shaderProgramSetVsh(&uiProgram, &uiShader->DVLE[0]); if (res < 0) { return false; } res = shaderProgramSetGsh(&uiProgram, &uiShader->DVLE[1], 4); if (res < 0) { return false; } C3D_BindProgram(&uiProgram); GSH_FVEC_projectionMtx = shaderInstanceGetUniformLocation(uiProgram.geometryShader, "projectionMtx"); GSH_FVEC_textureMtx = shaderInstanceGetUniformLocation(uiProgram.geometryShader, "textureMtx"); // Allocate buffers ctrVertexBuffer = linearAlloc(VERTEX_BUFFER_SIZE); if (ctrVertexBuffer == NULL) { return false; } C3D_CullFace(GPU_CULL_NONE); C3D_DepthTest(false, GPU_ALWAYS, GPU_WRITE_ALL); C3D_AlphaBlend(GPU_BLEND_ADD, GPU_BLEND_ADD, GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA); C3D_AlphaTest(false, GPU_ALWAYS, 0); C3D_BlendingColor(0); C3D_AttrInfo* attrInfo = C3D_GetAttrInfo(); AttrInfo_Init(attrInfo); AttrInfo_AddLoader(attrInfo, 0, GPU_SHORT, 4); // in_pos AttrInfo_AddLoader(attrInfo, 1, GPU_SHORT, 4); // in_tc0 AttrInfo_AddLoader(attrInfo, 2, GPU_UNSIGNED_BYTE, 4); // in_col AttrInfo_AddLoader(attrInfo, 3, GPU_FLOAT, 2); // in_rot return true; }
static void sceneInit(void) { // Load the shaders and create a shader program // The geoshader stride is set to 6 so that it processes a triangle at a time vshader_dvlb = DVLB_ParseFile((u32*)vshader_shbin, vshader_shbin_size); gshader_dvlb = DVLB_ParseFile((u32*)gshader_shbin, gshader_shbin_size); shaderProgramInit(&program); shaderProgramSetVsh(&program, &vshader_dvlb->DVLE[0]); shaderProgramSetGsh(&program, &gshader_dvlb->DVLE[0], 6); // Get the location of the projection matrix uniform uLoc_projection = shaderInstanceGetUniformLocation(program.geometryShader, "projection"); // Compute the projection matrix m4x4_ortho_tilt(&projection, 0.0, 400.0, 0.0, 240.0, 0.0, 1.0); // Create the VBO (vertex buffer object) vbo_data = linearAlloc(sizeof(vertex_list)); memcpy(vbo_data, vertex_list, sizeof(vertex_list)); }
void glAttachShader(GLuint program, GLuint shader) { DVLB_s *dvlb = (DVLB_s *)ctr_handle_get(CTR_HANDLE_SHADER, shader); shaderProgram_s *shaderprogram = (shaderProgram_s *)ctr_handle_get(CTR_HANDLE_PROGRAM, program); if (dvlb == 0 || shaderprogram == 0) { return; } #ifdef _3DS //printf("dvlb->numDVLE: %d %d\n", dvlb->numDVLE, dvlb->DVLE[0].type); //while (1); for (int i = 0; i < dvlb->numDVLE; i++) { switch (dvlb->DVLE[i].type) { case VERTEX_SHDR: shaderProgramSetVsh(shaderprogram, &dvlb->DVLE[i]); break; case GEOMETRY_SHDR: shaderProgramSetGsh(shaderprogram, &dvlb->DVLE[i], 1); //TODO: fix this break; } } #endif }
static void sceneInit(void) { // Load the shaders and create a shader program // The geoshader stride is set to 6 so that it processes a triangle at a time program_dvlb = DVLB_ParseFile((u32*)program_shbin, program_shbin_size); shaderProgramInit(&program); shaderProgramSetVsh(&program, &program_dvlb->DVLE[0]); shaderProgramSetGsh(&program, &program_dvlb->DVLE[1], 6); C3D_BindProgram(&program); // Get the location of the projection matrix uniform uLoc_projection = shaderInstanceGetUniformLocation(program.geometryShader, "projection"); // Configure attributes for use with the vertex shader C3D_AttrInfo* attrInfo = C3D_GetAttrInfo(); AttrInfo_Init(attrInfo); AttrInfo_AddLoader(attrInfo, 0, GPU_FLOAT, 3); // v0=position AttrInfo_AddLoader(attrInfo, 1, GPU_FLOAT, 4); // v1=color // Compute the projection matrix Mtx_OrthoTilt(&projection, 0.0, 400.0, 0.0, 240.0, 0.0, 1.0); // Create the VBO (vertex buffer object) vbo_data = linearAlloc(sizeof(vertex_list)); memcpy(vbo_data, vertex_list, sizeof(vertex_list)); // Configure buffers C3D_BufInfo* bufInfo = C3D_GetBufInfo(); BufInfo_Init(bufInfo); BufInfo_Add(bufInfo, vbo_data, sizeof(vertex), 2, 0x10); // Configure the first fragment shading substage to just pass through the vertex color // See https://www.opengl.org/sdk/docs/man2/xhtml/glTexEnv.xml for more insight C3D_TexEnv* env = C3D_GetTexEnv(0); C3D_TexEnvSrc(env, C3D_Both, GPU_PRIMARY_COLOR, 0, 0); C3D_TexEnvOp(env, C3D_Both, 0, 0, 0); C3D_TexEnvFunc(env, C3D_Both, GPU_REPLACE); }
void gpuLoadShader(u32 shader, const void* data, u32 size, u8 geometryStride) { if(data == NULL) { return; } ShaderData* shdr = (ShaderData*) shader; if(shdr == NULL) { return; } if(shdr->dvlb != NULL) { shaderProgramFree(&shdr->program); DVLB_Free(shdr->dvlb); } shdr->dvlb = DVLB_ParseFile((u32*) data, size); shaderProgramInit(&shdr->program); if(shdr->dvlb->numDVLE > 0) { shaderProgramSetVsh(&shdr->program, &shdr->dvlb->DVLE[0]); if(shdr->dvlb->numDVLE > 1) { shaderProgramSetGsh(&shdr->program, &shdr->dvlb->DVLE[1], geometryStride); } } }