sna_render.h revision fe8aea9e
103b705cfSriastradh#ifndef SNA_RENDER_H
203b705cfSriastradh#define SNA_RENDER_H
303b705cfSriastradh
403b705cfSriastradh#include "compiler.h"
503b705cfSriastradh
603b705cfSriastradh#include <picturestr.h>
703b705cfSriastradh
803b705cfSriastradh#include <stdbool.h>
903b705cfSriastradh#include <stdint.h>
1003b705cfSriastradh#include <pthread.h>
1103b705cfSriastradh#include "atomic.h"
1203b705cfSriastradh
1303b705cfSriastradh#define GRADIENT_CACHE_SIZE 16
1403b705cfSriastradh
1503b705cfSriastradh#define GXinvalid 0xff
1603b705cfSriastradh
1703b705cfSriastradhstruct sna;
1803b705cfSriastradhstruct sna_glyph;
1903b705cfSriastradhstruct sna_video;
2003b705cfSriastradhstruct sna_video_frame;
2103b705cfSriastradhstruct brw_compile;
2203b705cfSriastradh
2303b705cfSriastradhstruct sna_composite_rectangles {
2403b705cfSriastradh	struct sna_coordinate {
2503b705cfSriastradh		int16_t x, y;
2603b705cfSriastradh	} src, mask, dst;
2703b705cfSriastradh	int16_t width, height;
2803b705cfSriastradh};
2903b705cfSriastradh
3003b705cfSriastradhstruct sna_composite_op {
3103b705cfSriastradh	fastcall void (*blt)(struct sna *sna, const struct sna_composite_op *op,
3203b705cfSriastradh			     const struct sna_composite_rectangles *r);
3303b705cfSriastradh	fastcall void (*box)(struct sna *sna,
3403b705cfSriastradh			     const struct sna_composite_op *op,
3503b705cfSriastradh			     const BoxRec *box);
3603b705cfSriastradh	void (*boxes)(struct sna *sna, const struct sna_composite_op *op,
3703b705cfSriastradh		      const BoxRec *box, int nbox);
3803b705cfSriastradh	void (*thread_boxes)(struct sna *sna, const struct sna_composite_op *op,
3903b705cfSriastradh			     const BoxRec *box, int nbox);
4003b705cfSriastradh	void (*done)(struct sna *sna, const struct sna_composite_op *op);
4103b705cfSriastradh
4203b705cfSriastradh	struct sna_damage **damage;
4303b705cfSriastradh
4403b705cfSriastradh	uint32_t op;
4503b705cfSriastradh
4603b705cfSriastradh	struct {
4742542f5fSchristos		PixmapPtr pixmap; /* XXX */
4803b705cfSriastradh		CARD32 format;
4903b705cfSriastradh		struct kgem_bo *bo;
5003b705cfSriastradh		int16_t x, y;
5103b705cfSriastradh		uint16_t width, height;
5203b705cfSriastradh	} dst;
5303b705cfSriastradh
5403b705cfSriastradh	struct sna_composite_channel {
5503b705cfSriastradh		struct kgem_bo *bo;
5603b705cfSriastradh		PictTransform *transform;
5703b705cfSriastradh		uint16_t width;
5803b705cfSriastradh		uint16_t height;
5903b705cfSriastradh		uint32_t pict_format;
6003b705cfSriastradh		uint32_t card_format;
6103b705cfSriastradh		uint32_t filter;
6203b705cfSriastradh		uint32_t repeat;
6303b705cfSriastradh		uint32_t is_affine : 1;
6403b705cfSriastradh		uint32_t is_solid : 1;
6503b705cfSriastradh		uint32_t is_linear : 1;
6603b705cfSriastradh		uint32_t is_opaque : 1;
6703b705cfSriastradh		uint32_t alpha_fixup : 1;
6803b705cfSriastradh		uint32_t rb_reversed : 1;
6903b705cfSriastradh		int16_t offset[2];
7003b705cfSriastradh		float scale[2];
7103b705cfSriastradh
7203b705cfSriastradh		pixman_transform_t embedded_transform;
7303b705cfSriastradh
7403b705cfSriastradh		union {
7503b705cfSriastradh			struct {
7603b705cfSriastradh				float dx, dy, offset;
7703b705cfSriastradh			} linear;
7803b705cfSriastradh			struct {
7903b705cfSriastradh				uint32_t pixel;
8003b705cfSriastradh			} gen2;
8103b705cfSriastradh			struct gen3_shader_channel {
8203b705cfSriastradh				int type;
8303b705cfSriastradh				uint32_t mode;
8403b705cfSriastradh				uint32_t constants;
8503b705cfSriastradh			} gen3;
8603b705cfSriastradh		} u;
8703b705cfSriastradh	} src, mask;
8803b705cfSriastradh	uint32_t is_affine : 1;
8903b705cfSriastradh	uint32_t has_component_alpha : 1;
9003b705cfSriastradh	uint32_t need_magic_ca_pass : 1;
9103b705cfSriastradh	uint32_t rb_reversed : 1;
9203b705cfSriastradh
9303b705cfSriastradh	int16_t floats_per_vertex;
9403b705cfSriastradh	int16_t floats_per_rect;
9503b705cfSriastradh	fastcall void (*prim_emit)(struct sna *sna,
9603b705cfSriastradh				   const struct sna_composite_op *op,
9703b705cfSriastradh				   const struct sna_composite_rectangles *r);
9803b705cfSriastradh	fastcall void (*emit_boxes)(const struct sna_composite_op *op,
9903b705cfSriastradh				    const BoxRec *box, int nbox,
10003b705cfSriastradh				    float *v);
10103b705cfSriastradh
10203b705cfSriastradh	struct sna_composite_redirect {
10303b705cfSriastradh		struct kgem_bo *real_bo;
10403b705cfSriastradh		struct sna_damage **real_damage, *damage;
10503b705cfSriastradh		BoxRec box;
10603b705cfSriastradh	} redirect;
10703b705cfSriastradh
10803b705cfSriastradh	union {
10903b705cfSriastradh		struct sna_blt_state {
11003b705cfSriastradh			PixmapPtr src_pixmap;
11103b705cfSriastradh			int16_t sx, sy;
11203b705cfSriastradh
11303b705cfSriastradh			uint32_t inplace :1;
11403b705cfSriastradh			uint32_t overwrites:1;
11503b705cfSriastradh			uint32_t bpp : 6;
11642542f5fSchristos			uint32_t alu : 4;
11703b705cfSriastradh
11803b705cfSriastradh			uint32_t cmd;
11903b705cfSriastradh			uint32_t br13;
12003b705cfSriastradh			uint32_t pitch[2];
12103b705cfSriastradh			uint32_t pixel;
12203b705cfSriastradh			struct kgem_bo *bo[2];
12303b705cfSriastradh		} blt;
12403b705cfSriastradh
12503b705cfSriastradh		struct {
12603b705cfSriastradh			float constants[8];
12703b705cfSriastradh			uint32_t num_constants;
12803b705cfSriastradh		} gen3;
12903b705cfSriastradh
13003b705cfSriastradh		struct {
13103b705cfSriastradh			int wm_kernel;
13203b705cfSriastradh			int ve_id;
13303b705cfSriastradh		} gen4;
13403b705cfSriastradh
13503b705cfSriastradh		struct {
13603b705cfSriastradh			int16_t wm_kernel;
13703b705cfSriastradh			int16_t ve_id;
13803b705cfSriastradh		} gen5;
13903b705cfSriastradh
14003b705cfSriastradh		struct {
14103b705cfSriastradh			uint32_t flags;
14203b705cfSriastradh		} gen6;
14303b705cfSriastradh
14403b705cfSriastradh		struct {
14503b705cfSriastradh			uint32_t flags;
14603b705cfSriastradh		} gen7;
14742542f5fSchristos
14842542f5fSchristos		struct {
14942542f5fSchristos			uint32_t flags;
15042542f5fSchristos		} gen8;
151fe8aea9eSmrg
152fe8aea9eSmrg		struct {
153fe8aea9eSmrg			uint32_t flags;
154fe8aea9eSmrg			uint8_t wm_kernel;
155fe8aea9eSmrg		} gen9;
15603b705cfSriastradh	} u;
15703b705cfSriastradh
15803b705cfSriastradh	void *priv;
15903b705cfSriastradh};
16003b705cfSriastradh
16103b705cfSriastradhstruct sna_opacity_box {
16203b705cfSriastradh	BoxRec box;
16303b705cfSriastradh	float alpha;
16403b705cfSriastradh} tightly_packed;
16503b705cfSriastradh
16603b705cfSriastradhstruct sna_composite_spans_op {
16703b705cfSriastradh	struct sna_composite_op base;
16803b705cfSriastradh
16903b705cfSriastradh	fastcall void (*box)(struct sna *sna,
17003b705cfSriastradh			     const struct sna_composite_spans_op *op,
17103b705cfSriastradh			     const BoxRec *box,
17203b705cfSriastradh			     float opacity);
17303b705cfSriastradh	void (*boxes)(struct sna *sna,
17403b705cfSriastradh		      const struct sna_composite_spans_op *op,
17503b705cfSriastradh		      const BoxRec *box, int nbox,
17603b705cfSriastradh		      float opacity);
17703b705cfSriastradh
17803b705cfSriastradh	fastcall void (*thread_boxes)(struct sna *sna,
17903b705cfSriastradh				      const struct sna_composite_spans_op *op,
18003b705cfSriastradh				      const struct sna_opacity_box *box,
18103b705cfSriastradh				      int nbox);
18203b705cfSriastradh
18303b705cfSriastradh	fastcall void (*done)(struct sna *sna,
18403b705cfSriastradh			      const struct sna_composite_spans_op *op);
18503b705cfSriastradh
18603b705cfSriastradh	fastcall void (*prim_emit)(struct sna *sna,
18703b705cfSriastradh				   const struct sna_composite_spans_op *op,
18803b705cfSriastradh				   const BoxRec *box,
18903b705cfSriastradh				   float opacity);
19003b705cfSriastradh	fastcall void (*emit_boxes)(const struct sna_composite_spans_op *op,
19103b705cfSriastradh				    const struct sna_opacity_box *box, int nbox,
19203b705cfSriastradh				    float *v);
19303b705cfSriastradh};
19403b705cfSriastradh
19503b705cfSriastradhstruct sna_fill_op {
19603b705cfSriastradh	struct sna_composite_op base;
19703b705cfSriastradh
19803b705cfSriastradh	void (*blt)(struct sna *sna, const struct sna_fill_op *op,
19903b705cfSriastradh		    int16_t x, int16_t y, int16_t w, int16_t h);
20003b705cfSriastradh	fastcall void (*box)(struct sna *sna,
20103b705cfSriastradh			     const struct sna_fill_op *op,
20203b705cfSriastradh			     const BoxRec *box);
20303b705cfSriastradh	fastcall void (*boxes)(struct sna *sna,
20403b705cfSriastradh			       const struct sna_fill_op *op,
20503b705cfSriastradh			       const BoxRec *box,
20603b705cfSriastradh			       int count);
20742542f5fSchristos	fastcall void (*points)(struct sna *sna,
20842542f5fSchristos			       const struct sna_fill_op *op,
20942542f5fSchristos			       int16_t dx, int16_t dy,
21042542f5fSchristos			       const DDXPointRec *points,
21142542f5fSchristos			       int count);
21203b705cfSriastradh	void (*done)(struct sna *sna, const struct sna_fill_op *op);
21303b705cfSriastradh};
21403b705cfSriastradh
21503b705cfSriastradhstruct sna_copy_op {
21603b705cfSriastradh	struct sna_composite_op base;
21703b705cfSriastradh
21803b705cfSriastradh	void (*blt)(struct sna *sna, const struct sna_copy_op *op,
21903b705cfSriastradh		    int16_t sx, int16_t sy,
22003b705cfSriastradh		    int16_t w, int16_t h,
22103b705cfSriastradh		    int16_t dx, int16_t dy);
22203b705cfSriastradh	void (*done)(struct sna *sna, const struct sna_copy_op *op);
22303b705cfSriastradh};
22403b705cfSriastradh
22503b705cfSriastradhstruct sna_render {
22603b705cfSriastradh	pthread_mutex_t lock;
22703b705cfSriastradh	pthread_cond_t wait;
22803b705cfSriastradh	int active;
22903b705cfSriastradh
23003b705cfSriastradh	int max_3d_size;
23103b705cfSriastradh	int max_3d_pitch;
23203b705cfSriastradh
23303b705cfSriastradh	unsigned prefer_gpu;
23403b705cfSriastradh#define PREFER_GPU_BLT 0x1
23503b705cfSriastradh#define PREFER_GPU_RENDER 0x2
23603b705cfSriastradh#define PREFER_GPU_SPANS 0x4
23703b705cfSriastradh
23803b705cfSriastradh	bool (*composite)(struct sna *sna, uint8_t op,
23903b705cfSriastradh			  PicturePtr dst, PicturePtr src, PicturePtr mask,
24003b705cfSriastradh			  int16_t src_x, int16_t src_y,
24103b705cfSriastradh			  int16_t msk_x, int16_t msk_y,
24203b705cfSriastradh			  int16_t dst_x, int16_t dst_y,
24303b705cfSriastradh			  int16_t w, int16_t h,
24442542f5fSchristos			  unsigned flags,
24503b705cfSriastradh			  struct sna_composite_op *tmp);
246fe8aea9eSmrg#define COMPOSITE_PARTIAL	0x1
247fe8aea9eSmrg#define COMPOSITE_UPLOAD	0x40000000
248fe8aea9eSmrg#define COMPOSITE_FALLBACK	0x80000000
24903b705cfSriastradh
25003b705cfSriastradh	bool (*check_composite_spans)(struct sna *sna, uint8_t op,
25103b705cfSriastradh				      PicturePtr dst, PicturePtr src,
25203b705cfSriastradh				      int16_t w, int16_t h, unsigned flags);
25303b705cfSriastradh	bool (*composite_spans)(struct sna *sna, uint8_t op,
25403b705cfSriastradh				PicturePtr dst, PicturePtr src,
25503b705cfSriastradh				int16_t src_x, int16_t src_y,
25603b705cfSriastradh				int16_t dst_x, int16_t dst_y,
25703b705cfSriastradh				int16_t w, int16_t h,
25803b705cfSriastradh				unsigned flags,
25903b705cfSriastradh				struct sna_composite_spans_op *tmp);
26003b705cfSriastradh#define COMPOSITE_SPANS_RECTILINEAR 0x1
26103b705cfSriastradh#define COMPOSITE_SPANS_INPLACE_HINT 0x2
26203b705cfSriastradh
26303b705cfSriastradh	bool (*video)(struct sna *sna,
26403b705cfSriastradh		      struct sna_video *video,
26503b705cfSriastradh		      struct sna_video_frame *frame,
26603b705cfSriastradh		      RegionPtr dstRegion,
26703b705cfSriastradh		      PixmapPtr pixmap);
26803b705cfSriastradh
26903b705cfSriastradh	bool (*fill_boxes)(struct sna *sna,
27003b705cfSriastradh			   CARD8 op,
27103b705cfSriastradh			   PictFormat format,
27203b705cfSriastradh			   const xRenderColor *color,
27342542f5fSchristos			   const DrawableRec *dst, struct kgem_bo *dst_bo,
27403b705cfSriastradh			   const BoxRec *box, int n);
27503b705cfSriastradh	bool (*fill)(struct sna *sna, uint8_t alu,
27603b705cfSriastradh		     PixmapPtr dst, struct kgem_bo *dst_bo,
27742542f5fSchristos		     uint32_t color, unsigned flags,
27803b705cfSriastradh		     struct sna_fill_op *tmp);
27942542f5fSchristos#define FILL_BOXES 0x1
28042542f5fSchristos#define FILL_POINTS 0x2
28142542f5fSchristos#define FILL_SPANS 0x4
28203b705cfSriastradh	bool (*fill_one)(struct sna *sna, PixmapPtr dst, struct kgem_bo *dst_bo,
28303b705cfSriastradh			 uint32_t color,
28403b705cfSriastradh			 int16_t x1, int16_t y1, int16_t x2, int16_t y2,
28503b705cfSriastradh			 uint8_t alu);
28603b705cfSriastradh	bool (*clear)(struct sna *sna, PixmapPtr dst, struct kgem_bo *dst_bo);
28703b705cfSriastradh
28803b705cfSriastradh	bool (*copy_boxes)(struct sna *sna, uint8_t alu,
28942542f5fSchristos			   const DrawableRec *src, struct kgem_bo *src_bo, int16_t src_dx, int16_t src_dy,
29042542f5fSchristos			   const DrawableRec *dst, struct kgem_bo *dst_bo, int16_t dst_dx, int16_t dst_dy,
29103b705cfSriastradh			   const BoxRec *box, int n, unsigned flags);
29203b705cfSriastradh#define COPY_LAST 0x1
29303b705cfSriastradh#define COPY_SYNC 0x2
29442542f5fSchristos#define COPY_NO_OVERLAP 0x4
295fe8aea9eSmrg#define COPY_SMALL 0x8
296fe8aea9eSmrg#define COPY_DRI 0x10
29703b705cfSriastradh
29803b705cfSriastradh	bool (*copy)(struct sna *sna, uint8_t alu,
29903b705cfSriastradh		     PixmapPtr src, struct kgem_bo *src_bo,
30003b705cfSriastradh		     PixmapPtr dst, struct kgem_bo *dst_bo,
30103b705cfSriastradh		     struct sna_copy_op *op);
30203b705cfSriastradh
30303b705cfSriastradh	void (*flush)(struct sna *sna);
30403b705cfSriastradh	void (*reset)(struct sna *sna);
30503b705cfSriastradh	void (*fini)(struct sna *sna);
30603b705cfSriastradh
30703b705cfSriastradh	struct sna_alpha_cache {
30803b705cfSriastradh		struct kgem_bo *cache_bo;
30903b705cfSriastradh		struct kgem_bo *bo[256+7];
31003b705cfSriastradh	} alpha_cache;
31103b705cfSriastradh
31203b705cfSriastradh	struct sna_solid_cache {
31303b705cfSriastradh		struct kgem_bo *cache_bo;
31403b705cfSriastradh		struct kgem_bo *bo[1024];
31542542f5fSchristos		uint32_t color[1024];
31603b705cfSriastradh		int last;
31703b705cfSriastradh		int size;
31803b705cfSriastradh		int dirty;
31903b705cfSriastradh	} solid_cache;
32003b705cfSriastradh
32103b705cfSriastradh	struct {
32203b705cfSriastradh		struct sna_gradient_cache {
32303b705cfSriastradh			struct kgem_bo *bo;
32403b705cfSriastradh			int nstops;
32503b705cfSriastradh			PictGradientStop *stops;
32603b705cfSriastradh		} cache[GRADIENT_CACHE_SIZE];
32703b705cfSriastradh		int size;
32803b705cfSriastradh	} gradient_cache;
32903b705cfSriastradh
33003b705cfSriastradh	struct sna_glyph_cache{
33103b705cfSriastradh		PicturePtr picture;
33203b705cfSriastradh		struct sna_glyph **glyphs;
33303b705cfSriastradh		uint16_t count;
33403b705cfSriastradh		uint16_t evict;
33503b705cfSriastradh	} glyph[2];
33603b705cfSriastradh	pixman_image_t *white_image;
33703b705cfSriastradh	PicturePtr white_picture;
33803b705cfSriastradh
33903b705cfSriastradh	uint16_t vb_id;
34003b705cfSriastradh	uint16_t vertex_offset;
34103b705cfSriastradh	uint16_t vertex_start;
34203b705cfSriastradh	uint16_t vertex_index;
34303b705cfSriastradh	uint16_t vertex_used;
34403b705cfSriastradh	uint16_t vertex_size;
34503b705cfSriastradh	uint16_t vertex_reloc[16];
34603b705cfSriastradh	int nvertex_reloc;
34703b705cfSriastradh
34803b705cfSriastradh	struct kgem_bo *vbo;
34903b705cfSriastradh	float *vertices;
35003b705cfSriastradh
35103b705cfSriastradh	float vertex_data[1024];
35203b705cfSriastradh};
35303b705cfSriastradh
35403b705cfSriastradhstruct gen2_render_state {
35503b705cfSriastradh	uint32_t target;
35603b705cfSriastradh	bool need_invariant;
35703b705cfSriastradh	uint32_t logic_op_enabled;
35803b705cfSriastradh	uint32_t ls1, ls2, vft;
35903b705cfSriastradh	uint32_t diffuse;
36003b705cfSriastradh	uint32_t specular;
36103b705cfSriastradh};
36203b705cfSriastradh
36303b705cfSriastradhstruct gen3_render_state {
36403b705cfSriastradh	uint32_t current_dst;
36503b705cfSriastradh	bool need_invariant;
36603b705cfSriastradh	uint32_t tex_count;
36703b705cfSriastradh	uint32_t last_drawrect_limit;
36803b705cfSriastradh	uint32_t last_target;
36903b705cfSriastradh	uint32_t last_blend;
37003b705cfSriastradh	uint32_t last_constants;
37103b705cfSriastradh	uint32_t last_sampler;
37203b705cfSriastradh	uint32_t last_shader;
37303b705cfSriastradh	uint32_t last_diffuse;
37403b705cfSriastradh	uint32_t last_specular;
37503b705cfSriastradh
37603b705cfSriastradh	uint16_t last_vertex_offset;
37703b705cfSriastradh	uint16_t floats_per_vertex;
37803b705cfSriastradh	uint16_t last_floats_per_vertex;
37903b705cfSriastradh
38003b705cfSriastradh	uint32_t tex_map[4];
38103b705cfSriastradh	uint32_t tex_handle[2];
38203b705cfSriastradh	uint32_t tex_delta[2];
38303b705cfSriastradh};
38403b705cfSriastradh
38503b705cfSriastradhstruct gen4_render_state {
38603b705cfSriastradh	struct kgem_bo *general_bo;
38703b705cfSriastradh
38803b705cfSriastradh	uint32_t vs;
38903b705cfSriastradh	uint32_t sf;
39003b705cfSriastradh	uint32_t wm;
39103b705cfSriastradh	uint32_t cc;
39203b705cfSriastradh
39303b705cfSriastradh	int ve_id;
39403b705cfSriastradh	uint32_t drawrect_offset;
39503b705cfSriastradh	uint32_t drawrect_limit;
39603b705cfSriastradh	uint32_t last_pipelined_pointers;
39703b705cfSriastradh	uint16_t last_primitive;
39803b705cfSriastradh	int16_t floats_per_vertex;
39903b705cfSriastradh	uint16_t surface_table;
40003b705cfSriastradh
40103b705cfSriastradh	bool needs_invariant;
40203b705cfSriastradh	bool needs_urb;
40303b705cfSriastradh};
40403b705cfSriastradh
40503b705cfSriastradhstruct gen5_render_state {
40603b705cfSriastradh	struct kgem_bo *general_bo;
40703b705cfSriastradh
40803b705cfSriastradh	uint32_t vs;
40903b705cfSriastradh	uint32_t sf[2];
41003b705cfSriastradh	uint32_t wm;
41103b705cfSriastradh	uint32_t cc;
41203b705cfSriastradh
41303b705cfSriastradh	int ve_id;
41403b705cfSriastradh	uint32_t drawrect_offset;
41503b705cfSriastradh	uint32_t drawrect_limit;
41603b705cfSriastradh	uint32_t last_pipelined_pointers;
41703b705cfSriastradh	uint16_t last_primitive;
41803b705cfSriastradh	int16_t floats_per_vertex;
41903b705cfSriastradh	uint16_t surface_table;
42003b705cfSriastradh
42103b705cfSriastradh	bool needs_invariant;
42203b705cfSriastradh};
42303b705cfSriastradh
42403b705cfSriastradhenum {
42503b705cfSriastradh	GEN6_WM_KERNEL_NOMASK = 0,
42603b705cfSriastradh	GEN6_WM_KERNEL_NOMASK_P,
42703b705cfSriastradh
42803b705cfSriastradh	GEN6_WM_KERNEL_MASK,
42903b705cfSriastradh	GEN6_WM_KERNEL_MASK_P,
43003b705cfSriastradh
43103b705cfSriastradh	GEN6_WM_KERNEL_MASKCA,
43203b705cfSriastradh	GEN6_WM_KERNEL_MASKCA_P,
43303b705cfSriastradh
43403b705cfSriastradh	GEN6_WM_KERNEL_MASKSA,
43503b705cfSriastradh	GEN6_WM_KERNEL_MASKSA_P,
43603b705cfSriastradh
43703b705cfSriastradh	GEN6_WM_KERNEL_OPACITY,
43803b705cfSriastradh	GEN6_WM_KERNEL_OPACITY_P,
43903b705cfSriastradh
440fe8aea9eSmrg	GEN6_WM_KERNEL_VIDEO_PLANAR_BT601,
441fe8aea9eSmrg	GEN6_WM_KERNEL_VIDEO_NV12_BT601,
442fe8aea9eSmrg	GEN6_WM_KERNEL_VIDEO_PACKED_BT601,
443fe8aea9eSmrg
444fe8aea9eSmrg	GEN6_WM_KERNEL_VIDEO_PLANAR_BT709,
445fe8aea9eSmrg	GEN6_WM_KERNEL_VIDEO_NV12_BT709,
446fe8aea9eSmrg	GEN6_WM_KERNEL_VIDEO_PACKED_BT709,
447fe8aea9eSmrg
44803b705cfSriastradh	GEN6_KERNEL_COUNT
44903b705cfSriastradh};
45003b705cfSriastradh
45103b705cfSriastradhstruct gen6_render_state {
45242542f5fSchristos	unsigned gt;
45303b705cfSriastradh	const struct gt_info *info;
45403b705cfSriastradh	struct kgem_bo *general_bo;
45503b705cfSriastradh
45603b705cfSriastradh	uint32_t vs_state;
45703b705cfSriastradh	uint32_t sf_state;
45803b705cfSriastradh	uint32_t sf_mask_state;
45903b705cfSriastradh	uint32_t wm_state;
46003b705cfSriastradh	uint32_t wm_kernel[GEN6_KERNEL_COUNT][3];
46103b705cfSriastradh
46203b705cfSriastradh	uint32_t cc_blend;
46303b705cfSriastradh
46403b705cfSriastradh	uint32_t drawrect_offset;
46503b705cfSriastradh	uint32_t drawrect_limit;
46603b705cfSriastradh	uint32_t blend;
46703b705cfSriastradh	uint32_t samplers;
46803b705cfSriastradh	uint32_t kernel;
46903b705cfSriastradh
47003b705cfSriastradh	uint16_t num_sf_outputs;
47103b705cfSriastradh	uint16_t ve_id;
47203b705cfSriastradh	uint16_t last_primitive;
47303b705cfSriastradh	int16_t floats_per_vertex;
47403b705cfSriastradh	uint16_t surface_table;
47503b705cfSriastradh
47603b705cfSriastradh	bool needs_invariant;
47703b705cfSriastradh	bool first_state_packet;
47803b705cfSriastradh};
47903b705cfSriastradh
48003b705cfSriastradhenum {
48103b705cfSriastradh	GEN7_WM_KERNEL_NOMASK = 0,
48203b705cfSriastradh	GEN7_WM_KERNEL_NOMASK_P,
48303b705cfSriastradh
48403b705cfSriastradh	GEN7_WM_KERNEL_MASK,
48503b705cfSriastradh	GEN7_WM_KERNEL_MASK_P,
48603b705cfSriastradh
48703b705cfSriastradh	GEN7_WM_KERNEL_MASKCA,
48803b705cfSriastradh	GEN7_WM_KERNEL_MASKCA_P,
48903b705cfSriastradh
49003b705cfSriastradh	GEN7_WM_KERNEL_MASKSA,
49103b705cfSriastradh	GEN7_WM_KERNEL_MASKSA_P,
49203b705cfSriastradh
49303b705cfSriastradh	GEN7_WM_KERNEL_OPACITY,
49403b705cfSriastradh	GEN7_WM_KERNEL_OPACITY_P,
49503b705cfSriastradh
496fe8aea9eSmrg	GEN7_WM_KERNEL_VIDEO_PLANAR_BT601,
497fe8aea9eSmrg	GEN7_WM_KERNEL_VIDEO_NV12_BT601,
498fe8aea9eSmrg	GEN7_WM_KERNEL_VIDEO_PACKED_BT601,
499fe8aea9eSmrg
500fe8aea9eSmrg	GEN7_WM_KERNEL_VIDEO_PLANAR_BT709,
501fe8aea9eSmrg	GEN7_WM_KERNEL_VIDEO_NV12_BT709,
502fe8aea9eSmrg	GEN7_WM_KERNEL_VIDEO_PACKED_BT709,
503fe8aea9eSmrg
504fe8aea9eSmrg	GEN7_WM_KERNEL_VIDEO_RGB,
50503b705cfSriastradh	GEN7_WM_KERNEL_COUNT
50603b705cfSriastradh};
50703b705cfSriastradh
50803b705cfSriastradhstruct gen7_render_state {
50942542f5fSchristos	unsigned gt;
51003b705cfSriastradh	const struct gt_info *info;
51103b705cfSriastradh	struct kgem_bo *general_bo;
51203b705cfSriastradh
51303b705cfSriastradh	uint32_t vs_state;
51403b705cfSriastradh	uint32_t sf_state;
51503b705cfSriastradh	uint32_t sf_mask_state;
51603b705cfSriastradh	uint32_t wm_state;
51703b705cfSriastradh	uint32_t wm_kernel[GEN7_WM_KERNEL_COUNT][3];
51803b705cfSriastradh
51903b705cfSriastradh	uint32_t cc_blend;
52003b705cfSriastradh
52103b705cfSriastradh	uint32_t drawrect_offset;
52203b705cfSriastradh	uint32_t drawrect_limit;
52303b705cfSriastradh	uint32_t blend;
52403b705cfSriastradh	uint32_t samplers;
52503b705cfSriastradh	uint32_t kernel;
52603b705cfSriastradh
52703b705cfSriastradh	uint16_t num_sf_outputs;
52803b705cfSriastradh	uint16_t ve_id;
52903b705cfSriastradh	uint16_t last_primitive;
53003b705cfSriastradh	int16_t floats_per_vertex;
53103b705cfSriastradh	uint16_t surface_table;
53213496ba1Ssnj	uint16_t pipe_controls_since_stall;
53303b705cfSriastradh
53403b705cfSriastradh	bool needs_invariant;
53503b705cfSriastradh	bool emit_flush;
53603b705cfSriastradh};
53703b705cfSriastradh
53842542f5fSchristos
53942542f5fSchristosenum {
54042542f5fSchristos	GEN8_WM_KERNEL_NOMASK = 0,
54142542f5fSchristos	GEN8_WM_KERNEL_NOMASK_P,
54242542f5fSchristos
54342542f5fSchristos	GEN8_WM_KERNEL_MASK,
54442542f5fSchristos	GEN8_WM_KERNEL_MASK_P,
54542542f5fSchristos
54642542f5fSchristos	GEN8_WM_KERNEL_MASKCA,
54742542f5fSchristos	GEN8_WM_KERNEL_MASKCA_P,
54842542f5fSchristos
54942542f5fSchristos	GEN8_WM_KERNEL_MASKSA,
55042542f5fSchristos	GEN8_WM_KERNEL_MASKSA_P,
55142542f5fSchristos
55242542f5fSchristos	GEN8_WM_KERNEL_OPACITY,
55342542f5fSchristos	GEN8_WM_KERNEL_OPACITY_P,
55442542f5fSchristos
555fe8aea9eSmrg	GEN8_WM_KERNEL_VIDEO_PLANAR_BT601,
556fe8aea9eSmrg	GEN8_WM_KERNEL_VIDEO_NV12_BT601,
557fe8aea9eSmrg	GEN8_WM_KERNEL_VIDEO_PACKED_BT601,
558fe8aea9eSmrg
559fe8aea9eSmrg	GEN8_WM_KERNEL_VIDEO_PLANAR_BT709,
560fe8aea9eSmrg	GEN8_WM_KERNEL_VIDEO_NV12_BT709,
561fe8aea9eSmrg	GEN8_WM_KERNEL_VIDEO_PACKED_BT709,
562fe8aea9eSmrg
563fe8aea9eSmrg	GEN8_WM_KERNEL_VIDEO_RGB,
56442542f5fSchristos	GEN8_WM_KERNEL_COUNT
56542542f5fSchristos};
56642542f5fSchristos
56742542f5fSchristosstruct gen8_render_state {
56842542f5fSchristos	unsigned gt;
569fe8aea9eSmrg	const struct gt_info *info;
57042542f5fSchristos	struct kgem_bo *general_bo;
57142542f5fSchristos
57242542f5fSchristos	uint32_t vs_state;
57342542f5fSchristos	uint32_t sf_state;
57442542f5fSchristos	uint32_t sf_mask_state;
57542542f5fSchristos	uint32_t wm_state;
57642542f5fSchristos	uint32_t wm_kernel[GEN8_WM_KERNEL_COUNT][3];
57742542f5fSchristos
57842542f5fSchristos	uint32_t cc_blend;
57942542f5fSchristos
58042542f5fSchristos	uint32_t drawrect_offset;
58142542f5fSchristos	uint32_t drawrect_limit;
58242542f5fSchristos	uint32_t blend;
58342542f5fSchristos	uint32_t samplers;
58442542f5fSchristos	uint32_t kernel;
58542542f5fSchristos
58642542f5fSchristos	uint16_t num_sf_outputs;
58742542f5fSchristos	uint16_t ve_id;
58842542f5fSchristos	uint16_t last_primitive;
58942542f5fSchristos	int16_t floats_per_vertex;
59042542f5fSchristos	uint16_t surface_table;
59142542f5fSchristos
59242542f5fSchristos	bool needs_invariant;
59342542f5fSchristos	bool emit_flush;
59442542f5fSchristos};
59542542f5fSchristos
596fe8aea9eSmrgenum {
597fe8aea9eSmrg	GEN9_WM_KERNEL_NOMASK = 0,
598fe8aea9eSmrg	GEN9_WM_KERNEL_NOMASK_P,
599fe8aea9eSmrg
600fe8aea9eSmrg	GEN9_WM_KERNEL_MASK,
601fe8aea9eSmrg	GEN9_WM_KERNEL_MASK_P,
602fe8aea9eSmrg
603fe8aea9eSmrg	GEN9_WM_KERNEL_MASKCA,
604fe8aea9eSmrg	GEN9_WM_KERNEL_MASKCA_P,
605fe8aea9eSmrg
606fe8aea9eSmrg	GEN9_WM_KERNEL_MASKSA,
607fe8aea9eSmrg	GEN9_WM_KERNEL_MASKSA_P,
608fe8aea9eSmrg
609fe8aea9eSmrg	GEN9_WM_KERNEL_OPACITY,
610fe8aea9eSmrg	GEN9_WM_KERNEL_OPACITY_P,
611fe8aea9eSmrg
612fe8aea9eSmrg	GEN9_WM_KERNEL_VIDEO_PLANAR_BT601,
613fe8aea9eSmrg	GEN9_WM_KERNEL_VIDEO_NV12_BT601,
614fe8aea9eSmrg	GEN9_WM_KERNEL_VIDEO_PACKED_BT601,
615fe8aea9eSmrg
616fe8aea9eSmrg	GEN9_WM_KERNEL_VIDEO_PLANAR_BT709,
617fe8aea9eSmrg	GEN9_WM_KERNEL_VIDEO_NV12_BT709,
618fe8aea9eSmrg	GEN9_WM_KERNEL_VIDEO_PACKED_BT709,
619fe8aea9eSmrg
620fe8aea9eSmrg	GEN9_WM_KERNEL_VIDEO_AYUV_BT601,
621fe8aea9eSmrg	GEN9_WM_KERNEL_VIDEO_AYUV_BT709,
622fe8aea9eSmrg
623fe8aea9eSmrg	GEN9_WM_KERNEL_VIDEO_RGB,
624fe8aea9eSmrg	GEN9_WM_KERNEL_COUNT
625fe8aea9eSmrg};
626fe8aea9eSmrg
627fe8aea9eSmrgstruct gen9_render_state {
628fe8aea9eSmrg	unsigned gt;
629fe8aea9eSmrg	const struct gt_info *info;
630fe8aea9eSmrg	struct kgem_bo *general_bo;
631fe8aea9eSmrg
632fe8aea9eSmrg	uint32_t vs_state;
633fe8aea9eSmrg	uint32_t sf_state;
634fe8aea9eSmrg	uint32_t sf_mask_state;
635fe8aea9eSmrg	uint32_t wm_state;
636fe8aea9eSmrg	uint32_t wm_kernel[GEN9_WM_KERNEL_COUNT][3];
637fe8aea9eSmrg
638fe8aea9eSmrg	uint32_t cc_blend;
639fe8aea9eSmrg
640fe8aea9eSmrg	uint32_t drawrect_offset;
641fe8aea9eSmrg	uint32_t drawrect_limit;
642fe8aea9eSmrg	uint32_t blend;
643fe8aea9eSmrg	uint32_t samplers;
644fe8aea9eSmrg	uint32_t kernel;
645fe8aea9eSmrg
646fe8aea9eSmrg	uint16_t num_sf_outputs;
647fe8aea9eSmrg	uint16_t ve_id;
648fe8aea9eSmrg	uint16_t last_primitive;
649fe8aea9eSmrg	int16_t floats_per_vertex;
650fe8aea9eSmrg	uint16_t surface_table;
651fe8aea9eSmrg
652fe8aea9eSmrg	bool needs_invariant;
653fe8aea9eSmrg	bool emit_flush;
654fe8aea9eSmrg	bool ve_dirty;
655fe8aea9eSmrg};
656fe8aea9eSmrg
65703b705cfSriastradhstruct sna_static_stream {
65803b705cfSriastradh	uint32_t size, used;
65903b705cfSriastradh	uint8_t *data;
66003b705cfSriastradh};
66103b705cfSriastradh
66203b705cfSriastradhint sna_static_stream_init(struct sna_static_stream *stream);
66303b705cfSriastradhuint32_t sna_static_stream_add(struct sna_static_stream *stream,
66403b705cfSriastradh			       const void *data, uint32_t len, uint32_t align);
66503b705cfSriastradhvoid *sna_static_stream_map(struct sna_static_stream *stream,
66603b705cfSriastradh			    uint32_t len, uint32_t align);
66703b705cfSriastradhuint32_t sna_static_stream_offsetof(struct sna_static_stream *stream,
66803b705cfSriastradh				    void *ptr);
66903b705cfSriastradhunsigned sna_static_stream_compile_sf(struct sna *sna,
67003b705cfSriastradh				      struct sna_static_stream *stream,
67103b705cfSriastradh				      bool (*compile)(struct brw_compile *));
67203b705cfSriastradh
67303b705cfSriastradhunsigned sna_static_stream_compile_wm(struct sna *sna,
67403b705cfSriastradh				      struct sna_static_stream *stream,
67503b705cfSriastradh				      bool (*compile)(struct brw_compile *, int),
67603b705cfSriastradh				      int width);
67703b705cfSriastradhstruct kgem_bo *sna_static_stream_fini(struct sna *sna,
67803b705cfSriastradh				       struct sna_static_stream *stream);
67903b705cfSriastradh
68003b705cfSriastradhstruct kgem_bo *
68103b705cfSriastradhsna_render_get_solid(struct sna *sna,
68203b705cfSriastradh		     uint32_t color);
68303b705cfSriastradh
68403b705cfSriastradhvoid
68503b705cfSriastradhsna_render_flush_solid(struct sna *sna);
68603b705cfSriastradh
68703b705cfSriastradhstruct kgem_bo *
68803b705cfSriastradhsna_render_get_gradient(struct sna *sna,
68903b705cfSriastradh			PictGradient *pattern);
69003b705cfSriastradh
69103b705cfSriastradhbool
69203b705cfSriastradhsna_gradient_is_opaque(const PictGradient *gradient);
69303b705cfSriastradh
69403b705cfSriastradhuint32_t sna_rgba_for_color(uint32_t color, int depth);
69503b705cfSriastradhuint32_t sna_rgba_to_color(uint32_t rgba, uint32_t format);
69603b705cfSriastradhbool sna_get_rgba_from_pixel(uint32_t pixel,
69703b705cfSriastradh			     uint16_t *red,
69803b705cfSriastradh			     uint16_t *green,
69903b705cfSriastradh			     uint16_t *blue,
70003b705cfSriastradh			     uint16_t *alpha,
70103b705cfSriastradh			     uint32_t format);
70203b705cfSriastradhbool sna_picture_is_solid(PicturePtr picture, uint32_t *color);
70303b705cfSriastradh
70403b705cfSriastradhconst char *no_render_init(struct sna *sna);
70503b705cfSriastradhconst char *gen2_render_init(struct sna *sna, const char *backend);
70603b705cfSriastradhconst char *gen3_render_init(struct sna *sna, const char *backend);
70703b705cfSriastradhconst char *gen4_render_init(struct sna *sna, const char *backend);
70803b705cfSriastradhconst char *gen5_render_init(struct sna *sna, const char *backend);
70903b705cfSriastradhconst char *gen6_render_init(struct sna *sna, const char *backend);
71003b705cfSriastradhconst char *gen7_render_init(struct sna *sna, const char *backend);
71142542f5fSchristosconst char *gen8_render_init(struct sna *sna, const char *backend);
712fe8aea9eSmrgconst char *gen9_render_init(struct sna *sna, const char *backend);
71303b705cfSriastradh
71413496ba1Ssnjvoid sna_render_mark_wedged(struct sna *sna);
71513496ba1Ssnj
71603b705cfSriastradhbool sna_tiling_composite(uint32_t op,
71703b705cfSriastradh			  PicturePtr src,
71803b705cfSriastradh			  PicturePtr mask,
71903b705cfSriastradh			  PicturePtr dst,
72003b705cfSriastradh			  int16_t src_x, int16_t src_y,
72103b705cfSriastradh			  int16_t mask_x, int16_t mask_y,
72203b705cfSriastradh			  int16_t dst_x, int16_t dst_y,
72303b705cfSriastradh			  int16_t width, int16_t height,
72403b705cfSriastradh			  struct sna_composite_op *tmp);
72503b705cfSriastradhbool sna_tiling_composite_spans(uint32_t op,
72603b705cfSriastradh				PicturePtr src,
72703b705cfSriastradh				PicturePtr dst,
72803b705cfSriastradh				int16_t src_x,  int16_t src_y,
72903b705cfSriastradh				int16_t dst_x,  int16_t dst_y,
73003b705cfSriastradh				int16_t width,  int16_t height,
73103b705cfSriastradh				unsigned flags,
73203b705cfSriastradh				struct sna_composite_spans_op *tmp);
73303b705cfSriastradhbool sna_tiling_fill_boxes(struct sna *sna,
73403b705cfSriastradh			   CARD8 op,
73503b705cfSriastradh			   PictFormat format,
73603b705cfSriastradh			   const xRenderColor *color,
73742542f5fSchristos			   const DrawableRec *dst, struct kgem_bo *dst_bo,
73803b705cfSriastradh			   const BoxRec *box, int n);
73903b705cfSriastradh
74003b705cfSriastradhbool sna_tiling_copy_boxes(struct sna *sna, uint8_t alu,
74142542f5fSchristos			   const DrawableRec *src, struct kgem_bo *src_bo, int16_t src_dx, int16_t src_dy,
74242542f5fSchristos			   const DrawableRec *dst, struct kgem_bo *dst_bo, int16_t dst_dx, int16_t dst_dy,
74303b705cfSriastradh			   const BoxRec *box, int n);
74403b705cfSriastradh
74503b705cfSriastradhbool sna_tiling_blt_copy_boxes(struct sna *sna, uint8_t alu,
74603b705cfSriastradh			       struct kgem_bo *src_bo, int16_t src_dx, int16_t src_dy,
74703b705cfSriastradh			       struct kgem_bo *dst_bo, int16_t dst_dx, int16_t dst_dy,
74803b705cfSriastradh			       int bpp, const BoxRec *box, int nbox);
74903b705cfSriastradh
75042542f5fSchristosbool sna_tiling_blt_composite(struct sna *sna,
75142542f5fSchristos			      struct sna_composite_op *op,
75242542f5fSchristos			      struct kgem_bo *bo,
75342542f5fSchristos			      int bpp,
75442542f5fSchristos			      uint32_t alpha_fixup);
75542542f5fSchristos
75603b705cfSriastradhbool sna_blt_composite(struct sna *sna,
75703b705cfSriastradh		       uint32_t op,
75803b705cfSriastradh		       PicturePtr src,
75903b705cfSriastradh		       PicturePtr dst,
76003b705cfSriastradh		       int16_t src_x, int16_t src_y,
76103b705cfSriastradh		       int16_t dst_x, int16_t dst_y,
76203b705cfSriastradh		       int16_t width, int16_t height,
76342542f5fSchristos		       unsigned flags,
76442542f5fSchristos		       struct sna_composite_op *tmp);
76503b705cfSriastradhbool sna_blt_composite__convert(struct sna *sna,
76603b705cfSriastradh				int x, int y,
76703b705cfSriastradh				int width, int height,
76803b705cfSriastradh				struct sna_composite_op *tmp);
76903b705cfSriastradh
77003b705cfSriastradhbool sna_blt_fill(struct sna *sna, uint8_t alu,
77103b705cfSriastradh		  struct kgem_bo *bo,
77203b705cfSriastradh		  int bpp,
77303b705cfSriastradh		  uint32_t pixel,
77403b705cfSriastradh		  struct sna_fill_op *fill);
77503b705cfSriastradh
77603b705cfSriastradhbool sna_blt_copy(struct sna *sna, uint8_t alu,
77703b705cfSriastradh		  struct kgem_bo *src,
77803b705cfSriastradh		  struct kgem_bo *dst,
77903b705cfSriastradh		  int bpp,
78003b705cfSriastradh		  struct sna_copy_op *copy);
78103b705cfSriastradh
78203b705cfSriastradhbool sna_blt_fill_boxes(struct sna *sna, uint8_t alu,
78303b705cfSriastradh			struct kgem_bo *bo,
78403b705cfSriastradh			int bpp,
78503b705cfSriastradh			uint32_t pixel,
78603b705cfSriastradh			const BoxRec *box, int n);
78703b705cfSriastradh
78803b705cfSriastradhbool sna_blt_copy_boxes(struct sna *sna, uint8_t alu,
78903b705cfSriastradh			struct kgem_bo *src_bo, int16_t src_dx, int16_t src_dy,
79003b705cfSriastradh			struct kgem_bo *dst_bo, int16_t dst_dx, int16_t dst_dy,
79103b705cfSriastradh			int bpp,
79203b705cfSriastradh			const BoxRec *box, int n);
79342542f5fSchristosbool sna_blt_copy_boxes__with_alpha(struct sna *sna, uint8_t alu,
79442542f5fSchristos				    struct kgem_bo *src_bo, int16_t src_dx, int16_t src_dy,
79542542f5fSchristos				    struct kgem_bo *dst_bo, int16_t dst_dx, int16_t dst_dy,
79642542f5fSchristos				    int bpp, int alpha_fixup,
79742542f5fSchristos				    const BoxRec *box, int nbox);
79803b705cfSriastradhbool sna_blt_copy_boxes_fallback(struct sna *sna, uint8_t alu,
79942542f5fSchristos				 const DrawableRec *src, struct kgem_bo *src_bo, int16_t src_dx, int16_t src_dy,
80042542f5fSchristos				 const DrawableRec *dst, struct kgem_bo *dst_bo, int16_t dst_dx, int16_t dst_dy,
80103b705cfSriastradh				 const BoxRec *box, int nbox);
80203b705cfSriastradh
80313496ba1Ssnjbool memcpy_copy_boxes(struct sna *sna, uint8_t op,
80413496ba1Ssnj		       const DrawableRec *src_draw, struct kgem_bo *src_bo, int16_t sx, int16_t sy,
80513496ba1Ssnj		       const DrawableRec *dst_draw, struct kgem_bo *dst_bo, int16_t dx, int16_t dy,
80613496ba1Ssnj		       const BoxRec *box, int n, unsigned flags);
80713496ba1Ssnj
80803b705cfSriastradhbool _sna_get_pixel_from_rgba(uint32_t *pixel,
80903b705cfSriastradh			     uint16_t red,
81003b705cfSriastradh			     uint16_t green,
81103b705cfSriastradh			     uint16_t blue,
81203b705cfSriastradh			     uint16_t alpha,
81303b705cfSriastradh			     uint32_t format);
81403b705cfSriastradh
81503b705cfSriastradhstatic inline bool
81603b705cfSriastradhsna_get_pixel_from_rgba(uint32_t * pixel,
81703b705cfSriastradh			uint16_t red,
81803b705cfSriastradh			uint16_t green,
81903b705cfSriastradh			uint16_t blue,
82003b705cfSriastradh			uint16_t alpha,
82103b705cfSriastradh			uint32_t format)
82203b705cfSriastradh{
82303b705cfSriastradh	switch (format) {
82403b705cfSriastradh	case PICT_x8r8g8b8:
82503b705cfSriastradh		alpha = 0xffff;
82603b705cfSriastradh		/* fall through to re-use a8r8g8b8 expansion */
82703b705cfSriastradh	case PICT_a8r8g8b8:
82803b705cfSriastradh		*pixel = ((alpha >> 8 << 24) |
82903b705cfSriastradh			  (red >> 8 << 16) |
83003b705cfSriastradh			  (green & 0xff00) |
83103b705cfSriastradh			  (blue >> 8));
83203b705cfSriastradh		return TRUE;
83303b705cfSriastradh	case PICT_a8:
83403b705cfSriastradh		*pixel = alpha >> 8;
83503b705cfSriastradh		return TRUE;
83603b705cfSriastradh	}
83703b705cfSriastradh
83803b705cfSriastradh	return _sna_get_pixel_from_rgba(pixel, red, green, blue, alpha, format);
83903b705cfSriastradh}
84003b705cfSriastradh
84103b705cfSriastradhstruct kgem_bo *
84203b705cfSriastradh__sna_render_pixmap_bo(struct sna *sna,
84303b705cfSriastradh		       PixmapPtr pixmap,
84403b705cfSriastradh		       const BoxRec *box,
84503b705cfSriastradh		       bool blt);
84603b705cfSriastradh
84703b705cfSriastradhint
84803b705cfSriastradhsna_render_pixmap_bo(struct sna *sna,
84903b705cfSriastradh		     struct sna_composite_channel *channel,
85003b705cfSriastradh		     PixmapPtr pixmap,
85103b705cfSriastradh		     int16_t x, int16_t y,
85203b705cfSriastradh		     int16_t w, int16_t h,
85303b705cfSriastradh		     int16_t dst_x, int16_t dst_y);
85403b705cfSriastradh
85503b705cfSriastradhbool
85603b705cfSriastradhsna_render_pixmap_partial(struct sna *sna,
85742542f5fSchristos			  const DrawableRec *draw,
85803b705cfSriastradh			  struct kgem_bo *bo,
85903b705cfSriastradh			  struct sna_composite_channel *channel,
86003b705cfSriastradh			  int16_t x, int16_t y,
86103b705cfSriastradh			  int16_t w, int16_t h);
86203b705cfSriastradh
86303b705cfSriastradhint
86403b705cfSriastradhsna_render_picture_extract(struct sna *sna,
86503b705cfSriastradh			   PicturePtr picture,
86603b705cfSriastradh			   struct sna_composite_channel *channel,
86703b705cfSriastradh			   int16_t x, int16_t y,
86803b705cfSriastradh			   int16_t w, int16_t h,
86903b705cfSriastradh			   int16_t dst_x, int16_t dst_y);
87003b705cfSriastradh
87103b705cfSriastradhint
87203b705cfSriastradhsna_render_picture_approximate_gradient(struct sna *sna,
87303b705cfSriastradh					PicturePtr picture,
87403b705cfSriastradh					struct sna_composite_channel *channel,
87503b705cfSriastradh					int16_t x, int16_t y,
87603b705cfSriastradh					int16_t w, int16_t h,
87703b705cfSriastradh					int16_t dst_x, int16_t dst_y);
87803b705cfSriastradh
87903b705cfSriastradhint
88003b705cfSriastradhsna_render_picture_fixup(struct sna *sna,
88103b705cfSriastradh			 PicturePtr picture,
88203b705cfSriastradh			 struct sna_composite_channel *channel,
88303b705cfSriastradh			 int16_t x, int16_t y,
88403b705cfSriastradh			 int16_t w, int16_t h,
88503b705cfSriastradh			 int16_t dst_x, int16_t dst_y);
88603b705cfSriastradh
88703b705cfSriastradhint
88803b705cfSriastradhsna_render_picture_convert(struct sna *sna,
88903b705cfSriastradh			   PicturePtr picture,
89003b705cfSriastradh			   struct sna_composite_channel *channel,
89103b705cfSriastradh			   PixmapPtr pixmap,
89203b705cfSriastradh			   int16_t x, int16_t y,
89303b705cfSriastradh			   int16_t w, int16_t h,
89403b705cfSriastradh			   int16_t dst_x, int16_t dst_y,
89503b705cfSriastradh			   bool fixup_alpha);
89603b705cfSriastradh
89703b705cfSriastradhinline static void sna_render_composite_redirect_init(struct sna_composite_op *op)
89803b705cfSriastradh{
89903b705cfSriastradh	struct sna_composite_redirect *t = &op->redirect;
90003b705cfSriastradh	t->real_bo = NULL;
90103b705cfSriastradh	t->damage = NULL;
90203b705cfSriastradh}
90303b705cfSriastradh
90403b705cfSriastradhbool
90503b705cfSriastradhsna_render_composite_redirect(struct sna *sna,
90603b705cfSriastradh			      struct sna_composite_op *op,
90703b705cfSriastradh			      int x, int y, int width, int height,
90803b705cfSriastradh			      bool partial);
90903b705cfSriastradh
91003b705cfSriastradhvoid
91103b705cfSriastradhsna_render_composite_redirect_done(struct sna *sna,
91203b705cfSriastradh				   const struct sna_composite_op *op);
91303b705cfSriastradh
91403b705cfSriastradhbool
91503b705cfSriastradhsna_render_copy_boxes__overlap(struct sna *sna, uint8_t alu,
91642542f5fSchristos			       const DrawableRec *draw, struct kgem_bo *bo,
91742542f5fSchristos			       int16_t src_dx, int16_t src_dy,
91842542f5fSchristos			       int16_t dst_dx, int16_t dst_dy,
91903b705cfSriastradh			       const BoxRec *box, int n, const BoxRec *extents);
92003b705cfSriastradh
92103b705cfSriastradhbool
92203b705cfSriastradhsna_composite_mask_is_opaque(PicturePtr mask);
92303b705cfSriastradh
92403b705cfSriastradhvoid sna_vertex_init(struct sna *sna);
92503b705cfSriastradh
92603b705cfSriastradhstatic inline void sna_vertex_lock(struct sna_render *r)
92703b705cfSriastradh{
92803b705cfSriastradh	pthread_mutex_lock(&r->lock);
92903b705cfSriastradh}
93003b705cfSriastradh
93103b705cfSriastradhstatic inline void sna_vertex_acquire__locked(struct sna_render *r)
93203b705cfSriastradh{
93303b705cfSriastradh	r->active++;
93403b705cfSriastradh}
93503b705cfSriastradh
93603b705cfSriastradhstatic inline void sna_vertex_unlock(struct sna_render *r)
93703b705cfSriastradh{
93803b705cfSriastradh	pthread_mutex_unlock(&r->lock);
93903b705cfSriastradh}
94003b705cfSriastradh
94103b705cfSriastradhstatic inline void sna_vertex_release__locked(struct sna_render *r)
94203b705cfSriastradh{
94303b705cfSriastradh	assert(r->active > 0);
94403b705cfSriastradh	if (--r->active == 0)
94503b705cfSriastradh		pthread_cond_signal(&r->wait);
94603b705cfSriastradh}
94703b705cfSriastradh
94803b705cfSriastradhstatic inline bool sna_vertex_wait__locked(struct sna_render *r)
94903b705cfSriastradh{
95003b705cfSriastradh	bool was_active = r->active;
95103b705cfSriastradh	while (r->active)
95203b705cfSriastradh		pthread_cond_wait(&r->wait, &r->lock);
95303b705cfSriastradh	return was_active;
95403b705cfSriastradh}
95503b705cfSriastradh
95603b705cfSriastradh#define alphaless(format) PICT_FORMAT(PICT_FORMAT_BPP(format),		\
95703b705cfSriastradh				      PICT_FORMAT_TYPE(format),		\
95803b705cfSriastradh				      0,				\
95903b705cfSriastradh				      PICT_FORMAT_R(format),		\
96003b705cfSriastradh				      PICT_FORMAT_G(format),		\
96103b705cfSriastradh				      PICT_FORMAT_B(format))
96203b705cfSriastradh
96303b705cfSriastradh#endif /* SNA_RENDER_H */
964