1 #ifndef SNA_RENDER_H
2 #define SNA_RENDER_H
3
4 #include "compiler.h"
5
6 #include <picturestr.h>
7
8 #include <stdbool.h>
9 #include <stdint.h>
10 #include <pthread.h>
11 #include "atomic.h"
12
13 #define GRADIENT_CACHE_SIZE 16
14
15 #define GXinvalid 0xff
16
17 struct sna;
18 struct sna_glyph;
19 struct sna_video;
20 struct sna_video_frame;
21 struct brw_compile;
22
23 struct sna_composite_rectangles {
24 struct sna_coordinate {
25 int16_t x, y;
26 } src, mask, dst;
27 int16_t width, height;
28 };
29
30 struct sna_composite_op {
31 fastcall void (*blt)(struct sna *sna, const struct sna_composite_op *op,
32 const struct sna_composite_rectangles *r);
33 fastcall void (*box)(struct sna *sna,
34 const struct sna_composite_op *op,
35 const BoxRec *box);
36 void (*boxes)(struct sna *sna, const struct sna_composite_op *op,
37 const BoxRec *box, int nbox);
38 void (*thread_boxes)(struct sna *sna, const struct sna_composite_op *op,
39 const BoxRec *box, int nbox);
40 void (*done)(struct sna *sna, const struct sna_composite_op *op);
41
42 struct sna_damage **damage;
43
44 uint32_t op;
45
46 struct {
47 PixmapPtr pixmap; /* XXX */
48 CARD32 format;
49 struct kgem_bo *bo;
50 int16_t x, y;
51 uint16_t width, height;
52 } dst;
53
54 struct sna_composite_channel {
55 struct kgem_bo *bo;
56 PictTransform *transform;
57 uint16_t width;
58 uint16_t height;
59 uint32_t pict_format;
60 uint32_t card_format;
61 uint32_t filter;
62 uint32_t repeat;
63 uint32_t is_affine : 1;
64 uint32_t is_solid : 1;
65 uint32_t is_linear : 1;
66 uint32_t is_opaque : 1;
67 uint32_t alpha_fixup : 1;
68 uint32_t rb_reversed : 1;
69 int16_t offset[2];
70 float scale[2];
71
72 pixman_transform_t embedded_transform;
73
74 union {
75 struct {
76 float dx, dy, offset;
77 } linear;
78 struct {
79 uint32_t pixel;
80 } gen2;
81 struct gen3_shader_channel {
82 int type;
83 uint32_t mode;
84 uint32_t constants;
85 } gen3;
86 } u;
87 } src, mask;
88 uint32_t is_affine : 1;
89 uint32_t has_component_alpha : 1;
90 uint32_t need_magic_ca_pass : 1;
91 uint32_t rb_reversed : 1;
92
93 int16_t floats_per_vertex;
94 int16_t floats_per_rect;
95 fastcall void (*prim_emit)(struct sna *sna,
96 const struct sna_composite_op *op,
97 const struct sna_composite_rectangles *r);
98 fastcall void (*emit_boxes)(const struct sna_composite_op *op,
99 const BoxRec *box, int nbox,
100 float *v);
101
102 struct sna_composite_redirect {
103 struct kgem_bo *real_bo;
104 struct sna_damage **real_damage, *damage;
105 BoxRec box;
106 } redirect;
107
108 union {
109 struct sna_blt_state {
110 PixmapPtr src_pixmap;
111 int16_t sx, sy;
112
113 uint32_t inplace :1;
114 uint32_t overwrites:1;
115 uint32_t bpp : 6;
116 uint32_t alu : 4;
117
118 uint32_t cmd;
119 uint32_t br13;
120 uint32_t pitch[2];
121 uint32_t pixel;
122 struct kgem_bo *bo[2];
123 } blt;
124
125 struct {
126 float constants[8];
127 uint32_t num_constants;
128 } gen3;
129
130 struct {
131 int wm_kernel;
132 int ve_id;
133 } gen4;
134
135 struct {
136 int16_t wm_kernel;
137 int16_t ve_id;
138 } gen5;
139
140 struct {
141 uint32_t flags;
142 } gen6;
143
144 struct {
145 uint32_t flags;
146 } gen7;
147
148 struct {
149 uint32_t flags;
150 } gen8;
151
152 struct {
153 uint32_t flags;
154 uint8_t wm_kernel;
155 } gen9;
156 } u;
157
158 void *priv;
159 };
160
161 struct sna_opacity_box {
162 BoxRec box;
163 float alpha;
164 } tightly_packed;
165
166 struct sna_composite_spans_op {
167 struct sna_composite_op base;
168
169 fastcall void (*box)(struct sna *sna,
170 const struct sna_composite_spans_op *op,
171 const BoxRec *box,
172 float opacity);
173 void (*boxes)(struct sna *sna,
174 const struct sna_composite_spans_op *op,
175 const BoxRec *box, int nbox,
176 float opacity);
177
178 fastcall void (*thread_boxes)(struct sna *sna,
179 const struct sna_composite_spans_op *op,
180 const struct sna_opacity_box *box,
181 int nbox);
182
183 fastcall void (*done)(struct sna *sna,
184 const struct sna_composite_spans_op *op);
185
186 fastcall void (*prim_emit)(struct sna *sna,
187 const struct sna_composite_spans_op *op,
188 const BoxRec *box,
189 float opacity);
190 fastcall void (*emit_boxes)(const struct sna_composite_spans_op *op,
191 const struct sna_opacity_box *box, int nbox,
192 float *v);
193 };
194
195 struct sna_fill_op {
196 struct sna_composite_op base;
197
198 void (*blt)(struct sna *sna, const struct sna_fill_op *op,
199 int16_t x, int16_t y, int16_t w, int16_t h);
200 fastcall void (*box)(struct sna *sna,
201 const struct sna_fill_op *op,
202 const BoxRec *box);
203 fastcall void (*boxes)(struct sna *sna,
204 const struct sna_fill_op *op,
205 const BoxRec *box,
206 int count);
207 fastcall void (*points)(struct sna *sna,
208 const struct sna_fill_op *op,
209 int16_t dx, int16_t dy,
210 const DDXPointRec *points,
211 int count);
212 void (*done)(struct sna *sna, const struct sna_fill_op *op);
213 };
214
215 struct sna_copy_op {
216 struct sna_composite_op base;
217
218 void (*blt)(struct sna *sna, const struct sna_copy_op *op,
219 int16_t sx, int16_t sy,
220 int16_t w, int16_t h,
221 int16_t dx, int16_t dy);
222 void (*done)(struct sna *sna, const struct sna_copy_op *op);
223 };
224
225 struct sna_render {
226 pthread_mutex_t lock;
227 pthread_cond_t wait;
228 int active;
229
230 int max_3d_size;
231 int max_3d_pitch;
232
233 unsigned prefer_gpu;
234 #define PREFER_GPU_BLT 0x1
235 #define PREFER_GPU_RENDER 0x2
236 #define PREFER_GPU_SPANS 0x4
237
238 bool (*composite)(struct sna *sna, uint8_t op,
239 PicturePtr dst, PicturePtr src, PicturePtr mask,
240 int16_t src_x, int16_t src_y,
241 int16_t msk_x, int16_t msk_y,
242 int16_t dst_x, int16_t dst_y,
243 int16_t w, int16_t h,
244 unsigned flags,
245 struct sna_composite_op *tmp);
246 #define COMPOSITE_PARTIAL 0x1
247 #define COMPOSITE_UPLOAD 0x40000000
248 #define COMPOSITE_FALLBACK 0x80000000
249
250 bool (*check_composite_spans)(struct sna *sna, uint8_t op,
251 PicturePtr dst, PicturePtr src,
252 int16_t w, int16_t h, unsigned flags);
253 bool (*composite_spans)(struct sna *sna, uint8_t op,
254 PicturePtr dst, PicturePtr src,
255 int16_t src_x, int16_t src_y,
256 int16_t dst_x, int16_t dst_y,
257 int16_t w, int16_t h,
258 unsigned flags,
259 struct sna_composite_spans_op *tmp);
260 #define COMPOSITE_SPANS_RECTILINEAR 0x1
261 #define COMPOSITE_SPANS_INPLACE_HINT 0x2
262
263 bool (*video)(struct sna *sna,
264 struct sna_video *video,
265 struct sna_video_frame *frame,
266 RegionPtr dstRegion,
267 PixmapPtr pixmap);
268
269 bool (*fill_boxes)(struct sna *sna,
270 CARD8 op,
271 PictFormat format,
272 const xRenderColor *color,
273 const DrawableRec *dst, struct kgem_bo *dst_bo,
274 const BoxRec *box, int n);
275 bool (*fill)(struct sna *sna, uint8_t alu,
276 PixmapPtr dst, struct kgem_bo *dst_bo,
277 uint32_t color, unsigned flags,
278 struct sna_fill_op *tmp);
279 #define FILL_BOXES 0x1
280 #define FILL_POINTS 0x2
281 #define FILL_SPANS 0x4
282 bool (*fill_one)(struct sna *sna, PixmapPtr dst, struct kgem_bo *dst_bo,
283 uint32_t color,
284 int16_t x1, int16_t y1, int16_t x2, int16_t y2,
285 uint8_t alu);
286 bool (*clear)(struct sna *sna, PixmapPtr dst, struct kgem_bo *dst_bo);
287
288 bool (*copy_boxes)(struct sna *sna, uint8_t alu,
289 const DrawableRec *src, struct kgem_bo *src_bo, int16_t src_dx, int16_t src_dy,
290 const DrawableRec *dst, struct kgem_bo *dst_bo, int16_t dst_dx, int16_t dst_dy,
291 const BoxRec *box, int n, unsigned flags);
292 #define COPY_LAST 0x1
293 #define COPY_SYNC 0x2
294 #define COPY_NO_OVERLAP 0x4
295 #define COPY_SMALL 0x8
296 #define COPY_DRI 0x10
297
298 bool (*copy)(struct sna *sna, uint8_t alu,
299 PixmapPtr src, struct kgem_bo *src_bo,
300 PixmapPtr dst, struct kgem_bo *dst_bo,
301 struct sna_copy_op *op);
302
303 void (*flush)(struct sna *sna);
304 void (*reset)(struct sna *sna);
305 void (*fini)(struct sna *sna);
306
307 struct sna_alpha_cache {
308 struct kgem_bo *cache_bo;
309 struct kgem_bo *bo[256+7];
310 } alpha_cache;
311
312 struct sna_solid_cache {
313 struct kgem_bo *cache_bo;
314 struct kgem_bo *bo[1024];
315 uint32_t color[1024];
316 int last;
317 int size;
318 int dirty;
319 } solid_cache;
320
321 struct {
322 struct sna_gradient_cache {
323 struct kgem_bo *bo;
324 int nstops;
325 PictGradientStop *stops;
326 } cache[GRADIENT_CACHE_SIZE];
327 int size;
328 } gradient_cache;
329
330 struct sna_glyph_cache{
331 PicturePtr picture;
332 struct sna_glyph **glyphs;
333 uint16_t count;
334 uint16_t evict;
335 } glyph[2];
336 pixman_image_t *white_image;
337 PicturePtr white_picture;
338
339 uint16_t vb_id;
340 uint16_t vertex_offset;
341 uint16_t vertex_start;
342 uint16_t vertex_index;
343 uint16_t vertex_used;
344 uint16_t vertex_size;
345 uint16_t vertex_reloc[16];
346 int nvertex_reloc;
347
348 struct kgem_bo *vbo;
349 float *vertices;
350
351 float vertex_data[1024];
352 };
353
354 struct gen2_render_state {
355 uint32_t target;
356 bool need_invariant;
357 uint32_t logic_op_enabled;
358 uint32_t ls1, ls2, vft;
359 uint32_t diffuse;
360 uint32_t specular;
361 };
362
363 struct gen3_render_state {
364 uint32_t current_dst;
365 bool need_invariant;
366 uint32_t tex_count;
367 uint32_t last_drawrect_limit;
368 uint32_t last_target;
369 uint32_t last_blend;
370 uint32_t last_constants;
371 uint32_t last_sampler;
372 uint32_t last_shader;
373 uint32_t last_diffuse;
374 uint32_t last_specular;
375
376 uint16_t last_vertex_offset;
377 uint16_t floats_per_vertex;
378 uint16_t last_floats_per_vertex;
379
380 uint32_t tex_map[4];
381 uint32_t tex_handle[2];
382 uint32_t tex_delta[2];
383 };
384
385 struct gen4_render_state {
386 struct kgem_bo *general_bo;
387
388 uint32_t vs;
389 uint32_t sf;
390 uint32_t wm;
391 uint32_t cc;
392
393 int ve_id;
394 uint32_t drawrect_offset;
395 uint32_t drawrect_limit;
396 uint32_t last_pipelined_pointers;
397 uint16_t last_primitive;
398 int16_t floats_per_vertex;
399 uint16_t surface_table;
400
401 bool needs_invariant;
402 bool needs_urb;
403 };
404
405 struct gen5_render_state {
406 struct kgem_bo *general_bo;
407
408 uint32_t vs;
409 uint32_t sf[2];
410 uint32_t wm;
411 uint32_t cc;
412
413 int ve_id;
414 uint32_t drawrect_offset;
415 uint32_t drawrect_limit;
416 uint32_t last_pipelined_pointers;
417 uint16_t last_primitive;
418 int16_t floats_per_vertex;
419 uint16_t surface_table;
420
421 bool needs_invariant;
422 };
423
424 enum {
425 GEN6_WM_KERNEL_NOMASK = 0,
426 GEN6_WM_KERNEL_NOMASK_P,
427
428 GEN6_WM_KERNEL_MASK,
429 GEN6_WM_KERNEL_MASK_P,
430
431 GEN6_WM_KERNEL_MASKCA,
432 GEN6_WM_KERNEL_MASKCA_P,
433
434 GEN6_WM_KERNEL_MASKSA,
435 GEN6_WM_KERNEL_MASKSA_P,
436
437 GEN6_WM_KERNEL_OPACITY,
438 GEN6_WM_KERNEL_OPACITY_P,
439
440 GEN6_WM_KERNEL_VIDEO_PLANAR_BT601,
441 GEN6_WM_KERNEL_VIDEO_NV12_BT601,
442 GEN6_WM_KERNEL_VIDEO_PACKED_BT601,
443
444 GEN6_WM_KERNEL_VIDEO_PLANAR_BT709,
445 GEN6_WM_KERNEL_VIDEO_NV12_BT709,
446 GEN6_WM_KERNEL_VIDEO_PACKED_BT709,
447
448 GEN6_KERNEL_COUNT
449 };
450
451 struct gen6_render_state {
452 unsigned gt;
453 const struct gt_info *info;
454 struct kgem_bo *general_bo;
455
456 uint32_t vs_state;
457 uint32_t sf_state;
458 uint32_t sf_mask_state;
459 uint32_t wm_state;
460 uint32_t wm_kernel[GEN6_KERNEL_COUNT][3];
461
462 uint32_t cc_blend;
463
464 uint32_t drawrect_offset;
465 uint32_t drawrect_limit;
466 uint32_t blend;
467 uint32_t samplers;
468 uint32_t kernel;
469
470 uint16_t num_sf_outputs;
471 uint16_t ve_id;
472 uint16_t last_primitive;
473 int16_t floats_per_vertex;
474 uint16_t surface_table;
475
476 bool needs_invariant;
477 bool first_state_packet;
478 };
479
480 enum {
481 GEN7_WM_KERNEL_NOMASK = 0,
482 GEN7_WM_KERNEL_NOMASK_P,
483
484 GEN7_WM_KERNEL_MASK,
485 GEN7_WM_KERNEL_MASK_P,
486
487 GEN7_WM_KERNEL_MASKCA,
488 GEN7_WM_KERNEL_MASKCA_P,
489
490 GEN7_WM_KERNEL_MASKSA,
491 GEN7_WM_KERNEL_MASKSA_P,
492
493 GEN7_WM_KERNEL_OPACITY,
494 GEN7_WM_KERNEL_OPACITY_P,
495
496 GEN7_WM_KERNEL_VIDEO_PLANAR_BT601,
497 GEN7_WM_KERNEL_VIDEO_NV12_BT601,
498 GEN7_WM_KERNEL_VIDEO_PACKED_BT601,
499
500 GEN7_WM_KERNEL_VIDEO_PLANAR_BT709,
501 GEN7_WM_KERNEL_VIDEO_NV12_BT709,
502 GEN7_WM_KERNEL_VIDEO_PACKED_BT709,
503
504 GEN7_WM_KERNEL_VIDEO_RGB,
505 GEN7_WM_KERNEL_COUNT
506 };
507
508 struct gen7_render_state {
509 unsigned gt;
510 const struct gt_info *info;
511 struct kgem_bo *general_bo;
512
513 uint32_t vs_state;
514 uint32_t sf_state;
515 uint32_t sf_mask_state;
516 uint32_t wm_state;
517 uint32_t wm_kernel[GEN7_WM_KERNEL_COUNT][3];
518
519 uint32_t cc_blend;
520
521 uint32_t drawrect_offset;
522 uint32_t drawrect_limit;
523 uint32_t blend;
524 uint32_t samplers;
525 uint32_t kernel;
526
527 uint16_t num_sf_outputs;
528 uint16_t ve_id;
529 uint16_t last_primitive;
530 int16_t floats_per_vertex;
531 uint16_t surface_table;
532 uint16_t pipe_controls_since_stall;
533
534 bool needs_invariant;
535 bool emit_flush;
536 };
537
538
539 enum {
540 GEN8_WM_KERNEL_NOMASK = 0,
541 GEN8_WM_KERNEL_NOMASK_P,
542
543 GEN8_WM_KERNEL_MASK,
544 GEN8_WM_KERNEL_MASK_P,
545
546 GEN8_WM_KERNEL_MASKCA,
547 GEN8_WM_KERNEL_MASKCA_P,
548
549 GEN8_WM_KERNEL_MASKSA,
550 GEN8_WM_KERNEL_MASKSA_P,
551
552 GEN8_WM_KERNEL_OPACITY,
553 GEN8_WM_KERNEL_OPACITY_P,
554
555 GEN8_WM_KERNEL_VIDEO_PLANAR_BT601,
556 GEN8_WM_KERNEL_VIDEO_NV12_BT601,
557 GEN8_WM_KERNEL_VIDEO_PACKED_BT601,
558
559 GEN8_WM_KERNEL_VIDEO_PLANAR_BT709,
560 GEN8_WM_KERNEL_VIDEO_NV12_BT709,
561 GEN8_WM_KERNEL_VIDEO_PACKED_BT709,
562
563 GEN8_WM_KERNEL_VIDEO_RGB,
564 GEN8_WM_KERNEL_COUNT
565 };
566
567 struct gen8_render_state {
568 unsigned gt;
569 const struct gt_info *info;
570 struct kgem_bo *general_bo;
571
572 uint32_t vs_state;
573 uint32_t sf_state;
574 uint32_t sf_mask_state;
575 uint32_t wm_state;
576 uint32_t wm_kernel[GEN8_WM_KERNEL_COUNT][3];
577
578 uint32_t cc_blend;
579
580 uint32_t drawrect_offset;
581 uint32_t drawrect_limit;
582 uint32_t blend;
583 uint32_t samplers;
584 uint32_t kernel;
585
586 uint16_t num_sf_outputs;
587 uint16_t ve_id;
588 uint16_t last_primitive;
589 int16_t floats_per_vertex;
590 uint16_t surface_table;
591
592 bool needs_invariant;
593 bool emit_flush;
594 };
595
596 enum {
597 GEN9_WM_KERNEL_NOMASK = 0,
598 GEN9_WM_KERNEL_NOMASK_P,
599
600 GEN9_WM_KERNEL_MASK,
601 GEN9_WM_KERNEL_MASK_P,
602
603 GEN9_WM_KERNEL_MASKCA,
604 GEN9_WM_KERNEL_MASKCA_P,
605
606 GEN9_WM_KERNEL_MASKSA,
607 GEN9_WM_KERNEL_MASKSA_P,
608
609 GEN9_WM_KERNEL_OPACITY,
610 GEN9_WM_KERNEL_OPACITY_P,
611
612 GEN9_WM_KERNEL_VIDEO_PLANAR_BT601,
613 GEN9_WM_KERNEL_VIDEO_NV12_BT601,
614 GEN9_WM_KERNEL_VIDEO_PACKED_BT601,
615
616 GEN9_WM_KERNEL_VIDEO_PLANAR_BT709,
617 GEN9_WM_KERNEL_VIDEO_NV12_BT709,
618 GEN9_WM_KERNEL_VIDEO_PACKED_BT709,
619
620 GEN9_WM_KERNEL_VIDEO_AYUV_BT601,
621 GEN9_WM_KERNEL_VIDEO_AYUV_BT709,
622
623 GEN9_WM_KERNEL_VIDEO_RGB,
624 GEN9_WM_KERNEL_COUNT
625 };
626
627 struct gen9_render_state {
628 unsigned gt;
629 const struct gt_info *info;
630 struct kgem_bo *general_bo;
631
632 uint32_t vs_state;
633 uint32_t sf_state;
634 uint32_t sf_mask_state;
635 uint32_t wm_state;
636 uint32_t wm_kernel[GEN9_WM_KERNEL_COUNT][3];
637
638 uint32_t cc_blend;
639
640 uint32_t drawrect_offset;
641 uint32_t drawrect_limit;
642 uint32_t blend;
643 uint32_t samplers;
644 uint32_t kernel;
645
646 uint16_t num_sf_outputs;
647 uint16_t ve_id;
648 uint16_t last_primitive;
649 int16_t floats_per_vertex;
650 uint16_t surface_table;
651
652 bool needs_invariant;
653 bool emit_flush;
654 bool ve_dirty;
655 };
656
657 struct sna_static_stream {
658 uint32_t size, used;
659 uint8_t *data;
660 };
661
662 int sna_static_stream_init(struct sna_static_stream *stream);
663 uint32_t sna_static_stream_add(struct sna_static_stream *stream,
664 const void *data, uint32_t len, uint32_t align);
665 void *sna_static_stream_map(struct sna_static_stream *stream,
666 uint32_t len, uint32_t align);
667 uint32_t sna_static_stream_offsetof(struct sna_static_stream *stream,
668 void *ptr);
669 unsigned sna_static_stream_compile_sf(struct sna *sna,
670 struct sna_static_stream *stream,
671 bool (*compile)(struct brw_compile *));
672
673 unsigned sna_static_stream_compile_wm(struct sna *sna,
674 struct sna_static_stream *stream,
675 bool (*compile)(struct brw_compile *, int),
676 int width);
677 struct kgem_bo *sna_static_stream_fini(struct sna *sna,
678 struct sna_static_stream *stream);
679
680 struct kgem_bo *
681 sna_render_get_solid(struct sna *sna,
682 uint32_t color);
683
684 void
685 sna_render_flush_solid(struct sna *sna);
686
687 struct kgem_bo *
688 sna_render_get_gradient(struct sna *sna,
689 PictGradient *pattern);
690
691 bool
692 sna_gradient_is_opaque(const PictGradient *gradient);
693
694 uint32_t sna_rgba_for_color(uint32_t color, int depth);
695 uint32_t sna_rgba_to_color(uint32_t rgba, uint32_t format);
696 bool sna_get_rgba_from_pixel(uint32_t pixel,
697 uint16_t *red,
698 uint16_t *green,
699 uint16_t *blue,
700 uint16_t *alpha,
701 uint32_t format);
702 bool sna_picture_is_solid(PicturePtr picture, uint32_t *color);
703
704 const char *no_render_init(struct sna *sna);
705 const char *gen2_render_init(struct sna *sna, const char *backend);
706 const char *gen3_render_init(struct sna *sna, const char *backend);
707 const char *gen4_render_init(struct sna *sna, const char *backend);
708 const char *gen5_render_init(struct sna *sna, const char *backend);
709 const char *gen6_render_init(struct sna *sna, const char *backend);
710 const char *gen7_render_init(struct sna *sna, const char *backend);
711 const char *gen8_render_init(struct sna *sna, const char *backend);
712 const char *gen9_render_init(struct sna *sna, const char *backend);
713
714 void sna_render_mark_wedged(struct sna *sna);
715
716 bool sna_tiling_composite(uint32_t op,
717 PicturePtr src,
718 PicturePtr mask,
719 PicturePtr dst,
720 int16_t src_x, int16_t src_y,
721 int16_t mask_x, int16_t mask_y,
722 int16_t dst_x, int16_t dst_y,
723 int16_t width, int16_t height,
724 struct sna_composite_op *tmp);
725 bool sna_tiling_composite_spans(uint32_t op,
726 PicturePtr src,
727 PicturePtr dst,
728 int16_t src_x, int16_t src_y,
729 int16_t dst_x, int16_t dst_y,
730 int16_t width, int16_t height,
731 unsigned flags,
732 struct sna_composite_spans_op *tmp);
733 bool sna_tiling_fill_boxes(struct sna *sna,
734 CARD8 op,
735 PictFormat format,
736 const xRenderColor *color,
737 const DrawableRec *dst, struct kgem_bo *dst_bo,
738 const BoxRec *box, int n);
739
740 bool sna_tiling_copy_boxes(struct sna *sna, uint8_t alu,
741 const DrawableRec *src, struct kgem_bo *src_bo, int16_t src_dx, int16_t src_dy,
742 const DrawableRec *dst, struct kgem_bo *dst_bo, int16_t dst_dx, int16_t dst_dy,
743 const BoxRec *box, int n);
744
745 bool sna_tiling_blt_copy_boxes(struct sna *sna, uint8_t alu,
746 struct kgem_bo *src_bo, int16_t src_dx, int16_t src_dy,
747 struct kgem_bo *dst_bo, int16_t dst_dx, int16_t dst_dy,
748 int bpp, const BoxRec *box, int nbox);
749
750 bool sna_tiling_blt_composite(struct sna *sna,
751 struct sna_composite_op *op,
752 struct kgem_bo *bo,
753 int bpp,
754 uint32_t alpha_fixup);
755
756 bool sna_blt_composite(struct sna *sna,
757 uint32_t op,
758 PicturePtr src,
759 PicturePtr dst,
760 int16_t src_x, int16_t src_y,
761 int16_t dst_x, int16_t dst_y,
762 int16_t width, int16_t height,
763 unsigned flags,
764 struct sna_composite_op *tmp);
765 bool sna_blt_composite__convert(struct sna *sna,
766 int x, int y,
767 int width, int height,
768 struct sna_composite_op *tmp);
769
770 bool sna_blt_fill(struct sna *sna, uint8_t alu,
771 struct kgem_bo *bo,
772 int bpp,
773 uint32_t pixel,
774 struct sna_fill_op *fill);
775
776 bool sna_blt_copy(struct sna *sna, uint8_t alu,
777 struct kgem_bo *src,
778 struct kgem_bo *dst,
779 int bpp,
780 struct sna_copy_op *copy);
781
782 bool sna_blt_fill_boxes(struct sna *sna, uint8_t alu,
783 struct kgem_bo *bo,
784 int bpp,
785 uint32_t pixel,
786 const BoxRec *box, int n);
787
788 bool sna_blt_copy_boxes(struct sna *sna, uint8_t alu,
789 struct kgem_bo *src_bo, int16_t src_dx, int16_t src_dy,
790 struct kgem_bo *dst_bo, int16_t dst_dx, int16_t dst_dy,
791 int bpp,
792 const BoxRec *box, int n);
793 bool sna_blt_copy_boxes__with_alpha(struct sna *sna, uint8_t alu,
794 struct kgem_bo *src_bo, int16_t src_dx, int16_t src_dy,
795 struct kgem_bo *dst_bo, int16_t dst_dx, int16_t dst_dy,
796 int bpp, int alpha_fixup,
797 const BoxRec *box, int nbox);
798 bool sna_blt_copy_boxes_fallback(struct sna *sna, uint8_t alu,
799 const DrawableRec *src, struct kgem_bo *src_bo, int16_t src_dx, int16_t src_dy,
800 const DrawableRec *dst, struct kgem_bo *dst_bo, int16_t dst_dx, int16_t dst_dy,
801 const BoxRec *box, int nbox);
802
803 bool memcpy_copy_boxes(struct sna *sna, uint8_t op,
804 const DrawableRec *src_draw, struct kgem_bo *src_bo, int16_t sx, int16_t sy,
805 const DrawableRec *dst_draw, struct kgem_bo *dst_bo, int16_t dx, int16_t dy,
806 const BoxRec *box, int n, unsigned flags);
807
808 bool _sna_get_pixel_from_rgba(uint32_t *pixel,
809 uint16_t red,
810 uint16_t green,
811 uint16_t blue,
812 uint16_t alpha,
813 uint32_t format);
814
815 static inline bool
sna_get_pixel_from_rgba(uint32_t * pixel,uint16_t red,uint16_t green,uint16_t blue,uint16_t alpha,uint32_t format)816 sna_get_pixel_from_rgba(uint32_t * pixel,
817 uint16_t red,
818 uint16_t green,
819 uint16_t blue,
820 uint16_t alpha,
821 uint32_t format)
822 {
823 switch (format) {
824 case PICT_x8r8g8b8:
825 alpha = 0xffff;
826 /* fall through */
827 case PICT_a8r8g8b8:
828 *pixel = ((alpha >> 8 << 24) |
829 (red >> 8 << 16) |
830 (green & 0xff00) |
831 (blue >> 8));
832 return TRUE;
833 case PICT_a8:
834 *pixel = alpha >> 8;
835 return TRUE;
836 }
837
838 return _sna_get_pixel_from_rgba(pixel, red, green, blue, alpha, format);
839 }
840
841 struct kgem_bo *
842 __sna_render_pixmap_bo(struct sna *sna,
843 PixmapPtr pixmap,
844 const BoxRec *box,
845 bool blt);
846
847 int
848 sna_render_pixmap_bo(struct sna *sna,
849 struct sna_composite_channel *channel,
850 PixmapPtr pixmap,
851 int16_t x, int16_t y,
852 int16_t w, int16_t h,
853 int16_t dst_x, int16_t dst_y);
854
855 bool
856 sna_render_pixmap_partial(struct sna *sna,
857 const DrawableRec *draw,
858 struct kgem_bo *bo,
859 struct sna_composite_channel *channel,
860 int16_t x, int16_t y,
861 int16_t w, int16_t h);
862
863 int
864 sna_render_picture_extract(struct sna *sna,
865 PicturePtr picture,
866 struct sna_composite_channel *channel,
867 int16_t x, int16_t y,
868 int16_t w, int16_t h,
869 int16_t dst_x, int16_t dst_y);
870
871 int
872 sna_render_picture_approximate_gradient(struct sna *sna,
873 PicturePtr picture,
874 struct sna_composite_channel *channel,
875 int16_t x, int16_t y,
876 int16_t w, int16_t h,
877 int16_t dst_x, int16_t dst_y);
878
879 int
880 sna_render_picture_fixup(struct sna *sna,
881 PicturePtr picture,
882 struct sna_composite_channel *channel,
883 int16_t x, int16_t y,
884 int16_t w, int16_t h,
885 int16_t dst_x, int16_t dst_y);
886
887 int
888 sna_render_picture_convert(struct sna *sna,
889 PicturePtr picture,
890 struct sna_composite_channel *channel,
891 PixmapPtr pixmap,
892 int16_t x, int16_t y,
893 int16_t w, int16_t h,
894 int16_t dst_x, int16_t dst_y,
895 bool fixup_alpha);
896
sna_render_composite_redirect_init(struct sna_composite_op * op)897 inline static void sna_render_composite_redirect_init(struct sna_composite_op *op)
898 {
899 struct sna_composite_redirect *t = &op->redirect;
900 t->real_bo = NULL;
901 t->damage = NULL;
902 }
903
904 bool
905 sna_render_composite_redirect(struct sna *sna,
906 struct sna_composite_op *op,
907 int x, int y, int width, int height,
908 bool partial);
909
910 void
911 sna_render_composite_redirect_done(struct sna *sna,
912 const struct sna_composite_op *op);
913
914 bool
915 sna_render_copy_boxes__overlap(struct sna *sna, uint8_t alu,
916 const DrawableRec *draw, struct kgem_bo *bo,
917 int16_t src_dx, int16_t src_dy,
918 int16_t dst_dx, int16_t dst_dy,
919 const BoxRec *box, int n, const BoxRec *extents);
920
921 bool
922 sna_composite_mask_is_opaque(PicturePtr mask);
923
924 void sna_vertex_init(struct sna *sna);
925
sna_vertex_lock(struct sna_render * r)926 static inline void sna_vertex_lock(struct sna_render *r)
927 {
928 pthread_mutex_lock(&r->lock);
929 }
930
sna_vertex_acquire__locked(struct sna_render * r)931 static inline void sna_vertex_acquire__locked(struct sna_render *r)
932 {
933 r->active++;
934 }
935
sna_vertex_unlock(struct sna_render * r)936 static inline void sna_vertex_unlock(struct sna_render *r)
937 {
938 pthread_mutex_unlock(&r->lock);
939 }
940
sna_vertex_release__locked(struct sna_render * r)941 static inline void sna_vertex_release__locked(struct sna_render *r)
942 {
943 assert(r->active > 0);
944 if (--r->active == 0)
945 pthread_cond_signal(&r->wait);
946 }
947
sna_vertex_wait__locked(struct sna_render * r)948 static inline bool sna_vertex_wait__locked(struct sna_render *r)
949 {
950 bool was_active = r->active;
951 while (r->active)
952 pthread_cond_wait(&r->wait, &r->lock);
953 return was_active;
954 }
955
956 #define alphaless(format) PICT_FORMAT(PICT_FORMAT_BPP(format), \
957 PICT_FORMAT_TYPE(format), \
958 0, \
959 PICT_FORMAT_R(format), \
960 PICT_FORMAT_G(format), \
961 PICT_FORMAT_B(format))
962
963 #endif /* SNA_RENDER_H */
964