vg_context.h revision 287c94ea4987033f9c99a2f91c5750c9083504ca
1/************************************************************************** 2 * 3 * Copyright 2009 VMware, Inc. All Rights Reserved. 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining a 6 * copy of this software and associated documentation files (the 7 * "Software"), to deal in the Software without restriction, including 8 * without limitation the rights to use, copy, modify, merge, publish, 9 * distribute, sub license, and/or sell copies of the Software, and to 10 * permit persons to whom the Software is furnished to do so, subject to 11 * the following conditions: 12 * 13 * The above copyright notice and this permission notice (including the 14 * next paragraph) shall be included in all copies or substantial portions 15 * of the Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 20 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 21 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 22 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 23 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24 * 25 **************************************************************************/ 26 27#ifndef VG_CONTEXT_H 28#define VG_CONTEXT_H 29 30#include "vg_state.h" 31 32#include "pipe/p_format.h" 33#include "pipe/p_state.h" 34#include "util/u_pointer.h" 35#include "util/u_math.h" 36#include "state_tracker/st_api.h" 37 38#include "cso_cache/cso_hash.h" 39#include "cso_cache/cso_context.h" 40 41struct renderer; 42struct shaders_cache; 43struct shader; 44struct vg_shader; 45 46struct st_renderbuffer { 47 enum pipe_format format; 48 struct pipe_surface *surface; 49 struct pipe_resource *texture; 50 VGint width, height; 51}; 52 53struct st_framebuffer { 54 VGint width, height; 55 struct st_renderbuffer *strb; 56 struct st_renderbuffer *dsrb; 57 58 struct pipe_sampler_view *alpha_mask_view; 59 60 struct pipe_sampler_view *blend_texture_view; 61 62 63 struct st_framebuffer_iface *iface; 64 enum st_attachment_type strb_att; 65 66 void *privateData; 67}; 68 69enum vg_object_type { 70 VG_OBJECT_UNKNOWN = 0, 71 VG_OBJECT_PAINT, 72 VG_OBJECT_IMAGE, 73 VG_OBJECT_MASK, 74 VG_OBJECT_FONT, 75 VG_OBJECT_PATH, 76 77 VG_OBJECT_LAST 78}; 79enum dirty_state { 80 NONE_DIRTY = 0<<0, 81 BLEND_DIRTY = 1<<1, 82 RASTERIZER_DIRTY = 1<<2, 83 VIEWPORT_DIRTY = 1<<3, 84 VS_DIRTY = 1<<4, 85 DEPTH_STENCIL_DIRTY = 1<<5, 86 ALL_DIRTY = BLEND_DIRTY | RASTERIZER_DIRTY | 87 VIEWPORT_DIRTY | VS_DIRTY | DEPTH_STENCIL_DIRTY 88}; 89 90struct vg_context 91{ 92 struct st_context_iface iface; 93 94 struct pipe_context *pipe; 95 96 struct { 97 struct vg_state vg; 98 struct { 99 struct pipe_blend_state blend; 100 struct pipe_rasterizer_state rasterizer; 101 struct pipe_shader_state vs_state; 102 struct pipe_depth_stencil_alpha_state dsa; 103 struct pipe_framebuffer_state fb; 104 } g3d; 105 VGbitfield dirty; 106 } state; 107 108 VGErrorCode _error; 109 110 struct st_framebuffer *draw_buffer; 111 int32_t draw_buffer_invalid; 112 113 struct cso_hash *owned_objects[VG_OBJECT_LAST]; 114 115 struct { 116 struct pipe_shader_state vert_shader; 117 struct pipe_shader_state frag_shader; 118 struct pipe_rasterizer_state raster; 119 void *fs; 120 float vertices[4][2][4]; /**< vertex pos + color */ 121 } clear; 122 123 struct { 124 struct pipe_resource *cbuf; 125 struct pipe_sampler_state sampler; 126 127 struct vg_shader *union_fs; 128 struct vg_shader *intersect_fs; 129 struct vg_shader *subtract_fs; 130 struct vg_shader *set_fs; 131 } mask; 132 133 struct vg_shader *pass_through_depth_fs; 134 135 struct cso_context *cso_context; 136 137 struct pipe_resource *stencil_quad; 138 VGfloat stencil_vertices[4][2][4]; 139 140 struct renderer *renderer; 141 struct shaders_cache *sc; 142 struct shader *shader; 143 144 struct pipe_sampler_state blend_sampler; 145 struct { 146 struct pipe_resource *buffer; 147 void *color_matrix_fs; 148 } filter; 149 struct vg_paint *default_paint; 150 151 struct blit_state *blit; 152 153 struct vg_shader *plain_vs; 154 struct vg_shader *clear_vs; 155 struct vg_shader *texture_vs; 156 struct pipe_resource *vs_const_buffer; 157 struct pipe_vertex_element velems[2]; 158}; 159 160struct vg_object { 161 enum vg_object_type type; 162 struct vg_context *ctx; 163}; 164void vg_init_object(struct vg_object *obj, struct vg_context *ctx, enum vg_object_type type); 165VGboolean vg_object_is_valid(void *ptr, enum vg_object_type type); 166 167struct vg_context *vg_create_context(struct pipe_context *pipe, 168 const void *visual, 169 struct vg_context *share); 170void vg_destroy_context(struct vg_context *ctx); 171struct vg_context *vg_current_context(void); 172void vg_set_current_context(struct vg_context *ctx); 173 174VGboolean vg_context_is_object_valid(struct vg_context *ctx, 175 enum vg_object_type type, 176 void *ptr); 177void vg_context_add_object(struct vg_context *ctx, 178 enum vg_object_type type, 179 void *ptr); 180void vg_context_remove_object(struct vg_context *ctx, 181 enum vg_object_type type, 182 void *ptr); 183 184void vg_validate_state(struct vg_context *ctx); 185 186void vg_set_error(struct vg_context *ctx, 187 VGErrorCode code); 188 189void vg_prepare_blend_surface(struct vg_context *ctx); 190void vg_prepare_blend_surface_from_mask(struct vg_context *ctx); 191 192 193static INLINE VGboolean is_aligned_to(const void *ptr, VGbyte alignment) 194{ 195 void *aligned = align_pointer(ptr, alignment); 196 return (ptr == aligned) ? VG_TRUE : VG_FALSE; 197} 198 199static INLINE VGboolean is_aligned(const void *ptr) 200{ 201 return is_aligned_to(ptr, 4); 202} 203 204static INLINE void vg_shift_rectx(VGfloat coords[4], 205 const VGfloat *bounds, 206 const VGfloat shift) 207{ 208 coords[0] += shift; 209 coords[2] -= shift; 210 if (bounds) { 211 coords[2] = MIN2(coords[2], bounds[2]); 212 /* bound x/y + width/height */ 213 if ((coords[0] + coords[2]) > (bounds[0] + bounds[2])) { 214 coords[2] = (bounds[0] + bounds[2]) - coords[0]; 215 } 216 } 217} 218 219static INLINE void vg_shift_recty(VGfloat coords[4], 220 const VGfloat *bounds, 221 const VGfloat shift) 222{ 223 coords[1] += shift; 224 coords[3] -= shift; 225 if (bounds) { 226 coords[3] = MIN2(coords[3], bounds[3]); 227 if ((coords[1] + coords[3]) > (bounds[1] + bounds[3])) { 228 coords[3] = (bounds[1] + bounds[3]) - coords[1]; 229 } 230 } 231} 232 233static INLINE void vg_bound_rect(VGfloat coords[4], 234 const VGfloat bounds[4], 235 VGfloat shift[4]) 236{ 237 /* if outside the bounds */ 238 if (coords[0] > (bounds[0] + bounds[2]) || 239 coords[1] > (bounds[1] + bounds[3]) || 240 (coords[0] + coords[2]) < bounds[0] || 241 (coords[1] + coords[3]) < bounds[1]) { 242 coords[0] = 0.f; 243 coords[1] = 0.f; 244 coords[2] = 0.f; 245 coords[3] = 0.f; 246 shift[0] = 0.f; 247 shift[1] = 0.f; 248 return; 249 } 250 251 /* bound x */ 252 if (coords[0] < bounds[0]) { 253 shift[0] = bounds[0] - coords[0]; 254 coords[2] -= shift[0]; 255 coords[0] = bounds[0]; 256 } else 257 shift[0] = 0.f; 258 259 /* bound y */ 260 if (coords[1] < bounds[1]) { 261 shift[1] = bounds[1] - coords[1]; 262 coords[3] -= shift[1]; 263 coords[1] = bounds[1]; 264 } else 265 shift[1] = 0.f; 266 267 shift[2] = bounds[2] - coords[2]; 268 shift[3] = bounds[3] - coords[3]; 269 /* bound width/height */ 270 coords[2] = MIN2(coords[2], bounds[2]); 271 coords[3] = MIN2(coords[3], bounds[3]); 272 273 /* bound x/y + width/height */ 274 if ((coords[0] + coords[2]) > (bounds[0] + bounds[2])) { 275 coords[2] = (bounds[0] + bounds[2]) - coords[0]; 276 } 277 if ((coords[1] + coords[3]) > (bounds[1] + bounds[3])) { 278 coords[3] = (bounds[1] + bounds[3]) - coords[1]; 279 } 280 281 /* if outside the bounds */ 282 if ((coords[0] + coords[2]) < bounds[0] || 283 (coords[1] + coords[3]) < bounds[1]) { 284 coords[0] = 0.f; 285 coords[1] = 0.f; 286 coords[2] = 0.f; 287 coords[3] = 0.f; 288 return; 289 } 290} 291 292void *vg_plain_vs(struct vg_context *ctx); 293void *vg_clear_vs(struct vg_context *ctx); 294void *vg_texture_vs(struct vg_context *ctx); 295typedef enum { 296 VEGA_Y0_TOP, 297 VEGA_Y0_BOTTOM 298} VegaOrientation; 299void vg_set_viewport(struct vg_context *ctx, VegaOrientation orientation); 300 301#endif 302