int sf2d_init_advanced(int gpucmd_size, int temppool_size) { if (sf2d_initialized) return 0; gpu_fb_addr = vramMemAlign(400*240*8, 0x100); gpu_depth_fb_addr = vramMemAlign(400*240*8, 0x100); gpu_cmd = linearAlloc(gpucmd_size * 4); pool_addr = linearAlloc(temppool_size); pool_size = temppool_size; gpu_cmd_size = gpucmd_size; //gfxInitDefault(); GPU_Init(NULL); //gfxSet3D(false); GPU_Reset(NULL, gpu_cmd, gpucmd_size); //Setup the shader dvlb = DVLB_ParseFile((u32 *)shader_vsh_shbin, shader_vsh_shbin_size); shaderProgramInit(&shader); shaderProgramSetVsh(&shader, &dvlb->DVLE[0]); //Get shader uniform descriptors projection_desc = shaderInstanceGetUniformLocation(shader.vertexShader, "projection"); shaderProgramUse(&shader); matrix_init_orthographic(ortho_matrix_top, 0.0f, 400.0f, 0.0f, 240.0f, 0.0f, 1.0f); matrix_init_orthographic(ortho_matrix_bot, 0.0f, 320.0f, 0.0f, 240.0f, 0.0f, 1.0f); matrix_gpu_set_uniform(ortho_matrix_top, projection_desc); //Register the apt callback hook //aptHook(&apt_hook_cookie, apt_hook_func, NULL); vblank_wait = 1; current_fps = 0.0f; frames = 0; last_time = osGetTime(); cur_screen = GFX_TOP; cur_side = GFX_LEFT; GPUCMD_Finalize(); GPUCMD_FlushAndRun(); gspWaitForP3D(); sf2d_pool_reset(); sf2d_initialized = 1; return 1; }
sf2d_texture *sf2d_create_texture(int width, int height, GPU_TEXCOLOR pixel_format, sf2d_place place) { int pow2_w = next_pow2(width); int pow2_h = next_pow2(height); int data_size; switch (pixel_format) { case GPU_RGBA8: default: data_size = pow2_w * pow2_h * 4; break; case GPU_RGB8: data_size = pow2_w * pow2_h * 3; break; case GPU_RGBA5551: case GPU_RGB565: data_size = pow2_w * pow2_h * 2; break; } sf2d_texture *texture; if (place == SF2D_PLACE_RAM) { // If there's not enough linear heap space, return if (linearSpaceFree() < data_size) { return NULL; } texture = malloc(sizeof(*texture)); texture->data = linearMemAlign(data_size, 0x80); } else if (place == SF2D_PLACE_VRAM) { // If there's not enough VRAM heap space, return if (vramSpaceFree() < data_size) { return NULL; } texture = malloc(sizeof(*texture)); texture->data = vramMemAlign(data_size, 0x80); } else { //wot? return NULL; } texture->place = place; texture->pixel_format = pixel_format; texture->width = width; texture->height = height; texture->pow2_w = pow2_w; texture->pow2_h = pow2_h; texture->data_size = data_size; return texture; }