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