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)