/* Set up render to texture. */ void gl_renderchain_init(gl_t *gl, unsigned fbo_width, unsigned fbo_height) { int i; unsigned width, height; video_shader_ctx_scale_t scaler; video_shader_ctx_info_t shader_info; struct gfx_fbo_scale scale, scale_last; if (!video_shader_driver_info(&shader_info)) return; if (!gl || shader_info.num == 0) return; video_driver_get_size(&width, &height); scaler.idx = 1; scaler.scale = &scale; video_shader_driver_scale(&scaler); scaler.idx = shader_info.num; scaler.scale = &scale_last; video_shader_driver_scale(&scaler); /* we always want FBO to be at least initialized on startup for consoles */ if (shader_info.num == 1 && !scale.valid) return; if (!gl_check_capability(GL_CAPS_FBO)) { RARCH_ERR("Failed to locate FBO functions. Won't be able to use render-to-texture.\n"); return; } gl->fbo_pass = shader_info.num - 1; if (scale_last.valid) gl->fbo_pass++; if (!scale.valid) { scale.scale_x = 1.0f; scale.scale_y = 1.0f; scale.type_x = scale.type_y = RARCH_SCALE_INPUT; scale.valid = true; } gl->fbo_scale[0] = scale; for (i = 1; i < gl->fbo_pass; i++) { scaler.idx = i + 1; scaler.scale = &gl->fbo_scale[i]; video_shader_driver_scale(&scaler); if (!gl->fbo_scale[i].valid) { gl->fbo_scale[i].scale_x = gl->fbo_scale[i].scale_y = 1.0f; gl->fbo_scale[i].type_x = gl->fbo_scale[i].type_y = RARCH_SCALE_INPUT; gl->fbo_scale[i].valid = true; } } gl_renderchain_recompute_pass_sizes(gl, fbo_width, fbo_height, width, height); for (i = 0; i < gl->fbo_pass; i++) { gl->fbo_rect[i].width = next_pow2(gl->fbo_rect[i].img_width); gl->fbo_rect[i].height = next_pow2(gl->fbo_rect[i].img_height); RARCH_LOG("[GL]: Creating FBO %d @ %ux%u\n", i, gl->fbo_rect[i].width, gl->fbo_rect[i].height); } gl->fbo_feedback_enable = video_shader_driver_get_feedback_pass( &gl->fbo_feedback_pass); if (gl->fbo_feedback_enable && gl->fbo_feedback_pass < (unsigned)gl->fbo_pass) { RARCH_LOG("[GL]: Creating feedback FBO %d @ %ux%u\n", i, gl->fbo_rect[gl->fbo_feedback_pass].width, gl->fbo_rect[gl->fbo_feedback_pass].height); } else if (gl->fbo_feedback_enable) { RARCH_WARN("[GL]: Tried to create feedback FBO of pass #%u, but there are only %d FBO passes. Will use input texture as feedback texture.\n", gl->fbo_feedback_pass, gl->fbo_pass); gl->fbo_feedback_enable = false; } gl_create_fbo_textures(gl); if (!gl_create_fbo_targets(gl)) { glDeleteTextures(gl->fbo_pass, gl->fbo_texture); RARCH_ERR("Failed to create FBO targets. Will continue without FBO.\n"); return; } gl->fbo_inited = true; }
void gl_init_fbo(gl_t *gl, unsigned width, unsigned height) { // No need to use FBOs. if (!g_settings.video.render_to_texture && gl_shader_num() == 0) return; struct gl_fbo_scale scale, scale_last; gl_shader_scale(1, &scale); gl_shader_scale(gl_shader_num(), &scale_last); // No need to use FBOs. if (gl_shader_num() == 1 && !scale.valid && !g_settings.video.render_to_texture) return; if (!load_fbo_proc()) { RARCH_ERR("Failed to locate FBO functions. Won't be able to use render-to-texture.\n"); return; } gl->fbo_pass = gl_shader_num() - 1; if (scale_last.valid) gl->fbo_pass++; if (gl->fbo_pass <= 0) gl->fbo_pass = 1; if (!scale.valid) { scale.scale_x = g_settings.video.fbo_scale_x; scale.scale_y = g_settings.video.fbo_scale_y; scale.type_x = scale.type_y = RARCH_SCALE_INPUT; scale.valid = true; } gl->fbo_scale[0] = scale; for (int i = 1; i < gl->fbo_pass; i++) { gl_shader_scale(i + 1, &gl->fbo_scale[i]); if (!gl->fbo_scale[i].valid) { gl->fbo_scale[i].scale_x = gl->fbo_scale[i].scale_y = 1.0f; gl->fbo_scale[i].type_x = gl->fbo_scale[i].type_y = RARCH_SCALE_INPUT; gl->fbo_scale[i].valid = true; } } gl_compute_fbo_geometry(gl, width, height, gl->win_width, gl->win_height); for (int i = 0; i < gl->fbo_pass; i++) { gl->fbo_rect[i].width = next_pow2(gl->fbo_rect[i].img_width); gl->fbo_rect[i].height = next_pow2(gl->fbo_rect[i].img_height); RARCH_LOG("Creating FBO %d @ %ux%u\n", i, gl->fbo_rect[i].width, gl->fbo_rect[i].height); } gl_create_fbo_textures(gl); if (!gl_create_fbo_targets(gl)) { glDeleteTextures(gl->fbo_pass, gl->fbo_texture); return; } gl->fbo_inited = true; }