void vg_destroy_context(struct vg_context *ctx) { struct pipe_resource **cbuf = &ctx->mask.cbuf; renderer_destroy(ctx->renderer); shaders_cache_destroy(ctx->sc); shader_destroy(ctx->shader); paint_destroy(ctx->default_paint); if (*cbuf) pipe_resource_reference(cbuf, NULL); if (ctx->mask.union_fs) vg_shader_destroy(ctx, ctx->mask.union_fs); if (ctx->mask.intersect_fs) vg_shader_destroy(ctx, ctx->mask.intersect_fs); if (ctx->mask.subtract_fs) vg_shader_destroy(ctx, ctx->mask.subtract_fs); if (ctx->mask.set_fs) vg_shader_destroy(ctx, ctx->mask.set_fs); cso_destroy_context(ctx->cso_context); cso_hash_delete(ctx->owned_objects[VG_OBJECT_PAINT]); cso_hash_delete(ctx->owned_objects[VG_OBJECT_IMAGE]); cso_hash_delete(ctx->owned_objects[VG_OBJECT_MASK]); cso_hash_delete(ctx->owned_objects[VG_OBJECT_FONT]); cso_hash_delete(ctx->owned_objects[VG_OBJECT_PATH]); api_destroy_dispatch(ctx->dispatch); FREE(ctx); }
void vg_destroy_context(struct vg_context *ctx) { struct pipe_resource **cbuf = &ctx->mask.cbuf; struct pipe_resource **vsbuf = &ctx->vs_const_buffer; util_destroy_blit(ctx->blit); renderer_destroy(ctx->renderer); shaders_cache_destroy(ctx->sc); shader_destroy(ctx->shader); paint_destroy(ctx->default_paint); if (*cbuf) pipe_resource_reference(cbuf, NULL); if (*vsbuf) pipe_resource_reference(vsbuf, NULL); if (ctx->clear.fs) { cso_delete_fragment_shader(ctx->cso_context, ctx->clear.fs); ctx->clear.fs = NULL; } if (ctx->plain_vs) { vg_shader_destroy(ctx, ctx->plain_vs); ctx->plain_vs = NULL; } if (ctx->clear_vs) { vg_shader_destroy(ctx, ctx->clear_vs); ctx->clear_vs = NULL; } if (ctx->texture_vs) { vg_shader_destroy(ctx, ctx->texture_vs); ctx->texture_vs = NULL; } if (ctx->pass_through_depth_fs) vg_shader_destroy(ctx, ctx->pass_through_depth_fs); if (ctx->mask.union_fs) vg_shader_destroy(ctx, ctx->mask.union_fs); if (ctx->mask.intersect_fs) vg_shader_destroy(ctx, ctx->mask.intersect_fs); if (ctx->mask.subtract_fs) vg_shader_destroy(ctx, ctx->mask.subtract_fs); if (ctx->mask.set_fs) vg_shader_destroy(ctx, ctx->mask.set_fs); cso_release_all(ctx->cso_context); cso_destroy_context(ctx->cso_context); cso_hash_delete(ctx->owned_objects[VG_OBJECT_PAINT]); cso_hash_delete(ctx->owned_objects[VG_OBJECT_IMAGE]); cso_hash_delete(ctx->owned_objects[VG_OBJECT_MASK]); cso_hash_delete(ctx->owned_objects[VG_OBJECT_FONT]); cso_hash_delete(ctx->owned_objects[VG_OBJECT_PATH]); api_destroy_dispatch(ctx->dispatch); FREE(ctx); }
static void execute_filter(struct vg_context *ctx, struct filter_info *info) { struct vg_shader *shader; const struct pipe_sampler_state *samplers[2]; struct pipe_sampler_view *views[2]; struct pipe_sampler_state sampler; uint tex_wrap; memset(&sampler, 0, sizeof(sampler)); sampler.min_img_filter = PIPE_TEX_FILTER_LINEAR; sampler.mag_img_filter = PIPE_TEX_FILTER_LINEAR; sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NONE; sampler.normalized_coords = 1; switch (info->tiling_mode) { case VG_TILE_FILL: tex_wrap = PIPE_TEX_WRAP_CLAMP_TO_BORDER; /* copy border color */ memcpy(sampler.border_color.f, ctx->state.vg.tile_fill_color, sizeof(sampler.border_color)); break; case VG_TILE_PAD: tex_wrap = PIPE_TEX_WRAP_CLAMP_TO_EDGE;; break; case VG_TILE_REPEAT: tex_wrap = PIPE_TEX_WRAP_REPEAT;; break; case VG_TILE_REFLECT: tex_wrap = PIPE_TEX_WRAP_MIRROR_REPEAT; break; default: debug_assert(!"Unknown tiling mode"); tex_wrap = 0; break; } sampler.wrap_s = tex_wrap; sampler.wrap_t = tex_wrap; sampler.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE; samplers[0] = samplers[1] = &sampler; views[0] = info->src->sampler_view; views[1] = info->extra_texture_view; shader = info->setup_shader(ctx, info->user_data); if (renderer_filter_begin(ctx->renderer, info->dst->sampler_view->texture, VG_TRUE, ctx->state.vg.filter_channel_mask, samplers, views, (info->extra_texture_view) ? 2 : 1, shader->driver, info->const_buffer, info->const_buffer_len)) { renderer_filter(ctx->renderer, info->dst->x, info->dst->y, info->dst->width, info->dst->height, info->src->x, info->src->y, info->src->width, info->src->height); renderer_filter_end(ctx->renderer); } vg_shader_destroy(ctx, shader); }