1428d7b3dSmrg#ifndef SNA_RENDER_H 2428d7b3dSmrg#define SNA_RENDER_H 3428d7b3dSmrg 4428d7b3dSmrg#include "compiler.h" 5428d7b3dSmrg 6428d7b3dSmrg#include <picturestr.h> 7428d7b3dSmrg 8428d7b3dSmrg#include <stdbool.h> 9428d7b3dSmrg#include <stdint.h> 10428d7b3dSmrg#include <pthread.h> 11428d7b3dSmrg#include "atomic.h" 12428d7b3dSmrg 13428d7b3dSmrg#define GRADIENT_CACHE_SIZE 16 14428d7b3dSmrg 15428d7b3dSmrg#define GXinvalid 0xff 16428d7b3dSmrg 17428d7b3dSmrgstruct sna; 18428d7b3dSmrgstruct sna_glyph; 19428d7b3dSmrgstruct sna_video; 20428d7b3dSmrgstruct sna_video_frame; 21428d7b3dSmrgstruct brw_compile; 22428d7b3dSmrg 23428d7b3dSmrgstruct sna_composite_rectangles { 24428d7b3dSmrg struct sna_coordinate { 25428d7b3dSmrg int16_t x, y; 26428d7b3dSmrg } src, mask, dst; 27428d7b3dSmrg int16_t width, height; 28428d7b3dSmrg}; 29428d7b3dSmrg 30428d7b3dSmrgstruct sna_composite_op { 31428d7b3dSmrg fastcall void (*blt)(struct sna *sna, const struct sna_composite_op *op, 32428d7b3dSmrg const struct sna_composite_rectangles *r); 33428d7b3dSmrg fastcall void (*box)(struct sna *sna, 34428d7b3dSmrg const struct sna_composite_op *op, 35428d7b3dSmrg const BoxRec *box); 36428d7b3dSmrg void (*boxes)(struct sna *sna, const struct sna_composite_op *op, 37428d7b3dSmrg const BoxRec *box, int nbox); 38428d7b3dSmrg void (*thread_boxes)(struct sna *sna, const struct sna_composite_op *op, 39428d7b3dSmrg const BoxRec *box, int nbox); 40428d7b3dSmrg void (*done)(struct sna *sna, const struct sna_composite_op *op); 41428d7b3dSmrg 42428d7b3dSmrg struct sna_damage **damage; 43428d7b3dSmrg 44428d7b3dSmrg uint32_t op; 45428d7b3dSmrg 46428d7b3dSmrg struct { 47428d7b3dSmrg PixmapPtr pixmap; /* XXX */ 48428d7b3dSmrg CARD32 format; 49428d7b3dSmrg struct kgem_bo *bo; 50428d7b3dSmrg int16_t x, y; 51428d7b3dSmrg uint16_t width, height; 52428d7b3dSmrg } dst; 53428d7b3dSmrg 54428d7b3dSmrg struct sna_composite_channel { 55428d7b3dSmrg struct kgem_bo *bo; 56428d7b3dSmrg PictTransform *transform; 57428d7b3dSmrg uint16_t width; 58428d7b3dSmrg uint16_t height; 59428d7b3dSmrg uint32_t pict_format; 60428d7b3dSmrg uint32_t card_format; 61428d7b3dSmrg uint32_t filter; 62428d7b3dSmrg uint32_t repeat; 63428d7b3dSmrg uint32_t is_affine : 1; 64428d7b3dSmrg uint32_t is_solid : 1; 65428d7b3dSmrg uint32_t is_linear : 1; 66428d7b3dSmrg uint32_t is_opaque : 1; 67428d7b3dSmrg uint32_t alpha_fixup : 1; 68428d7b3dSmrg uint32_t rb_reversed : 1; 69428d7b3dSmrg int16_t offset[2]; 70428d7b3dSmrg float scale[2]; 71428d7b3dSmrg 72428d7b3dSmrg pixman_transform_t embedded_transform; 73428d7b3dSmrg 74428d7b3dSmrg union { 75428d7b3dSmrg struct { 76428d7b3dSmrg float dx, dy, offset; 77428d7b3dSmrg } linear; 78428d7b3dSmrg struct { 79428d7b3dSmrg uint32_t pixel; 80428d7b3dSmrg } gen2; 81428d7b3dSmrg struct gen3_shader_channel { 82428d7b3dSmrg int type; 83428d7b3dSmrg uint32_t mode; 84428d7b3dSmrg uint32_t constants; 85428d7b3dSmrg } gen3; 86428d7b3dSmrg } u; 87428d7b3dSmrg } src, mask; 88428d7b3dSmrg uint32_t is_affine : 1; 89428d7b3dSmrg uint32_t has_component_alpha : 1; 90428d7b3dSmrg uint32_t need_magic_ca_pass : 1; 91428d7b3dSmrg uint32_t rb_reversed : 1; 92428d7b3dSmrg 93428d7b3dSmrg int16_t floats_per_vertex; 94428d7b3dSmrg int16_t floats_per_rect; 95428d7b3dSmrg fastcall void (*prim_emit)(struct sna *sna, 96428d7b3dSmrg const struct sna_composite_op *op, 97428d7b3dSmrg const struct sna_composite_rectangles *r); 98428d7b3dSmrg fastcall void (*emit_boxes)(const struct sna_composite_op *op, 99428d7b3dSmrg const BoxRec *box, int nbox, 100428d7b3dSmrg float *v); 101428d7b3dSmrg 102428d7b3dSmrg struct sna_composite_redirect { 103428d7b3dSmrg struct kgem_bo *real_bo; 104428d7b3dSmrg struct sna_damage **real_damage, *damage; 105428d7b3dSmrg BoxRec box; 106428d7b3dSmrg } redirect; 107428d7b3dSmrg 108428d7b3dSmrg union { 109428d7b3dSmrg struct sna_blt_state { 110428d7b3dSmrg PixmapPtr src_pixmap; 111428d7b3dSmrg int16_t sx, sy; 112428d7b3dSmrg 113428d7b3dSmrg uint32_t inplace :1; 114428d7b3dSmrg uint32_t overwrites:1; 115428d7b3dSmrg uint32_t bpp : 6; 116428d7b3dSmrg uint32_t alu : 4; 117428d7b3dSmrg 118428d7b3dSmrg uint32_t cmd; 119428d7b3dSmrg uint32_t br13; 120428d7b3dSmrg uint32_t pitch[2]; 121428d7b3dSmrg uint32_t pixel; 122428d7b3dSmrg struct kgem_bo *bo[2]; 123428d7b3dSmrg } blt; 124428d7b3dSmrg 125428d7b3dSmrg struct { 126428d7b3dSmrg float constants[8]; 127428d7b3dSmrg uint32_t num_constants; 128428d7b3dSmrg } gen3; 129428d7b3dSmrg 130428d7b3dSmrg struct { 131428d7b3dSmrg int wm_kernel; 132428d7b3dSmrg int ve_id; 133428d7b3dSmrg } gen4; 134428d7b3dSmrg 135428d7b3dSmrg struct { 136428d7b3dSmrg int16_t wm_kernel; 137428d7b3dSmrg int16_t ve_id; 138428d7b3dSmrg } gen5; 139428d7b3dSmrg 140428d7b3dSmrg struct { 141428d7b3dSmrg uint32_t flags; 142428d7b3dSmrg } gen6; 143428d7b3dSmrg 144428d7b3dSmrg struct { 145428d7b3dSmrg uint32_t flags; 146428d7b3dSmrg } gen7; 147428d7b3dSmrg 148428d7b3dSmrg struct { 149428d7b3dSmrg uint32_t flags; 150428d7b3dSmrg } gen8; 151428d7b3dSmrg } u; 152428d7b3dSmrg 153428d7b3dSmrg void *priv; 154428d7b3dSmrg}; 155428d7b3dSmrg 156428d7b3dSmrgstruct sna_opacity_box { 157428d7b3dSmrg BoxRec box; 158428d7b3dSmrg float alpha; 159428d7b3dSmrg} tightly_packed; 160428d7b3dSmrg 161428d7b3dSmrgstruct sna_composite_spans_op { 162428d7b3dSmrg struct sna_composite_op base; 163428d7b3dSmrg 164428d7b3dSmrg fastcall void (*box)(struct sna *sna, 165428d7b3dSmrg const struct sna_composite_spans_op *op, 166428d7b3dSmrg const BoxRec *box, 167428d7b3dSmrg float opacity); 168428d7b3dSmrg void (*boxes)(struct sna *sna, 169428d7b3dSmrg const struct sna_composite_spans_op *op, 170428d7b3dSmrg const BoxRec *box, int nbox, 171428d7b3dSmrg float opacity); 172428d7b3dSmrg 173428d7b3dSmrg fastcall void (*thread_boxes)(struct sna *sna, 174428d7b3dSmrg const struct sna_composite_spans_op *op, 175428d7b3dSmrg const struct sna_opacity_box *box, 176428d7b3dSmrg int nbox); 177428d7b3dSmrg 178428d7b3dSmrg fastcall void (*done)(struct sna *sna, 179428d7b3dSmrg const struct sna_composite_spans_op *op); 180428d7b3dSmrg 181428d7b3dSmrg fastcall void (*prim_emit)(struct sna *sna, 182428d7b3dSmrg const struct sna_composite_spans_op *op, 183428d7b3dSmrg const BoxRec *box, 184428d7b3dSmrg float opacity); 185428d7b3dSmrg fastcall void (*emit_boxes)(const struct sna_composite_spans_op *op, 186428d7b3dSmrg const struct sna_opacity_box *box, int nbox, 187428d7b3dSmrg float *v); 188428d7b3dSmrg}; 189428d7b3dSmrg 190428d7b3dSmrgstruct sna_fill_op { 191428d7b3dSmrg struct sna_composite_op base; 192428d7b3dSmrg 193428d7b3dSmrg void (*blt)(struct sna *sna, const struct sna_fill_op *op, 194428d7b3dSmrg int16_t x, int16_t y, int16_t w, int16_t h); 195428d7b3dSmrg fastcall void (*box)(struct sna *sna, 196428d7b3dSmrg const struct sna_fill_op *op, 197428d7b3dSmrg const BoxRec *box); 198428d7b3dSmrg fastcall void (*boxes)(struct sna *sna, 199428d7b3dSmrg const struct sna_fill_op *op, 200428d7b3dSmrg const BoxRec *box, 201428d7b3dSmrg int count); 202428d7b3dSmrg fastcall void (*points)(struct sna *sna, 203428d7b3dSmrg const struct sna_fill_op *op, 204428d7b3dSmrg int16_t dx, int16_t dy, 205428d7b3dSmrg const DDXPointRec *points, 206428d7b3dSmrg int count); 207428d7b3dSmrg void (*done)(struct sna *sna, const struct sna_fill_op *op); 208428d7b3dSmrg}; 209428d7b3dSmrg 210428d7b3dSmrgstruct sna_copy_op { 211428d7b3dSmrg struct sna_composite_op base; 212428d7b3dSmrg 213428d7b3dSmrg void (*blt)(struct sna *sna, const struct sna_copy_op *op, 214428d7b3dSmrg int16_t sx, int16_t sy, 215428d7b3dSmrg int16_t w, int16_t h, 216428d7b3dSmrg int16_t dx, int16_t dy); 217428d7b3dSmrg void (*done)(struct sna *sna, const struct sna_copy_op *op); 218428d7b3dSmrg}; 219428d7b3dSmrg 220428d7b3dSmrgstruct sna_render { 221428d7b3dSmrg pthread_mutex_t lock; 222428d7b3dSmrg pthread_cond_t wait; 223428d7b3dSmrg int active; 224428d7b3dSmrg 225428d7b3dSmrg int max_3d_size; 226428d7b3dSmrg int max_3d_pitch; 227428d7b3dSmrg 228428d7b3dSmrg unsigned prefer_gpu; 229428d7b3dSmrg#define PREFER_GPU_BLT 0x1 230428d7b3dSmrg#define PREFER_GPU_RENDER 0x2 231428d7b3dSmrg#define PREFER_GPU_SPANS 0x4 232428d7b3dSmrg 233428d7b3dSmrg bool (*composite)(struct sna *sna, uint8_t op, 234428d7b3dSmrg PicturePtr dst, PicturePtr src, PicturePtr mask, 235428d7b3dSmrg int16_t src_x, int16_t src_y, 236428d7b3dSmrg int16_t msk_x, int16_t msk_y, 237428d7b3dSmrg int16_t dst_x, int16_t dst_y, 238428d7b3dSmrg int16_t w, int16_t h, 239428d7b3dSmrg unsigned flags, 240428d7b3dSmrg struct sna_composite_op *tmp); 241428d7b3dSmrg#define COMPOSITE_PARTIAL 0x1 242428d7b3dSmrg#define COMPOSITE_FALLBACK 0x80000000 243428d7b3dSmrg 244428d7b3dSmrg bool (*check_composite_spans)(struct sna *sna, uint8_t op, 245428d7b3dSmrg PicturePtr dst, PicturePtr src, 246428d7b3dSmrg int16_t w, int16_t h, unsigned flags); 247428d7b3dSmrg bool (*composite_spans)(struct sna *sna, uint8_t op, 248428d7b3dSmrg PicturePtr dst, PicturePtr src, 249428d7b3dSmrg int16_t src_x, int16_t src_y, 250428d7b3dSmrg int16_t dst_x, int16_t dst_y, 251428d7b3dSmrg int16_t w, int16_t h, 252428d7b3dSmrg unsigned flags, 253428d7b3dSmrg struct sna_composite_spans_op *tmp); 254428d7b3dSmrg#define COMPOSITE_SPANS_RECTILINEAR 0x1 255428d7b3dSmrg#define COMPOSITE_SPANS_INPLACE_HINT 0x2 256428d7b3dSmrg 257428d7b3dSmrg bool (*video)(struct sna *sna, 258428d7b3dSmrg struct sna_video *video, 259428d7b3dSmrg struct sna_video_frame *frame, 260428d7b3dSmrg RegionPtr dstRegion, 261428d7b3dSmrg PixmapPtr pixmap); 262428d7b3dSmrg 263428d7b3dSmrg bool (*fill_boxes)(struct sna *sna, 264428d7b3dSmrg CARD8 op, 265428d7b3dSmrg PictFormat format, 266428d7b3dSmrg const xRenderColor *color, 267428d7b3dSmrg const DrawableRec *dst, struct kgem_bo *dst_bo, 268428d7b3dSmrg const BoxRec *box, int n); 269428d7b3dSmrg bool (*fill)(struct sna *sna, uint8_t alu, 270428d7b3dSmrg PixmapPtr dst, struct kgem_bo *dst_bo, 271428d7b3dSmrg uint32_t color, unsigned flags, 272428d7b3dSmrg struct sna_fill_op *tmp); 273428d7b3dSmrg#define FILL_BOXES 0x1 274428d7b3dSmrg#define FILL_POINTS 0x2 275428d7b3dSmrg#define FILL_SPANS 0x4 276428d7b3dSmrg bool (*fill_one)(struct sna *sna, PixmapPtr dst, struct kgem_bo *dst_bo, 277428d7b3dSmrg uint32_t color, 278428d7b3dSmrg int16_t x1, int16_t y1, int16_t x2, int16_t y2, 279428d7b3dSmrg uint8_t alu); 280428d7b3dSmrg bool (*clear)(struct sna *sna, PixmapPtr dst, struct kgem_bo *dst_bo); 281428d7b3dSmrg 282428d7b3dSmrg bool (*copy_boxes)(struct sna *sna, uint8_t alu, 283428d7b3dSmrg const DrawableRec *src, struct kgem_bo *src_bo, int16_t src_dx, int16_t src_dy, 284428d7b3dSmrg const DrawableRec *dst, struct kgem_bo *dst_bo, int16_t dst_dx, int16_t dst_dy, 285428d7b3dSmrg const BoxRec *box, int n, unsigned flags); 286428d7b3dSmrg#define COPY_LAST 0x1 287428d7b3dSmrg#define COPY_SYNC 0x2 288428d7b3dSmrg#define COPY_NO_OVERLAP 0x4 289428d7b3dSmrg 290428d7b3dSmrg bool (*copy)(struct sna *sna, uint8_t alu, 291428d7b3dSmrg PixmapPtr src, struct kgem_bo *src_bo, 292428d7b3dSmrg PixmapPtr dst, struct kgem_bo *dst_bo, 293428d7b3dSmrg struct sna_copy_op *op); 294428d7b3dSmrg 295428d7b3dSmrg void (*flush)(struct sna *sna); 296428d7b3dSmrg void (*reset)(struct sna *sna); 297428d7b3dSmrg void (*fini)(struct sna *sna); 298428d7b3dSmrg 299428d7b3dSmrg struct sna_alpha_cache { 300428d7b3dSmrg struct kgem_bo *cache_bo; 301428d7b3dSmrg struct kgem_bo *bo[256+7]; 302428d7b3dSmrg } alpha_cache; 303428d7b3dSmrg 304428d7b3dSmrg struct sna_solid_cache { 305428d7b3dSmrg struct kgem_bo *cache_bo; 306428d7b3dSmrg struct kgem_bo *bo[1024]; 307428d7b3dSmrg uint32_t color[1024]; 308428d7b3dSmrg int last; 309428d7b3dSmrg int size; 310428d7b3dSmrg int dirty; 311428d7b3dSmrg } solid_cache; 312428d7b3dSmrg 313428d7b3dSmrg struct { 314428d7b3dSmrg struct sna_gradient_cache { 315428d7b3dSmrg struct kgem_bo *bo; 316428d7b3dSmrg int nstops; 317428d7b3dSmrg PictGradientStop *stops; 318428d7b3dSmrg } cache[GRADIENT_CACHE_SIZE]; 319428d7b3dSmrg int size; 320428d7b3dSmrg } gradient_cache; 321428d7b3dSmrg 322428d7b3dSmrg struct sna_glyph_cache{ 323428d7b3dSmrg PicturePtr picture; 324428d7b3dSmrg struct sna_glyph **glyphs; 325428d7b3dSmrg uint16_t count; 326428d7b3dSmrg uint16_t evict; 327428d7b3dSmrg } glyph[2]; 328428d7b3dSmrg pixman_image_t *white_image; 329428d7b3dSmrg PicturePtr white_picture; 330428d7b3dSmrg 331428d7b3dSmrg uint16_t vb_id; 332428d7b3dSmrg uint16_t vertex_offset; 333428d7b3dSmrg uint16_t vertex_start; 334428d7b3dSmrg uint16_t vertex_index; 335428d7b3dSmrg uint16_t vertex_used; 336428d7b3dSmrg uint16_t vertex_size; 337428d7b3dSmrg uint16_t vertex_reloc[16]; 338428d7b3dSmrg int nvertex_reloc; 339428d7b3dSmrg 340428d7b3dSmrg struct kgem_bo *vbo; 341428d7b3dSmrg float *vertices; 342428d7b3dSmrg 343428d7b3dSmrg float vertex_data[1024]; 344428d7b3dSmrg}; 345428d7b3dSmrg 346428d7b3dSmrgstruct gen2_render_state { 347428d7b3dSmrg uint32_t target; 348428d7b3dSmrg bool need_invariant; 349428d7b3dSmrg uint32_t logic_op_enabled; 350428d7b3dSmrg uint32_t ls1, ls2, vft; 351428d7b3dSmrg uint32_t diffuse; 352428d7b3dSmrg uint32_t specular; 353428d7b3dSmrg}; 354428d7b3dSmrg 355428d7b3dSmrgstruct gen3_render_state { 356428d7b3dSmrg uint32_t current_dst; 357428d7b3dSmrg bool need_invariant; 358428d7b3dSmrg uint32_t tex_count; 359428d7b3dSmrg uint32_t last_drawrect_limit; 360428d7b3dSmrg uint32_t last_target; 361428d7b3dSmrg uint32_t last_blend; 362428d7b3dSmrg uint32_t last_constants; 363428d7b3dSmrg uint32_t last_sampler; 364428d7b3dSmrg uint32_t last_shader; 365428d7b3dSmrg uint32_t last_diffuse; 366428d7b3dSmrg uint32_t last_specular; 367428d7b3dSmrg 368428d7b3dSmrg uint16_t last_vertex_offset; 369428d7b3dSmrg uint16_t floats_per_vertex; 370428d7b3dSmrg uint16_t last_floats_per_vertex; 371428d7b3dSmrg 372428d7b3dSmrg uint32_t tex_map[4]; 373428d7b3dSmrg uint32_t tex_handle[2]; 374428d7b3dSmrg uint32_t tex_delta[2]; 375428d7b3dSmrg}; 376428d7b3dSmrg 377428d7b3dSmrgstruct gen4_render_state { 378428d7b3dSmrg struct kgem_bo *general_bo; 379428d7b3dSmrg 380428d7b3dSmrg uint32_t vs; 381428d7b3dSmrg uint32_t sf; 382428d7b3dSmrg uint32_t wm; 383428d7b3dSmrg uint32_t cc; 384428d7b3dSmrg 385428d7b3dSmrg int ve_id; 386428d7b3dSmrg uint32_t drawrect_offset; 387428d7b3dSmrg uint32_t drawrect_limit; 388428d7b3dSmrg uint32_t last_pipelined_pointers; 389428d7b3dSmrg uint16_t last_primitive; 390428d7b3dSmrg int16_t floats_per_vertex; 391428d7b3dSmrg uint16_t surface_table; 392428d7b3dSmrg 393428d7b3dSmrg bool needs_invariant; 394428d7b3dSmrg bool needs_urb; 395428d7b3dSmrg}; 396428d7b3dSmrg 397428d7b3dSmrgstruct gen5_render_state { 398428d7b3dSmrg struct kgem_bo *general_bo; 399428d7b3dSmrg 400428d7b3dSmrg uint32_t vs; 401428d7b3dSmrg uint32_t sf[2]; 402428d7b3dSmrg uint32_t wm; 403428d7b3dSmrg uint32_t cc; 404428d7b3dSmrg 405428d7b3dSmrg int ve_id; 406428d7b3dSmrg uint32_t drawrect_offset; 407428d7b3dSmrg uint32_t drawrect_limit; 408428d7b3dSmrg uint32_t last_pipelined_pointers; 409428d7b3dSmrg uint16_t last_primitive; 410428d7b3dSmrg int16_t floats_per_vertex; 411428d7b3dSmrg uint16_t surface_table; 412428d7b3dSmrg 413428d7b3dSmrg bool needs_invariant; 414428d7b3dSmrg}; 415428d7b3dSmrg 416428d7b3dSmrgenum { 417428d7b3dSmrg GEN6_WM_KERNEL_NOMASK = 0, 418428d7b3dSmrg GEN6_WM_KERNEL_NOMASK_P, 419428d7b3dSmrg 420428d7b3dSmrg GEN6_WM_KERNEL_MASK, 421428d7b3dSmrg GEN6_WM_KERNEL_MASK_P, 422428d7b3dSmrg 423428d7b3dSmrg GEN6_WM_KERNEL_MASKCA, 424428d7b3dSmrg GEN6_WM_KERNEL_MASKCA_P, 425428d7b3dSmrg 426428d7b3dSmrg GEN6_WM_KERNEL_MASKSA, 427428d7b3dSmrg GEN6_WM_KERNEL_MASKSA_P, 428428d7b3dSmrg 429428d7b3dSmrg GEN6_WM_KERNEL_OPACITY, 430428d7b3dSmrg GEN6_WM_KERNEL_OPACITY_P, 431428d7b3dSmrg 432428d7b3dSmrg GEN6_WM_KERNEL_VIDEO_PLANAR, 433428d7b3dSmrg GEN6_WM_KERNEL_VIDEO_PACKED, 434428d7b3dSmrg GEN6_KERNEL_COUNT 435428d7b3dSmrg}; 436428d7b3dSmrg 437428d7b3dSmrgstruct gen6_render_state { 438428d7b3dSmrg unsigned gt; 439428d7b3dSmrg const struct gt_info *info; 440428d7b3dSmrg struct kgem_bo *general_bo; 441428d7b3dSmrg 442428d7b3dSmrg uint32_t vs_state; 443428d7b3dSmrg uint32_t sf_state; 444428d7b3dSmrg uint32_t sf_mask_state; 445428d7b3dSmrg uint32_t wm_state; 446428d7b3dSmrg uint32_t wm_kernel[GEN6_KERNEL_COUNT][3]; 447428d7b3dSmrg 448428d7b3dSmrg uint32_t cc_blend; 449428d7b3dSmrg 450428d7b3dSmrg uint32_t drawrect_offset; 451428d7b3dSmrg uint32_t drawrect_limit; 452428d7b3dSmrg uint32_t blend; 453428d7b3dSmrg uint32_t samplers; 454428d7b3dSmrg uint32_t kernel; 455428d7b3dSmrg 456428d7b3dSmrg uint16_t num_sf_outputs; 457428d7b3dSmrg uint16_t ve_id; 458428d7b3dSmrg uint16_t last_primitive; 459428d7b3dSmrg int16_t floats_per_vertex; 460428d7b3dSmrg uint16_t surface_table; 461428d7b3dSmrg 462428d7b3dSmrg bool needs_invariant; 463428d7b3dSmrg bool first_state_packet; 464428d7b3dSmrg}; 465428d7b3dSmrg 466428d7b3dSmrgenum { 467428d7b3dSmrg GEN7_WM_KERNEL_NOMASK = 0, 468428d7b3dSmrg GEN7_WM_KERNEL_NOMASK_P, 469428d7b3dSmrg 470428d7b3dSmrg GEN7_WM_KERNEL_MASK, 471428d7b3dSmrg GEN7_WM_KERNEL_MASK_P, 472428d7b3dSmrg 473428d7b3dSmrg GEN7_WM_KERNEL_MASKCA, 474428d7b3dSmrg GEN7_WM_KERNEL_MASKCA_P, 475428d7b3dSmrg 476428d7b3dSmrg GEN7_WM_KERNEL_MASKSA, 477428d7b3dSmrg GEN7_WM_KERNEL_MASKSA_P, 478428d7b3dSmrg 479428d7b3dSmrg GEN7_WM_KERNEL_OPACITY, 480428d7b3dSmrg GEN7_WM_KERNEL_OPACITY_P, 481428d7b3dSmrg 482428d7b3dSmrg GEN7_WM_KERNEL_VIDEO_PLANAR, 483428d7b3dSmrg GEN7_WM_KERNEL_VIDEO_PACKED, 484428d7b3dSmrg GEN7_WM_KERNEL_COUNT 485428d7b3dSmrg}; 486428d7b3dSmrg 487428d7b3dSmrgstruct gen7_render_state { 488428d7b3dSmrg unsigned gt; 489428d7b3dSmrg const struct gt_info *info; 490428d7b3dSmrg struct kgem_bo *general_bo; 491428d7b3dSmrg 492428d7b3dSmrg uint32_t vs_state; 493428d7b3dSmrg uint32_t sf_state; 494428d7b3dSmrg uint32_t sf_mask_state; 495428d7b3dSmrg uint32_t wm_state; 496428d7b3dSmrg uint32_t wm_kernel[GEN7_WM_KERNEL_COUNT][3]; 497428d7b3dSmrg 498428d7b3dSmrg uint32_t cc_blend; 499428d7b3dSmrg 500428d7b3dSmrg uint32_t drawrect_offset; 501428d7b3dSmrg uint32_t drawrect_limit; 502428d7b3dSmrg uint32_t blend; 503428d7b3dSmrg uint32_t samplers; 504428d7b3dSmrg uint32_t kernel; 505428d7b3dSmrg 506428d7b3dSmrg uint16_t num_sf_outputs; 507428d7b3dSmrg uint16_t ve_id; 508428d7b3dSmrg uint16_t last_primitive; 509428d7b3dSmrg int16_t floats_per_vertex; 510428d7b3dSmrg uint16_t surface_table; 511428d7b3dSmrg uint16_t pipe_controls_since_stall; 512428d7b3dSmrg 513428d7b3dSmrg bool needs_invariant; 514428d7b3dSmrg bool emit_flush; 515428d7b3dSmrg}; 516428d7b3dSmrg 517428d7b3dSmrg 518428d7b3dSmrgenum { 519428d7b3dSmrg GEN8_WM_KERNEL_NOMASK = 0, 520428d7b3dSmrg GEN8_WM_KERNEL_NOMASK_P, 521428d7b3dSmrg 522428d7b3dSmrg GEN8_WM_KERNEL_MASK, 523428d7b3dSmrg GEN8_WM_KERNEL_MASK_P, 524428d7b3dSmrg 525428d7b3dSmrg GEN8_WM_KERNEL_MASKCA, 526428d7b3dSmrg GEN8_WM_KERNEL_MASKCA_P, 527428d7b3dSmrg 528428d7b3dSmrg GEN8_WM_KERNEL_MASKSA, 529428d7b3dSmrg GEN8_WM_KERNEL_MASKSA_P, 530428d7b3dSmrg 531428d7b3dSmrg GEN8_WM_KERNEL_OPACITY, 532428d7b3dSmrg GEN8_WM_KERNEL_OPACITY_P, 533428d7b3dSmrg 534428d7b3dSmrg GEN8_WM_KERNEL_VIDEO_PLANAR, 535428d7b3dSmrg GEN8_WM_KERNEL_VIDEO_PACKED, 536428d7b3dSmrg GEN8_WM_KERNEL_COUNT 537428d7b3dSmrg}; 538428d7b3dSmrg 539428d7b3dSmrgstruct gen8_render_state { 540428d7b3dSmrg unsigned gt; 541428d7b3dSmrg 542428d7b3dSmrg struct kgem_bo *general_bo; 543428d7b3dSmrg 544428d7b3dSmrg uint32_t vs_state; 545428d7b3dSmrg uint32_t sf_state; 546428d7b3dSmrg uint32_t sf_mask_state; 547428d7b3dSmrg uint32_t wm_state; 548428d7b3dSmrg uint32_t wm_kernel[GEN8_WM_KERNEL_COUNT][3]; 549428d7b3dSmrg 550428d7b3dSmrg uint32_t cc_blend; 551428d7b3dSmrg 552428d7b3dSmrg uint32_t drawrect_offset; 553428d7b3dSmrg uint32_t drawrect_limit; 554428d7b3dSmrg uint32_t blend; 555428d7b3dSmrg uint32_t samplers; 556428d7b3dSmrg uint32_t kernel; 557428d7b3dSmrg 558428d7b3dSmrg uint16_t num_sf_outputs; 559428d7b3dSmrg uint16_t ve_id; 560428d7b3dSmrg uint16_t last_primitive; 561428d7b3dSmrg int16_t floats_per_vertex; 562428d7b3dSmrg uint16_t surface_table; 563428d7b3dSmrg 564428d7b3dSmrg bool needs_invariant; 565428d7b3dSmrg bool emit_flush; 566428d7b3dSmrg}; 567428d7b3dSmrg 568428d7b3dSmrgstruct sna_static_stream { 569428d7b3dSmrg uint32_t size, used; 570428d7b3dSmrg uint8_t *data; 571428d7b3dSmrg}; 572428d7b3dSmrg 573428d7b3dSmrgint sna_static_stream_init(struct sna_static_stream *stream); 574428d7b3dSmrguint32_t sna_static_stream_add(struct sna_static_stream *stream, 575428d7b3dSmrg const void *data, uint32_t len, uint32_t align); 576428d7b3dSmrgvoid *sna_static_stream_map(struct sna_static_stream *stream, 577428d7b3dSmrg uint32_t len, uint32_t align); 578428d7b3dSmrguint32_t sna_static_stream_offsetof(struct sna_static_stream *stream, 579428d7b3dSmrg void *ptr); 580428d7b3dSmrgunsigned sna_static_stream_compile_sf(struct sna *sna, 581428d7b3dSmrg struct sna_static_stream *stream, 582428d7b3dSmrg bool (*compile)(struct brw_compile *)); 583428d7b3dSmrg 584428d7b3dSmrgunsigned sna_static_stream_compile_wm(struct sna *sna, 585428d7b3dSmrg struct sna_static_stream *stream, 586428d7b3dSmrg bool (*compile)(struct brw_compile *, int), 587428d7b3dSmrg int width); 588428d7b3dSmrgstruct kgem_bo *sna_static_stream_fini(struct sna *sna, 589428d7b3dSmrg struct sna_static_stream *stream); 590428d7b3dSmrg 591428d7b3dSmrgstruct kgem_bo * 592428d7b3dSmrgsna_render_get_solid(struct sna *sna, 593428d7b3dSmrg uint32_t color); 594428d7b3dSmrg 595428d7b3dSmrgvoid 596428d7b3dSmrgsna_render_flush_solid(struct sna *sna); 597428d7b3dSmrg 598428d7b3dSmrgstruct kgem_bo * 599428d7b3dSmrgsna_render_get_gradient(struct sna *sna, 600428d7b3dSmrg PictGradient *pattern); 601428d7b3dSmrg 602428d7b3dSmrgbool 603428d7b3dSmrgsna_gradient_is_opaque(const PictGradient *gradient); 604428d7b3dSmrg 605428d7b3dSmrguint32_t sna_rgba_for_color(uint32_t color, int depth); 606428d7b3dSmrguint32_t sna_rgba_to_color(uint32_t rgba, uint32_t format); 607428d7b3dSmrgbool sna_get_rgba_from_pixel(uint32_t pixel, 608428d7b3dSmrg uint16_t *red, 609428d7b3dSmrg uint16_t *green, 610428d7b3dSmrg uint16_t *blue, 611428d7b3dSmrg uint16_t *alpha, 612428d7b3dSmrg uint32_t format); 613428d7b3dSmrgbool sna_picture_is_solid(PicturePtr picture, uint32_t *color); 614428d7b3dSmrg 615428d7b3dSmrgconst char *no_render_init(struct sna *sna); 616428d7b3dSmrgconst char *gen2_render_init(struct sna *sna, const char *backend); 617428d7b3dSmrgconst char *gen3_render_init(struct sna *sna, const char *backend); 618428d7b3dSmrgconst char *gen4_render_init(struct sna *sna, const char *backend); 619428d7b3dSmrgconst char *gen5_render_init(struct sna *sna, const char *backend); 620428d7b3dSmrgconst char *gen6_render_init(struct sna *sna, const char *backend); 621428d7b3dSmrgconst char *gen7_render_init(struct sna *sna, const char *backend); 622428d7b3dSmrgconst char *gen8_render_init(struct sna *sna, const char *backend); 623428d7b3dSmrg 624428d7b3dSmrgvoid sna_render_mark_wedged(struct sna *sna); 625428d7b3dSmrg 626428d7b3dSmrgbool sna_tiling_composite(uint32_t op, 627428d7b3dSmrg PicturePtr src, 628428d7b3dSmrg PicturePtr mask, 629428d7b3dSmrg PicturePtr dst, 630428d7b3dSmrg int16_t src_x, int16_t src_y, 631428d7b3dSmrg int16_t mask_x, int16_t mask_y, 632428d7b3dSmrg int16_t dst_x, int16_t dst_y, 633428d7b3dSmrg int16_t width, int16_t height, 634428d7b3dSmrg struct sna_composite_op *tmp); 635428d7b3dSmrgbool sna_tiling_composite_spans(uint32_t op, 636428d7b3dSmrg PicturePtr src, 637428d7b3dSmrg PicturePtr dst, 638428d7b3dSmrg int16_t src_x, int16_t src_y, 639428d7b3dSmrg int16_t dst_x, int16_t dst_y, 640428d7b3dSmrg int16_t width, int16_t height, 641428d7b3dSmrg unsigned flags, 642428d7b3dSmrg struct sna_composite_spans_op *tmp); 643428d7b3dSmrgbool sna_tiling_fill_boxes(struct sna *sna, 644428d7b3dSmrg CARD8 op, 645428d7b3dSmrg PictFormat format, 646428d7b3dSmrg const xRenderColor *color, 647428d7b3dSmrg const DrawableRec *dst, struct kgem_bo *dst_bo, 648428d7b3dSmrg const BoxRec *box, int n); 649428d7b3dSmrg 650428d7b3dSmrgbool sna_tiling_copy_boxes(struct sna *sna, uint8_t alu, 651428d7b3dSmrg const DrawableRec *src, struct kgem_bo *src_bo, int16_t src_dx, int16_t src_dy, 652428d7b3dSmrg const DrawableRec *dst, struct kgem_bo *dst_bo, int16_t dst_dx, int16_t dst_dy, 653428d7b3dSmrg const BoxRec *box, int n); 654428d7b3dSmrg 655428d7b3dSmrgbool sna_tiling_blt_copy_boxes(struct sna *sna, uint8_t alu, 656428d7b3dSmrg struct kgem_bo *src_bo, int16_t src_dx, int16_t src_dy, 657428d7b3dSmrg struct kgem_bo *dst_bo, int16_t dst_dx, int16_t dst_dy, 658428d7b3dSmrg int bpp, const BoxRec *box, int nbox); 659428d7b3dSmrg 660428d7b3dSmrgbool sna_tiling_blt_composite(struct sna *sna, 661428d7b3dSmrg struct sna_composite_op *op, 662428d7b3dSmrg struct kgem_bo *bo, 663428d7b3dSmrg int bpp, 664428d7b3dSmrg uint32_t alpha_fixup); 665428d7b3dSmrg 666428d7b3dSmrgbool sna_blt_composite(struct sna *sna, 667428d7b3dSmrg uint32_t op, 668428d7b3dSmrg PicturePtr src, 669428d7b3dSmrg PicturePtr dst, 670428d7b3dSmrg int16_t src_x, int16_t src_y, 671428d7b3dSmrg int16_t dst_x, int16_t dst_y, 672428d7b3dSmrg int16_t width, int16_t height, 673428d7b3dSmrg unsigned flags, 674428d7b3dSmrg struct sna_composite_op *tmp); 675428d7b3dSmrgbool sna_blt_composite__convert(struct sna *sna, 676428d7b3dSmrg int x, int y, 677428d7b3dSmrg int width, int height, 678428d7b3dSmrg struct sna_composite_op *tmp); 679428d7b3dSmrg 680428d7b3dSmrgbool sna_blt_fill(struct sna *sna, uint8_t alu, 681428d7b3dSmrg struct kgem_bo *bo, 682428d7b3dSmrg int bpp, 683428d7b3dSmrg uint32_t pixel, 684428d7b3dSmrg struct sna_fill_op *fill); 685428d7b3dSmrg 686428d7b3dSmrgbool sna_blt_copy(struct sna *sna, uint8_t alu, 687428d7b3dSmrg struct kgem_bo *src, 688428d7b3dSmrg struct kgem_bo *dst, 689428d7b3dSmrg int bpp, 690428d7b3dSmrg struct sna_copy_op *copy); 691428d7b3dSmrg 692428d7b3dSmrgbool sna_blt_fill_boxes(struct sna *sna, uint8_t alu, 693428d7b3dSmrg struct kgem_bo *bo, 694428d7b3dSmrg int bpp, 695428d7b3dSmrg uint32_t pixel, 696428d7b3dSmrg const BoxRec *box, int n); 697428d7b3dSmrg 698428d7b3dSmrgbool sna_blt_copy_boxes(struct sna *sna, uint8_t alu, 699428d7b3dSmrg struct kgem_bo *src_bo, int16_t src_dx, int16_t src_dy, 700428d7b3dSmrg struct kgem_bo *dst_bo, int16_t dst_dx, int16_t dst_dy, 701428d7b3dSmrg int bpp, 702428d7b3dSmrg const BoxRec *box, int n); 703428d7b3dSmrgbool sna_blt_copy_boxes__with_alpha(struct sna *sna, uint8_t alu, 704428d7b3dSmrg struct kgem_bo *src_bo, int16_t src_dx, int16_t src_dy, 705428d7b3dSmrg struct kgem_bo *dst_bo, int16_t dst_dx, int16_t dst_dy, 706428d7b3dSmrg int bpp, int alpha_fixup, 707428d7b3dSmrg const BoxRec *box, int nbox); 708428d7b3dSmrgbool sna_blt_copy_boxes_fallback(struct sna *sna, uint8_t alu, 709428d7b3dSmrg const DrawableRec *src, struct kgem_bo *src_bo, int16_t src_dx, int16_t src_dy, 710428d7b3dSmrg const DrawableRec *dst, struct kgem_bo *dst_bo, int16_t dst_dx, int16_t dst_dy, 711428d7b3dSmrg const BoxRec *box, int nbox); 712428d7b3dSmrg 713428d7b3dSmrgbool memcpy_copy_boxes(struct sna *sna, uint8_t op, 714428d7b3dSmrg const DrawableRec *src_draw, struct kgem_bo *src_bo, int16_t sx, int16_t sy, 715428d7b3dSmrg const DrawableRec *dst_draw, struct kgem_bo *dst_bo, int16_t dx, int16_t dy, 716428d7b3dSmrg const BoxRec *box, int n, unsigned flags); 717428d7b3dSmrg 718428d7b3dSmrgbool _sna_get_pixel_from_rgba(uint32_t *pixel, 719428d7b3dSmrg uint16_t red, 720428d7b3dSmrg uint16_t green, 721428d7b3dSmrg uint16_t blue, 722428d7b3dSmrg uint16_t alpha, 723428d7b3dSmrg uint32_t format); 724428d7b3dSmrg 725428d7b3dSmrgstatic inline bool 726428d7b3dSmrgsna_get_pixel_from_rgba(uint32_t * pixel, 727428d7b3dSmrg uint16_t red, 728428d7b3dSmrg uint16_t green, 729428d7b3dSmrg uint16_t blue, 730428d7b3dSmrg uint16_t alpha, 731428d7b3dSmrg uint32_t format) 732428d7b3dSmrg{ 733428d7b3dSmrg switch (format) { 734428d7b3dSmrg case PICT_x8r8g8b8: 735428d7b3dSmrg alpha = 0xffff; 736428d7b3dSmrg /* fall through to re-use a8r8g8b8 expansion */ 737428d7b3dSmrg case PICT_a8r8g8b8: 738428d7b3dSmrg *pixel = ((alpha >> 8 << 24) | 739428d7b3dSmrg (red >> 8 << 16) | 740428d7b3dSmrg (green & 0xff00) | 741428d7b3dSmrg (blue >> 8)); 742428d7b3dSmrg return TRUE; 743428d7b3dSmrg case PICT_a8: 744428d7b3dSmrg *pixel = alpha >> 8; 745428d7b3dSmrg return TRUE; 746428d7b3dSmrg } 747428d7b3dSmrg 748428d7b3dSmrg return _sna_get_pixel_from_rgba(pixel, red, green, blue, alpha, format); 749428d7b3dSmrg} 750428d7b3dSmrg 751428d7b3dSmrgstruct kgem_bo * 752428d7b3dSmrg__sna_render_pixmap_bo(struct sna *sna, 753428d7b3dSmrg PixmapPtr pixmap, 754428d7b3dSmrg const BoxRec *box, 755428d7b3dSmrg bool blt); 756428d7b3dSmrg 757428d7b3dSmrgint 758428d7b3dSmrgsna_render_pixmap_bo(struct sna *sna, 759428d7b3dSmrg struct sna_composite_channel *channel, 760428d7b3dSmrg PixmapPtr pixmap, 761428d7b3dSmrg int16_t x, int16_t y, 762428d7b3dSmrg int16_t w, int16_t h, 763428d7b3dSmrg int16_t dst_x, int16_t dst_y); 764428d7b3dSmrg 765428d7b3dSmrgbool 766428d7b3dSmrgsna_render_pixmap_partial(struct sna *sna, 767428d7b3dSmrg const DrawableRec *draw, 768428d7b3dSmrg struct kgem_bo *bo, 769428d7b3dSmrg struct sna_composite_channel *channel, 770428d7b3dSmrg int16_t x, int16_t y, 771428d7b3dSmrg int16_t w, int16_t h); 772428d7b3dSmrg 773428d7b3dSmrgint 774428d7b3dSmrgsna_render_picture_extract(struct sna *sna, 775428d7b3dSmrg PicturePtr picture, 776428d7b3dSmrg struct sna_composite_channel *channel, 777428d7b3dSmrg int16_t x, int16_t y, 778428d7b3dSmrg int16_t w, int16_t h, 779428d7b3dSmrg int16_t dst_x, int16_t dst_y); 780428d7b3dSmrg 781428d7b3dSmrgint 782428d7b3dSmrgsna_render_picture_approximate_gradient(struct sna *sna, 783428d7b3dSmrg PicturePtr picture, 784428d7b3dSmrg struct sna_composite_channel *channel, 785428d7b3dSmrg int16_t x, int16_t y, 786428d7b3dSmrg int16_t w, int16_t h, 787428d7b3dSmrg int16_t dst_x, int16_t dst_y); 788428d7b3dSmrg 789428d7b3dSmrgint 790428d7b3dSmrgsna_render_picture_fixup(struct sna *sna, 791428d7b3dSmrg PicturePtr picture, 792428d7b3dSmrg struct sna_composite_channel *channel, 793428d7b3dSmrg int16_t x, int16_t y, 794428d7b3dSmrg int16_t w, int16_t h, 795428d7b3dSmrg int16_t dst_x, int16_t dst_y); 796428d7b3dSmrg 797428d7b3dSmrgint 798428d7b3dSmrgsna_render_picture_convert(struct sna *sna, 799428d7b3dSmrg PicturePtr picture, 800428d7b3dSmrg struct sna_composite_channel *channel, 801428d7b3dSmrg PixmapPtr pixmap, 802428d7b3dSmrg int16_t x, int16_t y, 803428d7b3dSmrg int16_t w, int16_t h, 804428d7b3dSmrg int16_t dst_x, int16_t dst_y, 805428d7b3dSmrg bool fixup_alpha); 806428d7b3dSmrg 807428d7b3dSmrginline static void sna_render_composite_redirect_init(struct sna_composite_op *op) 808428d7b3dSmrg{ 809428d7b3dSmrg struct sna_composite_redirect *t = &op->redirect; 810428d7b3dSmrg t->real_bo = NULL; 811428d7b3dSmrg t->damage = NULL; 812428d7b3dSmrg} 813428d7b3dSmrg 814428d7b3dSmrgbool 815428d7b3dSmrgsna_render_composite_redirect(struct sna *sna, 816428d7b3dSmrg struct sna_composite_op *op, 817428d7b3dSmrg int x, int y, int width, int height, 818428d7b3dSmrg bool partial); 819428d7b3dSmrg 820428d7b3dSmrgvoid 821428d7b3dSmrgsna_render_composite_redirect_done(struct sna *sna, 822428d7b3dSmrg const struct sna_composite_op *op); 823428d7b3dSmrg 824428d7b3dSmrgbool 825428d7b3dSmrgsna_render_copy_boxes__overlap(struct sna *sna, uint8_t alu, 826428d7b3dSmrg const DrawableRec *draw, struct kgem_bo *bo, 827428d7b3dSmrg int16_t src_dx, int16_t src_dy, 828428d7b3dSmrg int16_t dst_dx, int16_t dst_dy, 829428d7b3dSmrg const BoxRec *box, int n, const BoxRec *extents); 830428d7b3dSmrg 831428d7b3dSmrgbool 832428d7b3dSmrgsna_composite_mask_is_opaque(PicturePtr mask); 833428d7b3dSmrg 834428d7b3dSmrgvoid sna_vertex_init(struct sna *sna); 835428d7b3dSmrg 836428d7b3dSmrgstatic inline void sna_vertex_lock(struct sna_render *r) 837428d7b3dSmrg{ 838428d7b3dSmrg pthread_mutex_lock(&r->lock); 839428d7b3dSmrg} 840428d7b3dSmrg 841428d7b3dSmrgstatic inline void sna_vertex_acquire__locked(struct sna_render *r) 842428d7b3dSmrg{ 843428d7b3dSmrg r->active++; 844428d7b3dSmrg} 845428d7b3dSmrg 846428d7b3dSmrgstatic inline void sna_vertex_unlock(struct sna_render *r) 847428d7b3dSmrg{ 848428d7b3dSmrg pthread_mutex_unlock(&r->lock); 849428d7b3dSmrg} 850428d7b3dSmrg 851428d7b3dSmrgstatic inline void sna_vertex_release__locked(struct sna_render *r) 852428d7b3dSmrg{ 853428d7b3dSmrg assert(r->active > 0); 854428d7b3dSmrg if (--r->active == 0) 855428d7b3dSmrg pthread_cond_signal(&r->wait); 856428d7b3dSmrg} 857428d7b3dSmrg 858428d7b3dSmrgstatic inline bool sna_vertex_wait__locked(struct sna_render *r) 859428d7b3dSmrg{ 860428d7b3dSmrg bool was_active = r->active; 861428d7b3dSmrg while (r->active) 862428d7b3dSmrg pthread_cond_wait(&r->wait, &r->lock); 863428d7b3dSmrg return was_active; 864428d7b3dSmrg} 865428d7b3dSmrg 866428d7b3dSmrg#define alphaless(format) PICT_FORMAT(PICT_FORMAT_BPP(format), \ 867428d7b3dSmrg PICT_FORMAT_TYPE(format), \ 868428d7b3dSmrg 0, \ 869428d7b3dSmrg PICT_FORMAT_R(format), \ 870428d7b3dSmrg PICT_FORMAT_G(format), \ 871428d7b3dSmrg PICT_FORMAT_B(format)) 872428d7b3dSmrg 873428d7b3dSmrg#endif /* SNA_RENDER_H */ 874