sna/gen4: Revert changes to 965g[m]
The changes tested on g45/gm45 prove to be highly unstable on 965gm, suggesting a radical difference in the nature of the bugs between the two generations. In theory, g4x has additional features that could be exploited over and above gen4 which may prove interesting in the future. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
parent
d560296561
commit
54d8968da5
|
|
@ -72,6 +72,7 @@ libsna_la_SOURCES = \
|
|||
gen3_render.c \
|
||||
gen3_render.h \
|
||||
gen4_render.c \
|
||||
g4x_render.c \
|
||||
gen4_render.h \
|
||||
gen5_render.c \
|
||||
gen5_render.h \
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -65,8 +65,12 @@
|
|||
gen4_vertex_flush(sna); \
|
||||
OUT_BATCH(MI_FLUSH | MI_INHIBIT_RENDER_CACHE_FLUSH); \
|
||||
} while (0)
|
||||
#define FLUSH(OP) do { \
|
||||
if ((OP)->mask.bo == NULL) _FLUSH(); \
|
||||
} while (0)
|
||||
#else
|
||||
#define _FLUSH()
|
||||
#define FLUSH(OP)
|
||||
#endif
|
||||
|
||||
#define GEN4_GRF_BLOCKS(nreg) ((nreg + 15) / 16 - 1)
|
||||
|
|
@ -97,15 +101,8 @@
|
|||
#define SF_KERNEL_NUM_GRF 16
|
||||
#define PS_KERNEL_NUM_GRF 32
|
||||
|
||||
static const struct gt_info {
|
||||
uint32_t max_sf_threads;
|
||||
uint32_t max_wm_threads;
|
||||
uint32_t urb_size;
|
||||
} gen4_gt_info = {
|
||||
24, 32, 256,
|
||||
}, g4x_gt_info = {
|
||||
24, 50, 384,
|
||||
};
|
||||
#define GEN4_MAX_SF_THREADS 24
|
||||
#define GEN4_MAX_WM_THREADS 32
|
||||
|
||||
static const uint32_t ps_kernel_packed_static[][4] = {
|
||||
#include "exa_wm_xy.g4b"
|
||||
|
|
@ -237,7 +234,7 @@ static void gen4_magic_ca_pass(struct sna *sna,
|
|||
gen4_emit_pipelined_pointers(sna, op, PictOpAdd,
|
||||
gen4_choose_composite_kernel(PictOpAdd,
|
||||
true, true, op->is_affine));
|
||||
OUT_BATCH(MI_FLUSH | MI_INHIBIT_RENDER_CACHE_FLUSH);
|
||||
OUT_BATCH(MI_FLUSH);
|
||||
|
||||
OUT_BATCH(GEN4_3DPRIMITIVE |
|
||||
GEN4_3DPRIMITIVE_VERTEX_SEQUENTIAL |
|
||||
|
|
@ -702,23 +699,23 @@ gen4_emit_composite_primitive_solid(struct sna *sna,
|
|||
} dst;
|
||||
|
||||
v = sna->render.vertices + sna->render.vertex_used;
|
||||
sna->render.vertex_used += 15;
|
||||
sna->render.vertex_used += 9;
|
||||
|
||||
dst.p.x = r->dst.x + r->width;
|
||||
dst.p.y = r->dst.y + r->height;
|
||||
v[0] = dst.f;
|
||||
v[3] = v[1] = 1.;
|
||||
v[4] = v[2] = 1.;
|
||||
v[1] = 1.;
|
||||
v[2] = 1.;
|
||||
|
||||
dst.p.x = r->dst.x;
|
||||
v[5] = dst.f;
|
||||
v[8] = v[6] = 0.;
|
||||
v[9] = v[7] = 1.;
|
||||
v[3] = dst.f;
|
||||
v[4] = 0.;
|
||||
v[5] = 1.;
|
||||
|
||||
dst.p.y = r->dst.y;
|
||||
v[10] = dst.f;
|
||||
v[13] = v[11] = 0.;
|
||||
v[14] = v[12] = 0.;
|
||||
v[6] = dst.f;
|
||||
v[7] = 0.;
|
||||
v[8] = 0.;
|
||||
}
|
||||
|
||||
fastcall static void
|
||||
|
|
@ -734,7 +731,7 @@ gen4_emit_composite_primitive_identity_source(struct sna *sna,
|
|||
} dst;
|
||||
|
||||
v = sna->render.vertices + sna->render.vertex_used;
|
||||
sna->render.vertex_used += 15;
|
||||
sna->render.vertex_used += 9;
|
||||
|
||||
sx = r->src.x + op->src.offset[0];
|
||||
sy = r->src.y + op->src.offset[1];
|
||||
|
|
@ -744,22 +741,16 @@ gen4_emit_composite_primitive_identity_source(struct sna *sna,
|
|||
v[0] = dst.f;
|
||||
v[1] = (sx + r->width) * sf[0];
|
||||
v[2] = (sy + r->height) * sf[1];
|
||||
v[3] = 1.;
|
||||
v[4] = 1.;
|
||||
|
||||
dst.p.x = r->dst.x;
|
||||
v[5] = dst.f;
|
||||
v[6] = sx * sf[0];
|
||||
v[7] = v[2];
|
||||
v[8] = 0.;
|
||||
v[9] = 1.;
|
||||
v[3] = dst.f;
|
||||
v[4] = sx * sf[0];
|
||||
v[5] = v[2];
|
||||
|
||||
dst.p.y = r->dst.y;
|
||||
v[10] = dst.f;
|
||||
v[11] = v[6];
|
||||
v[12] = sy * sf[1];
|
||||
v[13] = 0.;
|
||||
v[14] = 0.;
|
||||
v[6] = dst.f;
|
||||
v[7] = v[4];
|
||||
v[8] = sy * sf[1];
|
||||
}
|
||||
|
||||
fastcall static void
|
||||
|
|
@ -774,7 +765,7 @@ gen4_emit_composite_primitive_affine_source(struct sna *sna,
|
|||
float *v;
|
||||
|
||||
v = sna->render.vertices + sna->render.vertex_used;
|
||||
sna->render.vertex_used += 15;
|
||||
sna->render.vertex_used += 9;
|
||||
|
||||
dst.p.x = r->dst.x + r->width;
|
||||
dst.p.y = r->dst.y + r->height;
|
||||
|
|
@ -785,30 +776,24 @@ gen4_emit_composite_primitive_affine_source(struct sna *sna,
|
|||
&v[1], &v[2]);
|
||||
v[1] *= op->src.scale[0];
|
||||
v[2] *= op->src.scale[1];
|
||||
v[3] = 1.;
|
||||
v[4] = 1.;
|
||||
|
||||
dst.p.x = r->dst.x;
|
||||
v[5] = dst.f;
|
||||
v[3] = dst.f;
|
||||
_sna_get_transformed_coordinates(op->src.offset[0] + r->src.x,
|
||||
op->src.offset[1] + r->src.y + r->height,
|
||||
op->src.transform,
|
||||
&v[6], &v[7]);
|
||||
v[6] *= op->src.scale[0];
|
||||
v[7] *= op->src.scale[1];
|
||||
v[8] = 0.;
|
||||
v[9] = 1.;
|
||||
&v[4], &v[5]);
|
||||
v[4] *= op->src.scale[0];
|
||||
v[5] *= op->src.scale[1];
|
||||
|
||||
dst.p.y = r->dst.y;
|
||||
v[10] = dst.f;
|
||||
v[6] = dst.f;
|
||||
_sna_get_transformed_coordinates(op->src.offset[0] + r->src.x,
|
||||
op->src.offset[1] + r->src.y,
|
||||
op->src.transform,
|
||||
&v[11], &v[12]);
|
||||
v[11] *= op->src.scale[0];
|
||||
v[12] *= op->src.scale[1];
|
||||
v[13] = 0.;
|
||||
v[14] = 0.;
|
||||
&v[7], &v[8]);
|
||||
v[7] *= op->src.scale[0];
|
||||
v[8] *= op->src.scale[1];
|
||||
}
|
||||
|
||||
fastcall static void
|
||||
|
|
@ -867,7 +852,6 @@ gen4_emit_composite_primitive(struct sna *sna,
|
|||
bool is_affine = op->is_affine;
|
||||
const float *src_sf = op->src.scale;
|
||||
const float *mask_sf = op->mask.scale;
|
||||
bool has_mask = op->u.gen4.ve_id & 2;
|
||||
|
||||
if (is_affine) {
|
||||
sna_get_transformed_coordinates(r->src.x + op->src.offset[0],
|
||||
|
|
@ -908,7 +892,7 @@ gen4_emit_composite_primitive(struct sna *sna,
|
|||
&src_w[2]);
|
||||
}
|
||||
|
||||
if (has_mask) {
|
||||
if (op->mask.bo) {
|
||||
if (is_affine) {
|
||||
sna_get_transformed_coordinates(r->mask.x + op->mask.offset[0],
|
||||
r->mask.y + op->mask.offset[1],
|
||||
|
|
@ -954,7 +938,7 @@ gen4_emit_composite_primitive(struct sna *sna,
|
|||
OUT_VERTEX_F(src_y[2] * src_sf[1]);
|
||||
if (!is_affine)
|
||||
OUT_VERTEX_F(src_w[2]);
|
||||
if (has_mask) {
|
||||
if (op->mask.bo) {
|
||||
OUT_VERTEX_F(mask_x[2] * mask_sf[0]);
|
||||
OUT_VERTEX_F(mask_y[2] * mask_sf[1]);
|
||||
if (!is_affine)
|
||||
|
|
@ -966,7 +950,7 @@ gen4_emit_composite_primitive(struct sna *sna,
|
|||
OUT_VERTEX_F(src_y[1] * src_sf[1]);
|
||||
if (!is_affine)
|
||||
OUT_VERTEX_F(src_w[1]);
|
||||
if (has_mask) {
|
||||
if (op->mask.bo) {
|
||||
OUT_VERTEX_F(mask_x[1] * mask_sf[0]);
|
||||
OUT_VERTEX_F(mask_y[1] * mask_sf[1]);
|
||||
if (!is_affine)
|
||||
|
|
@ -978,7 +962,7 @@ gen4_emit_composite_primitive(struct sna *sna,
|
|||
OUT_VERTEX_F(src_y[0] * src_sf[1]);
|
||||
if (!is_affine)
|
||||
OUT_VERTEX_F(src_w[0]);
|
||||
if (has_mask) {
|
||||
if (op->mask.bo) {
|
||||
OUT_VERTEX_F(mask_x[0] * mask_sf[0]);
|
||||
OUT_VERTEX_F(mask_y[0] * mask_sf[1]);
|
||||
if (!is_affine)
|
||||
|
|
@ -1260,7 +1244,7 @@ gen4_emit_pipelined_pointers(struct sna *sna,
|
|||
uint16_t sp, bp;
|
||||
|
||||
DBG(("%s: has_mask=%d, src=(%d, %d), mask=(%d, %d),kernel=%d, blend=%d, ca=%d, format=%x\n",
|
||||
__FUNCTION__, op->u.gen4.ve_id & 2,
|
||||
__FUNCTION__, op->mask.bo != NULL,
|
||||
op->src.filter, op->src.repeat,
|
||||
op->mask.filter, op->mask.repeat,
|
||||
kernel, blend, op->has_component_alpha, (int)op->dst.format));
|
||||
|
|
@ -1280,7 +1264,7 @@ gen4_emit_pipelined_pointers(struct sna *sna,
|
|||
OUT_BATCH(sna->render_state.gen4.vs);
|
||||
OUT_BATCH(GEN4_GS_DISABLE); /* passthrough */
|
||||
OUT_BATCH(GEN4_CLIP_DISABLE); /* passthrough */
|
||||
OUT_BATCH(sna->render_state.gen4.sf[!!(op->u.gen4.ve_id & 2)]);
|
||||
OUT_BATCH(sna->render_state.gen4.sf[op->mask.bo != NULL]);
|
||||
OUT_BATCH(sna->render_state.gen4.wm + sp);
|
||||
OUT_BATCH(sna->render_state.gen4.cc + bp);
|
||||
|
||||
|
|
@ -1321,17 +1305,19 @@ gen4_emit_vertex_elements(struct sna *sna,
|
|||
* texture coordinate 1 if (has_mask is true): same as above
|
||||
*/
|
||||
struct gen4_render_state *render = &sna->render_state.gen4;
|
||||
int id = op->u.gen4.ve_id;
|
||||
int selem, nelem;
|
||||
bool has_mask = op->mask.bo != NULL;
|
||||
int nelem = has_mask ? 2 : 1;
|
||||
int selem;
|
||||
uint32_t w_component;
|
||||
uint32_t src_format;
|
||||
int id = op->u.gen4.ve_id;
|
||||
|
||||
if (render->ve_id == id)
|
||||
return;
|
||||
|
||||
render->ve_id = id;
|
||||
|
||||
if (id & 1) {
|
||||
if (op->is_affine) {
|
||||
src_format = GEN4_SURFACEFORMAT_R32G32_FLOAT;
|
||||
w_component = GEN4_VFCOMPONENT_STORE_1_FLT;
|
||||
selem = 2;
|
||||
|
|
@ -1340,7 +1326,6 @@ gen4_emit_vertex_elements(struct sna *sna,
|
|||
w_component = GEN4_VFCOMPONENT_STORE_SRC;
|
||||
selem = 3;
|
||||
}
|
||||
nelem = id & 2 ? 2 : 1;
|
||||
|
||||
/* The VUE layout
|
||||
* dword 0-3: position (x, y, 1.0, 1.0),
|
||||
|
|
@ -1370,7 +1355,7 @@ gen4_emit_vertex_elements(struct sna *sna,
|
|||
(2*4) << VE1_DESTINATION_ELEMENT_OFFSET_SHIFT); /* VUE offset in dwords */
|
||||
|
||||
/* u1, v1, w1 */
|
||||
if (id & 2) {
|
||||
if (has_mask) {
|
||||
OUT_BATCH(id << VE0_VERTEX_BUFFER_INDEX_SHIFT | VE0_VALID |
|
||||
src_format << VE0_FORMAT_SHIFT |
|
||||
((1 + selem) * 4) << VE0_OFFSET_SHIFT); /* vb offset in bytes */
|
||||
|
|
@ -1387,14 +1372,14 @@ gen4_emit_state(struct sna *sna,
|
|||
const struct sna_composite_op *op,
|
||||
uint16_t wm_binding_table)
|
||||
{
|
||||
bool flush = wm_binding_table & 1;
|
||||
bool flush = false;
|
||||
|
||||
gen4_emit_drawing_rectangle(sna, op);
|
||||
flush |= gen4_emit_binding_table(sna, wm_binding_table & ~1);
|
||||
flush |= gen4_emit_binding_table(sna, wm_binding_table);
|
||||
flush |= gen4_emit_pipelined_pointers(sna, op, op->op, op->u.gen4.wm_kernel);
|
||||
gen4_emit_vertex_elements(sna, op);
|
||||
|
||||
if (kgem_bo_is_dirty(op->src.bo) || kgem_bo_is_dirty(op->mask.bo)) {
|
||||
if (flush || kgem_bo_is_dirty(op->src.bo) || kgem_bo_is_dirty(op->mask.bo)) {
|
||||
DBG(("%s: flushing dirty (%d, %d), forced? %d\n", __FUNCTION__,
|
||||
kgem_bo_is_dirty(op->src.bo),
|
||||
kgem_bo_is_dirty(op->mask.bo),
|
||||
|
|
@ -1402,17 +1387,13 @@ gen4_emit_state(struct sna *sna,
|
|||
OUT_BATCH(MI_FLUSH);
|
||||
kgem_clear_dirty(&sna->kgem);
|
||||
kgem_bo_mark_dirty(op->dst.bo);
|
||||
flush = false;
|
||||
}
|
||||
if (flush && op->op > PictOpSrc)
|
||||
OUT_BATCH(MI_FLUSH | MI_INHIBIT_RENDER_CACHE_FLUSH);
|
||||
}
|
||||
|
||||
static void
|
||||
gen4_bind_surfaces(struct sna *sna,
|
||||
const struct sna_composite_op *op)
|
||||
{
|
||||
bool dirty = kgem_bo_is_dirty(op->dst.bo);
|
||||
uint32_t *binding_table;
|
||||
uint16_t offset;
|
||||
|
||||
|
|
@ -1430,8 +1411,7 @@ gen4_bind_surfaces(struct sna *sna,
|
|||
op->src.bo, op->src.width, op->src.height,
|
||||
op->src.card_format,
|
||||
false);
|
||||
if (op->mask.bo) {
|
||||
assert(op->u.gen4.ve_id & 2);
|
||||
if (op->mask.bo)
|
||||
binding_table[2] =
|
||||
gen4_bind_bo(sna,
|
||||
op->mask.bo,
|
||||
|
|
@ -1439,7 +1419,6 @@ gen4_bind_surfaces(struct sna *sna,
|
|||
op->mask.height,
|
||||
op->mask.card_format,
|
||||
false);
|
||||
}
|
||||
|
||||
if (sna->kgem.surface == offset &&
|
||||
*(uint64_t *)(sna->kgem.batch + sna->render_state.gen4.surface_table) == *(uint64_t*)binding_table &&
|
||||
|
|
@ -1449,7 +1428,7 @@ gen4_bind_surfaces(struct sna *sna,
|
|||
offset = sna->render_state.gen4.surface_table;
|
||||
}
|
||||
|
||||
gen4_emit_state(sna, op, offset | dirty);
|
||||
gen4_emit_state(sna, op, offset);
|
||||
}
|
||||
|
||||
fastcall static void
|
||||
|
|
@ -1466,6 +1445,9 @@ gen4_render_composite_blt(struct sna *sna,
|
|||
|
||||
gen4_get_rectangles(sna, op, 1, gen4_bind_surfaces);
|
||||
op->prim_emit(sna, op, r);
|
||||
|
||||
/* XXX are the shaders fubar? */
|
||||
FLUSH(op);
|
||||
}
|
||||
|
||||
fastcall static void
|
||||
|
|
@ -1475,19 +1457,13 @@ gen4_render_composite_box(struct sna *sna,
|
|||
{
|
||||
struct sna_composite_rectangles r;
|
||||
|
||||
DBG((" %s: (%d, %d), (%d, %d)\n",
|
||||
__FUNCTION__,
|
||||
box->x1, box->y1, box->x2, box->y2));
|
||||
|
||||
gen4_get_rectangles(sna, op, 1, gen4_bind_surfaces);
|
||||
|
||||
r.dst.x = box->x1;
|
||||
r.dst.y = box->y1;
|
||||
r.width = box->x2 - box->x1;
|
||||
r.height = box->y2 - box->y1;
|
||||
r.mask = r.src = r.dst;
|
||||
|
||||
op->prim_emit(sna, op, &r);
|
||||
gen4_render_composite_blt(sna, op, &r);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -1503,28 +1479,16 @@ gen4_render_composite_boxes(struct sna *sna,
|
|||
op->mask.width, op->mask.height));
|
||||
|
||||
do {
|
||||
int nbox_this_time;
|
||||
struct sna_composite_rectangles r;
|
||||
|
||||
nbox_this_time = gen4_get_rectangles(sna, op, nbox,
|
||||
gen4_bind_surfaces);
|
||||
nbox -= nbox_this_time;
|
||||
|
||||
do {
|
||||
struct sna_composite_rectangles r;
|
||||
|
||||
DBG((" %s: (%d, %d), (%d, %d)\n",
|
||||
__FUNCTION__,
|
||||
box->x1, box->y1, box->x2, box->y2));
|
||||
|
||||
r.dst.x = box->x1;
|
||||
r.dst.y = box->y1;
|
||||
r.width = box->x2 - box->x1;
|
||||
r.height = box->y2 - box->y1;
|
||||
r.mask = r.src = r.dst;
|
||||
op->prim_emit(sna, op, &r);
|
||||
box++;
|
||||
} while (--nbox_this_time);
|
||||
} while (nbox);
|
||||
r.dst.x = box->x1;
|
||||
r.dst.y = box->y1;
|
||||
r.width = box->x2 - box->x1;
|
||||
r.height = box->y2 - box->y1;
|
||||
r.mask = r.src = r.dst;
|
||||
gen4_render_composite_blt(sna, op, &r);
|
||||
box++;
|
||||
} while (--nbox);
|
||||
}
|
||||
|
||||
#ifndef MAX
|
||||
|
|
@ -1565,7 +1529,6 @@ static uint32_t gen4_bind_video_source(struct sna *sna,
|
|||
static void gen4_video_bind_surfaces(struct sna *sna,
|
||||
const struct sna_composite_op *op)
|
||||
{
|
||||
bool dirty = kgem_bo_is_dirty(op->dst.bo);
|
||||
struct sna_video_frame *frame = op->priv;
|
||||
uint32_t src_surf_format;
|
||||
uint32_t src_surf_base[6];
|
||||
|
|
@ -1627,7 +1590,7 @@ static void gen4_video_bind_surfaces(struct sna *sna,
|
|||
src_surf_format);
|
||||
}
|
||||
|
||||
gen4_emit_state(sna, op, offset | dirty);
|
||||
gen4_emit_state(sna, op, offset);
|
||||
}
|
||||
|
||||
static bool
|
||||
|
|
@ -2332,7 +2295,6 @@ gen4_render_composite(struct sna *sna,
|
|||
dst_x, dst_y, width, height))
|
||||
return false;
|
||||
|
||||
tmp->op = op;
|
||||
switch (gen4_composite_picture(sna, src, &tmp->src,
|
||||
src_x, src_y,
|
||||
width, height,
|
||||
|
|
@ -2356,6 +2318,7 @@ gen4_render_composite(struct sna *sna,
|
|||
break;
|
||||
}
|
||||
|
||||
tmp->op = op;
|
||||
tmp->is_affine = tmp->src.is_affine;
|
||||
tmp->has_component_alpha = false;
|
||||
tmp->need_magic_ca_pass = false;
|
||||
|
|
@ -2409,6 +2372,7 @@ gen4_render_composite(struct sna *sna,
|
|||
if (tmp->src.transform == NULL && tmp->mask.transform == NULL)
|
||||
tmp->prim_emit = gen4_emit_composite_primitive_identity_source_mask;
|
||||
|
||||
tmp->floats_per_vertex = 5 + 2 * !tmp->is_affine;
|
||||
} else {
|
||||
if (tmp->src.is_solid)
|
||||
tmp->prim_emit = gen4_emit_composite_primitive_solid;
|
||||
|
|
@ -2416,16 +2380,17 @@ gen4_render_composite(struct sna *sna,
|
|||
tmp->prim_emit = gen4_emit_composite_primitive_identity_source;
|
||||
else if (tmp->src.is_affine)
|
||||
tmp->prim_emit = gen4_emit_composite_primitive_affine_source;
|
||||
|
||||
tmp->floats_per_vertex = 3 + !tmp->is_affine;
|
||||
}
|
||||
tmp->floats_per_vertex = 5 + 2 * !tmp->is_affine;
|
||||
tmp->floats_per_rect = 3*tmp->floats_per_vertex;
|
||||
|
||||
tmp->u.gen4.wm_kernel =
|
||||
gen4_choose_composite_kernel(tmp->op,
|
||||
mask != NULL,
|
||||
tmp->mask.bo != NULL,
|
||||
tmp->has_component_alpha,
|
||||
tmp->is_affine);
|
||||
tmp->u.gen4.ve_id = 1 << 1 | tmp->is_affine;
|
||||
tmp->u.gen4.ve_id = (tmp->mask.bo != NULL) << 1 | tmp->is_affine;
|
||||
|
||||
tmp->blt = gen4_render_composite_blt;
|
||||
tmp->box = gen4_render_composite_box;
|
||||
|
|
@ -2592,6 +2557,8 @@ gen4_render_composite_spans_box(struct sna *sna,
|
|||
|
||||
gen4_get_rectangles(sna, &op->base, 1, gen4_bind_surfaces);
|
||||
op->prim_emit(sna, op, box, opacity);
|
||||
|
||||
_FLUSH();
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -2619,6 +2586,7 @@ gen4_render_composite_spans_done(struct sna *sna,
|
|||
|
||||
DBG(("%s()\n", __FUNCTION__));
|
||||
|
||||
kgem_bo_destroy(&sna->kgem, op->base.mask.bo);
|
||||
if (op->base.src.bo)
|
||||
kgem_bo_destroy(&sna->kgem, op->base.src.bo);
|
||||
|
||||
|
|
@ -2712,7 +2680,9 @@ gen4_render_composite_spans(struct sna *sna,
|
|||
break;
|
||||
}
|
||||
|
||||
tmp->base.mask.bo = NULL;
|
||||
tmp->base.mask.bo = sna_render_get_solid(sna, 0);
|
||||
if (tmp->base.mask.bo == NULL)
|
||||
goto cleanup_src;
|
||||
|
||||
tmp->base.is_affine = tmp->base.src.is_affine;
|
||||
tmp->base.has_component_alpha = false;
|
||||
|
|
@ -2765,7 +2735,6 @@ cleanup_dst:
|
|||
static void
|
||||
gen4_copy_bind_surfaces(struct sna *sna, const struct sna_composite_op *op)
|
||||
{
|
||||
bool dirty = kgem_bo_is_dirty(op->dst.bo);
|
||||
uint32_t *binding_table;
|
||||
uint16_t offset;
|
||||
|
||||
|
|
@ -2790,7 +2759,7 @@ gen4_copy_bind_surfaces(struct sna *sna, const struct sna_composite_op *op)
|
|||
offset = sna->render_state.gen4.surface_table;
|
||||
}
|
||||
|
||||
gen4_emit_state(sna, op, offset | dirty);
|
||||
gen4_emit_state(sna, op, offset);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -3091,30 +3060,57 @@ fallback:
|
|||
return true;
|
||||
}
|
||||
|
||||
static void
|
||||
gen4_fill_bind_surfaces(struct sna *sna, const struct sna_composite_op *op)
|
||||
{
|
||||
uint32_t *binding_table;
|
||||
uint16_t offset;
|
||||
|
||||
gen4_get_batch(sna);
|
||||
|
||||
binding_table = gen4_composite_get_binding_table(sna, &offset);
|
||||
|
||||
binding_table[0] =
|
||||
gen4_bind_bo(sna,
|
||||
op->dst.bo, op->dst.width, op->dst.height,
|
||||
gen4_get_dest_format(op->dst.format),
|
||||
true);
|
||||
binding_table[1] =
|
||||
gen4_bind_bo(sna,
|
||||
op->src.bo, 1, 1,
|
||||
GEN4_SURFACEFORMAT_B8G8R8A8_UNORM,
|
||||
false);
|
||||
|
||||
if (sna->kgem.surface == offset &&
|
||||
*(uint64_t *)(sna->kgem.batch + sna->render_state.gen4.surface_table) == *(uint64_t*)binding_table) {
|
||||
sna->kgem.surface +=
|
||||
sizeof(struct gen4_surface_state_padded)/sizeof(uint32_t);
|
||||
offset = sna->render_state.gen4.surface_table;
|
||||
}
|
||||
|
||||
gen4_emit_state(sna, op, offset);
|
||||
}
|
||||
|
||||
static void
|
||||
gen4_render_fill_rectangle(struct sna *sna,
|
||||
const struct sna_composite_op *op,
|
||||
int x, int y, int w, int h)
|
||||
{
|
||||
gen4_get_rectangles(sna, op, 1, gen4_bind_surfaces);
|
||||
gen4_get_rectangles(sna, op, 1, gen4_fill_bind_surfaces);
|
||||
|
||||
OUT_VERTEX(x+w, y+h);
|
||||
OUT_VERTEX_F(1);
|
||||
OUT_VERTEX_F(1);
|
||||
OUT_VERTEX_F(1);
|
||||
OUT_VERTEX_F(1);
|
||||
|
||||
OUT_VERTEX(x, y+h);
|
||||
OUT_VERTEX_F(0);
|
||||
OUT_VERTEX_F(1);
|
||||
OUT_VERTEX_F(0);
|
||||
OUT_VERTEX_F(1);
|
||||
|
||||
OUT_VERTEX(x, y);
|
||||
OUT_VERTEX_F(0);
|
||||
OUT_VERTEX_F(0);
|
||||
OUT_VERTEX_F(0);
|
||||
OUT_VERTEX_F(0);
|
||||
|
||||
_FLUSH();
|
||||
}
|
||||
|
||||
static bool
|
||||
|
|
@ -3188,20 +3184,22 @@ gen4_render_fill_boxes(struct sna *sna,
|
|||
tmp.dst.format = format;
|
||||
tmp.dst.bo = dst_bo;
|
||||
|
||||
gen4_composite_solid_init(sna, &tmp.src, pixel);
|
||||
tmp.src.bo = sna_render_get_solid(sna, pixel);
|
||||
tmp.src.filter = SAMPLER_FILTER_NEAREST;
|
||||
tmp.src.repeat = SAMPLER_EXTEND_REPEAT;
|
||||
|
||||
tmp.is_affine = true;
|
||||
tmp.floats_per_vertex = 5;
|
||||
tmp.floats_per_rect = 15;
|
||||
tmp.floats_per_vertex = 3;
|
||||
tmp.floats_per_rect = 9;
|
||||
tmp.u.gen4.wm_kernel = WM_KERNEL;
|
||||
tmp.u.gen4.ve_id = 1 | 1 << 1;
|
||||
tmp.u.gen4.ve_id = 1;
|
||||
|
||||
if (!kgem_check_bo(&sna->kgem, dst_bo, NULL)) {
|
||||
kgem_submit(&sna->kgem);
|
||||
assert(kgem_check_bo(&sna->kgem, dst_bo, NULL));
|
||||
}
|
||||
|
||||
gen4_bind_surfaces(sna, &tmp);
|
||||
gen4_fill_bind_surfaces(sna, &tmp);
|
||||
gen4_align_vertex(sna, &tmp);
|
||||
|
||||
do {
|
||||
|
|
@ -3290,23 +3288,29 @@ gen4_render_fill(struct sna *sna, uint8_t alu,
|
|||
op->base.need_magic_ca_pass = 0;
|
||||
op->base.has_component_alpha = 0;
|
||||
|
||||
gen4_composite_solid_init(sna, &op->base.src,
|
||||
sna_rgba_for_color(color,
|
||||
dst->drawable.depth));
|
||||
op->base.src.bo =
|
||||
sna_render_get_solid(sna,
|
||||
sna_rgba_for_color(color,
|
||||
dst->drawable.depth));
|
||||
op->base.src.filter = SAMPLER_FILTER_NEAREST;
|
||||
op->base.src.repeat = SAMPLER_EXTEND_REPEAT;
|
||||
|
||||
op->base.mask.bo = NULL;
|
||||
op->base.mask.filter = SAMPLER_FILTER_NEAREST;
|
||||
op->base.mask.repeat = SAMPLER_EXTEND_NONE;
|
||||
|
||||
op->base.is_affine = true;
|
||||
op->base.floats_per_vertex = 5;
|
||||
op->base.floats_per_rect = 15;
|
||||
op->base.floats_per_vertex = 3;
|
||||
op->base.floats_per_rect = 9;
|
||||
op->base.u.gen4.wm_kernel = WM_KERNEL;
|
||||
op->base.u.gen4.ve_id = 1 | 1 << 1;
|
||||
op->base.u.gen4.ve_id = 1;
|
||||
|
||||
if (!kgem_check_bo(&sna->kgem, dst_bo, NULL)) {
|
||||
kgem_submit(&sna->kgem);
|
||||
assert(kgem_check_bo(&sna->kgem, dst_bo, NULL));
|
||||
}
|
||||
|
||||
gen4_bind_surfaces(sna, &op->base);
|
||||
gen4_fill_bind_surfaces(sna, &op->base);
|
||||
gen4_align_vertex(sna, &op->base);
|
||||
|
||||
op->blt = gen4_render_fill_op_blt;
|
||||
|
|
@ -3366,26 +3370,32 @@ gen4_render_fill_one(struct sna *sna, PixmapPtr dst, struct kgem_bo *bo,
|
|||
tmp.dst.bo = bo;
|
||||
tmp.dst.x = tmp.dst.y = 0;
|
||||
|
||||
gen4_composite_solid_init(sna, &tmp.src,
|
||||
sna_rgba_for_color(color,
|
||||
dst->drawable.depth));
|
||||
tmp.src.bo =
|
||||
sna_render_get_solid(sna,
|
||||
sna_rgba_for_color(color,
|
||||
dst->drawable.depth));
|
||||
tmp.src.filter = SAMPLER_FILTER_NEAREST;
|
||||
tmp.src.repeat = SAMPLER_EXTEND_REPEAT;
|
||||
|
||||
tmp.mask.bo = NULL;
|
||||
tmp.mask.filter = SAMPLER_FILTER_NEAREST;
|
||||
tmp.mask.repeat = SAMPLER_EXTEND_NONE;
|
||||
|
||||
tmp.is_affine = true;
|
||||
tmp.floats_per_vertex = 5;
|
||||
tmp.floats_per_rect = 15;
|
||||
tmp.floats_per_vertex = 3;
|
||||
tmp.floats_per_rect = 9;
|
||||
tmp.has_component_alpha = 0;
|
||||
tmp.need_magic_ca_pass = false;
|
||||
|
||||
tmp.u.gen4.wm_kernel = WM_KERNEL;
|
||||
tmp.u.gen4.ve_id = 1 | 1 << 1;
|
||||
tmp.u.gen4.ve_id = 1;
|
||||
|
||||
if (!kgem_check_bo(&sna->kgem, bo, NULL)) {
|
||||
_kgem_submit(&sna->kgem);
|
||||
assert(kgem_check_bo(&sna->kgem, bo, NULL));
|
||||
}
|
||||
|
||||
gen4_bind_surfaces(sna, &tmp);
|
||||
gen4_fill_bind_surfaces(sna, &tmp);
|
||||
gen4_align_vertex(sna, &tmp);
|
||||
|
||||
gen4_render_fill_rectangle(sna, &tmp, x1, y1, x2 - x1, y2 - y1);
|
||||
|
|
@ -3477,7 +3487,6 @@ static uint32_t gen4_create_vs_unit_state(struct sna_static_stream *stream)
|
|||
}
|
||||
|
||||
static uint32_t gen4_create_sf_state(struct sna_static_stream *stream,
|
||||
const struct gt_info *info,
|
||||
uint32_t kernel)
|
||||
{
|
||||
struct gen4_sf_unit_state *sf;
|
||||
|
|
@ -3492,7 +3501,7 @@ static uint32_t gen4_create_sf_state(struct sna_static_stream *stream,
|
|||
/* don't smash vertex header, read start from dw8 */
|
||||
sf->thread3.urb_entry_read_offset = 1;
|
||||
sf->thread3.dispatch_grf_start_reg = 3;
|
||||
sf->thread4.max_threads = info->max_sf_threads - 1;
|
||||
sf->thread4.max_threads = GEN4_MAX_SF_THREADS - 1;
|
||||
sf->thread4.urb_entry_allocation_size = URB_SF_ENTRY_SIZE - 1;
|
||||
sf->thread4.nr_urb_entries = URB_SF_ENTRIES;
|
||||
sf->sf5.viewport_transform = false; /* skip viewport */
|
||||
|
|
@ -3523,7 +3532,6 @@ static uint32_t gen4_create_sampler_state(struct sna_static_stream *stream,
|
|||
}
|
||||
|
||||
static void gen4_init_wm_state(struct gen4_wm_unit_state *wm,
|
||||
const struct gt_info *info,
|
||||
bool has_mask,
|
||||
uint32_t kernel,
|
||||
uint32_t sampler)
|
||||
|
|
@ -3544,7 +3552,7 @@ static void gen4_init_wm_state(struct gen4_wm_unit_state *wm,
|
|||
wm->wm4.sampler_state_pointer = sampler >> 5;
|
||||
wm->wm4.sampler_count = 1;
|
||||
|
||||
wm->wm5.max_threads = info->max_wm_threads - 1;
|
||||
wm->wm5.max_threads = GEN4_MAX_WM_THREADS - 1;
|
||||
wm->wm5.transposed_urb_read = 0;
|
||||
wm->wm5.thread_dispatch_enable = 1;
|
||||
/* just use 16-pixel dispatch (4 subspans), don't need to change kernel
|
||||
|
|
@ -3620,15 +3628,9 @@ static bool gen4_render_setup(struct sna *sna)
|
|||
struct gen4_render_state *state = &sna->render_state.gen4;
|
||||
struct sna_static_stream general;
|
||||
struct gen4_wm_unit_state_padded *wm_state;
|
||||
const struct gt_info *info;
|
||||
uint32_t sf[2], wm[KERNEL_COUNT];
|
||||
int i, j, k, l, m;
|
||||
|
||||
if (sna->kgem.gen == 45)
|
||||
info = &g4x_gt_info;
|
||||
else
|
||||
info = &gen4_gt_info;
|
||||
|
||||
sna_static_stream_init(&general);
|
||||
|
||||
/* Zero pad the start. If you see an offset of 0x0 in the batchbuffer
|
||||
|
|
@ -3652,8 +3654,8 @@ static bool gen4_render_setup(struct sna *sna)
|
|||
}
|
||||
|
||||
state->vs = gen4_create_vs_unit_state(&general);
|
||||
state->sf[0] = gen4_create_sf_state(&general, info, sf[0]);
|
||||
state->sf[1] = gen4_create_sf_state(&general, info, sf[1]);
|
||||
state->sf[0] = gen4_create_sf_state(&general, sf[0]);
|
||||
state->sf[1] = gen4_create_sf_state(&general, sf[1]);
|
||||
|
||||
wm_state = sna_static_stream_map(&general,
|
||||
sizeof(*wm_state) * KERNEL_COUNT *
|
||||
|
|
@ -3673,7 +3675,7 @@ static bool gen4_render_setup(struct sna *sna)
|
|||
k, l);
|
||||
|
||||
for (m = 0; m < KERNEL_COUNT; m++) {
|
||||
gen4_init_wm_state(&wm_state->state, info,
|
||||
gen4_init_wm_state(&wm_state->state,
|
||||
wm_kernels[m].has_mask,
|
||||
wm[m], sampler_state);
|
||||
wm_state++;
|
||||
|
|
|
|||
|
|
@ -14277,9 +14277,12 @@ bool sna_accel_init(ScreenPtr screen, struct sna *sna)
|
|||
} else if (sna->info->gen >= 50) {
|
||||
if ((sna->have_render = gen5_render_init(sna)))
|
||||
backend = "Ironlake";
|
||||
} else if (sna->info->gen >= 45) {
|
||||
if ((sna->have_render = g4x_render_init(sna)))
|
||||
backend = "Eaglelake/Cantiga";
|
||||
} else if (sna->info->gen >= 40) {
|
||||
if ((sna->have_render = gen4_render_init(sna)))
|
||||
backend = "Broadwater";
|
||||
backend = "Broadwater/Crestline";
|
||||
} else if (sna->info->gen >= 30) {
|
||||
if ((sna->have_render = gen3_render_init(sna)))
|
||||
backend = "gen3";
|
||||
|
|
|
|||
|
|
@ -1091,7 +1091,7 @@ next_image:
|
|||
(int)this_atlas->format,
|
||||
(int)(format->depth << 24 | format->format)));
|
||||
if (this_atlas->format == (format->depth << 24 | format->format) &&
|
||||
!(sna->kgem.gen >= 40 && sna->kgem.gen < 50)) { /* XXX cache corruption? how? */
|
||||
sna->kgem.gen != 45) { /* XXX cache corruption? how? */
|
||||
ok = sna->render.composite(sna, PictOpAdd,
|
||||
this_atlas, NULL, mask,
|
||||
0, 0, 0, 0, 0, 0,
|
||||
|
|
|
|||
|
|
@ -524,6 +524,7 @@ void no_render_init(struct sna *sna);
|
|||
bool gen2_render_init(struct sna *sna);
|
||||
bool gen3_render_init(struct sna *sna);
|
||||
bool gen4_render_init(struct sna *sna);
|
||||
bool g4x_render_init(struct sna *sna);
|
||||
bool gen5_render_init(struct sna *sna);
|
||||
bool gen6_render_init(struct sna *sna);
|
||||
bool gen7_render_init(struct sna *sna);
|
||||
|
|
|
|||
Loading…
Reference in New Issue