vg_context.c revision ace4539e88f6ef90d8e9fd2f1543eca0ae854b82
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**************************************************************************
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright 2009 VMware, Inc.  All Rights Reserved.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Permission is hereby granted, free of charge, to any person obtaining a
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * copy of this software and associated documentation files (the
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * "Software"), to deal in the Software without restriction, including
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * without limitation the rights to use, copy, modify, merge, publish,
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * distribute, sub license, and/or sell copies of the Software, and to
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * permit persons to whom the Software is furnished to do so, subject to
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the following conditions:
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The above copyright notice and this permission notice (including the
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * next paragraph) shall be included in all copies or substantial portions
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of the Software.
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) **************************************************************************/
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "vg_context.h"
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "paint.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "renderer.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "shaders_cache.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "shader.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "asm_util.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "st_inlines.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "vg_manager.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "api.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "mask.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "pipe/p_context.h"
406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "util/u_inlines.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "cso_cache/cso_context.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "util/u_simple_shaders.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "util/u_memory.h"
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "util/u_blit.h"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "util/u_sampler.h"
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "util/u_format.h"
496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)struct vg_context *_vg_context = 0;
516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)struct vg_context * vg_current_context(void)
536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles){
546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)   return _vg_context;
556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/**
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * A depth/stencil rb will be needed regardless of what the visual says.
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static boolean
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccichoose_depth_stencil_format(struct vg_context *ctx)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct pipe_screen *screen = ctx->pipe->screen;
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   enum pipe_format formats[] = {
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PIPE_FORMAT_Z24_UNORM_S8_USCALED,
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PIPE_FORMAT_S8_USCALED_Z24_UNORM,
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PIPE_FORMAT_NONE
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   };
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   enum pipe_format *fmt;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   for (fmt = formats; *fmt != PIPE_FORMAT_NONE; fmt++) {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (screen->is_format_supported(screen, *fmt,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               PIPE_TEXTURE_2D, 0, PIPE_BIND_DEPTH_STENCIL, 0))
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         break;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   ctx->ds_format = *fmt;
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   return (ctx->ds_format != PIPE_FORMAT_NONE);
80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void vg_set_current_context(struct vg_context *ctx)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   _vg_context = ctx;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   api_make_dispatch_current((ctx) ? ctx->dispatch : NULL);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct vg_context * vg_create_context(struct pipe_context *pipe,
89010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                      const void *visual,
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      struct vg_context *share)
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
92010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   struct vg_context *ctx;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ctx = CALLOC_STRUCT(vg_context);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ctx->pipe = pipe;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (!choose_depth_stencil_format(ctx)) {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FREE(ctx);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NULL;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   ctx->dispatch = api_create_dispatch();
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   vg_init_state(&ctx->state.vg);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ctx->state.dirty = ALL_DIRTY;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ctx->cso_context = cso_create_context(pipe);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ctx->default_paint = paint_create(ctx);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ctx->state.vg.stroke_paint = ctx->default_paint;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ctx->state.vg.fill_paint = ctx->default_paint;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   ctx->mask.sampler.wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   ctx->mask.sampler.wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   ctx->mask.sampler.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   ctx->mask.sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NONE;
118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   ctx->mask.sampler.min_img_filter = PIPE_TEX_FILTER_NEAREST;
119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   ctx->mask.sampler.mag_img_filter = PIPE_TEX_FILTER_NEAREST;
120010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   ctx->mask.sampler.normalized_coords = 0;
121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ctx->blend_sampler.wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ctx->blend_sampler.wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
1240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)   ctx->blend_sampler.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
1250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)   ctx->blend_sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NONE;
1260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)   ctx->blend_sampler.min_img_filter = PIPE_TEX_FILTER_NEAREST;
1270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)   ctx->blend_sampler.mag_img_filter = PIPE_TEX_FILTER_NEAREST;
1280f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)   ctx->blend_sampler.normalized_coords = 0;
1290f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
130010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   vg_set_error(ctx, VG_NO_ERROR);
1310f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
1320f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)   ctx->owned_objects[VG_OBJECT_PAINT] = cso_hash_create();
133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   ctx->owned_objects[VG_OBJECT_IMAGE] = cso_hash_create();
134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   ctx->owned_objects[VG_OBJECT_MASK] = cso_hash_create();
135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   ctx->owned_objects[VG_OBJECT_FONT] = cso_hash_create();
1360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)   ctx->owned_objects[VG_OBJECT_PATH] = cso_hash_create();
1370f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   ctx->renderer = renderer_create(ctx);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ctx->sc = shaders_cache_create(ctx);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ctx->shader = shader_create(ctx);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ctx->blit = util_create_blit(ctx->pipe, ctx->cso_context);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return ctx;
145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void vg_destroy_context(struct vg_context *ctx)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   struct pipe_resource **cbuf = &ctx->mask.cbuf;
150010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
151010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   util_destroy_blit(ctx->blit);
152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   renderer_destroy(ctx->renderer);
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   shaders_cache_destroy(ctx->sc);
154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   shader_destroy(ctx->shader);
155010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   paint_destroy(ctx->default_paint);
156010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (*cbuf)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pipe_resource_reference(cbuf, NULL);
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (ctx->mask.union_fs)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      vg_shader_destroy(ctx, ctx->mask.union_fs);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (ctx->mask.intersect_fs)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      vg_shader_destroy(ctx, ctx->mask.intersect_fs);
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   if (ctx->mask.subtract_fs)
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      vg_shader_destroy(ctx, ctx->mask.subtract_fs);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (ctx->mask.set_fs)
167010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      vg_shader_destroy(ctx, ctx->mask.set_fs);
168010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   cso_release_all(ctx->cso_context);
170010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   cso_destroy_context(ctx->cso_context);
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   cso_hash_delete(ctx->owned_objects[VG_OBJECT_PAINT]);
1736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)   cso_hash_delete(ctx->owned_objects[VG_OBJECT_IMAGE]);
1746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)   cso_hash_delete(ctx->owned_objects[VG_OBJECT_MASK]);
1756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)   cso_hash_delete(ctx->owned_objects[VG_OBJECT_FONT]);
1766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)   cso_hash_delete(ctx->owned_objects[VG_OBJECT_PATH]);
1776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)   api_destroy_dispatch(ctx->dispatch);
1796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   FREE(ctx);
1816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void vg_init_object(struct vg_object *obj, struct vg_context *ctx, enum vg_object_type type)
1846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles){
1856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)   obj->type = type;
1866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)   obj->ctx = ctx;
1876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)VGboolean vg_context_is_object_valid(struct vg_context *ctx,
1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                enum vg_object_type type,
1916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                void *ptr)
1926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles){
1936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (ctx) {
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       struct cso_hash *hash = ctx->owned_objects[type];
195010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)       if (!hash)
196010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          return VG_FALSE;
197010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)       return cso_hash_contains(hash, (unsigned)(long)ptr);
198010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    }
199010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return VG_FALSE;
200010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
201010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void vg_context_add_object(struct vg_context *ctx,
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           enum vg_object_type type,
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           void *ptr)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (ctx) {
2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       struct cso_hash *hash = ctx->owned_objects[type];
208010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)       if (!hash)
2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          return;
2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       cso_hash_insert(hash, (unsigned)(long)ptr, ptr);
2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void vg_context_remove_object(struct vg_context *ctx,
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              enum vg_object_type type,
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              void *ptr)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (ctx) {
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      struct cso_hash *hash = ctx->owned_objects[type];
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!hash)
221010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         return;
2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      cso_hash_take(hash, (unsigned)(long)ptr);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
224010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static struct pipe_resource *
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)create_texture(struct pipe_context *pipe, enum pipe_format format,
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    VGint width, VGint height)
229010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles){
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct pipe_resource templ;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
232010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   memset(&templ, 0, sizeof(templ));
2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   if (format != PIPE_FORMAT_NONE) {
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      templ.format = format;
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
237010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   else {
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      templ.format = PIPE_FORMAT_B8G8R8A8_UNORM;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   templ.target = PIPE_TEXTURE_2D;
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   templ.width0 = width;
2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   templ.height0 = height;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   templ.depth0 = 1;
2456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)   templ.last_level = 0;
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   if (util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_ZS, 1)) {
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      templ.bind = PIPE_BIND_DEPTH_STENCIL;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } else {
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      templ.bind = (PIPE_BIND_DISPLAY_TARGET |
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    PIPE_BIND_RENDER_TARGET |
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    PIPE_BIND_SAMPLER_VIEW);
253010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   }
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)   return pipe->screen->resource_create(pipe->screen, &templ);
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static struct pipe_sampler_view *
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)create_tex_and_view(struct pipe_context *pipe, enum pipe_format format,
260010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                    VGint width, VGint height)
261010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles){
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   struct pipe_resource *texture;
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct pipe_sampler_view view_templ;
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   struct pipe_sampler_view *view;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   texture = create_texture(pipe, format, width, height);
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (!texture)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NULL;
270010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   u_sampler_view_default_template(&view_templ, texture, texture->format);
272010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   view = pipe->create_sampler_view(pipe, texture, &view_templ);
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* want the texture to go away if the view is freed */
274010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   pipe_resource_reference(&texture, NULL);
275010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return view;
277010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
278010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
279010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)static void
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)vg_context_update_alpha_mask_view(struct vg_context *ctx,
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  uint width, uint height)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
283010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   struct st_framebuffer *stfb = ctx->draw_buffer;
284010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   struct pipe_sampler_view *old_sampler_view = stfb->alpha_mask_view;
285010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   struct pipe_context *pipe = ctx->pipe;
286010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
287010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   if (old_sampler_view &&
288010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)       old_sampler_view->texture->width0 == width &&
289010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)       old_sampler_view->texture->height0 == height)
290010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      return;
291010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
292010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   /*
293010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     we use PIPE_FORMAT_B8G8R8A8_UNORM because we want to render to
294010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     this texture and use it as a sampler, so while this wastes some
295010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     space it makes both of those a lot simpler
296010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   */
297010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   stfb->alpha_mask_view = create_tex_and_view(pipe,
298010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         PIPE_FORMAT_B8G8R8A8_UNORM, width, height);
299010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
300010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   if (!stfb->alpha_mask_view) {
301010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      if (old_sampler_view)
302010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         pipe_sampler_view_reference(&old_sampler_view, NULL);
303010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      return;
304010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   }
305010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
306010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   /* XXX could this call be avoided? */
307010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   vg_validate_state(ctx);
308010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
309010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   /* alpha mask starts with 1.f alpha */
310010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   mask_fill(0, 0, width, height, 1.f);
3111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   /* if we had an old surface copy it over */
3131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   if (old_sampler_view) {
3141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      struct pipe_subresource subsurf, subold_surf;
3151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      subsurf.face = 0;
3161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      subsurf.level = 0;
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      subold_surf.face = 0;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      subold_surf.level = 0;
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pipe->resource_copy_region(pipe,
320010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                 stfb->alpha_mask_view->texture,
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 subsurf,
322010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                 0, 0, 0,
323010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                 old_sampler_view->texture,
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 subold_surf,
325010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                 0, 0, 0,
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 MIN2(old_sampler_view->texture->width0,
327010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                      stfb->alpha_mask_view->texture->width0),
328010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                 MIN2(old_sampler_view->texture->height0,
329010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                      stfb->alpha_mask_view->texture->height0));
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
331010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
332010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   /* Free the old texture
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
334010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   if (old_sampler_view)
335010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      pipe_sampler_view_reference(&old_sampler_view, NULL);
336010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
338010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)static void
339010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)vg_context_update_blend_texture_view(struct vg_context *ctx,
340010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                     uint width, uint height)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
342010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   struct pipe_context *pipe = ctx->pipe;
343010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   struct st_framebuffer *stfb = ctx->draw_buffer;
344010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   struct pipe_sampler_view *old = stfb->blend_texture_view;
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
346010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   if (old &&
347010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)       old->texture->width0 == width &&
348010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)       old->texture->height0 == height)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
350010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
351010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   stfb->blend_texture_view = create_tex_and_view(pipe,
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         PIPE_FORMAT_B8G8R8A8_UNORM, width, height);
353010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
354010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   pipe_sampler_view_reference(&old, NULL);
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
356010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
357010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)static boolean
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)vg_context_update_depth_stencil_rb(struct vg_context * ctx,
359010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                   uint width, uint height)
360010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles){
361010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   struct st_renderbuffer *dsrb = ctx->draw_buffer->dsrb;
362010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   struct pipe_context *pipe = ctx->pipe;
363010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   unsigned surface_usage;
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   if ((dsrb->width == width && dsrb->height == height) && dsrb->texture)
366010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      return FALSE;
367010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* unreference existing ones */
369010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   pipe_surface_reference(&dsrb->surface, NULL);
370010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   pipe_resource_reference(&dsrb->texture, NULL);
371010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   dsrb->width = dsrb->height = 0;
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
373010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   /* Probably need dedicated flags for surface usage too:
374010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    */
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   surface_usage = PIPE_BIND_DEPTH_STENCIL; /* XXX: was: RENDER_TARGET */
376010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
377010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   dsrb->texture = create_texture(pipe, dsrb->format, width, height);
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (!dsrb->texture)
379010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      return TRUE;
380010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   dsrb->surface = pipe->screen->get_tex_surface(pipe->screen,
382010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                 dsrb->texture,
383010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                 0, 0, 0,
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 surface_usage);
385010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   if (!dsrb->surface) {
386010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      pipe_resource_reference(&dsrb->texture, NULL);
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return TRUE;
388010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   }
389010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   dsrb->width = width;
391010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   dsrb->height = height;
392010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   assert(dsrb->surface->width == width);
394010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   assert(dsrb->surface->height == height);
395010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   return TRUE;
397010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
398010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void vg_validate_state(struct vg_context *ctx)
400010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles){
401010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   struct st_framebuffer *stfb = ctx->draw_buffer;
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
403010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   vg_manager_validate_framebuffer(ctx);
404010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (vg_context_update_depth_stencil_rb(ctx, stfb->width, stfb->height))
406010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ctx->state.dirty |= DEPTH_STENCIL_DIRTY;
407010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
408010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   /* TODO create as needed */
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   vg_context_update_alpha_mask_view(ctx, stfb->width, stfb->height);
410010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   vg_context_update_blend_texture_view(ctx, stfb->width, stfb->height);
411010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   renderer_validate(ctx->renderer, ctx->state.dirty,
413010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)         ctx->draw_buffer, &ctx->state.vg);
414010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ctx->state.dirty = NONE_DIRTY;
416010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   shader_set_masking(ctx->shader, ctx->state.vg.masking);
418010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   shader_set_image_mode(ctx->shader, ctx->state.vg.image_mode);
419010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
421010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)VGboolean vg_object_is_valid(void *ptr, enum vg_object_type type)
422010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles){
423010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   struct vg_object *obj = ptr;
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (ptr && is_aligned(obj) && obj->type == type)
425010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      return VG_TRUE;
426010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   else
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return VG_FALSE;
428010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
429010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
430010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void vg_set_error(struct vg_context *ctx,
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  VGErrorCode code)
432010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles){
433010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   /*vgGetError returns the oldest error code provided by
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    * an API call on the current context since the previous
435010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    * call to vgGetError on that context (or since the creation
436010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    of the context).*/
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (ctx->_error == VG_NO_ERROR)
438010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ctx->_error = code;
439010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
441010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void vg_prepare_blend_surface(struct vg_context *ctx)
442010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles){
443010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   struct pipe_surface *dest_surface = NULL;
444010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   struct pipe_context *pipe = ctx->pipe;
445010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   struct pipe_sampler_view *view;
446010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   struct pipe_sampler_view view_templ;
447010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   struct st_framebuffer *stfb = ctx->draw_buffer;
448010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   struct st_renderbuffer *strb = stfb->strb;
449010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
450010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   /* first finish all pending rendering */
451010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   vgFinish();
452010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
453010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   u_sampler_view_default_template(&view_templ, strb->texture, strb->texture->format);
454010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   view = pipe->create_sampler_view(pipe, strb->texture, &view_templ);
455010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   dest_surface = pipe->screen->get_tex_surface(pipe->screen,
457010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                stfb->blend_texture_view->texture,
458010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                                0, 0, 0,
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                PIPE_BIND_RENDER_TARGET);
460010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   util_blit_pixels_tex(ctx->blit,
461010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        view,
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        0, 0,
463010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        strb->width, strb->height,
464010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        dest_surface,
4656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                        0, 0,
4666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                        strb->width, strb->height,
4676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                        0.0, PIPE_TEX_MIPFILTER_NEAREST);
4686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
4696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)   if (dest_surface)
4706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      pipe_surface_reference(&dest_surface, NULL);
4716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
4726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)   /* make sure it's complete */
4736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)   vgFinish();
4741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)   pipe_sampler_view_reference(&view, NULL);
4766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
4776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
4786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
4796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void vg_prepare_blend_surface_from_mask(struct vg_context *ctx)
4806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles){
4816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)   struct pipe_surface *dest_surface = NULL;
4826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)   struct pipe_context *pipe = ctx->pipe;
4836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)   struct st_framebuffer *stfb = ctx->draw_buffer;
4846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)   struct st_renderbuffer *strb = stfb->strb;
4856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
4866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)   vg_validate_state(ctx);
4876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
4886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)   /* first finish all pending rendering */
4896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)   vgFinish();
4906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
4916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)   dest_surface = pipe->screen->get_tex_surface(pipe->screen,
4926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                                stfb->blend_texture_view->texture,
4936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                                0, 0, 0,
4946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                                PIPE_BIND_RENDER_TARGET);
4956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
4966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)   /* flip it, because we want to use it as a sampler */
4976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)   util_blit_pixels_tex(ctx->blit,
4986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                        stfb->alpha_mask_view,
4996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                        0, strb->height,
5006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                        strb->width, 0,
5016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                        dest_surface,
5026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                        0, 0,
5036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                        strb->width, strb->height,
5041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        0.0, PIPE_TEX_MIPFILTER_NEAREST);
5056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
5061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   /* make sure it's complete */
5076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)   vgFinish();
5086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
5091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   if (dest_surface)
5106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      pipe_surface_reference(&dest_surface, NULL);
5111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
5126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)