xf86-video-intel: 3 commits - src/i830.h src/i830_uxa.c src/i915_render.c
Chris Wilson
ickle at kemper.freedesktop.org
Tue Jun 1 15:16:43 PDT 2010
src/i830.h | 4
src/i830_uxa.c | 4
src/i915_render.c | 296 +++++++++++++++++++++---------------------------------
3 files changed, 125 insertions(+), 179 deletions(-)
New commits:
commit 2989f51caf3134460c2551de597e7e54fe74ee92
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Tue Jun 1 23:08:02 2010 +0100
i830: Remove unused coord-adjust.
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/i830.h b/src/i830.h
index 9a46af0..8c96841 100644
--- a/src/i830.h
+++ b/src/i830.h
@@ -332,9 +332,6 @@ typedef struct intel_screen_private {
float scale_units[2][2];
/** Transform pointers for src/mask, or NULL if identity */
PictTransform *transform[2];
- float dst_coord_adjust;
- float src_coord_adjust;
- float mask_coord_adjust;
PixmapPtr render_source, render_mask, render_dest;
PicturePtr render_source_picture, render_mask_picture, render_dest_picture;
commit dc402334f4e9b0de624bc89cd77eae4ec7cf1708
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Tue Jun 1 23:03:19 2010 +0100
i915: Centre sampling.
Use centre sampling of textures to match pixman, and remove numerous
off-by-one and visual artefacts when rendering. The classic example for
this is cairo/text/xcomposite-projection where the edge of the rotated
rectangle is jaggy due to the incorrect sample position.
Fixes:
Bug 16917 - [i915] Blur on y-axis also when only x-axis is scaled
billiear
https://bugs.freedesktop.org/show_bug.cgi?id=16917
And about 15 tests from the Cairo test suite.
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/i915_render.c b/src/i915_render.c
index 96ac09d..c71a7c8 100644
--- a/src/i915_render.c
+++ b/src/i915_render.c
@@ -35,8 +35,6 @@
#include "i915_reg.h"
#include "i915_3d.h"
-#define PIXEL_CENTRE_SAMPLE 0
-
struct formatinfo {
int fmt;
uint32_t card_fmt;
@@ -176,9 +174,7 @@ static Bool i915_get_dest_format(PicturePtr dest_picture, uint32_t * dst_format)
(int)dest_picture->format);
return FALSE;
}
-#if PIXEL_CENTRE_SAMPLE
*dst_format |= DSTORG_HORT_BIAS(0x8) | DSTORG_VERT_BIAS(0x8);
-#endif
return TRUE;
}
@@ -397,19 +393,15 @@ i915_emit_composite_primitive_constant(PixmapPtr dest,
{
ScrnInfoPtr scrn = xf86Screens[dest->drawable.pScreen->myNum];
intel_screen_private *intel = intel_get_screen_private(scrn);
- float x, y;
-
- x = dstX + intel->dst_coord_adjust;
- y = dstY + intel->dst_coord_adjust;
- OUT_VERTEX(x + w);
- OUT_VERTEX(y + h);
+ OUT_VERTEX(dstX + w);
+ OUT_VERTEX(dstY + h);
- OUT_VERTEX(x);
- OUT_VERTEX(y + h);
+ OUT_VERTEX(dstX);
+ OUT_VERTEX(dstY + h);
- OUT_VERTEX(x);
- OUT_VERTEX(y);
+ OUT_VERTEX(dstX);
+ OUT_VERTEX(dstY);
}
static void
@@ -421,27 +413,21 @@ i915_emit_composite_primitive_identity_source(PixmapPtr dest,
{
ScrnInfoPtr scrn = xf86Screens[dest->drawable.pScreen->myNum];
intel_screen_private *intel = intel_get_screen_private(scrn);
- float dst_x, dst_y, src_x, src_y;
-
- dst_x = dstX + intel->dst_coord_adjust;
- dst_y = dstY + intel->dst_coord_adjust;
- src_x = srcX + intel->src_coord_adjust;
- src_y = srcY + intel->src_coord_adjust;
-
- OUT_VERTEX(dst_x + w);
- OUT_VERTEX(dst_y + h);
- OUT_VERTEX((src_x + w) * intel->scale_units[0][0]);
- OUT_VERTEX((src_y + h) * intel->scale_units[0][1]);
-
- OUT_VERTEX(dst_x);
- OUT_VERTEX(dst_y + h);
- OUT_VERTEX(src_x * intel->scale_units[0][0]);
- OUT_VERTEX((src_y + h) * intel->scale_units[0][1]);
-
- OUT_VERTEX(dst_x);
- OUT_VERTEX(dst_y);
- OUT_VERTEX(src_x * intel->scale_units[0][0]);
- OUT_VERTEX(src_y * intel->scale_units[0][1]);
+
+ OUT_VERTEX(dstX + w);
+ OUT_VERTEX(dstY + h);
+ OUT_VERTEX((srcX + w) * intel->scale_units[0][0]);
+ OUT_VERTEX((srcY + h) * intel->scale_units[0][1]);
+
+ OUT_VERTEX(dstX);
+ OUT_VERTEX(dstY + h);
+ OUT_VERTEX(srcX * intel->scale_units[0][0]);
+ OUT_VERTEX((srcY + h) * intel->scale_units[0][1]);
+
+ OUT_VERTEX(dstX);
+ OUT_VERTEX(dstY);
+ OUT_VERTEX(srcX * intel->scale_units[0][0]);
+ OUT_VERTEX(srcY * intel->scale_units[0][1]);
}
static void
@@ -453,44 +439,38 @@ i915_emit_composite_primitive_affine_source(PixmapPtr dest,
{
ScrnInfoPtr scrn = xf86Screens[dest->drawable.pScreen->myNum];
intel_screen_private *intel = intel_get_screen_private(scrn);
- float x, y, src_x[3], src_y[3];
+ float src_x[3], src_y[3];
- x = srcX + intel->src_coord_adjust;
- y = srcY + intel->src_coord_adjust;
-
- if (!i830_get_transformed_coordinates(x, y,
+ if (!i830_get_transformed_coordinates(srcX, srcY,
intel->transform[0],
&src_x[0],
&src_y[0]))
return;
- if (!i830_get_transformed_coordinates(x, y + h,
+ if (!i830_get_transformed_coordinates(srcX, srcY + h,
intel->transform[0],
&src_x[1],
&src_y[1]))
return;
- if (!i830_get_transformed_coordinates(x + w, y + h,
+ if (!i830_get_transformed_coordinates(srcX + w, srcY + h,
intel->transform[0],
&src_x[2],
&src_y[2]))
return;
- x = dstX + intel->dst_coord_adjust;
- y = dstY + intel->dst_coord_adjust;
-
- OUT_VERTEX(x + w);
- OUT_VERTEX(y + h);
+ OUT_VERTEX(dstX + w);
+ OUT_VERTEX(dstY + h);
OUT_VERTEX(src_x[2] * intel->scale_units[0][0]);
OUT_VERTEX(src_y[2] * intel->scale_units[0][1]);
- OUT_VERTEX(x);
- OUT_VERTEX(y + h);
+ OUT_VERTEX(dstX);
+ OUT_VERTEX(dstY + h);
OUT_VERTEX(src_x[1] * intel->scale_units[0][0]);
OUT_VERTEX(src_y[1] * intel->scale_units[0][1]);
- OUT_VERTEX(x);
- OUT_VERTEX(y);
+ OUT_VERTEX(dstX);
+ OUT_VERTEX(dstY);
OUT_VERTEX(src_x[0] * intel->scale_units[0][0]);
OUT_VERTEX(src_y[0] * intel->scale_units[0][1]);
}
@@ -504,27 +484,21 @@ i915_emit_composite_primitive_constant_identity_mask(PixmapPtr dest,
{
ScrnInfoPtr scrn = xf86Screens[dest->drawable.pScreen->myNum];
intel_screen_private *intel = intel_get_screen_private(scrn);
- float x, y, mx, my;
-
- x = dstX + intel->dst_coord_adjust;
- y = dstY + intel->dst_coord_adjust;
- mx = maskX + intel->mask_coord_adjust;
- my = maskY + intel->mask_coord_adjust;
-
- OUT_VERTEX(x + w);
- OUT_VERTEX(y + h);
- OUT_VERTEX((mx + w) * intel->scale_units[0][0]);
- OUT_VERTEX((my + h) * intel->scale_units[0][1]);
-
- OUT_VERTEX(x);
- OUT_VERTEX(y + h);
- OUT_VERTEX(mx * intel->scale_units[0][0]);
- OUT_VERTEX((my + h) * intel->scale_units[0][1]);
-
- OUT_VERTEX(x);
- OUT_VERTEX(y);
- OUT_VERTEX(mx * intel->scale_units[0][0]);
- OUT_VERTEX(my * intel->scale_units[0][1]);
+
+ 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
@@ -536,35 +510,27 @@ i915_emit_composite_primitive_identity_source_mask(PixmapPtr dest,
{
ScrnInfoPtr scrn = xf86Screens[dest->drawable.pScreen->myNum];
intel_screen_private *intel = intel_get_screen_private(scrn);
- float x, y, sx, sy, mx, my;
-
- x = dstX + intel->dst_coord_adjust;
- y = dstY + intel->dst_coord_adjust;
- sx = srcX + intel->src_coord_adjust;
- sy = srcY + intel->src_coord_adjust;
- mx = maskX + intel->mask_coord_adjust;
- my = maskY + intel->mask_coord_adjust;
-
- OUT_VERTEX(x + w);
- OUT_VERTEX(y + h);
- OUT_VERTEX((sx + w) * intel->scale_units[0][0]);
- OUT_VERTEX((sy + h) * intel->scale_units[0][1]);
- OUT_VERTEX((mx + w) * intel->scale_units[1][0]);
- OUT_VERTEX((my + h) * intel->scale_units[1][1]);
-
- OUT_VERTEX(x);
- OUT_VERTEX(y + h);
- OUT_VERTEX(sx * intel->scale_units[0][0]);
- OUT_VERTEX((sy + h) * intel->scale_units[0][1]);
- OUT_VERTEX(mx * intel->scale_units[1][0]);
- OUT_VERTEX((my + h) * intel->scale_units[1][1]);
-
- OUT_VERTEX(x);
- OUT_VERTEX(y);
- OUT_VERTEX(sx * intel->scale_units[0][0]);
- OUT_VERTEX(sy * intel->scale_units[0][1]);
- OUT_VERTEX(mx * intel->scale_units[1][0]);
- OUT_VERTEX(my * intel->scale_units[1][1]);
+
+ OUT_VERTEX(dstX + w);
+ OUT_VERTEX(dstY + h);
+ OUT_VERTEX((srcX + w) * intel->scale_units[0][0]);
+ OUT_VERTEX((srcY + h) * intel->scale_units[0][1]);
+ OUT_VERTEX((maskX + w) * intel->scale_units[1][0]);
+ OUT_VERTEX((maskY + h) * intel->scale_units[1][1]);
+
+ OUT_VERTEX(dstX);
+ OUT_VERTEX(dstY + h);
+ OUT_VERTEX(srcX * intel->scale_units[0][0]);
+ OUT_VERTEX((srcY + h) * intel->scale_units[0][1]);
+ OUT_VERTEX(maskX * intel->scale_units[1][0]);
+ OUT_VERTEX((maskY + h) * intel->scale_units[1][1]);
+
+ OUT_VERTEX(dstX);
+ OUT_VERTEX(dstY);
+ OUT_VERTEX(srcX * intel->scale_units[0][0]);
+ OUT_VERTEX(srcY * intel->scale_units[0][1]);
+ OUT_VERTEX(maskX * intel->scale_units[1][0]);
+ OUT_VERTEX(maskY * intel->scale_units[1][1]);
}
static void
@@ -585,28 +551,25 @@ i915_emit_composite_primitive(PixmapPtr dest,
per_vertex = 2; /* dest x/y */
if (! intel->render_source_is_solid) {
- float x = srcX + intel->src_coord_adjust;
- float y = srcY + intel->src_coord_adjust;
-
src_unit = tex_unit++;
is_affine_src = i830_transform_is_affine(intel->transform[src_unit]);
if (is_affine_src) {
- if (!i830_get_transformed_coordinates(x, y,
+ if (!i830_get_transformed_coordinates(srcX, srcY,
intel->
transform[src_unit],
&src_x[0],
&src_y[0]))
return;
- if (!i830_get_transformed_coordinates(x, y + h,
+ if (!i830_get_transformed_coordinates(srcX, srcY + h,
intel->
transform[src_unit],
&src_x[1],
&src_y[1]))
return;
- if (!i830_get_transformed_coordinates(x + w, y + h,
+ if (!i830_get_transformed_coordinates(srcX + w, srcY + h,
intel->
transform[src_unit],
&src_x[2],
@@ -615,7 +578,7 @@ i915_emit_composite_primitive(PixmapPtr dest,
per_vertex += 2; /* src x/y */
} else {
- if (!i830_get_transformed_coordinates_3d(x, y,
+ if (!i830_get_transformed_coordinates_3d(srcX, srcY,
intel->
transform[src_unit],
&src_x[0],
@@ -623,7 +586,7 @@ i915_emit_composite_primitive(PixmapPtr dest,
&src_w[0]))
return;
- if (!i830_get_transformed_coordinates_3d(x, y + h,
+ if (!i830_get_transformed_coordinates_3d(srcX, srcY + h,
intel->
transform[src_unit],
&src_x[1],
@@ -631,7 +594,7 @@ i915_emit_composite_primitive(PixmapPtr dest,
&src_w[1]))
return;
- if (!i830_get_transformed_coordinates_3d(x + w, y + h,
+ if (!i830_get_transformed_coordinates_3d(srcX + w, srcY + h,
intel->
transform[src_unit],
&src_x[2],
@@ -644,28 +607,25 @@ i915_emit_composite_primitive(PixmapPtr dest,
}
if (intel->render_mask && ! intel->render_mask_is_solid) {
- float x = maskX + intel->mask_coord_adjust;
- float y = maskY + intel->mask_coord_adjust;
-
mask_unit = tex_unit++;
is_affine_mask = i830_transform_is_affine(intel->transform[mask_unit]);
if (is_affine_mask) {
- if (!i830_get_transformed_coordinates(x, y,
+ if (!i830_get_transformed_coordinates(maskX, maskY,
intel->
transform[mask_unit],
&mask_x[0],
&mask_y[0]))
return;
- if (!i830_get_transformed_coordinates(x, y + h,
+ if (!i830_get_transformed_coordinates(maskX, maskY + h,
intel->
transform[mask_unit],
&mask_x[1],
&mask_y[1]))
return;
- if (!i830_get_transformed_coordinates(x + w, y + h,
+ if (!i830_get_transformed_coordinates(maskX + w, maskY + h,
intel->
transform[mask_unit],
&mask_x[2],
@@ -674,7 +634,7 @@ i915_emit_composite_primitive(PixmapPtr dest,
per_vertex += 2; /* mask x/y */
} else {
- if (!i830_get_transformed_coordinates_3d(x, y,
+ if (!i830_get_transformed_coordinates_3d(maskX, maskY,
intel->
transform[mask_unit],
&mask_x[0],
@@ -682,7 +642,7 @@ i915_emit_composite_primitive(PixmapPtr dest,
&mask_w[0]))
return;
- if (!i830_get_transformed_coordinates_3d(x, y + h,
+ if (!i830_get_transformed_coordinates_3d(maskX, maskY + h,
intel->
transform[mask_unit],
&mask_x[1],
@@ -690,7 +650,7 @@ i915_emit_composite_primitive(PixmapPtr dest,
&mask_w[1]))
return;
- if (!i830_get_transformed_coordinates_3d(x + w, y + h,
+ if (!i830_get_transformed_coordinates_3d(maskX + w, maskY + h,
intel->
transform[mask_unit],
&mask_x[2],
@@ -704,8 +664,8 @@ i915_emit_composite_primitive(PixmapPtr dest,
num_floats = 3 * per_vertex;
- OUT_VERTEX(intel->dst_coord_adjust + dstX + w);
- OUT_VERTEX(intel->dst_coord_adjust + dstY + h);
+ 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]);
@@ -723,8 +683,8 @@ i915_emit_composite_primitive(PixmapPtr dest,
}
}
- OUT_VERTEX(intel->dst_coord_adjust + dstX);
- OUT_VERTEX(intel->dst_coord_adjust + dstY + h);
+ 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]);
@@ -742,8 +702,8 @@ i915_emit_composite_primitive(PixmapPtr dest,
}
}
- OUT_VERTEX(intel->dst_coord_adjust + dstX);
- OUT_VERTEX(intel->dst_coord_adjust + dstY);
+ 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]);
@@ -835,10 +795,6 @@ i915_prepare_composite(int op, PicturePtr source_picture,
}
}
- intel->dst_coord_adjust = 0;
- intel->src_coord_adjust = 0;
- intel->mask_coord_adjust = 0;
-
intel->transform[0] = NULL;
intel->scale_units[0][0] = -1;
intel->scale_units[0][1] = -1;
@@ -857,14 +813,6 @@ i915_prepare_composite(int op, PicturePtr source_picture,
floats_per_vertex += 2; /* src x/y */
else
floats_per_vertex += 4; /* src x/y/z/w */
-
- if (source_picture->filter == PictFilterNearest) {
-#if PIXEL_CENTRE_SAMPLE
- intel->src_coord_adjust = 0.375;
-#else
- intel->dst_coord_adjust = -0.125;
-#endif
- }
}
if (mask != NULL) {
@@ -879,14 +827,6 @@ i915_prepare_composite(int op, PicturePtr source_picture,
floats_per_vertex += 2; /* mask x/y */
else
floats_per_vertex += 4; /* mask x/y/z/w */
-
- if (mask_picture->filter == PictFilterNearest) {
-#if PIXEL_CENTRE_SAMPLE
- intel->mask_coord_adjust = 0.375;
-#else
- intel->dst_coord_adjust = -0.125;
-#endif
- }
}
}
commit f74b3f82bab11463a0f4de9f614fc6aa1492ef24
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Tue Jun 1 22:31:35 2010 +0100
i915; Avoid the implicit flush on changing BUF_INFO
3DSTATE_BUF_INFO is an implicit flush of the piepline, so avoid emitting
that and associated state unless the destination pixmap has actually
changed. This is a win of around 3-5% for cairo-perf-trace, notably for
firefox.
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/i830.h b/src/i830.h
index e410ec1..9a46af0 100644
--- a/src/i830.h
+++ b/src/i830.h
@@ -340,6 +340,7 @@ typedef struct intel_screen_private {
PicturePtr render_source_picture, render_mask_picture, render_dest_picture;
CARD32 render_source_solid;
CARD32 render_mask_solid;
+ PixmapPtr render_current_dest;
Bool render_source_is_solid;
Bool render_mask_is_solid;
Bool needs_render_state_emit;
diff --git a/src/i830_uxa.c b/src/i830_uxa.c
index 74cffc2..853899f 100644
--- a/src/i830_uxa.c
+++ b/src/i830_uxa.c
@@ -619,6 +619,9 @@ void i830_set_pixmap_bo(PixmapPtr pixmap, dri_bo * bo)
list_add(&priv->in_flight, &intel->in_flight);
priv = NULL;
}
+
+ if (intel->render_current_dest == pixmap)
+ intel->render_current_dest = NULL;
}
if (bo != NULL) {
@@ -1088,6 +1091,7 @@ Bool i830_uxa_init(ScreenPtr screen)
intel->uxa_driver->uxa_major = 1;
intel->uxa_driver->uxa_minor = 0;
+ intel->render_current_dest = NULL;
intel->prim_offset = 0;
intel->vertex_count = 0;
intel->floats_per_vertex = 0;
diff --git a/src/i915_render.c b/src/i915_render.c
index 1c9127b..96ac09d 100644
--- a/src/i915_render.c
+++ b/src/i915_render.c
@@ -930,7 +930,7 @@ i915_composite_emit_shader(intel_screen_private *intel, CARD8 op)
PixmapPtr mask = intel->render_mask;
int src_reg, mask_reg;
Bool is_solid_src, is_solid_mask;
- uint32_t dst_format = intel->i915_render_state.dst_format;
+ Bool dest_is_alpha = PIXMAN_FORMAT_RGB(intel->render_dest_picture->format) == 0;
int tex_unit, t;
FS_LOCALS();
@@ -952,7 +952,7 @@ i915_composite_emit_shader(intel_screen_private *intel, CARD8 op)
if (!mask) {
/* No mask, so load directly to output color */
if (! is_solid_src) {
- if (dst_format == COLR_BUF_8BIT)
+ if (dest_is_alpha)
src_reg = FS_R0;
else
src_reg = FS_OC;
@@ -964,7 +964,7 @@ i915_composite_emit_shader(intel_screen_private *intel, CARD8 op)
}
if (src_reg != FS_OC) {
- if (dst_format == COLR_BUF_8BIT)
+ if (dest_is_alpha)
i915_fs_mov(FS_OC, i915_fs_operand(src_reg, W, W, W, W));
else
i915_fs_mov(FS_OC, i915_fs_operand_reg(src_reg));
@@ -1000,7 +1000,7 @@ i915_composite_emit_shader(intel_screen_private *intel, CARD8 op)
mask_reg = FS_R1;
}
- if (dst_format == COLR_BUF_8BIT) {
+ if (dest_is_alpha) {
i915_fs_mul(FS_OC,
i915_fs_operand(src_reg, W, W, W, W),
i915_fs_operand(mask_reg, W, W, W, W));
@@ -1045,8 +1045,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;
- uint32_t dst_format = intel->i915_render_state.dst_format, dst_pitch;
- uint32_t tiling_bits;
Bool is_solid_src, is_solid_mask;
int tex_count, t;
@@ -1055,8 +1053,6 @@ static void i915_emit_composite_setup(ScrnInfoPtr scrn)
IntelEmitInvarientState(scrn);
intel->last_3d = LAST_3D_RENDER;
- dst_pitch = intel_get_pixmap_pitch(dest);
-
is_solid_src = intel->render_source_is_solid;
is_solid_mask = intel->render_mask_is_solid;
@@ -1093,22 +1089,38 @@ static void i915_emit_composite_setup(ScrnInfoPtr scrn)
OUT_BATCH (intel->render_mask_solid);
}
- if (i830_pixmap_tiled(dest)) {
- tiling_bits = BUF_3D_TILED_SURFACE;
- if (i830_get_pixmap_intel(dest)->tiling
- == I915_TILING_Y)
- tiling_bits |= BUF_3D_TILE_WALK_Y;
- } else
- tiling_bits = 0;
+ /* BUF_INFO is an implicit flush, so avoid if the target has not changed */
+ if (dest != intel->render_current_dest) {
+ uint32_t tiling_bits;
- OUT_BATCH(_3DSTATE_BUF_INFO_CMD);
- OUT_BATCH(BUF_3D_ID_COLOR_BACK | tiling_bits |
- BUF_3D_PITCH(dst_pitch));
- OUT_RELOC_PIXMAP(dest, I915_GEM_DOMAIN_RENDER,
- I915_GEM_DOMAIN_RENDER, 0);
+ if (i830_pixmap_tiled(dest)) {
+ tiling_bits = BUF_3D_TILED_SURFACE;
+ if (i830_get_pixmap_intel(dest)->tiling
+ == I915_TILING_Y)
+ tiling_bits |= BUF_3D_TILE_WALK_Y;
+ } else
+ tiling_bits = 0;
- OUT_BATCH(_3DSTATE_DST_BUF_VARS_CMD);
- OUT_BATCH(dst_format);
+ OUT_BATCH(_3DSTATE_BUF_INFO_CMD);
+ OUT_BATCH(BUF_3D_ID_COLOR_BACK | tiling_bits |
+ BUF_3D_PITCH(intel_get_pixmap_pitch(dest)));
+ OUT_RELOC_PIXMAP(dest, I915_GEM_DOMAIN_RENDER,
+ I915_GEM_DOMAIN_RENDER, 0);
+
+ OUT_BATCH(_3DSTATE_DST_BUF_VARS_CMD);
+ OUT_BATCH(intel->i915_render_state.dst_format);
+
+ /* draw rect is unconditional */
+ OUT_BATCH(_3DSTATE_DRAW_RECT_CMD);
+ OUT_BATCH(0x00000000);
+ OUT_BATCH(0x00000000); /* ymin, xmin */
+ OUT_BATCH(DRAW_YMAX(dest->drawable.height - 1) |
+ DRAW_XMAX(dest->drawable.width - 1));
+ /* yorig, xorig (relate to color buffer?) */
+ OUT_BATCH(0x00000000);
+
+ intel->render_current_dest = dest;
+ }
{
uint32_t ss2;
@@ -1138,15 +1150,6 @@ static void i915_emit_composite_setup(ScrnInfoPtr scrn)
OUT_BATCH(ss2);
OUT_BATCH(i915_get_blend_cntl(op, mask_picture, dest_picture->format));
}
-
- /* draw rect is unconditional */
- OUT_BATCH(_3DSTATE_DRAW_RECT_CMD);
- OUT_BATCH(0x00000000);
- OUT_BATCH(0x00000000); /* ymin, xmin */
- OUT_BATCH(DRAW_YMAX(dest->drawable.height - 1) |
- DRAW_XMAX(dest->drawable.width - 1));
- /* yorig, xorig (relate to color buffer?) */
- OUT_BATCH(0x00000000);
}
if (! intel->needs_render_ca_pass)
@@ -1247,5 +1250,6 @@ i915_batch_flush_notify(ScrnInfoPtr scrn)
intel_screen_private *intel = intel_get_screen_private(scrn);
intel->needs_render_state_emit = TRUE;
+ intel->render_current_dest = NULL;
intel->last_floats_per_vertex = 0;
}
More information about the xorg-commit
mailing list