From fbee314a4194671bfc6dfaa90141498a2f45de4e Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Mon, 27 Feb 2012 16:29:38 +0000 Subject: [PATCH 1/5] uxa/gen3: Remove special casing of solid pictures Fixes use of alpha-groups and opacity masks in cairo. Signed-off-by: Chris Wilson --- src/i915_render.c | 366 ++++++++++++++++++----------------------------------- 1 file changed, 122 insertions(+), 244 deletions(-) diff --git a/src/i915_render.c b/src/i915_render.c index 87d2336..6210035 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) { -- 1.7.10