sna_render.h revision 03b705cf
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 { 4703b705cfSriastradh PixmapPtr pixmap; 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; 11603b705cfSriastradh 11703b705cfSriastradh uint32_t cmd; 11803b705cfSriastradh uint32_t br13; 11903b705cfSriastradh uint32_t pitch[2]; 12003b705cfSriastradh uint32_t pixel; 12103b705cfSriastradh struct kgem_bo *bo[2]; 12203b705cfSriastradh } blt; 12303b705cfSriastradh 12403b705cfSriastradh struct { 12503b705cfSriastradh float constants[8]; 12603b705cfSriastradh uint32_t num_constants; 12703b705cfSriastradh } gen3; 12803b705cfSriastradh 12903b705cfSriastradh struct { 13003b705cfSriastradh int wm_kernel; 13103b705cfSriastradh int ve_id; 13203b705cfSriastradh } gen4; 13303b705cfSriastradh 13403b705cfSriastradh struct { 13503b705cfSriastradh int16_t wm_kernel; 13603b705cfSriastradh int16_t ve_id; 13703b705cfSriastradh } gen5; 13803b705cfSriastradh 13903b705cfSriastradh struct { 14003b705cfSriastradh uint32_t flags; 14103b705cfSriastradh } gen6; 14203b705cfSriastradh 14303b705cfSriastradh struct { 14403b705cfSriastradh uint32_t flags; 14503b705cfSriastradh } gen7; 14603b705cfSriastradh } u; 14703b705cfSriastradh 14803b705cfSriastradh void *priv; 14903b705cfSriastradh}; 15003b705cfSriastradh 15103b705cfSriastradhstruct sna_opacity_box { 15203b705cfSriastradh BoxRec box; 15303b705cfSriastradh float alpha; 15403b705cfSriastradh} tightly_packed; 15503b705cfSriastradh 15603b705cfSriastradhstruct sna_composite_spans_op { 15703b705cfSriastradh struct sna_composite_op base; 15803b705cfSriastradh 15903b705cfSriastradh fastcall void (*box)(struct sna *sna, 16003b705cfSriastradh const struct sna_composite_spans_op *op, 16103b705cfSriastradh const BoxRec *box, 16203b705cfSriastradh float opacity); 16303b705cfSriastradh void (*boxes)(struct sna *sna, 16403b705cfSriastradh const struct sna_composite_spans_op *op, 16503b705cfSriastradh const BoxRec *box, int nbox, 16603b705cfSriastradh float opacity); 16703b705cfSriastradh 16803b705cfSriastradh fastcall void (*thread_boxes)(struct sna *sna, 16903b705cfSriastradh const struct sna_composite_spans_op *op, 17003b705cfSriastradh const struct sna_opacity_box *box, 17103b705cfSriastradh int nbox); 17203b705cfSriastradh 17303b705cfSriastradh fastcall void (*done)(struct sna *sna, 17403b705cfSriastradh const struct sna_composite_spans_op *op); 17503b705cfSriastradh 17603b705cfSriastradh fastcall void (*prim_emit)(struct sna *sna, 17703b705cfSriastradh const struct sna_composite_spans_op *op, 17803b705cfSriastradh const BoxRec *box, 17903b705cfSriastradh float opacity); 18003b705cfSriastradh fastcall void (*emit_boxes)(const struct sna_composite_spans_op *op, 18103b705cfSriastradh const struct sna_opacity_box *box, int nbox, 18203b705cfSriastradh float *v); 18303b705cfSriastradh}; 18403b705cfSriastradh 18503b705cfSriastradhstruct sna_fill_op { 18603b705cfSriastradh struct sna_composite_op base; 18703b705cfSriastradh 18803b705cfSriastradh void (*blt)(struct sna *sna, const struct sna_fill_op *op, 18903b705cfSriastradh int16_t x, int16_t y, int16_t w, int16_t h); 19003b705cfSriastradh fastcall void (*box)(struct sna *sna, 19103b705cfSriastradh const struct sna_fill_op *op, 19203b705cfSriastradh const BoxRec *box); 19303b705cfSriastradh fastcall void (*boxes)(struct sna *sna, 19403b705cfSriastradh const struct sna_fill_op *op, 19503b705cfSriastradh const BoxRec *box, 19603b705cfSriastradh int count); 19703b705cfSriastradh void (*done)(struct sna *sna, const struct sna_fill_op *op); 19803b705cfSriastradh}; 19903b705cfSriastradh 20003b705cfSriastradhstruct sna_copy_op { 20103b705cfSriastradh struct sna_composite_op base; 20203b705cfSriastradh 20303b705cfSriastradh void (*blt)(struct sna *sna, const struct sna_copy_op *op, 20403b705cfSriastradh int16_t sx, int16_t sy, 20503b705cfSriastradh int16_t w, int16_t h, 20603b705cfSriastradh int16_t dx, int16_t dy); 20703b705cfSriastradh void (*done)(struct sna *sna, const struct sna_copy_op *op); 20803b705cfSriastradh}; 20903b705cfSriastradh 21003b705cfSriastradhstruct sna_render { 21103b705cfSriastradh pthread_mutex_t lock; 21203b705cfSriastradh pthread_cond_t wait; 21303b705cfSriastradh int active; 21403b705cfSriastradh 21503b705cfSriastradh int max_3d_size; 21603b705cfSriastradh int max_3d_pitch; 21703b705cfSriastradh 21803b705cfSriastradh unsigned prefer_gpu; 21903b705cfSriastradh#define PREFER_GPU_BLT 0x1 22003b705cfSriastradh#define PREFER_GPU_RENDER 0x2 22103b705cfSriastradh#define PREFER_GPU_SPANS 0x4 22203b705cfSriastradh 22303b705cfSriastradh bool (*composite)(struct sna *sna, uint8_t op, 22403b705cfSriastradh PicturePtr dst, PicturePtr src, PicturePtr mask, 22503b705cfSriastradh int16_t src_x, int16_t src_y, 22603b705cfSriastradh int16_t msk_x, int16_t msk_y, 22703b705cfSriastradh int16_t dst_x, int16_t dst_y, 22803b705cfSriastradh int16_t w, int16_t h, 22903b705cfSriastradh struct sna_composite_op *tmp); 23003b705cfSriastradh 23103b705cfSriastradh bool (*check_composite_spans)(struct sna *sna, uint8_t op, 23203b705cfSriastradh PicturePtr dst, PicturePtr src, 23303b705cfSriastradh int16_t w, int16_t h, unsigned flags); 23403b705cfSriastradh bool (*composite_spans)(struct sna *sna, uint8_t op, 23503b705cfSriastradh PicturePtr dst, PicturePtr src, 23603b705cfSriastradh int16_t src_x, int16_t src_y, 23703b705cfSriastradh int16_t dst_x, int16_t dst_y, 23803b705cfSriastradh int16_t w, int16_t h, 23903b705cfSriastradh unsigned flags, 24003b705cfSriastradh struct sna_composite_spans_op *tmp); 24103b705cfSriastradh#define COMPOSITE_SPANS_RECTILINEAR 0x1 24203b705cfSriastradh#define COMPOSITE_SPANS_INPLACE_HINT 0x2 24303b705cfSriastradh 24403b705cfSriastradh bool (*video)(struct sna *sna, 24503b705cfSriastradh struct sna_video *video, 24603b705cfSriastradh struct sna_video_frame *frame, 24703b705cfSriastradh RegionPtr dstRegion, 24803b705cfSriastradh PixmapPtr pixmap); 24903b705cfSriastradh 25003b705cfSriastradh bool (*fill_boxes)(struct sna *sna, 25103b705cfSriastradh CARD8 op, 25203b705cfSriastradh PictFormat format, 25303b705cfSriastradh const xRenderColor *color, 25403b705cfSriastradh PixmapPtr dst, struct kgem_bo *dst_bo, 25503b705cfSriastradh const BoxRec *box, int n); 25603b705cfSriastradh bool (*fill)(struct sna *sna, uint8_t alu, 25703b705cfSriastradh PixmapPtr dst, struct kgem_bo *dst_bo, 25803b705cfSriastradh uint32_t color, 25903b705cfSriastradh struct sna_fill_op *tmp); 26003b705cfSriastradh bool (*fill_one)(struct sna *sna, PixmapPtr dst, struct kgem_bo *dst_bo, 26103b705cfSriastradh uint32_t color, 26203b705cfSriastradh int16_t x1, int16_t y1, int16_t x2, int16_t y2, 26303b705cfSriastradh uint8_t alu); 26403b705cfSriastradh bool (*clear)(struct sna *sna, PixmapPtr dst, struct kgem_bo *dst_bo); 26503b705cfSriastradh 26603b705cfSriastradh bool (*copy_boxes)(struct sna *sna, uint8_t alu, 26703b705cfSriastradh PixmapPtr src, struct kgem_bo *src_bo, int16_t src_dx, int16_t src_dy, 26803b705cfSriastradh PixmapPtr dst, struct kgem_bo *dst_bo, int16_t dst_dx, int16_t dst_dy, 26903b705cfSriastradh const BoxRec *box, int n, unsigned flags); 27003b705cfSriastradh#define COPY_LAST 0x1 27103b705cfSriastradh#define COPY_SYNC 0x2 27203b705cfSriastradh 27303b705cfSriastradh bool (*copy)(struct sna *sna, uint8_t alu, 27403b705cfSriastradh PixmapPtr src, struct kgem_bo *src_bo, 27503b705cfSriastradh PixmapPtr dst, struct kgem_bo *dst_bo, 27603b705cfSriastradh struct sna_copy_op *op); 27703b705cfSriastradh 27803b705cfSriastradh void (*flush)(struct sna *sna); 27903b705cfSriastradh void (*reset)(struct sna *sna); 28003b705cfSriastradh void (*fini)(struct sna *sna); 28103b705cfSriastradh 28203b705cfSriastradh struct sna_alpha_cache { 28303b705cfSriastradh struct kgem_bo *cache_bo; 28403b705cfSriastradh struct kgem_bo *bo[256+7]; 28503b705cfSriastradh } alpha_cache; 28603b705cfSriastradh 28703b705cfSriastradh struct sna_solid_cache { 28803b705cfSriastradh struct kgem_bo *cache_bo; 28903b705cfSriastradh struct kgem_bo *bo[1024]; 29003b705cfSriastradh uint32_t color[1025]; 29103b705cfSriastradh int last; 29203b705cfSriastradh int size; 29303b705cfSriastradh int dirty; 29403b705cfSriastradh } solid_cache; 29503b705cfSriastradh 29603b705cfSriastradh struct { 29703b705cfSriastradh struct sna_gradient_cache { 29803b705cfSriastradh struct kgem_bo *bo; 29903b705cfSriastradh int nstops; 30003b705cfSriastradh PictGradientStop *stops; 30103b705cfSriastradh } cache[GRADIENT_CACHE_SIZE]; 30203b705cfSriastradh int size; 30303b705cfSriastradh } gradient_cache; 30403b705cfSriastradh 30503b705cfSriastradh struct sna_glyph_cache{ 30603b705cfSriastradh PicturePtr picture; 30703b705cfSriastradh struct sna_glyph **glyphs; 30803b705cfSriastradh uint16_t count; 30903b705cfSriastradh uint16_t evict; 31003b705cfSriastradh } glyph[2]; 31103b705cfSriastradh pixman_image_t *white_image; 31203b705cfSriastradh PicturePtr white_picture; 31303b705cfSriastradh#if HAS_PIXMAN_GLYPHS 31403b705cfSriastradh pixman_glyph_cache_t *glyph_cache; 31503b705cfSriastradh#endif 31603b705cfSriastradh 31703b705cfSriastradh uint16_t vb_id; 31803b705cfSriastradh uint16_t vertex_offset; 31903b705cfSriastradh uint16_t vertex_start; 32003b705cfSriastradh uint16_t vertex_index; 32103b705cfSriastradh uint16_t vertex_used; 32203b705cfSriastradh uint16_t vertex_size; 32303b705cfSriastradh uint16_t vertex_reloc[16]; 32403b705cfSriastradh int nvertex_reloc; 32503b705cfSriastradh 32603b705cfSriastradh struct kgem_bo *vbo; 32703b705cfSriastradh float *vertices; 32803b705cfSriastradh 32903b705cfSriastradh float vertex_data[1024]; 33003b705cfSriastradh}; 33103b705cfSriastradh 33203b705cfSriastradhstruct gen2_render_state { 33303b705cfSriastradh uint32_t target; 33403b705cfSriastradh bool need_invariant; 33503b705cfSriastradh uint32_t logic_op_enabled; 33603b705cfSriastradh uint32_t ls1, ls2, vft; 33703b705cfSriastradh uint32_t diffuse; 33803b705cfSriastradh uint32_t specular; 33903b705cfSriastradh}; 34003b705cfSriastradh 34103b705cfSriastradhstruct gen3_render_state { 34203b705cfSriastradh uint32_t current_dst; 34303b705cfSriastradh bool need_invariant; 34403b705cfSriastradh uint32_t tex_count; 34503b705cfSriastradh uint32_t last_drawrect_limit; 34603b705cfSriastradh uint32_t last_target; 34703b705cfSriastradh uint32_t last_blend; 34803b705cfSriastradh uint32_t last_constants; 34903b705cfSriastradh uint32_t last_sampler; 35003b705cfSriastradh uint32_t last_shader; 35103b705cfSriastradh uint32_t last_diffuse; 35203b705cfSriastradh uint32_t last_specular; 35303b705cfSriastradh 35403b705cfSriastradh uint16_t last_vertex_offset; 35503b705cfSriastradh uint16_t floats_per_vertex; 35603b705cfSriastradh uint16_t last_floats_per_vertex; 35703b705cfSriastradh 35803b705cfSriastradh uint32_t tex_map[4]; 35903b705cfSriastradh uint32_t tex_handle[2]; 36003b705cfSriastradh uint32_t tex_delta[2]; 36103b705cfSriastradh}; 36203b705cfSriastradh 36303b705cfSriastradhstruct gen4_render_state { 36403b705cfSriastradh struct kgem_bo *general_bo; 36503b705cfSriastradh 36603b705cfSriastradh uint32_t vs; 36703b705cfSriastradh uint32_t sf; 36803b705cfSriastradh uint32_t wm; 36903b705cfSriastradh uint32_t cc; 37003b705cfSriastradh 37103b705cfSriastradh int ve_id; 37203b705cfSriastradh uint32_t drawrect_offset; 37303b705cfSriastradh uint32_t drawrect_limit; 37403b705cfSriastradh uint32_t last_pipelined_pointers; 37503b705cfSriastradh uint16_t last_primitive; 37603b705cfSriastradh int16_t floats_per_vertex; 37703b705cfSriastradh uint16_t surface_table; 37803b705cfSriastradh 37903b705cfSriastradh bool needs_invariant; 38003b705cfSriastradh bool needs_urb; 38103b705cfSriastradh}; 38203b705cfSriastradh 38303b705cfSriastradhstruct gen5_render_state { 38403b705cfSriastradh struct kgem_bo *general_bo; 38503b705cfSriastradh 38603b705cfSriastradh uint32_t vs; 38703b705cfSriastradh uint32_t sf[2]; 38803b705cfSriastradh uint32_t wm; 38903b705cfSriastradh uint32_t cc; 39003b705cfSriastradh 39103b705cfSriastradh int ve_id; 39203b705cfSriastradh uint32_t drawrect_offset; 39303b705cfSriastradh uint32_t drawrect_limit; 39403b705cfSriastradh uint32_t last_pipelined_pointers; 39503b705cfSriastradh uint16_t last_primitive; 39603b705cfSriastradh int16_t floats_per_vertex; 39703b705cfSriastradh uint16_t surface_table; 39803b705cfSriastradh 39903b705cfSriastradh bool needs_invariant; 40003b705cfSriastradh}; 40103b705cfSriastradh 40203b705cfSriastradhenum { 40303b705cfSriastradh GEN6_WM_KERNEL_NOMASK = 0, 40403b705cfSriastradh GEN6_WM_KERNEL_NOMASK_P, 40503b705cfSriastradh 40603b705cfSriastradh GEN6_WM_KERNEL_MASK, 40703b705cfSriastradh GEN6_WM_KERNEL_MASK_P, 40803b705cfSriastradh 40903b705cfSriastradh GEN6_WM_KERNEL_MASKCA, 41003b705cfSriastradh GEN6_WM_KERNEL_MASKCA_P, 41103b705cfSriastradh 41203b705cfSriastradh GEN6_WM_KERNEL_MASKSA, 41303b705cfSriastradh GEN6_WM_KERNEL_MASKSA_P, 41403b705cfSriastradh 41503b705cfSriastradh GEN6_WM_KERNEL_OPACITY, 41603b705cfSriastradh GEN6_WM_KERNEL_OPACITY_P, 41703b705cfSriastradh 41803b705cfSriastradh GEN6_WM_KERNEL_VIDEO_PLANAR, 41903b705cfSriastradh GEN6_WM_KERNEL_VIDEO_PACKED, 42003b705cfSriastradh GEN6_KERNEL_COUNT 42103b705cfSriastradh}; 42203b705cfSriastradh 42303b705cfSriastradhstruct gen6_render_state { 42403b705cfSriastradh const struct gt_info *info; 42503b705cfSriastradh struct kgem_bo *general_bo; 42603b705cfSriastradh 42703b705cfSriastradh uint32_t vs_state; 42803b705cfSriastradh uint32_t sf_state; 42903b705cfSriastradh uint32_t sf_mask_state; 43003b705cfSriastradh uint32_t wm_state; 43103b705cfSriastradh uint32_t wm_kernel[GEN6_KERNEL_COUNT][3]; 43203b705cfSriastradh 43303b705cfSriastradh uint32_t cc_blend; 43403b705cfSriastradh 43503b705cfSriastradh uint32_t drawrect_offset; 43603b705cfSriastradh uint32_t drawrect_limit; 43703b705cfSriastradh uint32_t blend; 43803b705cfSriastradh uint32_t samplers; 43903b705cfSriastradh uint32_t kernel; 44003b705cfSriastradh 44103b705cfSriastradh uint16_t num_sf_outputs; 44203b705cfSriastradh uint16_t ve_id; 44303b705cfSriastradh uint16_t last_primitive; 44403b705cfSriastradh int16_t floats_per_vertex; 44503b705cfSriastradh uint16_t surface_table; 44603b705cfSriastradh 44703b705cfSriastradh bool needs_invariant; 44803b705cfSriastradh bool first_state_packet; 44903b705cfSriastradh}; 45003b705cfSriastradh 45103b705cfSriastradhenum { 45203b705cfSriastradh GEN7_WM_KERNEL_NOMASK = 0, 45303b705cfSriastradh GEN7_WM_KERNEL_NOMASK_P, 45403b705cfSriastradh 45503b705cfSriastradh GEN7_WM_KERNEL_MASK, 45603b705cfSriastradh GEN7_WM_KERNEL_MASK_P, 45703b705cfSriastradh 45803b705cfSriastradh GEN7_WM_KERNEL_MASKCA, 45903b705cfSriastradh GEN7_WM_KERNEL_MASKCA_P, 46003b705cfSriastradh 46103b705cfSriastradh GEN7_WM_KERNEL_MASKSA, 46203b705cfSriastradh GEN7_WM_KERNEL_MASKSA_P, 46303b705cfSriastradh 46403b705cfSriastradh GEN7_WM_KERNEL_OPACITY, 46503b705cfSriastradh GEN7_WM_KERNEL_OPACITY_P, 46603b705cfSriastradh 46703b705cfSriastradh GEN7_WM_KERNEL_VIDEO_PLANAR, 46803b705cfSriastradh GEN7_WM_KERNEL_VIDEO_PACKED, 46903b705cfSriastradh GEN7_WM_KERNEL_COUNT 47003b705cfSriastradh}; 47103b705cfSriastradh 47203b705cfSriastradhstruct gen7_render_state { 47303b705cfSriastradh const struct gt_info *info; 47403b705cfSriastradh struct kgem_bo *general_bo; 47503b705cfSriastradh 47603b705cfSriastradh uint32_t vs_state; 47703b705cfSriastradh uint32_t sf_state; 47803b705cfSriastradh uint32_t sf_mask_state; 47903b705cfSriastradh uint32_t wm_state; 48003b705cfSriastradh uint32_t wm_kernel[GEN7_WM_KERNEL_COUNT][3]; 48103b705cfSriastradh 48203b705cfSriastradh uint32_t cc_blend; 48303b705cfSriastradh 48403b705cfSriastradh uint32_t drawrect_offset; 48503b705cfSriastradh uint32_t drawrect_limit; 48603b705cfSriastradh uint32_t blend; 48703b705cfSriastradh uint32_t samplers; 48803b705cfSriastradh uint32_t kernel; 48903b705cfSriastradh 49003b705cfSriastradh uint16_t num_sf_outputs; 49103b705cfSriastradh uint16_t ve_id; 49203b705cfSriastradh uint16_t last_primitive; 49303b705cfSriastradh int16_t floats_per_vertex; 49403b705cfSriastradh uint16_t surface_table; 49503b705cfSriastradh 49603b705cfSriastradh bool needs_invariant; 49703b705cfSriastradh bool emit_flush; 49803b705cfSriastradh}; 49903b705cfSriastradh 50003b705cfSriastradhstruct sna_static_stream { 50103b705cfSriastradh uint32_t size, used; 50203b705cfSriastradh uint8_t *data; 50303b705cfSriastradh}; 50403b705cfSriastradh 50503b705cfSriastradhint sna_static_stream_init(struct sna_static_stream *stream); 50603b705cfSriastradhuint32_t sna_static_stream_add(struct sna_static_stream *stream, 50703b705cfSriastradh const void *data, uint32_t len, uint32_t align); 50803b705cfSriastradhvoid *sna_static_stream_map(struct sna_static_stream *stream, 50903b705cfSriastradh uint32_t len, uint32_t align); 51003b705cfSriastradhuint32_t sna_static_stream_offsetof(struct sna_static_stream *stream, 51103b705cfSriastradh void *ptr); 51203b705cfSriastradhunsigned sna_static_stream_compile_sf(struct sna *sna, 51303b705cfSriastradh struct sna_static_stream *stream, 51403b705cfSriastradh bool (*compile)(struct brw_compile *)); 51503b705cfSriastradh 51603b705cfSriastradhunsigned sna_static_stream_compile_wm(struct sna *sna, 51703b705cfSriastradh struct sna_static_stream *stream, 51803b705cfSriastradh bool (*compile)(struct brw_compile *, int), 51903b705cfSriastradh int width); 52003b705cfSriastradhstruct kgem_bo *sna_static_stream_fini(struct sna *sna, 52103b705cfSriastradh struct sna_static_stream *stream); 52203b705cfSriastradh 52303b705cfSriastradhstruct kgem_bo * 52403b705cfSriastradhsna_render_get_solid(struct sna *sna, 52503b705cfSriastradh uint32_t color); 52603b705cfSriastradh 52703b705cfSriastradhvoid 52803b705cfSriastradhsna_render_flush_solid(struct sna *sna); 52903b705cfSriastradh 53003b705cfSriastradhstruct kgem_bo * 53103b705cfSriastradhsna_render_get_gradient(struct sna *sna, 53203b705cfSriastradh PictGradient *pattern); 53303b705cfSriastradh 53403b705cfSriastradhbool 53503b705cfSriastradhsna_gradient_is_opaque(const PictGradient *gradient); 53603b705cfSriastradh 53703b705cfSriastradhuint32_t sna_rgba_for_color(uint32_t color, int depth); 53803b705cfSriastradhuint32_t sna_rgba_to_color(uint32_t rgba, uint32_t format); 53903b705cfSriastradhbool sna_get_rgba_from_pixel(uint32_t pixel, 54003b705cfSriastradh uint16_t *red, 54103b705cfSriastradh uint16_t *green, 54203b705cfSriastradh uint16_t *blue, 54303b705cfSriastradh uint16_t *alpha, 54403b705cfSriastradh uint32_t format); 54503b705cfSriastradhbool sna_picture_is_solid(PicturePtr picture, uint32_t *color); 54603b705cfSriastradh 54703b705cfSriastradhconst char *no_render_init(struct sna *sna); 54803b705cfSriastradhconst char *gen2_render_init(struct sna *sna, const char *backend); 54903b705cfSriastradhconst char *gen3_render_init(struct sna *sna, const char *backend); 55003b705cfSriastradhconst char *gen4_render_init(struct sna *sna, const char *backend); 55103b705cfSriastradhconst char *gen5_render_init(struct sna *sna, const char *backend); 55203b705cfSriastradhconst char *gen6_render_init(struct sna *sna, const char *backend); 55303b705cfSriastradhconst char *gen7_render_init(struct sna *sna, const char *backend); 55403b705cfSriastradh 55503b705cfSriastradhbool sna_tiling_composite(uint32_t op, 55603b705cfSriastradh PicturePtr src, 55703b705cfSriastradh PicturePtr mask, 55803b705cfSriastradh PicturePtr dst, 55903b705cfSriastradh int16_t src_x, int16_t src_y, 56003b705cfSriastradh int16_t mask_x, int16_t mask_y, 56103b705cfSriastradh int16_t dst_x, int16_t dst_y, 56203b705cfSriastradh int16_t width, int16_t height, 56303b705cfSriastradh struct sna_composite_op *tmp); 56403b705cfSriastradhbool sna_tiling_composite_spans(uint32_t op, 56503b705cfSriastradh PicturePtr src, 56603b705cfSriastradh PicturePtr dst, 56703b705cfSriastradh int16_t src_x, int16_t src_y, 56803b705cfSriastradh int16_t dst_x, int16_t dst_y, 56903b705cfSriastradh int16_t width, int16_t height, 57003b705cfSriastradh unsigned flags, 57103b705cfSriastradh struct sna_composite_spans_op *tmp); 57203b705cfSriastradhbool sna_tiling_fill_boxes(struct sna *sna, 57303b705cfSriastradh CARD8 op, 57403b705cfSriastradh PictFormat format, 57503b705cfSriastradh const xRenderColor *color, 57603b705cfSriastradh PixmapPtr dst, struct kgem_bo *dst_bo, 57703b705cfSriastradh const BoxRec *box, int n); 57803b705cfSriastradh 57903b705cfSriastradhbool sna_tiling_copy_boxes(struct sna *sna, uint8_t alu, 58003b705cfSriastradh PixmapPtr src, struct kgem_bo *src_bo, int16_t src_dx, int16_t src_dy, 58103b705cfSriastradh PixmapPtr dst, struct kgem_bo *dst_bo, int16_t dst_dx, int16_t dst_dy, 58203b705cfSriastradh const BoxRec *box, int n); 58303b705cfSriastradh 58403b705cfSriastradhbool sna_tiling_blt_copy_boxes(struct sna *sna, uint8_t alu, 58503b705cfSriastradh struct kgem_bo *src_bo, int16_t src_dx, int16_t src_dy, 58603b705cfSriastradh struct kgem_bo *dst_bo, int16_t dst_dx, int16_t dst_dy, 58703b705cfSriastradh int bpp, const BoxRec *box, int nbox); 58803b705cfSriastradh 58903b705cfSriastradhbool sna_blt_composite(struct sna *sna, 59003b705cfSriastradh uint32_t op, 59103b705cfSriastradh PicturePtr src, 59203b705cfSriastradh PicturePtr dst, 59303b705cfSriastradh int16_t src_x, int16_t src_y, 59403b705cfSriastradh int16_t dst_x, int16_t dst_y, 59503b705cfSriastradh int16_t width, int16_t height, 59603b705cfSriastradh struct sna_composite_op *tmp, 59703b705cfSriastradh bool fallback); 59803b705cfSriastradhbool sna_blt_composite__convert(struct sna *sna, 59903b705cfSriastradh int x, int y, 60003b705cfSriastradh int width, int height, 60103b705cfSriastradh struct sna_composite_op *tmp); 60203b705cfSriastradh 60303b705cfSriastradhbool sna_blt_fill(struct sna *sna, uint8_t alu, 60403b705cfSriastradh struct kgem_bo *bo, 60503b705cfSriastradh int bpp, 60603b705cfSriastradh uint32_t pixel, 60703b705cfSriastradh struct sna_fill_op *fill); 60803b705cfSriastradh 60903b705cfSriastradhbool sna_blt_copy(struct sna *sna, uint8_t alu, 61003b705cfSriastradh struct kgem_bo *src, 61103b705cfSriastradh struct kgem_bo *dst, 61203b705cfSriastradh int bpp, 61303b705cfSriastradh struct sna_copy_op *copy); 61403b705cfSriastradh 61503b705cfSriastradhbool sna_blt_fill_boxes(struct sna *sna, uint8_t alu, 61603b705cfSriastradh struct kgem_bo *bo, 61703b705cfSriastradh int bpp, 61803b705cfSriastradh uint32_t pixel, 61903b705cfSriastradh const BoxRec *box, int n); 62003b705cfSriastradh 62103b705cfSriastradhbool sna_blt_copy_boxes(struct sna *sna, uint8_t alu, 62203b705cfSriastradh struct kgem_bo *src_bo, int16_t src_dx, int16_t src_dy, 62303b705cfSriastradh struct kgem_bo *dst_bo, int16_t dst_dx, int16_t dst_dy, 62403b705cfSriastradh int bpp, 62503b705cfSriastradh const BoxRec *box, int n); 62603b705cfSriastradhbool sna_blt_copy_boxes_fallback(struct sna *sna, uint8_t alu, 62703b705cfSriastradh PixmapPtr src, struct kgem_bo *src_bo, int16_t src_dx, int16_t src_dy, 62803b705cfSriastradh PixmapPtr dst, struct kgem_bo *dst_bo, int16_t dst_dx, int16_t dst_dy, 62903b705cfSriastradh const BoxRec *box, int nbox); 63003b705cfSriastradh 63103b705cfSriastradhbool _sna_get_pixel_from_rgba(uint32_t *pixel, 63203b705cfSriastradh uint16_t red, 63303b705cfSriastradh uint16_t green, 63403b705cfSriastradh uint16_t blue, 63503b705cfSriastradh uint16_t alpha, 63603b705cfSriastradh uint32_t format); 63703b705cfSriastradh 63803b705cfSriastradhstatic inline bool 63903b705cfSriastradhsna_get_pixel_from_rgba(uint32_t * pixel, 64003b705cfSriastradh uint16_t red, 64103b705cfSriastradh uint16_t green, 64203b705cfSriastradh uint16_t blue, 64303b705cfSriastradh uint16_t alpha, 64403b705cfSriastradh uint32_t format) 64503b705cfSriastradh{ 64603b705cfSriastradh switch (format) { 64703b705cfSriastradh case PICT_x8r8g8b8: 64803b705cfSriastradh alpha = 0xffff; 64903b705cfSriastradh /* fall through to re-use a8r8g8b8 expansion */ 65003b705cfSriastradh case PICT_a8r8g8b8: 65103b705cfSriastradh *pixel = ((alpha >> 8 << 24) | 65203b705cfSriastradh (red >> 8 << 16) | 65303b705cfSriastradh (green & 0xff00) | 65403b705cfSriastradh (blue >> 8)); 65503b705cfSriastradh return TRUE; 65603b705cfSriastradh case PICT_a8: 65703b705cfSriastradh *pixel = alpha >> 8; 65803b705cfSriastradh return TRUE; 65903b705cfSriastradh } 66003b705cfSriastradh 66103b705cfSriastradh return _sna_get_pixel_from_rgba(pixel, red, green, blue, alpha, format); 66203b705cfSriastradh} 66303b705cfSriastradh 66403b705cfSriastradhstruct kgem_bo * 66503b705cfSriastradh__sna_render_pixmap_bo(struct sna *sna, 66603b705cfSriastradh PixmapPtr pixmap, 66703b705cfSriastradh const BoxRec *box, 66803b705cfSriastradh bool blt); 66903b705cfSriastradh 67003b705cfSriastradhint 67103b705cfSriastradhsna_render_pixmap_bo(struct sna *sna, 67203b705cfSriastradh struct sna_composite_channel *channel, 67303b705cfSriastradh PixmapPtr pixmap, 67403b705cfSriastradh int16_t x, int16_t y, 67503b705cfSriastradh int16_t w, int16_t h, 67603b705cfSriastradh int16_t dst_x, int16_t dst_y); 67703b705cfSriastradh 67803b705cfSriastradhbool 67903b705cfSriastradhsna_render_pixmap_partial(struct sna *sna, 68003b705cfSriastradh PixmapPtr pixmap, 68103b705cfSriastradh struct kgem_bo *bo, 68203b705cfSriastradh struct sna_composite_channel *channel, 68303b705cfSriastradh int16_t x, int16_t y, 68403b705cfSriastradh int16_t w, int16_t h); 68503b705cfSriastradh 68603b705cfSriastradhint 68703b705cfSriastradhsna_render_picture_extract(struct sna *sna, 68803b705cfSriastradh PicturePtr picture, 68903b705cfSriastradh struct sna_composite_channel *channel, 69003b705cfSriastradh int16_t x, int16_t y, 69103b705cfSriastradh int16_t w, int16_t h, 69203b705cfSriastradh int16_t dst_x, int16_t dst_y); 69303b705cfSriastradh 69403b705cfSriastradhint 69503b705cfSriastradhsna_render_picture_approximate_gradient(struct sna *sna, 69603b705cfSriastradh PicturePtr picture, 69703b705cfSriastradh struct sna_composite_channel *channel, 69803b705cfSriastradh int16_t x, int16_t y, 69903b705cfSriastradh int16_t w, int16_t h, 70003b705cfSriastradh int16_t dst_x, int16_t dst_y); 70103b705cfSriastradh 70203b705cfSriastradhint 70303b705cfSriastradhsna_render_picture_fixup(struct sna *sna, 70403b705cfSriastradh PicturePtr picture, 70503b705cfSriastradh struct sna_composite_channel *channel, 70603b705cfSriastradh int16_t x, int16_t y, 70703b705cfSriastradh int16_t w, int16_t h, 70803b705cfSriastradh int16_t dst_x, int16_t dst_y); 70903b705cfSriastradh 71003b705cfSriastradhint 71103b705cfSriastradhsna_render_picture_convert(struct sna *sna, 71203b705cfSriastradh PicturePtr picture, 71303b705cfSriastradh struct sna_composite_channel *channel, 71403b705cfSriastradh PixmapPtr pixmap, 71503b705cfSriastradh int16_t x, int16_t y, 71603b705cfSriastradh int16_t w, int16_t h, 71703b705cfSriastradh int16_t dst_x, int16_t dst_y, 71803b705cfSriastradh bool fixup_alpha); 71903b705cfSriastradh 72003b705cfSriastradhinline static void sna_render_composite_redirect_init(struct sna_composite_op *op) 72103b705cfSriastradh{ 72203b705cfSriastradh struct sna_composite_redirect *t = &op->redirect; 72303b705cfSriastradh t->real_bo = NULL; 72403b705cfSriastradh t->damage = NULL; 72503b705cfSriastradh} 72603b705cfSriastradh 72703b705cfSriastradhbool 72803b705cfSriastradhsna_render_composite_redirect(struct sna *sna, 72903b705cfSriastradh struct sna_composite_op *op, 73003b705cfSriastradh int x, int y, int width, int height, 73103b705cfSriastradh bool partial); 73203b705cfSriastradh 73303b705cfSriastradhvoid 73403b705cfSriastradhsna_render_composite_redirect_done(struct sna *sna, 73503b705cfSriastradh const struct sna_composite_op *op); 73603b705cfSriastradh 73703b705cfSriastradhbool 73803b705cfSriastradhsna_render_copy_boxes__overlap(struct sna *sna, uint8_t alu, 73903b705cfSriastradh PixmapPtr src, struct kgem_bo *src_bo, int16_t src_dx, int16_t src_dy, 74003b705cfSriastradh PixmapPtr dst, struct kgem_bo *dst_bo, int16_t dst_dx, int16_t dst_dy, 74103b705cfSriastradh const BoxRec *box, int n, const BoxRec *extents); 74203b705cfSriastradh 74303b705cfSriastradhbool 74403b705cfSriastradhsna_composite_mask_is_opaque(PicturePtr mask); 74503b705cfSriastradh 74603b705cfSriastradhvoid sna_vertex_init(struct sna *sna); 74703b705cfSriastradh 74803b705cfSriastradhstatic inline void sna_vertex_lock(struct sna_render *r) 74903b705cfSriastradh{ 75003b705cfSriastradh pthread_mutex_lock(&r->lock); 75103b705cfSriastradh} 75203b705cfSriastradh 75303b705cfSriastradhstatic inline void sna_vertex_acquire__locked(struct sna_render *r) 75403b705cfSriastradh{ 75503b705cfSriastradh r->active++; 75603b705cfSriastradh} 75703b705cfSriastradh 75803b705cfSriastradhstatic inline void sna_vertex_unlock(struct sna_render *r) 75903b705cfSriastradh{ 76003b705cfSriastradh pthread_mutex_unlock(&r->lock); 76103b705cfSriastradh} 76203b705cfSriastradh 76303b705cfSriastradhstatic inline void sna_vertex_release__locked(struct sna_render *r) 76403b705cfSriastradh{ 76503b705cfSriastradh assert(r->active > 0); 76603b705cfSriastradh if (--r->active == 0) 76703b705cfSriastradh pthread_cond_signal(&r->wait); 76803b705cfSriastradh} 76903b705cfSriastradh 77003b705cfSriastradhstatic inline bool sna_vertex_wait__locked(struct sna_render *r) 77103b705cfSriastradh{ 77203b705cfSriastradh bool was_active = r->active; 77303b705cfSriastradh while (r->active) 77403b705cfSriastradh pthread_cond_wait(&r->wait, &r->lock); 77503b705cfSriastradh return was_active; 77603b705cfSriastradh} 77703b705cfSriastradh 77803b705cfSriastradh#define alphaless(format) PICT_FORMAT(PICT_FORMAT_BPP(format), \ 77903b705cfSriastradh PICT_FORMAT_TYPE(format), \ 78003b705cfSriastradh 0, \ 78103b705cfSriastradh PICT_FORMAT_R(format), \ 78203b705cfSriastradh PICT_FORMAT_G(format), \ 78303b705cfSriastradh PICT_FORMAT_B(format)) 78403b705cfSriastradh 78503b705cfSriastradh#endif /* SNA_RENDER_H */ 786