Intel-2D: gen6 textured blitter

git-svn-id: svn://kolibrios.org@3278 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Sergey Semyonov (Serge) 2013-02-27 05:07:54 +00:00
parent f1a78c2d1e
commit 6e405bb321
5 changed files with 367 additions and 306 deletions

View File

@ -37,7 +37,7 @@
#include "sna.h" #include "sna.h"
#include "sna_reg.h" #include "sna_reg.h"
#include "sna_render.h" #include "sna_render.h"
//#include "sna_render_inline.h" #include "sna_render_inline.h"
//#include "sna_video.h" //#include "sna_video.h"
#include "brw/brw.h" #include "brw/brw.h"
@ -247,7 +247,16 @@ static uint32_t gen6_get_blend(int op,
static uint32_t gen6_get_card_format(PictFormat format) static uint32_t gen6_get_card_format(PictFormat format)
{ {
switch (format) {
default:
return -1;
case PICT_a8r8g8b8:
return GEN6_SURFACEFORMAT_B8G8R8A8_UNORM; return GEN6_SURFACEFORMAT_B8G8R8A8_UNORM;
case PICT_x8r8g8b8:
return GEN6_SURFACEFORMAT_B8G8R8X8_UNORM;
case PICT_a8:
return GEN6_SURFACEFORMAT_A8_UNORM;
};
/* /*
switch (format) { switch (format) {
@ -394,7 +403,7 @@ gen6_choose_composite_kernel(int op, bool has_mask, bool is_ca, bool is_affine)
int base; int base;
if (has_mask) { if (has_mask) {
/*
if (is_ca) { if (is_ca) {
if (gen6_blend_op[op].src_alpha) if (gen6_blend_op[op].src_alpha)
base = GEN6_WM_KERNEL_MASKSA; base = GEN6_WM_KERNEL_MASKSA;
@ -402,7 +411,7 @@ gen6_choose_composite_kernel(int op, bool has_mask, bool is_ca, bool is_affine)
base = GEN6_WM_KERNEL_MASKCA; base = GEN6_WM_KERNEL_MASKCA;
} else } else
base = GEN6_WM_KERNEL_MASK; base = GEN6_WM_KERNEL_MASK;
*/
} else } else
base = GEN6_WM_KERNEL_NOMASK; base = GEN6_WM_KERNEL_NOMASK;
@ -1331,7 +1340,6 @@ gen6_align_vertex(struct sna *sna, const struct sna_composite_op *op)
assert((sna->render.vertex_used % op->floats_per_vertex) == 0); assert((sna->render.vertex_used % op->floats_per_vertex) == 0);
} }
#if 0
fastcall static void fastcall static void
gen6_render_composite_blt(struct sna *sna, gen6_render_composite_blt(struct sna *sna,
@ -1342,6 +1350,8 @@ gen6_render_composite_blt(struct sna *sna,
op->prim_emit(sna, op, r); op->prim_emit(sna, op, r);
} }
#if 0
fastcall static void fastcall static void
gen6_render_composite_box(struct sna *sna, gen6_render_composite_box(struct sna *sna,
const struct sna_composite_op *op, const struct sna_composite_op *op,
@ -1813,6 +1823,8 @@ inline static void gen6_composite_channel_convert(struct sna_composite_channel *
assert(channel->card_format != (unsigned)-1); assert(channel->card_format != (unsigned)-1);
} }
#endif
static void gen6_render_composite_done(struct sna *sna, static void gen6_render_composite_done(struct sna *sna,
const struct sna_composite_op *op) const struct sna_composite_op *op)
{ {
@ -1832,6 +1844,8 @@ static void gen6_render_composite_done(struct sna *sna,
// sna_render_composite_redirect_done(sna, op); // sna_render_composite_redirect_done(sna, op);
} }
#if 0
static bool static bool
gen6_composite_set_target(struct sna *sna, gen6_composite_set_target(struct sna *sna,
struct sna_composite_op *op, struct sna_composite_op *op,
@ -1853,9 +1867,9 @@ gen6_composite_set_target(struct sna *sna,
} else } else
sna_render_picture_extents(dst, &box); sna_render_picture_extents(dst, &box);
op->dst.bo = sna_drawable_use_bo (dst->pDrawable, // op->dst.bo = sna_drawable_use_bo (dst->pDrawable,
PREFER_GPU | FORCE_GPU | RENDER_GPU, // PREFER_GPU | FORCE_GPU | RENDER_GPU,
&box, &op->damage); // &box, &op->damage);
if (op->dst.bo == NULL) if (op->dst.bo == NULL)
return false; return false;
@ -1880,7 +1894,6 @@ gen6_composite_set_target(struct sna *sna,
} }
static bool static bool
gen6_render_composite(struct sna *sna, gen6_render_composite(struct sna *sna,
uint8_t op, uint8_t op,
@ -1899,27 +1912,6 @@ gen6_render_composite(struct sna *sna,
DBG(("%s: %dx%d, current mode=%d\n", __FUNCTION__, DBG(("%s: %dx%d, current mode=%d\n", __FUNCTION__,
width, height, sna->kgem.ring)); width, height, sna->kgem.ring));
if (mask == NULL &&
try_blt(sna, dst, src, width, height) &&
sna_blt_composite(sna, op,
src, dst,
src_x, src_y,
dst_x, dst_y,
width, height,
tmp, false))
return true;
if (gen6_composite_fallback(sna, src, mask, dst))
return false;
if (need_tiling(sna, width, height))
return sna_tiling_composite(op, src, mask, dst,
src_x, src_y,
msk_x, msk_y,
dst_x, dst_y,
width, height,
tmp);
if (op == PictOpClear) if (op == PictOpClear)
op = PictOpSrc; op = PictOpSrc;
tmp->op = op; tmp->op = op;
@ -2014,13 +2006,13 @@ gen6_render_composite(struct sna *sna,
tmp->is_affine), tmp->is_affine),
gen4_choose_composite_emitter(tmp)); gen4_choose_composite_emitter(tmp));
tmp->blt = gen6_render_composite_blt; // tmp->blt = gen6_render_composite_blt;
tmp->box = gen6_render_composite_box; // tmp->box = gen6_render_composite_box;
tmp->boxes = gen6_render_composite_boxes__blt; // tmp->boxes = gen6_render_composite_boxes__blt;
if (tmp->emit_boxes) { // if (tmp->emit_boxes) {
tmp->boxes = gen6_render_composite_boxes; // tmp->boxes = gen6_render_composite_boxes;
tmp->thread_boxes = gen6_render_composite_boxes__thread; // tmp->thread_boxes = gen6_render_composite_boxes__thread;
} // }
tmp->done = gen6_render_composite_done; tmp->done = gen6_render_composite_done;
kgem_set_mode(&sna->kgem, KGEM_RENDER, tmp->dst.bo); kgem_set_mode(&sna->kgem, KGEM_RENDER, tmp->dst.bo);
@ -2051,6 +2043,7 @@ cleanup_dst:
return false; return false;
} }
#if !NO_COMPOSITE_SPANS #if !NO_COMPOSITE_SPANS
fastcall static void fastcall static void
gen6_render_composite_spans_box(struct sna *sna, gen6_render_composite_spans_box(struct sna *sna,
@ -2689,6 +2682,105 @@ fallback:
return true; return true;
} }
bool
gen6_composite(struct sna *sna,
uint8_t op,
PixmapPtr src, struct kgem_bo *src_bo,
PixmapPtr mask,struct kgem_bo *mask_bo,
PixmapPtr dst, struct kgem_bo *dst_bo,
int32_t src_x, int32_t src_y,
int32_t msk_x, int32_t msk_y,
int32_t dst_x, int32_t dst_y,
int32_t width, int32_t height,
struct sna_composite_op *tmp)
{
DBG(("%s: %dx%d, current mode=%d\n", __FUNCTION__,
width, height, sna->kgem.ring));
tmp->op = PictOpSrc;
tmp->dst.pixmap = dst;
tmp->dst.bo = dst_bo;
tmp->dst.width = dst->drawable.width;
tmp->dst.height = dst->drawable.height;
tmp->dst.format = PICT_x8r8g8b8;
tmp->src.repeat = RepeatNone;
tmp->src.filter = PictFilterNearest;
tmp->src.is_affine = true;
tmp->src.bo = src_bo;
tmp->src.pict_format = PICT_x8r8g8b8;
tmp->src.card_format = gen6_get_card_format(tmp->src.pict_format);
tmp->src.width = src->drawable.width;
tmp->src.height = src->drawable.height;
tmp->is_affine = tmp->src.is_affine;
tmp->has_component_alpha = false;
tmp->need_magic_ca_pass = false;
tmp->mask.repeat = SAMPLER_EXTEND_NONE;
tmp->mask.filter = SAMPLER_FILTER_NEAREST;
tmp->mask.is_affine = true;
tmp->mask.bo = mask_bo;
tmp->mask.pict_format = PIXMAN_a8;
tmp->mask.card_format = gen6_get_card_format(tmp->mask.pict_format);
tmp->mask.width = mask->drawable.width;
tmp->mask.height = mask->drawable.height;
tmp->src.scale[0] = 1.f/width; //src->width;
tmp->src.scale[1] = 1.f/height; //src->height;
// tmp->src.offset[0] = -dst_x;
// tmp->src.offset[1] = -dst_y;
tmp->mask.scale[0] = 1.f/mask->drawable.width;
tmp->mask.scale[1] = 1.f/mask->drawable.height;
// tmp->mask.offset[0] = -dst_x;
// tmp->mask.offset[1] = -dst_y;
tmp->u.gen6.flags =
GEN6_SET_FLAGS(SAMPLER_OFFSET(tmp->src.filter,
tmp->src.repeat,
tmp->mask.filter,
tmp->mask.repeat),
gen6_get_blend(tmp->op,
tmp->has_component_alpha,
tmp->dst.format),
/* gen6_choose_composite_kernel(tmp->op,
tmp->mask.bo != NULL,
tmp->has_component_alpha,
tmp->is_affine),
*/
GEN6_WM_KERNEL_MASK,
gen4_choose_composite_emitter(tmp));
tmp->blt = gen6_render_composite_blt;
// tmp->box = gen6_render_composite_box;
tmp->done = gen6_render_composite_done;
kgem_set_mode(&sna->kgem, KGEM_RENDER, tmp->dst.bo);
if (!kgem_check_bo(&sna->kgem,
tmp->dst.bo, tmp->src.bo, tmp->mask.bo,
NULL)) {
kgem_submit(&sna->kgem);
_kgem_set_mode(&sna->kgem, KGEM_RENDER);
}
gen6_emit_composite_state(sna, tmp);
gen6_align_vertex(sna, tmp);
return true;
}
#if 0 #if 0
static void static void
@ -3404,192 +3496,3 @@ bool gen6_render_init(struct sna *sna)
} }
void gen4_vertex_flush(struct sna *sna)
{
DBG(("%s[%x] = %d\n", __FUNCTION__,
4*sna->render.vertex_offset,
sna->render.vertex_index - sna->render.vertex_start));
assert(sna->render.vertex_offset);
assert(sna->render.vertex_index > sna->render.vertex_start);
sna->kgem.batch[sna->render.vertex_offset] =
sna->render.vertex_index - sna->render.vertex_start;
sna->render.vertex_offset = 0;
}
int gen4_vertex_finish(struct sna *sna)
{
struct kgem_bo *bo;
unsigned int i;
unsigned hint, size;
DBG(("%s: used=%d / %d\n", __FUNCTION__,
sna->render.vertex_used, sna->render.vertex_size));
assert(sna->render.vertex_offset == 0);
assert(sna->render.vertex_used);
// sna_vertex_wait__locked(&sna->render);
/* Note: we only need dword alignment (currently) */
bo = sna->render.vbo;
if (bo) {
for (i = 0; i < sna->render.nvertex_reloc; i++) {
DBG(("%s: reloc[%d] = %d\n", __FUNCTION__,
i, sna->render.vertex_reloc[i]));
sna->kgem.batch[sna->render.vertex_reloc[i]] =
kgem_add_reloc(&sna->kgem,
sna->render.vertex_reloc[i], bo,
I915_GEM_DOMAIN_VERTEX << 16,
0);
}
assert(!sna->render.active);
sna->render.nvertex_reloc = 0;
sna->render.vertex_used = 0;
sna->render.vertex_index = 0;
sna->render.vbo = NULL;
sna->render.vb_id = 0;
kgem_bo_destroy(&sna->kgem, bo);
}
hint = CREATE_GTT_MAP;
if (bo)
hint |= CREATE_CACHED | CREATE_NO_THROTTLE;
size = 256*1024;
assert(!sna->render.active);
sna->render.vertices = NULL;
sna->render.vbo = kgem_create_linear(&sna->kgem, size, hint);
while (sna->render.vbo == NULL && size > 16*1024) {
size /= 2;
sna->render.vbo = kgem_create_linear(&sna->kgem, size, hint);
}
if (sna->render.vbo == NULL)
sna->render.vbo = kgem_create_linear(&sna->kgem,
256*1024, CREATE_GTT_MAP);
if (sna->render.vbo)
sna->render.vertices = kgem_bo_map(&sna->kgem, sna->render.vbo);
if (sna->render.vertices == NULL) {
if (sna->render.vbo) {
kgem_bo_destroy(&sna->kgem, sna->render.vbo);
sna->render.vbo = NULL;
}
sna->render.vertices = sna->render.vertex_data;
sna->render.vertex_size = ARRAY_SIZE(sna->render.vertex_data);
return 0;
}
if (sna->render.vertex_used) {
DBG(("%s: copying initial buffer x %d to handle=%d\n",
__FUNCTION__,
sna->render.vertex_used,
sna->render.vbo->handle));
assert(sizeof(float)*sna->render.vertex_used <=
__kgem_bo_size(sna->render.vbo));
memcpy(sna->render.vertices,
sna->render.vertex_data,
sizeof(float)*sna->render.vertex_used);
}
size = __kgem_bo_size(sna->render.vbo)/4;
if (size >= UINT16_MAX)
size = UINT16_MAX - 1;
DBG(("%s: create vbo handle=%d, size=%d\n",
__FUNCTION__, sna->render.vbo->handle, size));
sna->render.vertex_size = size;
return sna->render.vertex_size - sna->render.vertex_used;
}
void gen4_vertex_close(struct sna *sna)
{
struct kgem_bo *bo, *free_bo = NULL;
unsigned int i, delta = 0;
assert(sna->render.vertex_offset == 0);
if (!sna->render.vb_id)
return;
DBG(("%s: used=%d, vbo active? %d, vb=%x, nreloc=%d\n",
__FUNCTION__, sna->render.vertex_used, sna->render.vbo ? sna->render.vbo->handle : 0,
sna->render.vb_id, sna->render.nvertex_reloc));
assert(!sna->render.active);
bo = sna->render.vbo;
if (bo) {
if (sna->render.vertex_size - sna->render.vertex_used < 64) {
DBG(("%s: discarding vbo (full), handle=%d\n", __FUNCTION__, sna->render.vbo->handle));
sna->render.vbo = NULL;
sna->render.vertices = sna->render.vertex_data;
sna->render.vertex_size = ARRAY_SIZE(sna->render.vertex_data);
free_bo = bo;
} else if (IS_CPU_MAP(bo->map) && !sna->kgem.has_llc) {
DBG(("%s: converting CPU map to GTT\n", __FUNCTION__));
sna->render.vertices =
kgem_bo_map__gtt(&sna->kgem, sna->render.vbo);
if (sna->render.vertices == NULL) {
sna->render.vbo = NULL;
sna->render.vertices = sna->render.vertex_data;
sna->render.vertex_size = ARRAY_SIZE(sna->render.vertex_data);
free_bo = bo;
}
}
} else {
if (sna->kgem.nbatch + sna->render.vertex_used <= sna->kgem.surface) {
DBG(("%s: copy to batch: %d @ %d\n", __FUNCTION__,
sna->render.vertex_used, sna->kgem.nbatch));
memcpy(sna->kgem.batch + sna->kgem.nbatch,
sna->render.vertex_data,
sna->render.vertex_used * 4);
delta = sna->kgem.nbatch * 4;
bo = NULL;
sna->kgem.nbatch += sna->render.vertex_used;
} else {
bo = kgem_create_linear(&sna->kgem,
4*sna->render.vertex_used,
CREATE_NO_THROTTLE);
if (bo && !kgem_bo_write(&sna->kgem, bo,
sna->render.vertex_data,
4*sna->render.vertex_used)) {
kgem_bo_destroy(&sna->kgem, bo);
bo = NULL;
}
DBG(("%s: new vbo: %d\n", __FUNCTION__,
sna->render.vertex_used));
free_bo = bo;
}
}
assert(sna->render.nvertex_reloc);
for (i = 0; i < sna->render.nvertex_reloc; i++) {
DBG(("%s: reloc[%d] = %d\n", __FUNCTION__,
i, sna->render.vertex_reloc[i]));
sna->kgem.batch[sna->render.vertex_reloc[i]] =
kgem_add_reloc(&sna->kgem,
sna->render.vertex_reloc[i], bo,
I915_GEM_DOMAIN_VERTEX << 16,
delta);
}
sna->render.nvertex_reloc = 0;
sna->render.vb_id = 0;
if (sna->render.vbo == NULL) {
assert(!sna->render.active);
sna->render.vertex_used = 0;
sna->render.vertex_index = 0;
assert(sna->render.vertices == sna->render.vertex_data);
assert(sna->render.vertex_size == ARRAY_SIZE(sna->render.vertex_data));
}
if (free_bo)
kgem_bo_destroy(&sna->kgem, free_bo);
}

View File

@ -941,4 +941,12 @@ struct drm_i915_reg_read {
__u64 offset; __u64 offset;
__u64 val; /* Return value */ __u64 val; /* Return value */
}; };
struct drm_i915_mask_update {
__u32 handle;
__u32 bo_size;
__u32 bo_pitch;
__u32 bo_map;
};
#endif /* _I915_DRM_H_ */ #endif /* _I915_DRM_H_ */

View File

@ -8,6 +8,7 @@
#include <pixlib2.h> #include <pixlib2.h>
static struct sna_fb sna_fb; static struct sna_fb sna_fb;
static struct kgem_bo *mask_bo;
typedef struct __attribute__((packed)) typedef struct __attribute__((packed))
{ {
@ -419,65 +420,154 @@ void sna_lock_bitmap(bitmap_t *bitmap)
}; };
int sna_create_mask()
/*
int sna_blit_tex(bitmap_t *dst_bitmap, int dst_x, int dst_y,
int w, int h, bitmap_t *src_bitmap, int src_x, int src_y,
bitmap_t *mask_bitmap)
{ {
struct sna_composite_op cop; struct kgem_bo *bo;
batchbuffer_t execbuffer; char proc_info[1024];
BoxRec box; int width, height;
int i;
struct kgem_bo src_bo, mask_bo, dst_bo; get_proc_info(proc_info);
memset(&cop, 0, sizeof(cop)); width = *(uint32_t*)(proc_info+42)+1;
memset(&execbuffer, 0, sizeof(execbuffer)); height = *(uint32_t*)(proc_info+46)+1;
memset(&src_bo, 0, sizeof(src_bo));
memset(&dst_bo, 0, sizeof(dst_bo));
memset(&mask_bo, 0, sizeof(mask_bo));
src_bo.gaddr = src_bitmap->gaddr; printf("%s width %d height %d\n", __FUNCTION__, width, height);
src_bo.pitch = src_bitmap->pitch;
src_bo.tiling = 0;
dst_bo.gaddr = dst_bitmap->gaddr; bo = kgem_create_2d(&sna_device->kgem, width, height,
dst_bo.pitch = dst_bitmap->pitch; 8,I915_TILING_NONE, CREATE_CPU_MAP);
dst_bo.tiling = 0;
mask_bo.gaddr = mask_bitmap->gaddr; if(bo == NULL)
mask_bo.pitch = mask_bitmap->pitch; goto err_1;
mask_bo.tiling = 0;
box.x1 = dst_x; int *map = kgem_bo_map(&sna_device->kgem, bo);
box.y1 = dst_y; if(map == NULL)
box.x2 = dst_x+w; goto err_2;
box.y2 = dst_y+h;
sna_device->render.composite(sna_device, 0, memset(map, 0, bo->pitch * height);
src_bitmap, &src_bo,
mask_bitmap, &mask_bo,
dst_bitmap, &dst_bo,
src_x, src_y,
src_x, src_y,
dst_x, dst_y,
w, h, &cop);
cop.box(sna_device, &cop, &box); mask_bo = bo;
cop.done(sna_device, &cop);
INIT_LIST_HEAD(&execbuffer.objects); return 0;
list_add_tail(&src_bitmap->obj->exec_list, &execbuffer.objects);
list_add_tail(&mask_bitmap->obj->exec_list, &execbuffer.objects);
_kgem_submit(&sna_device->kgem, &execbuffer); err_2:
kgem_bo_destroy(&sna_device->kgem, bo);
err_1:
return -1;
}; };
*/
bool
gen6_composite(struct sna *sna,
uint8_t op,
PixmapPtr src, struct kgem_bo *src_bo,
PixmapPtr mask,struct kgem_bo *mask_bo,
PixmapPtr dst, struct kgem_bo *dst_bo,
int32_t src_x, int32_t src_y,
int32_t msk_x, int32_t msk_y,
int32_t dst_x, int32_t dst_y,
int32_t width, int32_t height,
struct sna_composite_op *tmp);
#define MAP(ptr) ((void*)((uintptr_t)(ptr) & ~3))
int sna_blit_tex(bitmap_t *src_bitmap, int dst_x, int dst_y,
int w, int h, int src_x, int src_y)
{
// box.x1 = dst_x;
// box.y1 = dst_y;
// box.x2 = dst_x+w;
// box.y2 = dst_y+h;
// cop.box(sna_device, &cop, &box);
struct drm_i915_mask_update update;
struct sna_composite_op composite;
struct _Pixmap src, dst, mask;
struct kgem_bo *src_bo;
char proc_info[1024];
int winx, winy, winw, winh;
get_proc_info(proc_info);
winx = *(uint32_t*)(proc_info+34);
winy = *(uint32_t*)(proc_info+38);
winw = *(uint32_t*)(proc_info+42)+1;
winh = *(uint32_t*)(proc_info+46)+1;
memset(&src, 0, sizeof(src));
memset(&dst, 0, sizeof(dst));
memset(&mask, 0, sizeof(dst));
src.drawable.bitsPerPixel = 32;
src.drawable.width = src_bitmap->width;
src.drawable.height = src_bitmap->height;
dst.drawable.bitsPerPixel = 32;
dst.drawable.width = sna_fb.width;
dst.drawable.height = sna_fb.height;
mask.drawable.bitsPerPixel = 8;
mask.drawable.width = winw;
mask.drawable.height = winh;
memset(&composite, 0, sizeof(composite));
src_bo = (struct kgem_bo*)src_bitmap->handle;
if( gen6_composite(sna_device, PictOpSrc,
&src, src_bo,
&mask, mask_bo,
&dst, sna_fb.fb_bo,
src_x, src_y,
dst_x, dst_y,
winx+dst_x, winy+dst_y,
w, h,
&composite) )
{
struct sna_composite_rectangles r;
r.src.x = src_x;
r.src.y = src_y;
r.mask.x = dst_x;
r.mask.y = dst_y;
r.dst.x = winx+dst_x;
r.dst.y = winy+dst_y;
r.width = w;
r.height = h;
composite.blt(sna_device, &composite, &r);
composite.done(sna_device, &composite);
};
VG_CLEAR(update);
update.handle = mask_bo->handle;
update.bo_size = __kgem_bo_size(mask_bo);
update.bo_pitch = mask_bo->pitch;
update.bo_map = MAP(mask_bo->map);
drmIoctl(sna_device->kgem.fd, SRV_MASK_UPDATE, &update);
kgem_submit(&sna_device->kgem);
return 0;
}
static const struct intel_device_info intel_generic_info = { static const struct intel_device_info intel_generic_info = {
.gen = -1, .gen = -1,

View File

@ -74,6 +74,7 @@ int drmIoctl(int fd, unsigned long request, void *arg);
#define SRV_I915_GEM_THROTTLE 32 #define SRV_I915_GEM_THROTTLE 32
#define SRV_FBINFO 33 #define SRV_FBINFO 33
#define SRV_I915_GEM_EXECBUFFER2 34 #define SRV_I915_GEM_EXECBUFFER2 34
#define SRV_MASK_UPDATE 35
#define SRV_I915_GEM_MMAP_GTT 31 #define SRV_I915_GEM_MMAP_GTT 31
@ -112,16 +113,60 @@ typedef enum {
PIXMAN_x2r10g10b10 = PIXMAN_FORMAT(32,PIXMAN_TYPE_ARGB,0,10,10,10), PIXMAN_x2r10g10b10 = PIXMAN_FORMAT(32,PIXMAN_TYPE_ARGB,0,10,10,10),
PIXMAN_a2r10g10b10 = PIXMAN_FORMAT(32,PIXMAN_TYPE_ARGB,2,10,10,10), PIXMAN_a2r10g10b10 = PIXMAN_FORMAT(32,PIXMAN_TYPE_ARGB,2,10,10,10),
PIXMAN_x2b10g10r10 = PIXMAN_FORMAT(32,PIXMAN_TYPE_ABGR,0,10,10,10), PIXMAN_x2b10g10r10 = PIXMAN_FORMAT(32,PIXMAN_TYPE_ABGR,0,10,10,10),
PIXMAN_a2b10g10r10 = PIXMAN_FORMAT(32,PIXMAN_TYPE_ABGR,2,10,10,10) PIXMAN_a2b10g10r10 = PIXMAN_FORMAT(32,PIXMAN_TYPE_ABGR,2,10,10,10),
PIXMAN_a8 = PIXMAN_FORMAT(8,PIXMAN_TYPE_A,8,0,0,0)
} pixman_format_code_t; } pixman_format_code_t;
typedef enum _PictFormatShort {
PICT_a8r8g8b8 = PIXMAN_a8r8g8b8,
PICT_x8r8g8b8 = PIXMAN_x8r8g8b8,
PICT_a8b8g8r8 = PIXMAN_a8b8g8r8,
PICT_x8b8g8r8 = PIXMAN_x8b8g8r8,
PICT_b8g8r8a8 = PIXMAN_b8g8r8a8,
PICT_b8g8r8x8 = PIXMAN_b8g8r8x8,
/* 8bpp formats */
PICT_a8 = PIXMAN_a8,
/* 4bpp formats */
} PictFormatShort;
#define RepeatNone 0
#define RepeatNormal 1
#define RepeatPad 2
#define RepeatReflect 3
#define PictFilterNearest 0
#define PictFilterBilinear 1
#define PictFilterFast 2
#define PictFilterGood 3
#define PictFilterBest 4
#define PictFilterConvolution 5
typedef int32_t pixman_fixed_16_16_t;
typedef pixman_fixed_16_16_t pixman_fixed_t;
struct pixman_transform
{
pixman_fixed_t matrix[3][3];
};
typedef unsigned long Picture; typedef unsigned long Picture;
typedef unsigned long PictFormat; typedef unsigned long PictFormat;
typedef struct _Pixmap *PixmapPtr; typedef struct _Pixmap *PixmapPtr;
typedef struct _Picture *PicturePtr; typedef struct _Picture *PicturePtr;
typedef struct _Drawable *DrawablePtr;
typedef struct _PictFormat *PictFormatPtr;
typedef struct pixman_transform PictTransform, *PictTransformPtr;
typedef struct _Drawable { typedef struct _Drawable {
unsigned char type; /* DRAWABLE_<type> */ unsigned char type; /* DRAWABLE_<type> */
@ -154,6 +199,46 @@ typedef struct _Pixmap {
PixmapPtr master_pixmap; /* pointer to master copy of pixmap for pixmap sharing */ PixmapPtr master_pixmap; /* pointer to master copy of pixmap for pixmap sharing */
} PixmapRec; } PixmapRec;
typedef struct _PictFormat {
uint32_t id;
uint32_t format; /* except bpp */
unsigned char type;
unsigned char depth;
// DirectFormatRec direct;
// IndexFormatRec index;
} PictFormatRec;
typedef struct _Picture {
DrawablePtr pDrawable;
// PictFormatPtr pFormat;
PictFormatShort format; /* PICT_FORMAT */
int refcnt;
uint32_t id;
unsigned int repeat:1;
unsigned int graphicsExposures:1;
unsigned int subWindowMode:1;
unsigned int polyEdge:1;
unsigned int polyMode:1;
unsigned int freeCompClip:1;
unsigned int clientClipType:2;
unsigned int componentAlpha:1;
unsigned int repeatType:2;
unsigned int filter:3;
// unsigned int stateChanges:CPLastBit;
// unsigned int unused:18 - CPLastBit;
// PicturePtr alphaMap;
// PictTransform *transform;
// SourcePictPtr pSourcePict;
// xFixed *filter_params;
// int filter_nparams;
} PictureRec;
#define PolyModePrecise 0
#define PolyModeImprecise 1
struct sna_fb struct sna_fb
{ {
@ -262,31 +347,6 @@ struct sna {
#endif #endif
}; };
static inline int vertex_space(struct sna *sna)
{
return sna->render.vertex_size - sna->render.vertex_used;
}
static inline void vertex_emit(struct sna *sna, float v)
{
assert(sna->render.vertex_used < sna->render.vertex_size);
sna->render.vertices[sna->render.vertex_used++] = v;
}
static inline void vertex_emit_2s(struct sna *sna, int16_t x, int16_t y)
{
int16_t *v = (int16_t *)&sna->render.vertices[sna->render.vertex_used++];
assert(sna->render.vertex_used <= sna->render.vertex_size);
v[0] = x;
v[1] = y;
}
static inline void batch_emit(struct sna *sna, uint32_t dword)
{
assert(sna->kgem.mode != KGEM_NONE);
assert(sna->kgem.nbatch + KGEM_BATCH_RESERVED < sna->kgem.surface);
sna->kgem.batch[sna->kgem.nbatch++] = dword;
}
#ifndef ARRAY_SIZE #ifndef ARRAY_SIZE
#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0])) #define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))

View File

@ -47,7 +47,7 @@ struct sna_composite_op {
struct sna_composite_channel { struct sna_composite_channel {
struct kgem_bo *bo; struct kgem_bo *bo;
// PictTransform *transform; PictTransform *transform;
uint16_t width; uint16_t width;
uint16_t height; uint16_t height;
uint32_t pict_format; uint32_t pict_format;
@ -160,7 +160,6 @@ struct sna_render {
#define PREFER_GPU_RENDER 0x2 #define PREFER_GPU_RENDER 0x2
#define PREFER_GPU_SPANS 0x4 #define PREFER_GPU_SPANS 0x4
#if 0
bool (*composite)(struct sna *sna, uint8_t op, bool (*composite)(struct sna *sna, uint8_t op,
PicturePtr dst, PicturePtr src, PicturePtr mask, PicturePtr dst, PicturePtr src, PicturePtr mask,
@ -170,6 +169,7 @@ struct sna_render {
int16_t w, int16_t h, int16_t w, int16_t h,
struct sna_composite_op *tmp); struct sna_composite_op *tmp);
#if 0
bool (*check_composite_spans)(struct sna *sna, uint8_t op, bool (*check_composite_spans)(struct sna *sna, uint8_t op,
PicturePtr dst, PicturePtr src, PicturePtr dst, PicturePtr src,
int16_t w, int16_t h, unsigned flags); int16_t w, int16_t h, unsigned flags);