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