summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-02-27 16:29:38 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2012-02-27 16:28:41 +0000
commit3c4f29820bca336af2c997bafc7ef288b455813c (patch)
tree3f3d90695c723fbb5970859793547b1d54cbd991
parent8f3066f0c70654f04f4acadf140e3c5c8dda051d (diff)
uxa/gen3: Remove special casing of solid pictures
Fixes use of alpha-groups and opacity masks in cairo. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--src/i915_render.c366
1 files changed, 122 insertions, 244 deletions
diff --git a/src/i915_render.c b/src/i915_render.c
index 87d2336c..6210035c 100644
--- a/src/i915_render.c
+++ b/src/i915_render.c
@@ -257,11 +257,8 @@ i915_check_composite_texture(ScreenPtr screen, PicturePtr picture)
return FALSE;
}
- if (picture->pSourcePict) {
- SourcePict *source = picture->pSourcePict;
- if (source->type == SourcePictTypeSolidFill)
- return TRUE;
- }
+ if (picture->pSourcePict)
+ return FALSE;
if (picture->pDrawable) {
int w, h, i;
@@ -387,23 +384,6 @@ static Bool i915_texture_setup(PicturePtr picture, PixmapPtr pixmap, int unit)
}
static void
-i915_emit_composite_primitive_constant(intel_screen_private *intel,
- int srcX, int srcY,
- int maskX, int maskY,
- int dstX, int dstY,
- int w, int h)
-{
- OUT_VERTEX(dstX + w);
- OUT_VERTEX(dstY + h);
-
- OUT_VERTEX(dstX);
- OUT_VERTEX(dstY + h);
-
- OUT_VERTEX(dstX);
- OUT_VERTEX(dstY);
-}
-
-static void
i915_emit_composite_primitive_identity_source(intel_screen_private *intel,
int srcX, int srcY,
int maskX, int maskY,
@@ -470,29 +450,6 @@ i915_emit_composite_primitive_affine_source(intel_screen_private *intel,
}
static void
-i915_emit_composite_primitive_constant_identity_mask(intel_screen_private *intel,
- int srcX, int srcY,
- int maskX, int maskY,
- int dstX, int dstY,
- int w, int h)
-{
- OUT_VERTEX(dstX + w);
- OUT_VERTEX(dstY + h);
- OUT_VERTEX((maskX + w) * intel->scale_units[0][0]);
- OUT_VERTEX((maskY + h) * intel->scale_units[0][1]);
-
- OUT_VERTEX(dstX);
- OUT_VERTEX(dstY + h);
- OUT_VERTEX(maskX * intel->scale_units[0][0]);
- OUT_VERTEX((maskY + h) * intel->scale_units[0][1]);
-
- OUT_VERTEX(dstX);
- OUT_VERTEX(dstY);
- OUT_VERTEX(maskX * intel->scale_units[0][0]);
- OUT_VERTEX(maskY * intel->scale_units[0][1]);
-}
-
-static void
i915_emit_composite_primitive_identity_source_mask(intel_screen_private *intel,
int srcX, int srcY,
int maskX, int maskY,
@@ -536,63 +493,61 @@ i915_emit_composite_primitive(intel_screen_private *intel,
per_vertex = 2; /* dest x/y */
- if (! intel->render_source_is_solid) {
- src_unit = tex_unit++;
-
- is_affine_src = intel_transform_is_affine(intel->transform[src_unit]);
- if (is_affine_src) {
- if (!intel_get_transformed_coordinates(srcX, srcY,
- intel->
- transform[src_unit],
- &src_x[0],
- &src_y[0]))
- return;
-
- if (!intel_get_transformed_coordinates(srcX, srcY + h,
- intel->
- transform[src_unit],
- &src_x[1],
- &src_y[1]))
- return;
-
- if (!intel_get_transformed_coordinates(srcX + w, srcY + h,
- intel->
- transform[src_unit],
- &src_x[2],
- &src_y[2]))
- return;
-
- per_vertex += 2; /* src x/y */
- } else {
- if (!intel_get_transformed_coordinates_3d(srcX, srcY,
- intel->
- transform[src_unit],
- &src_x[0],
- &src_y[0],
- &src_w[0]))
- return;
-
- if (!intel_get_transformed_coordinates_3d(srcX, srcY + h,
- intel->
- transform[src_unit],
- &src_x[1],
- &src_y[1],
- &src_w[1]))
- return;
-
- if (!intel_get_transformed_coordinates_3d(srcX + w, srcY + h,
- intel->
- transform[src_unit],
- &src_x[2],
- &src_y[2],
- &src_w[2]))
- return;
-
- per_vertex += 4; /* src x/y/z/w */
- }
+ src_unit = tex_unit++;
+
+ is_affine_src = intel_transform_is_affine(intel->transform[src_unit]);
+ if (is_affine_src) {
+ if (!intel_get_transformed_coordinates(srcX, srcY,
+ intel->
+ transform[src_unit],
+ &src_x[0],
+ &src_y[0]))
+ return;
+
+ if (!intel_get_transformed_coordinates(srcX, srcY + h,
+ intel->
+ transform[src_unit],
+ &src_x[1],
+ &src_y[1]))
+ return;
+
+ if (!intel_get_transformed_coordinates(srcX + w, srcY + h,
+ intel->
+ transform[src_unit],
+ &src_x[2],
+ &src_y[2]))
+ return;
+
+ per_vertex += 2; /* src x/y */
+ } else {
+ if (!intel_get_transformed_coordinates_3d(srcX, srcY,
+ intel->
+ transform[src_unit],
+ &src_x[0],
+ &src_y[0],
+ &src_w[0]))
+ return;
+
+ if (!intel_get_transformed_coordinates_3d(srcX, srcY + h,
+ intel->
+ transform[src_unit],
+ &src_x[1],
+ &src_y[1],
+ &src_w[1]))
+ return;
+
+ if (!intel_get_transformed_coordinates_3d(srcX + w, srcY + h,
+ intel->
+ transform[src_unit],
+ &src_x[2],
+ &src_y[2],
+ &src_w[2]))
+ return;
+
+ per_vertex += 4; /* src x/y/z/w */
}
- if (intel->render_mask && ! intel->render_mask_is_solid) {
+ if (intel->render_mask) {
mask_unit = tex_unit++;
is_affine_mask = intel_transform_is_affine(intel->transform[mask_unit]);
@@ -650,15 +605,13 @@ i915_emit_composite_primitive(intel_screen_private *intel,
OUT_VERTEX(dstX + w);
OUT_VERTEX(dstY + h);
- if (! intel->render_source_is_solid) {
- OUT_VERTEX(src_x[2] * intel->scale_units[src_unit][0]);
- OUT_VERTEX(src_y[2] * intel->scale_units[src_unit][1]);
- if (!is_affine_src) {
+ OUT_VERTEX(src_x[2] * intel->scale_units[src_unit][0]);
+ OUT_VERTEX(src_y[2] * intel->scale_units[src_unit][1]);
+ if (!is_affine_src) {
OUT_VERTEX(0.0);
OUT_VERTEX(src_w[2]);
- }
}
- if (intel->render_mask && ! intel->render_mask_is_solid) {
+ if (intel->render_mask) {
OUT_VERTEX(mask_x[2] * intel->scale_units[mask_unit][0]);
OUT_VERTEX(mask_y[2] * intel->scale_units[mask_unit][1]);
if (!is_affine_mask) {
@@ -669,15 +622,13 @@ i915_emit_composite_primitive(intel_screen_private *intel,
OUT_VERTEX(dstX);
OUT_VERTEX(dstY + h);
- if (! intel->render_source_is_solid) {
- OUT_VERTEX(src_x[1] * intel->scale_units[src_unit][0]);
- OUT_VERTEX(src_y[1] * intel->scale_units[src_unit][1]);
- if (!is_affine_src) {
+ OUT_VERTEX(src_x[1] * intel->scale_units[src_unit][0]);
+ OUT_VERTEX(src_y[1] * intel->scale_units[src_unit][1]);
+ if (!is_affine_src) {
OUT_VERTEX(0.0);
OUT_VERTEX(src_w[1]);
- }
}
- if (intel->render_mask && ! intel->render_mask_is_solid) {
+ if (intel->render_mask) {
OUT_VERTEX(mask_x[1] * intel->scale_units[mask_unit][0]);
OUT_VERTEX(mask_y[1] * intel->scale_units[mask_unit][1]);
if (!is_affine_mask) {
@@ -688,15 +639,13 @@ i915_emit_composite_primitive(intel_screen_private *intel,
OUT_VERTEX(dstX);
OUT_VERTEX(dstY);
- if (! intel->render_source_is_solid) {
- OUT_VERTEX(src_x[0] * intel->scale_units[src_unit][0]);
- OUT_VERTEX(src_y[0] * intel->scale_units[src_unit][1]);
- if (!is_affine_src) {
+ OUT_VERTEX(src_x[0] * intel->scale_units[src_unit][0]);
+ OUT_VERTEX(src_y[0] * intel->scale_units[src_unit][1]);
+ if (!is_affine_src) {
OUT_VERTEX(0.0);
OUT_VERTEX(src_w[0]);
- }
}
- if (intel->render_mask && ! intel->render_mask_is_solid) {
+ if (intel->render_mask) {
OUT_VERTEX(mask_x[0] * intel->scale_units[mask_unit][0]);
OUT_VERTEX(mask_y[0] * intel->scale_units[mask_unit][1]);
if (!is_affine_mask) {
@@ -729,29 +678,11 @@ i915_prepare_composite(int op, PicturePtr source_picture,
intel->render_dest_picture = dest_picture;
intel->render_dest = dest;
- intel->render_source_is_solid = FALSE;
- if (source_picture->pSourcePict) {
- SourcePict *source = source_picture->pSourcePict;
- if (source->type == SourcePictTypeSolidFill) {
- intel->render_source_is_solid = TRUE;
- intel->render_source_solid = source->solidFill.color;
- }
- }
- if (!intel->render_source_is_solid && !intel_check_pitch_3d(source))
+ if (!intel_check_pitch_3d(source))
return FALSE;
- intel->render_mask_is_solid = FALSE;
- if (mask) {
- if (mask_picture->pSourcePict) {
- SourcePict *source = mask_picture->pSourcePict;
- if (source->type == SourcePictTypeSolidFill) {
- intel->render_mask_is_solid = TRUE;
- intel->render_mask_solid = source->solidFill.color;
- }
- }
- if (!intel->render_mask_is_solid && !intel_check_pitch_3d(mask))
- return FALSE;
- }
+ if (mask && !intel_check_pitch_3d(mask))
+ return FALSE;
if (!intel_check_pitch_3d(dest))
return FALSE;
@@ -787,31 +718,27 @@ i915_prepare_composite(int op, PicturePtr source_picture,
intel->scale_units[1][1] = -1;
floats_per_vertex = 2; /* dest x/y */
- if (! intel->render_source_is_solid) {
- if (!i915_texture_setup(source_picture, source, tex_unit++)) {
- intel_debug_fallback(scrn, "fail to setup src texture\n");
- return FALSE;
- }
-
- if (intel_transform_is_affine(source_picture->transform))
- floats_per_vertex += 2; /* src x/y */
- else
- floats_per_vertex += 4; /* src x/y/z/w */
+ if (!i915_texture_setup(source_picture, source, tex_unit++)) {
+ intel_debug_fallback(scrn, "fail to setup src texture\n");
+ return FALSE;
}
- if (mask != NULL) {
- if (! intel->render_mask_is_solid) {
- if (!i915_texture_setup(mask_picture, mask, tex_unit++)) {
- intel_debug_fallback(scrn,
- "fail to setup mask texture\n");
- return FALSE;
- }
+ if (intel_transform_is_affine(source_picture->transform))
+ floats_per_vertex += 2; /* src x/y */
+ else
+ floats_per_vertex += 4; /* src x/y/z/w */
- if (intel_transform_is_affine(mask_picture->transform))
- floats_per_vertex += 2; /* mask x/y */
- else
- floats_per_vertex += 4; /* mask x/y/z/w */
+ if (mask != NULL) {
+ if (!i915_texture_setup(mask_picture, mask, tex_unit++)) {
+ intel_debug_fallback(scrn,
+ "fail to setup mask texture\n");
+ return FALSE;
}
+
+ if (intel_transform_is_affine(mask_picture->transform))
+ floats_per_vertex += 2; /* mask x/y */
+ else
+ floats_per_vertex += 4; /* mask x/y/z/w */
}
intel->i915_render_state.op = op;
@@ -827,17 +754,13 @@ i915_prepare_composite(int op, PicturePtr source_picture,
intel->prim_emit = i915_emit_composite_primitive;
if (!mask) {
- if (intel->render_source_is_solid)
- intel->prim_emit = i915_emit_composite_primitive_constant;
- else if (intel->transform[0] == NULL)
+ if (intel->transform[0] == NULL)
intel->prim_emit = i915_emit_composite_primitive_identity_source;
else if (intel_transform_is_affine(intel->transform[0]))
intel->prim_emit = i915_emit_composite_primitive_affine_source;
} else {
if (intel->transform[0] == NULL) {
- if (intel->render_source_is_solid)
- intel->prim_emit = i915_emit_composite_primitive_constant_identity_mask;
- else if (intel->transform[1] == NULL)
+ if (intel->transform[1] == NULL)
intel->prim_emit = i915_emit_composite_primitive_identity_source_mask;
}
}
@@ -856,39 +779,25 @@ i915_composite_emit_shader(intel_screen_private *intel, CARD8 op)
PicturePtr mask_picture = intel->render_mask_picture;
PixmapPtr mask = intel->render_mask;
int src_reg, mask_reg;
- Bool is_solid_src, is_solid_mask;
Bool dest_is_alpha = PIXMAN_FORMAT_RGB(intel->render_dest_picture->format) == 0;
- int tex_unit, t;
FS_LOCALS();
- is_solid_src = intel->render_source_is_solid;
- is_solid_mask = intel->render_mask_is_solid;
-
FS_BEGIN();
/* Declare the registers necessary for our program. */
- t = 0;
- if (is_solid_src) {
- i915_fs_dcl(FS_T8);
- src_reg = FS_T8;
- } else {
- i915_fs_dcl(FS_T0);
- i915_fs_dcl(FS_S0);
- t++;
- }
+ i915_fs_dcl(FS_T0);
+ i915_fs_dcl(FS_S0);
if (!mask) {
/* No mask, so load directly to output color */
- if (! is_solid_src) {
- if (dest_is_alpha)
- src_reg = FS_R0;
- else
- src_reg = FS_OC;
+ if (dest_is_alpha)
+ src_reg = FS_R0;
+ else
+ src_reg = FS_OC;
- if (intel_transform_is_affine(intel->transform[0]))
- i915_fs_texld(src_reg, FS_S0, FS_T0);
- else
- i915_fs_texldp(src_reg, FS_S0, FS_T0);
- }
+ if (intel_transform_is_affine(intel->transform[0]))
+ i915_fs_texld(src_reg, FS_S0, FS_T0);
+ else
+ i915_fs_texldp(src_reg, FS_S0, FS_T0);
if (src_reg != FS_OC) {
if (dest_is_alpha)
@@ -897,35 +806,24 @@ i915_composite_emit_shader(intel_screen_private *intel, CARD8 op)
i915_fs_mov(FS_OC, i915_fs_operand_reg(src_reg));
}
} else {
- if (is_solid_mask) {
- i915_fs_dcl(FS_T9);
- mask_reg = FS_T9;
- } else {
- i915_fs_dcl(FS_T0 + t);
- i915_fs_dcl(FS_S0 + t);
- }
+ i915_fs_dcl(FS_T1);
+ i915_fs_dcl(FS_S1);
- tex_unit = 0;
- if (! is_solid_src) {
- /* Load the source_picture texel */
- if (intel_transform_is_affine(intel->transform[tex_unit]))
- i915_fs_texld(FS_R0, FS_S0, FS_T0);
- else
- i915_fs_texldp(FS_R0, FS_S0, FS_T0);
+ /* Load the source_picture texel */
+ if (intel_transform_is_affine(intel->transform[0]))
+ i915_fs_texld(FS_R0, FS_S0, FS_T0);
+ else
+ i915_fs_texldp(FS_R0, FS_S0, FS_T0);
- src_reg = FS_R0;
- tex_unit++;
- }
+ src_reg = FS_R0;
- if (! is_solid_mask) {
- /* Load the mask_picture texel */
- if (intel_transform_is_affine(intel->transform[tex_unit]))
- i915_fs_texld(FS_R1, FS_S0 + t, FS_T0 + t);
- else
- i915_fs_texldp(FS_R1, FS_S0 + t, FS_T0 + t);
+ /* Load the mask_picture texel */
+ if (intel_transform_is_affine(intel->transform[1]))
+ i915_fs_texld(FS_R1, FS_S1, FS_T1);
+ else
+ i915_fs_texldp(FS_R1, FS_S1, FS_T1);
- mask_reg = FS_R1;
- }
+ mask_reg = FS_R1;
if (dest_is_alpha) {
i915_fs_mul(FS_OC,
@@ -972,7 +870,6 @@ static void i915_emit_composite_setup(ScrnInfoPtr scrn)
PicturePtr dest_picture = intel->render_dest_picture;
PixmapPtr mask = intel->render_mask;
PixmapPtr dest = intel->render_dest;
- Bool is_solid_src, is_solid_mask;
int tex_count, t;
intel->needs_render_state_emit = FALSE;
@@ -980,12 +877,7 @@ static void i915_emit_composite_setup(ScrnInfoPtr scrn)
IntelEmitInvarientState(scrn);
intel->last_3d = LAST_3D_RENDER;
- is_solid_src = intel->render_source_is_solid;
- is_solid_mask = intel->render_mask_is_solid;
-
- tex_count = 0;
- tex_count += ! is_solid_src;
- tex_count += mask && ! is_solid_mask;
+ tex_count = 1 + (mask != NULL);
assert(intel->in_batch_atomic);
@@ -1007,15 +899,6 @@ static void i915_emit_composite_setup(ScrnInfoPtr scrn)
}
}
- if (is_solid_src) {
- OUT_BATCH (_3DSTATE_DFLT_DIFFUSE_CMD);
- OUT_BATCH (intel->render_source_solid);
- }
- if (mask && is_solid_mask) {
- OUT_BATCH (_3DSTATE_DFLT_SPEC_CMD);
- OUT_BATCH (intel->render_mask_solid);
- }
-
/* BUF_INFO is an implicit flush, so avoid if the target has not changed.
* XXX However for reasons unfathomed, correct rendering in KDE requires
* at least a MI_FLUSH | INHIBIT_RENDER_CACHE_FLUSH here.
@@ -1058,20 +941,15 @@ static void i915_emit_composite_setup(ScrnInfoPtr scrn)
uint32_t ss2;
ss2 = ~0;
- t = 0;
- if (! is_solid_src) {
- ss2 &= ~S2_TEXCOORD_FMT(t, TEXCOORDFMT_NOT_PRESENT);
- ss2 |= S2_TEXCOORD_FMT(t,
- intel_transform_is_affine(intel->transform[t]) ?
- TEXCOORDFMT_2D : TEXCOORDFMT_4D);
- t++;
- }
- if (mask && ! is_solid_mask) {
- ss2 &= ~S2_TEXCOORD_FMT(t, TEXCOORDFMT_NOT_PRESENT);
- ss2 |= S2_TEXCOORD_FMT(t,
- intel_transform_is_affine(intel->transform[t]) ?
+ ss2 &= ~S2_TEXCOORD_FMT(0, TEXCOORDFMT_NOT_PRESENT);
+ ss2 |= S2_TEXCOORD_FMT(0,
+ intel_transform_is_affine(intel->transform[0]) ?
+ TEXCOORDFMT_2D : TEXCOORDFMT_4D);
+ if (mask) {
+ ss2 &= ~S2_TEXCOORD_FMT(1, TEXCOORDFMT_NOT_PRESENT);
+ ss2 |= S2_TEXCOORD_FMT(1,
+ intel_transform_is_affine(intel->transform[1]) ?
TEXCOORDFMT_2D : TEXCOORDFMT_4D);
- t++;
}
if (intel->needs_render_ca_pass) {