void agp_resize_rendertarget( struct agp_rendertarget* tgt, size_t neww, size_t newh) { if (!tgt || !tgt->store){ arcan_warning("attempted resize on broken rendertarget\n"); return; } /* same dimensions, no need to resize */ if (tgt->store->w == neww && tgt->store->h == newh) return; erase_store(tgt->store); erase_store(tgt->store_back); struct agp_fenv* env = agp_env(); agp_empty_vstore(tgt->store, neww, newh); if (tgt->store_back) agp_empty_vstore(tgt->store_back, neww, newh); /* we inplace- modify, want the refcounter intact */ env->delete_framebuffers(1,&tgt->fbo); env->delete_renderbuffers(1,&tgt->depth); tgt->fbo = GL_NONE; tgt->depth = GL_NONE; alloc_fbo(tgt, false); }
void agp_resize_rendertarget( struct agp_rendertarget* tgt, size_t neww, size_t newh) { if (!tgt || !tgt->store){ arcan_warning("attempted resize on broken rendertarget\n"); return; } /* same dimensions, no need to resize */ if (tgt->store->w == neww && tgt->store->h == newh) return; struct storage_info_t* os = tgt->store; /* we inplace- modify, want the refcounter intact */ agp_null_vstore(os); arcan_mem_free(os->vinf.text.raw); os->vinf.text.raw = NULL; os->vinf.text.s_raw = 0; agp_empty_vstore(os, neww, newh); glDeleteFramebuffers(1,&tgt->fbo); glDeleteRenderbuffers(1,&tgt->depth); tgt->fbo = GL_NONE; tgt->depth = GL_NONE; alloc_fbo(tgt, tgt->mode); }
struct agp_rendertarget* agp_setup_rendertarget( struct storage_info_t* vstore, enum rendertarget_mode m) { struct agp_rendertarget* r = arcan_alloc_mem(sizeof(struct agp_rendertarget), ARCAN_MEM_VSTRUCT, ARCAN_MEM_BZERO, ARCAN_MEMALIGN_NATURAL); r->store = vstore; r->mode = m; r->clearcol[3] = 1.0; /* need this tracking because there's no external memory management for _back */ r->front_active = true; if (m & RENDERTARGET_DOUBLEBUFFER){ r->store_back = arcan_alloc_mem(sizeof(struct storage_info_t), ARCAN_MEM_VSTRUCT, ARCAN_MEM_BZERO, ARCAN_MEMALIGN_NATURAL); r->store_back->vinf.text.s_fmt = vstore->vinf.text.s_fmt; r->store_back->vinf.text.d_fmt = vstore->vinf.text.d_fmt; agp_empty_vstore(r->store_back, vstore->w, vstore->h); } alloc_fbo(r, false); return r; }
void agp_empty_vstoreext(struct storage_info_t* vs, size_t w, size_t h, enum vstore_hint hint) { agp_empty_vstore(vs, w, h); }